WinCC WinCC VBA skript Text in nächste leere Zeile im Textdokument schreiben

Frozen19

Level-2
Beiträge
50
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebes SPS Forum,

ich möchte mit einem VBA skript ein Textdokument erstellen und in diesem zeile für zeile Sinamics fehler logen.

anhand einer von Siemens Sinamics error XML habe ich eine Textliste im TIA V16 WinCC erstellt je nach dem welche umrichter fehler nummer ansteht wird der fehler in der Textliste gewählt
und ins Textfile geschrieben.

Dies funktioniert soweit jedoch bekomme ich es nur hin immer in die erste Zeile zu schreiben.

Ich möchte jedoch z.B.: wenn in Zeile 1 schon was steht in die nächste freie (leere) Zeile 2 den Text schreiben.

Kann mir hier wer helfen wie ich das machen kann zum bsp. For schleife mit index?

Zum lesen der Textliste verwende ich im VBA-skript die funktion "LookupText"
Ich habe versucht unten den code anzuhängen.

LG
Frozen

Code:
Sub SINAMICS_Error_Log_and_send_NC()
'////////////////////////////////////////////////////////////////
' en: Script for the creating and saving of a text file
' de: Script zum Erstellen und Speichern einer Textdatei
' Created: 14-05-2007
' Version: v0.1
' Author: ZW Released: only for Windows 2k/XP
'////////////////////////////////////////////////////////////////

'**************************************************************************************************************
'* create Sinamics error log textfile - Erstellen einer Textdatei mit Sinamics fehlern                        *
'**************************************************************************************************************
'Declaration of local tags - Deklaration von lokalen Variablen
Dim fso, f, ts, path , FileExists, folder, Sinamics_Error_output, Language_ID, Index, Textlist, i


Index= 1004 'nur zum Testen listeneintrag 1004-->Wird später durch Umrichter Fehlernummer variable ersetzt

'Definition of folder path+name - Definition des Ordnerpfad+Namen
folder="d:\Log\"
'Definition of file path+name - Definition des Dateipfad+Namen
path = "d:\Log\Sinamics_Error.txt"

'Error Routine - Fehlerroutine
On Error Resume Next
'Create object - Objekt erstellen
Set fso = CreateObject("Scripting.FileSystemObject")
If Err.Number <> 0 Then
ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
Err.Clear
Exit Sub
End If

'create folder if doesn't exist - erstelle Ordner wenn nicht vorhanden
If fso.FolderExists(folder)=False Then
    fso.CreateFolder(folder)
End If
'if no file exist a text file will be created – Datei erstellen, wenn kein vorhanden
If Not fso.FileExists(path) Then
fso.CreateTextFile path
End If

Set f = fso.GetFile(path)
If Err.Number <> 0 Then
ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
Err.Clear
Exit Sub
End If
Set ts = f.OpenAsTextStream(2, -1) 'Öffnen Textfile Parameter: 2=für schreiben, -1=öffne die Datei als Unicode
If Err.Number <> 0 Then
ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
Err.Clear
Exit Sub
End If

LookupText Sinamics_Error_output,Index,SmartTags("act_HMI_language_ID_INTERNAL"),"SINAMICS_V5.2_Error_Warnings"
SmartTags("Sinamics_Error_Output_INTERNAL")= Sinamics_Error_output

'Write values into the file - Werte in die Datei schreiben
For i = 1 To 10 'bis zu 10 zeilen
    If ts.ReadLine(i) = "" Then
'ts.WriteLine Now(Date & "; "&Time & "; " & Sinamics_Error_output & ";")
ts.WriteLine (Now & "; " & Sinamics_Error_output & ";")
Else
    Exit Sub    
End If
    
Next
'Close file - Datei schließen
ts.Close    





End Sub
 
