TIA VBS CSV einlesen und in CPU Schreiben

Bronko1

Level-2
Beiträge
19
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebe Forumsmitglieder,

ich steh seit geraumer Zeit vor ein Problem welches auch durch Support von Siemens nicht gelöst worden ist.
Problem: Ich muss eine CSV Datei einlesen(30 Zeilen lang) und diese Werte dann in die CPU bringen. Die CSV sieht folgender maßen aus

550-40-8Y28202172745458ZAAB F4N !
650-30-8Y28202178745458ZAAB F4N !
……

Voraussetzung: Panel PC, S7 1500

HMI Variable = DB_FZ_Daten_Test_Fahrzeug{0}_FZdaten{0} usw. bis zur 30 (DB_FZ_Daten_Test_Fahrzeug{30}_FZdaten{30})

So das Einlesen und das Einspielen der Werte (555 und 40) in die CPU funktioniert. Leider wird der 3 Teilstring irgendwie nicht richtig gelesen d.h. ich bekomme nur den ersten Char und danach hört das Script auf zu arbeiten. Verwende ich aber den 3 Teilstring nicht werden alle SKID_NR und STP eingelesen und an die CPU übergeben.

Code:
Sub Read_data_FZ()

Dim fso, f, splitdata, Line, FileName, i,j
Dim SKID,STP,Pin_String

FileName ="D:\Projects\Datenbackup1.csv"
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.openTextFile(FileName, 1,0,-2)
i=0

Do While Not f.AtEndOfStream '<> True 'String
    Line = f.ReadLine
    SKID="DB_FZ_Daten_Test_Fahrzeug{"+CStr(i)+"}_SKID_NR"
    STP="DB_FZ_Daten_Test_Fahrzeug{"+CStr(i)+"}_Stellplatz"
    splitdata = Split(Line, "-")
    SmartTags(SKID) = CInt(splitdata(0))
    SmartTags(STP) = CInt(splitdata(1))
    Pin_String = splitdata(2)
        For j=1 To 30 Step 1
            SmartTags("DB_FZ_Daten_Test_Fahrzeug{"+CStr(i)+"}_FZdaten{"+CStr(j)+"}") = CByte(Mid(Pin_String,j,1))
        Next
    i=i+1
Loop

fso.Close
Set f = Nothing
Set fso = Nothing
ShowSystemAlarm "Readout of the data was successful!"
End Sub

Nun meine Frage kennt jemand das Problem und könnte helfen?

Danke schon mal im Vorraus.

MFG Daniel
 
Zuletzt bearbeitet:
So ganz verstehe ich dein Script nicht ...
Zum Einen ist Pin_String ja erstmal eine lokale Variable in dem Script.

Und dann :
For j=1 To 30 Step 1
SmartTags("DB_FZ_Daten_Test_Fahrzeug{"+CStr(i)+"}_FZdaten{"+CStr(j)+"}") = CByte(Mid(Pin_String,j,1))
Next
i=i+1
Loop
was soll diese Schleife nach deiner Vorstellung bewirken ?

Was heißt "hört das Script auf zu arbeiten" ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So ganz verstehe ich dein Script nicht ...
Zum Einen ist Pin_String ja erstmal eine lokale Variable in dem Script.

Und dann :

was soll diese Schleife nach deiner Vorstellung bewirken ?

Was heißt "hört das Script auf zu arbeiten" ?

Gruß
Larry
Also die Schleife ersetzt folgende Anweisung (die auch nicht Funktioniert)

SmartTags("DB_FZ_Daten_Test_Fahrzeug{"+CStr(i)+"}_FZdaten{2}") = CByte(Mid(Pin_String,1,1)) ' Lese ersten Char der Zeichenkette
.....
SmartTags("DB_FZ_Daten_Test_Fahrzeug{"+CStr(i)+"}_FZdaten{31}") = CByte(Mid(Pin_String,30,1)) Lese letzten Char der Zeichenkette

Und mit hört auf zu arbeiten meine ich es bricht einfach ab ohne Fehlermeldung usw. d.h. die ersten 2 Teilstrings werden bearbeitet der 3 begonnen und nach dem der erst Char gelesen wurde Passirt nix mehr.
 
HMI Variable = DB_FZ{0}_PIN{0} usw. bis zur 30
Was heißt "usw. bis zur 30"? Hast Du ca. 930 HMI-Variablen angelegt: DB_FZ{0}_PIN{0}, DB_FZ{0}_PIN{1} .. DB_FZ{0}_PIN{30}, DB_FZ{1}_PIN{0}, DB_FZ{1}_PIN{1} .. DB_FZ{1}_PIN{30} .. DB_FZ{30}_PIN{30} ?

