Script setzt variable zu früh

Bensen83

Level-1
Beiträge
777
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo. folgendes Problem: ;-)

Ein script im wincc flex liest eine csv datei aus, nach der schleife, welche die datei ausliest, wird eine variabe gesetzt.

Diese kommt jedoch schon bevor alle datan in einen db geschrieben wurden. dies kann allerdings nach der reihenfolge des scriptes nicht sein.
meine frag jetzt:

Kann es sein, dass das script durchlaufen wurde, aber die befehle readline noch nicht fertig ausgeführt wurden?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit sowas hab ich mich auch schon mal "vergnügt".
Ich hab die Zählvariable der Schleife dann nicht als interne Variable deklariert, sondern als Datenwort in der Steuerung. Ist zwar langsamer, aber erfüllt bislang seinen Zweck zuverlässig.

Gruß
Dieter
 
Hallo,
die Daten-Synchronisierung mit der SPS von Seiten der Visu erfolgt ziemlich willkürklich. Liest du mit einem Script einen variablenwert ein, so ist dieser ganz sicher irgendwann in der SPS - nur wann ...? Da ich mit dem Thema auch schon so meine Erfahrung machen durfte vielleicht folgende Anregung :

Deine CSV-Variablen (ich nenn das mal so) haben z.B. eine Aktualisierungszeit von 1 Sek.
Am Ende deines Scriptes baust du dir eine Warte-Schleife von 1,1 Sekunde ein und du setzt nach Ablauf dieser Zeit eine zusätzliche Variable, die die SPS veranlasst, nun die Daten als gelesen anzuerkennen. Damit kannst du die Chancen, dass die Daten konsistent in der Steuerung angekommen sind, stark erhöhen. Diese Trigger-Variable muß natürlich die gleiche Aktualisierungszeit wie die anderen Variablen haben.
Eine weitere Verbesserung erzielst du, wenn du die Aktualisierung dieser Variablen zusätzlich auf "zyklisch fortlaufend" setzt.

Viel Erfolg ...

Gruß
LL
 
Ok

Also noch eine Anmerkung, der Fwehler taucht nicht imm er auf, nur manchmal:

Also die werte brauchen ca. 20 sekunden länger als die schleife läuft, kann doch nicht sein, oder?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dazu nochmal :
Um da etwas genaueres sagen zu können müßte ich wissen :
- welche Visu ? (PC-Runtime oder MP)
- wieviele max. aktive Powertags ? was hast du hier für eine Aktualisierungsrate ?
- welcher Übertragungs-Bus zwischen CPU und Visu ?
- wieviele CSV-Elemente willst du übertragen und wie werden die zur Zeit aktualisiert ?

Das der Effekt nur manchmal auftritt entspricht genau meinen Erkenntnissen. Wie ich schon geschrieben habe erfolgt die Aktualisierung der Variablen zum Teil "nach Lust und Laune" - soll heißen, dass bei einer stark belasteten Kommunikation nicht immer alle Variablen "in Time" von und zur SPS aktualisiert werden - die kommen dann beim nächsten Mal dran. So kann es dann passieren, dass ein für dich zusammenhängender Block in vielen Teil-Abschnitten übertragen wird. Einzige mir bekannte Ausnahme hier :
ARRAY's und Profilkurven werden von der SPS zusammenhängend abgeholt.

Gruß
LL
 
Also die werte brauchen ca. 20 sekunden länger als die schleife läuft, kann doch nicht sein, oder?

Doch kann sein. Deckt sich mit meinen Erfahrungen. Du kannst die Aktualisierungsrate deiner Variablen heruntersetzen und versuchen deine CSV-Werte in einen einzelnen DB zu schreiben. Wenn du dann nicht jeden Wert einzeln schreibst, sondern mit Array arbeitest, dann geht es auch schneller.
Also CSV einlesen und in ein internes Array schreiben. Dann das interne Array auf das "externe" Array kopieren.

Gruß
Dieter
 
vlt auch ein versuch wert, du ziehst deine Variablen in ein Rezept, dann
nimmst du die Funktion Datensätze Exportieren bzw. Importieren. Hier
bekommst du eine Rückmeldung die du dann auswertest. So ähnlich wie
in den Beispiel.

