WinCC flexible: Indirekte Adressierung innerhlab eines Skriptes / Schleife

Zuviel Werbung?
-> Hier kostenlos registrieren
Heureka
zyklisch lesen war das Stichwort.
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 ...

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.
... allerdings: "Zyklisch bei Verwendung"
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
* "WriteVar" ist eine Rezeptur, welche die zu schreibende(n) Variable(n) beinhaltet
* "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
 
Doch gelesen hatte ich den Beitrag schon, nur verstanden hatte ich ihn anscheinend nicht, oder zumindestens falsch. Jetzt mit Deiner Erklärung ist mir das ganze erst so richtig klar geworden.

Vielen Dank nochmals für die Hilfe und die Abschliessende Erklärung.
Dein Spruch den Du in der Fusszeile hast, hat wirklich was :)

Gruss
Daniel

 
Zuviel Werbung?
-> Hier kostenlos registrieren
Schleife um ein Array auszulesen

Hallo zusammen
Ich wollte den vorhin beschriebenen Vorgang noch optimieren und statt zwei mal 20 Variablen zu übertragen, das ganze mit zwei Arrays lösen. Nur habe ich mir dabei nochmals neue Probleme aufgehalst :ROFLMAO:

Code:
ts.Write(";" & Array_Druck_1(10))

For i=0 To 19 Step +1
     Druckzwischenspeicher1="Array_Druck_1("&(i)&")"
     ts.Write(";" & SmartTags(Druckzwischenspeicher1))


Next

For i=0 To 19 Step +1
     Druckzwischenspeicher2="Array_Druck_2("&CStr(i)&")"
     ts.Write(";" & (Druckzwischenspeicher2))
Next
Das Ausgeben des des 10 elements funktioniert, wenn ich dann aber in die Schleife komme dann gibt er mir die RT 'no Tag' aus, wenn ich die Schleifen so wie in der zweiten Schleife mache, so gibt er mir den im Druckzwischenspeicher gespeicherten Text (Array_Druck_2(0)) aus und nicht den Wert aus dem Array. Muss man beim indirekten Adressieren in der Schleife WinCC noch mitteilen das es sich um Array handelt? Oder habe ich einen anderen Fehler eingebaut?

Gruss
Dani
 
Nur mal so als Einwurf

SmartTags die eine Verbindung zur Steuerung haben und deren Variablenname "zusammengebaut" wird werden nicht aktualisiert wenn sie in einem Skript verwendet werden!
Da hab ich sogar schon mal einen Fall bei Siemens aufgemacht und das wurde mir wieder mal als Systemeigenheit verkauft!!!
Also niemals einen Variablennamen für "externe" Variablen zusammenbauen!
 
Aber dasselbe habe ich ja vorhin auch gemacht (funktioniert sobald auf Zyklisch fortlaufend lesen umgestellt wurde), nur mit dem Unterschied das die Variablen einzeln gelistet waren und nicht im Array... oder verhält sich das bei einem Array anders...?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
Code:
For i=0 To 19 Step +1
     Druckzwischenspeicher1="Array_Druck_1("&(i)&")"
     ts.Write(";" & SmartTags(Druckzwischenspeicher1))
Next
für diesen Code solltest du dir mal den String-Inhalt von "Druckzwischenspeicher1" ansehen. Steht da wirklich "Array_Druck_1(1)" drin oder vielleicht "Array_Druck_1( 1)" ?? Das könnte einen Unterschied ausmachen ...

Code:
For i=0 To 19 Step +1
     Druckzwischenspeicher2="Array_Druck_2("&CStr(i)&")"
     ts.Write(";" & (Druckzwischenspeicher2))
Next
Dieser Code hat auch nicht die Aufgabe, den Inhalt der Variablen abzuspeichern (sonst stände da nämlich "SmartTags(Druckzwischenspeicher2)") sondern lediglich deren Namen - also den Inhalt des Strings. Das Script verhält sich also korrekt ... :rolleyes:

Gruß
Larry
 
Ich hab mir jetzt mal nicht alles durchgelesen.
Aber es geht wohl drum dass du deinen Variablennamen weggeschrieben bekommst aber nicht dessen Inhalt.

Fangen wir mal von vorne an. Du hast ein Array aus dem du die Inhalte in eine Datei wegschreiben magst? Ja?

Hier mal wie man sich einen Variablennamen zusammenbauen kann.

