WinCC Alarmauswertung VBS Script

GoodOld

Level-1
Beiträge
51
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe im Netz vor einiger Zeit ein Script gefunden womit ich die WinCC Alarme (Störungen) als CSV Datei Exportieren konnte, diese habe ich dann etwas abgeändert damit sie
meinen wünschen entsprechen.
Das Scrip lief bis jetzt immer auf dem Server und wurde manuell ausgelöst (eine Porjektbild in WinCC).

Jetzt ist der Server nicht mehr ohne weiteres bedienbar und ich wollte das automatisieren, jede Nacht sollen die Alarme exportiert werden.
Also habe ich den Code in "Global Script"/"VBS-Editor"-Aktionen eingefügt.
Als trigger habe ich einen Merker der von der SPS kommt benutz, später soll das durch die Uhrzeit getriggert werden.

Aber irgendwie will das nicht klappen, das Script wird nicht ausgelöst oder es ist im Script ein fehler vorhanden der aber nicht angezeigt wird.
Da meine erfahrungen mit VBS nur sehr begrenzt sind wollte ich euch fragen ob ihr eine idee habt wieso das Script keine Datei exportiert.

Code:
Option ExplicitFunction action
    
    HMIRuntime.Tags("alarmexport_start").Write Right("000" & Year(Now),4) & "-" & Right("000" & Month(Now),2) & "-" & Right("000" & Day(DateAdd("d",-1,Now)) ,2) & " 05:00:00"     
    HMIRuntime.Tags("alarmexport_end").Write Right("000" & Year(Now),4) & "-" & Right("000" & Month(Now),2) & "-" & Right("000" & Day(DateAdd("d",-1,Now)) ,2) & " 23:59:59" 
    
    HMIRuntime.Tags("alarmexport_filter_bereich").Write ""
    HMIRuntime.Tags("alarmexport_filter_herkunft").Write ""
    HMIRuntime.Tags("alarmexport_filter_meldetext").Write ""
                                                                                                                                                                               
'    ####################################################
'
'    WinCC-Alarm-Archiv exportieren
'
'    mit Sommer-/Winterzeitumrechnung Deutschland
'
'    ####################################################




Dim objConnection
Dim strConnectionString
Dim lngValue
Dim strSQL, strSQL1
Dim objCommand
Dim n, z, s
Dim antwort


'    Zeiten Archivausschnitt Online-Trend
Dim btag, bmnt, bjhr, bstd, bmin, bsek, startzeit    '    Begin-Zeit
Dim etag, emnt, ejhr, estd, emin, esek, endzeit        '    End-Zeit
Dim tag, mnt, jhr, std,min, sek




Dim obj_cn, obj_rs, obj_com, sql_query
Dim csvname, obj_fso, obj_stream
Dim col_number, record_count


Set obj_cn = CreateObject("ADODB.Connection")
obj_cn.connectionstring="Provider=WinCCOLEDBProvider.1;Catalog=" & HMIRuntime.Tags("@DatasourceNameRT").Read & "; Data Source=.\WinCC"
obj_cn.CursorLocation = 3
obj_cn.Open


'    Startzeit Exportzeitraum
startzeit = ScreenItems("EAstart").OutputValue    
btag = Day(startzeit)
bmnt = Month(startzeit)
bjhr = Year(startzeit)
bstd = Hour(startzeit)
bmin = Minute(startzeit)
bsek = Second(startzeit)
If bmin < 10 Then bmin= "0" & bmin
If bsek < 10 Then bsek= "0" & bsek


'    Endzeit Exportzeitraum
endzeit = ScreenItems("EAend").OutputValue    
etag = Day(endzeit)
emnt = Month(endzeit)
ejhr = Year(endzeit)
estd = Hour(endzeit)
emin = Minute(endzeit)
esek = Second(endzeit)
If emin < 10 Then emin= "0" & emin
If esek < 10 Then esek= "0" & esek


Dim strJahr, strSommer, strWinter, umrechnung
Dim i
strJahr=ejhr
umrechnung = 0
For i = 31 To 20 Step -1
    '    Datum Umstellung auf Sommerzeit
    If Left(WeekdayName(Weekday(i & ".3." & strJahr)), 2) = "So" Then
        strSommer = DateValue(FormatDateTime((i & ".3." & strJahr), vbShortDate))
           Exit For
    End If
Next
For i = 31 To 20 Step -1
    '    Datum Umstellung auf Winterzeit
    If Left(WeekdayName(Weekday(i & ".10." & strJahr)), 2) = "So" Then
        strWinter = DateValue(FormatDateTime((i & ".10." & strJahr), vbShortDate))
           Exit For
    End If
Next


