WinCC CSV schreiben von sich verändernden Strukturen

xEs1710

Level-2
Beiträge
57
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich bräuchte mal kurz eine Idee bzgl. Protokollierung und Rücklesen (per .CSV oder anders?) von sich ändernden Strukturen. Also von Projekt zu Projekt ändern sich die Strukturen auf die ich zugreife.

Hardware: Siemens CPU 1512C & ComfortPanel WinCC Advanced. TIA Portal V17 Upd 5.

Frage: Gibt es die Möglichkeit ganze Strukturen (UDT oder Struct) oder direkt DB in einem Rutsch zu sichern und wieder zu laden? Wie würdet ihr vorgehen wenn sich die Bereiche immer ändern? (Mal mehr, mal weniger; Mal vorhanden, mal nicht.)

Zwei Themen sollen damit erschlagen werden:
1.: Unser Kundendienst (hat nur Zugriff auf die WinCC Visualisierung) soll auf dieses BackUp (als .CSV?) zugreifen können, um aktuelle Parameter speichern und ggfls. wieder laden zu können. Einfach als reines BackUp.

2.: Und das ist das größere Problem -> Programmanpassungen finden über Austausch der MMC statt! Sprich: Die Programm-Anpassungen werden im Büro gemacht und die neue MMC muss als Austausch dem Kundendienst mitgegeben werden. Hier sind allerdings keine Parameter der fertigen IBN vorhanden bzw. Aktual-Werte der laufenden Anlage. Diese muss der Kundendienst sich irgendwie ("komfortabel") vor Ort vorab sichern, die MMC austauschen und im Anschluss die Parameter und Aktual-Werte wieder laden, sodass das neue Programm wieder mit den richtigen Parameter und Aktual-Werte läuft.

3.: Die eingestellten Parameter und Aktual-Werte müssen wieder zurück ins Büro gelangen, sodass ich diese komfortabel in das Offline-Projekt einlesen kann.

Größenordnung: ca. 200-300 Variablen versteckt in Strukturen.

Wie würdet ihr hier vorgehen, sodass ich nicht gefühlt Tage für ein Projekt bzgl. Scripting verplempern muss?

Besten Dank vorab!!

Beste Grüße
Sebastian
 
hallo,

wie ich das lese wären hier Rezepturen in deinem Panel ein Stichwort für dich hier kannst du grafisch deine Variablen verknüpfen und von der SPS laden und entweder als CSV Exportieren oder als Siemens Rezept abspeichern.

Gruß Stefan
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Programmanpassungen finden über Austausch der MMC statt!
Die Werte der Einstellparameter müssen also außerhalb der SPS gesichert und danach wieder zurückgeladen werden. Du hast ein Comfort Panel, das kannst Du dazu verwenden.
Üblicherweise sichert man Einstellwerte in Rezepturen. Wenn sich aber die Strukturen und Variablen bei den Updates stark ändern, dann sind Rezepturen nicht praktikabel. Dann braucht man was, was ganz einfach konfigurierbar ist.

Du könntest mit einem Skript die Werte aller gewünschten Variablen in eine Datei auf dem Comfort Panel sichern und nach dem Programmtausch auf die CPU zurückschreiben. Das hat auch noch den Vorteil, daß Du diese Datei mit den Werten einfach vom Comfort Panel ins Büro kopieren kannst.

Du könntest ein ganz einfaches Dateiformat wie bei INI-Dateien verwenden, mit je Variable einer Zeile in der Form <Variablenname>=<Wert>, z.B.
Code:
[Einstellwerte 20221104_123456]
Einstellwert_1=123.4
Einstellwert_2=5678.9
Motor1.Speed.F=50
Motor1.Speed.B=12
Motor3.Speed.F=49
Motor3.Speed.B=22
..

Im WinCC Projekt schreibst Du zwei Skripte, zum kopieren der Werte aus der SPS in eine Datei, und zum zurückkopieren aus der Datei in die SPS. Beispiel siehe hier in der FAQ: Protool/WinCCflex/TIA Daten lesen / schreiben mit VB-Script ab Beitrag #2 die Subs SettingsIniSpeichern(), SettingsIniLaden() und SetSysVar(). Wie lange die Skripte für 300 Variablen in 300 Zeilen brauchen habe ich allerdings keine Erfahrung.

