-> Hier kostenlos registrieren
Hallo liebes Forum,
für eine Protokollierung werden (String) Daten in der SPS gesammelt und über WinCC RT Advanced in Dateien gespeichert. Leider gibt es ab und zu unterschiedlich viele leere Inhalte ab Zeile 87 (bzw. jeweils 87tes Element), die ich bislang nicht erklären oder beseitigen konnte.
Berücksichtigt wurde dass
- die SPS die Daten mit Puffern und Handshakes konsistent vorhält, während das HMI Skript die Daten verarbeitet
- die HMI Variablen auf die Erfassungsart "zyklisch fortlaufend" eingestellt sind (etwas schlimmeres Verhalten im Gegensatz zu "zyklisch im Betrieb")
- die Handshake Zeiten mindestens dem Erfassungszyklus der HMI-Variablen entsprechen (um die Daten nicht vorschnell abzulöschen)
- die Kommunikationslast nicht zu hoch ist (<5 %)
- kein anderes Skript während der Ausführung läuft (Verrieglung in SPS mit "busy" flag)
- Array Bereiche von SPS (beliebig beginnend) und HMI (bei 0 beginnend)
Die Anzahl der zu schreibenden Elemente wird über eine Variable angegeben.
Projektiert wird mit TIA V16 Update 6, einem Open Controller mit der Firmware V 21.9.8 und das HMI mit der Firmware V16 Update .
Wenn der Fehler vorkommt (ca. jedes 2-5 mal wenn mehr als 87 Inhalte geschrieben werden sollen), konnte bislang keine Änderung Abhilfe schaffen oder an der Nummer 87 etwas ändern. Versucht wurden unterschiedliche Zeiten bei den Handshakes, Erfassungszyklus der HMI-Variablen und DB ohne Attribute wie "optimierter Bausteinzugriff)
Ich bin um jede Hilfe dankbar.
Hier der Code vom Skript, wobei etliche Zeilen mit ... entfernt wurden, um es hier darstellen zu können:
Hier die Deklaration in der SPS:

Und hier die Deklaration im HMI:

