unittests für Simpel, TIA, WSCAD hinzugefügt
This commit is contained in:
+285
-157
@@ -1,8 +1,7 @@
|
|||||||
import tkinter as tk
|
|
||||||
from tkinter import ttk, filedialog
|
|
||||||
import os
|
import os
|
||||||
import psutil # For listing drives, similar to Get-PSDrive in PowerShell
|
|
||||||
import pandas as pd # Required by ExcelConverter
|
import pandas as pd # Required by ExcelConverter
|
||||||
|
import unittest
|
||||||
|
import pandas.testing as pdt
|
||||||
|
|
||||||
# Assuming the ExcelConverter class from the previous turn is available and pasted here
|
# Assuming the ExcelConverter class from the previous turn is available and pasted here
|
||||||
class ExcelConverter:
|
class ExcelConverter:
|
||||||
@@ -34,8 +33,6 @@ class ExcelConverter:
|
|||||||
gleiche.append(zu_ueberpruefen_sorted[i])
|
gleiche.append(zu_ueberpruefen_sorted[i])
|
||||||
gleiche.append(zu_ueberpruefen_sorted[i+1])
|
gleiche.append(zu_ueberpruefen_sorted[i+1])
|
||||||
|
|
||||||
if not gleiche:
|
|
||||||
gleiche.append({'Name': 'Keine', 'Zeile': 'Alle'})
|
|
||||||
return gleiche
|
return gleiche
|
||||||
|
|
||||||
def _anschluesse_ergaenzen(self, anschluesse):
|
def _anschluesse_ergaenzen(self, anschluesse):
|
||||||
@@ -66,26 +63,23 @@ class ExcelConverter:
|
|||||||
new_entry = {
|
new_entry = {
|
||||||
'Name': new_name,
|
'Name': new_name,
|
||||||
'Kommentar': "",
|
'Kommentar': "",
|
||||||
'Bezug': "" if 'Bezug' in anschluss else "" # Füge 'Bezug' hinzu, falls es in der ursprünglichen Struktur vorhanden war
|
'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)
|
added_entries.append(new_entry)
|
||||||
|
|
||||||
anschluesse.extend(added_entries)
|
anschluesse.extend(added_entries)
|
||||||
return sorted(anschluesse, key=lambda x: x['Name'])
|
return sorted(anschluesse, key=lambda x: x['Name'])
|
||||||
|
|
||||||
|
def excel_datei_beschreiben_simpel(self, ursprungdatei, prefix_eingang, prefix_ausgang):
|
||||||
def excel_datei_beschreiben_simpel(self, pfad_ursprungsdatei, prefix_eingang, prefix_ausgang, ziel_datei):
|
|
||||||
"""
|
"""
|
||||||
Konvertiert Daten aus der Ursprungsdatei und schreibt sie in eine einfache Excel-Datei.
|
Konvertiert Daten aus der Ursprungsdatei und schreibt sie in eine einfache Excel-Datei.
|
||||||
Entspricht der PowerShell-Funktion ExcelDateiBeschreibenSimpel.
|
Eingänge und Ausgänge in seperaten dataframes; Fehler nicht enthalten
|
||||||
"""
|
"""
|
||||||
eingaenge = []
|
eingaenge = []
|
||||||
ausgaenge = []
|
ausgaenge = []
|
||||||
fehler = []
|
fehler = []
|
||||||
|
|
||||||
with open(pfad_ursprungsdatei, 'r', encoding='utf-8') as f:
|
|
||||||
ursprungdatei = f.readlines()
|
|
||||||
|
|
||||||
for i, eintrag in enumerate(ursprungdatei):
|
for i, eintrag in enumerate(ursprungdatei):
|
||||||
eintragszeile = eintrag.strip().split("'")
|
eintragszeile = eintrag.strip().split("'")
|
||||||
bmk_zahl_raw = eintragszeile[1].strip()
|
bmk_zahl_raw = eintragszeile[1].strip()
|
||||||
@@ -108,41 +102,38 @@ class ExcelConverter:
|
|||||||
name = bmk_formatted
|
name = bmk_formatted
|
||||||
fehler.append({'Name': name, 'Kommentar': kommentar, 'Zeile': i})
|
fehler.append({'Name': name, 'Kommentar': kommentar, 'Zeile': i})
|
||||||
|
|
||||||
df_fehler = pd.DataFrame(fehler).sort_values(by="Name")
|
df_fehler = pd.DataFrame(fehler)
|
||||||
|
if not df_fehler.empty:
|
||||||
|
df_fehler.sort_values(by="Name")
|
||||||
|
|
||||||
|
|
||||||
|
gleiche_eingaenge = self._gleiche_finden(eingaenge)
|
||||||
|
gleiche_ausgaenge = self._gleiche_finden(ausgaenge)
|
||||||
|
|
||||||
|
df_gleiche_eingaenge = pd.DataFrame(gleiche_eingaenge)
|
||||||
|
if not df_gleiche_eingaenge.empty:
|
||||||
|
df_gleiche_eingaenge.sort_values(by="Name")
|
||||||
|
|
||||||
|
df_gleiche_ausgaenge = pd.DataFrame(gleiche_ausgaenge)
|
||||||
|
if not df_gleiche_ausgaenge.empty:
|
||||||
|
df_gleiche_ausgaenge.sort_values(by="Name")
|
||||||
|
|
||||||
|
|
||||||
df_eingaenge = pd.DataFrame(eingaenge).sort_values(by="Name")
|
df_eingaenge = pd.DataFrame(eingaenge).sort_values(by="Name")
|
||||||
df_ausgaenge = pd.DataFrame(ausgaenge).sort_values(by="Name")
|
df_ausgaenge = pd.DataFrame(ausgaenge).sort_values(by="Name")
|
||||||
|
|
||||||
with pd.ExcelWriter(ziel_datei, engine='xlsxwriter') as writer:
|
|
||||||
start_row = 0
|
|
||||||
if not df_fehler.empty:
|
|
||||||
df_fehler.to_excel(writer, index=False, header=False, startrow=start_row, startcol=0)
|
|
||||||
start_row += len(df_fehler)
|
|
||||||
if not df_eingaenge.empty:
|
|
||||||
df_eingaenge.to_excel(writer, index=False, header=False, startrow=start_row, startcol=0)
|
|
||||||
start_row += len(df_eingaenge)
|
|
||||||
if not df_ausgaenge.empty:
|
|
||||||
df_ausgaenge.to_excel(writer, index=False, header=False, startrow=start_row, startcol=0)
|
|
||||||
|
|
||||||
gleiche_eingaenge = self._gleiche_finden(eingaenge)
|
return df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_eingaenge, df_ausgaenge
|
||||||
gleiche_ausgaenge = self._gleiche_finden(ausgaenge)
|
|
||||||
|
|
||||||
if not fehler:
|
def excel_datei_beschreiben_tia(self, ursprungdatei, prefix_eingang, prefix_ausgang):
|
||||||
fehler.append({'Name': 'Keine', 'Zeile': 'Alle'})
|
|
||||||
|
|
||||||
return gleiche_eingaenge, gleiche_ausgaenge, fehler
|
|
||||||
|
|
||||||
def excel_datei_beschreiben_tia(self, pfad_ursprungsdatei, prefix_eingang, prefix_ausgang, ziel_datei):
|
|
||||||
"""
|
"""
|
||||||
Konvertiert Daten für TIA Portal und schreibt sie in eine Excel-Datei mit zwei Blättern ("Constants" und "PLC Tags").
|
Konvertiert Daten für TIA Portal und schreibt sie in eine Excel-Datei mit zwei Blättern ("Constants" und "PLC Tags").
|
||||||
Entspricht der PowerShell-Funktion ExcelDateiBeschreibenTIA.
|
Eingänge und Ausgänge gemeinsam jeweils in consts und tags; Fehler ebenfalls mit Prefix 'Err' enthalten.
|
||||||
"""
|
"""
|
||||||
eingaenge = []
|
eingaenge = []
|
||||||
ausgaenge = []
|
ausgaenge = []
|
||||||
fehler = []
|
fehler = []
|
||||||
|
|
||||||
with open(pfad_ursprungsdatei, 'r', encoding='utf-8') as f:
|
|
||||||
ursprungdatei = f.readlines()
|
|
||||||
|
|
||||||
for i, eintrag in enumerate(ursprungdatei):
|
for i, eintrag in enumerate(ursprungdatei):
|
||||||
eintragszeile = eintrag.strip().split("'")
|
eintragszeile = eintrag.strip().split("'")
|
||||||
bmk_zahl_raw = eintragszeile[1].strip()
|
bmk_zahl_raw = eintragszeile[1].strip()
|
||||||
@@ -177,108 +168,122 @@ class ExcelConverter:
|
|||||||
'Zahl': int(bmk_numeric) if bmk_numeric else 0, # Convert to int
|
'Zahl': int(bmk_numeric) if bmk_numeric else 0, # Convert to int
|
||||||
'Zeile': i
|
'Zeile': i
|
||||||
})
|
})
|
||||||
else:
|
else: # Hier wird Fehlerhafte BMK behandelt
|
||||||
name = bmk_formatted
|
name = bmk_formatted
|
||||||
name_constant = "cErr" + bmk_zahl_raw
|
name_constant = "cErr" + bmk_zahl_raw
|
||||||
fehler.append({
|
fehler.append({
|
||||||
'Name': name,
|
'Name': name,
|
||||||
'NameOriginal': bmk_zahl_raw,
|
'NameOriginal': bmk_zahl_raw,
|
||||||
'NameConstant': name_constant,
|
'NameConstant': name_constant,
|
||||||
|
'Kommentar': "Fehlerhafte BMK", # 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
|
'Zahl': i, # Original PowerShell uses 'i' for Zahl in Fehler, not bmk_numeric
|
||||||
'Zeile': i
|
'Zeile': i
|
||||||
})
|
})
|
||||||
|
|
||||||
df_fehler = pd.DataFrame(fehler).sort_values(by="Zahl")
|
df_fehler = pd.DataFrame(fehler)
|
||||||
df_eingaenge = pd.DataFrame(eingaenge).sort_values(by="Zahl")
|
if not df_fehler.empty:
|
||||||
df_ausgaenge = pd.DataFrame(ausgaenge).sort_values(by="Zahl")
|
df_fehler.sort_values(by="Zahl")
|
||||||
|
|
||||||
with pd.ExcelWriter(ziel_datei, engine='xlsxwriter') as writer:
|
|
||||||
# Blatt "Constants"
|
|
||||||
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)
|
|
||||||
df_constants.to_excel(writer, sheet_name="Constants", index=False)
|
|
||||||
|
|
||||||
# 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": 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": 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": 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)
|
|
||||||
df_plc_tags.to_excel(writer, sheet_name="PLC Tags", index=False)
|
|
||||||
|
|
||||||
gleiche_eingaenge = self._gleiche_finden(eingaenge)
|
gleiche_eingaenge = self._gleiche_finden(eingaenge)
|
||||||
gleiche_ausgaenge = self._gleiche_finden(ausgaenge)
|
gleiche_ausgaenge = self._gleiche_finden(ausgaenge)
|
||||||
|
|
||||||
if not fehler:
|
df_gleiche_eingaenge = pd.DataFrame(gleiche_eingaenge)
|
||||||
fehler.append({'Name': 'Keine', 'Zeile': 'Alle'})
|
if not df_gleiche_eingaenge.empty:
|
||||||
|
df_gleiche_eingaenge.sort_values(by="Zahl")
|
||||||
|
|
||||||
return gleiche_eingaenge, gleiche_ausgaenge, fehler
|
df_gleiche_ausgaenge = pd.DataFrame(gleiche_ausgaenge)
|
||||||
|
if not df_gleiche_ausgaenge.empty:
|
||||||
|
df_gleiche_ausgaenge.sort_values(by="Zahl")
|
||||||
|
|
||||||
def excel_datei_beschreiben_wscad(self, pfad_ursprungsdatei, prefix_eingang, prefix_ausgang, ziel_datei):
|
df_eingaenge = pd.DataFrame(eingaenge).sort_values(by="Zahl")
|
||||||
|
df_ausgaenge = pd.DataFrame(ausgaenge).sort_values(by="Zahl")
|
||||||
|
|
||||||
|
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 'excel_datei_beschreiben_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": 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": 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": 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 excel_datei_beschreiben_wscad(self, ursprungdatei, prefix_eingang, prefix_ausgang):
|
||||||
"""
|
"""
|
||||||
Konvertiert Daten für WSCAD und schreibt sie in eine Excel-Datei.
|
Konvertiert Daten für WSCAD und schreibt sie in eine Excel-Datei.
|
||||||
Entspricht der PowerShell-Funktion ExcelDateiBeschreibenWSCAD.
|
Entspricht der PowerShell-Funktion ExcelDateiBeschreibenWSCAD.
|
||||||
@@ -287,9 +292,6 @@ class ExcelConverter:
|
|||||||
ausgaenge = []
|
ausgaenge = []
|
||||||
fehler = []
|
fehler = []
|
||||||
|
|
||||||
with open(pfad_ursprungsdatei, 'r', encoding='utf-8') as f:
|
|
||||||
ursprungdatei = f.readlines()
|
|
||||||
|
|
||||||
for i, eintrag in enumerate(ursprungdatei):
|
for i, eintrag in enumerate(ursprungdatei):
|
||||||
eintragszeile = eintrag.strip().split("'")
|
eintragszeile = eintrag.strip().split("'")
|
||||||
bmk_zahl_raw = eintragszeile[1].strip()
|
bmk_zahl_raw = eintragszeile[1].strip()
|
||||||
@@ -325,39 +327,27 @@ class ExcelConverter:
|
|||||||
eingaenge = self._anschluesse_ergaenzen(eingaenge)
|
eingaenge = self._anschluesse_ergaenzen(eingaenge)
|
||||||
ausgaenge = self._anschluesse_ergaenzen(ausgaenge)
|
ausgaenge = self._anschluesse_ergaenzen(ausgaenge)
|
||||||
|
|
||||||
df_fehler = pd.DataFrame(fehler).sort_values(by="Name")
|
df_fehler = pd.DataFrame(fehler)
|
||||||
df_eingaenge = pd.DataFrame(eingaenge).sort_values(by="Name")
|
if not df_fehler.empty:
|
||||||
df_ausgaenge = pd.DataFrame(ausgaenge).sort_values(by="Name")
|
df_fehler.sort_values(by="Name")
|
||||||
|
|
||||||
with pd.ExcelWriter(ziel_datei, engine='xlsxwriter') as writer:
|
|
||||||
workbook = writer.book
|
|
||||||
worksheet = writer.sheets[f'Sheet1'] # Standardblattname in xlsxwriter ist 'Sheet1'
|
|
||||||
|
|
||||||
headers = ["Anschluss", "Kommentar", "Symboltext", "Bezug", "Sondertext 1", "Sondertext 2", "Sondertext 3", "Sondertext 4", "Sondertext 5", "Sondertext 6", "Sondertext 7", "Sondertext 8"]
|
|
||||||
for col_num, header in enumerate(headers):
|
|
||||||
worksheet.write(0, col_num, header)
|
|
||||||
|
|
||||||
row_num = 1
|
|
||||||
for df in [df_fehler, df_eingaenge, df_ausgaenge]:
|
|
||||||
for _, data in df.iterrows():
|
|
||||||
worksheet.write(row_num, 0, data['Name'])
|
|
||||||
worksheet.write(row_num, 1, data['Kommentar'])
|
|
||||||
# Die restlichen Felder sind leer oder nicht in den ursprünglichen Daten
|
|
||||||
worksheet.write(row_num, 2, "") # Symboltext
|
|
||||||
worksheet.write(row_num, 3, "") # Bezug
|
|
||||||
for col_offset in range(5, 13): # Sondertext 1 bis 8
|
|
||||||
worksheet.write(row_num, col_offset-1, "")
|
|
||||||
row_num += 1
|
|
||||||
|
|
||||||
gleiche_eingaenge = self._gleiche_finden(eingaenge)
|
gleiche_eingaenge = self._gleiche_finden(eingaenge)
|
||||||
gleiche_ausgaenge = self._gleiche_finden(ausgaenge)
|
gleiche_ausgaenge = self._gleiche_finden(ausgaenge)
|
||||||
|
|
||||||
if not fehler:
|
df_gleiche_eingaenge = pd.DataFrame(gleiche_eingaenge)
|
||||||
fehler.append({'Name': 'Keine', 'Zeile': 'Alle'})
|
if not df_gleiche_eingaenge.empty:
|
||||||
|
df_gleiche_eingaenge.sort_values(by="Name")
|
||||||
|
|
||||||
return gleiche_eingaenge, gleiche_ausgaenge, fehler
|
df_gleiche_ausgaenge = pd.DataFrame(gleiche_ausgaenge)
|
||||||
|
if not df_gleiche_ausgaenge.empty:
|
||||||
|
df_gleiche_ausgaenge.sort_values(by="Name")
|
||||||
|
|
||||||
def excel_datei_beschreiben_wscad_bezug(self, pfad_ursprungsdatei, prefix_eingang, prefix_ausgang, ziel_datei):
|
df_eingaenge = pd.DataFrame(eingaenge).sort_values(by="Name")
|
||||||
|
df_ausgaenge = pd.DataFrame(ausgaenge).sort_values(by="Name")
|
||||||
|
|
||||||
|
return df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_eingaenge, df_ausgaenge
|
||||||
|
|
||||||
|
def excel_datei_beschreiben_wscad_bezug(self, pfad_ursprungsdatei, prefix_eingang, prefix_ausgang):
|
||||||
"""
|
"""
|
||||||
Konvertiert Daten für WSCAD mit Bezugsinformationen und schreibt sie in eine Excel-Datei.
|
Konvertiert Daten für WSCAD mit Bezugsinformationen und schreibt sie in eine Excel-Datei.
|
||||||
Entspricht der PowerShell-Funktion ExcelDateiBeschreibenWSCAD_Bezug.
|
Entspricht der PowerShell-Funktion ExcelDateiBeschreibenWSCAD_Bezug.
|
||||||
@@ -943,8 +933,146 @@ class IOConverterApp:
|
|||||||
print("Target file settings saved.")
|
print("Target file settings saved.")
|
||||||
print(self.target_file_configurations)
|
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.excel_datei_beschreiben_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.excel_datei_beschreiben_tia(
|
||||||
|
textlines, prefix_eingang, prefix_ausgang
|
||||||
|
)
|
||||||
|
return(df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_consts, df_tags)
|
||||||
|
|
||||||
|
elif konvertierungsart == "WSCAD":
|
||||||
|
df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_eingaenge, df_ausgaenge = ec.excel_datei_beschreiben_wscad(
|
||||||
|
textlines, prefix_eingang, prefix_ausgang
|
||||||
|
)
|
||||||
|
return(df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_eingaenge, df_ausgaenge)
|
||||||
|
elif konvertierungsart == "WSCAD mit Bezug":
|
||||||
|
gleiche_eingaenge, gleiche_ausgaenge, fehler = ec.excel_datei_beschreiben_wscad_bezug(
|
||||||
|
textlines, prefix_eingang, prefix_ausgang
|
||||||
|
)
|
||||||
|
|
||||||
|
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()
|
||||||
|
|
||||||
|
df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_eingaenge, df_ausgaenge = call_portal_to_excel(self, textarray, "Simpel")
|
||||||
|
|
||||||
|
#print(df_gleiche_eingaenge)
|
||||||
|
#print(df_ausgaenge)
|
||||||
|
|
||||||
|
#self.assertIn("DI0020", df_gleiche_eingaenge["Name"].values) # Püfen, ob doppelter Name in doppelteEingänge auftaucht
|
||||||
|
#self.assertIn("MA1020", df_gleiche_ausgaenge["Name"].values) # Püfen, ob doppelter Name in doppelteAusgänge auftaucht
|
||||||
|
self.assertEqual(len(df_fehler), 1) # Fehler anzeigen: Zeile 4 Prefix XY
|
||||||
|
|
||||||
|
self.assertEqual(len(df_eingaenge), 4) # Eigentlich 10 Zeilen lang, aber da Fehler nur 4 Eingänge
|
||||||
|
self.assertEqual(len(df_ausgaenge), 5) # 5 Ausgänge in Liste
|
||||||
|
|
||||||
|
|
||||||
|
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()
|
||||||
|
|
||||||
|
df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_consts, df_tags = call_portal_to_excel(self, textarray, "TIA")
|
||||||
|
|
||||||
|
#print(df_consts)
|
||||||
|
#print(df_tags)
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
self.assertEqual(len(df_consts), len(textarray)) # wird für jede Zeile ein consts bzw tags erstellt?
|
||||||
|
self.assertEqual(len(df_tags), len(textarray)) # VORSICHT: Fehler kommt auch in Ausgabe mit Prefix 'Err'
|
||||||
|
|
||||||
|
|
||||||
|
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()
|
||||||
|
|
||||||
|
df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_eingaenge, df_ausgaenge = call_portal_to_excel(self, textarray, "WSCAD")
|
||||||
|
|
||||||
|
#print(df_eingaenge)
|
||||||
|
#print(df_ausgaenge)
|
||||||
|
|
||||||
|
#self.assertIn("DI0020", df_gleiche_eingaenge["Name"].values) # Püfen, ob doppelter Name in doppelteEingänge auftaucht
|
||||||
|
#self.assertIn("MA1020", df_gleiche_ausgaenge["Name"].values) # Püfen, ob doppelter Name in doppelteAusgänge auftaucht
|
||||||
|
self.assertEqual(len(df_fehler), 1) # Fehler anzeigen: Zeile 4 Prefix XY
|
||||||
|
|
||||||
|
self.assertEqual(len(df_eingaenge), 4) # Eigentlich 10 Zeilen lang, aber da Fehler nur 4 Eingänge
|
||||||
|
self.assertEqual(len(df_ausgaenge), 5) # 5 Ausgänge in Liste
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
root = tk.Tk()
|
|
||||||
app = IOConverterApp(root)
|
suite = unittest.TestSuite()
|
||||||
root.mainloop()
|
suite.addTest(TestPlant('test_TIA'))
|
||||||
|
suite.addTest(TestPlant('test_Simpel'))
|
||||||
|
suite.addTest(TestPlant('test_WSCAD'))
|
||||||
|
|
||||||
|
runner = unittest.TextTestRunner()
|
||||||
|
runner.run(suite)
|
||||||
Reference in New Issue
Block a user