Im Prinzip musst Du im Skript SettingsIniSpeichern() für jede Variable je eine Programmzeile schreiben, die den Name und den aktuellen Wert (*) einer HMI-Variable (SmartTags) in die Datei schreibt:
Code:
        f.Open inifile, ForWriting
        f.LinePrint "[Einstellwerte Anlage XYZ 20221104_123456]"  '<-- nur als Info, z.B. einen passenden Text aus Datum+Uhrzeit basteln

        f.LinePrint "Einstellwert_1=" & SmartTags("Einstellwert_1")
        f.LinePrint "Einstellwert_2=" & SmartTags("Einstellwert_2")
        f.LinePrint "Motor1.Speed.F=" & SmartTags("Motor1.Speed.F")
        f.LinePrint "Motor1.Speed.B=" & SmartTags("Motor1.Speed.B")
        f.LinePrint "Motor3.Speed.F=" & SmartTags("Motor3.Speed.F")
        f.LinePrint "Motor3.Speed.B=" & SmartTags("Motor3.Speed.B")
        ...
        f.Close
und im Skript SetSysVar() je eine Zeile für das zurückschreiben der Werte aus der Datei in die SPS:
Code:
    Select Case varname
        Case "Einstellwert_1"   SmartTags("Einstellwert_1") = svalue
        Case "Einstellwert_2"   SmartTags("Einstellwert_2") = svalue
        Case "Motor1.Speed.F"   SmartTags("Motor1.Speed.F") = svalue
        Case "Motor1.Speed.B"   SmartTags("Motor1.Speed.B") = svalue
        Case "Motor3.Speed.F"   SmartTags("Motor3.Speed.F") = svalue
        Case "Motor3.Speed.B"   SmartTags("Motor3.Speed.B") = svalue
        ...
    End Select

erzeuge ich Zeit-Strings immer unabhängig von den regionalen Settings mit der DatePart-Funktion:
Code:
' aus der Systemzeit einen String in der Form "31.12.2099 01:59:59" erzeugen
Dim t, s
t = Now ' Systemzeit
s = Right("0" & DatePart("d", t), 2) & "." & Right("0" & DatePart("m", t), 2) & "." & DatePart("yyyy", t) & " " _
  & Right("0" & DatePart("h", t), 2) & ":" & Right("0" & DatePart("n", t), 2) & ":" & Right("0" & DatePart("s", t), 2)

Datum_Uhrzeit-String für Dateinamen erzeugen:
Code:
' aus der Systemzeit einen String in der Form "20991231_015959" erzeugen
Dim t, s
t = Now ' Systemzeit
s = DatePart("yyyy", t) & Right("0" & DatePart("m", t), 2) & Right("0" & DatePart("d", t), 2) & "_" _
  & Right("0" & DatePart("h", t), 2) & Right("0" & DatePart("n", t), 2) & Right("0" & DatePart("s", t), 2)
oder geht auch so
Code:
' aus der Systemzeit einen String in der Form "20991231_015959" erzeugen
Dim t, s
t = Now ' Systemzeit
s = Year(t) & Right("0" & Month(t), 2) & Right("0" & Day(t), 2) & "_" _
  & Right("0" & Hour(t), 2) & Right("0" & Minute(t), 2) & Right("0" & Second(t), 2)

Die Skripte soll der Servicemann mit 2 Buttons auf einem Service-Bild auf dem Comfort Panel aufrufen. Das Zurückschreiben am besten Passwort-geschützt. Tipp: anstatt die INI-Datei im FLASH des Comfort Panels zu speichern, auf einen angesteckten USB-Stick oder Speicherkarte speichern.

Jede SPS-Variable, die gesichert und zurückgeschrieben werden soll, muß eine HMI-Variable im WinCC-Projekt haben.
Die Variablennamen der HMI-Variablen ändern sich aber nicht von Version zu Version Deiner SPS-Programme?
Falls auch HMI-Variablen umbenannt werden, dann ggf. in der INI-Datei die Variablennamen editieren, falls die INI-Datei mit einer älteren Version des WinCC Projektes erstellt wurde und in der neueren Version auf Variablen mit mittlerweile anderen Namen zurückgeschrieben werden soll.
Es ist auch möglich, manuell die INI-Datei zu editieren (z.B. mit Notepad) und z.B. Zeilen für weitere HMI-Variablen und deren gewünschte Werte zuzufügen oder Zeilen zu löschen. Die Reihenfolge der Zeilen in der INI-Datei ist beliebig und darf sich zwischen Datei schreiben und wieder einlesen ändern.