Code:
Dim Status, Aktiv, OK , KO

ExportDataRecords 1, 0, "\Storage Card MMC\record.csv", hmiOverwriteWithConfirmation, hmiOn, Status
If Status = 2 Then
    Aktiv = True
    OK = False
    KO = False
End If
If Status = 4 Then
    Aktiv = False
    OK = True
    KO = False
End If 
If Status = 12 Then
    Aktiv = False
    OK = False
    KO = True
End If

ImportDataRecords "\Storage Card MMC\record.csv", 0, hmiOverwriteWithConfirmation, hmiOn, Status
If Status = 2 Then
    Aktiv = True
    OK = False
    KO = False
End If
If Status = 4 Then
    Aktiv = False
    OK = True
    KO = False
End If 
If Status = 12 Then
    Aktiv = False
    OK = False
    KO = True
End If
 
Zuviel Werbung?
-> Hier kostenlos registrieren
konsistent Variablen in SPS schreiben mit Endemeldung

Hallo Bensen83,

so wie Helmut es schon angedeutet hat, bekommst Du das Problem des konsistenten Schreibens wohl nur mit
Datensätzen/Rezepturen in den Griff. Allerdings hakt es nicht beim Lesen der csv-Datei (readline wartet
tatsächlich, bis die Zeile aus der Datei gelesen wurde), sondern beim anschließenden Schreiben in die SPS.

Für das konsistente Schreiben von Datensätzen mit Endemeldung gibt es in WCF die Systemfunktion
SchreibeDatensatzvariablenInSteuerung (im Script: SetDataRecordTagsToPLC)
Code:
[COLOR="green"]' "DS_Schreibstatus" ist eine Panel-interne Variable (UInt)
' "SPS\neuer_Datensatz" ist die Fertigmeldung-Variable in der SPS (INT, BOOL)[/COLOR]
Dim csvReadOK, wrStat

[COLOR="green"]' Daten aus csv-Datei in Rezepturvariablen lesen
' ...

' Rezepturvariablen in die SPS schreiben[/COLOR]
If csvReadOK Then
    SetDataRecordTagsToPLC "Rezepturname", SmartTags("DS_Schreibstatus") [COLOR="green"]'Datensatz in SPS schreiben[/COLOR]

    Do [COLOR="green"]'in Schleife auf Ende DS-Schreiben warten, weil interne Variablen kein Ereignis "beiÄnderung" auslösen[/COLOR]
        wrStat = SmartTags("DS_Schreibstatus")
    Loop While (wrStat And 4) = 0 [COLOR="green"]' 4=fertig OK / 12=abgebrochen mit Fehler[/COLOR]

    If wrStat = 4 Then  [COLOR="green"]'wenn Schreiben ohne Fehler, dann Fertigmeldung an SPS[/COLOR]
        SmartTags("SPS\neuer_Datensatz") = 1
[COLOR="green"]        'weitere Fertig-Aktionen
        '...[/COLOR]
    End If
End If
Wenn Du die Variable "DS_Schreibstatus" in die SPS legst, dann musst Du nicht unbedingt im Script auf das Ende
des Datensatz-Schreibens warten. (Wenn Du trotzdem wartest, dann dauert es mindestens 2 Sekunden.)
Die SPS braucht dann keine gesonderte Fertigmeldungs-Variable, sie braucht nur "DS_Schreibstatus" überwachen.
Sobald eine 4 darinsteht ist ein neuer Datensatz vom Panel angekommen. Dann den Datensatz an das/die eigentlichen
Ziel(e) schreiben und "DS_Schreibstatus" auf 0 setzen.

@Helmut
Das ist ein Teil dessen, wie ich die Rezepturverwaltung abgelöst habe. Weil da noch viel mehr selbstgestricktes
dazugehört, müßte ich erst ein überschaubares Beispielprojekt zusammenstellen. Deshalb habe ich Dir in dem anderen
Tread (noch) nicht geantwortet.

Gruß
Harald
 
Zurück
Oben