Array aus DB in CSV Datei schreiben flexibel über Skript

CNC840D

Level-2
Beiträge
161
Reaktionspunkte
10
Zuviel Werbung?
-> Hier kostenlos registrieren
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 :confused:

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
 

Anhänge

  • Csv_sc_2.zip
    2,4 MB · Aufrufe: 122
Zuletzt bearbeitet:
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
 
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.

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

Gruß Kai
 
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.


Code:
Dim intArray(9), i
 
For i = 0 To 9
    intArray(i) = SmartTags("extArray")(i)
Next
Code:
'Werte in die Datei schreiben
For i = 1 To 10
    ts.WriteLine i & ";Wert;" & SmartTags("extArray")(i - 1)
Next
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


Bei einem Lesezugriff oder Schreibzugriff auf ein einzelnes Arrayelement werden immer alle Arrayelemente der Arrayvariablen gelesen oder geschrieben. Daher dauert bei großen Arrays die Datenübertragung von und zur Steuerung generell länger als bei einem elementaren Datentyp. Dies kann die Kommunikation überlasten und dadurch stören.
[...]

Verwendung in Skripten

Aus den gleichen Performancegründen verwenden Sie in Skripten zum Ändern von Arrays immer interne, temporäre Arrays.
1. Am Anfang des Skripts kopieren Sie das PLC-Array in das interne Array.
2. Während das interne Array durch das Skript bearbeitet wird, belasten Sie dadurch nicht die Datenübertragung zur Steuerung.
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. :confused:
Ich kann es allerdings nicht nachschauen, weil ich für solche Sachen immer keine Arrays, sondern Rezeptur-Datensätze verwende.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich meine, die letzte Variante mit dem Kopieren in das script-interne Array "scriptArray" hat "früher mal" funktioniert. :confused:
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 :rolleyes:
 
Code:
For array_nr = 1 To (i-1)
  zeileninhalt = Split(zeile(array_nr),";",-1,1) 
  SmartTags("Micobox\Auftrag1_RCV.Auftragsnummern") (array_nr) = zeileninhalt(0)
Next

Böses Foul!!! Bei jeder Zuweisung werden alle 200 Elemente in die Steuerung geschoben!!! Dann kommt es zur Überlast!!!

Trick bzw. Lösung:

Code:
DIM TempArray(200)
 
For array_nr = 1 To (i-1)
  TempArray(array_nr-1) = Split(zeile(array_nr),";",-1,1)
Next
 
SmartTags("Micobox\Auftrag1_RCV.Auftragsnummern") = TempArray

Jetzt wird das Array genau einmal in die Steuerung geschoben.

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

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

Gruß Kai
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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 ...
 
... 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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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

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

Code:
Dim intArray(9), i
 
For i = 0 To 9
    intArray(i) = SmartTags("extArray")(i)
Next

Gruß Kai
 
Zurück
Oben