TIA Logging über Panel-Skript in CSV mit Datenkonsistenz (ev. mittels Rezeptur)

LehnerTh

Level-2
Beiträge
64
Reaktionspunkte
7
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebes Forum!

Ich habe ein Problem beim Loggen von Maschiendaten über ein Comfortpanel in eine CSV-Datei.

Meine Vorgehensweise:
Fertige Daten (10 Prozesswerte) in einen Struct schreiben.
Flag zum Loggen setzen.
Dieses Flag löst mit Wertänderung im Panel ein Skript aus.
In dem Skript werden die SmartTags abgegriffen und in eine CSV gefüllt.
Das Skript setzt dann das Flag zurück.

Nun kommt es öfter mal vor, dass statt einem neuen Datensatz der vorherige geschrieben wird.
Oder es sind ein paar der 10 Werte neu, die anderen aber noch vom alten Datensatz... Also äußerst blöd.

Ich glaube, dass das Problem durch die asynchrone Abarbeitung des Panels auftritt.
(Also auch wenn ich das Flag nach den Daten setze, kann ich durch die Asynchronität nicht sicher sein, dass der Datensatz im Panel sicher aktualisiert wurde).
Bisher habe ich zur "Umgehung" des Problems eine Verzögerung von 200ms eingebaut, bevor ich das Flag setze.

Also meine Frage:
Gibt es Möglichkeiten um Daten sicher konsistent zu übertragen?
Ich habe seitens Siemens mal gehört, dass das nur mit Rezepten möglich ist, man korregiere mich bitte wenn das falsch ist.
Es wäre kein Problem Rezepte zu verwenden, allerdings finde ich keine Syntax um im Skript einzelne Rezepturwerte abzugreifen?

Oder wie macht Ihr das sonst? :confused:

LG, Thomas


Achja:
Siemens TIA V14 SP1 Update1
CPU 1510SP-1 PN
TP1900 Comfort
 
Hallo Thomas,

eine Möglichkeit ist die Aktualisierung der Variabeln über die Aktualisierungskennung (siehe Bild).
Nach der letzten Variabel kann man den Skript aufrufen. Ich habe aber auch im Skript, zum schreiben in CSV, noch eine Wartezeit von 200ms eingebaut.


Harald
Aktualisierugskennung.jpg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
"AktualisiereVariable" ist keine sichere Lösung für das Problem, weil man keine Rückmeldung erhält, ob/wann die Variable aktualisiert wurde. Außerdem ist "AktualisiereVariable" nicht in Skripten verwendbar.

Nur beim Lesen einer Rezeptur bekommt man eine Fertigmeldung (siehe Hilfe zu GetDataRecordTagsFromPLC). Man kann im Skript auf die Fertigmeldung warten (solange werden aber keine anderen Skripte ausgeführt!) oder besser die Wertänderung der Fertigmeldevariable triggern.

Beispiel: alle Variablen einer Rezeptur lesen und auf Fertigmeldung warten:
Code:
Dim rdStat

[COLOR="green"]' Variablen aus SPS lesen mit Fertigmeldung[/COLOR]
GetDataRecordTagsFromPLC "meineRezeptur", SmartTags("Lesestatus")
[COLOR="green"]' in Schleife auf Ende Var-Lesen warten[/COLOR]
Do
    rdStat = SmartTags("Lesestatus")
Loop While (rdStat And 4) = 0 [COLOR="green"]' 4=fertig OK / 12=abgebrochen mit Fehler[/COLOR]

If rdStat = 4 Then
    [COLOR="green"]' gerade gelesene Variablen verarbeiten[/COLOR]
    [COLOR="green"]' ...[/COLOR]
End If

Schau mal hier:
da lauern noch mehr Fallstricke. Die vielen Daten aus dem DB bekommt man nur als Rezeptur sicher ins HMI gelesen, suche mal nach GetDataRecordTagsFromPLC
oder schau hier:
Wincc flexible 2008 CSV Datei schreiben per Script
Daten aus DB in csv-Datei schreiben
https://www.sps-forum.de/simatic/80829-hmi-daten-aus-sps-mit-vb-auslesen.html#post609907
hier hatte ich mal das lesen von mehreren KByte aus der SPS und schreiben in csv-Datei beschrieben:
Prozessdaten einer CPU 317 auf Speicherkarte eines TP277 6'' speichern

Harald
 
Hallo Harald&Harald, danke für eure Antworten ;)