'    Bestimmung Sommer- oder Winterzeit
Dim datum
datum = DateValue(FormatDateTime((etag & "." & emnt & "." & ejhr),vbShortDate))
'    Umrechnungsfaktoren für UTC -> MEZ bzw. MESZ
If (datum >= strSommer) And (datum < strWinter) Then umrechnung = 2
If (datum < strSommer) Or (datum >= strWinter) Then umrechnung = 1 


'    Start-/Endzeit auf MEZ/MESZ umrechnen
Dim start, ende
startzeit = bjhr & "-" & bmnt & "-" & btag & " " & bstd & ":" & bmin & ":" & bsek
startzeit = DateAdd("h",-umrechnung,startzeit)
startzeit = Year(startzeit) & "-" & Right("000" & Month(startzeit),2) & "-" & Right("000" & Day(startzeit),2) & " " & Right("000" & Hour(startzeit),2) & ":" & Right("000" & Minute(startzeit),2) & ":" & Right("000" & Second(startzeit),2)
start = bjhr & "-" & bmnt & "-" & btag & " " & bstd & ":" & bmin & ":" & bsek
start = Replace(start,":","_")
endzeit = ejhr & "-" & emnt & "-" & etag & " " & estd & ":" & emin & ":" & esek
endzeit = DateAdd("h",-umrechnung,endzeit)
endzeit = Year(endzeit) & "-" & Right("000" & Month(endzeit),2) & "-" & Right("000" & Day(endzeit),2) & " " & Right("000" & Hour(endzeit),2) & ":" & Right("000" & Minute(endzeit),2) & ":" & Right("000" & Second(endzeit),2)
ende = ejhr & "-" & emnt & "-" & etag & " " & estd & ":" & emin & ":" & esek
ende = Replace(ende,":","_")


Dim oRs
Dim zeit1


'    SQL-String
sql_query = "ALARMVIEW:SELECT * FROM ALGVIEWDEU WHERE (DateTime >= '" & startzeit & "') AND (DateTime <= '" & endzeit &"')"


Set obj_rs = CreateObject("ADODB.Recordset")
Set obj_com = CreateObject("ADODB.Command")
obj_com.CommandType = 1
Set obj_com.ActiveConnection = obj_cn
obj_com.CommandText = sql_query
Set obj_rs = obj_com.Execute
record_count = obj_rs.Fields.Count


'    CSV-Datei erstellen


csvname = HMIRuntime.ActiveProject.Path & "\Auswertung\" & "Störungshistory_" & Right("000" & Year(Now),4) & "_" & Right("000" & Month(Now),2) & "_" & Right("000" & Day(DateAdd("d",-1,Now)) ,2) & ".csv" '"-" & Right("000" & Hour(Now),2) & "_" & Right("000" & Minute(Now),2) & "_" & Right("000" & Second(Now),2) & "_" & start & "-" & ende & ".csv"
Set obj_fso = CreateObject("Scripting.FileSystemObject")
Set obj_stream = obj_fso.OpenTextFile(csvname, 2, True)


'    Spaltenüberschriften schreiben
For col_number = 0 To obj_rs.Fields.Count-1
    If col_number = 0 Then
        obj_stream.Write obj_rs.Fields(col_number).name    
    Else
        obj_stream.Write ";" & obj_rs.Fields(col_number).name
    End If
Next 


obj_stream.Write vbCrLf
Dim herkunft, meldetext, bereich
'    Datensatz schreiben
If (record_count > 0) Then
    obj_rs.movefirst    
    While Not obj_rs.Eof
        herkunft = ucase(Trim(HMIRuntime.Tags("alarmexport_filter_herkunft").Read))
        bereich = ucase(Trim(HMIRuntime.Tags("alarmexport_filter_bereich").Read))
        meldetext = ucase(Trim(HMIRuntime.Tags("alarmexport_filter_meldetext").Read))
        If ( (herkunft = "") Or (InStr(1, ucase(obj_rs.Fields(37).value), herkunft, 0) <> 0) ) And ( (bereich = "") Or (InStr(1, ucase(obj_rs.Fields(38).value), bereich, 0) <> 0) ) And ( (meldetext = "") Or (InStr(1, ucase(obj_rs.Fields(39).value), meldetext, 0) <> 0) ) Then        
            '    Zeit auf MEZ/MESZ umrechnen und in Spalte A einsetzen
            zeit1= DateAdd("h",+umrechnung,obj_rs.Fields(2).value)
            jhr = Year(zeit1)
            mnt = Month(zeit1)
            If mnt < 10 Then mnt = "0" & mnt
            tag = Day(zeit1)
            If tag < 10 Then tag = "0" & tag
            std = Hour(zeit1)
            If std < 10 Then std = "0" & std
            min = Minute(zeit1)
            If min < 10 Then min = "0" & min
            sek = Second(zeit1)
            If sek < 10 Then sek = "0" & sek
            zeit1= tag & "." & mnt & "." & jhr & " " & std & ":" & min & ":" & sek
            '    Ausgabe in Datei
            
            For col_number = 0 To obj_rs.Fields.Count-1
                If col_number = 0 Then
                    obj_stream.Write obj_rs.Fields(col_number).value
                Elseif col_number = 2 Then 
                    obj_stream.Write ";" & zeit1
                Else 
                    obj_stream.Write ";" & obj_rs.Fields(col_number).value
                End If
            Next 
            obj_stream.Write vbCrLf
        End If
        obj_rs.movenext
    Wend
    obj_rs.close
