WinCC SmartTags in Schleife verwenden

MartinJ12

Level-1
Beiträge
43
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

meine Ausgangslage ist wie folgt: die einzelnen SmartTags-Variablen sind angelegte Arrays im HMI-Variablen, diese möchte ich gerne mit den 12 übergebenen Values der CSV-Datei befüllen.
Geht das dynamisch? Falls ja wie? Bei der Methode die ich momentan verwende, zeigt mir der Editor von TIA VBS einen Fehler an, jedoch halten sich meine Kenntnisse der Implementierung mit VBS sehr in Grenzen und ich finde den Fehler pertu nicht.

Vielen Dank für die Vorschläge und Anregungen für die Verbesserungen und Lösungen.
Grüße,
Martin



Code:
Sub ReadFromCSV()

Dim file_open, file, ts
Dim FileName, data, splitdata
Dim n, delimiter
 


' Pfad und Dateiname zur Speicherung der Variablen und Werte bei Betätigung des Tasters
FileName = "H:\"




' Fehler abfangen
On Error Resume Next

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

' Liefert das File-Objekt zurück
Set file = file_open.GetFile(FileName, True)
' Fehlerabwicklung
If Err.Number <> 0 Then
    ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
    Err.Clear
    Exit Sub
End If


delimiter = ';'
data = file.LineInputString 'Zeilen und Werte speichern
data = Replace(data, vbTab & vbTab, delimiter)
splitdata = Split(data, delimiter)
'Die nachfolgende Elemente lesen die ersten zwölf Zeilen ein und die dazugehörigen Spalten
For n = 0 To 11
    SmartTags("Datum")                 = splitdata(n)
    SmartTags("Uhrzeit")                = splitdata(n)
    SmartTags("User")                = splitdata(n)    
    SmartTags("Produkt")                = splitdata(n)
    SmartTags("Laufkartennummer")    = splitdata(n)
    SmartTags("Materialnummer")        = splitdata(n)
    SmartTags("Fertigungsauftrag")    = splitdata(n)
Next



End Sub
 
Zuletzt bearbeitet:
Hallo Martin,

ich müßte mir jetzt auch erst die Funktionen genau ansehen. Aber meine Vermutung:
Du liest mit file.LineInputString nur die erste Zeile ein.
Diese Zeile splittest Du auf mit Split.
Jetzt hast Du ein Array in splitdata vorliegen, das vermutlich 7 Elemente hat, und zwar die, die Du in der FOR-Schleife aufzählst als SmartTags.

In der FOR liegt jetzt das eigentliche Problem: Du weist jedem SmartTag den gleichen Wert zu. --> nicht gewollt.
Du beschreibst ein und das selbe SmartTag 12 mal. --> nicht gewollt.
Du versuchst auf splitdata mit 7 Elementen aber mit n = 0..11 zuzugreifen --> Speicherverletzung

Gruß
Jens
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Jens,

also alles was du sagst ist genau richtig und kann ich auch nachvollziehen.
1. Somit müsste ich als erstes einmal das LineInputString löschen weil es Quatsch ist richtig?
2. das splitdata kann ich lassen oder?
3. Wie würde sich dann die For-Schleife aufbauen?

Gruß,
Martin
 
Du mußt das LineInput so oft ausführen, wie Du Zeilen hast. Also eigentlich gehört das ganze in eine Schleife, weil Du das ja für mehrere Zeilen vermutlich ausführen mußt, oder nur für eine?

splitdata ist korrekt, das zerlegt Dir ja Deinen Srting.

