Botimperator
Level-2
- Beiträge
- 466
- Reaktionspunkte
- 194
-> Hier kostenlos registrieren
Moin,
ich hab hier ein Kopfschmerz-Problem mit VBS & das allwissende G hat mir nicht wirklich eine Lösung geliefert....
TIA V16, TP1200 Comfort
Aus verschiedenen Gründen kann ich bei einem Projekt die Standard-Rezepturanzeige vom Panel nicht nutzen.
Also war meine Idee über EA-Felder die Rezepturvariablen zu Manipulieren & dann den Rezepturdatensatz mit
"SetDataRecordToPLC" bzw. "GetDataRecordFromPLC" auszutauschen.
Variablensynchronisation ist entsprechend gesetzt, damit ich die SPS-Variablen erst beim Drücken der "SetDataRecordToPLC"-Taste
konsistent auf die SPS geschrieben wird.
Ich hab mir dazu ein kleines Testbild geschieben um die Funktionen prinzipiell zu testen.
An die türkiesen EA-Felder sind die Rezepturvariablen angebunden, die gelben auf der rechten Seite
enthalten die aktuellen Werte des zugehörigen DBs auf der SPS.
Zum Laden der Werte von der SPS in den Datensatz muss ich also:
- laden der Werte von der SPS per "GetDataRecordFromPLC" in den Rezepturdatensatz laden
- warten bis die Daten fertig geladen sind
- Rezepturdatensatz in die Rezepturvariablen laden (ansonsten werden die aktualisierten Werte erst korrekt angezeigt wenn der Datensatz über das Dropdown-Menü neu ausgewählt wird.
Hab mir dazu mal folgenden Schnellschuss gestrickt:
Das funktioniert auch prinzipiell, also "Daten holen" => "Warten bis fertig" => "Rezepturvariablen aktualisieren"
Beim Schreiben der Werte muss ein ähnlicher Ablauf eingehalten werden:
- gegebenenfalls geänderte Werte in den Rezepturvariablen in den Rezepturdatensatz speichern (also wenn jemand das EA-Feld geändert hat ohne zwischenzeitlich auf "Speichern" zu drücken)
- warten bis fertig gespeichert / "Datensatz wirklich überschreiben"-Popup bestätigt
- Rezepturdatensatz per "SetDataRecordToPLC" auf die SPS schreiben
Dazu folgendes Script:
Dieses Script funktioniert nicht wie gewünscht.
Der Ablauf übergeht die Loop-Bedingung & löst "SetDataRecordToPLC" sofort aus, bevor der Datensatz mit geänderten Werten der Rezepturvariablen aktualisiert werden kann.
Einziger unterschied (soweit ich das bisher verstehe):
Das erste Script verwendet für die "Loop" Bedingung eine HMI-Variable, das zweite eine interne Scriptvariable.
Frage:
- Wieso macht es hier einen Unterschied ob ich eine HMI- oder Scriptvariable verwende?
- Gibt es eine bessere Möglichkeit auf das beenden einer Systemfunktion zu warten?
mfg Tobias
ich hab hier ein Kopfschmerz-Problem mit VBS & das allwissende G hat mir nicht wirklich eine Lösung geliefert....
TIA V16, TP1200 Comfort
Aus verschiedenen Gründen kann ich bei einem Projekt die Standard-Rezepturanzeige vom Panel nicht nutzen.
Also war meine Idee über EA-Felder die Rezepturvariablen zu Manipulieren & dann den Rezepturdatensatz mit
"SetDataRecordToPLC" bzw. "GetDataRecordFromPLC" auszutauschen.
Variablensynchronisation ist entsprechend gesetzt, damit ich die SPS-Variablen erst beim Drücken der "SetDataRecordToPLC"-Taste
konsistent auf die SPS geschrieben wird.
Ich hab mir dazu ein kleines Testbild geschieben um die Funktionen prinzipiell zu testen.
An die türkiesen EA-Felder sind die Rezepturvariablen angebunden, die gelben auf der rechten Seite
enthalten die aktuellen Werte des zugehörigen DBs auf der SPS.
Zum Laden der Werte von der SPS in den Datensatz muss ich also:
- laden der Werte von der SPS per "GetDataRecordFromPLC" in den Rezepturdatensatz laden
- warten bis die Daten fertig geladen sind
- Rezepturdatensatz in die Rezepturvariablen laden (ansonsten werden die aktualisierten Werte erst korrekt angezeigt wenn der Datensatz über das Dropdown-Menü neu ausgewählt wird.
Hab mir dazu mal folgenden Schnellschuss gestrickt:
'Daten von SPS-DB in Rezepturdatensatz übertragen
GetDataRecordFromPLC SmartTags("Rezeptnummer"), SmartTags("Datensatznummer"), hmiOverwriteWithConfirmation, hmiOn, "hRezeptReadState"
'Eben geladenen Rezepturdatensatz in Rezepturvariablen laden, sobald GetData fertig ist
Do
Loop Until SmartTags("hRezeptReadState") <> 2
LoadDataRecord SmartTags("Rezeptnummer"), SmartTags("Datensatznummer"), Null
Das funktioniert auch prinzipiell, also "Daten holen" => "Warten bis fertig" => "Rezepturvariablen aktualisieren"
Beim Schreiben der Werte muss ein ähnlicher Ablauf eingehalten werden:
- gegebenenfalls geänderte Werte in den Rezepturvariablen in den Rezepturdatensatz speichern (also wenn jemand das EA-Feld geändert hat ohne zwischenzeitlich auf "Speichern" zu drücken)
- warten bis fertig gespeichert / "Datensatz wirklich überschreiben"-Popup bestätigt
- Rezepturdatensatz per "SetDataRecordToPLC" auf die SPS schreiben
Dazu folgendes Script:
Dim hExecutionState
hExecutionState = 0
'gegebenenfalls geänderte Werte des Datensatzes müssen zuerst von den Rezepturvariablen in den Rezepturdatensatz gesichert werden
SaveDataRecord SmartTags("Rezeptnummer"), SmartTags("Datensatznummer"), hmiOverwriteWithConfirmation, hmiOn, hExecutionState
'Warten bis Datensatz gesichert & dann schreiben des Rezepturdatensatzes in Steuerung
Do
Loop Until hExecutionState <> 2
SetDataRecordToPLC SmartTags("Rezeptnummer"), SmartTags("Datensatznummer"), hmiOn, "hRezeptWriteState"
Dieses Script funktioniert nicht wie gewünscht.
Der Ablauf übergeht die Loop-Bedingung & löst "SetDataRecordToPLC" sofort aus, bevor der Datensatz mit geänderten Werten der Rezepturvariablen aktualisiert werden kann.
Einziger unterschied (soweit ich das bisher verstehe):
Das erste Script verwendet für die "Loop" Bedingung eine HMI-Variable, das zweite eine interne Scriptvariable.
Frage:
- Wieso macht es hier einen Unterschied ob ich eine HMI- oder Scriptvariable verwende?
- Gibt es eine bessere Möglichkeit auf das beenden einer Systemfunktion zu warten?
mfg Tobias