TIA VBS CSV einlesen und in CPU Schreiben

Er schreibt er hat keine Array-HMI-Variablen, sondern für jedes Zeichen ist eine einzelne HMI-Variable vorhanden:
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} 😅
Daher stellt sich nicht das Problem, daß HMI-Variablen-Arrays immer bei Index 0 beginnen. Daß er da womöglich 30 unnütze HMI-Variablen zuviel hat (für den im Skript nie vorkommenden Index 0) 😅 sollte auch kein Problem sein. Und mit welcher Teil-Variable (welcher Index) des Arrays in der PLC die einzelnen HMI-Variablen jeweils verbunden sind, ist für das Skript egal.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich sehe da keine Kommas, das soll doch ein CSV sein? Falls der Bindestrich das "Komma" sein soll: Wie soll das "Y" denn bitte in eine Zahl gewandelt werden?

CByte(Mid(Pin_String,j,1))
 
Ich sehe da keine Kommas, das soll doch ein CSV sein? Falls der Bindestrich das "Komma" sein soll: Wie soll das "Y" denn bitte in eine Zahl gewandelt werden?

CByte(Mid(Pin_String,j,1))
Stimmt ... ist mir gar nicht aufgefallen ... aber Ja : der korrekte und wahrscheinlich auch gemeinte Befehl müßte demnach ASC heißen ...
 
Ich glaube, ich beginne endlich zu verstehen. Aber nein, nicht wirklich. ASC macht doch auch keinen Sinn?
Einfach auf jegliche Umwandlung verzichten, wenn doch eigentlich nichts gewandelt, sondern nur zerlegt werden muss/soll.
Code:
SmartTags("DB_FZ_Daten_Test_Fahrzeug{"+CStr(i)+"}_FZdaten{"+CStr(j)+"}") = Mid(Pin_String,j,1)
oder
Code:
    Pin_String = splitdata(2)
    For j=1 To 30 Step 1
        if j > Len(Pin_String) Then char = " " Else char = Mid(Pin_String,j,1)
        SmartTags("DB_FZ_Daten_Test_Fahrzeug{"+CStr(i)+"}_FZdaten{"+CStr(j)+"}") = char ' ggfs Asc(char), falls SmartTag doch numerisch sein muss
    Next
um den zerbröselten 3. TeilString auf 30 Zeichen mit blanks aufzufüllen?
 
Zuletzt bearbeitet:
Die CSV sieht folgender maßen aus

550-40-8Y28202172745458ZAAB F4N !
650-30-8Y28202178745458ZAAB F4N !
……
Der Text ist durch das Forum verstümmelt (mehrfache Leerzeichen werden in der Anzeige entfernt, den original-Text kann man beim Zitieren sehen), in einer Code-Box sieht das so aus:
Code:
550-40-8Y28202172745458ZAAB F4N     !
650-30-8Y28202178745458ZAAB F4N     !
……
       123456789012345678901234567890 <-- splitdata(2) wird also genau 30 Zeichen enthalten

Ich bin mal das Skript theoretisch durchgegangen und zu Erkenntnissen gelangt.
Das Skript wird in Runtime Error gehen wegen dem CByte() in der j-Schleife. Da die VBS Runtime Errors nicht abgefangen werden (kein On Error Resume Next vorhanden), heißt das, daß das Skript abgebrochen wird. Möglicherweise kann der OP die Runtime Error Systemmeldungen nicht sehen? (keine Meldeanzeige für Systemmeldungen vorhanden?)

Ohne das CByte() würde der Code vermutlich das tun was es soll, wenn die HMI-Variablen DB_FZ_Daten_Test_Fahrzeug{0}_FZdaten{1} ... DB_FZ_Daten_Test_Fahrzeug{30}_FZdaten{30} vom Typ Char sind.

Leider läßt sich der Code im neuen Forum nicht farbig markieren. Ich habe mal am Zeilenende die Ergebnisse im ersten Schleifendurchlauf hingeschrieben.
Code:
i=0                                                          ' +--- Ergebnisse in erster Zeile der Datei
                                                             ' |
Do While Not f.AtEndOfStream '<> True 'String                ' v
    Line = f.ReadLine
    SKID="DB_FZ_Daten_Test_Fahrzeug{"+CStr(i)+"}_SKID_NR"    ' "DB_FZ_Daten_Test_Fahrzeug{0}_SKID_NR"
    STP="DB_FZ_Daten_Test_Fahrzeug{"+CStr(i)+"}_Stellplatz"  ' "DB_FZ_Daten_Test_Fahrzeug{0}_Stellplatz"
    splitdata = Split(Line, "-")
    SmartTags(SKID) = CInt(splitdata(0))                     ' SmartTags("DB_FZ_Daten_Test_Fahrzeug{0}_SKID_NR") = 550
    SmartTags(STP) = CInt(splitdata(1))                      ' SmartTags("DB_FZ_Daten_Test_Fahrzeug{0}_Stellplatz") = 40
    Pin_String = splitdata(2)                                ' Pin_String = "8Y28202172745458ZAAB F4N     !"  (das sind genau 30 Zeichen)
        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                                                 ' SmartTags("DB_FZ_Daten_Test_Fahrzeug{0}_FZdaten{1}") = CByte("8")
                                                             ' SmartTags("DB_FZ_Daten_Test_Fahrzeug{0}_FZdaten{2}") = CByte("Y") --> RT Error
                                                             ' ...
                                                             ' SmartTags("DB_FZ_Daten_Test_Fahrzeug{0}_FZdaten{30}") = CByte("!") --> RT Error
    i=i+1
Loop

Kritik:
  • als Zeichenketten-Verkettungs-Operator sollte & verwendet werden und nicht +
  • CInt() ist unnötig, das würde der VBS-Code sowieso machen, wenn die HMI-Variable ein Int ist.
  • Wegen dem CByte() wird der Code beim "Y" in Runtime Error gehen!
    Die Codezeile müsste geändert werden zu
  • Code:
            For j=1 To 30 Step 1
                SmartTags("DB_FZ_Daten_Test_Fahrzeug{" & CStr(i) & "}_FZdaten{" & CStr(j) & "}") = Mid(Pin_String,j,1)
            Next
  • Der Code wird in Runtime Error gehen, wenn die csv-Datei mehr als 31 Zeilen hat (wird nicht überwacht bzw. begrenzt), oder wenn keine 2x '-' in einer Zeile enthalten sind (Ergebnis von Split(Line, "-") wird nicht überwacht).

Harald
 
Ich hatte zu lange mit dem neuen Beitragseditor gekämpft... 😧 Den Finger auf dem Fehler hatten auch schon Oberchefe und Heinileini:
Wie soll das "Y" denn bitte in eine Zahl gewandelt werden?

CByte(Mid(Pin_String,j,1))
Einfach auf jegliche Umwandlung verzichten, wenn doch eigentlich nichts gewandelt, sondern nur zerlegt werden muss/soll.
Code:
SmartTags("DB_FZ_Daten_Test_Fahrzeug{"+CStr(i)+"}_FZdaten{"+CStr(j)+"}") = Mid(Pin_String,j,1)

Harald
 
Das Wort "Komma" in "comma-separated values" darf man nicht sooo wörtlich nehmen. Der Separator (Listentrennzeichen) kann/darf durchaus (z.B. landes/regionsabhängig oder Benutzer-Vorlieben-abhängig) auch mal ein Semikolon oder Tabulator oder ... oder auch ein Bindestrich sein.

Harald
 
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.
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.
Man muß dafür keinen separaten DB verwenden. Dürftest Du denn wenigstens an den originalen DB nur für die Übergabe vom HMI hinten eine zusätzliche Struktur anhängen? (falls das Weglassen des CByte() nicht Deine Lösung ist)

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Bronko1
Du willst u.a. die Information aus 30 (Teil-)Strings, die je 30 Zeichen enthalten, in die PLC schaufeln.

Der Weg, die 30 Strings - so wie sie sind - in die PLC zu schaufeln, ist getestet und funktioniert, schreibst Du.
Um die 30 Strings in der PLC abzulegen, benötigst Du aber Platz in einem DB, den Du jedoch nicht zur Verfügung stellen kannst bzw. willst.

So weit, so schlecht.

Ersatzweise versuchst Du deshalb, die 900 Zeichen einzeln (sozusagen auf getrennten Wegen) in die PLC zu schaufeln.
Und bei diesem Lösungsweg benötigst Du dann keinen DB, um die 900 Zeichen in der PLC abzulegen?

Bitte klär uns auf, wie dieser gravierende Unterschied zwischen beiden Varianten zustande kommt.
 
Zurück
Oben