TIA WinCC V15 - VBA Script lässt sich nicht über Variable aufrufen

Kistecola

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

ich habe ein Problem mit einem VB-Script in einer WinCC Runtime (Advanced).
Wir programmieren mit V15.

In einem aktuellen Projekt geht es darum, CSV-Dateien als zyklischer Log (1s-Impulse) zu schreiben, um eine Protokollierung des Ansatzes bereitzustellen.

Hier mal der Code:

Sub VBFunktion_2()
'Tip:
' 1. Verwenden Sie die Tastenkombination <CTRL+SPACE> oder <CTRL+I>, um eine Liste aller Objekte und Funktionen zu öffnen
' 2. Schreiben Sie den Code unter Verwendung des HMI Runtime Objekts.
' Beispiel: HmiRuntime.Screens("Screen_1").
' 3. Verwenden Sie die Tastenkombination <CTRL+J>, um eine Objektreferenz zu erstellen.
'Schreiben Sie den Code ab dieser Position:


'hochzählen, wenn das Script aufgerufen wird
dbCSV_1_iCSVCounter = dbCSV_1_iCSVCounter + 1


'Variablendeklaration
Dim FName, fso, DataSet, fout

'ab hier wird geschrieben
If dbCSV_1_iStartWrite = 2 Then

'hochzählen, wenn geschrieben wird. Wenn geschrieben wird wird immer 2 hochgezählt
dbCSV_1_iCSVCounter = dbCSV_1_iCSVCounter + 1


'Dateinamen festlegen, kommt aus CPU
FName = dbCSV_1_strFilename
Set fso = CreateObject("Scripting.FileSystemObject")

'prüfen, ob Datei vorhanden oder nicht. wenn nicht vorhanden neue anlegen
If Not fso.FileExists(FName) Then
fso.CreateTextFile FName
'Datei erzeugen und Titelzeile schreiben
DataSet = "Datum" & ";" & "Uhrzeit" & ";" & "Restzeit" & ";" & "Restzeit" & ";" & "Schritt" & ";" & "Drehzahl" & ";" & "Temperatur" & ";" & "Vakuum"
Set fout = fso_OpenTextFile(FName,8, True)
fout.WriteLine(DataSet)
fout.Close
End If

'hier die wirklichen Werte aus der Maschine schreiben - müssen noch geprüft werden
DataSet = dbPanel_sValues_dtActual & ";" & dbPanel_sValues_iActiveStep & ";" & dbPanel_sValues_sActual_rActSpeedDissolver & ";" & dbPanel_sValues_sActual_rActTemperature & ";" & dbPanel_sValues_sActual_rActVacuum

Set fout = fso_OpenTextFile(FName,8, True)
fout.WriteLine(DataSet)
fout.Close
dbCSV_boStartCSVNEW = dbCSV_boStartCSVNEW +1

End If

End Sub



Das Starten des VB-Script soll über "dbCSV_1".iStartCSVNEW - erfolgen. Sobald das script gestartet werden soll schicken wir hier einen sekundenpuls drauf und addieren 1 (auch schon mit 10 getestet). In der HMI-VAT wird auf Wertänderung geprüft und dann das VB-Script aufgerufen.

Für alle Variablen aus dem DB ist im HMI eine aktualisierungszeit von 100ms eingestellt.

Leider funktioniert das ganze nicht.

Der Code an sich geht, da die CSV geschrieben wird, wenn ich das Aufrufen auf eine Schaltfläche im HMI lege.

Kann mir jemand sagen, was ich falsch mache?
 

Anhänge

  • DB.jpg
    DB.jpg
    165,9 KB · Aufrufe: 13
Hallo

Mit "funktioniert nicht" meinst Du vermutlich, daß das Skript gar nicht aufgerufen wird?
--> Die Triggervariable muß auch verwendet werden damit die RT die Variable zyklisch liest und eine Wertänderung erkennt. Entweder in einem Bild verwenden und das Bild muß angezeigt werden, oder die Aktualisierung der Variable auf "zyklisch fortlaufend" setzen, dann wird sie immer aktualisiert.

Du bekommst danach ein weiteres Problem: obwohl Du alle verwendeten Variablen auf Aktualisierungszeit 100ms eingestellt hast (völlig unnötig), werden die Variablenwerte erst NACH dem Schreiben in die Datei aus der SPS gelesen - in den ersten beiden Datensätzen (Zeilen) ist damit zu rechnen, daß 0-Werte in der Datei stehen und in den späteren Zeilen werden Werte von irgendeinem früheren Auslesen drin stehen (von vermutlich 1s oder 2s vorher).