Die Skripte kannst Du auch noch ausbauen, um z.B. in einer weiteren Datei die Namen der gewünschten HMI-Variablen zu hinterlegen, damit nicht die beiden Skripte jedesmal angepasst werden müssen. Du könntest auch einen Auswahldialog für den Dateiname hinzufügen.


(*) Das garantiert aktualisierte Einlesen der Werte der HMI-Variablen aus der SPS ins HMI-Panel ist nicht ganz einfach, weil die WinCC Runtime die Werte nur bei Bedarf liest, und das ist immer erst nachdem die Runtime von der Verwendung der HMI-Variablen weiß. Da wird die Aktualisierung der Variablen angestossen, das Skript wartet aber nicht auf das erfolgreiche Lesen der Werte. Und die Runtime gibt keine Endemeldung wenn das Einlesen abgeschlossen ist. Das geht nur bei Rezepturen oder mit selbstgebastelten aufwendigen Handshakes. Man kann aber eines tun: das Skript SettingsIniSpeichern() zweimal im Abstand von 30...90 Sekunden aufrufen. Dann wird beim ersten Aufruf für jede HMI-Variable (SmartTags) das Lesen angestossen, und erstmal irgendein alter oder initial-Wert in die Datei geschrieben. Beim zweiten Aufruf des Skriptes sind (hoffentlich) alle Variablen aktualisiert und nun werden die richtigen Werte in die Datei geschrieben. Die mit den HMI-Variablen verbundenen PLC-Variablen in der SPS dürfen sich in der Zwischenzeit nicht ändern. Zur Sicherheit könnte man im Abstand von einer Minute das Skript immer wieder aufrufen und jeweils in eine andere INI-Datei schreiben, und danach den Inhalt der Datei mit der zuvor geschriebenen Datei vergleichen, solange bis die Dateien gleich sind. Da sollten alle Variablenwerte korrekt in der INI-Datei stehen. Wenn man ganz sicher gehen will, dann muß man alle Variablen in eine Rezeptur packen und die Rezepturvariablen mit GetDataRecordTagsFromPLC ins HMI lesen, da gibt es dann eine Fertigmeldung wenn alle Variablen gelesen wurden. siehe Forumssuche nach GetDataRecordTagsFromPLC

Hinweis: Deine Skriptlösung im Büro ausgiebig austesten, bevor Du sie an produktiven SPS-Analgen anwendest.

Harald
 
Zuletzt bearbeitet:
Code:
    Select Case varname
        Case "Einstellwert_1"   SmartTags("Einstellwert_1") = svalue
        Case "Einstellwert_2"   SmartTags("Einstellwert_2") = svalue
        Case "Motor1.Speed.F"   SmartTags("Motor1.Speed.F") = svalue
        Case "Motor1.Speed.B"   SmartTags("Motor1.Speed.B") = svalue
        Case "Motor3.Speed.F"   SmartTags("Motor3.Speed.F") = svalue
        Case "Motor3.Speed.B"   SmartTags("Motor3.Speed.B") = svalue
        ...
    End Select
eventuell kann man das auch stark abkürzen, indem man einfach nur eine Zeile schreibt:
Code:
    SmartTags(varname) = svalue
Das habe ich aber nicht ausprobiert.
Damit könnte man jede beliebige existierende HMI-Variable mit einem Wert aus der Datei beschreiben.

Harald
 
Guten Morgen!
Vielen Dank das hat mir schon sehr geholfen! Ich werde das Ganze mal so aufbauen und mich ausprobieren. Melde mich dazu mal mit meiner Lösung, ob und wie das für mich geklappt hat.

Kennt Ihr eine geeignete Seite wo man sich VBS gut selbst aneignen kann? Gerne so eine Anleitung "Von 0 auf 100.." ;-)
Besten Dank!

Beste Grüße
Sebastian
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Welche VBS-Informationen und VBS-Programmierhilfen gibt es in WinCC (TIA Portal)?

Im WinCC flexible Information System war eine komplette VBS-Referenz (Microsoft Visual Basic Scripting Edition) voll integriert:
- VBScript-Benutzerhandbuch
- VBScript-Sprachverzeichnis
- Scripting-Laufzeitreferenz

Hier kann man sich eine "Windows Script Host Referenz" als CHM-Hilfedatei herunterladen, diese enthält auch die VBScript-Referenzen wie bei WinCCflex.

siehe auch mal Tipps und Tricks für das Erstellen von Skripten in WinCC (TIA Portal)

FAQ: Protool/WinCCflex/TIA Daten lesen / schreiben mit VB-Script

Harald
 
Zurück
Oben