ich bekomme nur den ersten Char und danach hört das Script auf zu arbeiten. Verwende ich aber den 3 Teilstring nicht werden alle SKID_NR und STP eingelesen und an die CPU übergeben.
Wie lautet der Runtime-Error? Kannst Du Runtime-Errors überhaupt sehen?
Welche WinCC Runtime Version verwendest Du?

Code:
        For j=1 To 30 Step 1
            SmartTags("DB_FZ_Daten_Test_Fahrzeug{"+CStr(i)+"}_FZdaten{"+CStr(j)+"}") = CByte(Mid(Pin_String,j,1))
        Next
Mit SmartTags("DB_FZ_Daten_Test_Fahrzeug{"+CStr(i)+"}_FZdaten{"+CStr(j)+"}") werden die Namen von ca. 900 HMI-Variablen zusammengebastelt - gibt es diese 900 HMI-Variablen auch alle? Warum heißen die HMI-Variablen hier anders als in Deiner Erklärung oben?


ich steh seit geraumer Zeit vor ein Problem welches auch durch Support von Siemens nicht gelöst worden ist.
Warum hat der Siemens Support das Problem nicht gelöst? Wollten die Geld? ;)

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald,
ja es gibt in der Hmi wirklich die Variablen DB_FZ_Daten_Test_Fahrzeug{0}_FZdaten{0} - DB_FZ_Daten_Test_Fahrzeug{30}_FZdaten{30} 😅 Text im ersten Post habe ich geändert.
Die Runtime verson ist WinCC RT Advanced 16.0.0.0

Thema Siemens: Laut Siemens ist das DB_FZ_Daten_Test_Fahrzeug{0}_FZdaten{0} ein 2D Array und das kann nicht über SmartTags so SmartTags("DB_FZ_Daten_Test_Fahrzeug{"+CStr(i)+"}_FZdaten{"+CStr(j)+"}") aufgeschlüsselt werden. Es muss angeblich ein seperates Bild erzeugt werden welches die Variablen initialisiert und zwar Byte weise. Gesagt getan keine Änderung des Ergebnisses.

@ Larry: Der sting ist 30 Zeichen lang 8Y28202172745458ZAAB F4N ! schreib fehler im ersten Post bzw es werden leerzeichen im Post eingekürz
 
Ich hadere immer noch "ein bisschen" mit den vielen Variablen und dem Zusammenbasteln der Namen - hast du die mal kontrolliert ob das wirklich 1:1 passend erstellt wird ?
Dann : warum übergibst du den String Byte-weise in lauter einzelne Variablen ? Du kannst doch den String auch als String an die SPS übergeben und ihn dort zerlegen (falls notwendig) ...

Gruß
Larry
 
Hallo Larry,
das mit der String Übergabe in der SPS war meine letzte option wollte eigentlich alles an einem Ort haben. Die String übergabe funktioniert auch habe das schon getestet. Es ist halt nur unschön nen Sepreaten DB dafür zu nutzen da der org. DB von der Strucktur nicht verändert werden darf.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Leider wird der 3 Teilstring irgendwie nicht richtig gelesen d.h. ich bekomme nur den ersten Char und danach hört das Script auf zu arbeiten.
Kannst Du denn sehen, welches Zeichen im 3. TeilString an Position 2 steht? Etwa das Zeichen 'LF' (dez. 10)?
Vielleicht erscheint der Rest des Satzes als folgender Satz?

Könntest Du mal ein Exemplar einer nicht funktionierenden CSV-Datei hochladen?

@Ralf:
Wie kommst Du auf 30 Zeichen? Wegen der LaufVariable, die 30 erwarten lässt?
Der OT schrieb in #1 etwas von 30 Zeilen.
 