Code:
Set ts = f.OpenAsTextStream([COLOR=#ffa500][B]2[/B][/COLOR], -1) 'Öffnen Textfile Parameter: 2=für schreiben, -1=öffne die Datei als Unicode
Mit Filemode=2 wird das File neu geschrieben. Dabei wird bereits vorhandener Text gelöscht.
Mit Filemode=8 wird dagegen Text angehangen, alter Text bleibt bestehen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
'Write values into the file - Werte in die Datei schreiben
For i = 1 To 10 'bis zu 10 zeilen
    If ts.ReadLine(i) = "" Then
        'ts.WriteLine Now(Date & "; "&Time & "; " & Sinamics_Error_output & ";")
        ts.WriteLine (Now & "; " & Sinamics_Error_output & ";")
    Else
        [B][COLOR=#ffa500]Exit Sub[/COLOR][/B]    
    End If
Next
Und wie willst Du hier nur eine beschriebene Zeile beim Beschreiben überspringen, wenn Du deswegen gleich das ganze Script beendest?
 
Oft ergibt sich die Lösung ganz einfach, wenn man in der Lage ist, die Aufgabenstellung exakt zu formulieren.
Zu Deiner Aufgabe: Willst Du wirklich in die nächste leere Zeile der Textdatei schreiben oder immer an das Ende der Datei anhängen? Falls Ersteres: da müsstest Du zunächst die nächste leere Zeile suchen ... Wie kommen leeren Zeilen in Deine Datei?
Ans Ende der Datei anhängen geht hingegen ganz automatisch durch Open im Append-Mode (Filemode 8 ).

Hinweis: die Skriptsprache in TIA WinCC heißt nicht "VBA Skript" sondern VBS (VB Skript). VBA ist was anderes. Man findet eher schlecht die richtigen Hilfen wenn man falsche Suchworte benutzt.

Harald
 
Hallo danke für eure antworten welche mir weitergeholfen haben.

@hucki ich habe das mit dem Filemode 8, jetzt wird die Meldung immer genau in den nächste Zeile geschrieben so wie ich es haben wollte. Jedoch habe ich noch einen Zusatz ich setze ja vor meinen geloggten Fehlermeldungen einen Zeitstempel mit dem skriptbefehl "now" lässt es sich machen das Fehlermeldung in der ersten Zeile nach unten gerückt wird und dann die aktuellste Fehlermeldung immer in die oberste erste Zeile geschrieben wird. So das am Ende immer oben die aktuellsten Fehler stehen und darunter die älteren. Vielleicht gibt es eine über VBS mögliche Funktion welche die Textfile Einträge nach dem Schreiben der Zeile sortiert?

Das mit der For Schleife habe ich entfernt habe da was probiert und nicht den gewünschten Effekt erzielt damit.

Dann ist für mich noch die Frage aufgetaucht:
Ich möchte dieses Skript bei Wertänderung des Sinamics Telegramm Parameters "r2132 Aktueller Warnstörcode" oder "r2131 Aktueller Fehlerstörcode" ausführen.
Jedoch wie ist es wenn der Sinamics zwei verschiedene Fehler ausgibt/anstehen hat. Wie man das logen soll da ja nur ein Fehlerstörcode erfasst wird und anhand diesem in meiner Textliste die Auswahl erfolgt?


Als Zusatzinfo: Sinn diese Skript ist es für mich bei einer Maschine die Sinamics Fehler aufzuzeichnen um diese zu Prüfen und demnach dann eine Fehlerbehebung einleiten. Da oftmals der Kunde es nicht gestattet die Maschine mit anstehenden Fehler abzustellen (sodass der Maschinenbediener ausnahmsweise nicht die Fehler Quittier taste betätigt) damit ich mit den Siemens Starter Online gehen kann um die Fehlermeldung zu überprüfen.

@Harald danke für den Hinweis den Unterschied VBA und VBS im TIA-WinCC. Die Funktion mit Filemode 8 finde ich gut.

Im Anhang der derzeitige Code:
Code:
  Sub IRT_SINAMICS_Error_Log_and_send_NC(ByRef Input_Errorcode, ByRef Input_Warncode, ByRef Input_Rollertablename, ByRef Input_Language_ID, ByRef Output_Sinamics_Error, ByRef Output_Sinamics_Warning)
'////////////////////////////////////////////////////////////////
' en: Script for the creating and saving of a text file
' de: Script zum Erstellen und Speichern einer Textdatei
' Created: 14-05-2007
' Version: v0.1
' Author: ZW Released: only for Windows 2k/XP
'////////////////////////////////////////////////////////////////

'**************************************************************************************************************
'* create Sinamics error log textfile - Erstellen einer Textdatei mit Sinamics fehlern                        *
'**************************************************************************************************************
'Declaration of local tags - Deklaration von lokalen Variablen
Dim fso, f, ts, path , FileExists, folder, Sinamics_Error_output, Sinamics_Warning_output


'Definition of folder path+name - Definition des Ordnerpfad+Namen
folder="d:\Log\"
'Definition of file path+name - Definition des Dateipfad+Namen
path = "d:\Log\Sinamics_Error.txt"

'Error Routine - Fehlerroutine
On Error Resume Next
'Create object - Objekt erstellen
Set fso = CreateObject("Scripting.FileSystemObject")
If Err.Number <> 0 Then
ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
Err.Clear
Exit Sub
End If

'create folder if doesn't exist - erstelle Ordner wenn nicht vorhanden
If fso.FolderExists(folder)=False Then
    fso.CreateFolder(folder)
End If
'if no file exist a text file will be created – Datei erstellen, wenn kein vorhanden
If Not fso.FileExists(path) Then
fso.CreateTextFile path
End If

Set f = fso.GetFile(path)
If Err.Number <> 0 Then
ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
Err.Clear
Exit Sub
End If
Set ts = f.OpenAsTextStream(8, -1) 'Öffnen Textfile Parameter: 8=Hängt Textzeilen an den TextStream an, -1=öffne die Datei als Unicode
If Err.Number <> 0 Then
ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
Err.Clear
Exit Sub
End If

If Input_Errorcode >= 1000 Then 'ausführen wenn tatsächlich ein Errorcode ansteht
'Wähle Textlisten Texteintrag laut Fehlernummer Errorcode
LookupText Sinamics_Error_output,Input_Errorcode,Input_Language_ID,"SINAMICS_V5.2_Error_Warnings"
SmartTags("Sinamics_Error_Output_INTERNAL") = Sinamics_Error_output

'Write values into the file - Werte in die Datei schreiben
ts.WriteLine (Now & " " & Input_Rollertablename & " Error   " & Sinamics_Error_output & ";") 'Zeilentext der in das Textfile geschrieben wird
End If

If Input_Warncode >= 1000 Then 'ausführen wenn tatsächlich ein Warncode ansteht
'Wähle Textlisten Texteintrag laut Fehlernummer Warnrcode
LookupText Sinamics_Warning_output,Input_Warncode,Input_Language_ID,"SINAMICS_V5.2_Error_Warnings"
SmartTags("Sinamics_Warning_Output_INTERNAL")= Sinamics_Warning_output

'Write values into the file - Werte in die Datei schreiben
ts.WriteLine (Now & " " & Input_Rollertablename & " Warning " & Sinamics_Warning_output & ";") 'Zeilentext der in das Textfile geschrieben wird
End If

'Close file - Datei schließen
ts.Close    

End Sub

LG
Frozen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@hucki ich habe das mit dem Filemode 8, jetzt wird die Meldung immer genau in den nächste Zeile geschrieben so wie ich es haben wollte. Jedoch habe ich noch einen Zusatz ich setze ja vor meinen geloggten Fehlermeldungen einen Zeitstempel mit dem skriptbefehl "now" lässt es sich machen das Fehlermeldung in der ersten Zeile nach unten gerückt wird und dann die aktuellste Fehlermeldung immer in die oberste erste Zeile geschrieben wird. So das am Ende immer oben die aktuellsten Fehler stehen und darunter die älteren. Vielleicht gibt es eine über VBS mögliche Funktion welche die Textfile Einträge nach dem Schreiben der Zeile sortiert?
Dafür würde ich den neuesten Eintrag in eine neue Datei schreiben (Filemode=2) und dann entweder die alte Datei zeilenweise in die neue kopieren oder die alte Datei direkt an die neue anhängen (für letzteres wüsste ich jetzt aber aus dem Stehgreif nicht das Vorgehen unter VBS).
Anschließend die alte Datei löschen und die neue umbenennen auf den alten Namen.
 
Hallo und Danke,

Code:
 Sub IRT_SINAMICS_Error_Log_and_send_NC(ByRef Input_Errorcode, ByRef Input_Warncode, ByRef Input_Rollertablename, ByRef Input_Language_ID, ByRef Output_Sinamics_Error, ByRef Output_Sinamics_Warning)

Frage ist es möglich die den ausgewählten Text aus der Textliste im Skript als Schnittstelle Parameter auszugeben (Output) sodas ich kein HMI Smarttag im Skript verwenden muss sondern das auserhalb im Eigenschaftsfenster beim Skriptaufruf Ereignis beschalte. Um das Skript mehrfach zu verwenden ohne die HMI Smarttags im Skript ändern zu müssen.
Code:
SmartTags("Sinamics_Error_Output_INTERNAL") = Sinamics_Error_output
 
Frage ist es möglich die den ausgewählten Text aus der Textliste im Skript als Schnittstelle Parameter auszugeben (Output) sodas ich kein HMI Smarttag im Skript verwenden muss sondern das auserhalb im Eigenschaftsfenster beim Skriptaufruf Ereignis beschalte. Um das Skript mehrfach zu verwenden ohne die HMI Smarttags im Skript ändern zu müssen.
Aus dem Script eine Funktion machen (Eigenschaften).
Der Funktion kannst (bzw. musst) Du ein Ergebnis übergeben:

attachment.php



welches Du bei jedem Aufruf an eine beliebige andere Variable weitergeben kannst:

attachment.php
 

Anhänge

  • Script Funktion.jpg
    Script Funktion.jpg
    84,2 KB · Aufrufe: 58
  • Script Funktion Aufruf.jpg
    Script Funktion Aufruf.jpg
    8,3 KB · Aufrufe: 50
Zuletzt bearbeitet:
Zurück
Oben