WinCC Bearbeitungsstatus mit VBs verarbeiten.

rehmaster

Level-1
Beiträge
12
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Kollegen,

folgendes Problem: Ich würde gerne den Bearbeitungsstatus einer Funktion auswerten und anhand dieser etwas machen.

Beispiel:
Code:
'Variablen definieren
Dim pfad
Dim status_import
Dim status_laden

'Funktion ausführen
ImportDataRecords pfad, 0, hmiOverwriteAlways, hmiOn, status_import

'Bearbeitungsstatus verarbeiten
If status_import = 4 then
LoadDataRecord "Rezeptur_1", Barcode, status_laden
End If

Schau ich in den Log führt er nur den ImportDataRecords aus nicht aber den LoadDataRecord.
Also:
Import der Datensätze gestartet
Import der Datensätze erfolgreich beendet
Wenn ich nun die Zeile "If status = 4 then" und die "End if" auskommentiere, dann führt er auch die LoadDataRecord aus.
Leider habe ich dann den Fehler das er schneller den Load ausführt als den Import beendet.
Also:
Import der Datensätze gestartet
Datensatz konnte nicht gefunden werden
Import der Datensätze erfolgreich beendet

Nun kann ich manuell noch einmal den LoadDataRecord ausführen und habe den Datensatz aber ich will ja das die Funktion automatisch ausgeführt wird NACHDEM der Import fertig ist. Laut Tooltipp im WinCC wäre nach dem erfolgreichen Laden der Bearbeitungsstatus auf 4
Tooltipp bearbeitungsstatus.PNG

Habe auch schon folgende Schreibweisen probiert:
If status =4 then
If status ="4" then

Hilft leider nichts. Irgendwie stehe ich auf dem Schlauch. Hat jemand eine Idee?
 
Hallo,
dein Problem ist, das die Bearbeitung der Funktion ImportDataRecords lange dauert, das Skript aber nicht wartet bis die Funktion fertig ist.
Die Funktion wird vom Skript nur angestoßen, die Ausführung erfolgt im Hintergrund. Das ist bei allen Datensatzfunktionen der Fall. Deshalb haben die auch den Bearbeitungsstatus als Rückgabewert.

Du muss also mit der Funktion LoadDataRecord warten bis der Status 4 kommt.
Das aber bitte nicht mit einer Schleife im Skript, weil sonst durch die Schleife nix anderes mehr abgearbeitet wird.
Du muss den Status in eine Variable schreiben und dann bei Wertänderung dieser Variable ein zweites Skript für das Laden des Datensatzes starten.

Gruß Nico
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du muss den Status in eine Variable schreiben und dann bei Wertänderung dieser Variable ein zweites Skript für das Laden des Datensatzes starten.
Problem dabei: Panel-interne Variablen lösen kein Ereignis bei Wertänderung aus, wenn die Wertänderung durch eine Zuweisung im Panel passiert (Loop breaker) Die Bearbeitungsstatus-Variable muß in einer HMI-Verbindung liegen.

Harald
 
Wenn der Import nur ein paar Sekunden dauert, dann kann man durchaus in einer Schleife auf das Ende der Importfunktion warten. Notfalls kann man auch mit Now einen Timeout-Abbruch in der Warteschleife realisieren.
Z.B. so:
Code:
ImportDataRecords pfad, 0, hmiOverwriteAlways, hmiOn, status_import

' in Schleife auf Ende des Imports warten
Do
Loop While (status_import And 4) = 0 ' 4=fertig OK / 12=abgebrochen mit Fehler

' wenn Import ohne Fehler, dann Datensatz laden
If status_import = 4 then
    LoadDataRecord "Rezeptur_1", Barcode, status_laden
    '...
End If

If status_import <> 4 Then
    ShowSystemAlarm "Fehler beim Import!"
End If

Harald
 
Alles klar. 1000 Dank. An den Zyklus habe ich nicht gedacht :D

