WinCC CSV-Export Probleme bei WinCC RT Advanced

GTX

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

ich bin aktuell dabei eine unserer Bestandsanlagen zu überarbeiten, da der wir immer wieder Probleme mit dem CSV-Export haben.
Es handelt sich um eine WinCC RT Advanced unter Tia 15.1, der Datenexport wird über ein VB-Skript ausgeführt.

Es sollen Audittrail-, Message- und Processvalue-Daten täglich auf unser Netzwerk exportiert werden.
Die Meldearchive sind bisher als Datenbank projektiert, die Audittraildaten werdern per CSV-File gespeichert.
Nach erfolgtem Export auf die Anlage selbst sollen die CSV-Files weiter auf unser Filecluster im Netzwerk geschoben werden. Hier ist SMB1 nicht möglich (Lösungsansatz vom Siemens Support).

Das bisherige Skript vom Anlagenbauer ist allerdings sehr unsinnig projektiert, sodass keinerlei Abfragen für erfolgte Exports vorhanden sind.
Zum Export der Meldearchive wird eine eigens erstellte .bat aufgerufen, der Audittrail-Export erfolgt über klassisch über ein FSO.MoveFile.XXX

Um das alles etwas besser Überwachen zu können hab ich die Exports versucht über ein klassisches "ArchiveLogFile" zu ersetzen (zuvorkommendes "CloseAllLogs" versteht sich von selbst)
Der Export der Meldearchive mittels "ArchiveLogFile" funktioniert jedoch leider warum auch immer NICHT.

Hatte einer von euch schon mal ein ähnliches Problem?
Erschwerend kommt leider hinzu, dass es sich um eine Produktivanlage in einer Pharma-Produktion handelt. Hier ist regulatorisch ein Try and Error leider nicht möglich...

Ich hoffe ich konnte meine Problematik halbwegs passabel beschreiben :D

VG, Maxi
PS: Sollte ich bei diesem Beitrag irgendwelche groben Verstöße gegen Forenregeln begangen haben dürft ihr mich gern drauf hinweisen ;)
 
Zum Export der Meldearchive wird eine eigens erstellte .bat aufgerufen,
Hier ist vielleicht das Problem, wenn den VBS Skript den Archivdatei öffnet um zu schreiben, und der .bat Datei gleichzeitig versucht den Archivedatei zu verschieben.
Wenn beide Aufgaben mittels VBS gemacht wurde, dann konnte sie nicht gleichzeitig aufgerufen werden.

Hast du ON ERROR RESUME NEXT, und checkst du den Err Objekt ?
Das ist ein absoluten muss für VBS Skripte die nicht triviell simpel sind.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hier ist vielleicht das Problem, wenn den VBS Skript den Archivdatei öffnet um zu schreiben, und der .bat Datei gleichzeitig versucht den Archivedatei zu verschieben.
Wenn beide Aufgaben mittels VBS gemacht wurde, dann konnte sie nicht gleichzeitig aufgerufen werden.

Hast du ON ERROR RESUME NEXT, und checkst du den Err Objekt ?
Das ist ein absoluten muss für VBS Skripte die nicht triviell simpel sind.
ON ERROR RESUME NEXT wird zu Begin des Skripts aufgerufen und BISHER ist absolut kein Errorhandling im Skript vom Anlagenbauer vorhanden gewesen.
Ich hab mal das Original-Skript sowie das überarbeitete hier teilweise zensiert als Datei angehängt. Mir ist absolut schleierhaft, warum der Export der CSV-Datei funktioniert und der Export aus der Datenbank ins leere läuft.
Oder hast du mir evtl. einen Tip wie ich explizit die Daten vom vorigen Tag aus der Datenbank exportieren kann?
 

Anhänge

ON ERROR RESUME NEXT wird zu Begin des Skripts aufgerufen und BISHER ist absolut kein Errorhandling im Skript vom Anlagenbauer vorhanden gewesen.
Dann werden alle Fehler einfach ignoriert. Das wurde ich nicht machen.

