WinCC Flexible - Array-Variable über Skript in Textdatei schreiben

heri1980

Level-2
Beiträge
56
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute! ;)

Würde folgende Funktion gerne über ein WinCC Flexible Skript umsetzen =>

Aus einem Array (DB) sollen die einzelnen Werte über eine For-Schleife in eine Textdatei geschrieben werden.

Meine Variablen haben folgenden Aufbau: "MES\DB_ST1_DATEN.Messwert[1].Bezeichnung"; "MES\DB_ST1_DATEN.Messwert[1].Einheit"; "MES\DB_ST1_DATEN.Messwert[1].Max"

Hab das Ganze mal auf diese Art und Weise probiert, funzt aber nicht!!

For i = 1 To 10 Step 1
MeineDatei.WriteLine (SmartTags ("MES\DB_ST1_DATEN.Messwert[i].Bezeichnung") & "; " & SmartTags ("MES\DB_ST1_DATEN.Messwert[i].Einheit")
Next

Vielleicht kann mir jemand helfen bzw. mir einen Tipp geben?! Danke!!

lg heri
 
Am anfang einfügen:
Code:
ON ERROR RESUME NEXT
Nach jeden 'verdächtigen' Code-Zeile:
Code:
IF Err.Number <> 0 THEN
  ShowSystemAlarm ("Error in code ! " & CStr(Err.Number) & ", " & Err.Description)
  Err.Clear
END IF

 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ist die von dir dort genannte Variable denn ein ARRAY oder ein Einzelelement inhalb von Flex.
Ich denke mal, das du da ein ARRAY of STRUCT in der SPS hast. Das kann Flex nicht als ARRAY auflösen.
Der Zugriff auf Array-Elemente im Script ginge wie folgt :
Code:
For [B][COLOR=#ff0000]i[/COLOR][/B] = 1 To 10 Step 1
    MeineDatei.WriteLine SmartTags ("MES\DB_ST1_DATEN.Messwert")(i)
Next
in diesem Sinne kannst du so nur auf Elemente zugreifen, bei denen in der variablen-Deklaration unter "Array-Elemente" eine Zahl > 1 steht.

Gruß
Larry
 
@Larry

Du hast recht, ich habe ein Array of Struct... schätze mal, dass ich die Variablen "zu Fuss" schreiben muss.... liege ich da richtig?!

MeineDatei.WriteLine (SmartTags ("MES\DB_ST1_DATEN.Messwert[1].Bezeichnung")
MeineDatei.WriteLine (SmartTags ("MES\DB_ST1_DATEN.Messwert[2].Bezeichnung")
MeineDatei.WriteLine (SmartTags ("MES\DB_ST1_DATEN.Messwert[3].Bezeichnung") usw.

@Jesper - Mir ist schon klar, dass man eine Abbruchbedingung bzw. Fehlerbeschreibung ins Skript einbinden sollte - Danke für die Info!!

LG heri
 
Als Ergänzung zu Larrys Beitrag:

Selbst wenn man den STRUCT umarrangiere, so das man ein ARRAY von STRINGs hat, dann hilft es nicht.
WinCC Flex kann STRINGs nur als Einzel-Tags addressieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Naja ... du hast noch die Möglichkeit, das du dir den Tag-Namen der Variablen als String selbst zusammen bastelst und so die Variable adressierst. Der Haken dabei ist nur, dass dadurch die Variable unter Umständen nicht mit dem in der Steuerung aktuellen Zustand gespeichert wird sondern mit dem, der irgendwann einmal darein geladen wurde. Wenn die Variablen allerdings in dem aktuellen Bild (z.B.) direkt verwendet werden, so ginge es dann trotzdem. Es ginge auch, wenn sie zyklisch fortlaufend aktualisiert werden. das macht aber eigentlich nur Sinn, wenn es sich hierbei um nur einige wenige Variablen handelt.

Wie auch immer - den Variablen-Namen selbst zusammenbauen ginge dann so :
Code:
Dim myString

myString = "MES\DB_ST1_DATEN.Messwert[" + trim(cstr(i)) + "].Bezeichnung"
MeineDatei.WriteLine SmartTags (myString)
... z.B.

Gruß
Larry
 
Hallo Larry,

ich habe dein Beispiel probiert, aber bei mir macht er es irgendwie nicht
Code:
Dim i, max, myvar
i= 1
max = 10
For i = 1 To max
 myvar = "06_RECIPE\PRG_WORK\PRG_REQ_KEY_" + Trim(CStr(i)) 
 
 If (i = StoveNumber) Then
  SetValue SmartTags(myvar), StoveNumber 'statements
 Else
  SetValue SmartTags(myvar), 0   'statements
 End If
Next

Habe ich was übersehen??
 
Hallo,
ich habe auch deinen anderen Beitrag gelesen - antworte aber jetzt mal hier.
Was genau geht denn nicht ?
Bekommst du eine Fehlermeldung vom System ?
Hast du in den Einstellungen von Flex die Option "Namensinformationen transferieren" angehakt ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich die Variable myvar über als Smarttag angebe:
Code:
SmartTags(myvar) 'so klappt es nicht
SmartTags("myvar") 'klappt auch nicht
In den Einstellungen ist der Haken eingestellt.

WinCC Flex unterstreicht mir die Variable immer und gibt aus, dass kein Objekt Variable mit dem Namen myvar gefunden wird.
 
Wenn ich die Variable myvar über als Smarttag angebe:
Code:
SmartTags(myvar) 'so klappt es nicht
SmartTags("myvar") 'klappt auch nicht
In den Einstellungen ist der Haken eingestellt.

WinCC Flex unterstreicht mir die Variable immer und gibt aus, dass kein Objekt Variable mit dem Namen myvar gefunden wird.
Dein Skript soll Variablennamen zusammensetzen und den Name in die Variable myvar schreiben. Deshalb darf myvar nicht in Hochkommas stehen. Das Skript erzeugt vermutlich diese Namen:
"06_RECIPE\PRG_WORK\PRG_REQ_KEY_1"
"06_RECIPE\PRG_WORK\PRG_REQ_KEY_2"
...
"06_RECIPE\PRG_WORK\PRG_REQ_KEY_9"
"06_RECIPE\PRG_WORK\PRG_REQ_KEY_10"

Hast Du Variablen mit exakt diesen Namen?

Ob diese Variablennamen korrekt sind kannst Du testen, indem Du eine/mehrere Zeilen mit diesen kompletten Variablennamen in das Skript einfügst. Wenn die Namen angekringelt werden, dann gibt es diese Variablen nicht. Du kannst auch das Skript prüfen lassen: Skript > Syntax überprüfen

Damit Du siehst was das Skript tut und wo es eventuell hängt ("debuggen"), solltest Du vorübergehend Testausgaben einfügen mit ShowSystemAlarm. Damit Du die Ausgaben nachträglich lesen kannst brauchst Du in irgendeinem Bild eine Meldeanzeige, welche auch Meldeereignisse der Meldeklasse "System" anzeigt.

Für Zuweisungen an SmartTag-Variablen ist es nicht nötig SetValue zu benutzen, ein = als Zuweisung finde ich übersichtlicher.

Code:
Dim i, max, myvar
max = 10

[COLOR="#FF0000"]' Test Variablennamen OK? (später diese Zeilen wieder löschen)
SmartTags("06_RECIPE\PRG_WORK\PRG_REQ_KEY_1") = 0
SmartTags("06_RECIPE\PRG_WORK\PRG_REQ_KEY_2") = 0
SmartTags("06_RECIPE\PRG_WORK\PRG_REQ_KEY_3") = 0
SmartTags("06_RECIPE\PRG_WORK\PRG_REQ_KEY_4") = 0
SmartTags("06_RECIPE\PRG_WORK\PRG_REQ_KEY_5") = 0
SmartTags("06_RECIPE\PRG_WORK\PRG_REQ_KEY_6") = 0
SmartTags("06_RECIPE\PRG_WORK\PRG_REQ_KEY_7") = 0
SmartTags("06_RECIPE\PRG_WORK\PRG_REQ_KEY_8") = 0
SmartTags("06_RECIPE\PRG_WORK\PRG_REQ_KEY_9") = 0
SmartTags("06_RECIPE\PRG_WORK\PRG_REQ_KEY_10") = 0[/COLOR]

For i = 1 To max
  myvar = "06_RECIPE\PRG_WORK\PRG_REQ_KEY_" + Trim(CStr(i)) 

  If (i = StoveNumber) Then
    [COLOR="#FF0000"]ShowSystemAlarm "Setze Variable '" & myvar & "' auf " & StoveNumber  'Testausgabe[/COLOR]
    SmartTags(myvar) = StoveNumber
  Else
    [COLOR="#FF0000"]ShowSystemAlarm "Setze Variable '" & myvar & "' auf 0"               'Testausgabe[/COLOR]
    SmartTags(myvar) = 0
  End If
Next

Falls Dein Skript weiterhin nicht tut was es soll dann wäre es extrem hilfreich, wenn Du uns beschreibst was genau nicht funktioniert. Unter "klappt nicht" oder "bei mir macht er es irgendwie nicht" können wir uns irgendwie kaum was vorstellen.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Nochmal,

ja ich habe die Variablen.
Die Variable myvar deklariere ich auch am Anfang des Scripts, da diese nur Temporär ist.
Ich habe es nun so programmiert, dass ich ein Temporäres Array mir bilde.
und nach der Iteration schreibe ich jedes Array Element auf einen Tag drauf.
Somit muss ja mein Script die angelegten Variablen erkennen, wenn er diese unten zuweisen kann.

mit:
Code:
SetValue SmartTags("06_RECIPE\PRG_WORK\PRG_REQ_KEY_1"), myarray(1)

Aber das ist auch nicht die Große Kunst...
 
Zuletzt bearbeitet:
Ich weiß nicht was bei Dir das Problem ist, aber meine Skript-Variante tut was es soll, ohne ein Zwischen-Array zu brauchen.

Tut Dein Skript tatsächlich nur schreiben oder tut es noch mehr, z.B. liest es die Variablen auch? Das Lesen von Variablen, wo die Variablennamen erst im Skript zusammengebastelt werden und die RT deshalb nicht von der Verwendung der Variablen weiß, hat spezielle Hürden. Sind das SPS-Variablen oder Panel-interne Variablen?

Harald
 
sind alles Panel boolsche interne Variablen.
In dem Skript werden diese nur beschrieben.

Nochmal zur info... es unterstreicht mir die SmartTags(myvar)

Code:
myvar = "06_RECIPE\PRG_WORK\PRG_REQ_KEY_" + Trim(CStr(i)) 
 SetValue SmartTags([B]myvar[/B]), 1

Ich werde mal gleich probieren, dass was Jesper gesagt hat mit der ON ERROR Funktion.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
hast du die Variable myvar, die es ja wahrscheinlich nur in dem Skript geben soll, auch vor der ersten Verwendung mit DIM erzeugt ? Steht also irgendwo : DIM myvar ?
Ich fände es extrem hilfreich, das ganze Skript sehen zu können ...

Gruß
Larry
 
noch etwas (Harald hatte es im Grunde schon mal angedeutet) :
Was arbeitet noch so alles mit den Variablen SmartTags("06_RECIPE\PRG_WORK\PRG_REQ_KEY_1") und den anderen alle ...?
 
Also ich habe schon mal das Script veröffentlich in den ersten Beitrag, hier aber nochmal auf der zweiten Seite:
Code:
Dim i, max, myvar
i= 1
max = 10
For i = 1 To max
 myvar = "06_RECIPE\PRG_WORK\PRG_REQ_KEY_" + Trim(CStr(i)) 
 
 If (i = StoveNumber) Then
  SetValue SmartTags(myvar), 1 'statements
 Else
  SetValue SmartTags(myvar), 0   'statements
 End If
Next

So sieht es aus, aus mehr besteht es nicht.
myvar habe ich als lokale Variable definiert.
Die Tags "06_RECIPE\PRG_WORK\PRG_REQ_KEY_" 1 bis 16 werden im Script nur lesend verarbeitet im Restlichen Programm lesend und schreibend.
"06_RECIPE\PRG_WORK\PRG_REQ_KEY_" ist eine interne Variable
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ich habe schon mal das Script veröffentlich in den ersten Beitrag, hier aber nochmal auf der zweiten Seite:
Das hier ist aber nicht das selbe Skript. In Deinem ersten Skript in Beitrag #7 wolltest Du noch Werte von 0 bis 10 zu BOOL-Variablen zuweisen ;)

Die Lösung Deines Problems: ersetze das SetValue durch eine normale Zuweisung =, das SetValue funktioniert nicht wenn der Variablenname in SmartTags() in einer Variable ist. Vermutlich ist die Implementierung des SmartTags() fehlerhaft.
Ich meine das hat in WinCC flexible noch nie funktioniert - deshalb verwende ich SetValue auch nicht.
Code:
[COLOR="#FF0000"]SetValue SmartTags(myvar), 0  'das funktioniert nicht[/COLOR]
SmartTags(myvar) = 0          [COLOR="#008000"]'das funktioniert[/COLOR]

Übrigens: Zeichenfolgen-Verkettungen macht man üblicherweise mit dem Verkettungsoperator (&) statt dem Additionsoperator (+). VBS interpretiert Dein + aber korrekt als &.

Harald
 
AAAAAAAAAAAAAAAAAAAAAHHHHHHHHHHHHHHHHHHHHHHHH.............
Passt Danke Harald...

Wenn man den Wald vor Lauter Bäumen nicht sieht!
 
Zurück
Oben