Um die Daten garantiert aus der SPS gelesen zu haben vor dem Schreiben in die Datei, müsstest Du die Daten als Rezeptur zusammenfassen und die Rezeptur mit GetDataRecordTagsFromPLC mit Fertigmeldung aus der SPS ins HMI einlesen.
Suche mal mit der Forumssuche nach "GetDataRecordTagsFromPLC" und vbs, csv, USB, da findest Du unzählige Beiträge über die Probleme des Datenlesens mit der HMI.

Alle 1s in eine Datei schreiben ist sowieso ziemlich sportlich - dafür ist das WinCC Advanced eigentlich nicht ausgelegt. Kannst Du nicht einfach die normale Variablenarchive-Funktionen nutzen? Da brauchst Du diese unsichere Skripterei nicht, sondern konfigurierst einfach nur die Archivierung.

Was hast Du für eine CPU? Kannst Du mit der CPU die Daten in eine Memorycard der CPU schreiben? Oder mit der CPU die Datzen aktiv an einen TCP-Server senden? Oder kannst Du ein externes PC-Programm zum Datenlesen nehmen?

PS: Wieviele Variablen sollen wie lange wie häufig in die Datei geschrieben werden?

Harald
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald,

erstmal vielen Dank für die schnelle, ausführliche und kompetente Antwort!

Jetzt habe ich echt versucht an alles zu denken, aber wie man sieht vergisst man doch die Hälfte...

also:

Wir haben eine S7-1500 ET200SP CPU (6ES7512-1DK01-0AB0)

Wenn die ersten beiden Zeilen falsch sind wäre das nicht schlimm, das könnte man über ein paar Zeilen und Zeiten auf der CPU umgehen. Die Aufzeichnung soll Automatikabläufe protokollieren, dann startet der Batch eben erst nach 2 sekunden nachdem die CSV das erste mal geschrieben wurde... - trotzdem Danke für den Hinweis!

Variablenarchive kenne ich nicht bzw. habe ich mich noch nicht mit befasst - zudem haben wir in diesem Fall eine Runtime auf einem Industrie-PC (sry wenn ichs nicht erwähnt habe) und für die Variablenarchive benötigt man eine Lizenz?

Memorycard der CPU ist nicht gewünscht, da der Kunde sich die CSV-Dateien vom IPC über LAN runterziehen will - der Industrie-PC ist auf der IT des Kunden gehostet und die richten das dann ein.

Externes Programm könnte man auch nehmen, ja. kostet aber wieder geld, und wir wollten in diesem Fall versuchen das über das Panel/Runtime zu lösen, um für die Zukunft einen "Standard" griffbereit zu haben, wenn CSV-export gewünscht ist.

Den Code habe ich aus einem älteren Projekt mit WinCC Flexible kopiert, da hat ein früherer Programmierer das mal gemacht.



habe es in der Zwischenzeit auch "stabil" zum laufen bekommen:

wie du erwähntest war nicht die 100ms ausschlaggebend sondern die Aktualisierung der Variable "zyklisch fortlaufend"...
 
Wenn die ersten beiden Zeilen falsch sind wäre das nicht schlimm
Es kann auch vorkommen das z.B. in Zeile x 5 Variablen-Werte vom Zeitpunkt x-1 sind und 3 Variablen-Werte vom Zeitpunkt x-2 (und unbekannt welche Werte von welchem Zeitpunkt) --> der Datensatz wäre in sich nicht konsistent. Das wäre auch nicht schlimm??

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
wie harald schon schrieb ist der inhalt der variablen nicht konsistent. das kannst du nur über ein rezept lösen. aber das rezept dauert halt seine zeit. 1 sek halte ich hier für unrealistisch. du könntest den kompletten verlauf vorher in einen db schreiben und nach abschluss diesen per rezept laden und in die csv schreiben.
 
Variablenarchive kenne ich nicht bzw. habe ich mich noch nicht mit befasst - zudem haben wir in diesem Fall eine Runtime auf einem Industrie-PC (sry wenn ichs nicht erwähnt habe) und für die Variablenarchive benötigt man eine Lizenz?
Schau mal in die TIA Hilfe: TIA Informationssystem > Suchen nach: Variablenarchive
Für die Variablenarchive benötigt man keine zusätzliche Lizenz, die Archive müssen einfach nur projektiert werden und funktionieren dann "von alleine" ohne weitere externe Ereignisse, sie aktualisieren dann auch die verwendeten Variablen automatisch.

Harald
 
Zurück
Oben