# Array aus DB in CSV Datei schreiben flexibel über Skript



## CNC840D (29 August 2011)

*WINCC flexible 2008: Array aus DB in CSV Datei schreiben über Skript*

Hallo liebe Forumsgemeinde,

ich kämpfe jetzt schon ein wenig mit der Skript Funktion von WinCC fleixble.

Das Skript soll folgendes machen:

Werte aus dem DB 1 in einer For Schleife auslesen (10 Werte) und anschliessend in eine CSV datei mit folgendem aussehen schreiben.

"index der For Schleife";Wert;"gelesener Wert aus DB"

Den "Index" und den Text "Wert" schreibt das Skript schon, jedoch steht beim gelesenen Wert immer null obwohl etwas im DB eingetragen ist..ich glaub ich bin zu doof 

Die externe Variable "extvar" steht auf zyklisch fortlaufend.

Mir gehen irgendwie die Ideen aus, ich hab das Projekt mal komplett angehängt, starten tut das Skript über E0.0.

Vorab Vielen Dank für eure Hilfe:sm24:


Das Skript sieht folgendermaßen aus:

'Declaration of local tags - Deklaration von lokalen Variablen
Dim fso, f, ts, path, old, i, meineVar

'Definition der Datei-Extension und des Pfades
path = "c:\textfile.csv" 'Pfad- und Dateinamen definieren

'Error Routine - Fehlerroutine
On Error Resume Next

'Create object - Objekt erstellen
Set fso = CreateObject("Scripting.FileSystemObject")
If Err.Number <> 0 Then
ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
Err.Clear
Exit Sub
End If

'if no file exist a text file will be created - Datei erstellen, wenn keine vorhanden
If Not fso.FileExists(path) Then 
fso.CreateTextFile path 
End If 
Set f = fso.GetFile(path) 
If Err.Number <> 0 Then
ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
Err.Clear
Exit Sub
End If
Set ts = f.OpenAsTextStream(8, -2) 
If Err.Number <> 0 Then
ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
Err.Clear
Exit Sub
End If

'DB in interne Variable kopieren
intArray = SmartTags("extArray")

'Werte in die Datei schreiben
For i = 1 To 10 Step +1 
meineVar=intArray(i)
ts.WriteLine((i)&(";")& ("Wert;")&(meineVar)) 
Next

'Datei schließen
ts.Close

Set ts = Nothing
Set f = Nothing
Set fso = Nothing


----------



## CNC840D (29 August 2011)

Ich glaube ich habe mein Problem eingegrenzt..so wie es aussieht liegt am anlegen des internen Arrays, beschreibe ich diesen nämlich und blende die Zeilen ein funktionierts.

Ach ja kann es vielleicht sein das es wegen meiner Simulation mit PLCSim nicht geht ??

Vorab Danke für die Hilfe

'DB in interne Variable kopieren
intArray = SmartTags("extArray")
'------------------Das hier funktioniert!!!!----------------- 
'intArray(1)=1.0
'intArray(2)=1.2
'intArray(3)=1.3
'intArray(4)=1.4
'intArray(5)=1.5
'intArray(6)=1.6
'intArray(7)=1.7
'intArray(8)=1.8
'intArray(9)=1.9
'intArray(10)=2.0
'-------------------------------------------------------------
'Werte in die Datei schreiben
For i = 1 To 10 Step +1 
meineVar=intArray(i)
ts.WriteLine((i)&(";")& ("Wert;")&(meineVar)) 
Next


----------



## Kai (29 August 2011)

CNC840D schrieb:


> ```
> 'DB in interne Variable kopieren
> intArray = SmartTags("extArray")
> ```


 
Zum Kopieren von Arrays in VBS sollte der folgende Programmcode funktionieren:


```
Dim intArray(9), i
 
For i = 0 To 9
    intArray(i) = SmartTags("extArray")(i)
Next
```
 
Gruß Kai


----------



## Kai (30 August 2011)

Nachtrag:

