WinCC Datenlogger per Skript, TP1200 comfort

SPS-Koch

Level-2
Beiträge
24
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

Ich habe ein TP1200 comfort und möchte mit einem Skript auf einem USB-Stick bei jedem Aufruf eine csv Datei erstellen mit Benennung durch zwei Strings.
Gefüttert wird die Datei dann mit Uhrzeit, Produkttyp und verschiedenen Prozessvariablen.

Ich habe vom Siemens Support ein Skript bekommen und habe mir ein paar Meldungen rein gesetzt um besser sehen zu können ob es durch läuft.
Und das tut es, jedoch bleibt er Stick leer. Den Stick ziehe ich auch nicht einfach ab sondern habe eine Taste mit "HardwareSicherEntfernen" programmiert. Die Rückmeldung davon kommt auch.

Code:
Sub Write_data_to_file()

'ArchivPfad und ArchivName sind entweder ProTool Stringvariablen oder Eingangsparameter des Skripts
 Dim fs, f, FName, Header
ShowSystemAlarm("Gestartet")

'Archivierungspfad und Dateiname zusammensetzen
 FName = (Part_Number) & (Serial_Number) & ".csv"
ShowSystemAlarm("Dateiname")

'Tabellenkopf zusammenstellen
 Header = "Speicherzeit, Type, Coil Temperature, Valtage 1, Voltage 2, Current 1, Current 2, Flux, Result IO"
ShowSystemAlarm("Tabellenkopf")


 Set fs = CreateObject("FileCtl.FileSystem")      'FileSystemObject erstellen
 Set f = CreateObject("FileCtl.File")            'FileObject erstellen

'Datei öffnen bzw. wenn sie noch nicht existiert erstellen
 f.open FName, 8       
 ShowSystemAlarm("Geöffnet")                       


'wenn Datei 0 Byte groß, dann ist sie neu
 If fs.FileLen(FName) = 0 Then                     
   f. LinePrint(Header)                            'und der Tabellenkopf muss eingefügt werden
 End If
 ShowSystemAlarm("Ist neu")

'Werte der Variablen in die Archivdatei schreiben

 f.LinePrint(CStr(Main_Menu_DB_K_Time_RTD) & "," & CStr(Rotortyp) & "," & CStr(Coil_Temp) & "," & CStr(Voltage_1) & "," & CStr(Voltage_1) & "," & CStr(Current_1) & "," & CStr(Current_2) & "," & CStr(Flux) & "," & CStr(Result_IO))
ShowSystemAlarm("Variablen schreiben")


'Datei wieder schließen
 f.Close
 ShowSystemAlarm("Ende")

 Set f  = Nothing
 Set fs = Nothing

End Sub

Der System Alarm "Ende" erscheint. Also durchlaufen tuts.

Vielen Dank schonmal.
 
Zuletzt bearbeitet von einem Moderator:
was genau steht denn in FName?
Ist da der Pfad zum 'Storage Card USB mit drin?
Lass dir das mal per ShowSystemAlarm ausgeben

das sollte ehr so aussehen
FName = "\\storage card usb\" & (Part_Number) & (Serial_Number) & ".csv"
 
was genau steht denn in FName?
Ist da der Pfad zum 'Storage Card USB mit drin?
Lass dir das mal per ShowSystemAlarm ausgeben

das sollte ehr so aussehen
FName = "\\storage card usb\" & (Part_Number) & (Serial_Number) & ".csv"
Der Pfad war ein guter Tipp. Jetzt bleibt er bei
Code:
f.open FName
, 8 hängen.
Fehler: The Network path was not found.
 
Um zu Überprüfen ob der Stick erkannt wird habe ich mal die normale Archiv funktion des TP genutzt.

Code:
Sub Write_data_to_file()
'ArchivPfad und ArchivName sind entweder ProTool Stringvariablen oder Eingangsparameter des Skripts
 Dim fs, f, FName, Header


ShowSystemAlarm("Gestartet")


'Archivierungspfad und Dateiname zusammensetzen
 FName = "\\storage card usb\" & (Part_Number) & (Serial_Number) & ".csv"


ShowSystemAlarm("Dateiname")


'Tabellenkopf zusammenstellen
 Header = "Time, Type, Coil Temperature, Valtage 1, Voltage 2, Current 1, Current 2, Flux, Result IO"


ShowSystemAlarm("Tabellenkopf")


 Set fs = CreateObject("FileCtl.FileSystem")      'FileSystemObject erstellen
 Set f = CreateObject("FileCtl.File")            'FileObject erstellen