Hallo Larry,
das mit der String Übergabe in der SPS war meine letzte option wollte eigentlich alles an einem Ort haben. Die String übergabe funktioniert auch habe das schon getestet. Es ist halt nur unschön nen Sepreaten DB dafür zu nutzen da der org. DB von der Strucktur nicht verändert werden darf.
Das mußt du bitte mal näher erklären ...
Die String-Übergabe funktioniert ? Wie sieht denn deine Struktur aus und wie hängt das Ganze jetzt zusammen ?
Am Besten veröffentlichst du mal den SPS-Struct ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Laut Siemens ist das DB_FZ_Daten_Test_Fahrzeug{0}_FZdaten{0} ein 2D Array und das kann nicht über SmartTags so SmartTags("DB_FZ_Daten_Test_Fahrzeug{"+CStr(i)+"}_FZdaten{"+CStr(j)+"}") aufgeschlüsselt werden.
DB_FZ_Daten_Test_Fahrzeug{0}_FZdaten{0} ist kein Array sondern alles einzelne Variablen. Vielleicht meint Siemens die mit der HMI-Variable verbundene PLC-Variable? Die PLC-Variable kann durchaus ein Array sein, das TIA kann aber keine HMI-Variablen mit mehreren Dimensionen bzw. Array in Array. Nachtrag: Kann TIA V16 HMI-Variablen als ARRAY OF STRUCT oder ARRAY OF STRING?

Wie ist der originale DB in der SPS von der Struktur her deklariert? Und ist der DB "optimiert" oder Standard-Zugriff? Und vom HMI her vermutlich nur symbolischer Zugriff auf die PLC-Variablen?

das mit der String Übergabe in der SPS war meine letzte option wollte eigentlich alles an einem Ort haben. Die String übergabe funktioniert auch habe das schon getestet. Es ist halt nur unschön nen Sepreaten DB dafür zu nutzen da der org. DB von der Strucktur nicht verändert werden darf.
Wenn das HMI etwas nicht kann, dann nimm doch in der SPS für das HMI einen zusätzlichen Koppel-DB mit einer Struktur, die das HMI kann und kopiere in der SPS aus dem Koppel-DB in den eigentlichen DB. Für die nur 90 Variablen wäre es sowieso besser, die alle in eine Rezeptur zu stecken und im HMI in die Rezeptur einlesen und in der SPS aus der Rezeptur in den Ziel-DB kopieren. Es kommt ja noch das Problem dazu, daß man nicht weiß wann die WinCC Adv. RT die Variablen alle in die SPS geschrieben hat.

Harald
 
Zuletzt bearbeitet:
@Larry: String übergabe geht damit meine ich wenn ich den Pin_String direckt an die CPU Übergebe und nicht die Teilzeichen auslese geht das
z.b. SmartTags("Car String{"+CStr(i)+"}")= Pin String Car_String ist ein ARRAY in der CPU Carstein [0 ... 29] of String und die HMI Wariablen sind Car String{0} -Car String{29}

@ Harald: Bei den HMI Variablen habe ich symbolisch und absolut getestet dies macht kein unterschied ich zerlege jetzt den String in der CPU selber. Es ist zwar dan alles nicht mehr Zentral aber OK. Eine Verwendung von der Rezeptur ist bei unserem Kunden absolut Verboten.

@ All Danke erstaml für eure Hilfe. Falls jemand mein Problem doch noch irgendwie gelöst bekommt wäre toll da ich den seperaten DB den ich jetzt verwende bei unseren Kunden Anmelden muss und das eine Bewertungsschleife nach sioch zieht die ca 6 Wochen dauert.
 
Eine Verwendung von der Rezeptur ist bei unserem Kunden absolut Verboten.
Warum??? Gibt es dafür eine Begründung?
Und wenn das technisch notwendig ist?! Ist es bei dem Programm egal, wann die Daten aus der csv-Datei in der SPS angetröpfelt kommen, wann sie komplett sind? Oder wie erkennst Du das? Einfach ein paar Sekunden Angstzeit abwarten und hoffen, das wird schon gut gegangen sein?

Garantiert konsistent Daten vom HMI in die SPS und umgekehrt von der SPS ins HMI übertragen geht bei WinCC Advanced nur als Rezeptur (*) oder jede einzelne Variable auf Änderung überwachen oder mit Prüfsumme über alle Variablen.

(*) Stichworte: Systemfunktionen SetDataRecordTagsToPLC und GetDataRecordTagsFromPLC

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Larry: String übergabe geht damit meine ich wenn ich den Pin_String direckt an die CPU Übergebe und nicht die Teilzeichen auslese geht das
z.b. SmartTags("Car String{"+CStr(i)+"}")= Pin String Car_String ist ein ARRAY in der CPU Carstein [0 ... 29] of String und die HMI Wariablen sind Car String{0} -Car String{29}
Ähh ... sorry ... ein bisschen mehr Mühe hättest du dir mit der Antwort schon geben dürfen ...
Ich verstehe da gerade gar nichts ...
Auf jeden Fall (das habe ich irgendwie da heraus interpretiert) hast du in der SPS ein Array of String - warum also die Char-Geschichte ?
 
