faust
Level-2
- Beiträge
- 908
- Reaktionspunkte
- 277
-> Hier kostenlos registrieren
Stell doch mal spaßeshalber "Zyklisch fortlaufend mit 100ms" ein und berichte.
Folge dem Video um zu sehen, wie unsere Website als Web-App auf dem Startbildschirm installiert werden kann.
Anmerkung: Diese Funktion ist in einigen Browsern möglicherweise nicht verfügbar.
Das catch{} wird ausgelöst sobald eine exception geworfen wird.Ich frag mich nur, wann in dieser Konstellation ein catch ausgelöst werden kann. Wenn der Befehl nie gesetzt wird. Ohne das try catch wird wohl, falls der Befehl nicht erfolgreich geschrieben wurde trotzdem mein Bild gewechselt.
Das wird bei deinem speziellen Problem auch nicht passieren, da in deinem Script kein Fehler im eigentlichen Sinne auftritt.Also es funktioniert besser, aber trotzdem habe ich ab und an mal Aussetzer. Im TraceViewer wird kein Fehler aus dem try catch geschmissen.
try {
let befehl = Tags("DB_Daten_Befehle_xxx");
befehl.SetBit(1)
.then(() => {
HMIRuntime.Trace("\nPromise von SetBit wurde resolved.\n" +
"Bildobjekt: " + item.Name + "\n" +
"Bild: " + Screen.Name + "\n" +
"Bildpfad: " + Screen.Parent.Path, HMIRuntime.Trace.Enums.hmiSeverity.Info);
//Nachdem SetBit erfolgreichen vollzug gemeldet hat kann das Bild gewechselt werden.
HMIRuntime.UI.SysFct.ChangeScreen("Name des neuen Bilds", ".");
})
.catch((ex) => {
HMIRuntime.Trace("\nPromise von SetBit wurde rejected.\n" +
"QualityCode der Variable: " + befehl.QualityCode + "\n" +
"Bildobjekt: " + item.Name + "\n" +
"Bild: " + Screen.Name + "\n" +
"Bildpfad: " + Screen.Parent.Path + "\n" +
"Fehler: " + ex, HMIRuntime.Trace.Enums.hmiSeverity.Error);
});
} catch (ex) {
HMIRuntime.Trace("\nAllgemeiner Fehler im Bildwechsel-Befehl.\n" +
"QualityCode der Variable: " + befehl.QualityCode + "\n" +
"Bildobjekt: " + item.Name + "\n" +
"Bild: " + Screen.Name + "\n" +
"Bildpfad: " + Screen.Parent.Path + "\n" +
"Fehler: " + ex, HMIRuntime.Trace.Enums.hmiSeverity.Error);
}

Keine Sorge, in dem Punkt ist es mit Unified noch einfacher geworden.Wow, das wäre was für mich
Ich verwende in meinen HMI-Projekten massiv Skripte, in denen ich Variablennamen quasi zusammenbaue und diese außerdem sehr häufig nicht direkt an Controls projektiert sind. Das wäre dann ja so gar nicht mehr möglich ...
Das Zusammenbauen des Namens ist nicht das Problem, nur würde der Variablenwert ohne "zyklisch fortlaufende" Erfassung ja im Skriptkontext niemals aktuell sein. (So war/ist es ja bei WinCC Comfort/Advanced).Keine Sorge, in dem Punkt ist es mit Unified noch einfacher geworden.
Tags() erwartet lediglich einen String um ein Tag-Objekt zu erzeugen.
Diesen kannst du dir beliebig zusammenstellen, mit allen Schikanen die Javascript so hergibt.
Das ist dann irgendwie schräg....Also es funktioniert besser, aber selbst mit Timeout noch nicht 100%. Habe mit Siemens telefoniert und der meinte wohl es kann am IN/OUT liegen. Da ich die HMI Variablen dort auch verwenden und zwischendurch überschrieben werden. Da gibt es wohl viele die das Problem mit neueren Steuerungen haben.
.then(() => {
//Nach erfolgter Schreiboperation den Variablenwert direkt aus der SPS lesen und als Trace ausgeben
HMIRuntime.Trace("\nPromise von SetBit wurde resolved.\n" +
"Variablenwert der Befehlsvariable: " + befehl.Read(HMIRuntime.Tags.Enums.hmiReadType.hmiReadDirect) + "\n" +
"QualityCode der Variable: " + befehl.QualityCode + "\n" +
"Bildobjekt: " + item.Name + "\n" +
"Bild: " + Screen.Name + "\n" +
"Bildpfad: " + Screen.Parent.Path, HMIRuntime.Trace.Enums.hmiSeverity.Info);
//Nachdem SetBit erfolgreichen vollzug gemeldet hat kann das Bild gewechselt werden.
HMIRuntime.UI.SysFct.ChangeScreen("Name des neuen Bilds", ".");
})
Das ist dann wahrscheinlich die Problematik der Vermischung von optimierten und nicht optimierten Bausteinen. Das steht aber auch so im Handbuch.
Ein bisschen anders.Das Zusammenbauen des Namens ist nicht das Problem, nur würde der Variablenwert ohne "zyklisch fortlaufende" Erfassung ja im Skriptkontext niemals aktuell sein. (So war/ist es ja bei WinCC Comfort/Advanced).
Oder verstehe ich da etwas falsch bzw. ist dies in Unified anders?
let befehl = Tags("DB_Daten_Befehle_xxx");
befehl.Write(1, Tags.Enums.hmiWriteType.hmiWriteWait);
Das sollte eigentlich nichts ausmachen...
genau. Wobei das eigentliche Problem ist die schon oft angesprochene "optimierte" asynchrone HMI-Kommunikation ohne Zykluskontrollpunkt, die man besonders beachten muss. Halt die üblichen Multitasking-Probleme.Wenn jetzt das HMI in der Zwischenzeit eine SPS-Variable innerhalb der Struktur verändert hat, ist die Änderung damit platt gemacht.
Was meinst du damit?genau. Wobei das eigentliche Problem ist die schon oft angesprochene "optimierte" asynchrone HMI-Kommunikation ohne Zykluskontrollpunkt, die man besonders beachten muss. Halt die üblichen Multitasking-Probleme.
dass die HMI-Kommunikation einen Baustein unterbricht, und Variablenwerte in IN/OUT-Strukturen ändert und danach schreibt der Baustein die IN/OUT-Werte zurück und die Änderungen durch die HMI-Kommunikation sind wieder weg. Wie Oberchefe bereits in #31 erklärt hat. Die eigentliche Ursache des Problems ist das Multitasking - die unkooperativen azyklischen Unterbrechungen des SPS-Programms durch die HMI-Kommunikation.Was meinst du damit?
Aber mein DB und mein FB sind beide optimiert.
Das war hier nicht gemeint.Aber mein DB und mein FB sind beide optimiert.
Wir verwenden essentielle Cookies, damit diese Website funktioniert, und optionale Cookies, um den Komfort bei der Nutzung zu verbessern.
Siehe weitere Informationen und konfiguriere deine Einstellungen