für eine Protokollierung werden (String) Daten in der SPS gesammelt und über WinCC RT Advanced in Dateien gespeichert. Leider gibt es ab und zu unterschiedlich viele leere Inhalte ab Zeile 87 (bzw. jeweils 87tes Element), die ich bislang nicht erklären oder beseitigen konnte.
Berücksichtigt wurde dass
- die SPS die Daten mit Puffern und Handshakes konsistent vorhält, während das HMI Skript die Daten verarbeitet
- die HMI Variablen auf die Erfassungsart "zyklisch fortlaufend" eingestellt sind (etwas schlimmeres Verhalten im Gegensatz zu "zyklisch im Betrieb")
- die Handshake Zeiten mindestens dem Erfassungszyklus der HMI-Variablen entsprechen (um die Daten nicht vorschnell abzulöschen)
- die Kommunikationslast nicht zu hoch ist (<5 %)
- kein anderes Skript während der Ausführung läuft (Verrieglung in SPS mit "busy" flag)
- Array Bereiche von SPS (beliebig beginnend) und HMI (bei 0 beginnend)
Die Anzahl der zu schreibenden Elemente wird über eine Variable angegeben.
Projektiert wird mit TIA V16 Update 6, einem Open Controller mit der Firmware V 21.9.8 und das HMI mit der Firmware V16 Update .
Wenn der Fehler vorkommt (ca. jedes 2-5 mal wenn mehr als 87 Inhalte geschrieben werden sollen), konnte bislang keine Änderung Abhilfe schaffen oder an der Nummer 87 etwas ändern. Versucht wurden unterschiedliche Zeiten bei den Handshakes, Erfassungszyklus der HMI-Variablen und DB ohne Attribute wie "optimierter Bausteinzugriff)
Ich bin um jede Hilfe dankbar.
Hier der Code vom Skript, wobei etliche Zeilen mit ... entfernt wurden, um es hier darstellen zu können:
Code:
Sub Log_DatenSpeichern()
'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:
'Declaration of local tags - Deklaration von lokalen Variablen
Dim fso, f, ts, DSString, i, FileName
SmartTags("Log_DB_scriptHandling_SkriptKomm_DatenGeschrieben") = False
SmartTags("Log_DB_scriptHandling_SkriptKomm_DatenNichtGeschrieben") = False
'Error Routine - Fehlerroutine
On Error Resume Next
'Create object - File Objekt erstellen
SmartTags("Log_DB_scriptHandling_iScriptWriteSequenceStep") = 1
FileName = SmartTags("Log_DB_scriptHandling_sFileName")
Set fso = CreateObject("Scripting.FileSystemObject")
If Err.Number <> 0 Then
'ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
SmartTags("Log_DB_scriptHandling_SkriptKomm_DatenNichtGeschrieben") = True
SmartTags("Log_DB_scriptHandling_iScriptWriteSequenceStep") = 101
Err.Clear
Exit Sub
End If
SmartTags("Log_DB_scriptHandling_iScriptWriteSequenceStep") = 3
'File path and name has to be either with:
'- UNC (Universal Naming Convention) path / shared names (\\<server>\<share>\<file>) (e.g. \\10.0.0.11\Logs\Log_yyyy-mm-dd)
'- Full qualified path / absolute path (<drive>\<directory>\<file>) (e.g. D:\\Logs\Log_yyyy-mm-dd) (prefered)
'- NT device namespace UNC (\\?\<server>\<share>\<file>) (e.g. \\?\10.0.0.11\Logs\Log_yyyy-mm-dd)
'- NT device namespace / Extended path (\\?\<drive>\<directory>\<file>) (e.g. \\?\D:\\Logs\Log_yyyy-mm-dd)
If Not fso.FileExists(FileName) Then
fso.CreateTextFile FileName
End If
SmartTags("Log_DB_scriptHandling_iScriptWriteSequenceStep") = 4
Set f = fso.GetFile(FileName)
If Err.Number <> 0 Then
'ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
SmartTags("Log_DB_scriptHandling_SkriptKomm_DatenNichtGeschrieben") = True
SmartTags("Log_DB_scriptHandling_iScriptWriteSequenceStep") = 104
Err.Clear
Exit Sub
End If
SmartTags("Log_DB_scriptHandling_iScriptWriteSequenceStep") = 6
Set ts = f.OpenAsTextStream(8, -2)
' mode "8" to append to file
If Err.Number <> 0 Then
'ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
SmartTags("Log_DB_scriptHandling_SkriptKomm_DatenNichtGeschrieben") = True
SmartTags("Log_DB_scriptHandling_iScriptWriteSequenceStep") = 106
Err.Clear
Exit Sub
End If
SmartTags("Log_DB_scriptHandling_iScriptWriteSequenceStep") = 8
If f.Size = 0 Then
DSString = "Date" & " "
DSString = DSString & "Time of day" & " "
DSString = DSString & "Type" & " "
DSString = DSString & "Data"
ts.WriteLine(DSString)
SmartTags("Log_DB_scriptHandling_iScriptWriteSequenceStep") = 9
End If
SmartTags("Log_DB_scriptHandling_iScriptWriteSequenceStep") = 10
' Leider nicht in FOR-Schleife möglich, da Skripte nicht so einfach mit Array of String arbeiten können (B. Baumeister)
' In HMI Skripten kann zwar iniziert auf Array Elemente zugegriffen werden, allerdings nicht mit String Elementen (S. Manko 07.03.2022)
' Falls das Array voll ist, braucht es keine Überprüfung der Anzahl (Performance Gewinn)
If Log_DB_writeBuffer_usiCounter = 200 Then
ts.WriteLine SmartTags("Log_DB_writeBuffer_arrDate[0]") & " " & SmartTags("Log_DB_writeBuffer_arrTimeOfDay[0]") & " " & SmartTags("Log_DB_writeBuffer_arrType[0]") & " " & SmartTags("Log_DB_writeBuffer_arrData[0]")
ts.WriteLine SmartTags("Log_DB_writeBuffer_arrDate[1]") & " " & SmartTags("Log_DB_writeBuffer_arrTimeOfDay[1]") & " " & SmartTags("Log_DB_writeBuffer_arrType[1]") & " " & SmartTags("Log_DB_writeBuffer_arrData[1]")
ts.WriteLine SmartTags("Log_DB_writeBuffer_arrDate[2]") & " " & SmartTags("Log_DB_writeBuffer_arrTimeOfDay[2]") & " " & SmartTags("Log_DB_writeBuffer_arrType[2]") & " " & SmartTags("Log_DB_writeBuffer_arrData[2]")
...
...
...
ts.WriteLine SmartTags("Log_DB_writeBuffer_arrDate[3]") & " " & SmartTags("Log_DB_writeBuffer_arrTimeOfDay[3]") & " " & SmartTags("Log_DB_writeBuffer_arrType[197]") & " " & SmartTags("Log_DB_writeBuffer_arrData[197]")
ts.WriteLine SmartTags("Log_DB_writeBuffer_arrDate[198]") & " " & SmartTags("Log_DB_writeBuffer_arrTimeOfDay[198]") & " " & SmartTags("Log_DB_writeBuffer_arrType[198]") & " " & SmartTags("Log_DB_writeBuffer_arrData[198]")
ts.WriteLine SmartTags("Log_DB_writeBuffer_arrDate[199]") & " " & SmartTags("Log_DB_writeBuffer_arrTimeOfDay[199]") & " " & SmartTags("Log_DB_writeBuffer_arrType[199]") & " " & SmartTags("Log_DB_writeBuffer_arrData[199]")
End If
'If Err.Number <> 0 Then
' SmartTags("Skript_Log_SchrittZaehler") = 110
' Err.Clear
' Exit Sub
'End If
' Falls das Array nicht voll ist, braucht es eine Überprüfung der Anzahl
If Log_DB_writeBuffer_usiCounter < 200 Then
If Log_DB_writeBuffer_usiCounter >= 1 Then
ts.WriteLine SmartTags("Log_DB_writeBuffer_arrDate[0]") & " " & SmartTags("Log_DB_writeBuffer_arrTimeOfDay[0]") & " " & SmartTags("Log_DB_writeBuffer_arrType[0]") & " " & SmartTags("Log_DB_writeBuffer_arrData[0]")
End If
If Log_DB_writeBuffer_usiCounter >= 2 Then
ts.WriteLine SmartTags("Log_DB_writeBuffer_arrDate[1]") & " " & SmartTags("Log_DB_writeBuffer_arrTimeOfDay[1]") & " " & SmartTags("Log_DB_writeBuffer_arrType[1]") & " " & SmartTags("Log_DB_writeBuffer_arrData[1]")
End If
If Log_DB_writeBuffer_usiCounter >= 3 Then
ts.WriteLine SmartTags("Log_DB_writeBuffer_arrDate[2]") & " " & SmartTags("Log_DB_writeBuffer_arrTimeOfDay[2]") & " " & SmartTags("Log_DB_writeBuffer_arrType[2]") & " " & SmartTags("Log_DB_writeBuffer_arrData[2]")
End If
...
...
...
If Log_DB_writeBuffer_usiCounter >= 198 Then
ts.WriteLine SmartTags("Log_DB_writeBuffer_arrDate[197]") & " " & SmartTags("Log_DB_writeBuffer_arrTimeOfDay[197]") & " " & SmartTags("Log_DB_writeBuffer_arrType[197]") & " " & SmartTags("Log_DB_writeBuffer_arrData[197]")
End If
If Log_DB_writeBuffer_usiCounter >= 199 Then
ts.WriteLine SmartTags("Log_DB_writeBuffer_arrDate[198]") & " " & SmartTags("Log_DB_writeBuffer_arrTimeOfDay[198]") & " " & SmartTags("Log_DB_writeBuffer_arrType[198]") & " " & SmartTags("Log_DB_writeBuffer_arrData[198]")
End If
If Log_DB_writeBuffer_usiCounter >= 200 Then
ts.WriteLine SmartTags("Log_DB_writeBuffer_arrDate[199]") & " " & SmartTags("Log_DB_writeBuffer_arrTimeOfDay[199]") & " " & SmartTags("Log_DB_writeBuffer_arrType[199]") & " " & SmartTags("Log_DB_writeBuffer_arrData[199]")
End If
End If
'If Err.Number <> 0 Then
' SmartTags("Skript_Log_SchrittZaehler") = 110
' Err.Clear
' Exit Sub
'End If
SmartTags("Log_DB_scriptHandling_iScriptWriteSequenceStep") = 13
'Tidy up --Aufräumen
ts.Close
Set ts = Nothing ' Necessary to clean up the file handle object
'Set f = Nothing ' Not necessary and no benefit to clean off bc/o no open handles to be closed
Set fso = Nothing ' Optional but recommended bc/o open handles and references that are best cleaned off
SmartTags("Log_DB_scriptHandling_iScriptWriteSequenceStep") = 14
'fertig melden
SmartTags("Log_DB_scriptHandling_SkriptKomm_DatenGeschrieben") = True
SmartTags("Log_DB_scriptHandling_iScriptWriteSequenceStep") = 15
'ShowSystemAlarm "Erfolgreich geschrieben!"
End Sub
Hier die Deklaration in der SPS:

Und hier die Deklaration im HMI:

Zuletzt bearbeitet: