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



## heri1980 (6 Dezember 2011)

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


----------



## JesperMP (6 Dezember 2011)

Am anfang einfügen:

```
ON ERROR RESUME NEXT
```
Nach jeden 'verdächtigen' Code-Zeile:

```
IF Err.Number <> 0 THEN
  ShowSystemAlarm ("Error in code ! " & CStr(Err.Number) & ", " & Err.Description)
  Err.Clear
END IF
```


----------



## Larry Laffer (6 Dezember 2011)

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 :
	
	



```
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


----------



## heri1980 (6 Dezember 2011)

@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


----------



## JesperMP (6 Dezember 2011)

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.


----------



## Larry Laffer (6 Dezember 2011)

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 :
	
	



```
Dim myString

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

Gruß
Larry


----------



## WinniePooh (10 April 2014)

Hallo Larry,

ich habe dein Beispiel probiert, aber bei mir macht er es irgendwie nicht

```
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??


----------



## Larry Laffer (10 April 2014)

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


----------



## WinniePooh (14 April 2014)

Wenn ich die Variable myvar über als Smarttag angebe:

```
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.


----------



## JesperMP (14 April 2014)

Hast du ein Variabel myvar ?

Probier einmal ein "Alles neugenerieren".


----------



## PN/DP (14 April 2014)

WinniePooh schrieb:


> Wenn ich die Variable myvar über als Smarttag angebe:
> 
> ```
> SmartTags(myvar) 'so klappt es nicht
> ...


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.


```
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


----------



## WinniePooh (14 April 2014)

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:

```
SetValue SmartTags("06_RECIPE\PRG_WORK\PRG_REQ_KEY_1"), myarray(1)
```

Aber das ist auch nicht die Große Kunst...


----------



## PN/DP (14 April 2014)

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


----------



## WinniePooh (14 April 2014)

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

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


```
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.


----------



## Larry Laffer (14 April 2014)

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


----------



## Larry Laffer (14 April 2014)

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 ...?


----------



## WinniePooh (14 April 2014)

Also ich habe schon mal das Script veröffentlich in den ersten Beitrag, hier aber nochmal auf der zweiten Seite:

```
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


----------



## PN/DP (14 April 2014)

WinniePooh schrieb:


> 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.

```
[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


----------



## WinniePooh (14 April 2014)

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

Wenn man den Wald vor Lauter Bäumen nicht sieht!


----------