Man braucht den DB (extArray) nicht in eine interne Variable (intArray) kopieren.

Man kann die Werte aus dem DB (extArray) direkt in die Datei schreiben.


```
'Werte in die Datei schreiben
For i = 1 To 10
    ts.WriteLine i & ";Wert;" & SmartTags("extArray")(i - 1)
Next
```
 
Gruß Kai


----------



## PN/DP (30 August 2011)

CNC840D schrieb:


> Den "Index" und den Text "Wert" schreibt das Skript schon, jedoch steht beim gelesenen Wert immer null obwohl etwas im DB eingetragen ist..


WinCC flexible mag Deine Arrays nicht und das Script erzeugt eigentlich Runtime-Errors, die Du aber wahrscheinlich nicht sehen kannst.

Zur Fehlersuche in Scripten:
Mache in ein Bild eine Meldeanzeige rein, die auch Meldeereignisse der Meldeklasse "System" anzeigt, damit Du die Runtime-Error-Meldungen lesen kannst.
Deaktiviere das "On Error Resume Next" oder versetze das "intArray = SmartTags("extArray")" an den Anfang des Scriptes, dann werden die an dieser Stelle von dem Script erzeugten Runtime-Errors ausgegeben und Du erhältst detaillierte Fehlermeldungen, was genau in welcher Scriptzeile schief gelaufen ist.
Zum Beobachten der Arbeit des Scriptes kann man sich mit "ShowSystemAlarm" Meldungen und z.B. Variablenwerte in die Meldeanzeige ausgeben lassen.

In Deinem hochgeladenen Projekt hast Du "extArray" unsymbolisch als Array mit 40 Elementen angelegt, in dem DB hat das Array tatsächlich aber nur 10 Elemente.
Arrays in VBS beginnen immer beim Index 0, das Element SmartTags("extArray")(10) gibt es nicht im DB und gäbe es auch nicht im Panel, wenn Du "extArray" symbolisch angelegt hättest. Egal, ob Du im DB ein ARRAY[1..10] hast, im Script hat das Array die Elemente (0) bis (9).

Wozu hast Du das Panel-interne Array "intArray" angelegt? ("intArray" ist bei Dir ein SmartTag, keine Script-interne Variable).
Normalerweise legt man im Script mit "Dim scriptArray(9)" eine temporäres Array an und kopiert zuerst das SmartTags("extArray") in das scriptArray.




Kai schrieb:


> ```
> Dim intArray(9), i
> 
> For i = 0 To 9
> ...





Kai schrieb:


> ```
> 'Werte in die Datei schreiben
> For i = 1 To 10
> ts.WriteLine i & ";Wert;" & SmartTags("extArray")(i - 1)
> ...


So wie von Kai gezeigt soll man es eigentlich nicht machen.

Zitat aus dem WinCC flexible Information System


> *Grundlagen zu Arrays*
> 
> *Warnung*
> Erhöhte Systemauslastung und Performanceeinbußen
> ...


Allerdings schreibt die Hilfe nicht, wie man das PLC-Array in das interne Array kopieren soll.
In WinCC flexible 2008 SP2 Upd1 ist das Kopieren von kompletten Arrays anscheinend nicht (mehr?) möglich:

SmartTags("intArray") = SmartTags("extArray")
-> erzeugt Runtime-Errors (Konvertierungsfehler und Typen unverträglich)

scriptArray = SmartTags("extArray")
-> erzeugt Compilerfehler "Fehler: Ein Array kann nicht Ziel einer Zuweisung sein. in Zeile x, Spalte 1 "

Ich meine, die letzte Variante mit dem Kopieren in das script-interne Array "scriptArray" hat "früher mal" funktioniert. 
Ich kann es allerdings nicht nachschauen, weil ich für solche Sachen immer keine Arrays, sondern Rezeptur-Datensätze verwende.

Harald


----------



## Lupo (30 August 2011)

PN/DP schrieb:


