diff --git a/bin/ioconverter.bat b/bin/ioconverter.bat new file mode 100644 index 0000000..41c0e48 --- /dev/null +++ b/bin/ioconverter.bat @@ -0,0 +1,4 @@ +@echo off +CALL setenv.bat + +python %PROJECT_LIB%\portalexport.py %* \ No newline at end of file diff --git a/lib/ioconverter.py b/lib/ioconverter.py new file mode 100644 index 0000000..9f63899 --- /dev/null +++ b/lib/ioconverter.py @@ -0,0 +1,1241 @@ +import os +import pandas as pd +import unittest + + + +# Assuming the ExcelConverter class from the previous turn is available and pasted here +class ExcelConverter: + def __init__(self): + self.eingaenge_identifier = ["FDI", "B", "S", "E", "I", "DI", "BA", "BB", "BC", "BD", "BE", "BF", "BG", "BH", "BJ", "BK", "BL", "BM", "BN", "BP", "BQ", "BR", "BS", "BT", "BU", "BV", "BW", "BX", "BY", "BZ", "FA", "FB", "FC", "FD", "FE", "FF", "FG", "FH", "FJ", "FK", "FL", "FM", "FN", "FP", "FQ", "FR", "FS", "FT", "FU", "FV", "FW", "FX", "FY", "FZ", "SA", "SB", "SC", "SD", "SE", "SF", "SG", "SH", "SJ", "SK", "SL", "SM", "SN", "SP", "SQ", "SR", "SS", "ST", "SU", "SV", "SW", "SX", "SY", "SZ"] + self.ausgaenge_identifier = ["K", "O", "Q", "M", "A", "P", "DQ", "CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CJ", "CK", "CL", "CM", "CN", "CP", "CQ", "CR", "CS", "CT", "CU", "CV", "CW", "CX", "CY", "CZ", "EA", "EB", "EC", "ED", "EE", "EF", "EG", "EH", "EJ", "EK", "EL", "EM", "EN", "EP", "EQ", "ER", "ES", "ET", "EU", "EV", "EW", "EX", "EY", "EZ", "GA", "GB", "GC", "GD", "GE", "GF", "GG", "GH", "GJ", "GK", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GV", "GW", "GX", "GY", "GZ", "HA", "HB", "HC", "HD", "HE", "HF", "HG", "HH", "HJ", "HK", "HL", "HM", "HN", "HP", "HQ", "HR", "HS", "HT", "HU", "HV", "HW", "HX", "HY", "HZ", "KA", "KB", "KC", "KD", "KE", "KF", "KG", "KH", "KJ", "KK", "KL", "KM", "KN", "KP", "KQ", "KR", "KS", "KT", "KU", "KV", "KW", "KX", "KY", "KZ", "MA", "MB", "MC", "MD", "ME", "MF", "MG", "MH", "MJ", "MK", "ML", "MM", "MN", "MP", "MQ", "MR", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "PA", "PB", "PC", "PD", "PE", "PF", "PG", "PH", "PJ", "PK", "PL", "PM", "PN", "PP", "PQ", "PR", "PS", "PT", "PU", "PV", "PW", "PX", "PY", "PZ", "QA", "QB", "QC", "QD", "QE", "QF", "QG", "QH", "QJ", "QK", "QL", "QM", "QN", "QP", "QQ", "QR", "QS", "QT", "QU", "QV", "QW", "QX", "QY", "QZ", "RA", "RB", "RC", "RD", "RE", "RF", "RG", "RH", "RJ", "RK", "RL", "RM", "RN", "RP", "RQ", "RR", "RS", "RT", "RU", "RV", "RW", "RX", "RY", "RZ", "TA", "TB", "TC", "TD", "TE", "TF", "TG", "TH", "TJ", "TK", "TL", "TM", "TN", "TP", "TQ", "TR", "TS", "TT", "TU", "TV", "TW", "TX", "TY", "TZ"] + + def _gleiche_finden(self, liste): + counter = {} + for eintrag in liste: + name = eintrag['Name'] + counter[name] = counter.get(name, 0) + 1 + doppelte = set(name for name, count in counter.items() if count > 1) + doppelte_eintraege = [eintrag for eintrag in liste if eintrag['Name'] in doppelte] + return doppelte_eintraege, doppelte + + def _anschluesse_ergaenzen(self, anschluesse): + """ + Ergänzt fehlende Anschlüsse für Bauteile. + Entspricht der PowerShell-Funktion AnschluesseErgaenzen. + """ + anschluesse_sorted = sorted(anschluesse, key=lambda x: x['Name']) + bauteil_dict = {} + + # Gruppiere vorhandene Anschlüsse nach Bauteil, speichere nummer + eintrag + for eintrag in anschluesse_sorted: + name = eintrag['Name'] + if '.' in name: + bauteil = name.rsplit('.', 1)[0] + '.' + nummer = int(name.split('.')[-1]) + else: + bauteil = name[:-1] + nummer = int(name[-1]) + + if bauteil not in bauteil_dict: + bauteil_dict[bauteil] = [] + bauteil_dict[bauteil].append((nummer, eintrag)) + + added_entries = [] + + for bauteil, eintraege in bauteil_dict.items(): + vorhandene_nummern = set(n for n, _ in eintraege) + fehlende = set(range(8)) - vorhandene_nummern + + for i in fehlende: + new_name = f"{bauteil}{i}" + new_entry = { + 'Name': new_name, + 'Kommentar': "", + 'Bezug': "", + 'Zeile': -1 + } + eintraege.append((i, new_entry)) + added_entries.append(new_entry) + + # Bezug finden (erstes mit Bezug) + bezug_quelle = next((eintrag['Bezug'] for _, eintrag in sorted(eintraege, key=lambda x: x[0]) if eintrag.get('Bezug')), None) + + if bezug_quelle: + for _, eintrag in eintraege: + if not eintrag.get('Bezug'): + eintrag['Bezug'] = bezug_quelle + + anschluesse.extend(added_entries) + return sorted(anschluesse, key=lambda x: x['Name']) + + def _verarbeite_io_liste(self, liste): + """ + Filtert doppelte Namen aus der Liste und markiert sie mit Hinweis; gibt separate Liste mit eindeutigen Duplikaten zurück. + """ + gleiche, doppelte_namen = self._gleiche_finden(liste) + + # Nur ein Eintrag pro doppeltem Namen in gleiche_liste + gesehen = set() + reduzierte_gleiche = [] + for eintrag in gleiche: + name = eintrag['Name'] + if name not in gesehen: + reduzierte_gleiche.append(eintrag) + gesehen.add(name) + + gefiltert = self._duplikate_markieren_und_filtern(liste, doppelte_namen) + return reduzierte_gleiche, gefiltert + + def _duplikate_markieren_und_filtern(self, liste, doppelte_namen): + """ + Behalte nur das erste Vorkommen jedes doppelten Namens in der Liste. + Markiere dieses Vorkommen mit 'Hinweis': 'Doppelt'. + """ + neue_liste = [] + gesehen = set() + + for eintrag in liste: + name = eintrag['Name'] + if name in doppelte_namen: + if name not in gesehen: + eintrag['Hinweis'] = "Duplikat!" + neue_liste.append(eintrag) + gesehen.add(name) + # sonst: ignorieren + else: + neue_liste.append(eintrag) + + return neue_liste + + def _prep_simpel(self, ursprungdatei, prefix_eingang="E", prefix_ausgang="A"): + """ + Konvertiert Daten aus der Ursprungsdatei + Eingänge und Ausgänge in seperaten dataframes; Fehler nicht enthalten + """ + eingaenge = [] + ausgaenge = [] + fehler = [] + + for i, eintrag in enumerate(ursprungdatei): + eintragszeile = eintrag.strip().split("'") + bmk_zahl_raw = eintragszeile[1].strip() + kommentar = eintragszeile[3].strip() + + bmk_alpha = ''.join(filter(str.isalpha, bmk_zahl_raw)) + bmk_numeric = ''.join(filter(str.isdigit, bmk_zahl_raw)) + + bmk_formatted = bmk_numeric + if len(bmk_numeric) > 0: + bmk_formatted = bmk_numeric[:-1] + "." + bmk_numeric[-1] if len(bmk_numeric) > 1 else "0." + bmk_numeric + + if bmk_alpha in self.eingaenge_identifier: + name = prefix_eingang + bmk_formatted + eingaenge.append({'Name': name, 'Kommentar': kommentar, 'Zeile': i}) + elif bmk_alpha in self.ausgaenge_identifier: + name = prefix_ausgang + bmk_formatted + ausgaenge.append({'Name': name, 'Kommentar': kommentar, 'Zeile': i}) + else: + name = bmk_formatted + fehler.append({'Name': name, 'Kommentar': f"Fehlerhafte BMK '{bmk_zahl_raw}'", 'Zeile': i}) + + # Fehler-Dataframe erzeugen + df_fehler = pd.DataFrame(fehler).sort_values(by="Name") if fehler else pd.DataFrame() + + # Eingänge & Ausgänge verarbeiten (Duplikate markieren und filtern) + gleiche_eingaenge, eingaenge = self._verarbeite_io_liste(eingaenge) + gleiche_ausgaenge, ausgaenge = self._verarbeite_io_liste(ausgaenge) + + # DataFrames erzeugen u. sortieren + df_eingaenge = pd.DataFrame(eingaenge).sort_values(by="Name") + df_ausgaenge = pd.DataFrame(ausgaenge).sort_values(by="Name") + + df_gleiche_eingaenge = pd.DataFrame(gleiche_eingaenge).sort_values(by="Name") if gleiche_eingaenge else pd.DataFrame() + df_gleiche_ausgaenge = pd.DataFrame(gleiche_ausgaenge).sort_values(by="Name") if gleiche_ausgaenge else pd.DataFrame() + + return df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_eingaenge, df_ausgaenge + + def _prep_tia(self, ursprungdatei, prefix_eingang="E", prefix_ausgang="A"): + """ + Konvertiert Daten für TIA Portal und schreibt sie in eine Excel-Datei mit zwei Blättern ("Constants" und "PLC Tags"). + Eingänge und Ausgänge gemeinsam jeweils in consts und tags (Prefix cIn, cOut); doppelte Namen markiert und ausgeschlossen; Fehler mit Prefix 'Err'. + """ + eingaenge = [] + ausgaenge = [] + fehler = [] + + for i, eintrag in enumerate(ursprungdatei): + eintragszeile = eintrag.strip().split("'") + bmk_zahl_raw = eintragszeile[1].strip() + kommentar = eintragszeile[3].strip() + + bmk_alpha = ''.join(filter(str.isalpha, bmk_zahl_raw)) + bmk_numeric = ''.join(filter(str.isdigit, bmk_zahl_raw)) + + bmk_formatted = bmk_numeric + if len(bmk_numeric) > 0: + bmk_formatted = bmk_numeric[:-1] + "." + bmk_numeric[-1] if len(bmk_numeric) > 1 else "0." + bmk_numeric + + if bmk_alpha in self.eingaenge_identifier: + name = prefix_eingang + bmk_formatted + name_constant = "cIn" + bmk_zahl_raw + eingaenge.append({ + 'Name': name, + 'NameOriginal': bmk_zahl_raw, + 'NameConstant': name_constant, + 'Kommentar': kommentar, + 'Zahl': int(bmk_numeric) if bmk_numeric else 0, # Convert to int + 'Zeile': i + }) + elif bmk_alpha in self.ausgaenge_identifier: + name = prefix_ausgang + bmk_formatted + name_constant = "cOut" + bmk_zahl_raw + ausgaenge.append({ + 'Name': name, + 'NameOriginal': bmk_zahl_raw, + 'NameConstant': name_constant, + 'Kommentar': kommentar, + 'Zahl': int(bmk_numeric) if bmk_numeric else 0, # Convert to int + 'Zeile': i + }) + else: # Hier wird Fehlerhafte BMK behandelt + name = bmk_formatted + name_constant = "cErr" + bmk_zahl_raw + fehler.append({ + 'Name': name, + 'NameOriginal': bmk_zahl_raw, + 'NameConstant': name_constant, + 'Kommentar': f"Fehlerhafte BMK '{bmk_zahl_raw}'", # Zeile von Lorenz eingefügt, da sonst pandas mit Fehler, da kein Kommentar + 'Zahl': i, # Original PowerShell uses 'i' for Zahl in Fehler, not bmk_numeric + 'Zeile': i + }) + + # Fehler-Dataframe erzeugen + df_fehler = pd.DataFrame(fehler).sort_values(by="Zahl") if fehler else pd.DataFrame() + + # Duplikate verarbeiten & markieren + gleiche_eingaenge, eingaenge = self._verarbeite_io_liste(eingaenge) + gleiche_ausgaenge, ausgaenge = self._verarbeite_io_liste(ausgaenge) + + # DataFrames erstellen u. sortieren + df_eingaenge = pd.DataFrame(eingaenge).sort_values(by="Zahl") + df_ausgaenge = pd.DataFrame(ausgaenge).sort_values(by="Zahl") + + df_gleiche_eingaenge = pd.DataFrame(gleiche_eingaenge).sort_values(by="Zahl") if gleiche_eingaenge else pd.DataFrame() + df_gleiche_ausgaenge = pd.DataFrame(gleiche_ausgaenge).sort_values(by="Zahl") if gleiche_ausgaenge else pd.DataFrame() + + df_consts, df_tags = self._create_tia_dataframes(df_fehler, df_eingaenge, df_ausgaenge) + + return df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_consts, df_tags + + def _create_tia_dataframes(self, df_fehler, df_eingaenge, df_ausgaenge): + """ + Hilfsfunktion für 'prep_tia', die dataframes für spätere excel Ausgabe erzeugt ("Constants" und "PLC Tags"). + Eingänge und Ausgänge gemeinsam jeweils in consts und tags; Fehler ebenfalls mit Prefix 'Err' enthalten. + """ + df_constants_data = [] + j = 0 + for row in df_fehler.itertuples(): + df_constants_data.append({ + "Name": row.NameConstant, + "Path": "Import", + "Data Type": "Int", + "Value": j, + "Comment": "" + }) + j += 1 + for row in df_eingaenge.itertuples(): + df_constants_data.append({ + "Name": row.NameConstant, + "Path": "Import", + "Data Type": "Int", + "Value": j, + "Comment": "" + }) + j += 1 + for row in df_ausgaenge.itertuples(): + df_constants_data.append({ + "Name": row.NameConstant, + "Path": "Import", + "Data Type": "Int", + "Value": j, + "Comment": "" + }) + j += 1 + df_constants = pd.DataFrame(df_constants_data) + + # Blatt "PLC Tags" + df_plc_tags_data = [] + for row in df_fehler.itertuples(): + df_plc_tags_data.append({ + "Name": row.NameOriginal, + "Path": "Import", + "Data Type": "Bool", + "Logical Address": f"%{row.Name}", + "Comment": row.Kommentar, + "Hmi Visible": "True", + "Hmi Accessible": "True", + "Hmi Writeable": "True", + "Typeobject ID": "", + "Version ID": "" + }) + for row in df_eingaenge.itertuples() : + df_plc_tags_data.append({ + "Name": row.NameOriginal, + "Path": "Import", + "Data Type": "Bool", + "Logical Address":f"%{row.Name}", + "Comment": row.Kommentar, + "Hmi Visible": "True", + "Hmi Accessible": "True", + "Hmi Writeable": "True", + "Typeobject ID": "", + "Version ID": "" + }) + for row in df_ausgaenge.itertuples(): + df_plc_tags_data.append({ + "Name": row.NameOriginal, + "Path": "Import", + "Data Type": "Bool", + "Logical Address": f"%{row.Name}", + "Comment": row.Kommentar, + "Hmi Visible": "True", + "Hmi Accessible": "True", + "Hmi Writeable": "True", + "Typeobject ID": "", + "Version ID": "" + }) + df_plc_tags = pd.DataFrame(df_plc_tags_data) + + return (df_constants, df_plc_tags) + + def _prep_wscad(self, ursprungdatei, prefix_eingang="E", prefix_ausgang="A"): + """ + Konvertiert Daten für WSCAD mit Bezugsinformationen und schreibt sie in eine Excel-Datei. + Entspricht der PowerShell-Funktion ExcelDateiBeschreibenWSCAD_Bezug. + """ + eingaenge = [] + ausgaenge = [] + fehler = [] + + for i, eintrag in enumerate(ursprungdatei): + eintragszeile = eintrag.strip().split("'") + bmk_zahl_raw = eintragszeile[1].strip() + kommentar = eintragszeile[3].strip() + bezug = eintragszeile[7].strip() + + bmk_alpha = ''.join(filter(str.isalpha, bmk_zahl_raw)) + bmk_numeric = ''.join(filter(str.isdigit, bmk_zahl_raw)) + + bmk_formatted = bmk_numeric + if len(bmk_numeric) > 0: + bmk_formatted = bmk_numeric[:-1] + "." + bmk_numeric[-1] if len(bmk_numeric) > 1 else "0." + bmk_numeric + + # Remove leading zeros + if len(bmk_formatted) >= 4 and bmk_formatted.startswith("0") and bmk_alpha in self.eingaenge_identifier: + bmk_formatted = bmk_formatted[1:] + if len(bmk_formatted) >= 4 and bmk_formatted.startswith("0"): + bmk_formatted = bmk_formatted[1:] + elif len(bmk_formatted) >= 3 and bmk_formatted.startswith("0") and bmk_alpha in self.ausgaenge_identifier: + bmk_formatted = bmk_formatted[1:] + if len(bmk_formatted) >= 3 and bmk_formatted.startswith("0"): + bmk_formatted = bmk_formatted[1:] + + if bmk_alpha in self.eingaenge_identifier: + name = prefix_eingang + bmk_formatted + eingaenge.append({'Name': name, 'Kommentar': kommentar, 'Zeile': i, 'Bezug': bezug}) + elif bmk_alpha in self.ausgaenge_identifier: + name = prefix_ausgang + bmk_formatted + ausgaenge.append({'Name': name, 'Kommentar': kommentar, 'Zeile': i, 'Bezug': bezug}) + else: + name = bmk_formatted + fehler.append({'Name': name, 'Kommentar': f"Fehlerhafte BMK '{bmk_zahl_raw}'", 'Zeile': i, 'Bezug': bezug}) + + eingaenge = self._anschluesse_ergaenzen(eingaenge) + ausgaenge = self._anschluesse_ergaenzen(ausgaenge) + + # Fehler-Dataframe erzeugen + df_fehler = pd.DataFrame(fehler).sort_values(by="Name") if fehler else pd.DataFrame() + + # Duplikate verarbeiten & markieren + gleiche_eingaenge, eingaenge = self._verarbeite_io_liste(eingaenge) + gleiche_ausgaenge, ausgaenge = self._verarbeite_io_liste(ausgaenge) + + # DataFrames erzeugen u. sortieren + df_eingaenge = pd.DataFrame(eingaenge).sort_values(by="Name") + df_ausgaenge = pd.DataFrame(ausgaenge).sort_values(by="Name") + + df_gleiche_eingaenge = pd.DataFrame(gleiche_eingaenge).sort_values(by="Name") if gleiche_eingaenge else pd.DataFrame() + df_gleiche_ausgaenge = pd.DataFrame(gleiche_ausgaenge).sort_values(by="Name") if gleiche_ausgaenge else pd.DataFrame() + + return df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_eingaenge, df_ausgaenge + + def _prep_data(self, data, export_type): + """ + Aufbereiter der Daten je nach gewünschtem Export-Typ + """ + if export_type == "EA": + return self._prep_simpel(data) + elif export_type == "TIA": + return self._prep_tia(data) + elif export_type in ["WSCAD", "WSCAD mit Bezug"]: + return self._prep_wscad(data) + else: + raise ValueError("Unbekannter Export-Typ") + + def export_excel(self, data, export_type, export_path): + """ + Wrapper, der aufgerufen wird und in sich die Aufbereitung der Daten und das Abspeichern als Excel abruft. + """ + # Daten vorbereiten + dataframes = self._prep_data(data, export_type) + + # Excel Datei schreiben und speichern + self._write_excel(dataframes, export_type, export_path) + + def _write_excel(self, dataframes, export_type, export_path): + """ + Erzeugung der Excel-Datei im gewünschten Muster + """ + if export_type == "EA": + # Format für Simpel-Ausgabe + df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_eingaenge, df_ausgaenge = dataframes + + with pd.ExcelWriter(export_path, engine='openpyxl') as writer: + # Sheet 1: Ein / Ausgänge + start_row = 0 + df_eingaenge.to_excel(writer, sheet_name='Ein-, Ausgaenge', index=False, startrow=start_row) + start_row += len(df_eingaenge) + 2 # Leerzeile dazwischen + + # Ausgaenge direkt drunter schreiben (ohne Header) + df_ausgaenge.to_excel(writer, sheet_name='Ein-, Ausgaenge', index=False, startrow=start_row, header=False) + + # Duplikate und Errors + self._write_duplicates_errors(writer, df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler) + + elif export_type == "TIA": + df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_consts, df_tags = dataframes + + with pd.ExcelWriter(export_path, engine='openpyxl') as writer: + # 1. PLC Tags Sheet mit Header. Spalten: Name, Path, Data Type, Logical Address, Comment, Hmi Visible, Hmi Accessible, Hmi Writeable, Typeobject ID, Version ID + df_tags.to_excel(writer, sheet_name='PLC Tags', index=False) + + # 2. Constants Sheet mit Header. Spalten: Name, Path, Data Type, Value, Comment + df_consts.to_excel(writer, sheet_name='Constants', index=False) + + # Duplikate und Errors + self._write_duplicates_errors(writer, df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler) + + elif export_type in ["WSCAD", "WSCAD mit Bezug"]: + + df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_eingaenge, df_ausgaenge = dataframes + include_bezug = export_type == "WSCAD mit Bezug" + + # Basis-Template + df_result = pd.DataFrame( + columns=[ + "Anschluss", + "Kommentar", + "Symboltext", + "Bezug", + "Sondertext 1", + "Sondertext 2", + "Sondertext 3", + "Sondertext 4", + "Sondertext 5", + "Sondertext 6", + "Sondertext 7", + "Sondertext 8", + ] + ) + + # Fehler ganz oben in Sheet schreiben (falls sie existieren) + if not df_fehler.empty: + df_result = self._append_df(df_result, df_fehler, include_bezug) + # Ein u. Ausgänge schreiben + df_result = self._append_df(df_result, df_eingaenge, include_bezug) + df_result = self._append_df(df_result, df_ausgaenge, include_bezug) + + with pd.ExcelWriter(export_path, engine="openpyxl") as writer: + df_result.to_excel(writer, index=False, sheet_name="WSCAD") + # Bezug-Spalte als Text formatieren (Spalte 4 = "Bezug") + worksheet = writer.book["WSCAD"] + for row in worksheet.iter_rows(min_row=2, min_col=4, max_col=4): + for cell in row: + if cell.value and str(cell.value).startswith("="): + # Erzwinge Textformat + cell.number_format = "@" + cell.value = str(cell.value) # wichtig: string setzen + cell.data_type = 's' # explizit als String, verhindert Formelinterpretation + # Duplikate und Errors + self._write_duplicates_errors(writer, df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler) + + def _append_df(self, target_df, source_df, include_bezug=False): + """ + Hilfsfunktion, die Dataframes für WSCAD Export aneinander reiht und entweder Bezug inkludiert oder nicht + """ + + data = { + "Anschluss": source_df["Name"], + "Kommentar": source_df["Kommentar"], + "Symboltext": "", + "Bezug": source_df["Bezug"] if include_bezug else "", + "Sondertext 1": "", + "Sondertext 2": "", + "Sondertext 3": "", + "Sondertext 4": "", + "Sondertext 5": "", + "Sondertext 6": "", + "Sondertext 7": "", + "Sondertext 8": "", + } + tmp = pd.DataFrame(data) + return pd.concat([target_df, tmp], ignore_index=True) + + def _write_duplicates_errors(self, writer, df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler): + """ + Schreibt optional die Sheets 'Duplikate' und 'Fehler', falls Inhalte vorhanden sind. + """ + # Bezug-Spalte für Excel Darstellung vorbereiten + for df in [df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler]: + if "Bezug" in df.columns: + df["Bezug"] = df["Bezug"].apply(lambda x: f"'{x}" if pd.notnull(x) else x) + + + # Duplikate-Sheet + if not df_gleiche_eingaenge.empty or not df_gleiche_ausgaenge.empty: + start_row = 0 + if not df_gleiche_eingaenge.empty: + df_gleiche_eingaenge.to_excel(writer, sheet_name='Duplikate', index=False, startrow=start_row) + start_row += len(df_gleiche_eingaenge) + 2 # Abstand + if not df_gleiche_ausgaenge.empty: + df_gleiche_ausgaenge.to_excel(writer, sheet_name='Duplikate', index=False, startrow=start_row, header=False) + + # Fehler-Sheet + if not df_fehler.empty: + df_fehler.to_excel(writer, sheet_name='Fehler', index=False) + +def call_portal_to_excel(self, textlines, konvertierungsart): + + ec = ExcelConverter() + + all_duplicate_inputs = [] + all_duplicate_outputs = [] + all_errors = [] + + prefix_eingang = "E" + prefix_ausgang = "A" + + target_path = os.environ.get("PROJECT_WORK") + #self.current_task_label.config(text=f"Erstelle Excel-Datei: {os.path.basename(ziel_datei)}") + + gleiche_eingaenge = [] + gleiche_ausgaenge = [] + fehler = [] + + if konvertierungsart == "Simpel": + # df_eingaenge, df_ausgaenge wird in excel Datei geschrieben. Hier zu Ausgabe hinzugefügt, damit unittest befüllt werden kann + df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_eingaenge, df_ausgaenge = ec._prep_simpel( + textlines, prefix_eingang, prefix_ausgang + ) + return df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_eingaenge, df_ausgaenge + + elif konvertierungsart == "TIA": + # df_consts und df_tags wird in excel Datei geschrieben. Hier zu Ausgabe hinzugefügt, damit unittest befüllt werden kann + df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_consts, df_tags = ec._prep_tia( + textlines, prefix_eingang, prefix_ausgang + ) + return(df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_consts, df_tags) + + elif konvertierungsart == "WSCAD" or "WSCAD mit Bezug": + df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_eingaenge, df_ausgaenge = ec._prep_wscad( + textlines, prefix_eingang, prefix_ausgang + ) + return(df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_eingaenge, df_ausgaenge) + + all_duplicate_inputs.extend(gleiche_eingaenge) + all_duplicate_outputs.extend(gleiche_ausgaenge) + all_errors.extend(fehler) + + + + #self.completed_tasks_listbox.insert(tk.END, f"ERFOLG: {os.path.basename(ziel_datei)}") + + #self.switch_to_duplicates_tab(all_duplicate_inputs, all_duplicate_outputs, all_errors) + +class TestPlant(unittest.TestCase): + + def test_Simpel(self): + textlines = """'DI0023','STEUERSPANNUNG 24V UC200 OK','24V OK','=A01+UH000-KF02i','STEUERSPANNUNG 24V UC200 OK','CONTROL VOLTAGE 24V UC200 OK','TENSION DE MANIOBRA 24V UC200 OK','' +'DI0020','STEUERSPANNUNG 24V UH000 OK','24V OK UH000','=A01+UH000-KF02i','STEUERSPANNUNG 24V UH000 OK','CONTROL VOLTAGE 24V UH000 OK','TENSION DE MANIOBRA 24V UH000 OK','' +'DI0020','STEUERSPANNUNG 24V UH000 OK','24V OK UH000','=A01+UH000-KF02i','STEUERSPANNUNG 24V UH000 OK','CONTROL VOLTAGE 24V UH000 OK','TENSION DE MANIOBRA 24V UH000 OK','' +'XY0022','STEUERSPANNUNG 24V UC103 ','24V OK','=A01+UH000-KF02i','STEUERSPANNUNG 24V UC103 OK','CONTROL VOLTAGE 24V UC103 OK','TENSION DE MANIOBRA 24V UC103 OK','' +'DI0021','STEUERSPANNUNG 24V UC102-UC101 OK','24V OK','=A01+UH000-KF02i','STEUERSPANNUNG 24V UC102-UC101 OK','CONTROL VOLTAGE 24V UC102-UC101 OK','TENSION DE MANIOBRA 24V UC102-UC101 OK','' +'KF0013','DRUCKL.-WARTUNGSEINH. SCHLIESSEN','COMPR. AIR OFF','=A01+UH000-KF01Q','DRUCKL.-WARTUNGSEINH. SCHLIESSEN','CLOSE PRESS.-MAINTENANCE UNIT','AIRE COMPRIMIDO/VÁLVULA DE AISLAMIENTO C','' +'KF0012','RESET NOT HALT','RESET E-STOP','=A01+UH000-KF01Q','RESET NOT HALT','RESET EMERGENCY STOP','RESET PARO DE EMERGENCIA','' +'PF0011','ÜBERSTROM/SICHERUNGSFALL','IL-YE-LED','=A01+UH000-KF01Q','ÜBERSTROM/SICHERUNGSFALL','OVERCURRENT/MIN. CIRCUIT BREAKERS','SOBREINTENSIDAD/FUSIBLE AUTOMÁTICO','' +'MA1020','ANTRIEB PUFFER F0101 FLYER 1','M-BI-LE','=A01+UC101-KF02Q','','','','' +'MA1020','ANTRIEB PUFFER F0101 FLYER 1','M-BI-LE','=A01+UC101-KF02Q','','','','' +""" + textarray = textlines.splitlines() + + '''Testcase: 10 Zeilen mit I/O: Davon 4 Eingänge (1 Duplikat), 5 Ausgänge (1 Duplikat), 1 Fehlerhafte BMK''' + + df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_eingaenge, df_ausgaenge = call_portal_to_excel(self, textarray, "Simpel") + + # print("\n Eingänge:\n") + # print(df_eingaenge) + # print("\n Ausgänge:\n") + # print(df_ausgaenge) + + # print("\n gleiche Eingänge:\n") + # print(df_gleiche_eingaenge) + # print("\n gleiche Ausgänge:\n") + # print(df_gleiche_ausgaenge) + + self.assertEqual(len(df_fehler), 1) # Fehler anzeigen: Zeile 4 Prefix XY + + self.assertEqual(len(df_eingaenge), 4 - len(df_gleiche_eingaenge)) # 4 Eingänge in Liste, einer davon als Duplikat + self.assertEqual(len(df_ausgaenge), 5 - len(df_gleiche_ausgaenge)) # 5 Ausgänge in Liste, einer davon Duplikat + + def test_TIA(self): + textlines = """'DI0023','STEUERSPANNUNG 24V UC200 OK','24V OK','=A01+UH000-KF02i','STEUERSPANNUNG 24V UC200 OK','CONTROL VOLTAGE 24V UC200 OK','TENSION DE MANIOBRA 24V UC200 OK','' +'DI0020','STEUERSPANNUNG 24V UH000 OK','24V OK UH000','=A01+UH000-KF02i','STEUERSPANNUNG 24V UH000 OK','CONTROL VOLTAGE 24V UH000 OK','TENSION DE MANIOBRA 24V UH000 OK','' +'DI0020','STEUERSPANNUNG 24V UH000 OK','24V OK UH000','=A01+UH000-KF02i','STEUERSPANNUNG 24V UH000 OK','CONTROL VOLTAGE 24V UH000 OK','TENSION DE MANIOBRA 24V UH000 OK','' +'XY0022','STEUERSPANNUNG 24V UC103 ','24V OK','=A01+UH000-KF02i','STEUERSPANNUNG 24V UC103 OK','CONTROL VOLTAGE 24V UC103 OK','TENSION DE MANIOBRA 24V UC103 OK','' +'DI0021','STEUERSPANNUNG 24V UC102-UC101 OK','24V OK','=A01+UH000-KF02i','STEUERSPANNUNG 24V UC102-UC101 OK','CONTROL VOLTAGE 24V UC102-UC101 OK','TENSION DE MANIOBRA 24V UC102-UC101 OK','' +'KF0013','DRUCKL.-WARTUNGSEINH. SCHLIESSEN','COMPR. AIR OFF','=A01+UH000-KF01Q','DRUCKL.-WARTUNGSEINH. SCHLIESSEN','CLOSE PRESS.-MAINTENANCE UNIT','AIRE COMPRIMIDO/VÁLVULA DE AISLAMIENTO C','' +'KF0012','RESET NOT HALT','RESET E-STOP','=A01+UH000-KF01Q','RESET NOT HALT','RESET EMERGENCY STOP','RESET PARO DE EMERGENCIA','' +'PF0011','ÜBERSTROM/SICHERUNGSFALL','IL-YE-LED','=A01+UH000-KF01Q','ÜBERSTROM/SICHERUNGSFALL','OVERCURRENT/MIN. CIRCUIT BREAKERS','SOBREINTENSIDAD/FUSIBLE AUTOMÁTICO','' +'MA1020','ANTRIEB PUFFER F0101 FLYER 1','M-BI-LE','=A01+UC101-KF02Q','','','','' +'MA1020','ANTRIEB PUFFER F0101 FLYER 1','M-BI-LE','=A01+UC101-KF02Q','','','','' +""" + textarray = textlines.splitlines() + + '''Testcase: 10 Zeilen mit I/O: Davon 4 Eingänge (1 Duplikat), 5 Ausgänge (1 Duplikat), 1 Fehlerhafte BMK''' + + df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_consts, df_tags = call_portal_to_excel(self, textarray, "TIA") + + # print("\n Consts:\n") + # print(df_consts) + # print("\n Tags:\n") + # print(df_tags) + + # print("\n gleiche Eingänge:\n") + # print(df_gleiche_eingaenge) + # print("\n gleiche Ausgänge:\n") + # print(df_gleiche_ausgaenge) + + + self.assertIn("DI0020", df_gleiche_eingaenge["NameOriginal"].values) # Püfen, ob doppelter Name in doppelteEingänge auftaucht + self.assertIn("MA1020", df_gleiche_ausgaenge["NameOriginal"].values) # Püfen, ob doppelter Name in doppelteAusgänge auftaucht + self.assertEqual(len(df_fehler), 1) # Fehler anzeigen: Zeile 4 Prefix XY + + # Test, ob länge passt. Eigentlich 10 Eingabezeilen, Fehler bleibt drin, aber 2x 1 Duplikat in Eingang und Ausgang abziehen + self.assertEqual(len(df_consts), len(textarray)-(len(df_gleiche_ausgaenge)+len(df_gleiche_eingaenge))) + self.assertEqual(len(df_tags), len(textarray)-(len(df_gleiche_ausgaenge)+len(df_gleiche_eingaenge))) + + def test_WSCAD(self): + textlines = """'DI0023','STEUERSPANNUNG 24V UC200 OK','24V OK','=A01+UH000-KF02i','STEUERSPANNUNG 24V UC200 OK','CONTROL VOLTAGE 24V UC200 OK','TENSION DE MANIOBRA 24V UC200 OK','' +'DI0020','STEUERSPANNUNG 24V UH000 OK','24V OK UH000','=A01+UH000-KF02i','STEUERSPANNUNG 24V UH000 OK','CONTROL VOLTAGE 24V UH000 OK','TENSION DE MANIOBRA 24V UH000 OK','' +'DI0020','STEUERSPANNUNG 24V UH000 OK','24V OK UH000','=A01+UH000-KF02i','STEUERSPANNUNG 24V UH000 OK','CONTROL VOLTAGE 24V UH000 OK','TENSION DE MANIOBRA 24V UH000 OK','' +'XY0022','STEUERSPANNUNG 24V UC103 ','24V OK','=A01+UH000-KF02i','STEUERSPANNUNG 24V UC103 OK','CONTROL VOLTAGE 24V UC103 OK','TENSION DE MANIOBRA 24V UC103 OK','' +'DI0021','STEUERSPANNUNG 24V UC102-UC101 OK','24V OK','=A01+UH000-KF02i','STEUERSPANNUNG 24V UC102-UC101 OK','CONTROL VOLTAGE 24V UC102-UC101 OK','TENSION DE MANIOBRA 24V UC102-UC101 OK','' +'KF0013','DRUCKL.-WARTUNGSEINH. SCHLIESSEN','COMPR. AIR OFF','=A01+UH000-KF01Q','DRUCKL.-WARTUNGSEINH. SCHLIESSEN','CLOSE PRESS.-MAINTENANCE UNIT','AIRE COMPRIMIDO/VÁLVULA DE AISLAMIENTO C','' +'KF0012','RESET NOT HALT','RESET E-STOP','=A01+UH000-KF01Q','RESET NOT HALT','RESET EMERGENCY STOP','RESET PARO DE EMERGENCIA','' +'PF0011','ÜBERSTROM/SICHERUNGSFALL','IL-YE-LED','=A01+UH000-KF01Q','ÜBERSTROM/SICHERUNGSFALL','OVERCURRENT/MIN. CIRCUIT BREAKERS','SOBREINTENSIDAD/FUSIBLE AUTOMÁTICO','' +'MA1020','ANTRIEB PUFFER F0101 FLYER 1','M-BI-LE','=A01+UC101-KF02Q','','','','' +'MA1020','ANTRIEB PUFFER F0101 FLYER 1','M-BI-LE','=A01+UC101-KF02Q','','','','' +""" + textarray = textlines.splitlines() + + '''Testcase: 10 Zeilen mit I/O: Davon 4 Eingänge (1 Duplikat), 5 Ausgänge (1 Duplikat), 1 Fehlerhafte BMK''' + + df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_eingaenge, df_ausgaenge = call_portal_to_excel(self, textarray, "WSCAD mit Bezug") + + print("\n Eingänge:\n") + print(df_eingaenge) + print("\n Ausgänge:\n") + print(df_ausgaenge) + + # print("\n Fehler") + # print(df_fehler) + + # print("\n gleiche Eingänge:\n") + # print(df_gleiche_eingaenge) + # print("\n gleiche Ausgänge:\n") + # print(df_gleiche_ausgaenge) + + +if __name__ == "__main__": + + suite = unittest.TestSuite() + suite.addTest(TestPlant('test_Simpel')) + suite.addTest(TestPlant('test_TIA')) + suite.addTest(TestPlant('test_WSCAD')) + + runner = unittest.TextTestRunner() + runner.run(suite) + + export_type_arr = ("EA", "TIA", "WSCAD", "WSCAD mit Bezug") + textlines = """'XYZ0023','STEUERSPANNUNG 24V UC200 OK','24V OK','=A01+UH000-KF02i','STEUERSPANNUNG 24V UC200 OK','CONTROL VOLTAGE 24V UC200 OK','TENSION DE MANIOBRA 24V UC200 OK','','' +'DI0020','STEUERSPANNUNG 24V UH000 OK','24V OK UH000','=A01+UH000-KF02i','STEUERSPANNUNG 24V UH000 OK','CONTROL VOLTAGE 24V UH000 OK','TENSION DE MANIOBRA 24V UH000 OK','','' +'DI0020','STEUERSPANNUNG 24V UC103 ','24V OK','=A01+UH000-KF02i','STEUERSPANNUNG 24V UC103 OK','CONTROL VOLTAGE 24V UC103 OK','TENSION DE MANIOBRA 24V UC103 OK','','' +'DI0021','STEUERSPANNUNG 24V UC102-UC101 OK','24V OK','=A01+UH000-KF02i','STEUERSPANNUNG 24V UC102-UC101 OK','CONTROL VOLTAGE 24V UC102-UC101 OK','TENSION DE MANIOBRA 24V UC102-UC101 OK','','' +'KF0013','DRUCKL.-WARTUNGSEINH. SCHLIESSEN','COMPR. AIR OFF','=A01+UH000-KF01Q','DRUCKL.-WARTUNGSEINH. SCHLIESSEN','CLOSE PRESS.-MAINTENANCE UNIT','AIRE COMPRIMIDO/VÁLVULA DE AISLAMIENTO C','','' +'KF0012','RESET NOT HALT','RESET E-STOP','=A01+UH000-KF01Q','RESET NOT HALT','RESET EMERGENCY STOP','RESET PARO DE EMERGENCIA','','' +'PF0011','ÜBERSTROM/SICHERUNGSFALL','IL-YE-LED','=A01+UH000-KF01Q','ÜBERSTROM/SICHERUNGSFALL','OVERCURRENT/MIN. CIRCUIT BREAKERS','SOBREINTENSIDAD/FUSIBLE AUTOMÁTICO','','' +'PF0010','DRUCKLUFT FEHLT','IL-YE-LED','=A01+UH000-KF01Q','DRUCKLUFT FEHLT','COMPRESSED AIR MISSING','AIRE COMPRIMIDO DESCONECTADO','','' +'PF0002','START NACH STÖRUNG','IPB-CL-LED','=A01+UH000-KF00Q','START NACH STÖRUNG','START AFTER TROUBLE','ARRANQUE DESPUÉS DE AVERÍA','','' +'PF0004','STÖRUNG KOMMUNIKATION PC-SPS','IL-YE-LED','=A01+UH000-KF00Q','STÖRUNG KOMMUNIKATION PC-SPS','TROUBLE COMMUNICATION PC-PLC','AVERÍA COMMUNICATIÓN PC-CPP','','' +'PF0006','ABHEBEN AKTIV','IL-YE-LED','=A01+UH000-KF00Q','ABHEBEN AKTIV','LIFT OFF ACTIVE','SEPARAR ACTIVO','','' +'PF0005','LAUFZEITFEHLER','IPB-YE-LED','=A01+UH000-KF00Q','LAUFZEITFEHLER','TRAVEL TIME ERROR','ERROR DE TIEMPO','','' +'PF0003','NOT HALT BETÄTIGT','IL-YE-LED','=A01+UH000-KF00Q','NOT HALT BETÄTIGT','EMERGENCY STOP PUSHED','PARO EMERGENCIA OK','','' +'PF0001','ANLAGE EIN','IPB-GN-LED','=A01+UH000-KF00Q','ANLAGE EIN','SYSTEM ON','SISTEMA ENCENDIDO','','' +'PF0000','STÖRUNG ALLGEMEIN','IL-YE-LED','=A01+UH000-KF00Q','STÖRUNG ALLGEMEIN','GENERAL TROUBLE','AVERÍA','','' +'DI0017','PHASENÜBERWACHUNGSRELAIS 400VAC EIN','MONITOR. RELAY','=A01+UH000-KF01i','PHASENÜBERWACHUNGSRELAIS 400VAC EIN','PHASE MONITORING RELAY 400VAC ON','VIGILANCIA DE FASE EL RELE´','','' +'SF0015','RESET AKTIV','PB-BK-NO','=A01+UH000-KF01i','RESET AKTIV','RESET ACTIVE','RESET AKTIVA','','' +'DI0014','HAUPTSCHÜTZE EIN','MAIN CONTACT.','=A01+UH000-KF01i','HAUPTSCHÜTZE EIN','MAIN CONTACTORS ON','ENCENDIDO CONTACTOR PRINCIPAL','','' +'DI0013','SICHERHEITSRELAIS EIN','SAFETY RELAY','=A01+UH000-KF01i','SICHERHEITSRELAIS EIN','SAFETY RELAY ON','RELÉ DE SEGURIDAD ENCENDIDO','','' +'DI0012','SICHERUNGSAUTOMATENFALL','CIRCUIT BR.','=A01+UH000-KF01i','SICHERUNGSAUTOMATENFALL','MINIATURE CIRCUIT BREAKERS','FUSIBLE AUTOMÁTICO','','' +'DI0011','ÜBERSTROM','MOTORS','=A01+UH000-KF01i','ÜBERSTROM','OVERCURRENT','SOBREINTENSIDAD','','' +'BG0010','DRUCKLUFT OK','COMPR. AIR','=A01+UH000-KF01i','DRUCKLUFT OK','COMPRESSED AIR OK','AIRE COMPRIMIDO OK','','' +'SF0004','LAMPENTEST','PB-WH-NO','=A01+UH000-KF00i','LAMPENTEST','LAMP TEST','ENSAYO LAMPARA','','' +'SF0006','ANTRIEBE ABHEBEN','SS-BK-NO','=A01+UH000-KF00i','ANTRIEBE ABHEBEN','LIFT OFF CONVEYORS','SEPARAR MOTOR','','' +'SF0005','LAUFZEITFEHLER','IPB-YE-N0','=A01+UH000-KF00i','LAUFZEITFEHLER','TRAVEL TIME ERROR','ERROR DE TIEMPO','','' +'SF0003','NOT HALT SCHALTSCHRANK','EPB-RD-NC','=A01+UH000-KF00i','NOT HALT','EMERGENCY STOP','PARO DE EMERGENCIA ARMARIO DE DISTRIBUCI','','' +'SF0002','START NACH STÖRUNG','IPB-CL-NO','=A01+UH000-KF00i','START NACH STÖRUNG','START AFTER TROUBLE','ARRANQUE DESPUÉS DE AVERÍA','','' +'SF0001','ANLAGE EIN','IPB-GN-NO','=A01+UH000-KF00i','ANLAGE EIN','SYSTEM ON','SISTEMA ENCENDIDO','','' +'SF0000','ANLAGE AUS','PB-BK-NC','=A01+UH000-KF00i','ANLAGE AUS','SYSTEM OFF','SISTEMA APAGADO','','' +'BG1303','SENSOR HAUPTSTR. FB213','LT-FB213','=A01+UC102-KF04i','','','','','' +'BG1424','SENSOR HAUPTSTR. EINFAHRT FB211','LT-ENTER FB211','=A01+UH000-KF05i','','','','','' +'BG1462','SENSOR HAUPTSTR. AUSFAHRT FB222','LT-EXIT-FB222','=A01+UH000-KF08i','','','','','' +'BG3133','SENSOR HAUPTSTR. FB312','LT-FB312','=A01+UH000-KF12i','','','','','' +'MB1487','WEICHE ABZWEIG AUSFAHRT FB222','SW EXIT FB222','=A01+UH000-KF10Q','','','','','' +'MA1437','ANTRIEB HAUPTSTR. AUSFAHRT RF - RSM FB212','M-BI FB212','=A01+UH000-KF05Q','','','','','>' +'MA1436','ANTRIEB HAUPTSTR. EINFAHRT RF - RSM FB211','M-BI FB211','=A01+UH000-KF05Q','','','','','<' +'BG1460','SENSOR HAUPTSTR. AUSFAHRT FB221','LT- EXIT FB221','=A01+UH000-KF08i','','','','','' +'BG1417','SENSOR HAUPTSTR. FLYER 6','LT-ENTER RF6','=A01+UH000-KF04i','','','','','' +'MA1480','ANTRIEB HAUPTSTR. EINFAHRT RF - RSM FB221','M-BI FB221','=A01+UH000-KF10Q','','','','','<' +'QA1525','ANTRIEB HAUPTSTR. RF 8','M-BI RF 8','=A01+UC103-KF02Q','','','','','>' +'MA1524','ANTRIEB HAUPTSTR. RF 8','M-BI RF 8','=A01+UC103-KF02Q','','','','','>' +'BG1140','SENSOR HAUPTSTR. FLYER 3 FB215','LT RF3 FB215','=A01+UC101-KF06i','','','','','' +'MB1486','WEICHE ABZWEIG HAUPTSTR. EINFAHRT FB73','SW ENTER ','=A01+UH000-KF10Q','','','','','' +'QA1483','ANTRIEB HAUPTSTR. RF - RSM','M-BI RSM-RF','=A01+UH000-KF10Q','','','','','<' +'MA1482','ANTRIEB HAUPTSTR. RF - RSM','M-BI RF-RSM','=A01+UH000-KF10Q','','','','','<' +'BG1457','SENSOR HAUPTSTR. EINFAHRT FB222','LT-ENTER-FB222','=A01+UH000-KF07i','','','','','' +'BG1461','SENSOR HAUPTSTR. EINFAHRT FB221','LT-ENTER-FB221','=A01+UH000-KF08i','','','','','' +'BG1420','SENSOR HAUPTSTR. AUSFAHRT FB213','LT- EXIT FB213','=A01+UH000-KF05i','','','','','' +'MA1484','ANTRIEB HAUPTSTR. AUSFAHRT RF - RSM FB222','M-BI FB222','=A01+UH000-KF10Q','','','','','>' +'BG1421','SENSOR HAUPTSTR. FB212','LT-FB212','=A01+UH000-KF05i','','','','','' +'QA1477','ANTRIEB EIN-AUSFAHRT HAUPTSTR. RF - RSM','M-BI RSM-RF','=A01+UH000-KF09Q','','','','','>' +'MA1476','ANTRIEB EIN-AUSFAHRT HAUPTSTR. RF - RSM','M-BI RF-RSM','=A01+UH000-KF09Q','','','','','<' +'MB3236','WEICHE GERADE FB320','STRAIGHT','=A01+UH000-KF20Q','','','','','' +'MB3237','WEICHE ABZWEIG FB320','BRANCH ','=A01+UH000-KF20Q','','','','','' +'BG3231','SENSOR HAUPTSTR. FB321','LT-FB321','=A01+UH000-KF16i','','','','','' +'BG3132','SENSOR HAUPTSTR. FB310-FB320','LT-FB310-FB320','=A01+UH000-KF12i','','','','','' +'MB3136','WEICHE GERADE FB310','STRAIGHT','=A01+UH000-KF14Q','','','','','' +'MB3137','WEICHE ABZWEIG FB310','BRANCH ','=A01+UH000-KF14Q','','','','','' +'QA1433','ANTRIEB EIN-AUSFAHRT HAUPTSTR. RF - RSM','M-BI RSM-RF','=A01+UH000-KF05Q','','','','','>' +'MA1432','ANTRIEB EIN-AUSFAHRT HAUPTSTR. RF - RSM','M-BI RF-RSM','=A01+UH000-KF05Q','','','','','<' +'MB1422','WEICHE ABZWEIG PUFFER FB212','SW EXIT FB212','=A01+UH000-KF04Q','','','','','' +'BG1423','SENSOR HAUPTSTR. AUSFAHRT FB212','LT-EXIT FB212','=A01+UH000-KF05i','','','','','' +'QA3235','ANTRIEB HAUPTSTRECKE -> RSM 28-21 ','RA-BI','=A01+UH000-KF20Q','','','','','<' +'MA3234','ANTRIEB HAUPTSTRECKE -> RSM 21-28 ','RA-BI','=A01+UH000-KF20Q','','','','A','<' +'QA3135','ANTRIEB HAUPTSTRECKE -> RSM 10-1','RA-BI','=A01+UH000-KF14Q','','','','','<' +'MA3134','ANTRIEB HAUPTSTRECKE -> RSM 1-10','RA-BI','=A01+UH000-KF14Q','','','','A','<' +'QA3035','ANTRIEB HAUPTSTRECKE -> RSM 10-1','RA-BI','=A01+UC200-KF03Q','','','','','<' +'MA3034','ANTRIEB HAUPTSTRECKE -> RSM 1-10','RA-BI','=A01+UC200-KF03Q','','','','A','<' +'PF3214','RUNDUMLEUCHTE STÖRUNG RSM 11-20','LED-YE_FAULT','=A01+UH000-KF18Q','','','','','' +'SF3216','RESET/START NACH NOT HALT RSM 21-25','IPB-YE-NO','=A01+UH000-KF14i','RESET','RESET','RESET','','' +'PF3216','RESET/START NACH NOT HALT RSM 21-25','IPB-YE-LED ','=A01+UH000-KF18Q','','','','','' +'SF3215','NOT HALT RSM 21-25','EPB-NC','=A01+UH000-KF14i','NOT-HALT','E-STOP','E-STOP','','' +'PF3114','RUNDUMLEUCHTE STÖRUNG RSM 11-20','LED-YE_FAULT','=A01+UH000-KF12Q','','','','','' +'SF3116','RESET/START NACH NOT HALT RSM 11-20','IPB-YE-NO','=A01+UH000-KF10i','RESET','RESET','RESET','','' +'PF3116','RESET/START NACH NOT HALT RSM 11-20','IPB-YE-LED ','=A01+UH000-KF12Q','','','','','' +'SF3115','NOT HALT RSM 11-20','EPB-NC','=A01+UH000-KF10i','NOT-HALT','E-STOP','E-STOP','','' +'SF3226','ZUG WECHSELN RSM 30','LDT-GN-NO','=A01+UH000-KF15i','-UZ3226','-UZ3226','','','' +'PF3254','ZUG WECHSELN RSM 30','LDT-GN-LED ','=A01+UH000-KF22Q','','','','','' +'QA3257','ANTRIEB AUSFAHREN RSM 30','RA-BI','=A01+UH000-KF22Q','','','','','<' +'MA3256','ANTRIEB EINFAHREN RSM 30','RA-BI','=A01+UH000-KF22Q','','','','A','>' +'BG3227','SENSOR OPTISCH RSM 30','OPT. AP110','=A01+UH000-KF15i','','','','','' +'SF3224','ZUG WECHSELN RSM 29','LDT-GN-NO','=A01+UH000-KF15i','-UZ3224','-UZ3224','','','' +'PF3250','ZUG WECHSELN RSM 29','LDT-GN-LED ','=A01+UH000-KF22Q','','','','','' +'MB3251','WEICHE ABZWEIG RSM 29','SW RSM 29','=A01+UH000-KF22Q','','','','','' +'QA3253','ANTRIEB AUSFAHREN RSM 29','RA-BI','=A01+UH000-KF22Q','','','','','<' +'MA3252','ANTRIEB EINFAHREN RSM 29','RA-BI','=A01+UH000-KF22Q','','','','A','>' +'BG3225','SENSOR OPTISCH RSM 29','OPT. AP110','=A01+UH000-KF15i','','','','','' +'MB3241','WEICHE ABZWEIG RSM 27','SW RSM 27','=A01+UH000-KF21Q','','','','','' +'MB3231','WEICHE ABZWEIG RSM 26','SW RSM 26','=A01+UH000-KF20Q','','','','','' +'MB3245','WEICHE ABZWEIG RSM 28','SW RSM 28','=A01+UH000-KF21Q','','','','','' +'QA3247','ANTRIEB AUSFAHREN RSM 28','RA-BI','=A01+UH000-KF21Q','','','','','<' +'MA3246','ANTRIEB EINFAHREN RSM 28','RA-BI','=A01+UH000-KF21Q','','','','A','>' +'BG3223','SENSOR OPTISCH RSM 28','OPT. AP110','=A01+UH000-KF15i','','','','','' +'QA3243','ANTRIEB AUSFAHREN RSM 27','RA-BI','=A01+UH000-KF21Q','','','','','<' +'MA3242','ANTRIEB EINFAHREN RSM 27','RA-BI','=A01+UH000-KF21Q','','','','A','>' +'BG3221','SENSOR OPTISCH RSM 27','OPT. AP110','=A01+UH000-KF15i','','','','','' +'QA3233','ANTRIEB AUSFAHREN RSM 26','RA-BI','=A01+UH000-KF20Q','','','','','<' +'MA3232','ANTRIEB EINFAHREN RSM 26','RA-BI','=A01+UH000-KF20Q','','','','A','>' +'BG3213','SENSOR OPTISCH RSM 26','OPT. AP110','=A01+UH000-KF14i','','','','','' +'MB3225','WEICHE ABZWEIG RSM 25','SW RSM 25','=A01+UH000-KF19Q','','','','','' +'QA3227','ANTRIEB AUSFAHREN RSM 25','RA-BI','=A01+UH000-KF19Q','','','','','<' +'MA3226','ANTRIEB EINFAHREN RSM 25','RA-BI','=A01+UH000-KF19Q','','','','A','>' +'BG3211','SENSOR OPTISCH RSM 25','OPT. AP110','=A01+UH000-KF14i','','','','','' +'QA3223','ANTRIEB AUSFAHREN RSM 24','RA-BI','=A01+UH000-KF19Q','','','','','<' +'MA3222','ANTRIEB EINFAHREN RSM 24','RA-BI','=A01+UH000-KF19Q','','','','A','>' +'BG3207','SENSOR OPTISCH RSM 24','OPT. AP110','=A01+UH000-KF13i','','','','','' +'MB3221','WEICHE ABZWEIG RSM 24','SW RSM 24','=A01+UH000-KF19Q','','','','','' +'QA3213','ANTRIEB AUSFAHREN RSM 23','RA-BI','=A01+UH000-KF18Q','','','','','<' +'MA3212','ANTRIEB EINFAHREN RSM 23','RA-BI','=A01+UH000-KF18Q','','','','A','>' +'BG3205','SENSOR OPTISCH RSM 23','OPT. AP110','=A01+UH000-KF13i','','','','','' +'QA3207','ANTRIEB AUSFAHREN RSM 22','RA-BI','=A01+UH000-KF17Q','','','','','<' +'MA3206','ANTRIEB EINFAHREN RSM 22','RA-BI','=A01+UH000-KF17Q','','','','A','>' +'BG3203','SENSOR OPTISCH RSM 22','OPT. AP110','=A01+UH000-KF13i','','','','','' +'QA3203','ANTRIEB AUSFAHREN RSM 21','RA-BI','=A01+UH000-KF17Q','','','','','<' +'MA3202','ANTRIEB EINFAHREN RSM 21','RA-BI','=A01+UH000-KF17Q','','','','A','>' +'BG3201','SENSOR OPTISCH RSM 21','OPT. AP110','=A01+UH000-KF13i','','','','','' +'MB3211','WEICHE ABZWEIG RSM 23','SW RSM 23','=A01+UH000-KF18Q','','','','','' +'MB3205','WEICHE ABZWEIG RSM 22','SW RSM 22','=A01+UH000-KF17Q','','','','','' +'MB3201','WEICHE ABZWEIG RSM 21','SW RSM 21','=A01+UH000-KF17Q','','','','','' +'SF3222','ZUG WECHSELN RSM 28','LDT-GN-NO','=A01+UH000-KF15i','-UZ3222','-UZ3222','','','' +'PF3244','ZUG WECHSELN RSM 28','LDT-GN-LED ','=A01+UH000-KF21Q','','','','','' +'SF3220','ZUG WECHSELN RSM 27','LDT-GN-NO','=A01+UH000-KF15i','-UZ3220','-UZ3220','','','' +'PF3240','ZUG WECHSELN RSM 27','LDT-GN-LED ','=A01+UH000-KF21Q','','','','','' +'SF3212','ZUG WECHSELN RSM 26','LDT-GN-NO','=A01+UH000-KF14i','-UZ3300','-UZ3300','','','' +'PF3230','ZUG WECHSELN RSM 26','LDT-GN-LED ','=A01+UH000-KF20Q','','','','','' +'SF3210','ZUG WECHSELN RSM 25','LDT-GN-NO','=A01+UH000-KF14i','-UZ3210','-UZ3210','','','' +'PF3224','ZUG WECHSELN RSM 25','LDT-GN-LED ','=A01+UH000-KF19Q','','','','','' +'SF3206','ZUG WECHSELN RSM 24','LDT-GN-NO','=A01+UH000-KF13i','-UZ3206','-UZ3206','','','' +'PF3220','ZUG WECHSELN RSM 24','LDT-GN-LED ','=A01+UH000-KF19Q','','','','','' +'SF3204','ZUG WECHSELN RSM 23','LDT-GN-NO','=A01+UH000-KF13i','-UZ3204','-UZ3204','','','' +'PF3210','ZUG WECHSELN RSM 23','LDT-GN-LED ','=A01+UH000-KF18Q','','','','','' +'SF3202','ZUG WECHSELN RSM 22','LDT-GN-NO','=A01+UH000-KF13i','-UZ3202','-UZ3202','','','' +'PF3204','ZUG WECHSELN RSM 22','LDT-GN-LED ','=A01+UH000-KF17Q','','','','','' +'SF3200','ZUG WECHSELN RSM 21','LDT-GN-NO','=A01+UH000-KF13i','-UZ3200','-UZ3200','','','' +'PF3200','ZUG WECHSELN RSM 21','LDT-GN-LED ','=A01+UH000-KF17Q','','','','','' +'MB3155','WEICHE ABZWEIG RSM 20','SW RSM 20','=A01+UH000-KF16Q','','','','','' +'QA3157','ANTRIEB AUSFAHREN RSM 20','RA-BI','=A01+UH000-KF16Q','','','','','<' +'MA3156','ANTRIEB EINFAHREN RSM 20','RA-BI','=A01+UH000-KF16Q','','','','A','>' +'BG3127','SENSOR OPTISCH RSM 20','OPT. AP110','=A01+UH000-KF11i','','','','','' +'QA3153','ANTRIEB AUSFAHREN RSM 19','RA-BI','=A01+UH000-KF16Q','','','','','<' +'MA3152','ANTRIEB EINFAHREN RSM 19','RA-BI','=A01+UH000-KF16Q','','','','A','>' +'BG3125','SENSOR OPTISCH RSM 19','OPT. AP110','=A01+UH000-KF11i','','','','','' +'QA3147','ANTRIEB AUSFAHREN RSM 18','RA-BI','=A01+UH000-KF15Q','','','','','<' +'MA3146','ANTRIEB EINFAHREN RSM 18','RA-BI','=A01+UH000-KF15Q','','','','A','>' +'BG3123','SENSOR OPTISCH RSM 18','OPT. AP110','=A01+UH000-KF11i','','','','','' +'QA3143','ANTRIEB AUSFAHREN RSM 17','RA-BI','=A01+UH000-KF15Q','','','','','<' +'MA3142','ANTRIEB EINFAHREN RSM 17','RA-BI','=A01+UH000-KF15Q','','','','A','>' +'BG3121','SENSOR OPTISCH RSM 17','OPT. AP110','=A01+UH000-KF11i','','','','','' +'QA3133','ANTRIEB AUSFAHREN RSM 16','RA-BI','=A01+UH000-KF14Q','','','','','<' +'MA3132','ANTRIEB EINFAHREN RSM 16','RA-BI','=A01+UH000-KF14Q','','','','A','>' +'BG3113','SENSOR OPTISCH RSM 16','OPT. AP110','=A01+UH000-KF10i','','','','','' +'QA3127','ANTRIEB AUSFAHREN RSM 15','RA-BI','=A01+UH000-KF13Q','','','','','<' +'MA3126','ANTRIEB EINFAHREN RSM 15','RA-BI','=A01+UH000-KF13Q','','','','A','>' +'BG3111','SENSOR OPTISCH RSM 15','OPT. AP110','=A01+UH000-KF10i','','','','','' +'QA3123','ANTRIEB AUSFAHREN RSM 14','RA-BI','=A01+UH000-KF13Q','','','','','<' +'MA3122','ANTRIEB EINFAHREN RSM 14','RA-BI','=A01+UH000-KF13Q','','','','A','>' +'BG3107','SENSOR OPTISCH RSM 14','OPT. AP110','=A01+UH000-KF09i','','','','','' +'MB3151','WEICHE ABZWEIG RSM 19','SW RSM 19','=A01+UH000-KF16Q','','','','','' +'MB3145','WEICHE ABZWEIG RSM 18','SW RSM 18','=A01+UH000-KF15Q','','','','','' +'MB3141','WEICHE ABZWEIG RSM 17','SW RSM 17','=A01+UH000-KF15Q','','','','','' +'MB3131','WEICHE ABZWEIG RSM 16','SW RSM 16','=A01+UH000-KF14Q','','','','','' +'MB3125','WEICHE ABZWEIG RSM 15','SW RSM 15','=A01+UH000-KF13Q','','','','','' +'MB3121','WEICHE ABZWEIG RSM 14','SW RSM 14','=A01+UH000-KF13Q','','','','','' +'SF3126','ZUG WECHSELN RSM 20','LDT-GN-NO','=A01+UH000-KF11i','-UZ3122','-UZ3122','','','' +'PF3154','ZUG WECHSELN RSM 20','LDT-GN-LED ','=A01+UH000-KF16Q','','','','','' +'SF3124','ZUG WECHSELN RSM 19','LDT-GN-NO','=A01+UH000-KF11i','-UZ3120','-UZ3120','','','' +'PF3150','ZUG WECHSELN RSM 19','LDT-GN-LED ','=A01+UH000-KF16Q','','','','','' +'SF3122','ZUG WECHSELN RSM 18','LDT-GN-NO','=A01+UH000-KF11i','-UZ3116','-UZ3116','','','' +'PF3144','ZUG WECHSELN RSM 18','LDT-GN-LED ','=A01+UH000-KF15Q','','','','','' +'SF3120','ZUG WECHSELN RSM 17','LDT-GN-NO','=A01+UH000-KF11i','-UZ3120','-UZ3102','','','' +'PF3140','ZUG WECHSELN RSM 17','LDT-GN-LED ','=A01+UH000-KF15Q','','','','','' +'SF3112','ZUG WECHSELN RSM 16','LDT-GN-NO','=A01+UH000-KF10i','-UZ3112','-UZ3112','','','' +'PF3130','ZUG WECHSELN RSM 16','LDT-GN-LED ','=A01+UH000-KF14Q','','','','','' +'SF3110','ZUG WECHSELN RSM 15','LDT-GN-NO','=A01+UH000-KF10i','-UZ3110','-UZ3110','','','' +'PF3124','ZUG WECHSELN RSM 15','LDT-GN-LED ','=A01+UH000-KF13Q','','','','','' +'SF3106','ZUG WECHSELN RSM 14','LDT-GN-NO','=A01+UH000-KF09i','-UZ3106','-UZ3106','','','' +'PF3120','ZUG WECHSELN RSM 14','LDT-GN-LED ','=A01+UH000-KF13Q','','','','','' +'QA3113','ANTRIEB AUSFAHREN RSM 13','RA-BI','=A01+UH000-KF12Q','','','','','<' +'MA3112','ANTRIEB EINFAHREN RSM 13','RA-BI','=A01+UH000-KF12Q','','','','A','>' +'BG3105','SENSOR OPTISCH RSM 13','OPT. AP110','=A01+UH000-KF09i','','','','','' +'MB3111','WEICHE ABZWEIG RSM 13','SW RSM 13','=A01+UH000-KF12Q','','','','','' +'SF3104','ZUG WECHSELN RSM 13','LDT-GN-NO','=A01+UH000-KF09i','-UZ3104','-UZ3104','','','' +'PF3110','ZUG WECHSELN RSM 13','LDT-GN-LED ','=A01+UH000-KF12Q','','','','','' +'QA3107','ANTRIEB AUSFAHREN RSM 12','RA-BI','=A01+UH000-KF11Q','','','','','<' +'MA3106','ANTRIEB EINFAHREN RSM 12','RA-BI','=A01+UH000-KF11Q','','','','A','>' +'BG3103','SENSOR OPTISCH RSM 12','OPT. AP110','=A01+UH000-KF09i','','','','','' +'MB3105','WEICHE ABZWEIG RSM 12','SW RSM 12','=A01+UH000-KF11Q','','','','','' +'SF3102','ZUG WECHSELN RSM 12','LDT-GN-NO','=A01+UH000-KF09i','-UZ3102','-UZ3102','','','' +'PF3104','ZUG WECHSELN RSM 12','LDT-GN-LED ','=A01+UH000-KF11Q','','','','','' +'SF3100','ZUG WECHSELN RSM 11','LDT-GN-NO','=A01+UH000-KF09i','-UZ3100','-UZ3100','','','' +'PF3100','ZUG WECHSELN RSM 11','LDT-GN-LED ','=A01+UH000-KF11Q','','','','','' +'QA3103','ANTRIEB AUSFAHREN RSM 11','RA-BI','=A01+UH000-KF11Q','','','','','<' +'MA3102','ANTRIEB EINFAHREN RSM 11','RA-BI','=A01+UH000-KF11Q','','','','A','>' +'BG3101','SENSOR OPTISCH RSM 11','OPT. AP110','=A01+UH000-KF09i','','','','','' +'MB3101','WEICHE ABZWEIG RSM 11','SW RSM 11','=A01+UH000-KF11Q','','','','','' +'BG3130','SENSOR HAUPTSTR. FB310 ','LT-FB310','=A01+UH000-KF12i','','','','','' +'BG3230','SENSOR HAUPTSTR. FB320 ','LT-FB320','=A01+UH000-KF16i','','','','','' +'BG3131','SENSOR HAUPTSTR. FB311','LT-FB311','=A01+UH000-KF12i','','','','','' +'BG1541','SENSOR AUSFAHRT PUFFER F0902 FLYER 9','LT-EXIT F0902','=A01+UC103-KF02i','','','','','' +'BG1540','SENSOR AUSFAHRT PUFFER F0901 FLYER 9','LT-EXIT F0901','=A01+UC103-KF02i','','','','','' +'MB1574','ANPRESSEN NACHPUFFER F0901 FLYER 9','PRESS F0901','=A01+UC103-KF07Q','','','','','' +'MB1575','ANPRESSEN NACHPUFFER F0902 FLYER 9','PRESS F0902','=A01+UC103-KF07Q','','','','','' +'QA1571','ANTRIEB NACHPUFFER F0707 FLYER 9','M-BI-LE','=A01+UC103-KF07Q','','','','','<' +'MA1570','ANTRIEB NACHPUFFER F0901 FLYER 9','M-BI-RI','=A01+UC103-KF07Q','','','','','>' +'MB1544','ANPRESSEN PUFFER F0901 FLYER 9','PRESS F0901','=A01+UC103-KF04Q','','','','','' +'MB1545','ANPRESSEN PUFFER F0902 FLYER 9','PRESS F0902','=A01+UC103-KF04Q','','','','','' +'QA1561','ANTRIEB PUFFER F0901 FLYER 9','M-BI-RI','=A01+UC103-KF06Q','','','','','>' +'MA1560','ANTRIEB PUFFER F0901 FLYER 9','M-BI-LE','=A01+UC103-KF06Q','','','','','<' +'BG1546','SENSOR AUSFAHRT NACHPUFFER F0902 RF 9','LT-EXIT F0902','=A01+UC103-KF02i','','','','','' +'BG1545','SENSOR AUSFAHRT NACHPUFFER F0901 RF 9','LT-EXIT F0901','=A01+UC103-KF02i','','','','','' +'MB1541','WEICHE ABZWEIG EINFAHRT PUFFER F0902 FLYER 9','SW ENTER F0901','=A01+UC103-KF04Q','','','','','' +'MB1540','WEICHE ABZWEIG EINFAHRT RF 9','SW ENTER RF 9','=A01+UC103-KF04Q','','','','','' +'MB1567','WEICHE ABZWEIG EINFAHRT NACHP. RF 9','SW-STRAIGHT','=A01+UC103-KF06Q','','','','','' +'MB1566','WEICHE ABZWEIG EINFAHRT NACHP. RF 9','SW-BRANCH','=A01+UC103-KF06Q','','','','','' +'KF1555','IF RF 09: START SPULENWECHSEL 2','IF-RELAIS','=A01+UC103-KF05Q','IF RF 09: START SPULENWECHSEL 2','IF RF 09: START EXCHANGE 2','','','' +'DI1554','IF RF 09 : NEUE SPULE','IF-RELAIS','=A01+UC103-KF03i','IF RF 09: NEUE SPULE ','IF RF 09: NEW BOBBIN','','','' +'KF1554','IF RF 09: START SPULENWECHSEL 1','IF-RELAIS','=A01+UC103-KF05Q','IF RF 09: START SPULENWECHSEL 1','IF RF 09: START EXCHANGE 1','','','' +'PF1547','RUNDUMLEUCHTE STÖRUNG FLYER 9','LED-YE_FAULT','=A01+UC103-KF04Q','','','','','' +'SF1553','RESET FLYER 9','IPB-YE-NO','=A01+UC103-KF03i','RESET','RESET','RESET','','' +'PF1553','RESET FLYER 9','IPB-YE-LED','=A01+UC103-KF05Q','','','','','' +'SF1552','NOT HALT FLYER 9','EPB-NC','=A01+UC103-KF03i','NOT-HALT','E-STOP','E-STOP','','' +'BG1556','SENSOR SPULE IN POSITION FLYER 9','BOBBIN IN POS','=A01+UC103-KF03i','','','','','' +'BG1544','SENSOR ZUG IN DOFFER FLYER 9','LT-TRAIN IN DOF','=A01+UC103-KF02i','','','','','' +'BG1543','SENSOR ZUG IN DOFFER PM 9','LT-TRAIN IN DOF','=A01+UC103-KF02i','','','','','' +'MB1551','ABHEBEN ANTRIEBE PM 9','LIFT OFF BS 9','=A01+UC103-KF05Q','','','','','' +'MA1556','ANTRIEBE FLYER 9','M-BI','=A01+UC103-KF05Q','','','','','>' +'MB1502','WEICHE ABZWEIG EINFAHRT PUFFER F0802 FLYER 8','SW ENTER F0802','=A01+UC103-KF00Q','','','','','' +'MB1500','WEICHE ABZWEIG EINFAHRT FLYER 8','SW ENTER RF 8','=A01+UC103-KF00Q','','','','','' +'MB1501','WEICHE ABZWEIG EINFAHRT RF 8','SW ENTER RF 8','=A01+UC103-KF00Q','','','','','' +'MB1534','ANPRESSEN NACHPUFFER F0801 FLYER 8','PRESS F0801','=A01+UC103-KF03Q','','','','','' +'MB1535','ANPRESSEN NACHPUFFER F0802 FLYER 8','PRESS F0802','=A01+UC103-KF03Q','','','','','' +'QA1531','ANTRIEB NACHPUFFER F0802 RF 8','M-BI','=A01+UC103-KF03Q','','','','','>' +'MA1530','ANTRIEB NACHPUFFER F0801 RF 8','M-BI','=A01+UC103-KF03Q','','','','','>' +'MB1504','ANPRESSEN PUFFER F0801 FLYER 8','PRESS F0801','=A01+UC103-KF00Q','','','','','' +'MB1505','ANPRESSEN PUFFER F0802 FLYER 8','PRESS F0802','=A01+UC103-KF00Q','','','','','' +'QA1521','ANTRIEB PUFFER F0802 FLYER 8','M-BI-RI','=A01+UC103-KF02Q','','','','','<' +'MA1520','ANTRIEB PUFFER F0801 FLYER 8','M-BI-LE','=A01+UC103-KF02Q','','','','','<' +'BG1505','SENSOR AUSFAHRT NACHPUFFER F0801 FLYER 8','LT-EXIT F0801','=A01+UC103-KF00i','','','','','' +'BG1506','SENSOR AUSFAHRT NACHPUFFER F0802 FLYER 8','LT-EXIT F0802','=A01+UC103-KF00i','','','','','' +'BG1501','SENSOR AUSFAHRT PUFFER F0802 FLYER 8','LT-EXIT F0802','=A01+UC103-KF00i','','','','','' +'BG1500','SENSOR AUSFAHRT PUFFER F0801 FLYER 8','LT-EXIT F0801','=A01+UC103-KF00i','','','','','' +'SF1511','HAUPTSCHALTER EIN +UC103','I-MS ON','=A01+UC103-KF01i','HAUPTSCHALTER EIN','MAIN SWITCH ON','','','' +'SF1510','MOTORSCHUTZSCHALTER HAT AUSGELÖST','I-CB OK','=A01+UC103-KF01i','MSS IN ORDNUNG','MPS OK','','','' +'PF1510','LM-ÜBERSTROM +UC103','IL-YE-LED','=A01+UC103-KF01Q','LM ÜBERSTROM','IL OVERCURRENT','','','' +'MB1527','WEICHE ABZWEIG EINFAHRT NACHP. RF 8','SW-BRANCH','=A01+UC103-KF02Q','','','','','' +'MB1526','WEICHE ABZWEIG EINFAHRT NACHP. RF 8','SW-STRAIGHT','=A01+UC103-KF02Q','','','','','' +'BG1503','SENSOR ZUG IN DOFFER PM 8','LT-TRAIN IN DOF','=A01+UC103-KF00i','','','','','' +'BG1516','SENSOR SPULE IN POSITION FLYER 8','BOBBIN IN POS','=A01+UC103-KF01i','','','','','' +'BG1504','SENSOR ZUG IN DOFFER FLYER 8','LT-TRAIN IN DOF','=A01+UC103-KF00i','','','','','' +'MB1511','ABHEBEN ANTRIEBE PM 8','LIFT OFF BS 8','=A01+UC103-KF01Q','','','','','' +'MA1516','ANTRIEBE FLYER 8','M-BI','=A01+UC103-KF01Q','','','','','<' +'KF1515','IF RF 08: START SPULENWECHSEL 2','IF-RELAIS','=A01+UC103-KF01Q','IF RF 08: START SPULENWECHSEL 2','IF RF 08: START EXCHANGE 2','','','' +'DI1514','IF RF 08 : NEUE SPULE','IF-RELAIS','=A01+UC103-KF01i','IF RF 08: NEUE SPULE ','IF RF 08: NEW BOBBIN','','','' +'KF1514','IF RF 08: START SPULENWECHSEL 1','IF-RELAIS','=A01+UC103-KF01Q','IF RF 08: START SPULENWECHSEL 1','IF RF 08: START EXCHANGE 1','','','' +'PF1507','RUNDUMLEUCHTE STÖRUNG FLYER 8','LED-YE_FAULT','=A01+UC103-KF00Q','','','','','' +'SF1513','RESET FLYER 8','IPB-YE-NO','=A01+UC103-KF01i','RESET','RESET','RESET','','' +'PF1513','RESET FLYER 8','IPB-YE-LED','=A01+UC103-KF01Q','','','','','' +'SF1512','NOT HALT FLYER 8','EPB-NC','=A01+UC103-KF01i','NOT-HALT','E-STOP','E-STOP','','' +'BG1446','SENSOR AUSFAHRT NACHPUFFER F0702 RF 7','LT-EXIT F0702','=A01+UH000-KF06i','','','','','' +'BG1445','SENSOR AUSFAHRT NACHPUFFER F0701 RF 7','LT-EXIT F0701','=A01+UH000-KF06i','','','','','' +'MB1441','WEICHE ABZWEIG EINFAHRT F0701 RF 7','SW ENTER F0701 ','=A01+UH000-KF06Q','','','','','' +'MB1443','WEICHE ABZWEIG AUSFAHRT NACHP. FLYER 7','SW EXIT RF7','=A01+UH000-KF06Q','','','','','' +'MB1440','WEICHE ABZWEIG EINFAHRT RF 7','SW ENTER RF 7','=A01+UH000-KF06Q','','','','','' +'MB1442','WEICHE ABZWEIG EINFAHRT F0702 RF 7','SW ENTER F0702','=A01+UH000-KF06Q','','','','','' +'MB1474','ANPRESSEN NACHPUFFER F0701 FLYER 7','PRESS F0701','=A01+UH000-KF09Q','','','','','' +'MB1475','ANPRESSEN NACHPUFFER F0702 FLYER 7','PRESS F0702','=A01+UH000-KF09Q','','','','','' +'QA1471','ANTRIEB NACHPUFFER F0707 FLYER 7','M-BI-LE','=A01+UH000-KF09Q','','','','','<' +'MA1470','ANTRIEB NACHPUFFER F0701 FLYER 7','M-BI-RI','=A01+UH000-KF09Q','','','','','>' +'MB1444','ANPRESSEN PUFFER F0701 FLYER 7','PRESS F0701','=A01+UH000-KF06Q','','','','','' +'MB1445','ANPRESSEN PUFFER F0702 FLYER 7','PRESS F0702','=A01+UH000-KF06Q','','','','','' +'QA1461','ANTRIEB PUFFER F0701 FLYER 7','M-BI-RI','=A01+UH000-KF08Q','','','','','>' +'MA1460','ANTRIEB PUFFER F0701 FLYER 7','M-BI-LE','=A01+UH000-KF08Q','','','','','<' +'BG1441','SENSOR AUSFAHRT PUFFER F0702 FLYER 7','LT-EXIT F0702','=A01+UH000-KF06i','','','','','' +'BG1440','SENSOR AUSFAHRT PUFFER F0701 FLYER 7','LT-EXIT F0701','=A01+UH000-KF06i','','','','','' +'BG1456','SENSOR SPULE IN POSITION FLYER 7','BOBBIN IN POS','=A01+UH000-KF07i','','','','','' +'BG1444','SENSOR ZUG IN DOFFER FLYER 7','LT-TRAIN IN DOF','=A01+UH000-KF06i','','','','','' +'BG1443','SENSOR ZUG IN DOFFER PM 7','LT-TRAIN IN DOF','=A01+UH000-KF06i','','','','','' +'MB1451','ABHEBEN ANTRIEBE PM 7','LIFT OFF BS 7','=A01+UH000-KF07Q','','','','','' +'MA1456','ANTRIEBE FLYER 7','M-BI','=A01+UH000-KF07Q','','','','','>' +'MB1467','WEICHE ABZWEIG EINFAHRT NACHP. RF7','SW-STRAIGHT','=A01+UH000-KF08Q','','','','','' +'MB1466','WEICHE ABZWEIG EINFAHRT NACHP. RF7','SW-BRANCH','=A01+UH000-KF08Q','','','','','' +'KF1455','IF RF 07: START SPULENWECHSEL 2','IF-RELAIS','=A01+UH000-KF07Q','IF RF 07: START SPULENWECHSEL 2','IF RF 07: START EXCHANGE 2','','','' +'DI1454','IF RF 07 : NEUE SPULE','IF-RELAIS','=A01+UH000-KF07i','IF RF 07: NEUE SPULE ','IF RF 07: NEW BOBBIN','','','' +'KF1454','IF RF 07: START SPULENWECHSEL 1','IF-RELAIS','=A01+UH000-KF07Q','IF RF 07: START SPULENWECHSEL 1','IF RF 07: START EXCHANGE 1','','','' +'PF1447','RUNDUMLEUCHTE STÖRUNG FLYER 7','LED-YE_FAULT','=A01+UH000-KF06Q','','','','','' +'SF1453','RESET FLYER 7','IPB-YE-NO','=A01+UH000-KF07i','RESET','RESET','RESET','','' +'PF1453','RESET FLYER 7','IPB-YE-LED','=A01+UH000-KF07Q','','','','','' +'SF1452','NOT HALT FLYER 7','EPB-NC','=A01+UH000-KF07i','NOT-HALT','E-STOP','E-STOP','','' +'SF3026','ZUG WECHSELN RSM 10','LDT-GN-NO','=A01+UC200-KF02i','-UZ3026','-UZ3026','','','' +'PF3054','ZUG WECHSELN RSM 10','LDT-GN-LED ','=A01+UC200-KF05Q','','','','','' +'SF3024','ZUG WECHSELN RSM 9','LDT-GN-NO','=A01+UC200-KF02i','-UZ3024','-UZ3024','','','' +'PF3050','ZUG WECHSELN RSM 9','LDT-GN-LED ','=A01+UC200-KF05Q','','','','','' +'QA3057','ANTRIEB AUSFAHREN RSM 10','RA-BI','=A01+UC200-KF05Q','','','','','<' +'MA3056','ANTRIEB EINFAHREN RSM 10','RA-BI','=A01+UC200-KF05Q','','','','A','>' +'BG3027','SENSOR OPTISCH RSM 10','OPT. AP110','=A01+UC200-KF02i','','','','','' +'MB3055','WEICHE ABZWEIG RSM 10','SW RSM 10','=A01+UC200-KF05Q','','','','','' +'QA3053','ANTRIEB AUSFAHREN RSM 9','RA-BI','=A01+UC200-KF05Q','','','','','<' +'MA3052','ANTRIEB EINFAHREN RSM 9','RA-BI','=A01+UC200-KF05Q','','','','A','>' +'BG3025','SENSOR OPTISCH RSM 9','OPT. AP110','=A01+UC200-KF02i','','','','','' +'MB3051','WEICHE ABZWEIG RSM 9','SW RSM 09','=A01+UC200-KF05Q','','','','','' +'SF3014','HAUPTSCHALTER EIN +UC200','I-MS ON','=A01+UC200-KF01i','HAUPTSCHALTER EIN','MAIN SWITCH ON','','','' +'SF3017','MOTORSCHUTZSCHALTER HAT AUSGELÖST','I-CB OK','=A01+UC200-KF01i','MSS IN ORDNUNG','MPS OK','','','' +'PF3017','LM-ÜBERSTROM +UC200 RSM 1-10','IL-YE-LED','=A01+UC200-KF01Q','LM ÜBERSTROM','IL OVERCURRENT','','','' +'SF3020','ZUG WECHSELN RSM 7','LDT-GN-NO','=A01+UC200-KF02i','-UZ3020','-UZ3020','','','' +'PF3040','ZUG WECHSELN RSM 7','LDT-GN-LED ','=A01+UC200-KF04Q','','','','','' +'QA3043','ANTRIEB AUSFAHREN RSM 7','RA-BI','=A01+UC200-KF04Q','','','','','<' +'MA3042','ANTRIEB EINFAHREN RSM 7','RA-BI','=A01+UC200-KF04Q','','','','A','>' +'BG3021','SENSOR OPTISCH RSM 7','OPT. AP110','=A01+UC200-KF02i','','','','','' +'MB3041','WEICHE ABZWEIG RSM 7','SW RSM 07','=A01+UC200-KF04Q','','','','','' +'SF3022','ZUG WECHSELN RSM 8','LDT-GN-NO','=A01+UC200-KF02i','-UZ3022','-UZ3022','','','' +'PF3044','ZUG WECHSELN RSM 8','LDT-GN-LED ','=A01+UC200-KF04Q','','','','','' +'QA3047','ANTRIEB AUSFAHREN RSM 8','RA-BI','=A01+UC200-KF04Q','','','','','<' +'MA3046','ANTRIEB EINFAHREN RSM 8','RA-BI','=A01+UC200-KF04Q','','','','A','>' +'BG3023','SENSOR OPTISCH RSM 8','OPT. AP110','=A01+UC200-KF02i','','','','','' +'MB3045','WEICHE ABZWEIG RSM 8','SW RSM 08','=A01+UC200-KF04Q','','','','','' +'PF3014','RUNDUMLEUCHTE STÖRUNG RSM 01-10','LED-YE_FAULT','=A01+UC200-KF01Q','','','','','' +'SF3016','RESET/START NACH NOT HALT RSM 1-10','IPB-YE-NO','=A01+UC200-KF01i','RESET','RESET','RESET','','' +'PF3016','RESET/START NACH NOT HALT RSM 1-10','IPB-YE-LED ','=A01+UC200-KF01Q','','','','','' +'SF3015','NOT HALT RSM 1-10','EPB-NC','=A01+UC200-KF01i','NOT-HALT','E-STOP','E-STOP','','' +'SF3012','ZUG WECHSELN RSM 6','LDT-GN-NO','=A01+UC200-KF01i','-UZ3012','-UZ3012','','','' +'PF3030','ZUG WECHSELN RSM 6','LDT-GN-LED ','=A01+UC200-KF03Q','','','','','' +'QA3033','ANTRIEB AUSFAHREN RSM 6','RA-BI','=A01+UC200-KF03Q','','','','','<' +'MA3032','ANTRIEB EINFAHREN RSM 6','RA-BI','=A01+UC200-KF03Q','','','','A','>' +'BG3013','SENSOR OPTISCH RSM 6','OPT. AP110','=A01+UC200-KF01i','','','','','' +'MB3031','WEICHE ABZWEIG RSM 6','SW RSM 06','=A01+UC200-KF03Q','','','','','' +'SF3010','ZUG WECHSELN RSM 5','LDT-GN-NO','=A01+UC200-KF01i','-UZ3010','-UZ3010','','','' +'PF3024','ZUG WECHSELN RSM 5','LDT-GN-LED ','=A01+UC200-KF02Q','','','','','' +'QA3027','ANTRIEB AUSFAHREN RSM 5','RA-BI','=A01+UC200-KF02Q','','','','','<' +'MA3026','ANTRIEB EINFAHREN RSM 5','RA-BI','=A01+UC200-KF02Q','','','','A','>' +'BG3011','SENSOR OPTISCH RSM 5','OPT. AP110','=A01+UC200-KF01i','','','','','' +'MB3025','WEICHE ABZWEIG RSM 5','SW RSM 05','=A01+UC200-KF02Q','','','','','' +'SF3006','ZUG WECHSELN RSM 4','LDT-GN-NO','=A01+UC200-KF00i','-UZ3006','-UZ3006','','','' +'PF3020','ZUG WECHSELN RSM 4','LDT-GN-LED ','=A01+UC200-KF02Q','','','','','' +'SF3004','ZUG WECHSELN RSM 3','LDT-GN-NO','=A01+UC200-KF00i','-UZ3004','-UZ3004','','','' +'PF3010','ZUG WECHSELN RSM 3','LDT-GN-LED ','=A01+UC200-KF01Q','','','','','' +'QA3023','ANTRIEB AUSFAHREN RSM 4','RA-BI','=A01+UC200-KF02Q','','','','','<' +'MA3022','ANTRIEB EINFAHREN RSM 4','RA-BI','=A01+UC200-KF02Q','','','','A','>' +'BG3007','SENSOR OPTISCH RSM 4','OPT. AP110','=A01+UC200-KF00i','','','','','' +'MB3021','WEICHE ABZWEIG RSM 4','SW RSM 04','=A01+UC200-KF02Q','','','','','' +'QA3013','ANTRIEB AUSFAHREN RSM 3','RA-BI','=A01+UC200-KF01Q','','','','','<' +'MA3012','ANTRIEB EINFAHREN RSM 3','RA-BI','=A01+UC200-KF01Q','','','','A','>' +'BG3005','SENSOR OPTISCH RSM 3','OPT. AP110','=A01+UC200-KF00i','','','','','' +'MB3011','WEICHE ABZWEIG RSM 3','SW RSM 03','=A01+UC200-KF01Q','','','','','' +'SF3002','ZUG WECHSELN RSM 2','LDT-GN-NO','=A01+UC200-KF00i','-UZ3002','-UZ3002','','','' +'PF3004','ZUG WECHSELN RSM 2','LDT-GN-LED ','=A01+UC200-KF00Q','','','','','' +'QA3007','ANTRIEB AUSFAHREN RSM 2','RA-BI','=A01+UC200-KF00Q','','','','','<' +'MA3006','ANTRIEB EINFAHREN RSM 2','RA-BI','=A01+UC200-KF00Q','','','','A','>' +'BG3003','SENSOR OPTISCH RSM 2','OPT. AP110','=A01+UC200-KF00i','','','','','' +'MB3005','WEICHE ABZWEIG RSM 2','SW RSM 02','=A01+UC200-KF00Q','','','','','' +'SF3000','ZUG WECHSELN RSM 1','LDT-GN-NO','=A01+UC200-KF00i','-UZ3000','-UZ3000','','','' +'PF3000','ZUG WECHSELN RSM 1 ','LDT-GN-LED ','=A01+UC200-KF00Q','','','','','' +'QA3003','ANTRIEB AUSFAHREN RSM 1','RA-BI','=A01+UC200-KF00Q','','','','','<' +'MA3002','ANTRIEB EINFAHREN RSM 1','RA-BI','=A01+UC200-KF00Q','','','','A','>' +'BG3001','SENSOR OPTISCH RSM 1 ','OPT. AP110','=A01+UC200-KF00i','','','','','' +'MA1464','ANTRIEB HAUPTSTR. AUSFAHRT RF - RSM FB212','M-BI FB212','=A01+UH000-KF08Q','','','','','>' +'MA1462','ANTRIEB HAUPTSTR. EINFAHRT FB211','M-BI FB211','=A01+UH000-KF08Q','','','','','<' +'MB1423','WEICHE ABZWEIG FB213','SW FB213','=A01+UH000-KF04Q','','','','','' +'QA1425','ANTRIEB HAUPTSTECKE RF 6','M-BI-RF6 FB63','=A01+UH000-KF04Q','','','','','>' +'MA1424','ANTRIEB HAUPTSTECKE RF 6','M-BI-RF6 FB63','=A01+UH000-KF04Q','','','','','<' +'BG1405','SENSOR AUSFAHRT NACHPUFFER F0601 FLYER 6','LT-EXIT F0601','=A01+UH000-KF03i','','','','','' +'BG1406','SENSOR AUSFAHRT NACHPUFFER F0602 FLYER 6','LT-EXIT F0602','=A01+UH000-KF03i','','','','','' +'MB1401','WEICHE ABZWEIG EINFAHRT PUFFER F0601 FLYER 6','SW F0601','=A01+UH000-KF02Q','','','','','' +'BG1422','SENSOR HAUPTSTR. FB212','LT-FB212','=A01+UH000-KF05i','','','','','' +'MB1400','WEICHE ABZWEIG EINFAHRT FLYER 6','SW ENTER RF6','=A01+UH000-KF02Q','','','','','' +'MB1403','WEICHE ABZWEIG NACHPUFFER F0601-F0602 ','SW EXIT','=A01+UH000-KF02Q','','','','','' +'MB1434','ANPRESSEN NACHPUFFER F0601 FLYER 6','PRESS F0601','=A01+UH000-KF05Q','','','','','' +'MB1435','ANPRESSEN NACHPUFFER F0602 FLYER 6','PRESS F0602','=A01+UH000-KF05Q','','','','','' +'QA1431','ANTRIEB NACHPUFFER F0602 RF6','M-BI','=A01+UH000-KF05Q','','','','','>' +'MA1430','ANTRIEB NACHPUFFER F0601 RF6','M-BI','=A01+UH000-KF05Q','','','','','>' +'MB1404','ANPRESSEN PUFFER F0601 FLYER 6','PRESS F0601','=A01+UH000-KF02Q','','','','','' +'MB1405','ANPRESSEN PUFFER F0602 FLYER 6','PRESS F0602','=A01+UH000-KF02Q','','','','','' +'QA1421','ANTRIEB PUFFER F0602 FLYER 6','M-BI-RI','=A01+UH000-KF04Q','','','','','<' +'MA1420','ANTRIEB PUFFER F0601 FLYER 6','M-BI-LE','=A01+UH000-KF04Q','','','','','<' +'MB1427','WEICHE ABZWEIG EINFAHRT NACHP. RF 6','SW-BRANCH','=A01+UH000-KF04Q','','','','','' +'MB1426','WEICHE ABZWEIG EINFAHRT NACHP. RF 6','SW-STRAIGHT','=A01+UH000-KF04Q','','','','','' +'BG1401','SENSOR AUSFAHRT PUFFER F0602 FLYER 6','LT-EXIT F0602','=A01+UH000-KF03i','','','','','' +'BG1400','SENSOR AUSFAHRT PUFFER F0601 FLYER 6','LT-EXIT F0601','=A01+UH000-KF03i','','','','','' +'KF1415','IF RF 06: START SPULENWECHSEL 2','IF-RELAIS','=A01+UH000-KF03Q','IF RF 06: START SPULENWECHSEL 2','IF RF 06: START EXCHANGE 2','','','' +'DI1414','IF RF 06 : NEUE SPULE','IF-RELAIS','=A01+UH000-KF04i','IF RF 06: NEUE SPULE ','IF RF 06: NEW BOBBIN','','','' +'KF1414','IF RF 06: START SPULENWECHSEL 1','IF-RELAIS','=A01+UH000-KF03Q','IF RF 06: START SPULENWECHSEL 1','IF RF 06: START EXCHANGE 1','','','' +'PF1407','RUNDUMLEUCHTE STÖRUNG FLYER 6','LED-YE_FAULT','=A01+UH000-KF02Q','','','','','' +'SF1413','RESET FLYER 6','IPB-YE-NO','=A01+UH000-KF04i','RESET','RESET','RESET','','' +'PF1413','RESET FLYER 6','IPB-YE-LED','=A01+UH000-KF03Q','','','','','' +'SF1412','NOT HALT FLYER 6','EPB-NC','=A01+UH000-KF04i','NOT-HALT','E-STOP','E-STOP','','' +'BG1403','SENSOR ZUG IN DOFFER PM 6','LT-TRAIN IN DOF','=A01+UH000-KF03i','','','','','' +'BG1416','SENSOR SPULE IN POSITION FLYER 6','BOBBIN IN POS','=A01+UH000-KF04i','','','','','' +'BG1404','SENSOR ZUG IN DOFFER FLYER 6','LT-TRAIN IN DOF','=A01+UH000-KF03i','','','','','' +'MB1411','ABHEBEN ANTRIEBE PM 6','LIFT OFF RF 6','=A01+UH000-KF03Q','','','','','' +'MA1416','ANTRIEBE FLYER 6','M-BI','=A01+UH000-KF03Q','','','','','<' +'KF1295','IF RF 05: START SPULENWECHSEL 2','IF-RELAIS','=A01+UC102-KF05Q','IF RF 05: START SPULENWECHSEL 2','IF RF 05: START EXCHANGE 2','','','' +'DI1294','IF RF 05 : NEUE SPULE','IF-RELAIS','=A01+UC102-KF03i','IF RF 05: NEUE SPULE ','IF RF 05: NEW BOBBIN','','','' +'KF1294','IF RF 05: START SPULENWECHSEL 1','IF-RELAIS','=A01+UC102-KF05Q','IF RF 05: START SPULENWECHSEL 1','IF RF 05: START EXCHANGE 1','','','' +'PF1287','RUNDUMLEUCHTE STÖRUNG FLYER 5','LED-YE_FAULT','=A01+UC102-KF04Q','','','','','' +'SF1293','RESET FLYER 5','IPB-YE-NO','=A01+UC102-KF03i','RESET','RESET','RESET','','' +'PF1293','RESET FLYER 5','IPB-YE-LED','=A01+UC102-KF05Q','','','','','' +'SF1292','NOT HALT FLYER 5','EPB-NC','=A01+UC102-KF03i','NOT-HALT','E-STOP','E-STOP','','' +'BG1286','SENSOR AUSFAHRT NACHPUFFER F0502 RF 5','LT-EXIT F0502','=A01+UC102-KF02i','','','','','' +'BG1285','SENSOR AUSFAHRT NACHPUFFER F0501 RF 5','LT-EXIT F0501','=A01+UC102-KF02i','','','','','' +'BG1302','SENSOR HAUPTSTR. FB214','LT-FB214','=A01+UC102-KF04i','','','','','' +'BG1301','SENSOR HAUPTSTR. FB214','LT-FB214','=A01+UC102-KF04i','','','','','' +'MB1316','WEICHE ABZWEIG FB214','SW FB214','=A01+UC102-KF07Q','','','','','' +'MA1304','ANTRIEB HAUPTSTR. FB214','M-BI FB214','=A01+UC102-KF06Q','','','','','>' +'MA1302','ANTRIEB HAUPTSTR. FB213','M-BI FB213','=A01+UC102-KF06Q','','','','','<' +'MB1314','ANPRESSEN NACHPUFFER F0501 FLYER 5','PRESS F0501','=A01+UC102-KF07Q','','','','','' +'MB1315','ANPRESSEN NACHPUFFER F0502 FLYER 5','PRESS F0502','=A01+UC102-KF07Q','','','','','' +'QA1311','ANTRIEB NACHPUFFER F0502 FLYER 5','M-BI-RI','=A01+UC102-KF07Q','','','','','<' +'MA1310','ANTRIEB NACHPUFFER F0501 FLYER 5','M-BI-LE','=A01+UC102-KF07Q','','','','','<' +'MB1284','ANPRESSEN PUFFER F0501 FLYER 5','PRESS F0501','=A01+UC102-KF04Q','','','','','' +'MB1285','ANPRESSEN PUFFER F0502 FLYER 5','PRESS F0502','=A01+UC102-KF04Q','','','','','' +'QA1301','ANTRIEB PUFFER F0502 FLYER 5','M-BI-RI','=A01+UC102-KF06Q','','','','','<' +'MA1300','ANTRIEB PUFFER F0501 FLYER 5','M-BI-LE','=A01+UC102-KF06Q','','','','','<' +'BG1257','SENSOR HAUPTSTR. FLYER 4','LT-ENTER RF 4','=A01+UC102-KF01i','','','','','' +'BG1281','SENSOR AUSFAHRT PUFFER F0502 FLYER 5','LT-EXIT F0502','=A01+UC102-KF02i','','','','','' +'BG1280','SENSOR AUSFAHRT PUFFER F0501 FLYER 5','LT-EXIT F0501','=A01+UC102-KF02i','','','','','' +'MB1282','WEICHE ABZWEIG EINFAHRT RF 5','SW ENTER RF 5','=A01+UC102-KF04Q','','','','','' +'MB1281','WEICHE ABZWEIG EINFAHRT PUFFER F0502 FLYER 5','SW RF5 F502','=A01+UC102-KF04Q','','','','','' +'MB1280','WEICHE ABZWEIG EINFAHRT PUFFER RF 5','SW ENTER RF 5','=A01+UC102-KF04Q','','','','','' +'MB1307','WEICHE ABZWEIG EINFAHRT NACHP. RF 5','SW-BRANCH','=A01+UC102-KF06Q','','','','','' +'MB1306','WEICHE ABZWEIG EINFAHRT NACHP. RF 5','SW-STRAIGHT','=A01+UC102-KF06Q','','','','','' +'BG1296','SENSOR SPULE IN POSITION FLYER 5','BOBBIN IN POS','=A01+UC102-KF03i','','','','','' +'BG1284','SENSOR ZUG IN DOFFER FLYER 5','LT-TRAIN IN DOF','=A01+UC102-KF02i','','','','','' +'BG1283','SENSOR ZUG IN DOFFER PM 5','LT-TRAIN IN DOF','=A01+UC102-KF02i','','','','','' +'MB1291','ABHEBEN ANTRIEBE PM 5','LIFT OFF BS 5','=A01+UC102-KF05Q','','','','','' +'MA1296','ANTRIEBE FLYER 5','M-BI','=A01+UC102-KF05Q','','','','','>' +'MB1274','ANPRESSEN NACHPUFFER F0401 FLYER 4','PRESS F0401','=A01+UC102-KF03Q','','','','','' +'MB1275','ANPRESSEN NACHPUFFER F0402 FLYER 4','PRESS F0402','=A01+UC102-KF03Q','','','','','' +'QA1271','ANTRIEB NACHPUFFER F0402 FLYER 4','M-BI','=A01+UC102-KF03Q','','','','','>' +'MA1270','ANTRIEB NACHPUFFER F0401 FLYER 4','M-BI','=A01+UC102-KF03Q','','','','','>' +'MB1244','ANPRESSEN PUFFER F0401 FLYER 4','PRESS F0401','=A01+UC102-KF00Q','','','','','' +'MB1245','ANPRESSEN PUFFER F0402 FLYER 4','PRESS F0402','=A01+UC102-KF00Q','','','','','' +'QA1261','ANTRIEB PUFFER F0402 FLYER 4','M-BI-RI','=A01+UC102-KF02Q','','','','','<' +'MA1260','ANTRIEB PUFFER F0401 FLYER 4','M-BI-LE','=A01+UC102-KF02Q','','','','','<' +'MB1240','WEICHE ABZWEIG EINFAHRT FLYER 4','SW ENTER RF4','=A01+UC102-KF00Q','','','','','' +'MB1241','WEICHE ABZWEIG EINFAHRT FLYER 4 F0401','SW ENTER F0401','=A01+UC102-KF00Q','','','','','' +'MB1242','WEICHE ABZWEIG EINFAHRT RF 4','SW ENTER RF 4','=A01+UC102-KF00Q','','','','','' +'BG1246','SENSOR AUSFAHRT NACHPUFFER F0402 RF 4','LT-EXIT F0402','=A01+UC102-KF00i','','','','','' +'BG1245','SENSOR AUSFAHRT NACHPUFFER F0401 RF 4','LT-EXIT F0401','=A01+UC102-KF00i','','','','','' +'SF1251','HAUPTSCHALTER EIN +UC102','I-MS ON','=A01+UC102-KF01i','HAUPTSCHALTER EIN','MAIN SWITCH ON','','','' +'SF1250','MOTORSCHUTZSCHALTER HAT AUSGELÖST','I-CB OK','=A01+UC102-KF01i','MSS IN ORDNUNG','MPS OK','','','' +'PF1250','LM-ÜBERSTROM +UC102','IL-YE-LED','=A01+UC102-KF01Q','LM ÜBERSTROM','IL OVERCURRENT','','','' +'KF1255','IF RF 04: START SPULENWECHSEL 2','IF-RELAIS','=A01+UC102-KF01Q','IF RF 04: START SPULENWECHSEL 2','IF RF 04: START EXCHANGE 2','','','' +'DI1254','IF RF 04 : NEUE SPULE','IF-RELAIS','=A01+UC102-KF01i','IF RF 04: NEUE SPULE ','IF RF 04: NEW BOBBIN','','','' +'KF1254','IF RF 04: START SPULENWECHSEL 1','IF-RELAIS','=A01+UC102-KF01Q','IF RF 04: START SPULENWECHSEL 1','IF RF 04: START EXCHANGE 1','','','' +'PF1247','RUNDUMLEUCHTE STÖRUNG FLYER 4','LED-YE_FAULT','=A01+UC102-KF00Q','','','','','' +'SF1253','RESET FLYER 4','IPB-YE-NO','=A01+UC102-KF01i','RESET','RESET','RESET','','' +'PF1253','RESET FLYER 4','IPB-YE-LED','=A01+UC102-KF01Q','','','','','' +'SF1252','NOT HALT FLYER 4','EPB-NC','=A01+UC102-KF01i','NOT-HALT','E-STOP','E-STOP','','' +'MB1267','WEICHE ABZWEIG EINFAHRT NACHP. RF 4','SW-BRANCH','=A01+UC102-KF02Q','','','','','' +'MB1266','WEICHE ABZWEIG EINFAHRT NACHP. RF 4','SW-STRAIGHT','=A01+UC102-KF02Q','','','','','' +'BG1241','SENSOR AUSFAHRT PUFFER F0402 FLYER 4','LT-EXIT F0402','=A01+UC102-KF00i','','','','','' +'BG1240','SENSOR AUSFAHRT PUFFER F0401 FLYER 4','LT-EXIT F0401','=A01+UC102-KF00i','','','','','' +'BG1243','SENSOR ZUG IN DOFFER PM 4','LT-TRAIN IN DOF','=A01+UC102-KF00i','','','','','' +'BG1256','SENSOR SPULE IN POSITION FLYER 4','BOBBIN IN POS','=A01+UC102-KF01i','','','','','' +'BG1244','SENSOR ZUG IN DOFFER FLYER 4 ','LT-TRAIN IN DOF','=A01+UC102-KF00i','','','','','' +'MB1251','ABHEBEN ANTRIEBE PM 4','LIFT OFF RF 4','=A01+UC102-KF01Q','','','','','' +'MA1256','ANTRIEBE FLYER 4','M-BI','=A01+UC102-KF01Q','','','','','<' +'BG1141','SENSOR HAUPTSTR. FLYER 3 FB216','LT RF3 FB216','=A01+UC101-KF06i','','','','','' +'MB1147','WEICHE ABZWEIG EINFAHRT NACHP. RF 3','SW-BRANCH','=A01+UC101-KF10Q','','','','','' +'MB1146','WEICHE ABZWEIG EINFAHRT NACHP. RF 3','SW-STRAIGHT','=A01+UC101-KF10Q','','','','','' +'KF1135','IF RF 03: START SPULENWECHSEL 2','IF-RELAIS','=A01+UC101-KF09Q','IF RF 03: START SPULENWECHSEL 2','IF RF 03: START EXCHANGE 2','','','' +'DI1134','IF RF 03 : NEUE SPULE','IF-RELAIS','=A01+UC101-KF05i','IF RF 03: NEUE SPULE ','IF RF 03: NEW BOBBIN','','','' +'KF1134','IF RF 03: START SPULENWECHSEL 1','IF-RELAIS','=A01+UC101-KF09Q','IF RF 03: START SPULENWECHSEL 1','IF RF 03: START EXCHANGE 1','','','' +'PF1127','RUNDUMLEUCHTE STÖRUNG FLYER 3','LED-YE_FAULT','=A01+UC101-KF08Q','','','','','' +'SF1133','RESET FLYER 3','IPB-YE-NO','=A01+UC101-KF05i','RESET','RESET','RESET','','' +'PF1133','RESET FLYER 3','IPB-YE-LED','=A01+UC101-KF09Q','','','','','' +'SF1132','NOT HALT FLYER 3','EPB-NC','=A01+UC101-KF05i','NOT-HALT','E-STOP','E-STOP','','' +'BG1005','SENSOR AUSFAHRT NACHPUFFER F0101 RF 1','LT-EXIT F101 ','=A01+UC101-KF00i','','','','','' +'BG1126','SENSOR AUSFAHRT NACHPUFFER F0302 FLYER 3','LT-EXIT F0302','=A01+UC101-KF04i','','','','','' +'BG1125','SENSOR AUSFAHRT NACHPUFFER F0301 FLYER 3','LT-EXIT F0301','=A01+UC101-KF04i','','','','','' +'MB1122','WEICHE ABZWEIG EINFAHRT RF 3','SW ENTER RF 3','=A01+UC101-KF08Q','','','','','' +'MB1121','WEICHE ABZWEIG EINFAHRT PUFFER F0301 FLYER 3','SW ENTER F0301 ','=A01+UC101-KF08Q','','','','','' +'MB1143','WEICHE ABZWEIG EINFAHRT RF3 FB216 ','SW RF3 FB216','=A01+UC101-KF10Q','','','','','' +'MA1144','ANTRIEB HAUPTSTECKE FB215 ','M-BI FB215','=A01+UC101-KF10Q','','','','','<' +'MA1156','ANTRIEB HAUPTSTECKE FB216','M-BI FB216','=A01+UC101-KF11Q','','','','','>' +'MB1120','WEICHE ABZWEIG EINFAHRT FLYER 3 ','SW ENTER RF 3','=A01+UC101-KF08Q','','','','','' +'MB1154','ANPRESSEN NACHPUFFER F0301 FLYER 3','PRESS F0301','=A01+UC101-KF11Q','','','','','' +'MB1155','ANPRESSEN NACHPUFFER F0302 FLYER 3','PRESS F0302','=A01+UC101-KF11Q','','','','','' +'QA1151','ANTRIEB NACHPUFFER F0302 FLYER 3','M-BI','=A01+UC101-KF11Q','','','','','<' +'MA1150','ANTRIEB NACHPUFFER F0301 FLYER 3','M-BI','=A01+UC101-KF11Q','','','','','<' +'MB1124','ANPRESSEN PUFFER F0301 FLYER 3','PRESS F0301','=A01+UC101-KF08Q','','','','','' +'MB1125','ANPRESSEN PUFFER F0302 FLYER 3','PRESS F0302','=A01+UC101-KF08Q','','','','','' +'QA1141','ANTRIEB PUFFER F0301 FLYER 3','M-BI-RI','=A01+UC101-KF10Q','','','','','>' +'MA1140','ANTRIEB PUFFER F0301 FLYER 3','M-BI-LE','=A01+UC101-KF10Q','','','','','>' +'BG1121','SENSOR AUSFAHRT PUFFER F0302 FLYER 3','LT-EXIT F0302','=A01+UC101-KF04i','','','','','' +'BG1120','SENSOR AUSFAHRT PUFFER F0301 FLYER 3','LT-EXIT F0301','=A01+UC101-KF04i','','','','','' +'MB1131','ABHEBEN ANTRIEBE PM 3','LIFT OFF BS 3','=A01+UC101-KF09Q','','','','','' +'MA1136','ANTRIEBE FLYER 3','M-BI','=A01+UC101-KF09Q','','','','','>' +'BG1136','SENSOR SPULE IN POSITION FLYER 3 ','BOBBIN IN POS','=A01+UC101-KF05i','','','','','' +'BG1124','SENSOR ZUG IN DOFFER FLYER 3','LT-TRAIN IN DOF','=A01+UC101-KF04i','','','','','' +'BG1123','SENSOR ZUG IN DOFFER PM 3','LT-TRAIN IN DOF','=A01+UC101-KF04i','','','','','' +'MB1114','ANPRESSEN NACHPUFFER F0201 FLYER 2','PRESS F0201','=A01+UC101-KF07Q','','','','','' +'MB1115','ANPRESSEN NACHPUFFER F0202 FLYER 2','PRESS F0202','=A01+UC101-KF07Q','','','','','' +'QA1111','ANTRIEB NACHPUFFER F0202 FLYER 2','M-BI-RI','=A01+UC101-KF07Q','','','','','>' +'MA1110','ANTRIEB NACHPUFFER F0201 FLYER 2','M-BI-LE','=A01+UC101-KF07Q','','','','','<' +'MB1084','ANPRESSEN PUFFER F0201 FLYER 2','PRESS F0201','=A01+UC101-KF04Q','','','','','' +'MB1085','ANPRESSEN PUFFER F0202 FLYER 2','PRESS F0202','=A01+UC101-KF04Q','','','','','' +'QA1101','ANTRIEB PUFFER F0202 FLYER 2','M-BI-RI','=A01+UC101-KF06Q','','','','','<' +'MA1100','ANTRIEB PUFFER F0201 FLYER 2','M-BI-LE','=A01+UC101-KF06Q','','','','','<' +'BG1080','SENSOR AUSFAHRT PUFFER F0201 FLYER 2','LT-EXIT F0201','=A01+UC101-KF02i','','','','','' +'BG1081','SENSOR AUSFAHRT PUFFER F0202 FLYER 2','LT-EXIT F0202','=A01+UC101-KF02i','','','','','' +'MB1081','WEICHE ABZWEIG EINFAHRT PUFFER F0201 FLYER 2','SW ENTER F0201','=A01+UC101-KF04Q','','','','','' +'BG1086','SENSOR AUSFAHRT NACHPUFFER F0202 RF 2','LT-EXIT F0202','=A01+UC101-KF02i','','','','','' +'BG1085','SENSOR AUSFAHRT NACHPUFFER F0201 RF 2','LT-EXIT F0201','=A01+UC101-KF02i','','','','','' +'MB1082','WEICHE ABZWEIG EINFAHRT RF 2','SW ENTER RF 2','=A01+UC101-KF04Q','','','','','' +'BG1097','SENSOR HAUPTSTR. FLYER 2 ','LT-ENTER FB ','=A01+UC101-KF03i','','','','','' +'MB1080','WEICHE ABZWEIG EINFAHRT RF 2','SW ENTER RF2','=A01+UC101-KF04Q','','','','','' +'SF1091','HAUPTSCHALTER EIN +UC101','I-MS ON','=A01+UC101-KF03i','HAUPTSCHALTER EIN','MAIN SWITCH ON','','','' +'SF1090','MOTORSCHUTZSCHALTER HAT AUSGELÖST','I-CB OK','=A01+UC101-KF03i','MSS IN ORDNUNG','MPS OK','','','' +'PF1090','LM-ÜBERSTROM +UC101','IL-YE-LED','=A01+UC101-KF05Q','LM ÜBERSTROM','IL OVERCURRENT','','','' +'MB1107','WEICHE ABZWEIG EINFAHRT NACHP. RF 2','SW-BRANCH','=A01+UC101-KF06Q','','','','','' +'MB1106','WEICHE ABZWEIG EINFAHRT NACHP. RF 2','SW-STRAIGHT','=A01+UC101-KF06Q','','','','','' +'KF1095','IF RF 02: START SPULENWECHSEL 2','IF-RELAIS','=A01+UC101-KF05Q','IF RF 02: START SPULENWECHSEL 2','IF RF 02: START EXCHANGE 2','','','' +'DI1094','IF RF 02 : NEUE SPULE','IF-RELAIS','=A01+UC101-KF03i','IF RF 02: NEUE SPULE ','IF RF 02: NEW BOBBIN','','','' +'PF1087','RUNDUMLEUCHTE STÖRUNG FLYER 2','LED-YE_FAULT','=A01+UC101-KF04Q','','','','','' +'KF1094','IF RF 02: START SPULENWECHSEL 1','IF-RELAIS','=A01+UC101-KF05Q','IF RF 02: START SPULENWECHSEL 1','IF RF 02: START EXCHANGE 1','','','' +'SF1093','RESET FLYER 2','IPB-YE-NO','=A01+UC101-KF03i','RESET','RESET','RESET','','' +'PF1093','RESET FLYER 2','IPB-YE-LED','=A01+UC101-KF05Q','','','','','' +'SF1092','NOT HALT FLYER 2','EPB-NC','=A01+UC101-KF03i','NOT-HALT','E-STOP','E-STOP','','' +'BG1096','SENSOR SPULE IN POSITION FLYER 2 ','BOBBIN IN POS','=A01+UC101-KF03i','','','','','' +'BG1084','SENSOR ZUG IN DOFFER FLYER 2 ','LT-TRAIN IN DOF','=A01+UC101-KF02i','','','','','' +'BG1083','SENSOR ZUG IN DOFFER PM 2','LT-TRAIN IN DOF','=A01+UC101-KF02i','','','','','' +'MB1091','ABHEBEN ANTRIEBE PM 2','LIFT OFF RF 2','=A01+UC101-KF05Q','','','','','' +'MA1096','ANTRIEB FLYER 2','M-BI','=A01+UC101-KF05Q','','','','','<' +'QA1025','ANTRIEB HAUPTSTR. RF 1','M RF1','=A01+UC101-KF02Q','','','','','>' +'MA1024','ANTRIEB HAUPTSTR. RF 1','M RF1','=A01+UC101-KF02Q','','','','','>' +'MB1027','WEICHE ABZWEIG EINFAHRT NACHP. RF 1','SW-STRAIGHT','=A01+UC101-KF02Q','','','','','' +'MB1026','WEICHE ABZWEIG EINFAHRT NACHP. RF 1','SW-BRANCH','=A01+UC101-KF02Q','','','','','' +'PF1007','RUNDUMLEUCHTE STÖRUNG FLYER 1','LED-YE_FAULT','=A01+UC101-KF00Q','','','','','' +'SF1013','RESET FLYER 1','IPB-YE-NO','=A01+UC101-KF01i','RESET','RESET','RESET','','' +'PF1013','RESET FLYER 1','IPB-YE-LED','=A01+UC101-KF01Q','','','','','' +'SF1012','NOT HALT FLYER 1','EPB-NC','=A01+UC101-KF01i','NOT-HALT','E-STOP','E-STOP','','' +'KF1015','IF RF 01: START SPULENWECHSEL 2','IF-RELAIS','=A01+UC101-KF01Q','IF RF 01: START SPULENWECHSEL 2','IF RF 01: START EXCHANGE 2','CUANDO 01: LIBERAR CAMBIOS DE BOBINAS 2','','' +'DI1014','IF RF 01 : NEUE SPULE','IF-RELAIS','=A01+UC101-KF01i','IF RF 01: NEUE SPULE ','IF RF 01: NEW BOBBIN','CUANDO 01: LLAMAR NUEVA BOBINA','','' +'KF1014','IF RF 01: START SPULENWECHSEL 1','IF-RELAIS','=A01+UC101-KF01Q','IF RF 01: START SPULENWECHSEL 1','IF RF 01: START EXCHANGE 1','CUANDO 01: LIBERAR CAMBIOS DE BOBINAS 1','','' +'MB1034','ANPRESSEN NACHPUFFER F0101 FLYER 1','PRESS F0101','=A01+UC101-KF03Q','','','','','' +'MB1035','ANPRESSEN NACHPUFFER F0102 FLYER 1','PRESS F0102','=A01+UC101-KF03Q','','','','','' +'QA1031','ANTRIEB NACHPUFFER F0102 FLYER 1','M-BI','=A01+UC101-KF03Q','','','','','<' +'MA1030','ANTRIEB NACHPUFFER F0101 FLYER 1','M-BI','=A01+UC101-KF03Q','','','','','<' +'MB1004','ANPRESSEN PUFFER F0101 FLYER 1 ','PRESS F0101','=A01+UC101-KF00Q','','','','','' +'MB1005','ANPRESSEN PUFFER F0102 FLYER 1 ','PRESS F0102','=A01+UC101-KF00Q','','','','','' +'QA1021','ANTRIEB PUFFER F0102 FLYER 1','M-BI-RI','=A01+UC101-KF02Q','','','','','>' +'MA1020','ANTRIEB PUFFER F0101 FLYER 1','M-BI-LE','=A01+UC101-KF02Q','','','','','>' +'BG1000','SENSOR AUSFAHRT PUFFER F0101 FLYER 1','LT-EXIT F0101','=A01+UC101-KF00i','','','','','' +'BG1001','SENSOR AUSFAHRT PUFFER F0102 FLYER 1','LT-EXIT F0102','=A01+UC101-KF00i','','','','','' +'MB1001','WEICHE ABZWEIG EINFAHRT PUFFER F0101 FLYER 1','SW ENTER F0101','=A01+UC101-KF00Q','','','','','' +'MB1000','WEICHE ABZWEIG EINFAHRT RF 1','SW ENTER RF 1','=A01+UC101-KF00Q','','','','','' +'BG1006','SENSOR AUSFAHRT NACHPUFFER F0102 RF 1','LT-EXIT F102','=A01+UC101-KF00i','','','','','' +'MB1011','ABHEBEN ANTRIEBE PM 1 ','LIFT OFF BS 1','=A01+UC101-KF01Q','','','','','' +'BG1003','SENSOR ZUG IN DOFFER PM 1','LT-TRAIN IN DOF','=A01+UC101-KF00i','','','','','' +'MA1016','ANTRIEB FLYER 1 ','M-BI','=A01+UC101-KF01Q','','','','','>' +'BG1016','SENSOR SPULE IN POSITION RF 1','BOBBIN IN POS','=A01+UC101-KF01i','','','','','' +'BG1004','SENSOR ZUG IN DOFFER FLYER 1','LT-TRAIN IN DOF','=A01+UC101-KF00i','','','','','' +""" + + + textarray = textlines.splitlines() + + exporter = ExcelConverter() + for etype in export_type_arr: + export_path = f"work/excel_{etype}.xlsx" + exporter.export_excel(textarray, etype, export_path) \ No newline at end of file diff --git a/lib/portalexport.py b/lib/portalexport.py index 8071a0f..c31baa2 100644 --- a/lib/portalexport.py +++ b/lib/portalexport.py @@ -1,1808 +1,88 @@ import os -import pandas as pd # Required by ExcelConverter -import unittest -import pandas.testing as pdt -from openpyxl.cell.cell import Cell - - -# Assuming the ExcelConverter class from the previous turn is available and pasted here -class ExcelConverter: - def __init__(self): - self.eingaenge_identifier = ["FDI", "B", "S", "E", "I", "DI", "BA", "BB", "BC", "BD", "BE", "BF", "BG", "BH", "BJ", "BK", "BL", "BM", "BN", "BP", "BQ", "BR", "BS", "BT", "BU", "BV", "BW", "BX", "BY", "BZ", "FA", "FB", "FC", "FD", "FE", "FF", "FG", "FH", "FJ", "FK", "FL", "FM", "FN", "FP", "FQ", "FR", "FS", "FT", "FU", "FV", "FW", "FX", "FY", "FZ", "SA", "SB", "SC", "SD", "SE", "SF", "SG", "SH", "SJ", "SK", "SL", "SM", "SN", "SP", "SQ", "SR", "SS", "ST", "SU", "SV", "SW", "SX", "SY", "SZ"] - self.ausgaenge_identifier = ["K", "O", "Q", "M", "A", "P", "DQ", "CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CJ", "CK", "CL", "CM", "CN", "CP", "CQ", "CR", "CS", "CT", "CU", "CV", "CW", "CX", "CY", "CZ", "EA", "EB", "EC", "ED", "EE", "EF", "EG", "EH", "EJ", "EK", "EL", "EM", "EN", "EP", "EQ", "ER", "ES", "ET", "EU", "EV", "EW", "EX", "EY", "EZ", "GA", "GB", "GC", "GD", "GE", "GF", "GG", "GH", "GJ", "GK", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GV", "GW", "GX", "GY", "GZ", "HA", "HB", "HC", "HD", "HE", "HF", "HG", "HH", "HJ", "HK", "HL", "HM", "HN", "HP", "HQ", "HR", "HS", "HT", "HU", "HV", "HW", "HX", "HY", "HZ", "KA", "KB", "KC", "KD", "KE", "KF", "KG", "KH", "KJ", "KK", "KL", "KM", "KN", "KP", "KQ", "KR", "KS", "KT", "KU", "KV", "KW", "KX", "KY", "KZ", "MA", "MB", "MC", "MD", "ME", "MF", "MG", "MH", "MJ", "MK", "ML", "MM", "MN", "MP", "MQ", "MR", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "PA", "PB", "PC", "PD", "PE", "PF", "PG", "PH", "PJ", "PK", "PL", "PM", "PN", "PP", "PQ", "PR", "PS", "PT", "PU", "PV", "PW", "PX", "PY", "PZ", "QA", "QB", "QC", "QD", "QE", "QF", "QG", "QH", "QJ", "QK", "QL", "QM", "QN", "QP", "QQ", "QR", "QS", "QT", "QU", "QV", "QW", "QX", "QY", "QZ", "RA", "RB", "RC", "RD", "RE", "RF", "RG", "RH", "RJ", "RK", "RL", "RM", "RN", "RP", "RQ", "RR", "RS", "RT", "RU", "RV", "RW", "RX", "RY", "RZ", "TA", "TB", "TC", "TD", "TE", "TF", "TG", "TH", "TJ", "TK", "TL", "TM", "TN", "TP", "TQ", "TR", "TS", "TT", "TU", "TV", "TW", "TX", "TY", "TZ"] - - def _excel_datei_name_erstellen(self, eingestellter_name, pfad_ursprungsdatei, pfad_ziel_datei): - """ - Erstellt den vollständigen Dateinamen für die Excel-Zieldatei. - Entspricht der PowerShell-Funktion ExcelDateiNameErstellen. - """ - name_ursprungsdatei = os.path.basename(pfad_ursprungsdatei) - name_ursprungsdatei_kurz = os.path.splitext(name_ursprungsdatei)[0] - gesamt_pfad_ziel_datei = os.path.join(pfad_ziel_datei, eingestellter_name.replace("[Ursprungsdatei]", name_ursprungsdatei_kurz) + ".xlsx") - return gesamt_pfad_ziel_datei - - def _gleiche_finden_old(self, zu_ueberpruefen): - """ - Findet doppelte Einträge basierend auf dem 'Name'-Feld. - Entspricht der PowerShell-Funktion GleicheFinden. - """ - zu_ueberpruefen_sorted = sorted(zu_ueberpruefen, key=lambda x: x['Name']) - gleiche = [] - for i in range(len(zu_ueberpruefen_sorted) - 1): - if zu_ueberpruefen_sorted[i]['Name'] == zu_ueberpruefen_sorted[i+1]['Name']: - # Füge Eintrag hinzu, wenn er noch nicht hinzugefügt wurde, um Duplikate im 'gleiche' Array zu vermeiden - if not gleiche or gleiche[-1]['Zeile'] != zu_ueberpruefen_sorted[i]['Zeile']: - gleiche.append(zu_ueberpruefen_sorted[i]) - gleiche.append(zu_ueberpruefen_sorted[i+1]) - - return gleiche - - def _gleiche_finden(self, liste): - counter = {} - for eintrag in liste: - name = eintrag['Name'] - counter[name] = counter.get(name, 0) + 1 - doppelte = set(name for name, count in counter.items() if count > 1) - doppelte_eintraege = [eintrag for eintrag in liste if eintrag['Name'] in doppelte] - return doppelte_eintraege, doppelte - - def _anschluesse_ergaenzen_old(self, anschluesse): - """ - Ergänzt fehlende Anschlüsse für Bauteile. - Entspricht der PowerShell-Funktion AnschluesseErgaenzen. - """ - anschluesse_sorted = sorted(anschluesse, key=lambda x: x['Name']) - - # Erstelle eine Kopie der Liste, um Modifikationen während der Iteration zu vermeiden - anschluesse_copy = list(anschluesse_sorted) - - added_entries = [] - - for anschluss in anschluesse_copy: - anschluss_bauteil = anschluss['Name'][:-2] - soll_anschluesse = set(range(8)) # 0 bis 7 - - for sub_anschluss in anschluesse_copy + added_entries: # Berücksichtige bereits hinzugefügte Einträge - sub_anschluss_bauteil = sub_anschluss['Name'][:-2] - if sub_anschluss_bauteil == anschluss_bauteil: - sub_anschluss_letzte_stelle = int(sub_anschluss['Name'][-1]) - if sub_anschluss_letzte_stelle in soll_anschluesse: - soll_anschluesse.remove(sub_anschluss_letzte_stelle) - - for fehlender_anschluss in soll_anschluesse: - new_name = anschluss_bauteil + str(fehlender_anschluss) - new_entry = { - 'Name': new_name, - 'Kommentar': "", - 'Bezug': "" if 'Bezug' in anschluss else "", # Füge 'Bezug' hinzu, falls es in der ursprünglichen Struktur vorhanden war - 'Zeile': -1 # Von Loernz hinzugefügt da sonst code crasht, wenn später in _gleiche_finden über 'Zeile' iteriert wird - } - added_entries.append(new_entry) - - anschluesse.extend(added_entries) - return sorted(anschluesse, key=lambda x: x['Name']) - - def _anschluesse_ergaenzen(self, anschluesse): - """ - Ergänzt fehlende Anschlüsse für Bauteile. - Entspricht der PowerShell-Funktion AnschluesseErgaenzen. - """ - anschluesse_sorted = sorted(anschluesse, key=lambda x: x['Name']) - bauteil_dict = {} - - # Gruppiere vorhandene Anschlüsse nach Bauteil, speichere nummer + eintrag - for eintrag in anschluesse_sorted: - name = eintrag['Name'] - if '.' in name: - bauteil = name.rsplit('.', 1)[0] + '.' - nummer = int(name.split('.')[-1]) - else: - bauteil = name[:-1] - nummer = int(name[-1]) - - if bauteil not in bauteil_dict: - bauteil_dict[bauteil] = [] - bauteil_dict[bauteil].append((nummer, eintrag)) - - added_entries = [] - - for bauteil, eintraege in bauteil_dict.items(): - vorhandene_nummern = set(n for n, _ in eintraege) - fehlende = set(range(8)) - vorhandene_nummern - - for i in fehlende: - new_name = f"{bauteil}{i}" - new_entry = { - 'Name': new_name, - 'Kommentar': "", - 'Bezug': "", - 'Zeile': -1 - } - eintraege.append((i, new_entry)) - added_entries.append(new_entry) - - # Bezug finden (erstes mit Bezug) - bezug_quelle = next((eintrag['Bezug'] for _, eintrag in sorted(eintraege, key=lambda x: x[0]) if eintrag.get('Bezug')), None) - - if bezug_quelle: - for _, eintrag in eintraege: - if not eintrag.get('Bezug'): - eintrag['Bezug'] = bezug_quelle - - anschluesse.extend(added_entries) - return sorted(anschluesse, key=lambda x: x['Name']) - - def _verarbeite_io_liste(self, liste): - """ - Filtert doppelte Namen aus der Liste und markiert sie mit Hinweis; gibt separate Liste mit eindeutigen Duplikaten zurück. - """ - gleiche, doppelte_namen = self._gleiche_finden(liste) - - # Nur ein Eintrag pro doppeltem Namen in gleiche_liste - gesehen = set() - reduzierte_gleiche = [] - for eintrag in gleiche: - name = eintrag['Name'] - if name not in gesehen: - reduzierte_gleiche.append(eintrag) - gesehen.add(name) - - gefiltert = self._duplikate_markieren_und_filtern(liste, doppelte_namen) - return reduzierte_gleiche, gefiltert - - def _duplikate_markieren_und_filtern(self, liste, doppelte_namen): - """ - Behalte nur das erste Vorkommen jedes doppelten Namens in der Liste. - Markiere dieses Vorkommen mit 'Hinweis': 'Doppelt'. - """ - neue_liste = [] - gesehen = set() - - for eintrag in liste: - name = eintrag['Name'] - if name in doppelte_namen: - if name not in gesehen: - eintrag['Hinweis'] = "Duplikat!" - neue_liste.append(eintrag) - gesehen.add(name) - # sonst: ignorieren - else: - neue_liste.append(eintrag) - - return neue_liste - - def _prep_simpel(self, ursprungdatei, prefix_eingang="E", prefix_ausgang="A"): - """ - Konvertiert Daten aus der Ursprungsdatei - Eingänge und Ausgänge in seperaten dataframes; Fehler nicht enthalten - """ - eingaenge = [] - ausgaenge = [] - fehler = [] - - for i, eintrag in enumerate(ursprungdatei): - eintragszeile = eintrag.strip().split("'") - bmk_zahl_raw = eintragszeile[1].strip() - kommentar = eintragszeile[3].strip() - - bmk_alpha = ''.join(filter(str.isalpha, bmk_zahl_raw)) - bmk_numeric = ''.join(filter(str.isdigit, bmk_zahl_raw)) - - bmk_formatted = bmk_numeric - if len(bmk_numeric) > 0: - bmk_formatted = bmk_numeric[:-1] + "." + bmk_numeric[-1] if len(bmk_numeric) > 1 else "0." + bmk_numeric - - if bmk_alpha in self.eingaenge_identifier: - name = prefix_eingang + bmk_formatted - eingaenge.append({'Name': name, 'Kommentar': kommentar, 'Zeile': i}) - elif bmk_alpha in self.ausgaenge_identifier: - name = prefix_ausgang + bmk_formatted - ausgaenge.append({'Name': name, 'Kommentar': kommentar, 'Zeile': i}) - else: - name = bmk_formatted - fehler.append({'Name': name, 'Kommentar': f"Fehlerhafte BMK '{bmk_zahl_raw}'", 'Zeile': i}) - - # Fehler-Dataframe erzeugen - df_fehler = pd.DataFrame(fehler).sort_values(by="Name") if fehler else pd.DataFrame() - - # Eingänge & Ausgänge verarbeiten (Duplikate markieren und filtern) - gleiche_eingaenge, eingaenge = self._verarbeite_io_liste(eingaenge) - gleiche_ausgaenge, ausgaenge = self._verarbeite_io_liste(ausgaenge) - - # DataFrames erzeugen u. sortieren - df_eingaenge = pd.DataFrame(eingaenge).sort_values(by="Name") - df_ausgaenge = pd.DataFrame(ausgaenge).sort_values(by="Name") - - df_gleiche_eingaenge = pd.DataFrame(gleiche_eingaenge).sort_values(by="Name") if gleiche_eingaenge else pd.DataFrame() - df_gleiche_ausgaenge = pd.DataFrame(gleiche_ausgaenge).sort_values(by="Name") if gleiche_ausgaenge else pd.DataFrame() - - return df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_eingaenge, df_ausgaenge - - def _prep_tia(self, ursprungdatei, prefix_eingang="E", prefix_ausgang="A"): - """ - Konvertiert Daten für TIA Portal und schreibt sie in eine Excel-Datei mit zwei Blättern ("Constants" und "PLC Tags"). - Eingänge und Ausgänge gemeinsam jeweils in consts und tags (Prefix cIn, cOut); doppelte Namen markiert und ausgeschlossen; Fehler mit Prefix 'Err'. - """ - eingaenge = [] - ausgaenge = [] - fehler = [] - - for i, eintrag in enumerate(ursprungdatei): - eintragszeile = eintrag.strip().split("'") - bmk_zahl_raw = eintragszeile[1].strip() - kommentar = eintragszeile[3].strip() - - bmk_alpha = ''.join(filter(str.isalpha, bmk_zahl_raw)) - bmk_numeric = ''.join(filter(str.isdigit, bmk_zahl_raw)) - - bmk_formatted = bmk_numeric - if len(bmk_numeric) > 0: - bmk_formatted = bmk_numeric[:-1] + "." + bmk_numeric[-1] if len(bmk_numeric) > 1 else "0." + bmk_numeric - - if bmk_alpha in self.eingaenge_identifier: - name = prefix_eingang + bmk_formatted - name_constant = "cIn" + bmk_zahl_raw - eingaenge.append({ - 'Name': name, - 'NameOriginal': bmk_zahl_raw, - 'NameConstant': name_constant, - 'Kommentar': kommentar, - 'Zahl': int(bmk_numeric) if bmk_numeric else 0, # Convert to int - 'Zeile': i - }) - elif bmk_alpha in self.ausgaenge_identifier: - name = prefix_ausgang + bmk_formatted - name_constant = "cOut" + bmk_zahl_raw - ausgaenge.append({ - 'Name': name, - 'NameOriginal': bmk_zahl_raw, - 'NameConstant': name_constant, - 'Kommentar': kommentar, - 'Zahl': int(bmk_numeric) if bmk_numeric else 0, # Convert to int - 'Zeile': i - }) - else: # Hier wird Fehlerhafte BMK behandelt - name = bmk_formatted - name_constant = "cErr" + bmk_zahl_raw - fehler.append({ - 'Name': name, - 'NameOriginal': bmk_zahl_raw, - 'NameConstant': name_constant, - 'Kommentar': f"Fehlerhafte BMK '{bmk_zahl_raw}'", # Zeile von Lorenz eingefügt, da sonst pandas mit Fehler, da kein Kommentar - 'Zahl': i, # Original PowerShell uses 'i' for Zahl in Fehler, not bmk_numeric - 'Zeile': i - }) - - # Fehler-Dataframe erzeugen - df_fehler = pd.DataFrame(fehler).sort_values(by="Zahl") if fehler else pd.DataFrame() - - # Duplikate verarbeiten & markieren - gleiche_eingaenge, eingaenge = self._verarbeite_io_liste(eingaenge) - gleiche_ausgaenge, ausgaenge = self._verarbeite_io_liste(ausgaenge) - - # DataFrames erstellen u. sortieren - df_eingaenge = pd.DataFrame(eingaenge).sort_values(by="Zahl") - df_ausgaenge = pd.DataFrame(ausgaenge).sort_values(by="Zahl") - - df_gleiche_eingaenge = pd.DataFrame(gleiche_eingaenge).sort_values(by="Zahl") if gleiche_eingaenge else pd.DataFrame() - df_gleiche_ausgaenge = pd.DataFrame(gleiche_ausgaenge).sort_values(by="Zahl") if gleiche_ausgaenge else pd.DataFrame() - - df_consts, df_tags = self._create_tia_dataframes(df_fehler, df_eingaenge, df_ausgaenge) - - return df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_consts, df_tags - - def _create_tia_dataframes(self, df_fehler, df_eingaenge, df_ausgaenge): - """ - Hilfsfunktion für 'prep_tia', die dataframes für spätere excel Ausgabe erzeugt ("Constants" und "PLC Tags"). - Eingänge und Ausgänge gemeinsam jeweils in consts und tags; Fehler ebenfalls mit Prefix 'Err' enthalten. - """ - df_constants_data = [] - j = 0 - for row in df_fehler.itertuples(): - df_constants_data.append({ - "Name": row.NameConstant, - "Path": "Import", - "Data Type": "Int", - "Value": j, - "Comment": "" - }) - j += 1 - for row in df_eingaenge.itertuples(): - df_constants_data.append({ - "Name": row.NameConstant, - "Path": "Import", - "Data Type": "Int", - "Value": j, - "Comment": "" - }) - j += 1 - for row in df_ausgaenge.itertuples(): - df_constants_data.append({ - "Name": row.NameConstant, - "Path": "Import", - "Data Type": "Int", - "Value": j, - "Comment": "" - }) - j += 1 - df_constants = pd.DataFrame(df_constants_data) - - # Blatt "PLC Tags" - df_plc_tags_data = [] - for row in df_fehler.itertuples(): - df_plc_tags_data.append({ - "Name": row.NameOriginal, - "Path": "Import", - "Data Type": "Bool", - "Logical Address": f"%{row.Name}", - "Comment": row.Kommentar, - "Hmi Visible": "True", - "Hmi Accessible": "True", - "Hmi Writeable": "True", - "Typeobject ID": "", - "Version ID": "" - }) - for row in df_eingaenge.itertuples() : - df_plc_tags_data.append({ - "Name": row.NameOriginal, - "Path": "Import", - "Data Type": "Bool", - "Logical Address":f"%{row.Name}", - "Comment": row.Kommentar, - "Hmi Visible": "True", - "Hmi Accessible": "True", - "Hmi Writeable": "True", - "Typeobject ID": "", - "Version ID": "" - }) - for row in df_ausgaenge.itertuples(): - df_plc_tags_data.append({ - "Name": row.NameOriginal, - "Path": "Import", - "Data Type": "Bool", - "Logical Address": f"%{row.Name}", - "Comment": row.Kommentar, - "Hmi Visible": "True", - "Hmi Accessible": "True", - "Hmi Writeable": "True", - "Typeobject ID": "", - "Version ID": "" - }) - df_plc_tags = pd.DataFrame(df_plc_tags_data) - - return (df_constants, df_plc_tags) - - def _prep_wscad(self, ursprungdatei, prefix_eingang="E", prefix_ausgang="A"): - """ - Konvertiert Daten für WSCAD mit Bezugsinformationen und schreibt sie in eine Excel-Datei. - Entspricht der PowerShell-Funktion ExcelDateiBeschreibenWSCAD_Bezug. - """ - eingaenge = [] - ausgaenge = [] - fehler = [] - - for i, eintrag in enumerate(ursprungdatei): - eintragszeile = eintrag.strip().split("'") - bmk_zahl_raw = eintragszeile[1].strip() - kommentar = eintragszeile[3].strip() - bezug = eintragszeile[7].strip() - - bmk_alpha = ''.join(filter(str.isalpha, bmk_zahl_raw)) - bmk_numeric = ''.join(filter(str.isdigit, bmk_zahl_raw)) - - bmk_formatted = bmk_numeric - if len(bmk_numeric) > 0: - bmk_formatted = bmk_numeric[:-1] + "." + bmk_numeric[-1] if len(bmk_numeric) > 1 else "0." + bmk_numeric - - # Remove leading zeros - if len(bmk_formatted) >= 4 and bmk_formatted.startswith("0") and bmk_alpha in self.eingaenge_identifier: - bmk_formatted = bmk_formatted[1:] - if len(bmk_formatted) >= 4 and bmk_formatted.startswith("0"): - bmk_formatted = bmk_formatted[1:] - elif len(bmk_formatted) >= 3 and bmk_formatted.startswith("0") and bmk_alpha in self.ausgaenge_identifier: - bmk_formatted = bmk_formatted[1:] - if len(bmk_formatted) >= 3 and bmk_formatted.startswith("0"): - bmk_formatted = bmk_formatted[1:] - - if bmk_alpha in self.eingaenge_identifier: - name = prefix_eingang + bmk_formatted - eingaenge.append({'Name': name, 'Kommentar': kommentar, 'Zeile': i, 'Bezug': bezug}) - elif bmk_alpha in self.ausgaenge_identifier: - name = prefix_ausgang + bmk_formatted - ausgaenge.append({'Name': name, 'Kommentar': kommentar, 'Zeile': i, 'Bezug': bezug}) - else: - name = bmk_formatted - fehler.append({'Name': name, 'Kommentar': f"Fehlerhafte BMK '{bmk_zahl_raw}'", 'Zeile': i, 'Bezug': bezug}) - - eingaenge = self._anschluesse_ergaenzen(eingaenge) - ausgaenge = self._anschluesse_ergaenzen(ausgaenge) - - # Fehler-Dataframe erzeugen - df_fehler = pd.DataFrame(fehler).sort_values(by="Name") if fehler else pd.DataFrame() - - # Duplikate verarbeiten & markieren - gleiche_eingaenge, eingaenge = self._verarbeite_io_liste(eingaenge) - gleiche_ausgaenge, ausgaenge = self._verarbeite_io_liste(ausgaenge) - - # DataFrames erzeugen u. sortieren - df_eingaenge = pd.DataFrame(eingaenge).sort_values(by="Name") - df_ausgaenge = pd.DataFrame(ausgaenge).sort_values(by="Name") - - df_gleiche_eingaenge = pd.DataFrame(gleiche_eingaenge).sort_values(by="Name") if gleiche_eingaenge else pd.DataFrame() - df_gleiche_ausgaenge = pd.DataFrame(gleiche_ausgaenge).sort_values(by="Name") if gleiche_ausgaenge else pd.DataFrame() - - return df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_eingaenge, df_ausgaenge - - def _prep_data(self, data, export_type): - """ - Aufbereiter der Daten je nach gewünschtem Export-Typ - """ - if export_type == "Simpel": - return self._prep_simpel(data) - elif export_type == "TIA": - return self._prep_tia(data) - elif export_type in ["WSCAD", "WSCAD mit Bezug"]: - return self._prep_wscad(data) - else: - raise ValueError("Unbekannter Export-Typ") - - def export_excel(self, data, export_type, export_path): - """ - Wrapper, der aufgerufen wird und in sich die Aufbereitung der Daten und das Abspeichern als Excel abruft. - """ - # Daten vorbereiten - dataframes = self._prep_data(data, export_type) - - # Excel Datei schreiben und speichern - self._write_excel(dataframes, export_type, export_path) - - def _write_excel(self, dataframes, export_type, export_path): - """ - Erzeugung der Excel-Datei im gewünschten Muster - """ - if export_type == "Simpel": - # Format für Simpel-Ausgabe - df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_eingaenge, df_ausgaenge = dataframes - - with pd.ExcelWriter(export_path, engine='openpyxl') as writer: - # Sheet 1: Ein / Ausgänge - start_row = 0 - df_eingaenge.to_excel(writer, sheet_name='Ein-, Ausgaenge', index=False, startrow=start_row) - start_row += len(df_eingaenge) + 2 # Leerzeile dazwischen - - # Ausgaenge direkt drunter schreiben (ohne Header) - df_ausgaenge.to_excel(writer, sheet_name='Ein-, Ausgaenge', index=False, startrow=start_row, header=False) - - # Duplikate und Errors - self._write_duplicates_errors(writer, df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler) - - elif export_type == "TIA": - df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_consts, df_tags = dataframes - - with pd.ExcelWriter(export_path, engine='openpyxl') as writer: - # 1. PLC Tags Sheet mit Header. Spalten: Name, Path, Data Type, Logical Address, Comment, Hmi Visible, Hmi Accessible, Hmi Writeable, Typeobject ID, Version ID - df_tags.to_excel(writer, sheet_name='PLC Tags', index=False) - - # 2. Constants Sheet mit Header. Spalten: Name, Path, Data Type, Value, Comment - df_consts.to_excel(writer, sheet_name='Constants', index=False) - - # Duplikate und Errors - self._write_duplicates_errors(writer, df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler) - - elif export_type in ["WSCAD", "WSCAD mit Bezug"]: - - df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_eingaenge, df_ausgaenge = dataframes - include_bezug = export_type == "WSCAD mit Bezug" - - # Basis-Template - df_result = pd.DataFrame( - columns=[ - "Anschluss", - "Kommentar", - "Symboltext", - "Bezug", - "Sondertext 1", - "Sondertext 2", - "Sondertext 3", - "Sondertext 4", - "Sondertext 5", - "Sondertext 6", - "Sondertext 7", - "Sondertext 8", - ] - ) - - # Fehler ganz oben in Sheet schreiben (falls sie existieren) - if not df_fehler.empty: - df_result = self._append_df(df_result, df_fehler, include_bezug) - # Ein u. Ausgänge schreiben - df_result = self._append_df(df_result, df_eingaenge, include_bezug) - df_result = self._append_df(df_result, df_ausgaenge, include_bezug) - - with pd.ExcelWriter(export_path, engine="openpyxl") as writer: - df_result.to_excel(writer, index=False, sheet_name="WSCAD") - # Bezug-Spalte als Text formatieren (Spalte 4 = "Bezug") - worksheet = writer.book["WSCAD"] - for row in worksheet.iter_rows(min_row=2, min_col=4, max_col=4): - for cell in row: - if cell.value and str(cell.value).startswith("="): - # Erzwinge Textformat - cell.number_format = "@" - cell.value = str(cell.value) # wichtig: string setzen - cell.data_type = 's' # explizit als String, verhindert Formelinterpretation - # Duplikate und Errors - self._write_duplicates_errors(writer, df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler) - - def _append_df(self, target_df, source_df, include_bezug=False): - """ - Hilfsfunktion, die Dataframes für WSCAD Export aneinander reiht und entweder Bezug inkludiert oder nicht - """ - - data = { - "Anschluss": source_df["Name"], - "Kommentar": source_df["Kommentar"], - "Symboltext": "", - "Bezug": source_df["Bezug"] if include_bezug else "", - "Sondertext 1": "", - "Sondertext 2": "", - "Sondertext 3": "", - "Sondertext 4": "", - "Sondertext 5": "", - "Sondertext 6": "", - "Sondertext 7": "", - "Sondertext 8": "", - } - tmp = pd.DataFrame(data) - return pd.concat([target_df, tmp], ignore_index=True) - - def _write_duplicates_errors(self, writer, df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler): - """ - Schreibt optional die Sheets 'Duplikate' und 'Fehler', falls Inhalte vorhanden sind. - """ - # Bezug-Spalte für Excel Darstellung vorbereiten - for df in [df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler]: - if "Bezug" in df.columns: - df["Bezug"] = df["Bezug"].apply(lambda x: f"'{x}" if pd.notnull(x) else x) - - - # Duplikate-Sheet - if not df_gleiche_eingaenge.empty or not df_gleiche_ausgaenge.empty: - start_row = 0 - if not df_gleiche_eingaenge.empty: - df_gleiche_eingaenge.to_excel(writer, sheet_name='Duplikate', index=False, startrow=start_row) - start_row += len(df_gleiche_eingaenge) + 2 # Abstand - if not df_gleiche_ausgaenge.empty: - df_gleiche_ausgaenge.to_excel(writer, sheet_name='Duplikate', index=False, startrow=start_row, header=False) - - # Fehler-Sheet - if not df_fehler.empty: - df_fehler.to_excel(writer, sheet_name='Fehler', index=False) - - -class IOConverterApp: - def __init__(self, master): - self.master = master - master.title("Dateikonvertierer I/O") - master.geometry("940x660") - master.resizable(False, False) - - self.notebook = ttk.Notebook(master) - self.notebook.pack(padx=10, pady=10, expand=True, fill="both") - - self.excel_converter = ExcelConverter() - self.selected_txt_file = "" - self.selected_target_directory = "" - self.target_file_configurations = [] # Stores configurations from settings tab - - # Tab: TXT-Datei Auswaehlen - self.tab_txt_select = ttk.Frame(self.notebook) - self.notebook.add(self.tab_txt_select, text="txt-Datei Auswaehlen") - - self.txt_path_field = ttk.Entry(self.tab_txt_select) - self.txt_path_field.place(x=10, y=10, width=860, height=20) - self.txt_path_field.bind("", self.txt_path_field_return) - - self.txt_list_box = tk.Listbox(self.tab_txt_select, font=("Arial", 12)) - self.txt_list_box.place(x=10, y=40, width=860, height=450) - self.txt_list_box.bind("", self.txt_list_box_double_click) - self.txt_list_box.bind("", self.txt_list_box_back_key) - - self.txt_back_button = ttk.Button(self.tab_txt_select, text="Zurueck", command=self.txt_back_button_click) - self.txt_back_button.place(x=10, y=500, width=100, height=30) - - self.txt_select_button = ttk.Button(self.tab_txt_select, text="Auswaehlen", command=self.txt_select_button_click) - self.txt_select_button.place(x=750, y=500, width=100, height=30) - - # Tab: Zielverzeichnis Auswaehlen - self.tab_target_dir_select = ttk.Frame(self.notebook) - self.notebook.add(self.tab_target_dir_select, text="Zielverzeichnis Auswaehlen") - - self.target_dir_path_field = ttk.Entry(self.tab_target_dir_select) - self.target_dir_path_field.place(x=10, y=10, width=860, height=20) - self.target_dir_path_field.bind("", self.target_dir_path_field_return) - - self.target_dir_list_box = tk.Listbox(self.tab_target_dir_select, font=("Arial", 12)) - self.target_dir_list_box.place(x=10, y=40, width=860, height=450) - self.target_dir_list_box.bind("", self.target_dir_list_box_double_click) - self.target_dir_list_box.bind("", self.target_dir_list_box_back_key) - - self.target_dir_back_button = ttk.Button(self.tab_target_dir_select, text="Zurueck", command=self.target_dir_back_button_click) - self.target_dir_back_button.place(x=10, y=500, width=100, height=30) - - self.target_dir_select_button = ttk.Button(self.tab_target_dir_select, text="Auswaehlen", command=self.target_dir_select_button_click) - self.target_dir_select_button.place(x=630, y=500, width=100, height=30) - - self.target_dir_confirm_button = ttk.Button(self.tab_target_dir_select, text="Bestaetigen", command=self.target_dir_confirm_button_click) - self.target_dir_confirm_button.place(x=750, y=500, width=100, height=30) - - # Tab: Bearbeitungsfortschritt - self.tab_progress = ttk.Frame(self.notebook) - self.notebook.add(self.tab_progress, text="Bearbeitungsfortschritt") - - ttk.Label(self.tab_progress, text="Aktuelle Aufgabe").place(x=10, y=10, width=130, height=20) - self.current_task_label = ttk.Label(self.tab_progress, text="txt-Datei auswaehlen", font=("Arial", 13)) - self.current_task_label.place(x=150, y=10, width=710, height=60) - - ttk.Label(self.tab_progress, text="Erledigte Aufgaben").place(x=10, y=55, width=430, height=20) - self.completed_tasks_listbox = tk.Listbox(self.tab_progress, font=("Arial", 12)) - self.completed_tasks_listbox.place(x=10, y=85, width=860, height=200) - - ttk.Label(self.tab_progress, text="Fortschritt Excel-Dateien beschreiben").place(x=10, y=300, width=430, height=20) - self.progress_bar = ttk.Progressbar(self.tab_progress, orient="horizontal", mode="determinate") - self.progress_bar.place(x=10, y=320, width=860, height=30) - - ttk.Label(self.tab_progress, text="Bearbeitete Eintraege:").place(x=10, y=370, width=140, height=20) - self.processed_entries_label = ttk.Label(self.tab_progress, text="0") - self.processed_entries_label.place(x=170, y=370, width=430, height=20) - - ttk.Label(self.tab_progress, text="Gesamteintraege:").place(x=10, y=400, width=100, height=20) - self.total_entries_label = ttk.Label(self.tab_progress, text="0") - self.total_entries_label.place(x=170, y=400, width=430, height=20) - - # Tab: Doppelte Ein- und Ausgaenge - self.tab_duplicates = ttk.Frame(self.notebook) - self.notebook.add(self.tab_duplicates, text="Doppelte Ein- und Ausgaenge") - - ttk.Label(self.tab_duplicates, text="Bei den Eingaengen gibt es folgende Duplikate: ").place(x=10, y=10, width=275, height=40) - self.duplicate_inputs_treeview = ttk.Treeview(self.tab_duplicates, columns=("Zeile", "Kennzeichnung"), show="headings") - self.duplicate_inputs_treeview.heading("Zeile", text="Zeile") - self.duplicate_inputs_treeview.heading("Kennzeichnung", text="Kennzeichnung") - self.duplicate_inputs_treeview.column("Zeile", width=130, anchor="w") - self.duplicate_inputs_treeview.column("Kennzeichnung", width=130, anchor="w") - self.duplicate_inputs_treeview.place(x=10, y=60, width=275, height=430) - - ttk.Label(self.tab_duplicates, text="Bei den Ausgaengen gibt es folgende Duplikate: ").place(x=295, y=10, width=275, height=40) - self.duplicate_outputs_treeview = ttk.Treeview(self.tab_duplicates, columns=("Zeile", "Kennzeichnung"), show="headings") - self.duplicate_outputs_treeview.heading("Zeile", text="Zeile") - self.duplicate_outputs_treeview.heading("Kennzeichnung", text="Kennzeichnung") - self.duplicate_outputs_treeview.column("Zeile", width=130, anchor="w") - self.duplicate_outputs_treeview.column("Kennzeichnung", width=130, anchor="w") - self.duplicate_outputs_treeview.place(x=295, y=60, width=275, height=430) - - ttk.Label(self.tab_duplicates, text="Folgende Eintraege konnten keinem Betriebsmittel zugewiesen werden:").place(x=580, y=10, width=275, height=40) - self.unassigned_errors_treeview = ttk.Treeview(self.tab_duplicates, columns=("Zeile", "Kennzeichnung"), show="headings") - self.unassigned_errors_treeview.heading("Zeile", text="Zeile") - self.unassigned_errors_treeview.heading("Kennzeichnung", text="Kennzeichnung") - self.unassigned_errors_treeview.column("Zeile", width=130, anchor="w") - self.unassigned_errors_treeview.column("Kennzeichnung", width=130, anchor="w") - self.unassigned_errors_treeview.place(x=580, y=60, width=275, height=430) - - self.exit_button = ttk.Button(self.tab_duplicates, text="Programm beenden", command=master.quit) - self.exit_button.place(x=10, y=500, width=860, height=30) - - # Tab: Einstellungen - self.tab_settings = ttk.Frame(self.notebook) - self.notebook.add(self.tab_settings, text="Einstellungen") - - ttk.Label(self.tab_settings, text="Startverzeichnis Auswahl .txt-Datei:").place(x=10, y=10, width=200, height=20) - self.txt_start_path_label = ttk.Label(self.tab_settings, text="") - self.txt_start_path_label.place(x=210, y=10, width=510, height=20) - ttk.Button(self.tab_settings, text="Aendern", command=self.change_txt_start_path).place(x=730, y=10, width=150, height=30) - - ttk.Label(self.tab_settings, text="Startverzeichnis bei Auswahl des Zielverzeichnisses der Datei(en):").place(x=10, y=45, width=450, height=20) - self.target_path_option_var = tk.StringVar(value="WieTXT") - self.radio_button_frame = ttk.LabelFrame(self.tab_settings, text="") - self.radio_button_frame.place(x=10, y=60, width=449, height=30) - ttk.Radiobutton(self.radio_button_frame, text="Gleich Startpfad .txt-Datei", variable=self.target_path_option_var, value="WieTXT").place(x=10, y=10) - ttk.Radiobutton(self.radio_button_frame, text="Gleich gewaehlter .txt-Datei", variable=self.target_path_option_var, value="WieZielDatei").place(x=173, y=10) - ttk.Radiobutton(self.radio_button_frame, text="Anderer Pfad", variable=self.target_path_option_var, value="EigenerPfad").place(x=352, y=10) - ttk.Button(self.tab_settings, text="Speichern", command=self.save_radio_button_settings).place(x=730, y=60, width=150, height=30) - - ttk.Label(self.tab_settings, text="Startverzeichnis Auswahl Zielverzeichnis:").place(x=10, y=95, width=250, height=20) - self.target_dir_start_path_label = ttk.Label(self.tab_settings, text="") - self.target_dir_start_path_label.place(x=260, y=95, width=460, height=20) - ttk.Button(self.tab_settings, text="Aendern", command=self.change_target_dir_start_path).place(x=730, y=95, width=150, height=30) - - ttk.Label(self.tab_settings, text="Zieldateien:").place(x=10, y=140, width=200, height=20) - ttk.Button(self.tab_settings, text="Aenderungen Speichern", command=self.save_target_file_settings).place(x=730, y=170, width=150, height=30) - - self.target_files_treeview = ttk.Treeview(self.tab_settings, columns=("Prefix Eingang", "Prefix Ausgang", "Dateiname", "Konvertierungsart"), show="headings") - self.target_files_treeview.heading("Prefix Eingang", text="Prefix Eingang") - self.target_files_treeview.heading("Prefix Ausgang", text="Prefix Ausgang") - self.target_files_treeview.heading("Dateiname", text="Dateiname") - self.target_files_treeview.heading("Konvertierungsart", text="Konvertierungsart") - self.target_files_treeview.column("Prefix Eingang", width=160, anchor="w") - self.target_files_treeview.column("Prefix Ausgang", width=160, anchor="w") - self.target_files_treeview.column("Dateiname", width=160, anchor="w") - self.target_files_treeview.column("Konvertierungsart", width=160, anchor="w") - self.target_files_treeview.place(x=10, y=170, width=650, height=380) - - # Initialize default target file configurations (as in PowerShell script) - self.target_file_configurations = [ - {"Prefix Eingang": "E", "Prefix Ausgang": "A", "Dateiname": "[Ursprungsdatei]_Simple", "Konvertierungsart": "Simpel"}, - {"Prefix Eingang": "i", "Prefix Ausgang": "o", "Dateiname": "[Ursprungsdatei]_TIA", "Konvertierungsart": "TIA"}, - {"Prefix Eingang": "K", "Prefix Ausgang": "M", "Dateiname": "[Ursprungsdatei]_WSCAD", "Konvertierungsart": "WSCAD"}, - {"Prefix Eingang": "L", "Prefix Ausgang": "N", "Dateiname": "[Ursprungsdatei]_WSCAD_Bezug", "Konvertierungsart": "WSCAD mit Bezug"} - ] - self._populate_target_files_treeview() - - - self.initialise_display() - - def _populate_target_files_treeview(self): - # Clear existing data - for i in self.target_files_treeview.get_children(): - self.target_files_treeview.delete(i) - - # Populate with current configurations - for config in self.target_file_configurations: - self.target_files_treeview.insert("", "end", values=( - config.get("Prefix Eingang", ""), - config.get("Prefix Ausgang", ""), - config.get("Dateiname", ""), - config.get("Konvertierungsart", "") - )) - - def update_display(self, selection_type, path): - items = [] - if os.path.exists(path) and os.path.isdir(path): - for item in os.listdir(path): - items.append(item) - elif not path: # Root drives - for part in psutil.disk_partitions(): - if 'cdrom' not in part.opts and part.device: - items.append(part.mountpoint) - else: # Invalid path, go to drives - self.update_display(selection_type, "") - return - - if selection_type == "txt": - self.txt_path_field.delete(0, tk.END) - self.txt_path_field.insert(0, path) - self.txt_list_box.delete(0, tk.END) - for item in sorted(items): - self.txt_list_box.insert(tk.END, item) - elif selection_type == "ver": - self.target_dir_path_field.delete(0, tk.END) - self.target_dir_path_field.insert(0, path) - self.target_dir_list_box.delete(0, tk.END) - for item in sorted(items): - self.target_dir_list_box.insert(tk.END, item) - - def change_directory(self, selection_type, current_path, selected_item): - new_path = "" - if os.path.exists(current_path) and os.path.isdir(current_path): - new_path = os.path.join(current_path, selected_item) - elif not current_path: # Selected a drive - new_path = selected_item - else: # Invalid path, revert to drives - self.update_display(selection_type, "") - return - - if os.path.isdir(new_path): - self.update_display(selection_type, new_path) - elif selection_type == "txt" and new_path.lower().endswith(".txt"): - self.txt_path_field.delete(0, tk.END) - self.txt_path_field.insert(0, new_path) - self.selected_txt_file = new_path # Store selected TXT file - self.switch_to_target_dir_tab() - else: - pass - - def navigate_back(self, selection_type, current_path): - if len(current_path) > 3 and os.path.exists(current_path): - parent_dir = os.path.dirname(current_path) - self.update_display(selection_type, parent_dir) - elif len(current_path) <= 3 and current_path.endswith(":\\"): - self.update_display(selection_type, "") - - def txt_path_field_return(self, event=None): - path = self.txt_path_field.get() - if os.path.isdir(path): - self.update_display("txt", path) - elif path.lower().endswith(".txt") and os.path.exists(path): - self.txt_path_field.delete(0, tk.END) - self.txt_path_field.insert(0, path) - self.selected_txt_file = path - self.switch_to_target_dir_tab() - else: - self.update_display("txt", "") - - def txt_list_box_double_click(self, event=None): - selected_index = self.txt_list_box.curselection() - if selected_index: - selected_item = self.txt_list_box.get(selected_index[0]) - self.change_directory("txt", self.txt_path_field.get(), selected_item) - - def txt_list_box_back_key(self, event=None): - self.navigate_back("txt", self.txt_path_field.get()) - - def txt_back_button_click(self): - self.navigate_back("txt", self.txt_path_field.get()) - - def txt_select_button_click(self): - selected_index = self.txt_list_box.curselection() - if selected_index: - selected_item = self.txt_list_box.get(selected_index[0]) - current_path = self.txt_path_field.get() - potential_file_path = os.path.join(current_path, selected_item) - if potential_file_path.lower().endswith(".txt") and os.path.exists(potential_file_path): - self.txt_path_field.delete(0, tk.END) - self.txt_path_field.insert(0, potential_file_path) - self.selected_txt_file = potential_file_path - self.switch_to_target_dir_tab() - else: - self.change_directory("txt", current_path, selected_item) - - - def target_dir_path_field_return(self, event=None): - path = self.target_dir_path_field.get() - if os.path.isdir(path): - self.update_display("ver", path) - else: - self.update_display("ver", "") - - def target_dir_list_box_double_click(self, event=None): - selected_index = self.target_dir_list_box.curselection() - if selected_index: - selected_item = self.target_dir_list_box.get(selected_index[0]) - self.change_directory("ver", self.target_dir_path_field.get(), selected_item) - - def target_dir_list_box_back_key(self, event=None): - self.navigate_back("ver", self.target_dir_path_field.get()) - - def target_dir_back_button_click(self): - self.navigate_back("ver", self.target_dir_path_field.get()) - - def target_dir_select_button_click(self): - selected_index = self.target_dir_list_box.curselection() - if selected_index: - selected_item = self.target_dir_list_box.get(selected_index[0]) - current_path = self.target_dir_path_field.get() - potential_dir_path = os.path.join(current_path, selected_item) - if os.path.isdir(potential_dir_path): - self.change_directory("ver", current_path, selected_item) - else: - self.confirm_target_directory(current_path, selected_item) - - - def target_dir_confirm_button_click(self): - selected_index = self.target_dir_list_box.curselection() - selected_item = "" - if selected_index: - selected_item = self.target_dir_list_box.get(selected_index[0]) - current_path = self.target_dir_path_field.get() - self.confirm_target_directory(current_path, selected_item) - - def confirm_target_directory(self, path, selected_item): - full_path = os.path.join(path, selected_item) if selected_item else path - if os.path.isdir(full_path): - self.target_dir_path_field.delete(0, tk.END) - self.target_dir_path_field.insert(0, full_path) - self.selected_target_directory = full_path # Store selected target directory - self.switch_to_progress_tab() - self.start_excel_conversion() # Start conversion here - elif not full_path and not selected_item: - if os.path.isdir(path): - self.selected_target_directory = path - self.switch_to_progress_tab() - self.start_excel_conversion() # Start conversion here - else: - self.update_display("ver", "") - else: - self.update_display("ver", "") - - def switch_to_target_dir_tab(self): - self.notebook.select(self.tab_target_dir_select) - - # Determine initial path for target directory selection based on settings - target_path_option = self.target_path_option_var.get() - initial_target_path = "" - - if target_path_option == "WieTXT": - if self.selected_txt_file: - initial_target_path = os.path.dirname(self.selected_txt_file) - else: - initial_target_path = os.getcwd() - elif target_path_option == "WieZielDatei": - # This option is a bit ambiguous in the PowerShell context without a previous "ZielDatei" - # For simplicity, if a TXT file is selected, use its directory. Otherwise, current working directory. - if self.selected_txt_file: - initial_target_path = os.path.dirname(self.selected_txt_file) - else: - initial_target_path = os.getcwd() - elif target_path_option == "EigenerPfad": - initial_target_path = self.target_dir_start_path_label.cget("text") - if not initial_target_path or not os.path.isdir(initial_target_path): - initial_target_path = os.getcwd() # Fallback - - self.update_display("ver", initial_target_path) - self.current_task_label.config(text="Zielverzeichnis auswaehlen") - - def switch_to_progress_tab(self): - self.notebook.select(self.tab_progress) - self.current_task_label.config(text="Excel-Dateien erstellen") - self.completed_tasks_listbox.delete(0, tk.END) # Clear previous tasks - self.progress_bar["value"] = 0 - self.processed_entries_label.config(text="0") - self.total_entries_label.config(text="0") - - - def start_excel_conversion(self): - if not self.selected_txt_file or not os.path.exists(self.selected_txt_file): - print("No TXT file selected or file does not exist.") - self.completed_tasks_listbox.insert(tk.END, "FEHLER: Keine TXT-Datei ausgewaehlt oder Datei existiert nicht.") - return - - if not self.selected_target_directory or not os.path.isdir(self.selected_target_directory): - print("No target directory selected or directory does not exist.") - self.completed_tasks_listbox.insert(tk.END, "FEHLER: Kein Zielverzeichnis ausgewaehlt oder Verzeichnis existiert nicht.") - return - - all_duplicate_inputs = [] - all_duplicate_outputs = [] - all_errors = [] - - # Read total entries from the TXT file for progress bar calculation - try: - with open(self.selected_txt_file, 'r', encoding='utf-8') as f: - total_lines = len(f.readlines()) - self.total_entries_label.config(text=str(total_lines)) - except Exception as e: - print(f"Error reading TXT file for total entries: {e}") - total_lines = 1 # Avoid division by zero - - self.progress_bar["maximum"] = len(self.target_file_configurations) - processed_files_count = 0 - - for config in self.target_file_configurations: - prefix_eingang = config.get("Prefix Eingang", "") - prefix_ausgang = config.get("Prefix Ausgang", "") - dateiname_template = config.get("Dateiname", "") - konvertierungsart = config.get("Konvertierungsart", "") - - ziel_datei = self.excel_converter._excel_datei_name_erstellen( - dateiname_template, - self.selected_txt_file, - self.selected_target_directory - ) - - self.current_task_label.config(text=f"Erstelle Excel-Datei: {os.path.basename(ziel_datei)}") - self.master.update_idletasks() # Update GUI - - try: - gleiche_eingaenge = [] - gleiche_ausgaenge = [] - fehler = [] - - if konvertierungsart == "Simpel": - gleiche_eingaenge, gleiche_ausgaenge, fehler = self.excel_converter.prep_simpel( - self.selected_txt_file, prefix_eingang, prefix_ausgang, ziel_datei - ) - elif konvertierungsart == "TIA": - gleiche_eingaenge, gleiche_ausgaenge, fehler = self.excel_converter.prep_tia( - self.selected_txt_file, prefix_eingang, prefix_ausgang, ziel_datei - ) - elif konvertierungsart == "WSCAD": - gleiche_eingaenge, gleiche_ausgaenge, fehler = self.excel_converter.prep_wscad( - self.selected_txt_file, prefix_eingang, prefix_ausgang, ziel_datei - ) - elif konvertierungsart == "WSCAD mit Bezug": - gleiche_eingaenge, gleiche_ausgaenge, fehler = self.excel_converter.prep_wscad_bezug( - self.selected_txt_file, prefix_eingang, prefix_ausgang, ziel_datei - ) - - all_duplicate_inputs.extend(gleiche_eingaenge) - all_duplicate_outputs.extend(gleiche_ausgaenge) - all_errors.extend(fehler) - - self.completed_tasks_listbox.insert(tk.END, f"ERFOLG: {os.path.basename(ziel_datei)}") - - except Exception as e: - self.completed_tasks_listbox.insert(tk.END, f"FEHLER bei {os.path.basename(ziel_datei)}: {e}") - print(f"Error converting {os.path.basename(ziel_datei)}: {e}") - - processed_files_count += 1 - self.progress_bar["value"] = processed_files_count - self.processed_entries_label.config(text=str(total_lines)) # For now, set to total lines after each file for simplicity - self.master.update_idletasks() # Update GUI - - - self.switch_to_duplicates_tab(all_duplicate_inputs, all_duplicate_outputs, all_errors) - - - def switch_to_duplicates_tab(self, duplicate_inputs, duplicate_outputs, errors): - self.notebook.select(self.tab_duplicates) - self.current_task_label.config(text="Ausgabe Duplikate und Fehler") - - # Clear existing data - for i in self.duplicate_inputs_treeview.get_children(): - self.duplicate_inputs_treeview.delete(i) - for i in self.duplicate_outputs_treeview.get_children(): - self.duplicate_outputs_treeview.delete(i) - for i in self.unassigned_errors_treeview.get_children(): - self.unassigned_errors_treeview.delete(i) - - # Populate with new data - for item in duplicate_inputs: - # Ensure 'Name' and 'Zeile' keys exist, provide default if not - name = item.get('Name', '') - zeile = item.get('Zeile', '') - self.duplicate_inputs_treeview.insert("", "end", values=(zeile, name)) - for item in duplicate_outputs: - name = item.get('Name', '') - zeile = item.get('Zeile', '') - self.duplicate_outputs_treeview.insert("", "end", values=(zeile, name)) - for item in errors: - name = item.get('Name', '') - zeile = item.get('Zeile', '') - self.unassigned_errors_treeview.insert("", "end", values=(zeile, name)) - - - def initialise_display(self): - self.update_display("txt", os.getcwd()) - - def change_txt_start_path(self): - new_path = filedialog.askdirectory() - if new_path: - self.txt_start_path_label.config(text=new_path) - - def save_radio_button_settings(self): - selected_option = self.target_path_option_var.get() - print(f"Selected target path option: {selected_option}") - - def change_target_dir_start_path(self): - new_path = filedialog.askdirectory() - if new_path: - self.target_dir_start_path_label.config(text=new_path) - - def save_target_file_settings(self): - # Read current data from Treeview - updated_configurations = [] - for item_id in self.target_files_treeview.get_children(): - values = self.target_files_treeview.item(item_id, 'values') - if len(values) == 4: - updated_configurations.append({ - "Prefix Eingang": values[0], - "Prefix Ausgang": values[1], - "Dateiname": values[2], - "Konvertierungsart": values[3] - }) - self.target_file_configurations = updated_configurations - print("Target file settings saved.") - print(self.target_file_configurations) - -def call_portal_to_excel(self, textlines, konvertierungsart): - - ec = ExcelConverter() - - all_duplicate_inputs = [] - all_duplicate_outputs = [] - all_errors = [] - - prefix_eingang = "E" - prefix_ausgang = "A" - - target_path = os.environ.get("PROJECT_WORK") - #self.current_task_label.config(text=f"Erstelle Excel-Datei: {os.path.basename(ziel_datei)}") - - gleiche_eingaenge = [] - gleiche_ausgaenge = [] - fehler = [] - - if konvertierungsart == "Simpel": - # df_eingaenge, df_ausgaenge wird in excel Datei geschrieben. Hier zu Ausgabe hinzugefügt, damit unittest befüllt werden kann - df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_eingaenge, df_ausgaenge = ec._prep_simpel( - textlines, prefix_eingang, prefix_ausgang - ) - return df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_eingaenge, df_ausgaenge - - elif konvertierungsart == "TIA": - # df_consts und df_tags wird in excel Datei geschrieben. Hier zu Ausgabe hinzugefügt, damit unittest befüllt werden kann - df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_consts, df_tags = ec._prep_tia( - textlines, prefix_eingang, prefix_ausgang - ) - return(df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_consts, df_tags) - - elif konvertierungsart == "WSCAD" or "WSCAD mit Bezug": - df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_eingaenge, df_ausgaenge = ec._prep_wscad( - textlines, prefix_eingang, prefix_ausgang - ) - return(df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_eingaenge, df_ausgaenge) - - all_duplicate_inputs.extend(gleiche_eingaenge) - all_duplicate_outputs.extend(gleiche_ausgaenge) - all_errors.extend(fehler) - - - - #self.completed_tasks_listbox.insert(tk.END, f"ERFOLG: {os.path.basename(ziel_datei)}") - - #self.switch_to_duplicates_tab(all_duplicate_inputs, all_duplicate_outputs, all_errors) - -class TestPlant(unittest.TestCase): - - def test_Simpel(self): - textlines = """'DI0023','STEUERSPANNUNG 24V UC200 OK','24V OK','=A01+UH000-KF02i','STEUERSPANNUNG 24V UC200 OK','CONTROL VOLTAGE 24V UC200 OK','TENSION DE MANIOBRA 24V UC200 OK','' -'DI0020','STEUERSPANNUNG 24V UH000 OK','24V OK UH000','=A01+UH000-KF02i','STEUERSPANNUNG 24V UH000 OK','CONTROL VOLTAGE 24V UH000 OK','TENSION DE MANIOBRA 24V UH000 OK','' -'DI0020','STEUERSPANNUNG 24V UH000 OK','24V OK UH000','=A01+UH000-KF02i','STEUERSPANNUNG 24V UH000 OK','CONTROL VOLTAGE 24V UH000 OK','TENSION DE MANIOBRA 24V UH000 OK','' -'XY0022','STEUERSPANNUNG 24V UC103 ','24V OK','=A01+UH000-KF02i','STEUERSPANNUNG 24V UC103 OK','CONTROL VOLTAGE 24V UC103 OK','TENSION DE MANIOBRA 24V UC103 OK','' -'DI0021','STEUERSPANNUNG 24V UC102-UC101 OK','24V OK','=A01+UH000-KF02i','STEUERSPANNUNG 24V UC102-UC101 OK','CONTROL VOLTAGE 24V UC102-UC101 OK','TENSION DE MANIOBRA 24V UC102-UC101 OK','' -'KF0013','DRUCKL.-WARTUNGSEINH. SCHLIESSEN','COMPR. AIR OFF','=A01+UH000-KF01Q','DRUCKL.-WARTUNGSEINH. SCHLIESSEN','CLOSE PRESS.-MAINTENANCE UNIT','AIRE COMPRIMIDO/VÁLVULA DE AISLAMIENTO C','' -'KF0012','RESET NOT HALT','RESET E-STOP','=A01+UH000-KF01Q','RESET NOT HALT','RESET EMERGENCY STOP','RESET PARO DE EMERGENCIA','' -'PF0011','ÜBERSTROM/SICHERUNGSFALL','IL-YE-LED','=A01+UH000-KF01Q','ÜBERSTROM/SICHERUNGSFALL','OVERCURRENT/MIN. CIRCUIT BREAKERS','SOBREINTENSIDAD/FUSIBLE AUTOMÁTICO','' -'MA1020','ANTRIEB PUFFER F0101 FLYER 1','M-BI-LE','=A01+UC101-KF02Q','','','','' -'MA1020','ANTRIEB PUFFER F0101 FLYER 1','M-BI-LE','=A01+UC101-KF02Q','','','','' -""" - textarray = textlines.splitlines() - - '''Testcase: 10 Zeilen mit I/O: Davon 4 Eingänge (1 Duplikat), 5 Ausgänge (1 Duplikat), 1 Fehlerhafte BMK''' - - df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_eingaenge, df_ausgaenge = call_portal_to_excel(self, textarray, "Simpel") - - # print("\n Eingänge:\n") - # print(df_eingaenge) - # print("\n Ausgänge:\n") - # print(df_ausgaenge) - - # print("\n gleiche Eingänge:\n") - # print(df_gleiche_eingaenge) - # print("\n gleiche Ausgänge:\n") - # print(df_gleiche_ausgaenge) - - self.assertEqual(len(df_fehler), 1) # Fehler anzeigen: Zeile 4 Prefix XY - - self.assertEqual(len(df_eingaenge), 4 - len(df_gleiche_eingaenge)) # 4 Eingänge in Liste, einer davon als Duplikat - self.assertEqual(len(df_ausgaenge), 5 - len(df_gleiche_ausgaenge)) # 5 Ausgänge in Liste, einer davon Duplikat - - def test_TIA(self): - textlines = """'DI0023','STEUERSPANNUNG 24V UC200 OK','24V OK','=A01+UH000-KF02i','STEUERSPANNUNG 24V UC200 OK','CONTROL VOLTAGE 24V UC200 OK','TENSION DE MANIOBRA 24V UC200 OK','' -'DI0020','STEUERSPANNUNG 24V UH000 OK','24V OK UH000','=A01+UH000-KF02i','STEUERSPANNUNG 24V UH000 OK','CONTROL VOLTAGE 24V UH000 OK','TENSION DE MANIOBRA 24V UH000 OK','' -'DI0020','STEUERSPANNUNG 24V UH000 OK','24V OK UH000','=A01+UH000-KF02i','STEUERSPANNUNG 24V UH000 OK','CONTROL VOLTAGE 24V UH000 OK','TENSION DE MANIOBRA 24V UH000 OK','' -'XY0022','STEUERSPANNUNG 24V UC103 ','24V OK','=A01+UH000-KF02i','STEUERSPANNUNG 24V UC103 OK','CONTROL VOLTAGE 24V UC103 OK','TENSION DE MANIOBRA 24V UC103 OK','' -'DI0021','STEUERSPANNUNG 24V UC102-UC101 OK','24V OK','=A01+UH000-KF02i','STEUERSPANNUNG 24V UC102-UC101 OK','CONTROL VOLTAGE 24V UC102-UC101 OK','TENSION DE MANIOBRA 24V UC102-UC101 OK','' -'KF0013','DRUCKL.-WARTUNGSEINH. SCHLIESSEN','COMPR. AIR OFF','=A01+UH000-KF01Q','DRUCKL.-WARTUNGSEINH. SCHLIESSEN','CLOSE PRESS.-MAINTENANCE UNIT','AIRE COMPRIMIDO/VÁLVULA DE AISLAMIENTO C','' -'KF0012','RESET NOT HALT','RESET E-STOP','=A01+UH000-KF01Q','RESET NOT HALT','RESET EMERGENCY STOP','RESET PARO DE EMERGENCIA','' -'PF0011','ÜBERSTROM/SICHERUNGSFALL','IL-YE-LED','=A01+UH000-KF01Q','ÜBERSTROM/SICHERUNGSFALL','OVERCURRENT/MIN. CIRCUIT BREAKERS','SOBREINTENSIDAD/FUSIBLE AUTOMÁTICO','' -'MA1020','ANTRIEB PUFFER F0101 FLYER 1','M-BI-LE','=A01+UC101-KF02Q','','','','' -'MA1020','ANTRIEB PUFFER F0101 FLYER 1','M-BI-LE','=A01+UC101-KF02Q','','','','' -""" - textarray = textlines.splitlines() - - '''Testcase: 10 Zeilen mit I/O: Davon 4 Eingänge (1 Duplikat), 5 Ausgänge (1 Duplikat), 1 Fehlerhafte BMK''' - - df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_consts, df_tags = call_portal_to_excel(self, textarray, "TIA") - - # print("\n Consts:\n") - # print(df_consts) - # print("\n Tags:\n") - # print(df_tags) - - # print("\n gleiche Eingänge:\n") - # print(df_gleiche_eingaenge) - # print("\n gleiche Ausgänge:\n") - # print(df_gleiche_ausgaenge) - - - self.assertIn("DI0020", df_gleiche_eingaenge["NameOriginal"].values) # Püfen, ob doppelter Name in doppelteEingänge auftaucht - self.assertIn("MA1020", df_gleiche_ausgaenge["NameOriginal"].values) # Püfen, ob doppelter Name in doppelteAusgänge auftaucht - self.assertEqual(len(df_fehler), 1) # Fehler anzeigen: Zeile 4 Prefix XY - - # Test, ob länge passt. Eigentlich 10 Eingabezeilen, Fehler bleibt drin, aber 2x 1 Duplikat in Eingang und Ausgang abziehen - self.assertEqual(len(df_consts), len(textarray)-(len(df_gleiche_ausgaenge)+len(df_gleiche_eingaenge))) - self.assertEqual(len(df_tags), len(textarray)-(len(df_gleiche_ausgaenge)+len(df_gleiche_eingaenge))) - - def test_WSCAD(self): - textlines = """'DI0023','STEUERSPANNUNG 24V UC200 OK','24V OK','=A01+UH000-KF02i','STEUERSPANNUNG 24V UC200 OK','CONTROL VOLTAGE 24V UC200 OK','TENSION DE MANIOBRA 24V UC200 OK','' -'DI0020','STEUERSPANNUNG 24V UH000 OK','24V OK UH000','=A01+UH000-KF02i','STEUERSPANNUNG 24V UH000 OK','CONTROL VOLTAGE 24V UH000 OK','TENSION DE MANIOBRA 24V UH000 OK','' -'DI0020','STEUERSPANNUNG 24V UH000 OK','24V OK UH000','=A01+UH000-KF02i','STEUERSPANNUNG 24V UH000 OK','CONTROL VOLTAGE 24V UH000 OK','TENSION DE MANIOBRA 24V UH000 OK','' -'XY0022','STEUERSPANNUNG 24V UC103 ','24V OK','=A01+UH000-KF02i','STEUERSPANNUNG 24V UC103 OK','CONTROL VOLTAGE 24V UC103 OK','TENSION DE MANIOBRA 24V UC103 OK','' -'DI0021','STEUERSPANNUNG 24V UC102-UC101 OK','24V OK','=A01+UH000-KF02i','STEUERSPANNUNG 24V UC102-UC101 OK','CONTROL VOLTAGE 24V UC102-UC101 OK','TENSION DE MANIOBRA 24V UC102-UC101 OK','' -'KF0013','DRUCKL.-WARTUNGSEINH. SCHLIESSEN','COMPR. AIR OFF','=A01+UH000-KF01Q','DRUCKL.-WARTUNGSEINH. SCHLIESSEN','CLOSE PRESS.-MAINTENANCE UNIT','AIRE COMPRIMIDO/VÁLVULA DE AISLAMIENTO C','' -'KF0012','RESET NOT HALT','RESET E-STOP','=A01+UH000-KF01Q','RESET NOT HALT','RESET EMERGENCY STOP','RESET PARO DE EMERGENCIA','' -'PF0011','ÜBERSTROM/SICHERUNGSFALL','IL-YE-LED','=A01+UH000-KF01Q','ÜBERSTROM/SICHERUNGSFALL','OVERCURRENT/MIN. CIRCUIT BREAKERS','SOBREINTENSIDAD/FUSIBLE AUTOMÁTICO','' -'MA1020','ANTRIEB PUFFER F0101 FLYER 1','M-BI-LE','=A01+UC101-KF02Q','','','','' -'MA1020','ANTRIEB PUFFER F0101 FLYER 1','M-BI-LE','=A01+UC101-KF02Q','','','','' -""" - textarray = textlines.splitlines() - - '''Testcase: 10 Zeilen mit I/O: Davon 4 Eingänge (1 Duplikat), 5 Ausgänge (1 Duplikat), 1 Fehlerhafte BMK''' - - df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_eingaenge, df_ausgaenge = call_portal_to_excel(self, textarray, "WSCAD mit Bezug") - - print("\n Eingänge:\n") - print(df_eingaenge) - print("\n Ausgänge:\n") - print(df_ausgaenge) - - # print("\n Fehler") - # print(df_fehler) - - # print("\n gleiche Eingänge:\n") - # print(df_gleiche_eingaenge) - # print("\n gleiche Ausgänge:\n") - # print(df_gleiche_ausgaenge) +import sys +import argparse +from ioconverter import ExcelConverter +import configparser + +# Helper für Export +def do_export(mode_str, output_dir): + # Für WSCAD Dateinamen anpassen (Export-Typ bleibt "WSCAD" oder "WSCAD mit Bezug") + if mode_str == "WSCAD": + export_type = "WSCAD" if args.no_bezug else "WSCAD mit Bezug" + filename = f"{input_basename}_{'WSCAD_no_Bezug' if args.no_bezug else 'WSCAD'}.xlsx" + else: + export_type = mode_str + filename = f"{input_basename}_{mode_str}.xlsx" + + export_path = args.output if args.output and args.mode == mode_str else os.path.join(output_dir, filename) + try: + converter.export_excel(lines, export_type, export_path) + print(f"Export '{export_type}' erfolgreich: {export_path}") + except Exception as e: + print(f"Fehler bei Export '{export_type}': {e}") if __name__ == "__main__": - - suite = unittest.TestSuite() - suite.addTest(TestPlant('test_Simpel')) - suite.addTest(TestPlant('test_TIA')) - suite.addTest(TestPlant('test_WSCAD')) - - runner = unittest.TextTestRunner() - runner.run(suite) + parser = argparse.ArgumentParser(description="Excel-Konverter für BMK-Daten") + parser.add_argument("--mode", type=str, choices=["EA", "TIA", "WSCAD"], + help="Art des Exports (EA, TIA, WSCAD). Wenn nicht gesetzt, werden alle drei erzeugt.") + parser.add_argument("--input", type=str, required=True, help="Pfad zur Eingabedatei (.txt)") + parser.add_argument("--output", type=str, help="Pfad zur Zieldatei (.xlsx)") + parser.add_argument("--no-bezug", action="store_true", help="(Nur bei WSCAD) Export ohne Bezugsinformationen") - export_type_arr = ("Simpel", "TIA", "WSCAD", "WSCAD mit Bezug") - textlines = """'XYZ0023','STEUERSPANNUNG 24V UC200 OK','24V OK','=A01+UH000-KF02i','STEUERSPANNUNG 24V UC200 OK','CONTROL VOLTAGE 24V UC200 OK','TENSION DE MANIOBRA 24V UC200 OK','','' -'DI0020','STEUERSPANNUNG 24V UH000 OK','24V OK UH000','=A01+UH000-KF02i','STEUERSPANNUNG 24V UH000 OK','CONTROL VOLTAGE 24V UH000 OK','TENSION DE MANIOBRA 24V UH000 OK','','' -'DI0020','STEUERSPANNUNG 24V UC103 ','24V OK','=A01+UH000-KF02i','STEUERSPANNUNG 24V UC103 OK','CONTROL VOLTAGE 24V UC103 OK','TENSION DE MANIOBRA 24V UC103 OK','','' -'DI0021','STEUERSPANNUNG 24V UC102-UC101 OK','24V OK','=A01+UH000-KF02i','STEUERSPANNUNG 24V UC102-UC101 OK','CONTROL VOLTAGE 24V UC102-UC101 OK','TENSION DE MANIOBRA 24V UC102-UC101 OK','','' -'KF0013','DRUCKL.-WARTUNGSEINH. SCHLIESSEN','COMPR. AIR OFF','=A01+UH000-KF01Q','DRUCKL.-WARTUNGSEINH. SCHLIESSEN','CLOSE PRESS.-MAINTENANCE UNIT','AIRE COMPRIMIDO/VÁLVULA DE AISLAMIENTO C','','' -'KF0012','RESET NOT HALT','RESET E-STOP','=A01+UH000-KF01Q','RESET NOT HALT','RESET EMERGENCY STOP','RESET PARO DE EMERGENCIA','','' -'PF0011','ÜBERSTROM/SICHERUNGSFALL','IL-YE-LED','=A01+UH000-KF01Q','ÜBERSTROM/SICHERUNGSFALL','OVERCURRENT/MIN. CIRCUIT BREAKERS','SOBREINTENSIDAD/FUSIBLE AUTOMÁTICO','','' -'PF0010','DRUCKLUFT FEHLT','IL-YE-LED','=A01+UH000-KF01Q','DRUCKLUFT FEHLT','COMPRESSED AIR MISSING','AIRE COMPRIMIDO DESCONECTADO','','' -'PF0002','START NACH STÖRUNG','IPB-CL-LED','=A01+UH000-KF00Q','START NACH STÖRUNG','START AFTER TROUBLE','ARRANQUE DESPUÉS DE AVERÍA','','' -'PF0004','STÖRUNG KOMMUNIKATION PC-SPS','IL-YE-LED','=A01+UH000-KF00Q','STÖRUNG KOMMUNIKATION PC-SPS','TROUBLE COMMUNICATION PC-PLC','AVERÍA COMMUNICATIÓN PC-CPP','','' -'PF0006','ABHEBEN AKTIV','IL-YE-LED','=A01+UH000-KF00Q','ABHEBEN AKTIV','LIFT OFF ACTIVE','SEPARAR ACTIVO','','' -'PF0005','LAUFZEITFEHLER','IPB-YE-LED','=A01+UH000-KF00Q','LAUFZEITFEHLER','TRAVEL TIME ERROR','ERROR DE TIEMPO','','' -'PF0003','NOT HALT BETÄTIGT','IL-YE-LED','=A01+UH000-KF00Q','NOT HALT BETÄTIGT','EMERGENCY STOP PUSHED','PARO EMERGENCIA OK','','' -'PF0001','ANLAGE EIN','IPB-GN-LED','=A01+UH000-KF00Q','ANLAGE EIN','SYSTEM ON','SISTEMA ENCENDIDO','','' -'PF0000','STÖRUNG ALLGEMEIN','IL-YE-LED','=A01+UH000-KF00Q','STÖRUNG ALLGEMEIN','GENERAL TROUBLE','AVERÍA','','' -'DI0017','PHASENÜBERWACHUNGSRELAIS 400VAC EIN','MONITOR. RELAY','=A01+UH000-KF01i','PHASENÜBERWACHUNGSRELAIS 400VAC EIN','PHASE MONITORING RELAY 400VAC ON','VIGILANCIA DE FASE EL RELE´','','' -'SF0015','RESET AKTIV','PB-BK-NO','=A01+UH000-KF01i','RESET AKTIV','RESET ACTIVE','RESET AKTIVA','','' -'DI0014','HAUPTSCHÜTZE EIN','MAIN CONTACT.','=A01+UH000-KF01i','HAUPTSCHÜTZE EIN','MAIN CONTACTORS ON','ENCENDIDO CONTACTOR PRINCIPAL','','' -'DI0013','SICHERHEITSRELAIS EIN','SAFETY RELAY','=A01+UH000-KF01i','SICHERHEITSRELAIS EIN','SAFETY RELAY ON','RELÉ DE SEGURIDAD ENCENDIDO','','' -'DI0012','SICHERUNGSAUTOMATENFALL','CIRCUIT BR.','=A01+UH000-KF01i','SICHERUNGSAUTOMATENFALL','MINIATURE CIRCUIT BREAKERS','FUSIBLE AUTOMÁTICO','','' -'DI0011','ÜBERSTROM','MOTORS','=A01+UH000-KF01i','ÜBERSTROM','OVERCURRENT','SOBREINTENSIDAD','','' -'BG0010','DRUCKLUFT OK','COMPR. AIR','=A01+UH000-KF01i','DRUCKLUFT OK','COMPRESSED AIR OK','AIRE COMPRIMIDO OK','','' -'SF0004','LAMPENTEST','PB-WH-NO','=A01+UH000-KF00i','LAMPENTEST','LAMP TEST','ENSAYO LAMPARA','','' -'SF0006','ANTRIEBE ABHEBEN','SS-BK-NO','=A01+UH000-KF00i','ANTRIEBE ABHEBEN','LIFT OFF CONVEYORS','SEPARAR MOTOR','','' -'SF0005','LAUFZEITFEHLER','IPB-YE-N0','=A01+UH000-KF00i','LAUFZEITFEHLER','TRAVEL TIME ERROR','ERROR DE TIEMPO','','' -'SF0003','NOT HALT SCHALTSCHRANK','EPB-RD-NC','=A01+UH000-KF00i','NOT HALT','EMERGENCY STOP','PARO DE EMERGENCIA ARMARIO DE DISTRIBUCI','','' -'SF0002','START NACH STÖRUNG','IPB-CL-NO','=A01+UH000-KF00i','START NACH STÖRUNG','START AFTER TROUBLE','ARRANQUE DESPUÉS DE AVERÍA','','' -'SF0001','ANLAGE EIN','IPB-GN-NO','=A01+UH000-KF00i','ANLAGE EIN','SYSTEM ON','SISTEMA ENCENDIDO','','' -'SF0000','ANLAGE AUS','PB-BK-NC','=A01+UH000-KF00i','ANLAGE AUS','SYSTEM OFF','SISTEMA APAGADO','','' -'BG1303','SENSOR HAUPTSTR. FB213','LT-FB213','=A01+UC102-KF04i','','','','','' -'BG1424','SENSOR HAUPTSTR. EINFAHRT FB211','LT-ENTER FB211','=A01+UH000-KF05i','','','','','' -'BG1462','SENSOR HAUPTSTR. AUSFAHRT FB222','LT-EXIT-FB222','=A01+UH000-KF08i','','','','','' -'BG3133','SENSOR HAUPTSTR. FB312','LT-FB312','=A01+UH000-KF12i','','','','','' -'MB1487','WEICHE ABZWEIG AUSFAHRT FB222','SW EXIT FB222','=A01+UH000-KF10Q','','','','','' -'MA1437','ANTRIEB HAUPTSTR. AUSFAHRT RF - RSM FB212','M-BI FB212','=A01+UH000-KF05Q','','','','','>' -'MA1436','ANTRIEB HAUPTSTR. EINFAHRT RF - RSM FB211','M-BI FB211','=A01+UH000-KF05Q','','','','','<' -'BG1460','SENSOR HAUPTSTR. AUSFAHRT FB221','LT- EXIT FB221','=A01+UH000-KF08i','','','','','' -'BG1417','SENSOR HAUPTSTR. FLYER 6','LT-ENTER RF6','=A01+UH000-KF04i','','','','','' -'MA1480','ANTRIEB HAUPTSTR. EINFAHRT RF - RSM FB221','M-BI FB221','=A01+UH000-KF10Q','','','','','<' -'QA1525','ANTRIEB HAUPTSTR. RF 8','M-BI RF 8','=A01+UC103-KF02Q','','','','','>' -'MA1524','ANTRIEB HAUPTSTR. RF 8','M-BI RF 8','=A01+UC103-KF02Q','','','','','>' -'BG1140','SENSOR HAUPTSTR. FLYER 3 FB215','LT RF3 FB215','=A01+UC101-KF06i','','','','','' -'MB1486','WEICHE ABZWEIG HAUPTSTR. EINFAHRT FB73','SW ENTER ','=A01+UH000-KF10Q','','','','','' -'QA1483','ANTRIEB HAUPTSTR. RF - RSM','M-BI RSM-RF','=A01+UH000-KF10Q','','','','','<' -'MA1482','ANTRIEB HAUPTSTR. RF - RSM','M-BI RF-RSM','=A01+UH000-KF10Q','','','','','<' -'BG1457','SENSOR HAUPTSTR. EINFAHRT FB222','LT-ENTER-FB222','=A01+UH000-KF07i','','','','','' -'BG1461','SENSOR HAUPTSTR. EINFAHRT FB221','LT-ENTER-FB221','=A01+UH000-KF08i','','','','','' -'BG1420','SENSOR HAUPTSTR. AUSFAHRT FB213','LT- EXIT FB213','=A01+UH000-KF05i','','','','','' -'MA1484','ANTRIEB HAUPTSTR. AUSFAHRT RF - RSM FB222','M-BI FB222','=A01+UH000-KF10Q','','','','','>' -'BG1421','SENSOR HAUPTSTR. FB212','LT-FB212','=A01+UH000-KF05i','','','','','' -'QA1477','ANTRIEB EIN-AUSFAHRT HAUPTSTR. RF - RSM','M-BI RSM-RF','=A01+UH000-KF09Q','','','','','>' -'MA1476','ANTRIEB EIN-AUSFAHRT HAUPTSTR. RF - RSM','M-BI RF-RSM','=A01+UH000-KF09Q','','','','','<' -'MB3236','WEICHE GERADE FB320','STRAIGHT','=A01+UH000-KF20Q','','','','','' -'MB3237','WEICHE ABZWEIG FB320','BRANCH ','=A01+UH000-KF20Q','','','','','' -'BG3231','SENSOR HAUPTSTR. FB321','LT-FB321','=A01+UH000-KF16i','','','','','' -'BG3132','SENSOR HAUPTSTR. FB310-FB320','LT-FB310-FB320','=A01+UH000-KF12i','','','','','' -'MB3136','WEICHE GERADE FB310','STRAIGHT','=A01+UH000-KF14Q','','','','','' -'MB3137','WEICHE ABZWEIG FB310','BRANCH ','=A01+UH000-KF14Q','','','','','' -'QA1433','ANTRIEB EIN-AUSFAHRT HAUPTSTR. RF - RSM','M-BI RSM-RF','=A01+UH000-KF05Q','','','','','>' -'MA1432','ANTRIEB EIN-AUSFAHRT HAUPTSTR. RF - RSM','M-BI RF-RSM','=A01+UH000-KF05Q','','','','','<' -'MB1422','WEICHE ABZWEIG PUFFER FB212','SW EXIT FB212','=A01+UH000-KF04Q','','','','','' -'BG1423','SENSOR HAUPTSTR. AUSFAHRT FB212','LT-EXIT FB212','=A01+UH000-KF05i','','','','','' -'QA3235','ANTRIEB HAUPTSTRECKE -> RSM 28-21 ','RA-BI','=A01+UH000-KF20Q','','','','','<' -'MA3234','ANTRIEB HAUPTSTRECKE -> RSM 21-28 ','RA-BI','=A01+UH000-KF20Q','','','','A','<' -'QA3135','ANTRIEB HAUPTSTRECKE -> RSM 10-1','RA-BI','=A01+UH000-KF14Q','','','','','<' -'MA3134','ANTRIEB HAUPTSTRECKE -> RSM 1-10','RA-BI','=A01+UH000-KF14Q','','','','A','<' -'QA3035','ANTRIEB HAUPTSTRECKE -> RSM 10-1','RA-BI','=A01+UC200-KF03Q','','','','','<' -'MA3034','ANTRIEB HAUPTSTRECKE -> RSM 1-10','RA-BI','=A01+UC200-KF03Q','','','','A','<' -'PF3214','RUNDUMLEUCHTE STÖRUNG RSM 11-20','LED-YE_FAULT','=A01+UH000-KF18Q','','','','','' -'SF3216','RESET/START NACH NOT HALT RSM 21-25','IPB-YE-NO','=A01+UH000-KF14i','RESET','RESET','RESET','','' -'PF3216','RESET/START NACH NOT HALT RSM 21-25','IPB-YE-LED ','=A01+UH000-KF18Q','','','','','' -'SF3215','NOT HALT RSM 21-25','EPB-NC','=A01+UH000-KF14i','NOT-HALT','E-STOP','E-STOP','','' -'PF3114','RUNDUMLEUCHTE STÖRUNG RSM 11-20','LED-YE_FAULT','=A01+UH000-KF12Q','','','','','' -'SF3116','RESET/START NACH NOT HALT RSM 11-20','IPB-YE-NO','=A01+UH000-KF10i','RESET','RESET','RESET','','' -'PF3116','RESET/START NACH NOT HALT RSM 11-20','IPB-YE-LED ','=A01+UH000-KF12Q','','','','','' -'SF3115','NOT HALT RSM 11-20','EPB-NC','=A01+UH000-KF10i','NOT-HALT','E-STOP','E-STOP','','' -'SF3226','ZUG WECHSELN RSM 30','LDT-GN-NO','=A01+UH000-KF15i','-UZ3226','-UZ3226','','','' -'PF3254','ZUG WECHSELN RSM 30','LDT-GN-LED ','=A01+UH000-KF22Q','','','','','' -'QA3257','ANTRIEB AUSFAHREN RSM 30','RA-BI','=A01+UH000-KF22Q','','','','','<' -'MA3256','ANTRIEB EINFAHREN RSM 30','RA-BI','=A01+UH000-KF22Q','','','','A','>' -'BG3227','SENSOR OPTISCH RSM 30','OPT. AP110','=A01+UH000-KF15i','','','','','' -'SF3224','ZUG WECHSELN RSM 29','LDT-GN-NO','=A01+UH000-KF15i','-UZ3224','-UZ3224','','','' -'PF3250','ZUG WECHSELN RSM 29','LDT-GN-LED ','=A01+UH000-KF22Q','','','','','' -'MB3251','WEICHE ABZWEIG RSM 29','SW RSM 29','=A01+UH000-KF22Q','','','','','' -'QA3253','ANTRIEB AUSFAHREN RSM 29','RA-BI','=A01+UH000-KF22Q','','','','','<' -'MA3252','ANTRIEB EINFAHREN RSM 29','RA-BI','=A01+UH000-KF22Q','','','','A','>' -'BG3225','SENSOR OPTISCH RSM 29','OPT. AP110','=A01+UH000-KF15i','','','','','' -'MB3241','WEICHE ABZWEIG RSM 27','SW RSM 27','=A01+UH000-KF21Q','','','','','' -'MB3231','WEICHE ABZWEIG RSM 26','SW RSM 26','=A01+UH000-KF20Q','','','','','' -'MB3245','WEICHE ABZWEIG RSM 28','SW RSM 28','=A01+UH000-KF21Q','','','','','' -'QA3247','ANTRIEB AUSFAHREN RSM 28','RA-BI','=A01+UH000-KF21Q','','','','','<' -'MA3246','ANTRIEB EINFAHREN RSM 28','RA-BI','=A01+UH000-KF21Q','','','','A','>' -'BG3223','SENSOR OPTISCH RSM 28','OPT. AP110','=A01+UH000-KF15i','','','','','' -'QA3243','ANTRIEB AUSFAHREN RSM 27','RA-BI','=A01+UH000-KF21Q','','','','','<' -'MA3242','ANTRIEB EINFAHREN RSM 27','RA-BI','=A01+UH000-KF21Q','','','','A','>' -'BG3221','SENSOR OPTISCH RSM 27','OPT. AP110','=A01+UH000-KF15i','','','','','' -'QA3233','ANTRIEB AUSFAHREN RSM 26','RA-BI','=A01+UH000-KF20Q','','','','','<' -'MA3232','ANTRIEB EINFAHREN RSM 26','RA-BI','=A01+UH000-KF20Q','','','','A','>' -'BG3213','SENSOR OPTISCH RSM 26','OPT. AP110','=A01+UH000-KF14i','','','','','' -'MB3225','WEICHE ABZWEIG RSM 25','SW RSM 25','=A01+UH000-KF19Q','','','','','' -'QA3227','ANTRIEB AUSFAHREN RSM 25','RA-BI','=A01+UH000-KF19Q','','','','','<' -'MA3226','ANTRIEB EINFAHREN RSM 25','RA-BI','=A01+UH000-KF19Q','','','','A','>' -'BG3211','SENSOR OPTISCH RSM 25','OPT. AP110','=A01+UH000-KF14i','','','','','' -'QA3223','ANTRIEB AUSFAHREN RSM 24','RA-BI','=A01+UH000-KF19Q','','','','','<' -'MA3222','ANTRIEB EINFAHREN RSM 24','RA-BI','=A01+UH000-KF19Q','','','','A','>' -'BG3207','SENSOR OPTISCH RSM 24','OPT. AP110','=A01+UH000-KF13i','','','','','' -'MB3221','WEICHE ABZWEIG RSM 24','SW RSM 24','=A01+UH000-KF19Q','','','','','' -'QA3213','ANTRIEB AUSFAHREN RSM 23','RA-BI','=A01+UH000-KF18Q','','','','','<' -'MA3212','ANTRIEB EINFAHREN RSM 23','RA-BI','=A01+UH000-KF18Q','','','','A','>' -'BG3205','SENSOR OPTISCH RSM 23','OPT. AP110','=A01+UH000-KF13i','','','','','' -'QA3207','ANTRIEB AUSFAHREN RSM 22','RA-BI','=A01+UH000-KF17Q','','','','','<' -'MA3206','ANTRIEB EINFAHREN RSM 22','RA-BI','=A01+UH000-KF17Q','','','','A','>' -'BG3203','SENSOR OPTISCH RSM 22','OPT. AP110','=A01+UH000-KF13i','','','','','' -'QA3203','ANTRIEB AUSFAHREN RSM 21','RA-BI','=A01+UH000-KF17Q','','','','','<' -'MA3202','ANTRIEB EINFAHREN RSM 21','RA-BI','=A01+UH000-KF17Q','','','','A','>' -'BG3201','SENSOR OPTISCH RSM 21','OPT. AP110','=A01+UH000-KF13i','','','','','' -'MB3211','WEICHE ABZWEIG RSM 23','SW RSM 23','=A01+UH000-KF18Q','','','','','' -'MB3205','WEICHE ABZWEIG RSM 22','SW RSM 22','=A01+UH000-KF17Q','','','','','' -'MB3201','WEICHE ABZWEIG RSM 21','SW RSM 21','=A01+UH000-KF17Q','','','','','' -'SF3222','ZUG WECHSELN RSM 28','LDT-GN-NO','=A01+UH000-KF15i','-UZ3222','-UZ3222','','','' -'PF3244','ZUG WECHSELN RSM 28','LDT-GN-LED ','=A01+UH000-KF21Q','','','','','' -'SF3220','ZUG WECHSELN RSM 27','LDT-GN-NO','=A01+UH000-KF15i','-UZ3220','-UZ3220','','','' -'PF3240','ZUG WECHSELN RSM 27','LDT-GN-LED ','=A01+UH000-KF21Q','','','','','' -'SF3212','ZUG WECHSELN RSM 26','LDT-GN-NO','=A01+UH000-KF14i','-UZ3300','-UZ3300','','','' -'PF3230','ZUG WECHSELN RSM 26','LDT-GN-LED ','=A01+UH000-KF20Q','','','','','' -'SF3210','ZUG WECHSELN RSM 25','LDT-GN-NO','=A01+UH000-KF14i','-UZ3210','-UZ3210','','','' -'PF3224','ZUG WECHSELN RSM 25','LDT-GN-LED ','=A01+UH000-KF19Q','','','','','' -'SF3206','ZUG WECHSELN RSM 24','LDT-GN-NO','=A01+UH000-KF13i','-UZ3206','-UZ3206','','','' -'PF3220','ZUG WECHSELN RSM 24','LDT-GN-LED ','=A01+UH000-KF19Q','','','','','' -'SF3204','ZUG WECHSELN RSM 23','LDT-GN-NO','=A01+UH000-KF13i','-UZ3204','-UZ3204','','','' -'PF3210','ZUG WECHSELN RSM 23','LDT-GN-LED ','=A01+UH000-KF18Q','','','','','' -'SF3202','ZUG WECHSELN RSM 22','LDT-GN-NO','=A01+UH000-KF13i','-UZ3202','-UZ3202','','','' -'PF3204','ZUG WECHSELN RSM 22','LDT-GN-LED ','=A01+UH000-KF17Q','','','','','' -'SF3200','ZUG WECHSELN RSM 21','LDT-GN-NO','=A01+UH000-KF13i','-UZ3200','-UZ3200','','','' -'PF3200','ZUG WECHSELN RSM 21','LDT-GN-LED ','=A01+UH000-KF17Q','','','','','' -'MB3155','WEICHE ABZWEIG RSM 20','SW RSM 20','=A01+UH000-KF16Q','','','','','' -'QA3157','ANTRIEB AUSFAHREN RSM 20','RA-BI','=A01+UH000-KF16Q','','','','','<' -'MA3156','ANTRIEB EINFAHREN RSM 20','RA-BI','=A01+UH000-KF16Q','','','','A','>' -'BG3127','SENSOR OPTISCH RSM 20','OPT. AP110','=A01+UH000-KF11i','','','','','' -'QA3153','ANTRIEB AUSFAHREN RSM 19','RA-BI','=A01+UH000-KF16Q','','','','','<' -'MA3152','ANTRIEB EINFAHREN RSM 19','RA-BI','=A01+UH000-KF16Q','','','','A','>' -'BG3125','SENSOR OPTISCH RSM 19','OPT. AP110','=A01+UH000-KF11i','','','','','' -'QA3147','ANTRIEB AUSFAHREN RSM 18','RA-BI','=A01+UH000-KF15Q','','','','','<' -'MA3146','ANTRIEB EINFAHREN RSM 18','RA-BI','=A01+UH000-KF15Q','','','','A','>' -'BG3123','SENSOR OPTISCH RSM 18','OPT. AP110','=A01+UH000-KF11i','','','','','' -'QA3143','ANTRIEB AUSFAHREN RSM 17','RA-BI','=A01+UH000-KF15Q','','','','','<' -'MA3142','ANTRIEB EINFAHREN RSM 17','RA-BI','=A01+UH000-KF15Q','','','','A','>' -'BG3121','SENSOR OPTISCH RSM 17','OPT. AP110','=A01+UH000-KF11i','','','','','' -'QA3133','ANTRIEB AUSFAHREN RSM 16','RA-BI','=A01+UH000-KF14Q','','','','','<' -'MA3132','ANTRIEB EINFAHREN RSM 16','RA-BI','=A01+UH000-KF14Q','','','','A','>' -'BG3113','SENSOR OPTISCH RSM 16','OPT. AP110','=A01+UH000-KF10i','','','','','' -'QA3127','ANTRIEB AUSFAHREN RSM 15','RA-BI','=A01+UH000-KF13Q','','','','','<' -'MA3126','ANTRIEB EINFAHREN RSM 15','RA-BI','=A01+UH000-KF13Q','','','','A','>' -'BG3111','SENSOR OPTISCH RSM 15','OPT. AP110','=A01+UH000-KF10i','','','','','' -'QA3123','ANTRIEB AUSFAHREN RSM 14','RA-BI','=A01+UH000-KF13Q','','','','','<' -'MA3122','ANTRIEB EINFAHREN RSM 14','RA-BI','=A01+UH000-KF13Q','','','','A','>' -'BG3107','SENSOR OPTISCH RSM 14','OPT. AP110','=A01+UH000-KF09i','','','','','' -'MB3151','WEICHE ABZWEIG RSM 19','SW RSM 19','=A01+UH000-KF16Q','','','','','' -'MB3145','WEICHE ABZWEIG RSM 18','SW RSM 18','=A01+UH000-KF15Q','','','','','' -'MB3141','WEICHE ABZWEIG RSM 17','SW RSM 17','=A01+UH000-KF15Q','','','','','' -'MB3131','WEICHE ABZWEIG RSM 16','SW RSM 16','=A01+UH000-KF14Q','','','','','' -'MB3125','WEICHE ABZWEIG RSM 15','SW RSM 15','=A01+UH000-KF13Q','','','','','' -'MB3121','WEICHE ABZWEIG RSM 14','SW RSM 14','=A01+UH000-KF13Q','','','','','' -'SF3126','ZUG WECHSELN RSM 20','LDT-GN-NO','=A01+UH000-KF11i','-UZ3122','-UZ3122','','','' -'PF3154','ZUG WECHSELN RSM 20','LDT-GN-LED ','=A01+UH000-KF16Q','','','','','' -'SF3124','ZUG WECHSELN RSM 19','LDT-GN-NO','=A01+UH000-KF11i','-UZ3120','-UZ3120','','','' -'PF3150','ZUG WECHSELN RSM 19','LDT-GN-LED ','=A01+UH000-KF16Q','','','','','' -'SF3122','ZUG WECHSELN RSM 18','LDT-GN-NO','=A01+UH000-KF11i','-UZ3116','-UZ3116','','','' -'PF3144','ZUG WECHSELN RSM 18','LDT-GN-LED ','=A01+UH000-KF15Q','','','','','' -'SF3120','ZUG WECHSELN RSM 17','LDT-GN-NO','=A01+UH000-KF11i','-UZ3120','-UZ3102','','','' -'PF3140','ZUG WECHSELN RSM 17','LDT-GN-LED ','=A01+UH000-KF15Q','','','','','' -'SF3112','ZUG WECHSELN RSM 16','LDT-GN-NO','=A01+UH000-KF10i','-UZ3112','-UZ3112','','','' -'PF3130','ZUG WECHSELN RSM 16','LDT-GN-LED ','=A01+UH000-KF14Q','','','','','' -'SF3110','ZUG WECHSELN RSM 15','LDT-GN-NO','=A01+UH000-KF10i','-UZ3110','-UZ3110','','','' -'PF3124','ZUG WECHSELN RSM 15','LDT-GN-LED ','=A01+UH000-KF13Q','','','','','' -'SF3106','ZUG WECHSELN RSM 14','LDT-GN-NO','=A01+UH000-KF09i','-UZ3106','-UZ3106','','','' -'PF3120','ZUG WECHSELN RSM 14','LDT-GN-LED ','=A01+UH000-KF13Q','','','','','' -'QA3113','ANTRIEB AUSFAHREN RSM 13','RA-BI','=A01+UH000-KF12Q','','','','','<' -'MA3112','ANTRIEB EINFAHREN RSM 13','RA-BI','=A01+UH000-KF12Q','','','','A','>' -'BG3105','SENSOR OPTISCH RSM 13','OPT. AP110','=A01+UH000-KF09i','','','','','' -'MB3111','WEICHE ABZWEIG RSM 13','SW RSM 13','=A01+UH000-KF12Q','','','','','' -'SF3104','ZUG WECHSELN RSM 13','LDT-GN-NO','=A01+UH000-KF09i','-UZ3104','-UZ3104','','','' -'PF3110','ZUG WECHSELN RSM 13','LDT-GN-LED ','=A01+UH000-KF12Q','','','','','' -'QA3107','ANTRIEB AUSFAHREN RSM 12','RA-BI','=A01+UH000-KF11Q','','','','','<' -'MA3106','ANTRIEB EINFAHREN RSM 12','RA-BI','=A01+UH000-KF11Q','','','','A','>' -'BG3103','SENSOR OPTISCH RSM 12','OPT. AP110','=A01+UH000-KF09i','','','','','' -'MB3105','WEICHE ABZWEIG RSM 12','SW RSM 12','=A01+UH000-KF11Q','','','','','' -'SF3102','ZUG WECHSELN RSM 12','LDT-GN-NO','=A01+UH000-KF09i','-UZ3102','-UZ3102','','','' -'PF3104','ZUG WECHSELN RSM 12','LDT-GN-LED ','=A01+UH000-KF11Q','','','','','' -'SF3100','ZUG WECHSELN RSM 11','LDT-GN-NO','=A01+UH000-KF09i','-UZ3100','-UZ3100','','','' -'PF3100','ZUG WECHSELN RSM 11','LDT-GN-LED ','=A01+UH000-KF11Q','','','','','' -'QA3103','ANTRIEB AUSFAHREN RSM 11','RA-BI','=A01+UH000-KF11Q','','','','','<' -'MA3102','ANTRIEB EINFAHREN RSM 11','RA-BI','=A01+UH000-KF11Q','','','','A','>' -'BG3101','SENSOR OPTISCH RSM 11','OPT. AP110','=A01+UH000-KF09i','','','','','' -'MB3101','WEICHE ABZWEIG RSM 11','SW RSM 11','=A01+UH000-KF11Q','','','','','' -'BG3130','SENSOR HAUPTSTR. FB310 ','LT-FB310','=A01+UH000-KF12i','','','','','' -'BG3230','SENSOR HAUPTSTR. FB320 ','LT-FB320','=A01+UH000-KF16i','','','','','' -'BG3131','SENSOR HAUPTSTR. FB311','LT-FB311','=A01+UH000-KF12i','','','','','' -'BG1541','SENSOR AUSFAHRT PUFFER F0902 FLYER 9','LT-EXIT F0902','=A01+UC103-KF02i','','','','','' -'BG1540','SENSOR AUSFAHRT PUFFER F0901 FLYER 9','LT-EXIT F0901','=A01+UC103-KF02i','','','','','' -'MB1574','ANPRESSEN NACHPUFFER F0901 FLYER 9','PRESS F0901','=A01+UC103-KF07Q','','','','','' -'MB1575','ANPRESSEN NACHPUFFER F0902 FLYER 9','PRESS F0902','=A01+UC103-KF07Q','','','','','' -'QA1571','ANTRIEB NACHPUFFER F0707 FLYER 9','M-BI-LE','=A01+UC103-KF07Q','','','','','<' -'MA1570','ANTRIEB NACHPUFFER F0901 FLYER 9','M-BI-RI','=A01+UC103-KF07Q','','','','','>' -'MB1544','ANPRESSEN PUFFER F0901 FLYER 9','PRESS F0901','=A01+UC103-KF04Q','','','','','' -'MB1545','ANPRESSEN PUFFER F0902 FLYER 9','PRESS F0902','=A01+UC103-KF04Q','','','','','' -'QA1561','ANTRIEB PUFFER F0901 FLYER 9','M-BI-RI','=A01+UC103-KF06Q','','','','','>' -'MA1560','ANTRIEB PUFFER F0901 FLYER 9','M-BI-LE','=A01+UC103-KF06Q','','','','','<' -'BG1546','SENSOR AUSFAHRT NACHPUFFER F0902 RF 9','LT-EXIT F0902','=A01+UC103-KF02i','','','','','' -'BG1545','SENSOR AUSFAHRT NACHPUFFER F0901 RF 9','LT-EXIT F0901','=A01+UC103-KF02i','','','','','' -'MB1541','WEICHE ABZWEIG EINFAHRT PUFFER F0902 FLYER 9','SW ENTER F0901','=A01+UC103-KF04Q','','','','','' -'MB1540','WEICHE ABZWEIG EINFAHRT RF 9','SW ENTER RF 9','=A01+UC103-KF04Q','','','','','' -'MB1567','WEICHE ABZWEIG EINFAHRT NACHP. RF 9','SW-STRAIGHT','=A01+UC103-KF06Q','','','','','' -'MB1566','WEICHE ABZWEIG EINFAHRT NACHP. RF 9','SW-BRANCH','=A01+UC103-KF06Q','','','','','' -'KF1555','IF RF 09: START SPULENWECHSEL 2','IF-RELAIS','=A01+UC103-KF05Q','IF RF 09: START SPULENWECHSEL 2','IF RF 09: START EXCHANGE 2','','','' -'DI1554','IF RF 09 : NEUE SPULE','IF-RELAIS','=A01+UC103-KF03i','IF RF 09: NEUE SPULE ','IF RF 09: NEW BOBBIN','','','' -'KF1554','IF RF 09: START SPULENWECHSEL 1','IF-RELAIS','=A01+UC103-KF05Q','IF RF 09: START SPULENWECHSEL 1','IF RF 09: START EXCHANGE 1','','','' -'PF1547','RUNDUMLEUCHTE STÖRUNG FLYER 9','LED-YE_FAULT','=A01+UC103-KF04Q','','','','','' -'SF1553','RESET FLYER 9','IPB-YE-NO','=A01+UC103-KF03i','RESET','RESET','RESET','','' -'PF1553','RESET FLYER 9','IPB-YE-LED','=A01+UC103-KF05Q','','','','','' -'SF1552','NOT HALT FLYER 9','EPB-NC','=A01+UC103-KF03i','NOT-HALT','E-STOP','E-STOP','','' -'BG1556','SENSOR SPULE IN POSITION FLYER 9','BOBBIN IN POS','=A01+UC103-KF03i','','','','','' -'BG1544','SENSOR ZUG IN DOFFER FLYER 9','LT-TRAIN IN DOF','=A01+UC103-KF02i','','','','','' -'BG1543','SENSOR ZUG IN DOFFER PM 9','LT-TRAIN IN DOF','=A01+UC103-KF02i','','','','','' -'MB1551','ABHEBEN ANTRIEBE PM 9','LIFT OFF BS 9','=A01+UC103-KF05Q','','','','','' -'MA1556','ANTRIEBE FLYER 9','M-BI','=A01+UC103-KF05Q','','','','','>' -'MB1502','WEICHE ABZWEIG EINFAHRT PUFFER F0802 FLYER 8','SW ENTER F0802','=A01+UC103-KF00Q','','','','','' -'MB1500','WEICHE ABZWEIG EINFAHRT FLYER 8','SW ENTER RF 8','=A01+UC103-KF00Q','','','','','' -'MB1501','WEICHE ABZWEIG EINFAHRT RF 8','SW ENTER RF 8','=A01+UC103-KF00Q','','','','','' -'MB1534','ANPRESSEN NACHPUFFER F0801 FLYER 8','PRESS F0801','=A01+UC103-KF03Q','','','','','' -'MB1535','ANPRESSEN NACHPUFFER F0802 FLYER 8','PRESS F0802','=A01+UC103-KF03Q','','','','','' -'QA1531','ANTRIEB NACHPUFFER F0802 RF 8','M-BI','=A01+UC103-KF03Q','','','','','>' -'MA1530','ANTRIEB NACHPUFFER F0801 RF 8','M-BI','=A01+UC103-KF03Q','','','','','>' -'MB1504','ANPRESSEN PUFFER F0801 FLYER 8','PRESS F0801','=A01+UC103-KF00Q','','','','','' -'MB1505','ANPRESSEN PUFFER F0802 FLYER 8','PRESS F0802','=A01+UC103-KF00Q','','','','','' -'QA1521','ANTRIEB PUFFER F0802 FLYER 8','M-BI-RI','=A01+UC103-KF02Q','','','','','<' -'MA1520','ANTRIEB PUFFER F0801 FLYER 8','M-BI-LE','=A01+UC103-KF02Q','','','','','<' -'BG1505','SENSOR AUSFAHRT NACHPUFFER F0801 FLYER 8','LT-EXIT F0801','=A01+UC103-KF00i','','','','','' -'BG1506','SENSOR AUSFAHRT NACHPUFFER F0802 FLYER 8','LT-EXIT F0802','=A01+UC103-KF00i','','','','','' -'BG1501','SENSOR AUSFAHRT PUFFER F0802 FLYER 8','LT-EXIT F0802','=A01+UC103-KF00i','','','','','' -'BG1500','SENSOR AUSFAHRT PUFFER F0801 FLYER 8','LT-EXIT F0801','=A01+UC103-KF00i','','','','','' -'SF1511','HAUPTSCHALTER EIN +UC103','I-MS ON','=A01+UC103-KF01i','HAUPTSCHALTER EIN','MAIN SWITCH ON','','','' -'SF1510','MOTORSCHUTZSCHALTER HAT AUSGELÖST','I-CB OK','=A01+UC103-KF01i','MSS IN ORDNUNG','MPS OK','','','' -'PF1510','LM-ÜBERSTROM +UC103','IL-YE-LED','=A01+UC103-KF01Q','LM ÜBERSTROM','IL OVERCURRENT','','','' -'MB1527','WEICHE ABZWEIG EINFAHRT NACHP. RF 8','SW-BRANCH','=A01+UC103-KF02Q','','','','','' -'MB1526','WEICHE ABZWEIG EINFAHRT NACHP. RF 8','SW-STRAIGHT','=A01+UC103-KF02Q','','','','','' -'BG1503','SENSOR ZUG IN DOFFER PM 8','LT-TRAIN IN DOF','=A01+UC103-KF00i','','','','','' -'BG1516','SENSOR SPULE IN POSITION FLYER 8','BOBBIN IN POS','=A01+UC103-KF01i','','','','','' -'BG1504','SENSOR ZUG IN DOFFER FLYER 8','LT-TRAIN IN DOF','=A01+UC103-KF00i','','','','','' -'MB1511','ABHEBEN ANTRIEBE PM 8','LIFT OFF BS 8','=A01+UC103-KF01Q','','','','','' -'MA1516','ANTRIEBE FLYER 8','M-BI','=A01+UC103-KF01Q','','','','','<' -'KF1515','IF RF 08: START SPULENWECHSEL 2','IF-RELAIS','=A01+UC103-KF01Q','IF RF 08: START SPULENWECHSEL 2','IF RF 08: START EXCHANGE 2','','','' -'DI1514','IF RF 08 : NEUE SPULE','IF-RELAIS','=A01+UC103-KF01i','IF RF 08: NEUE SPULE ','IF RF 08: NEW BOBBIN','','','' -'KF1514','IF RF 08: START SPULENWECHSEL 1','IF-RELAIS','=A01+UC103-KF01Q','IF RF 08: START SPULENWECHSEL 1','IF RF 08: START EXCHANGE 1','','','' -'PF1507','RUNDUMLEUCHTE STÖRUNG FLYER 8','LED-YE_FAULT','=A01+UC103-KF00Q','','','','','' -'SF1513','RESET FLYER 8','IPB-YE-NO','=A01+UC103-KF01i','RESET','RESET','RESET','','' -'PF1513','RESET FLYER 8','IPB-YE-LED','=A01+UC103-KF01Q','','','','','' -'SF1512','NOT HALT FLYER 8','EPB-NC','=A01+UC103-KF01i','NOT-HALT','E-STOP','E-STOP','','' -'BG1446','SENSOR AUSFAHRT NACHPUFFER F0702 RF 7','LT-EXIT F0702','=A01+UH000-KF06i','','','','','' -'BG1445','SENSOR AUSFAHRT NACHPUFFER F0701 RF 7','LT-EXIT F0701','=A01+UH000-KF06i','','','','','' -'MB1441','WEICHE ABZWEIG EINFAHRT F0701 RF 7','SW ENTER F0701 ','=A01+UH000-KF06Q','','','','','' -'MB1443','WEICHE ABZWEIG AUSFAHRT NACHP. FLYER 7','SW EXIT RF7','=A01+UH000-KF06Q','','','','','' -'MB1440','WEICHE ABZWEIG EINFAHRT RF 7','SW ENTER RF 7','=A01+UH000-KF06Q','','','','','' -'MB1442','WEICHE ABZWEIG EINFAHRT F0702 RF 7','SW ENTER F0702','=A01+UH000-KF06Q','','','','','' -'MB1474','ANPRESSEN NACHPUFFER F0701 FLYER 7','PRESS F0701','=A01+UH000-KF09Q','','','','','' -'MB1475','ANPRESSEN NACHPUFFER F0702 FLYER 7','PRESS F0702','=A01+UH000-KF09Q','','','','','' -'QA1471','ANTRIEB NACHPUFFER F0707 FLYER 7','M-BI-LE','=A01+UH000-KF09Q','','','','','<' -'MA1470','ANTRIEB NACHPUFFER F0701 FLYER 7','M-BI-RI','=A01+UH000-KF09Q','','','','','>' -'MB1444','ANPRESSEN PUFFER F0701 FLYER 7','PRESS F0701','=A01+UH000-KF06Q','','','','','' -'MB1445','ANPRESSEN PUFFER F0702 FLYER 7','PRESS F0702','=A01+UH000-KF06Q','','','','','' -'QA1461','ANTRIEB PUFFER F0701 FLYER 7','M-BI-RI','=A01+UH000-KF08Q','','','','','>' -'MA1460','ANTRIEB PUFFER F0701 FLYER 7','M-BI-LE','=A01+UH000-KF08Q','','','','','<' -'BG1441','SENSOR AUSFAHRT PUFFER F0702 FLYER 7','LT-EXIT F0702','=A01+UH000-KF06i','','','','','' -'BG1440','SENSOR AUSFAHRT PUFFER F0701 FLYER 7','LT-EXIT F0701','=A01+UH000-KF06i','','','','','' -'BG1456','SENSOR SPULE IN POSITION FLYER 7','BOBBIN IN POS','=A01+UH000-KF07i','','','','','' -'BG1444','SENSOR ZUG IN DOFFER FLYER 7','LT-TRAIN IN DOF','=A01+UH000-KF06i','','','','','' -'BG1443','SENSOR ZUG IN DOFFER PM 7','LT-TRAIN IN DOF','=A01+UH000-KF06i','','','','','' -'MB1451','ABHEBEN ANTRIEBE PM 7','LIFT OFF BS 7','=A01+UH000-KF07Q','','','','','' -'MA1456','ANTRIEBE FLYER 7','M-BI','=A01+UH000-KF07Q','','','','','>' -'MB1467','WEICHE ABZWEIG EINFAHRT NACHP. RF7','SW-STRAIGHT','=A01+UH000-KF08Q','','','','','' -'MB1466','WEICHE ABZWEIG EINFAHRT NACHP. RF7','SW-BRANCH','=A01+UH000-KF08Q','','','','','' -'KF1455','IF RF 07: START SPULENWECHSEL 2','IF-RELAIS','=A01+UH000-KF07Q','IF RF 07: START SPULENWECHSEL 2','IF RF 07: START EXCHANGE 2','','','' -'DI1454','IF RF 07 : NEUE SPULE','IF-RELAIS','=A01+UH000-KF07i','IF RF 07: NEUE SPULE ','IF RF 07: NEW BOBBIN','','','' -'KF1454','IF RF 07: START SPULENWECHSEL 1','IF-RELAIS','=A01+UH000-KF07Q','IF RF 07: START SPULENWECHSEL 1','IF RF 07: START EXCHANGE 1','','','' -'PF1447','RUNDUMLEUCHTE STÖRUNG FLYER 7','LED-YE_FAULT','=A01+UH000-KF06Q','','','','','' -'SF1453','RESET FLYER 7','IPB-YE-NO','=A01+UH000-KF07i','RESET','RESET','RESET','','' -'PF1453','RESET FLYER 7','IPB-YE-LED','=A01+UH000-KF07Q','','','','','' -'SF1452','NOT HALT FLYER 7','EPB-NC','=A01+UH000-KF07i','NOT-HALT','E-STOP','E-STOP','','' -'SF3026','ZUG WECHSELN RSM 10','LDT-GN-NO','=A01+UC200-KF02i','-UZ3026','-UZ3026','','','' -'PF3054','ZUG WECHSELN RSM 10','LDT-GN-LED ','=A01+UC200-KF05Q','','','','','' -'SF3024','ZUG WECHSELN RSM 9','LDT-GN-NO','=A01+UC200-KF02i','-UZ3024','-UZ3024','','','' -'PF3050','ZUG WECHSELN RSM 9','LDT-GN-LED ','=A01+UC200-KF05Q','','','','','' -'QA3057','ANTRIEB AUSFAHREN RSM 10','RA-BI','=A01+UC200-KF05Q','','','','','<' -'MA3056','ANTRIEB EINFAHREN RSM 10','RA-BI','=A01+UC200-KF05Q','','','','A','>' -'BG3027','SENSOR OPTISCH RSM 10','OPT. AP110','=A01+UC200-KF02i','','','','','' -'MB3055','WEICHE ABZWEIG RSM 10','SW RSM 10','=A01+UC200-KF05Q','','','','','' -'QA3053','ANTRIEB AUSFAHREN RSM 9','RA-BI','=A01+UC200-KF05Q','','','','','<' -'MA3052','ANTRIEB EINFAHREN RSM 9','RA-BI','=A01+UC200-KF05Q','','','','A','>' -'BG3025','SENSOR OPTISCH RSM 9','OPT. AP110','=A01+UC200-KF02i','','','','','' -'MB3051','WEICHE ABZWEIG RSM 9','SW RSM 09','=A01+UC200-KF05Q','','','','','' -'SF3014','HAUPTSCHALTER EIN +UC200','I-MS ON','=A01+UC200-KF01i','HAUPTSCHALTER EIN','MAIN SWITCH ON','','','' -'SF3017','MOTORSCHUTZSCHALTER HAT AUSGELÖST','I-CB OK','=A01+UC200-KF01i','MSS IN ORDNUNG','MPS OK','','','' -'PF3017','LM-ÜBERSTROM +UC200 RSM 1-10','IL-YE-LED','=A01+UC200-KF01Q','LM ÜBERSTROM','IL OVERCURRENT','','','' -'SF3020','ZUG WECHSELN RSM 7','LDT-GN-NO','=A01+UC200-KF02i','-UZ3020','-UZ3020','','','' -'PF3040','ZUG WECHSELN RSM 7','LDT-GN-LED ','=A01+UC200-KF04Q','','','','','' -'QA3043','ANTRIEB AUSFAHREN RSM 7','RA-BI','=A01+UC200-KF04Q','','','','','<' -'MA3042','ANTRIEB EINFAHREN RSM 7','RA-BI','=A01+UC200-KF04Q','','','','A','>' -'BG3021','SENSOR OPTISCH RSM 7','OPT. AP110','=A01+UC200-KF02i','','','','','' -'MB3041','WEICHE ABZWEIG RSM 7','SW RSM 07','=A01+UC200-KF04Q','','','','','' -'SF3022','ZUG WECHSELN RSM 8','LDT-GN-NO','=A01+UC200-KF02i','-UZ3022','-UZ3022','','','' -'PF3044','ZUG WECHSELN RSM 8','LDT-GN-LED ','=A01+UC200-KF04Q','','','','','' -'QA3047','ANTRIEB AUSFAHREN RSM 8','RA-BI','=A01+UC200-KF04Q','','','','','<' -'MA3046','ANTRIEB EINFAHREN RSM 8','RA-BI','=A01+UC200-KF04Q','','','','A','>' -'BG3023','SENSOR OPTISCH RSM 8','OPT. AP110','=A01+UC200-KF02i','','','','','' -'MB3045','WEICHE ABZWEIG RSM 8','SW RSM 08','=A01+UC200-KF04Q','','','','','' -'PF3014','RUNDUMLEUCHTE STÖRUNG RSM 01-10','LED-YE_FAULT','=A01+UC200-KF01Q','','','','','' -'SF3016','RESET/START NACH NOT HALT RSM 1-10','IPB-YE-NO','=A01+UC200-KF01i','RESET','RESET','RESET','','' -'PF3016','RESET/START NACH NOT HALT RSM 1-10','IPB-YE-LED ','=A01+UC200-KF01Q','','','','','' -'SF3015','NOT HALT RSM 1-10','EPB-NC','=A01+UC200-KF01i','NOT-HALT','E-STOP','E-STOP','','' -'SF3012','ZUG WECHSELN RSM 6','LDT-GN-NO','=A01+UC200-KF01i','-UZ3012','-UZ3012','','','' -'PF3030','ZUG WECHSELN RSM 6','LDT-GN-LED ','=A01+UC200-KF03Q','','','','','' -'QA3033','ANTRIEB AUSFAHREN RSM 6','RA-BI','=A01+UC200-KF03Q','','','','','<' -'MA3032','ANTRIEB EINFAHREN RSM 6','RA-BI','=A01+UC200-KF03Q','','','','A','>' -'BG3013','SENSOR OPTISCH RSM 6','OPT. AP110','=A01+UC200-KF01i','','','','','' -'MB3031','WEICHE ABZWEIG RSM 6','SW RSM 06','=A01+UC200-KF03Q','','','','','' -'SF3010','ZUG WECHSELN RSM 5','LDT-GN-NO','=A01+UC200-KF01i','-UZ3010','-UZ3010','','','' -'PF3024','ZUG WECHSELN RSM 5','LDT-GN-LED ','=A01+UC200-KF02Q','','','','','' -'QA3027','ANTRIEB AUSFAHREN RSM 5','RA-BI','=A01+UC200-KF02Q','','','','','<' -'MA3026','ANTRIEB EINFAHREN RSM 5','RA-BI','=A01+UC200-KF02Q','','','','A','>' -'BG3011','SENSOR OPTISCH RSM 5','OPT. AP110','=A01+UC200-KF01i','','','','','' -'MB3025','WEICHE ABZWEIG RSM 5','SW RSM 05','=A01+UC200-KF02Q','','','','','' -'SF3006','ZUG WECHSELN RSM 4','LDT-GN-NO','=A01+UC200-KF00i','-UZ3006','-UZ3006','','','' -'PF3020','ZUG WECHSELN RSM 4','LDT-GN-LED ','=A01+UC200-KF02Q','','','','','' -'SF3004','ZUG WECHSELN RSM 3','LDT-GN-NO','=A01+UC200-KF00i','-UZ3004','-UZ3004','','','' -'PF3010','ZUG WECHSELN RSM 3','LDT-GN-LED ','=A01+UC200-KF01Q','','','','','' -'QA3023','ANTRIEB AUSFAHREN RSM 4','RA-BI','=A01+UC200-KF02Q','','','','','<' -'MA3022','ANTRIEB EINFAHREN RSM 4','RA-BI','=A01+UC200-KF02Q','','','','A','>' -'BG3007','SENSOR OPTISCH RSM 4','OPT. AP110','=A01+UC200-KF00i','','','','','' -'MB3021','WEICHE ABZWEIG RSM 4','SW RSM 04','=A01+UC200-KF02Q','','','','','' -'QA3013','ANTRIEB AUSFAHREN RSM 3','RA-BI','=A01+UC200-KF01Q','','','','','<' -'MA3012','ANTRIEB EINFAHREN RSM 3','RA-BI','=A01+UC200-KF01Q','','','','A','>' -'BG3005','SENSOR OPTISCH RSM 3','OPT. AP110','=A01+UC200-KF00i','','','','','' -'MB3011','WEICHE ABZWEIG RSM 3','SW RSM 03','=A01+UC200-KF01Q','','','','','' -'SF3002','ZUG WECHSELN RSM 2','LDT-GN-NO','=A01+UC200-KF00i','-UZ3002','-UZ3002','','','' -'PF3004','ZUG WECHSELN RSM 2','LDT-GN-LED ','=A01+UC200-KF00Q','','','','','' -'QA3007','ANTRIEB AUSFAHREN RSM 2','RA-BI','=A01+UC200-KF00Q','','','','','<' -'MA3006','ANTRIEB EINFAHREN RSM 2','RA-BI','=A01+UC200-KF00Q','','','','A','>' -'BG3003','SENSOR OPTISCH RSM 2','OPT. AP110','=A01+UC200-KF00i','','','','','' -'MB3005','WEICHE ABZWEIG RSM 2','SW RSM 02','=A01+UC200-KF00Q','','','','','' -'SF3000','ZUG WECHSELN RSM 1','LDT-GN-NO','=A01+UC200-KF00i','-UZ3000','-UZ3000','','','' -'PF3000','ZUG WECHSELN RSM 1 ','LDT-GN-LED ','=A01+UC200-KF00Q','','','','','' -'QA3003','ANTRIEB AUSFAHREN RSM 1','RA-BI','=A01+UC200-KF00Q','','','','','<' -'MA3002','ANTRIEB EINFAHREN RSM 1','RA-BI','=A01+UC200-KF00Q','','','','A','>' -'BG3001','SENSOR OPTISCH RSM 1 ','OPT. AP110','=A01+UC200-KF00i','','','','','' -'MA1464','ANTRIEB HAUPTSTR. AUSFAHRT RF - RSM FB212','M-BI FB212','=A01+UH000-KF08Q','','','','','>' -'MA1462','ANTRIEB HAUPTSTR. EINFAHRT FB211','M-BI FB211','=A01+UH000-KF08Q','','','','','<' -'MB1423','WEICHE ABZWEIG FB213','SW FB213','=A01+UH000-KF04Q','','','','','' -'QA1425','ANTRIEB HAUPTSTECKE RF 6','M-BI-RF6 FB63','=A01+UH000-KF04Q','','','','','>' -'MA1424','ANTRIEB HAUPTSTECKE RF 6','M-BI-RF6 FB63','=A01+UH000-KF04Q','','','','','<' -'BG1405','SENSOR AUSFAHRT NACHPUFFER F0601 FLYER 6','LT-EXIT F0601','=A01+UH000-KF03i','','','','','' -'BG1406','SENSOR AUSFAHRT NACHPUFFER F0602 FLYER 6','LT-EXIT F0602','=A01+UH000-KF03i','','','','','' -'MB1401','WEICHE ABZWEIG EINFAHRT PUFFER F0601 FLYER 6','SW F0601','=A01+UH000-KF02Q','','','','','' -'BG1422','SENSOR HAUPTSTR. FB212','LT-FB212','=A01+UH000-KF05i','','','','','' -'MB1400','WEICHE ABZWEIG EINFAHRT FLYER 6','SW ENTER RF6','=A01+UH000-KF02Q','','','','','' -'MB1403','WEICHE ABZWEIG NACHPUFFER F0601-F0602 ','SW EXIT','=A01+UH000-KF02Q','','','','','' -'MB1434','ANPRESSEN NACHPUFFER F0601 FLYER 6','PRESS F0601','=A01+UH000-KF05Q','','','','','' -'MB1435','ANPRESSEN NACHPUFFER F0602 FLYER 6','PRESS F0602','=A01+UH000-KF05Q','','','','','' -'QA1431','ANTRIEB NACHPUFFER F0602 RF6','M-BI','=A01+UH000-KF05Q','','','','','>' -'MA1430','ANTRIEB NACHPUFFER F0601 RF6','M-BI','=A01+UH000-KF05Q','','','','','>' -'MB1404','ANPRESSEN PUFFER F0601 FLYER 6','PRESS F0601','=A01+UH000-KF02Q','','','','','' -'MB1405','ANPRESSEN PUFFER F0602 FLYER 6','PRESS F0602','=A01+UH000-KF02Q','','','','','' -'QA1421','ANTRIEB PUFFER F0602 FLYER 6','M-BI-RI','=A01+UH000-KF04Q','','','','','<' -'MA1420','ANTRIEB PUFFER F0601 FLYER 6','M-BI-LE','=A01+UH000-KF04Q','','','','','<' -'MB1427','WEICHE ABZWEIG EINFAHRT NACHP. RF 6','SW-BRANCH','=A01+UH000-KF04Q','','','','','' -'MB1426','WEICHE ABZWEIG EINFAHRT NACHP. RF 6','SW-STRAIGHT','=A01+UH000-KF04Q','','','','','' -'BG1401','SENSOR AUSFAHRT PUFFER F0602 FLYER 6','LT-EXIT F0602','=A01+UH000-KF03i','','','','','' -'BG1400','SENSOR AUSFAHRT PUFFER F0601 FLYER 6','LT-EXIT F0601','=A01+UH000-KF03i','','','','','' -'KF1415','IF RF 06: START SPULENWECHSEL 2','IF-RELAIS','=A01+UH000-KF03Q','IF RF 06: START SPULENWECHSEL 2','IF RF 06: START EXCHANGE 2','','','' -'DI1414','IF RF 06 : NEUE SPULE','IF-RELAIS','=A01+UH000-KF04i','IF RF 06: NEUE SPULE ','IF RF 06: NEW BOBBIN','','','' -'KF1414','IF RF 06: START SPULENWECHSEL 1','IF-RELAIS','=A01+UH000-KF03Q','IF RF 06: START SPULENWECHSEL 1','IF RF 06: START EXCHANGE 1','','','' -'PF1407','RUNDUMLEUCHTE STÖRUNG FLYER 6','LED-YE_FAULT','=A01+UH000-KF02Q','','','','','' -'SF1413','RESET FLYER 6','IPB-YE-NO','=A01+UH000-KF04i','RESET','RESET','RESET','','' -'PF1413','RESET FLYER 6','IPB-YE-LED','=A01+UH000-KF03Q','','','','','' -'SF1412','NOT HALT FLYER 6','EPB-NC','=A01+UH000-KF04i','NOT-HALT','E-STOP','E-STOP','','' -'BG1403','SENSOR ZUG IN DOFFER PM 6','LT-TRAIN IN DOF','=A01+UH000-KF03i','','','','','' -'BG1416','SENSOR SPULE IN POSITION FLYER 6','BOBBIN IN POS','=A01+UH000-KF04i','','','','','' -'BG1404','SENSOR ZUG IN DOFFER FLYER 6','LT-TRAIN IN DOF','=A01+UH000-KF03i','','','','','' -'MB1411','ABHEBEN ANTRIEBE PM 6','LIFT OFF RF 6','=A01+UH000-KF03Q','','','','','' -'MA1416','ANTRIEBE FLYER 6','M-BI','=A01+UH000-KF03Q','','','','','<' -'KF1295','IF RF 05: START SPULENWECHSEL 2','IF-RELAIS','=A01+UC102-KF05Q','IF RF 05: START SPULENWECHSEL 2','IF RF 05: START EXCHANGE 2','','','' -'DI1294','IF RF 05 : NEUE SPULE','IF-RELAIS','=A01+UC102-KF03i','IF RF 05: NEUE SPULE ','IF RF 05: NEW BOBBIN','','','' -'KF1294','IF RF 05: START SPULENWECHSEL 1','IF-RELAIS','=A01+UC102-KF05Q','IF RF 05: START SPULENWECHSEL 1','IF RF 05: START EXCHANGE 1','','','' -'PF1287','RUNDUMLEUCHTE STÖRUNG FLYER 5','LED-YE_FAULT','=A01+UC102-KF04Q','','','','','' -'SF1293','RESET FLYER 5','IPB-YE-NO','=A01+UC102-KF03i','RESET','RESET','RESET','','' -'PF1293','RESET FLYER 5','IPB-YE-LED','=A01+UC102-KF05Q','','','','','' -'SF1292','NOT HALT FLYER 5','EPB-NC','=A01+UC102-KF03i','NOT-HALT','E-STOP','E-STOP','','' -'BG1286','SENSOR AUSFAHRT NACHPUFFER F0502 RF 5','LT-EXIT F0502','=A01+UC102-KF02i','','','','','' -'BG1285','SENSOR AUSFAHRT NACHPUFFER F0501 RF 5','LT-EXIT F0501','=A01+UC102-KF02i','','','','','' -'BG1302','SENSOR HAUPTSTR. FB214','LT-FB214','=A01+UC102-KF04i','','','','','' -'BG1301','SENSOR HAUPTSTR. FB214','LT-FB214','=A01+UC102-KF04i','','','','','' -'MB1316','WEICHE ABZWEIG FB214','SW FB214','=A01+UC102-KF07Q','','','','','' -'MA1304','ANTRIEB HAUPTSTR. FB214','M-BI FB214','=A01+UC102-KF06Q','','','','','>' -'MA1302','ANTRIEB HAUPTSTR. FB213','M-BI FB213','=A01+UC102-KF06Q','','','','','<' -'MB1314','ANPRESSEN NACHPUFFER F0501 FLYER 5','PRESS F0501','=A01+UC102-KF07Q','','','','','' -'MB1315','ANPRESSEN NACHPUFFER F0502 FLYER 5','PRESS F0502','=A01+UC102-KF07Q','','','','','' -'QA1311','ANTRIEB NACHPUFFER F0502 FLYER 5','M-BI-RI','=A01+UC102-KF07Q','','','','','<' -'MA1310','ANTRIEB NACHPUFFER F0501 FLYER 5','M-BI-LE','=A01+UC102-KF07Q','','','','','<' -'MB1284','ANPRESSEN PUFFER F0501 FLYER 5','PRESS F0501','=A01+UC102-KF04Q','','','','','' -'MB1285','ANPRESSEN PUFFER F0502 FLYER 5','PRESS F0502','=A01+UC102-KF04Q','','','','','' -'QA1301','ANTRIEB PUFFER F0502 FLYER 5','M-BI-RI','=A01+UC102-KF06Q','','','','','<' -'MA1300','ANTRIEB PUFFER F0501 FLYER 5','M-BI-LE','=A01+UC102-KF06Q','','','','','<' -'BG1257','SENSOR HAUPTSTR. FLYER 4','LT-ENTER RF 4','=A01+UC102-KF01i','','','','','' -'BG1281','SENSOR AUSFAHRT PUFFER F0502 FLYER 5','LT-EXIT F0502','=A01+UC102-KF02i','','','','','' -'BG1280','SENSOR AUSFAHRT PUFFER F0501 FLYER 5','LT-EXIT F0501','=A01+UC102-KF02i','','','','','' -'MB1282','WEICHE ABZWEIG EINFAHRT RF 5','SW ENTER RF 5','=A01+UC102-KF04Q','','','','','' -'MB1281','WEICHE ABZWEIG EINFAHRT PUFFER F0502 FLYER 5','SW RF5 F502','=A01+UC102-KF04Q','','','','','' -'MB1280','WEICHE ABZWEIG EINFAHRT PUFFER RF 5','SW ENTER RF 5','=A01+UC102-KF04Q','','','','','' -'MB1307','WEICHE ABZWEIG EINFAHRT NACHP. RF 5','SW-BRANCH','=A01+UC102-KF06Q','','','','','' -'MB1306','WEICHE ABZWEIG EINFAHRT NACHP. RF 5','SW-STRAIGHT','=A01+UC102-KF06Q','','','','','' -'BG1296','SENSOR SPULE IN POSITION FLYER 5','BOBBIN IN POS','=A01+UC102-KF03i','','','','','' -'BG1284','SENSOR ZUG IN DOFFER FLYER 5','LT-TRAIN IN DOF','=A01+UC102-KF02i','','','','','' -'BG1283','SENSOR ZUG IN DOFFER PM 5','LT-TRAIN IN DOF','=A01+UC102-KF02i','','','','','' -'MB1291','ABHEBEN ANTRIEBE PM 5','LIFT OFF BS 5','=A01+UC102-KF05Q','','','','','' -'MA1296','ANTRIEBE FLYER 5','M-BI','=A01+UC102-KF05Q','','','','','>' -'MB1274','ANPRESSEN NACHPUFFER F0401 FLYER 4','PRESS F0401','=A01+UC102-KF03Q','','','','','' -'MB1275','ANPRESSEN NACHPUFFER F0402 FLYER 4','PRESS F0402','=A01+UC102-KF03Q','','','','','' -'QA1271','ANTRIEB NACHPUFFER F0402 FLYER 4','M-BI','=A01+UC102-KF03Q','','','','','>' -'MA1270','ANTRIEB NACHPUFFER F0401 FLYER 4','M-BI','=A01+UC102-KF03Q','','','','','>' -'MB1244','ANPRESSEN PUFFER F0401 FLYER 4','PRESS F0401','=A01+UC102-KF00Q','','','','','' -'MB1245','ANPRESSEN PUFFER F0402 FLYER 4','PRESS F0402','=A01+UC102-KF00Q','','','','','' -'QA1261','ANTRIEB PUFFER F0402 FLYER 4','M-BI-RI','=A01+UC102-KF02Q','','','','','<' -'MA1260','ANTRIEB PUFFER F0401 FLYER 4','M-BI-LE','=A01+UC102-KF02Q','','','','','<' -'MB1240','WEICHE ABZWEIG EINFAHRT FLYER 4','SW ENTER RF4','=A01+UC102-KF00Q','','','','','' -'MB1241','WEICHE ABZWEIG EINFAHRT FLYER 4 F0401','SW ENTER F0401','=A01+UC102-KF00Q','','','','','' -'MB1242','WEICHE ABZWEIG EINFAHRT RF 4','SW ENTER RF 4','=A01+UC102-KF00Q','','','','','' -'BG1246','SENSOR AUSFAHRT NACHPUFFER F0402 RF 4','LT-EXIT F0402','=A01+UC102-KF00i','','','','','' -'BG1245','SENSOR AUSFAHRT NACHPUFFER F0401 RF 4','LT-EXIT F0401','=A01+UC102-KF00i','','','','','' -'SF1251','HAUPTSCHALTER EIN +UC102','I-MS ON','=A01+UC102-KF01i','HAUPTSCHALTER EIN','MAIN SWITCH ON','','','' -'SF1250','MOTORSCHUTZSCHALTER HAT AUSGELÖST','I-CB OK','=A01+UC102-KF01i','MSS IN ORDNUNG','MPS OK','','','' -'PF1250','LM-ÜBERSTROM +UC102','IL-YE-LED','=A01+UC102-KF01Q','LM ÜBERSTROM','IL OVERCURRENT','','','' -'KF1255','IF RF 04: START SPULENWECHSEL 2','IF-RELAIS','=A01+UC102-KF01Q','IF RF 04: START SPULENWECHSEL 2','IF RF 04: START EXCHANGE 2','','','' -'DI1254','IF RF 04 : NEUE SPULE','IF-RELAIS','=A01+UC102-KF01i','IF RF 04: NEUE SPULE ','IF RF 04: NEW BOBBIN','','','' -'KF1254','IF RF 04: START SPULENWECHSEL 1','IF-RELAIS','=A01+UC102-KF01Q','IF RF 04: START SPULENWECHSEL 1','IF RF 04: START EXCHANGE 1','','','' -'PF1247','RUNDUMLEUCHTE STÖRUNG FLYER 4','LED-YE_FAULT','=A01+UC102-KF00Q','','','','','' -'SF1253','RESET FLYER 4','IPB-YE-NO','=A01+UC102-KF01i','RESET','RESET','RESET','','' -'PF1253','RESET FLYER 4','IPB-YE-LED','=A01+UC102-KF01Q','','','','','' -'SF1252','NOT HALT FLYER 4','EPB-NC','=A01+UC102-KF01i','NOT-HALT','E-STOP','E-STOP','','' -'MB1267','WEICHE ABZWEIG EINFAHRT NACHP. RF 4','SW-BRANCH','=A01+UC102-KF02Q','','','','','' -'MB1266','WEICHE ABZWEIG EINFAHRT NACHP. RF 4','SW-STRAIGHT','=A01+UC102-KF02Q','','','','','' -'BG1241','SENSOR AUSFAHRT PUFFER F0402 FLYER 4','LT-EXIT F0402','=A01+UC102-KF00i','','','','','' -'BG1240','SENSOR AUSFAHRT PUFFER F0401 FLYER 4','LT-EXIT F0401','=A01+UC102-KF00i','','','','','' -'BG1243','SENSOR ZUG IN DOFFER PM 4','LT-TRAIN IN DOF','=A01+UC102-KF00i','','','','','' -'BG1256','SENSOR SPULE IN POSITION FLYER 4','BOBBIN IN POS','=A01+UC102-KF01i','','','','','' -'BG1244','SENSOR ZUG IN DOFFER FLYER 4 ','LT-TRAIN IN DOF','=A01+UC102-KF00i','','','','','' -'MB1251','ABHEBEN ANTRIEBE PM 4','LIFT OFF RF 4','=A01+UC102-KF01Q','','','','','' -'MA1256','ANTRIEBE FLYER 4','M-BI','=A01+UC102-KF01Q','','','','','<' -'BG1141','SENSOR HAUPTSTR. FLYER 3 FB216','LT RF3 FB216','=A01+UC101-KF06i','','','','','' -'MB1147','WEICHE ABZWEIG EINFAHRT NACHP. RF 3','SW-BRANCH','=A01+UC101-KF10Q','','','','','' -'MB1146','WEICHE ABZWEIG EINFAHRT NACHP. RF 3','SW-STRAIGHT','=A01+UC101-KF10Q','','','','','' -'KF1135','IF RF 03: START SPULENWECHSEL 2','IF-RELAIS','=A01+UC101-KF09Q','IF RF 03: START SPULENWECHSEL 2','IF RF 03: START EXCHANGE 2','','','' -'DI1134','IF RF 03 : NEUE SPULE','IF-RELAIS','=A01+UC101-KF05i','IF RF 03: NEUE SPULE ','IF RF 03: NEW BOBBIN','','','' -'KF1134','IF RF 03: START SPULENWECHSEL 1','IF-RELAIS','=A01+UC101-KF09Q','IF RF 03: START SPULENWECHSEL 1','IF RF 03: START EXCHANGE 1','','','' -'PF1127','RUNDUMLEUCHTE STÖRUNG FLYER 3','LED-YE_FAULT','=A01+UC101-KF08Q','','','','','' -'SF1133','RESET FLYER 3','IPB-YE-NO','=A01+UC101-KF05i','RESET','RESET','RESET','','' -'PF1133','RESET FLYER 3','IPB-YE-LED','=A01+UC101-KF09Q','','','','','' -'SF1132','NOT HALT FLYER 3','EPB-NC','=A01+UC101-KF05i','NOT-HALT','E-STOP','E-STOP','','' -'BG1005','SENSOR AUSFAHRT NACHPUFFER F0101 RF 1','LT-EXIT F101 ','=A01+UC101-KF00i','','','','','' -'BG1126','SENSOR AUSFAHRT NACHPUFFER F0302 FLYER 3','LT-EXIT F0302','=A01+UC101-KF04i','','','','','' -'BG1125','SENSOR AUSFAHRT NACHPUFFER F0301 FLYER 3','LT-EXIT F0301','=A01+UC101-KF04i','','','','','' -'MB1122','WEICHE ABZWEIG EINFAHRT RF 3','SW ENTER RF 3','=A01+UC101-KF08Q','','','','','' -'MB1121','WEICHE ABZWEIG EINFAHRT PUFFER F0301 FLYER 3','SW ENTER F0301 ','=A01+UC101-KF08Q','','','','','' -'MB1143','WEICHE ABZWEIG EINFAHRT RF3 FB216 ','SW RF3 FB216','=A01+UC101-KF10Q','','','','','' -'MA1144','ANTRIEB HAUPTSTECKE FB215 ','M-BI FB215','=A01+UC101-KF10Q','','','','','<' -'MA1156','ANTRIEB HAUPTSTECKE FB216','M-BI FB216','=A01+UC101-KF11Q','','','','','>' -'MB1120','WEICHE ABZWEIG EINFAHRT FLYER 3 ','SW ENTER RF 3','=A01+UC101-KF08Q','','','','','' -'MB1154','ANPRESSEN NACHPUFFER F0301 FLYER 3','PRESS F0301','=A01+UC101-KF11Q','','','','','' -'MB1155','ANPRESSEN NACHPUFFER F0302 FLYER 3','PRESS F0302','=A01+UC101-KF11Q','','','','','' -'QA1151','ANTRIEB NACHPUFFER F0302 FLYER 3','M-BI','=A01+UC101-KF11Q','','','','','<' -'MA1150','ANTRIEB NACHPUFFER F0301 FLYER 3','M-BI','=A01+UC101-KF11Q','','','','','<' -'MB1124','ANPRESSEN PUFFER F0301 FLYER 3','PRESS F0301','=A01+UC101-KF08Q','','','','','' -'MB1125','ANPRESSEN PUFFER F0302 FLYER 3','PRESS F0302','=A01+UC101-KF08Q','','','','','' -'QA1141','ANTRIEB PUFFER F0301 FLYER 3','M-BI-RI','=A01+UC101-KF10Q','','','','','>' -'MA1140','ANTRIEB PUFFER F0301 FLYER 3','M-BI-LE','=A01+UC101-KF10Q','','','','','>' -'BG1121','SENSOR AUSFAHRT PUFFER F0302 FLYER 3','LT-EXIT F0302','=A01+UC101-KF04i','','','','','' -'BG1120','SENSOR AUSFAHRT PUFFER F0301 FLYER 3','LT-EXIT F0301','=A01+UC101-KF04i','','','','','' -'MB1131','ABHEBEN ANTRIEBE PM 3','LIFT OFF BS 3','=A01+UC101-KF09Q','','','','','' -'MA1136','ANTRIEBE FLYER 3','M-BI','=A01+UC101-KF09Q','','','','','>' -'BG1136','SENSOR SPULE IN POSITION FLYER 3 ','BOBBIN IN POS','=A01+UC101-KF05i','','','','','' -'BG1124','SENSOR ZUG IN DOFFER FLYER 3','LT-TRAIN IN DOF','=A01+UC101-KF04i','','','','','' -'BG1123','SENSOR ZUG IN DOFFER PM 3','LT-TRAIN IN DOF','=A01+UC101-KF04i','','','','','' -'MB1114','ANPRESSEN NACHPUFFER F0201 FLYER 2','PRESS F0201','=A01+UC101-KF07Q','','','','','' -'MB1115','ANPRESSEN NACHPUFFER F0202 FLYER 2','PRESS F0202','=A01+UC101-KF07Q','','','','','' -'QA1111','ANTRIEB NACHPUFFER F0202 FLYER 2','M-BI-RI','=A01+UC101-KF07Q','','','','','>' -'MA1110','ANTRIEB NACHPUFFER F0201 FLYER 2','M-BI-LE','=A01+UC101-KF07Q','','','','','<' -'MB1084','ANPRESSEN PUFFER F0201 FLYER 2','PRESS F0201','=A01+UC101-KF04Q','','','','','' -'MB1085','ANPRESSEN PUFFER F0202 FLYER 2','PRESS F0202','=A01+UC101-KF04Q','','','','','' -'QA1101','ANTRIEB PUFFER F0202 FLYER 2','M-BI-RI','=A01+UC101-KF06Q','','','','','<' -'MA1100','ANTRIEB PUFFER F0201 FLYER 2','M-BI-LE','=A01+UC101-KF06Q','','','','','<' -'BG1080','SENSOR AUSFAHRT PUFFER F0201 FLYER 2','LT-EXIT F0201','=A01+UC101-KF02i','','','','','' -'BG1081','SENSOR AUSFAHRT PUFFER F0202 FLYER 2','LT-EXIT F0202','=A01+UC101-KF02i','','','','','' -'MB1081','WEICHE ABZWEIG EINFAHRT PUFFER F0201 FLYER 2','SW ENTER F0201','=A01+UC101-KF04Q','','','','','' -'BG1086','SENSOR AUSFAHRT NACHPUFFER F0202 RF 2','LT-EXIT F0202','=A01+UC101-KF02i','','','','','' -'BG1085','SENSOR AUSFAHRT NACHPUFFER F0201 RF 2','LT-EXIT F0201','=A01+UC101-KF02i','','','','','' -'MB1082','WEICHE ABZWEIG EINFAHRT RF 2','SW ENTER RF 2','=A01+UC101-KF04Q','','','','','' -'BG1097','SENSOR HAUPTSTR. FLYER 2 ','LT-ENTER FB ','=A01+UC101-KF03i','','','','','' -'MB1080','WEICHE ABZWEIG EINFAHRT RF 2','SW ENTER RF2','=A01+UC101-KF04Q','','','','','' -'SF1091','HAUPTSCHALTER EIN +UC101','I-MS ON','=A01+UC101-KF03i','HAUPTSCHALTER EIN','MAIN SWITCH ON','','','' -'SF1090','MOTORSCHUTZSCHALTER HAT AUSGELÖST','I-CB OK','=A01+UC101-KF03i','MSS IN ORDNUNG','MPS OK','','','' -'PF1090','LM-ÜBERSTROM +UC101','IL-YE-LED','=A01+UC101-KF05Q','LM ÜBERSTROM','IL OVERCURRENT','','','' -'MB1107','WEICHE ABZWEIG EINFAHRT NACHP. RF 2','SW-BRANCH','=A01+UC101-KF06Q','','','','','' -'MB1106','WEICHE ABZWEIG EINFAHRT NACHP. RF 2','SW-STRAIGHT','=A01+UC101-KF06Q','','','','','' -'KF1095','IF RF 02: START SPULENWECHSEL 2','IF-RELAIS','=A01+UC101-KF05Q','IF RF 02: START SPULENWECHSEL 2','IF RF 02: START EXCHANGE 2','','','' -'DI1094','IF RF 02 : NEUE SPULE','IF-RELAIS','=A01+UC101-KF03i','IF RF 02: NEUE SPULE ','IF RF 02: NEW BOBBIN','','','' -'PF1087','RUNDUMLEUCHTE STÖRUNG FLYER 2','LED-YE_FAULT','=A01+UC101-KF04Q','','','','','' -'KF1094','IF RF 02: START SPULENWECHSEL 1','IF-RELAIS','=A01+UC101-KF05Q','IF RF 02: START SPULENWECHSEL 1','IF RF 02: START EXCHANGE 1','','','' -'SF1093','RESET FLYER 2','IPB-YE-NO','=A01+UC101-KF03i','RESET','RESET','RESET','','' -'PF1093','RESET FLYER 2','IPB-YE-LED','=A01+UC101-KF05Q','','','','','' -'SF1092','NOT HALT FLYER 2','EPB-NC','=A01+UC101-KF03i','NOT-HALT','E-STOP','E-STOP','','' -'BG1096','SENSOR SPULE IN POSITION FLYER 2 ','BOBBIN IN POS','=A01+UC101-KF03i','','','','','' -'BG1084','SENSOR ZUG IN DOFFER FLYER 2 ','LT-TRAIN IN DOF','=A01+UC101-KF02i','','','','','' -'BG1083','SENSOR ZUG IN DOFFER PM 2','LT-TRAIN IN DOF','=A01+UC101-KF02i','','','','','' -'MB1091','ABHEBEN ANTRIEBE PM 2','LIFT OFF RF 2','=A01+UC101-KF05Q','','','','','' -'MA1096','ANTRIEB FLYER 2','M-BI','=A01+UC101-KF05Q','','','','','<' -'QA1025','ANTRIEB HAUPTSTR. RF 1','M RF1','=A01+UC101-KF02Q','','','','','>' -'MA1024','ANTRIEB HAUPTSTR. RF 1','M RF1','=A01+UC101-KF02Q','','','','','>' -'MB1027','WEICHE ABZWEIG EINFAHRT NACHP. RF 1','SW-STRAIGHT','=A01+UC101-KF02Q','','','','','' -'MB1026','WEICHE ABZWEIG EINFAHRT NACHP. RF 1','SW-BRANCH','=A01+UC101-KF02Q','','','','','' -'PF1007','RUNDUMLEUCHTE STÖRUNG FLYER 1','LED-YE_FAULT','=A01+UC101-KF00Q','','','','','' -'SF1013','RESET FLYER 1','IPB-YE-NO','=A01+UC101-KF01i','RESET','RESET','RESET','','' -'PF1013','RESET FLYER 1','IPB-YE-LED','=A01+UC101-KF01Q','','','','','' -'SF1012','NOT HALT FLYER 1','EPB-NC','=A01+UC101-KF01i','NOT-HALT','E-STOP','E-STOP','','' -'KF1015','IF RF 01: START SPULENWECHSEL 2','IF-RELAIS','=A01+UC101-KF01Q','IF RF 01: START SPULENWECHSEL 2','IF RF 01: START EXCHANGE 2','CUANDO 01: LIBERAR CAMBIOS DE BOBINAS 2','','' -'DI1014','IF RF 01 : NEUE SPULE','IF-RELAIS','=A01+UC101-KF01i','IF RF 01: NEUE SPULE ','IF RF 01: NEW BOBBIN','CUANDO 01: LLAMAR NUEVA BOBINA','','' -'KF1014','IF RF 01: START SPULENWECHSEL 1','IF-RELAIS','=A01+UC101-KF01Q','IF RF 01: START SPULENWECHSEL 1','IF RF 01: START EXCHANGE 1','CUANDO 01: LIBERAR CAMBIOS DE BOBINAS 1','','' -'MB1034','ANPRESSEN NACHPUFFER F0101 FLYER 1','PRESS F0101','=A01+UC101-KF03Q','','','','','' -'MB1035','ANPRESSEN NACHPUFFER F0102 FLYER 1','PRESS F0102','=A01+UC101-KF03Q','','','','','' -'QA1031','ANTRIEB NACHPUFFER F0102 FLYER 1','M-BI','=A01+UC101-KF03Q','','','','','<' -'MA1030','ANTRIEB NACHPUFFER F0101 FLYER 1','M-BI','=A01+UC101-KF03Q','','','','','<' -'MB1004','ANPRESSEN PUFFER F0101 FLYER 1 ','PRESS F0101','=A01+UC101-KF00Q','','','','','' -'MB1005','ANPRESSEN PUFFER F0102 FLYER 1 ','PRESS F0102','=A01+UC101-KF00Q','','','','','' -'QA1021','ANTRIEB PUFFER F0102 FLYER 1','M-BI-RI','=A01+UC101-KF02Q','','','','','>' -'MA1020','ANTRIEB PUFFER F0101 FLYER 1','M-BI-LE','=A01+UC101-KF02Q','','','','','>' -'BG1000','SENSOR AUSFAHRT PUFFER F0101 FLYER 1','LT-EXIT F0101','=A01+UC101-KF00i','','','','','' -'BG1001','SENSOR AUSFAHRT PUFFER F0102 FLYER 1','LT-EXIT F0102','=A01+UC101-KF00i','','','','','' -'MB1001','WEICHE ABZWEIG EINFAHRT PUFFER F0101 FLYER 1','SW ENTER F0101','=A01+UC101-KF00Q','','','','','' -'MB1000','WEICHE ABZWEIG EINFAHRT RF 1','SW ENTER RF 1','=A01+UC101-KF00Q','','','','','' -'BG1006','SENSOR AUSFAHRT NACHPUFFER F0102 RF 1','LT-EXIT F102','=A01+UC101-KF00i','','','','','' -'MB1011','ABHEBEN ANTRIEBE PM 1 ','LIFT OFF BS 1','=A01+UC101-KF01Q','','','','','' -'BG1003','SENSOR ZUG IN DOFFER PM 1','LT-TRAIN IN DOF','=A01+UC101-KF00i','','','','','' -'MA1016','ANTRIEB FLYER 1 ','M-BI','=A01+UC101-KF01Q','','','','','>' -'BG1016','SENSOR SPULE IN POSITION RF 1','BOBBIN IN POS','=A01+UC101-KF01i','','','','','' -'BG1004','SENSOR ZUG IN DOFFER FLYER 1','LT-TRAIN IN DOF','=A01+UC101-KF00i','','','','','' -""" - - - textarray = textlines.splitlines() + args = parser.parse_args() + + + + + # Umgebungsvariablen + work_dir = os.environ.get("PROJECT_WORK") + config_dir = os.environ.get("PROJECT_CFG") + + # Wenn Input Pfad kein absoluter Pfad, dann in work nach Dateinamen suchen + if not os.path.isabs(args.input): + if work_dir: + args.input = os.path.join(work_dir, args.input) + + # Konfigurationsdatei + # config = configparser.ConfigParser(allow_no_value=True, delimiters=("=")) + # config.optionxform = lambda option: option # preserve case for letters + # config.read(os.path.join(config_dir, "xxxx.cfg")) + + # Datei einlesen + try: + with open(args.input, "r", encoding="utf-8") as f: + lines = f.readlines() + except Exception as e: + print(f"Fehler beim Lesen der Datei: {e}") + sys.exit(1) + + # Converter initialisieren + converter = ExcelConverter() + input_basename = os.path.splitext(os.path.basename(args.input))[0] + output_dir = os.environ.get("PROJECT_WORK", os.getcwd()) + + # Modus bestimmen + if args.mode: + export_mode = args.mode + + if export_mode == "WSCAD": + # WSCAD bleibt immer der Export-Typ + export_type = "WSCAD" if args.no_bezug else "WSCAD mit Bezug" + # Dateiname hängt vom --no-bezug-Flag ab + filename_suffix = "WSCAD_no_Bezug" if args.no_bezug else "WSCAD" + filename = f"{input_basename}_{filename_suffix}.xlsx" + export_path = args.output if args.output else os.path.join(output_dir, filename) + try: + converter.export_excel(lines, export_type, export_path) + print(f"Export {export_type} erfolgreich: {export_path}") + except Exception as e: + print(f"Fehler bei Export {export_type}: {e}") + else: + do_export(export_mode, output_dir) + else: + # Kein Modus → alle drei exportieren + do_export("EA", output_dir) + do_export("TIA", output_dir) + do_export("WSCAD", output_dir) - exporter = ExcelConverter() - for etype in export_type_arr: - export_path = f"work/excel_{etype}.xlsx" - exporter.export_excel(textarray, etype, export_path) \ No newline at end of file