'Datei öffnen bzw. wenn sie noch nicht existiert erstellen
 f.open FName, 8
 
 ShowSystemAlarm("Geöffnet")                       


'wenn Datei 0 Byte groß, dann ist sie neu
 If fs.FileLen(FName) = 0 Then                     
   f. LinePrint(Header)                            'und der Tabellenkopf muss eingefügt werden
 End If
 
 ShowSystemAlarm("Ist neu")


'Werte der Variablen in die Archivdatei schreiben
 f.LinePrint(CStr(Main_Menu_DB_K_Time_RTD) & "," & CStr(Rotortyp) & "," & CStr(Coil_Temp) & "," & CStr(Voltage_1) & "," & CStr(Voltage_1) & "," & CStr(Current_1) & "," & CStr(Current_2) & "," & CStr(Flux) & "," & CStr(Result_IO))


ShowSystemAlarm("Variablen schreiben")


'Datei wieder schließen
 f.Close
 
 ShowSystemAlarm("Ende")


 Set f  = Nothing
 Set fs = Nothing
End Sub
 
Zuletzt bearbeitet:
was ich geschrieben habe war nicht ganz korrekt
probier es mal mit nur 1 backslash
FName = "\storage card usb\" & (Part_Number) & (Serial_Number) & ".csv"
Und schau mal im Explorer ob der Stick da zu sehen ist
1698927619297.png
 
Zuletzt bearbeitet:
Ganz davon abgesehen, ob du irgendwann den Pfadname zum USB-Stick richtig schreibst: hat Siemens dir auch gesagt, wie du die Werte der Prozessvariablen, die in die csv-Datei geschrieben werden sollen, garantiert aktualisiert ins HMI Panel bekommst? Zu dem Problem benutze mal die Forumssuche mit dem Suchwort: GetDataRecordTagsFromPLC
 
Ganz davon abgesehen, ob du irgendwann den Pfadname zum USB-Stick richtig schreibst: hat Siemens dir auch gesagt, wie du die Werte der Prozessvariablen, die in die csv-Datei geschrieben werden sollen, garantiert aktualisiert ins HMI Panel bekommst? Zu dem Problem benutze mal die Forumssuche mit dem Suchwort: GetDataRecordTagsFromPLC
Danke für den Hinweis. Es ist bei mir nicht sehr Zeitkritisch. Ich aktualisiere einfach die Variablen alle 100ms und setzten den Trigger für das Skript 500ms später als wie ich die Variablen schreibe.

Aber etwas anderes och möchte das Skript mit einer Variable Triggern. Mein Plan wäre über Änderung der Variable das Skript aufzurufen und
am Anfang des Skripts die Variable auf 1 abfragen und sonst das Skript beenden. Und am Ende würde ich die Triggervariable auf 0 setzen.
Jetzt habe ich vorher noch gar nichts mit Skirpten gemacht. Wie beende ich das Skript, wenn ein Bit =0 ist? Und wie setzte ich ein Bit =0.
 
Beim Rücksetzen habe ich es versucht mit:
Code:
Set ("Trigger")=0
Da sagt er: "Trigger": Eine Konstante kann nicht das Ziel einer Zuweisung sein.
Trigger ist allerdings eine HMI Variable mit Datentyp Bool. (Bit in einem DB)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich aktualisiere einfach die Variablen alle 100ms und setzten den Trigger für das Skript 500ms später als wie ich die Variablen schreibe.
Diese Lösung ist stümperhaft und garantiert trotzdem nicht, daß aktuelle Werte in die Datei geschrieben werden.
Viele Variablen zyklisch fortlaufend alle 100ms aktualisieren, nur weil die Werte einmal am Tag gebraucht werden, ist außerdem eine furchtbare dauerhafte unnötige Belastung der Kommunikation.

Mein Plan wäre über Änderung der Variable das Skript aufzurufen und am Anfang des Skripts die Variable auf 1 abfragen und sonst das Skript beenden. Und am Ende würde ich die Triggervariable auf 0 setzen.
(...) Wie beende ich das Skript, wenn ein Bit =0 ist? Und wie setzte ich ein Bit =0.
Code:
If SmartTags("MyTrigger") = 0 Then Exit Sub

'Daten in Datei schreiben
'...

SmartTags("MyTrigger") = 0 'Trigger rücksetzen
 
Zurück
Oben