@Harald1
Deine Idee ist gut, allerdings ist, soweit ich weis, nicht gewährleistet dass die Ereignisse auch in der Reihenfolge abgearbeitet werden wie sie in der Liste sind.
Dadurch wirst du auch den 200ms Timer brauchen.

@Harald2
Das mit dem GetDataRecordTagsFromPLC wusst ich schon, nach studieren deiner Snippets hab ich mein Problem gefunden:
Ich dachte immer, dass ich nach der Aktualisierung irgendwie auf das Rezept direkt zugreifen muss... Dabei geht es doch nur um die "normalen" Tags...
So einfach wärs gewesen :rolleyes:

Bei einem kurzen Test mit ein paar 100 Sätzen hat es gut funktioniert, ich werde später nochmal ein paar 1000 durchjagen.

Danke an euch! :p
 
Hallo Thomas,

in der Hilfe von TIA V14 steht folgendes:

Abarbeitung der Funktionsliste in Runtime

Prinzip

Eine Funktionsliste wird in Runtime von oben nach unten abgearbeitet. Damit es während der Abarbeitung nicht zu Wartezeiten kommt, wird zwischen synchroner Abarbeitung und asynchroner Abarbeitung unterschieden. Die Unterscheidung wird vom System getroffen, indem es die verschiedenen Laufzeiten der Systemfunktionen auswertet. Benutzerdefinierte Funktionen werden unabhängig von der Laufzeit stets synchron abgearbeitet. Wenn eine Systemfunktion einen Fehlerstatus zurückgibt, wird die Abarbeitung der Funktionsliste abgebrochen.

Synchrone Abarbeitung

Bei der synchronen Abarbeitung werden die Systemfunktionen in einer Funktionsliste nacheinander ausgeführt. Damit eine Systemfunktion ausgeführt wird, muss die vorhergehende Systemfunktion beendet sein.

Asynchrone Abarbeitung

Systemfunktionen, die Dateioperationen wie Speichern oder Lesen ausführen, haben eine längere Laufzeit als Systemfunktionen, die z. B. einen Variablenwert setzen.
Systemfunktionen mit längerer Laufzeit werden deshalb asynchron ausgeführt. Während eine Systemfunktion z. B. einen Rezepturdatensatz auf ein Speichermedium schreibt, wird bereits die nächste Systemfunktion ausgeführt. Durch die parallele Abarbeitung der Systemfunktionen werden Wartezeiten am Bediengerät vermieden.

Nach Auskunft bei Siemens (V14 ohne SP1) wird das aktualisieren mittels Aktualisierungskennung synchron abgearbeitet.
Die 200ms waren nur zur Sicherheit.


Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Harald2
Das mit dem GetDataRecordTagsFromPLC wusst ich schon, nach studieren deiner Snippets hab ich mein Problem gefunden:
Ich dachte immer, dass ich nach der Aktualisierung irgendwie auf das Rezept direkt zugreifen muss... Dabei geht es doch nur um die "normalen" Tags...
So einfach wärs gewesen :rolleyes:
Ja! so einfach ist das :D :cool:
Doch viele Programmierer haben keine Lust auf den "riesigen" Aufwand, die gewünschten Variablen in eine Rezeptur zu projektieren und hoffen daß es auch ohne geht, oder sie wissen es einfach nicht besser und testen auch nicht gründlich genug. :cry:


eine Möglichkeit ist die Aktualisierung der Variabeln über die Aktualisierungskennung (siehe Bild).
Nach der letzten Variabel kann man den Skript aufrufen. Ich habe aber auch im Skript, zum schreiben in CSV, noch eine Wartezeit von 200ms eingebaut.
Die 200ms waren nur zur Sicherheit.
Auch nach 2000ms "Sicherheit" ist nicht garantiert, daß die Variablen aktualisiert wurden.
Vielleicht herrscht gerade hohe Kommunikationslast und es dauert länger oder die Variable gibt es nicht in der SPS (z.B. DB fehlt) oder es gibt Verbindungsstörungen. Über diese Probleme bekommst Du keine Rückmeldung und Du loggst dann fröhlich uralte Werte oder 0-Werte und denkst alles ist richtig ...

Ob die Systemfunktionen genau in der angegebenen Reihenfolge abgearbeitet werden ist dabei unwichtig.

Ich meine, die Systemfunktion "AktualisiereVariable" wartet nicht bis die Variable gelesen wurde - sie stößt nur einen Leseauftrag an. Doch selbst falls sie wartet bringt es nichts weil man über den Erfolg oder Misserfolg der Aktualisierung keine Rückmeldung bekommt.