End If


Set obj_rs = Nothing
Set obj_cn = Nothing
Set obj_fso = Nothing


End Function
 
Als trigger habe ich einen Merker der von der SPS kommt benutz, später soll das durch die Uhrzeit getriggert werden.

Aber irgendwie will das nicht klappen, das Script wird nicht ausgelöst oder es ist im Script ein fehler vorhanden der aber nicht angezeigt wird.

Also ich sage es mal so :
Ich habe dein Script jetzt nur überflogen ... würde aber behaupten, dass es wahrscheinlich noch immer so funktioniert wie vorher. Hast du daran etwas geändert ?
In jedem Fall aber : hättest du einen Fehler darin dann bekämst du eine Meldung.
Somit wäre mein Ansatz, dass das Script gar nicht ausgeführt wird.
Nun schreibst du, das der Trigger ein SPS-Merker ist - dazu :
- funktioniert der wirklich korrekt ?
- wie wird der in der Visu aktualisiert ? Nur davon, dass du ihn in der Variablentabelle stehen hast und du bei seiner Wertänderung ein Script aufrufen willst erzwingst du noch keine Aktualisierung des Merkers in der Visu. Hierzu mußt die Einstellung der Variablen dahingehend ändern, dass sie ständig aktualisiert wird und nicht nur bei Verwendung ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe ihn nur in der Variablentabelle, ich glaube den Fehler hatte ich schon mal mit der Aktualisierung.
Aber selbst wenn ich es über die Zeit triggere geht es nicht. Es ist bestimmt irgendwas simples, oder muss ich bei Zeit triggerung auch noch auf etwas achten.
Ich schon etwas her das ich mit Wincc gearbeitet habe.

- wie wird der in der Visu aktualisiert ? Nur davon, dass du ihn in der Variablentabelle stehen hast und du bei seiner Wertänderung ein Script aufrufen willst erzwingst du noch keine Aktualisierung des Merkers in der Visu. Hierzu mußt die Einstellung der Variablen dahingehend ändern, dass sie ständig aktualisiert wird und nicht nur bei Verwendung ...

bild.jpg
 
Ich weiß nicht genau wie das in WinCC heißt - stellt man den Trigger auf etwas wie "dauernd" oder ähnlich.
Darüber hinaus sollte deine Triggerzeit der Änderung des Merkers angepasst sein - also vielleicht eher 1 Sek ...

Gruß
Larry
 
die Abfrage beim Merker ist auf "Bei Änderung" gestellt,
der Timer der das Script zusätzlich ausführen soll ist auf 1min eingestellt, d.h. jede minute soll das Script ausgeführt werden, aber nichts passiert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
es geht um die Aktualisierung des Merkers von der SPS zur Visu - das geschieht nicht von selbst sondern normalerweise nur, wenn er als Variable für eine Animation auf einer Bildseite angelegt ist ...
Hier ist Standardmäßig etwas "bei Verwendung" eingestellt und du müßtest das ändern auf etwas in der Art wie "dauernd" oder "fortlaufend" ...
 
habe einen test mit nur einer Kommandozeile gemacht, das script an sich funktioniert. liegt also an was anderem.

Code:
Option ExplicitFunction action
    
   
    HMIRuntime.Tags("alarmexport_filter_bereich").Write "1234445555656666"


End Function
 
Du hast in dem Script ein Screenitem.
"startzeit = ScreenItems("EAstart").OutputValue"
Wenn du das als Action aufrufst und das Bild nicht aktiv ist, schmiert dein script ab.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
wenn du mir jetzt noch sagt wie ich das abändern muss dann wäre ich dir sehr dankbar.
In Zukunft soll WinCC als Service-Projekt laufen.
 
Zuletzt bearbeitet:
Du muss die die "startzeit" aus einer Variablen holen und nicht aus dem EAfeld. Also
" startzeit = HMIRuntime.Tags("deine_variable").Read"

Fehler im Script kannst du die anzeigen lassen indem du ein Diagnose Fenster in ein Bild einfügst. Dann siehst du wo es hängt.

"
 
Zurück
Oben