import pandas as pd import re def classify_signal(desca, tagname, descb=None): """ Classify signal based on DESCA content, TAGNAME, and DESCB Priority order matters: PB_LT before PB, FIOH before FIO, SOL+DIVERT before SOL """ if pd.isna(desca): return 'UNKNOWN' desca_str = str(desca).upper() tagname_str = str(tagname).upper() descb_str = str(descb).upper() if pd.notna(descb) else '' # Check for SPARE first if re.search(r'SPARE', desca_str): return 'SPARE' # Signal O patterns (check higher priority first) if re.search(r'BCN\d+_[AGBR]', desca_str): # e.g., BCN3_B, BCN1_A return 'O' elif re.search(r'PB_LT', desca_str): return 'O' # Check for PR sensors (user rule: PR is I) - moved after specific patterns elif re.search(r'_PR\d+|PR\d+', desca_str): # Match PR followed by digits (proximity sensors) return 'I' elif re.search(r'STO', desca_str): return 'O' elif re.search(r'BCN', desca_str) and 'FIOH' in tagname_str: return 'O' # IOLink patterns (check FIOH before FIO due to priority) elif re.search(r'SOL', desca_str) and re.search(r'DIVERT', descb_str): return 'IOLink' elif re.search(r'LPE', desca_str): return 'IOLink' elif re.search(r'FIOH', desca_str): return 'IOLink' elif re.search(r'BCN', desca_str) and 'FIO' in tagname_str: return 'IOLink' # Signal O patterns continued (SOL without DIVERT) elif re.search(r'SOL', desca_str): return 'O' # Signal I patterns elif re.search(r'PWM', desca_str): return 'I' elif re.search(r'CB', desca_str): return 'I' elif re.search(r'FPE', desca_str): return 'I' elif re.search(r'ENC', desca_str): return 'I' elif re.search(r'PS', desca_str): return 'I' elif re.search(r'EPC', desca_str): return 'I' elif re.search(r'PX', desca_str): return 'I' elif re.search(r'DISC', desca_str): return 'I' elif re.search(r'PE', desca_str): return 'I' elif re.search(r'PB', desca_str): # This comes after PB_LT check return 'I' elif re.search(r'ESTOP', desca_str): return 'I' elif 'IB16' in tagname_str or 'IB16S' in tagname_str: return 'I' elif 'OB16E' in tagname_str: return 'O' return 'UNKNOWN' def get_device_type(tagname): """Determine device type from TAGNAME""" tagname_str = str(tagname).upper() if 'VFD' in tagname_str: return 'APF' elif 'FIOH' in tagname_str: return 'Hub' elif 'FIO' in tagname_str: return 'M12DR' elif 'SIO' in tagname_str: return 'SIO' elif 'OB16E' in tagname_str: return 'OB16E' elif 'IB16S' in tagname_str: return 'IB16S' elif 'IB16' in tagname_str: return 'IB16' return 'UNKNOWN'