Harald
 
eine Möglichkeit ist die Aktualisierung der Variabeln über die Aktualisierungskennung (siehe Bild).
Nach der letzten Variabel kann man den Skript aufrufen.

Anhang anzeigen 38575
Hallo Harald,

trenne mal die Verbindung Deines Panels zur PLC und starte Deine Aktualisierungs-Funktionsliste - wird ein Skript am Ende der Funktionsliste aufgerufen?
Bei TIA V13 SP1 wird das Skript am Ende aufgerufen, auch wenn einzelne oder alle Variablen nicht aktualisiert werden konnten.

Harald
 
Guten Morgen!

Ich hab mir das Skript jetzt genauer angeschaut und festgestellt, dass es nur zufällig funktioniert hat...
Mir ist auch nicht ganz klar, wie der Befehl GetDataRecordTagsFromPLC funktioniert.

Ich habs ungefähr so wie in Harald's Snippet implementiert, also erst die Funktion aufgerufen mit einem retVal für den Lesestatus, dann eine Schleife bis retVal ok (=4) ist.
Beim Debuggen wird aber retVal immer als 'Empty' angezeigt.
Wäre verständlich, da die GetDataRecordTagsFromPLC nur einmal vor der Schleife aufgerufen wird, direkt beim Aufruf wahrscheinlich noch nichtmal auf 'Busy' geht und dann retVal nicht mehr aktualisiert wird.
Aber wie soll das dann funktionieren?

LG Thomas
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Schleife umfasst die Zeilen von "Do" bis "Loop While ..."
Es wird in jedem Schleifendurchlauf erst von der HMI-Variable "Lesestatus" auf die Skript-Variable "rdStat" umgespeichert und dann der Inhalt von "rdStat" ausgewertet.

Daß sich der Inhalt von der HMI-Variable "Lesestatus" ändert liegt daran, weil diese Variable bei GetDataRecordTagsFromPLC als Statusvariable angegeben ist. GetDataRecordTagsFromPLC arbeitet asynchron, die Funktion löst das Lesen der Rezeptur nur aus und kommt dann zurück ins Skript - sie wartet nicht auf das Ende des Variablen-Lesens. Wenn die WinCC Runtime das Lesen der Variablen abgeschlossen hat, dann schreibt sie den Wert 4 (oder 12) in die Statusvariable (die HMI-Variable "Lesestatus").

Man kann im Skript auf die Wertänderung der HMI-Variable warten (einfach und verständlich) oder das Skript beenden und bei "Wertänderung" der HMI-Variable ein Fortsetzungs-Skript aufrufen (Ressourcen-schonend, ermöglicht die Bearbeitung anderer Skripte in der Wartezeit).

Harald
 
Achso, jetzt hab ichs.
Wäre schön wenn diese Infos auch irgendwo in der Hilfe stehen würden, danke Siemens ;)
Was mich auch noch verwirrt hat: Die Funktion wollte nicht SmartTags("Lesestatus") (-->Falscher Parametertyp), sondern nur "Lesestatus". Wenn ich dann im Debugger den Code ansehe steht eh SmartTags("Lesestatus") drin...

Also: Danke nochmal für deine Hilfe :p
 
Was mich auch noch verwirrt hat: Die Funktion wollte nicht SmartTags("Lesestatus") (-->Falscher Parametertyp), sondern nur "Lesestatus". Wenn ich dann im Debugger den Code ansehe steht eh SmartTags("Lesestatus") drin...
Das ist wohl eine der ungemein unpraktischen Verschlimmbesserungen von TIA. :roll:

In WinCC flexible war bei Variablen aus Untergruppen noch der Gruppenname Bestandteil des Variablennamens, und wenn man eine Variable aus einer Gruppe (Ordner) ansprechen wollte, dann mußte man zwingend SmartTags("Gruppe\Varname") schreiben. Bei Variablen aus dem Hauptordner konnte man optional das SmartTags weglassen. Jetzt bei TIA kann man den Gruppenname gar nicht mehr mit angeben, sondern die Variablen müssen einen HMI-weit einmaligen Variablenname haben (und wo die Variable liegt darf man nun suchen...). Und TIA legt nun fest, daß man manchmal das SmartTags gar nicht mehr hinschreiben darf... toll

Harald
 
Zurück
Oben