Die Schleife macht keinen Sinn, weil Du dafür auch auf der SmartTag-Seite ein Array haben müßtest, auf das Du mit der Index-Variablen zugreifen kannst.
Da Du aber 7 verschiedene SmartTags hast, macht das FOR keinen Sinn.
Aber die zugewiesenen Daten müssen sich unterscheiden, als anstatt splitdata(n) mußt Du das n durch die Position der Daten im CSV-String ersetzen, also z.B.
Code:
    SmartTags("Datum")                 = splitdata(1)
    SmartTags("Uhrzeit")                = splitdata(2)
    SmartTags("User")                = splitdata(3)    
    SmartTags("Produkt")                = splitdata(4)
    SmartTags("Laufkartennummer")    = splitdata(5)
    SmartTags("Materialnummer")        = splitdata(6)
    SmartTags("Fertigungsauftrag")    = splitdata(7)
 
Okay, ich versuche das nochmal fix wiederzugeben, damit ich es auch richtig verstanden hab.

Also die folgenden Indizes von splitdata(Indize), stehen für die jeweilige Spalte, die lass ich auch immer so?
Ich füge jetzt nur 12 mal den selben Code ein der immer die nächste Zeile ausliest? Ginge das nicht über eine Schleife einfacher und effektiver?
Oder müsste ich LineInputString einfach nur in die Schleife mit einbinden und eben splitdata(Indize) schreiben??
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Welche WinCC Version verwendest Du?
Auf welchem Gerät läuft die WinCC Runtime?

Du hast eine csv-Datei mit (mindestens) 12 Zeilen und in jeder Zeile sind (mindestens) 7 Werte mit ';' getrennt? Oder sind die mit jeweils 2 TABs getrennt?
Deine HMI-Variablen sind Arrays [0..11] (oder größer)?
Code:
[COLOR="#008000"]'Die nachfolgende Elemente lesen die ersten zwölf Zeilen ein und die dazugehörigen Spalten[/COLOR]
For n = 0 To 11
    data = file.ReadLine [COLOR="#008000"]'Zeile einlesen[/COLOR]
    data = Replace(data, vbTab & vbTab, delimiter)
    splitdata = Split(data, delimiter)
    If UBound(splitdata) = 6 Then
        SmartTags("Datum")(n)             = splitdata(0)
        SmartTags("Uhrzeit")(n)           = splitdata(1)
        SmartTags("User")(n)              = splitdata(2)    
        SmartTags("Produkt")(n)           = splitdata(3)
        SmartTags("Laufkartennummer")(n)  = splitdata(4)
        SmartTags("Materialnummer")(n)    = splitdata(5)
        SmartTags("Fertigungsauftrag")(n) = splitdata(6)
    Else
        ShowSystemAlarm "Formatfehler in csv-Datei"
        Exit For
    End If
Next

Achtung: wenn die csv-Datei weniger als 12 Zeilen hat oder weniger als 7 Werte in einer Zeile sind, dann erzeugt Dein Skript Runtime Errors. Also vorzeitiges Dateiende abfangen und nach Split() auf UBound(splitdata) = 6 (oder >= 6) prüfen. Ggf. bei Formatfehlern das ganze Einlesen verwerfen, also erst einmal in ein Skript-lokales Array einlesen.

Schau mal diese FAQ Protool/WinCCflex/TIA Daten lesen / schreiben mit VB-Script und da auch mal den Beitrag #3

Harald
 
Ja, in splitdata liegen die aufgesplitteten Werte von einer Zeile, die Du gerade mit LineInputString gelesen hast.

Also die Zuweisung an die SmartTags muß da fest sein.

Wenn Du zwölf Zeilen auslesen willst, kannst Du das ganze in eine FOR-Schleife packen. Bitte aber auch auf Datei-Ende prüfen, falls das mal nur 10 Zeilen sind!

Du mußt aber auch auf der SmartTag-Seite ein Array haben, um das per Schleife machen zu können... wie willst Du die 12 Zeilen auf der SmartTag-Seite speichern?
So wie Du es jetzt hast, überschreibst Du die SmartTags mit jedem Durchgang und hast am Ende nur die Daten der letzten Zeile...
 
Hallo Harald,

vielen Dank schonmal, darauf wäre ich so schnell nicht gekommen.


Gruß,
Martin
 
Zuletzt bearbeitet:
Zurück
Oben