Warum hast du jede Mange Delays ?
Code:
    Delay=Now + TimeValue ("00:00:20")
    Do
    Loop Until Now > Delay
Diese Delay tut nichts.

Anstatt dies:
Code:
    If Systemalarms = 80048 Then
        ShowSystemAlarm "4-Message Log Automatically Export to XXX"
    Else
        ShowSystemAlarm "Error while exporting Message logs; Export canceled"
        ShowSystemAlarm "Error # " & CStr(Err.Number) & " " & Err.Description
        ShowSystemAlarm "!!!Call XXX!!!"
        OpenAllLogs
        Exit Sub  
    End If

Wurde ich dies machen:
Code:
If Err.Number <> 0 Then
    ShowSystemAlarm "Error during export or message logs. " & Err.Number & " " & Err.Description
    Err.Clear
    OpenAllLogs
    Exit Sub
End If

Oder hast du mir evtl. einen Tip wie ich explizit die Daten vom vorigen Tag aus der Datenbank exportieren kann?
Damit habe ich lieder wenig Erfahrung.
 
Anstatt das .Bat Datei aufzurufen kannst du das ebensogut in VBS erledigen.

Ordner kopieren:
Code:
Set FSO = CreateObject("Scripting.FileSystemObject")

If FSO.FolderExists("H:\LOGS\TODAY:") Then
   FSO.CopyFolder "F:\LOGS\TODAY", "H:\LOGS\TODAY"
Else
    ShowSystemAlarm "Copy of logs is not possible. Target folder is not reachable."
    Exit Sub
End If

Ordner einhalt löschen:
Code:
Set FSO = CreateObject("Scripting.FileSystemObject")

If FSO.FolderExists("F:\LOGS\TODAY") Then
   FSO.DeleteFile("F:\LOGS\TODAY\*.*")
Else
    ShowSystemAlarm "Delete logs is not possible. Folder is not reachable."
    Exit Sub
End If
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Datenbankzugriff für den Meldearchiv-Export ist in der separaten .bat so ausgeführt.

bcp "select 'TimeString', 'MsgText', ';MsgClass' union all SELECT * FROM STEELCO_REPORT.dbo.Report_AlarmLog3" queryout D:\Export \MSG\LogAlarms_Export.csv -c -t ; -T -S ULMBLA9006L01\SQLEXPRESS

Die folgenden Zeilen hat mir Copilot als Übersetzung ausgespuckt. Kann mir einer die Funktion verifizieren? Bin leider kein Datenbankspezialist :D

Sub ExportAlarmlogDirektNachCSV()
Dim conn As Object, rs As Object
Dim sql As String
Dim filePath As String
Dim fileNum As Integer
Dim i As Integer
Dim outputLine As String

' === SQL-Verbindung aufbauen ===
Set conn = CreateObject("ADODB.Connection")
conn.Open "Provider=SQLOLEDB;Server=XXX Security=SSPI;Database=XXX"

' === SQL-Abfrage definieren ===
sql = "SELECT 'TimeString' AS TimeString, 'MsgText' AS MsgText, 'MsgClass' AS MsgClass " & _
"UNION ALL SELECT TimeString, MsgText, MsgClass FROM Report_AlarmLog3"

Set rs = conn.Execute(sql)

' === CSV-Datei vorbereiten ===
filePath = "XXX_Path"
fileNum = FreeFile
Open filePath For Output As #fileNum

' === Spaltenüberschriften und Daten schreiben ===
Do While Not rs.EOF
outputLine = ""
For i = 0 To rs.Fields.Count - 1
outputLine = outputLine & rs.Fields(i).Value
If i < rs.Fields.Count - 1 Then outputLine = outputLine & ";"
Next i
Print #fileNum, outputLine
rs.MoveNext
Loop

' === Aufräumen ===
Close #fileNum
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing

MsgBox "Export abgeschlossen!", vbInformation
End Sub
 
Zurück
Oben