Code:
 'Listenfeld Inhalt holen (Index) 
 VarName = "Anlage\FileBrowser\Ordner" & Parameter1
 'Pfad zusammensetzen
 SmartTags("Anlage\FileBrowser\PfadnameAktuell") = SmartTags("Anlage\FileBrowser\PfadnameAktuell") & SmartTags(VarName) & "\"
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo
Also ich hab die Lösung gefunden...
Das mit dem String zusammensetzen und sie dann als SmartTag einzufügen scheint mit Arrays nicht zu funktionieren.
Dieser Code hat auch nicht die Aufgabe, den Inhalt der Variablen abzuspeichern (sonst stände da nämlich "SmartTags(Druckzwischenspeicher2)") sondern lediglich deren Namen - also den Inhalt des Strings. Das Script verhält sich also korrekt ...
Auf diese Idee bin ich eigentlich nur gekommen, da ich ja vor der Schleife das gleiche mache mit :
Code:
ts.Write(";" &([COLOR=Orange]Array_Druck_1[/COLOR](3)))
Zum einen scheint da WinCC die deklarierte Variable schon als Array zu erkennen, sie wird orange markiert, zum anderen wenn ich SmartTags davor setze meldet mir die RT 'tag lookup only by name' und schreibt den Wert nicht mehr ins File...
In dem Moment, indem ich die Anführungszeichen entfernt hatte, erkannte WinCC die Array Variable auch in der Schleife(orange markiert)
statt:
Code:
For i=0 To 19 Step +1
     Druckzwischenspeicher2="Array_Druck_2("&(i)&")"
     ts.Write(";" & SmartTags(Druckzwischenspeicher2))
muss es heissen:
Code:
For i=0 To 19 Step +1
     Druckzwischenspeicher2=[COLOR=Orange]Array_Druck_2[/COLOR](i)
     ts.Write(";" & (Druckzwischenspeicher2))
Und dann funktionierts...


Code:
'Listenfeld Inhalt holen (Index)   VarName = "Anlage\FileBrowser\Ordner" & Parameter1  'Pfad zusammensetzen  SmartTags("Anlage\FileBrowser\PfadnameAktuell") = SmartTags("Anlage\FileBrowser\PfadnameAktuell") & SmartTags(VarName) & "\"
Bringt obenstehende Schreibweise (kompletter Pfad) Vorteile? Bis jetzt habe ich nur mit den Namen gearbeitet, wie sie bei den Variablen deklariert sind (ohne den Pfad).
Besten Dank für Eure Hilfe!!! Konnte auch bei anderen Beiträgen von Euch in diesem Forum schon mächtig was lernen!!

Gruss
Daniel
 
Hallo
Also ich hab die Lösung gefunden...
Das mit dem String zusammensetzen und sie dann als SmartTag einzufügen scheint mit Arrays nicht zu funktionieren.
Auf diese Idee bin ich eigentlich nur gekommen, da ich ja vor der Schleife das gleiche mache mit :
Code:
ts.Write(";" &([COLOR=orange]Array_Druck_1[/COLOR](3)))
Zum einen scheint da WinCC die deklarierte Variable schon als Array zu erkennen, sie wird orange markiert, zum anderen wenn ich SmartTags davor setze meldet mir die RT 'tag lookup only by name' und schreibt den Wert nicht mehr ins File...
In dem Moment, indem ich die Anführungszeichen entfernt hatte, erkannte WinCC die Array Variable auch in der Schleife(orange markiert)
statt:
Code:
For i=0 To 19 Step +1
     Druckzwischenspeicher2="Array_Druck_2("&(i)&")"
     ts.Write(";" & SmartTags(Druckzwischenspeicher2))
muss es heissen:
Code:
For i=0 To 19 Step +1
     Druckzwischenspeicher2=[COLOR=orange]Array_Druck_2[/COLOR](i)
     ts.Write(";" & (Druckzwischenspeicher2))
Und dann funktionierts...


Code:
'Listenfeld Inhalt holen (Index)   VarName = "Anlage\FileBrowser\Ordner" & Parameter1  'Pfad zusammensetzen  SmartTags("Anlage\FileBrowser\PfadnameAktuell") = SmartTags("Anlage\FileBrowser\PfadnameAktuell") & SmartTags(VarName) & "\"
Bringt obenstehende Schreibweise (kompletter Pfad) Vorteile? Bis jetzt habe ich nur mit den Namen gearbeitet, wie sie bei den Variablen deklariert sind (ohne den Pfad).
Besten Dank für Eure Hilfe!!! Konnte auch bei anderen Beiträgen von Euch in diesem Forum schon mächtig was lernen!!

Gruss
Daniel


Der Code bringt an dieser Stelle nicht viel, aber an manch anderer Stelle. Aber wenn man schon mit Strg C und V arbeitet...
 
Das mit dem String zusammensetzen und sie dann als SmartTag einzufügen scheint mit Arrays nicht zu funktionieren.

Hallo Daniel,
das ist Blödsinn. Natürlich kannst du das auch schreiben, es muss dann nur auch richtig sein. Jede Programmier-Umgebung hat Schreibkonventionen, so auch Flex. Ich muss dir zwar gestehen, dass ich die bei Flex so hin und wieder auch als recht mäßig empfinde, aber sei es drum ...

Bei einem Array-Element bezieht sich der SmartTag auf den Variablen-Namen und nicht aud den Index. Es muss also richtig zusammengesetzt werden :
Code:
meineVariable = SmartTag("meinArray")(Index)
Du hast aber Recht damit, Array-Elemente auf diese Weise nicht zusammen zu setzen (weil das system das ja schon selber kann). Sinn macht das vor Allem bei Nicht-Array's, die trotzdem wie Array's behandelt werden sollen.

Gruß
Larry
 
Zurück
Oben