> Ich meine, die letzte Variante mit dem Kopieren in das script-interne Array "scriptArray" hat "früher mal" funktioniert.
> Ich kann es allerdings nicht nachschauen, weil ich für solche Sachen immer keine Arrays, sondern Rezeptur-Datensätze verwende.


 
Doch ... da hast du Recht.
Ich kann mich sehr genau erinnern, dass das schon funktioniert hat. Ich hatte aber erst unlängst bei einem eigenen Script auch genau das Problem (mit der Meldung, dass die Typen nicht zusammen passen) habe das aber aus Zeitgründen bei der Inbetriebnahme nicht weiter verfolgt.
Ich vermute auch, dass bei irgend einem Update o.ä. das Ganze mal "über Bord" gegangen ist


----------



## Kai (30 August 2011)

xhasx schrieb:


> ```
> For array_nr = 1 To (i-1)
> zeileninhalt = Split(zeile(array_nr),";",-1,1)
> SmartTags("Micobox\Auftrag1_RCV.Auftragsnummern") (array_nr) = zeileninhalt(0)
> ...


 
Umgekehrt kann man aber ein Array auf einmal in die Steuerung kopieren.

http://www.spsforen.com/showthread.php?t=25678

Gruß Kai


----------



## Kai (30 August 2011)

PN/DP schrieb:


> Ich meine, die letzte Variante mit dem Kopieren in das script-interne Array "scriptArray" hat "früher mal" funktioniert.
> Ich kann es allerdings nicht nachschauen, weil ich für solche Sachen immer keine Arrays, sondern Rezeptur-Datensätze verwende.


 
In WinCC flexible 2007 Runtime hat das Kopieren eines Arrays schon nicht mehr funktioniert.

http://www.automation.siemens.com/W...ow.aspx?PageIndex=1&PostID=168768&Language=en

Gruß Kai


----------



## Larry Laffer (30 August 2011)

Kai schrieb:


> In WinCC flexible 2007 Runtime hat das Kopieren eines Arrays schon nicht mehr funktioniert.


 
Ich würde mich hier hinsichtlich des "Wann" nicht festlegen wollen.
Die Frage die sich mir stellt ist, für den Fall dass das so ist, warum es so ist und vor Allem warum (wenn es ja anscheinend bekannt ist) es nicht wieder in Ordnung gebracht wird, da es ja laut Hilfe auch immer noch so empfohlen wird - vor Allem da es ja auch tatsächlich (schon wegen Konsistenz der Daten) so am sinnvollsten ist ...


----------



## rostiger Nagel (30 August 2011)

Larry Laffer schrieb:


> Die Frage die sich mir stellt ist, für den Fall dass das so ist, warum es so ist...



da will ich mal eine Vermutung anstellen, Siemens möchte den 'PowerTag-Sparen'
einen Riegel vorschieben. Sie verdienen an einen Array weniger wie an vielen 
PowerTags, Geld ist bei den Laden halt alles.


----------



## Larry Laffer (31 August 2011)

... das mit den Tags kann es nicht sein, denn wie Kai schon richtig geschrieben hat, kannst du ja in einer Schleife die Elemente des Array's umkopieren - sogar ohne Typecast. Ich denke eher, dass es mal einem der System-Programmierer bei Siemens für irgend eine andere Funktion im Weg war (weil vielleicht auch noch nicht richtig ausgereift oder dem "falsche-Querverweise-im-Projekt"-Thema) und dann nie wieder aktiv geschaltet wurde.

Gruß
Larry


----------



## CNC840D (1 September 2011)

*Vielen Dank Ihr seit super*

Hallo,
wollte nur mal Rückmeldung geben hat Dank eurer Hilfe alles Super funktioniert :sm24:

Vielen Vielen Dank 

P.S. hab mich für Kai's Lösung entschieden da diese für mich am besten vertändlich ist



Kai schrieb:


> Zum Kopieren von Arrays in VBS sollte der folgende Programmcode funktionieren:
> 
> 
> ```
> ...


----------

