In TIA-Export und WSCAD-Export den Kommentar zu fehlerhaften BMK's angepasst, sodass BMK genannt wird.

Ausgelagerte Funktion für Duplikate und Error-Sheet erstellt und bei allen Export-Funktionen eingebaut
This commit is contained in:
2025-07-04 09:19:19 +02:00
parent e329dc9f3a
commit ca2831ea23
+50 -44
View File
@@ -254,7 +254,7 @@ class ExcelConverter:
'Name': name,
'NameOriginal': bmk_zahl_raw,
'NameConstant': name_constant,
'Kommentar': "Fehlerhafte BMK", # Zeile von Lorenz eingefügt, da sonst pandas mit Fehler, da kein Kommentar
'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
})
@@ -398,7 +398,7 @@ class ExcelConverter:
ausgaenge.append({'Name': name, 'Kommentar': kommentar, 'Zeile': i, 'Bezug': bezug})
else:
name = bmk_formatted
fehler.append({'Name': name, 'Kommentar': kommentar, 'Zeile': i, 'Bezug': bezug})
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)
@@ -459,19 +459,8 @@ class ExcelConverter:
# Ausgaenge direkt drunter schreiben (ohne Header)
df_ausgaenge.to_excel(writer, sheet_name='Ein-, Ausgaenge', index=False, startrow=start_row, header=False)
# Sheet mit Duplikaten
start_row = 0
# Gleiche Eingänge
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 # Leerzeile
# Gleiche Ausgänge
if not df_gleiche_ausgaenge.empty:
df_gleiche_ausgaenge.to_excel(writer, sheet_name='Duplikate', index=False, startrow=start_row, header=False)
# Fehler in eigenem Sheet
if not df_fehler.empty:
df_fehler.to_excel(writer, sheet_name='Fehler', index=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
@@ -483,20 +472,9 @@ class ExcelConverter:
# 2. 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)
# Duplikate in "Duplikate" Sheet
start_row = 0
if not df_gleiche_eingaenge.empty or not df_gleiche_ausgaenge.empty:
# Gleiche Eingänge
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
# Gleiche Ausgänge
if not df_gleiche_ausgaenge.empty:
df_gleiche_ausgaenge.to_excel(writer, sheet_name='Duplikate', index=False, startrow=start_row, header=False)
# Duplikate und Errors
self._write_duplicates_errors(writer, df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler)
# Fehler in eigenem Sheet
if not df_fehler.empty:
df_fehler.to_excel(writer, sheet_name='Fehler', index=False)
elif export_type == "WSCAD":
df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_eingaenge, df_ausgaenge = dataframes
@@ -525,8 +503,12 @@ class ExcelConverter:
with pd.ExcelWriter(export_path, engine="openpyxl") as writer:
df_result.to_excel(writer, index=False, sheet_name="WSCAD")
# Duplikate und Errors
self._write_duplicates_errors(writer, df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler)
elif export_type == "WSCAD mit Bezug":
df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_eingaenge, df_ausgaenge = dataframes
# Basis-Template
@@ -547,13 +529,15 @@ class ExcelConverter:
]
)
df_result = self._append_df(df_result, df_fehler)
df_result = self._append_df(df_result, df_eingaenge)
df_result = self._append_df(df_result, df_ausgaenge)
df_result = self._append_df(df_result, df_fehler, include_bezug=True)
df_result = self._append_df(df_result, df_eingaenge, include_bezug=True)
df_result = self._append_df(df_result, df_ausgaenge, include_bezug=True)
with pd.ExcelWriter(export_path, engine="openpyxl") as writer:
df_result.to_excel(writer, index=False, sheet_name="WSCAD")
# 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
@@ -563,7 +547,7 @@ class ExcelConverter:
"Anschluss": source_df["Name"],
"Kommentar": source_df["Kommentar"],
"Symboltext": "",
"Bezug": source_df["Bezug"] if include_bezug else "",
"Bezug": source_df["Bezug"].apply(lambda x: f"'{x}" if pd.notna(x) else "") if include_bezug else "",
"Sondertext 1": "",
"Sondertext 2": "",
"Sondertext 3": "",
@@ -576,6 +560,30 @@ class ExcelConverter:
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
@@ -1147,10 +1155,10 @@ class TestPlant(unittest.TestCase):
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 Eingänge:\n")
# print(df_eingaenge)
# print("\n Ausgänge:\n")
# print(df_ausgaenge)
# print("\n gleiche Eingänge:\n")
# print(df_gleiche_eingaenge)
@@ -1162,8 +1170,6 @@ class TestPlant(unittest.TestCase):
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',''
@@ -1219,10 +1225,10 @@ class TestPlant(unittest.TestCase):
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 Eingänge:\n")
print(df_eingaenge)
print("\n Ausgänge:\n")
print(df_ausgaenge)
# print("\n Fehler")
# print(df_fehler)
@@ -1243,7 +1249,7 @@ if __name__ == "__main__":
runner = unittest.TextTestRunner()
runner.run(suite)
export_type_arr = ("Simpel", "TIA", "WSCAD", "WSCAD mit Bezug") # oder "WSCAD", etc.
export_type_arr = ("Simpel", "TIA", "WSCAD", "WSCAD mit Bezug")
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',''