Wie kann ich aber nun verhindern das es einen Loop gibt.
Ich nehme jetzt die Systemmeldung "Datensatz %1 nicht gefunden" und starte damit den Import.
Code:
Sub Job_Laden()
Dim Pfad
Dim Endung
Dim komp
Dim state_Import
Dim job
Dim state_del


Pfad="\\172.16.174.249\Users\gumbmann\Documents\Test\ELB"
'Pfad="\\paxros1.pax.local\maschinendaten\Ecklagerbohrer\ELB"
Endung=".csv"


komp= Pfad + Jobnummer + Endung
Jobdatei_Pfad =komp


ImportDataRecords komp, 0, hmiOverwriteAlways, hmiOn, state_Import


'ClearDataRecord 0, 0, hmiOff, hmiOff, state_del
End Sub

Wenn der Import erfolgreich war nehme ich die Systemmeldung "Import der Datensätze erfolgreich beendet" und starte damit erneut die suche nach dem Datensatz.
Code:
Sub Barcode_suche()
Dim State_Load


LoadDataRecord "ELB" , Barcode, State_Load
End Sub
Wenn der Import scheitert, lege ich eine Fehlermeldung auf. Aber wenn der Import klappt, aber im Import der Datensatz nicht vorhanden ist, sind wir im loop weil ja dann wieder die Systemmeldung "Datensatz %1 nicht gefunden" getriggert wird.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn der Import nur ein paar Sekunden dauert, dann kann man durchaus in einer Schleife auf das Ende der Importfunktion warten. Notfalls kann man auch mit Now einen Timeout-Abbruch in der Warteschleife realisieren.
Z.B. so:
Code:
ImportDataRecords pfad, 0, hmiOverwriteAlways, hmiOn, status_import

' in Schleife auf Ende des Imports warten
Do
Loop While (status_import And 4) = 0 ' 4=fertig OK / 12=abgebrochen mit Fehler

' wenn Import ohne Fehler, dann Datensatz laden
If status_import = 4 then
    LoadDataRecord "Rezeptur_1", Barcode, status_laden
    '...
End If

If status_import <> 4 Then
    ShowSystemAlarm "Fehler beim Import!"
End If

Harald

Hab ich so versucht, allerdings auch hier nur
Import der Datensätze gestartet
Import der Datensätze erfolgreich beendet
und keine weitere Aktion.
 
Du kannst ShowSystemAlarm zum Debuggen verwenden und Testausgaben ins Skript einbauen:
Code:
ImportDataRecords pfad, 0, hmiOverwriteAlways, hmiOn, status_import

' in Schleife auf Ende des Imports warten
Do
Loop While (status_import And 4) = 0 ' 4=fertig OK / 12=abgebrochen mit Fehler

' wenn Import ohne Fehler, dann Datensatz laden
If status_import = 4 then

    ShowSystemAlarm "Starte LoadDataRecord 'Rezeptur_1', Barcode='" & Barcode & "'"

    LoadDataRecord "Rezeptur_1", Barcode, status_laden
    ' in Schleife auf Ende des Datensatz laden warten
    Do
    Loop While (status_laden And 4) = 0 ' 4=fertig OK / 12=abgebrochen mit Fehler

    ShowSystemAlarm "LoadDataRecord beendet, Status=" & status_laden

    If status_laden = 4 then
    '...
    End If
End If

If status_import <> 4 OR status_laden <> 4 Then
    ShowSystemAlarm "Fehler beim Import Datensatz!"
End If
Harald
 
Moin, ich nochmal.
Wenn ich den Bearbeitungsstatus direkt in eine HMI variable schreiben möchte:
C-ähnlich:
ImportDataRecords komp, 0, hmiOverwriteAlways, hmiOn, Status_Import
welchen Parametertyp muss ich dann bei einer internen variable verwenden. Ich bekomme immer die Meldung "Falscher Parametertyp in Zeile 23 Spalte 55"
Wenn ich die Variable in "" setze, ist zwar der Fehler weg, aber die Variable scheint nicht geschrieben zu werden, da diese bei Wertänderung das nächste Skript ausführen soll. Dieses schreibt gleich am Anfang - Status = "Debug - jetzt import" - aber das passiert nicht.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich den Bearbeitungsstatus direkt in eine HMI variable schreiben möchte:
C-ähnlich:
ImportDataRecords komp, 0, hmiOverwriteAlways, hmiOn, Status_Import
welchen Parametertyp muss ich dann bei einer internen variable verwenden.
Das schreibe am besten so:
ImportDataRecords komp, 0, hmiOverwriteAlways, hmiOn, SmartTags("MeineHMIVariable_Status_Import")

