- Beiträge
- 24.285
- Reaktionspunkte
- 7.711
-> Hier kostenlos registrieren
Oooch, dieses Problemchen wurde doch schon im Beitrag #2 dieses Threads geklärt, an den Du Dich 'rangehängt hast ... anfangs dachte ich, Du hast das sicher schon gelesen ...Heureka
zyklisch lesen war das Stichwort.
... allerdings: "Zyklisch bei Verwendung"Ich hatte den Erfassungszyklus in der Tabelle auf 100ms eingestellt und ging davon aus das dies Ausreichend ist, vorallem da ja die Variablen die ich fest im Skript eingetragen habe, auch geloggt wurden.
Nur von den fest eingetragenen Variablen wußte WinCCflex von der "Verwendung" und hat sie vor dem Scriptaufruf gelesen.
Wenn die Variablennamen erst im Script zusammengesetzt werden, dann ahnt WinCCflex nicht, daß diese Variablen "verwendet" werden und liest sie nicht vor dem Start des Scripts. Ein Script wartet nicht auf das Lesen der Smarttag-Variablen, egal wie kurz der Erfassungszyklus eingestellt ist. Ein Script arbeitet mit dem Variablenwert des letzten vorherigen Lesens oder dem Startwert, wenn die Variable noch nie gelesen wurde.
Wenn ein Script auf das Schreiben oder Lesen von Variablen warten soll und/oder man kein zyklisch fortlaufendes Lesen vieler Variablen verwenden will, dann kann man das z.B. so lösen:
Code:
Dim wrStat, rdStat
[COLOR="Green"]' Variable in SPS schreiben mit Fertigmeldung[/COLOR]
SetDataRecordTagsToPLC "WriteVar", SmartTags("Protokoll\Schreibstatus")
[COLOR="green"]' in Schleife auf Ende Var-Schreiben warten[/COLOR]
Do
wrStat = SmartTags("Protokoll\Schreibstatus")
Loop While (wrStat And 4) = 0 [COLOR="green"]' 4=fertig OK / 12=abgebrochen mit Fehler[/COLOR]
[COLOR="green"]' wenn Schreiben ohne Fehler, dann Antwort (Protokoll-Datensatz) aus SPS lesen[/COLOR]
If wrStat = 4 Then
[COLOR="green"]' Variablen aus SPS lesen mit Fertigmeldung[/COLOR]
GetDataRecordTagsFromPLC "Schichtprotokoll", SmartTags("Protokoll\Lesestatus")
[COLOR="green"]' in Schleife auf Ende Var-Lesen warten[/COLOR]
Do
rdStat = SmartTags("Protokoll\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
End If
If wrStat <> 4 Or rdStat <> 4 Then
ShowSystemAlarm "Fehler beim Lesen der Protokollwerte!"
End If


* "Schichtprotokoll" ist eine Rezeptur, welche die zu lesenden Variablen beinhaltet
* "Protokoll\Schreibstatus" und "Protokoll\Lesestatus" sind (interne) UInt-Variablen
Das sekundenlange Warten auf das Ende des Variablen-Schreibens/Lesens in einer Schleife ist natürlich unschön, weil so lange die Ausführung weiterer Scripte nicht möglich ist. Besser ist es, das Script aufzuteilen in die Schreib/Lese-Auftrags-Teile und die anschließende Verarbeitung erst beim Ereignis "beiÄnderung" der Schreibstatus/Lesestatus-Variablen. Dann müssen "Protokoll\Schreibstatus" und "Protokoll\Lesestatus" SPS-Variablen sein, weil interne Variablen kein Ereignis "beiÄnderung" auslösen.
Die Systemfunktion "AktualisiereVariable" ist für das erzwungene Variablenlesen nicht hilfreich, weil nicht im Script verwendbar und man erhält keine Rückmeldung, wenn das Lesen erfolgt ist.
Harald