@ Larry der org. DB ist in einer Array Structur of Byte unterglieder und leider auch die Pin deswegen die einzelnen Chars. Aktuell übermittle ich die Pin als String an die CPU und zerlege den dan in seine Einzelteile und sende diesen dan an den org. DB.
@ harald das Skrip für jetzt für jeden einzelnen Datensatz ein handshake mit der CPU aus so das garantiert werden kann dass die Daten vollständig übergeben wurden. Sollte es zu einem Fehler Im Skrip oder CPU kommen wird keine weiter Zeile der CSV über geben und eine Fehlermeldung ausgegeben (Es müssen immer 30DS übergeben werden). Die selbe Funktion hat jetzt auch der SCL Baustein in der CPU.
Stichwort Angstzeit sowas hab und werde ich hoffentlich ne verwenden wenn es um Datenübertragung geht 😅.
 
Hallo Daniel,

zum besseren Verständnis:
Kannst du mal ein Bild der HMI-Variablentabelle, in der sich die Variablen
Code:
SmartTags("DB_FZ_Daten_Test_Fahrzeug{"+CStr(i)+"}_FZdaten{"+CStr(j)+"}")
befinden, posten?

Ist es nämlich eine Variable wie diese
Code:
"DB_FZ_Daten_Test_Fahrzeug{1}_FZdaten{1}"  -> Datentyp 'Char'
dann wäre dein Zugriffsversuch ok (Gemäß Harald müssten dann aber alle Array-Elemente als Einzelvariablen existieren!).

Ist es hingegen eine Variable wie diese
Code:
"DB_FZ_Daten_Test_Fahrzeug{1}_FZdaten"  -> Datentyp 'Array[1..30] of Char'
dann müsste der Zugriff SO projektiert werden:
Code:
SmartTags("DB_FZ_Daten_Test_Fahrzeug{"+CStr(i)+"}_FZdaten")(j)


Gruß, Fred
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ist es hingegen eine Variable wie diese
Code:
"DB_FZ_Daten_Test_Fahrzeug{1}_FZdaten"  -> Datentyp 'Array[1..30] of Char'
dann müsste der Zugriff SO projektiert werden:
Code:
SmartTags("DB_FZ_Daten_Test_Fahrzeug{"+CStr(i)+"}_FZdaten")(j)
Ich hatte es so verstanden, dass alle Arrays bei 0 anfangen und mit 29 aufhören. Für die MID-Funktion wird aber 1...30 benötigt.
Man kann sich aber auch den Luxus gönnen, ggfs (d.h. "bei Bedarf") statt i oder j dann i+1 oder i-1 oder j+1 oder j-1 schreiben.
Liegt da vielleicht der Hund begraben? Aber das würde nicht erklären, warum das Problem immer erst mit dem 3. Satz anfängt.
 
Aber das würde nicht erklären, warum das Problem immer erst mit dem 3. Satz anfängt.

Der OP @Bronko1 meint nicht den 3. Datensatz (Zeile) sondern den 3. Teilstring in der Zeile. Sobald er den zeichenweise in die 30 einzelnen HMI-Variablen kopieren will, bricht das Skript "ohne Fehlermeldung" ab. Die im Skript zusammengebastelten HMI-Variablen sollen alle existieren (sogar mit {0}..{30} in den Variablennamen). Leider sind alle seine Postings nicht besonders sorgfältig erstellt und enthalten Fehler. Nachfragen nach Details beantwortet er weitgehend nicht. Und er erwähnt ziemlich stringente und teilweise unsinnige Vorgaben des Kunden. Für die garantiert konsistente/vollständige Übertragung der Daten vom HMI in die CPU wird ein eigenes Handshake gestrickt, weil Datensatz-Übertragung mit Statusmeldung angeblich "absolut verboten" ist. Da wird vermutlich nichts mehr kommen, was zu einer guten Lösung führen kann.

Harald
 
@Heinilein:
Hast recht, missverständlich geschrieben.
Wobei Siemens ja automatisch aus [1..30] ein [0..29] macht, sobald ein solches Array im HMI projektiert wird.

Mir ging es aber um den Unterschied des Zugriffs
1. auf Einzelvariablen (also ein möglicher Array-Index als Namensbestandteil)
2. auf Elemente eines Arrays (also ein möglicher Array-Index außerhalb des Variablennamens)
 
Zurück
Oben