Wenn ich die Variable in "" setze, ist zwar der Fehler weg, aber die Variable scheint nicht geschrieben zu werden, da diese bei Wertänderung das nächste Skript ausführen soll.
Beobachte den Wert der Status-HMI-Variable mit einem EA-Feld. Vermutlich schlägt da dieses Problem zu:
Problem dabei: Panel-interne Variablen lösen kein Ereignis bei Wertänderung aus, wenn die Wertänderung durch eine Zuweisung im Panel passiert (Loop breaker) Die Bearbeitungsstatus-Variable muß in einer HMI-Verbindung liegen.

Harald
 
Moin, ich habe es jetzt soweit hinbekommen das die Reihenfolge passt:

Sub Komplett()
Dim state_del
Dim Pfad
Dim Endung
Dim komp
Pfad="\\172.16.174.249\Users\rehmaster\Documents\Test\ELB"
Endung=".csv"

komp= Pfad + Jobnummer + Endung
Jobdatei_Pfad =komp
Status = "Starte Import"
Status_int = 1
ImportDataRecords komp, 0, hmiOverwriteAlways, hmiOn, "Status_ImportA"

' in Schleife auf Ende des Imports warten
Do
Loop While (Status_ImportA And 4) = 0 ' 4=fertig OK / 12=abgebrochen mit Fehler

' wenn Import ohne Fehler, dann Datensatz laden
If Status_ImportA = 4 Then

Status = "Starte suche"
Status_int = 1

LoadDataRecord "Ecklagerbohrer", Barcode, "Status_LadenA"
' in Schleife auf Ende des Datensatz laden warten
Do
Loop While (Status_LadenA And 4) = 0 ' 4=fertig OK / 12=abgebrochen mit Fehler

Status= "Datensatz läd"
Status_int = 1

If Status_LadenA = 4 Then
Status= "Datensatz geladen"
Status_int = 2
End If
If Status_LadenA = 12 Then
Status = "Datensatz existiert nicht"
ClearDataRecord 0, 0, hmiOff, hmiOff, state_del
Status_int = 3
End If
End If

If Status_ImportA = 12 Then
Status = "Fehler beim Import"
Status_int = 3
ClearDataRecord 0, 0, hmiOff, hmiOff, state_del
End If

End Sub

Nur leider bekomme ich jetzt immer Fehler beim Import.
Import der Datensätze gestartet. >> Fehler: Die Netzverbindung ist unterbrochen >> Import der Datensätze mit Fehler abgebrochen.

Online verbinden & Übertragen aus TIA raus funktioniert.
Ping über Win cmd funktioniert auch.
Vom PC aus komm ich auch Problemlos auf den Pfad \\172.16.174.249\Users\rehmaster\Documents\Test\
Darin liegen dann auch die Datein ELB478145.csv
Wenn ich das Script ausführe, steht auch unten im EA Fenster der korrekte Pfad drin \\172.16.174.249\Users\rehmaster\Documents\Test\ELB478145.csv

Woran kann der Verbindungsabbruch liegen?


PS: in der Simulation funktioniert alles ohne Fehler und ohne Probleme

Aktuell:
IP HMI: 172.16.165.112 - 255.255.0.0
IP PC: 172.16.174.249 - 255.255.240.0

Getestet - fail
IP HMI: 172.16.165.112 - 255.255.240.0
IP PC: 172.16.174.249 - 255.255.240.0

Getestet - fail
IP HMI: 172.16.165.112 - 255.255.0.0
IP PC: 172.16.165.59 - 255.255.0.0
 
Zuletzt bearbeitet:
Zurück
Oben