WinCC Unified Js ungültige änderung in EA-Feld nicht anzeigen

user25434

Level-1
Beiträge
27
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo ich habe ein Problem. Ich habe ein EA-Feld per Script an einen Tag angehängt. Dieser Tag hat ein Maximum und ein Minimum. Das Problem ist, wenn ich einen Wert über dem Maximum oder unter dem Minimum eingebe, bleibt der ungültige Wert auf dem EA-Feld stehen, aber das Tag im Hintergrund bleibt unverändert, was für jemanden, der sich nicht so gut auskennt, verwirrend sein kann, z.B. wenn man etwas testen will. Also wollte ich den Code so ändern, dass er den Wert des EA-Feldes auf den vorherigen Wert zurücksetzt, wenn eine ungültige Eingabe gemacht wurde. Das ist die Lösung die ich mir ausgedacht habe:

export function Umf_ersatzwertfeld_ProcessValue_OnPropertyChanged(item, value) {
Tags("UMF_ersatzwert").Write(value / Tags("UMF_scale").Read());

if(Tags("UMF_ersatzwert").Read() !== value / Tags("UMF_scale").Read()){
item.ProcessValue = Tags("UMF_ersatzwert").Read() * Tags("UMF_scale").Read();
}

}
"Hier ist der UMF_ersatzwert der Wert, den ich beschreiben möchte, er wird als DInt auf dem Tag gespeichert, aber als Zahl mit Dezimalstellen auf dem EA-Feld angezeigt, die Anzahl der Dezimalstellen wird durch UMF_scale angegeben, also muss ich das per Skript machen, weil ich es immer umrechnen muss"
Ich habe es zuerst mit einem Try and Catch versucht, aber das hat nicht funktioniert, da es keinen Laufzeitfehler gibt, wenn der Wert ungültig ist.
Diese Lösung hier funktioniert auch nicht, da die Read und Write Funktionen nicht direkt auf die SPS schreiben und somit der untere Read nicht den Wert des oberen Write bekommt, sondern den Wert, der vorher darauf geschrieben wurde. Es gibt aber für beide Parameter, die man übergeben kann, die das ermöglichen, aber die haben anscheinend einen speziellen Datentyp und ich verstehe nicht ganz wie das funktioniert. Wenn jemand weiß wie das funktioniert oder eine andere Lösung hat, wäre ich sehr dankbar.
 
Ich habe ein EA-Feld per Script an einen Tag angehängt.
Wie hast Du das genau gemacht?
Üblicherweise hat man ein EA-Feld, wo eine Variable als Prozesswert projektiert ist. Da wird der im EA-Feld angezeigte Wert im Aktualisierungszyklus der Variable zyklisch aktualisiert. Wenn durch die abgewiesene Eingabe im EA-Feld der Wert der Variable nicht verändert wird, dann zeigt das EA-Feld nach der Aktualisierungszeit automatisch wieder den aktuellen Wert an (den Wert vor der Eingabe).

Es scheint so, als ob Dein EA-Feld das nicht macht. Eigentlich braucht Dein EA-Feld nur die Anzeige aktualisieren. (Mit WinCC Unified und JS habe ich allerdings keine Erfahrung und kann da nichts detailliertes zu sagen.)

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie hast Du das genau gemacht?
Üblicherweise hat man ein EA-Feld, wo eine Variable als Prozesswert projektiert ist. Da wird der im EA-Feld angezeigte Wert im Aktualisierungszyklus der Variable zyklisch aktualisiert. Wenn durch die abgewiesene Eingabe im EA-Feld der Wert der Variable nicht verändert wird, dann zeigt das EA-Feld nach der Aktualisierungszeit automatisch wieder den aktuellen Wert an (den Wert vor der Eingabe).

Es scheint so, als ob Dein EA-Feld das nicht macht. Eigentlich braucht Dein EA-Feld nur die Anzeige aktualisieren. (Mit WinCC Unified und JS habe ich allerdings keine Erfahrung und kann da nichts detailliertes zu sagen.)

Harald
Hallo Harald.
Ich habe an den Prozesswert des EA-Feldes statt eines Tags ein Skript angehängt, da ich den Wert als Integer speichere, aber mit Dezimalstellen anzeig, um ihn zu konvertieren, brauche ich das Skript, es sieht ungefähr so aus:
export function Umf_ersatzwertfeld_ProcessValue_Trigger(item) {
var value;
value = Tags("UMF_ersatzwert").Read() * Tags("UMF_scale").Read();
return value;
}

Das Skript wird immer getriggert wenn sich UMF_ersatzwert ändert und das obere Skript wird getriggert wenn man Manuell etwas in das EA-Feld reinschreibt.
Wenn ich das Feld auf einen Timer stelle, so dass es z.B. alle 1 - 5 Sekunden aktualisiert wird, kann es sein, dass die Eingabe, die man macht, manchmal überschrieben wird, wenn man zum falschen Zeitpunkt bestätigt und das ist noch unpraktischer.

Dominic
 
Ich habe an den Prozesswert des EA-Feldes statt eines Tags ein Skript angehängt, da ich den Wert als Integer speichere, aber mit Dezimalstellen anzeig, um ihn zu konvertieren, brauche ich das Skript
Das klingt wie das Problem, wo Siemens gerade einen FAQ veröffentlich hat:
Wie stellen Sie in WinCC Unified einen Ganzzahligen Wert in einem E/A-Feld mit Dezimalstellen dar?

Vielleicht ist das hilfreich für Dich? Oder hat die Siemens-Lösung ebenfalls Dein Problem? Dann weise Siemens mal drauf hin (unten Feedback zu dem Beitrag) und/oder frage Siemens nach einer Lösung.

Harald
 
Das klingt wie das Problem, wo Siemens gerade einen FAQ veröffentlich hat:
Wie stellen Sie in WinCC Unified einen Ganzzahligen Wert in einem E/A-Feld mit Dezimalstellen dar?

Vielleicht ist das hilfreich für Dich? Oder hat die Siemens-Lösung ebenfalls Dein Problem? Dann weise Siemens mal drauf hin (unten Feedback zu dem Beitrag) und/oder frage Siemens nach einer Lösung.

Harald
Ja ich brauche bereits die Siemens Lösung nur das sie eine feste Zahl zum teilen verwenden und ich einen Tag aber das sollte keinen Unterschied machen da es ja beide Zahlen sind aber ich schreibe mal an den Siemens Support danke!
 
Hallo,

habe zwar das Script nicht so ganz verstanden, aber im gleichen Script wird "Tags("UMF_ersatzwert"). write(xx)" und "Tags("UMF_ersatzwert")". Read()" verwendet - ich weiss nicht ob das funktioniert - gibt doch mal den Wert der Variablen im Trace aus, da weiss man gleich was passiert.

Viel Erfolg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Welche Ereignisse gibt es bei dem EA-Feld?
Ich meine, da muß lediglich beim Verlassen des EA-Feldes (egal ob Wert geändert oder nicht) noch derselbe Code wie bei Wertänderung der PLC-Variable aufgerufen werden, damit wieder der aktuelle Wert der PLC-Variable angezeigt wird und nicht der evtl. abgewiesene interne Eingabewert. Notfalls könnte man das Variable-Wertänderung-Skript auch bei Bild aufgebaut aufrufen. Auch nicht perfekt, aber immer noch besser als die von Siemens angebotene "Lösung".

Der Anzeigewert im EA-Feld wird durch die Skripterei nur aktualisiert, wenn sich der Wert der PLC-Variable ändert. Die PLC-Variable ändert sich aber nicht, wenn der Eingabewert abgewiesen wird. Also wird der Anzeigewert nicht auf den (vorherigen und immer noch gleichen) Wert aktualisiert. Ein Teufelskreis! ;) :cool:

Harald
 
Hallo,

habe zwar das Script nicht so ganz verstanden, aber im gleichen Script wird "Tags("UMF_ersatzwert"). write(xx)" und "Tags("UMF_ersatzwert")". Read()" verwendet - ich weiss nicht ob das funktioniert - gibt doch mal den Wert der Variablen im Trace aus, da weiss man gleich was passiert.

Viel Erfolg
Hallo Georg.
ja das ist mir schon bewusst, da die Write Funktion nicht direkt auf die SPS schreibt, sondern erst nach ein paar Zyklen synchronisiert wird, aber dafür gibt es Parameter, die man den Funktionen übergeben kann, damit sie warten bis es synchronisiert wurde und erst dann das Skript fortsetzen. leider kenne ich diese Parameter nicht, da ich noch keine Dokumentation dazu gefunden habe, aber ich weiß, dass es sie gibt, da sie in der Funktionsinfo angezeigt werden, wenn man mit der Maus über die Funktion fährt. Sie haben aber komische Datentypen, von denen ich noch nie gehört habe und ich weiß auch nicht, was ich da reinschreiben soll. Wenn du mehr Informationen über diese Parameter hast, würde mir das sehr helfen!

Domi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich denke du solltest dir mal die Unified Toolbox anschauen. Dort gibt es Custom Tastaturen mit min/max
Hallo razer
Bist du dir sicher das es die auch auf Unified gibt denn ich habe sie noch nicht gefunden.
Wo hast du diese gesehen denn das währe sehr praktisch!
Domi
 
Welche Ereignisse gibt es bei dem EA-Feld?
Ich meine, da muß lediglich beim Verlassen des EA-Feldes (egal ob Wert geändert oder nicht) noch derselbe Code wie bei Wertänderung der PLC-Variable aufgerufen werden, damit wieder der aktuelle Wert der PLC-Variable angezeigt wird und nicht der evtl. abgewiesene interne Eingabewert. Notfalls könnte man das Variable-Wertänderung-Skript auch bei Bild aufgebaut aufrufen. Auch nicht perfekt, aber immer noch besser als die von Siemens angebotene "Lösung".

Der Anzeigewert im EA-Feld wird durch die Skripterei nur aktualisiert, wenn sich der Wert der PLC-Variable ändert. Die PLC-Variable ändert sich aber nicht, wenn der Eingabewert abgewiesen wird. Also wird der Anzeigewert nicht auf den (vorherigen und immer noch gleichen) Wert aktualisiert. Ein Teufelskreis! ;) :cool:

Harald
Hallo Harald.
Ja das wollte ich eigentlich mit dem erreichen machen, leider funktioniert das nicht ganz so wie ich mir das vorgestellt habe und es gibt auch keine Veranstaltung dafür. :(
Mir fällt im Moment auch keine andere Möglichkeit ein, das Script beim Verlassen des EA-Feldes aufzurufen. Ich bin mir nicht ganz sicher, was du mit Bildaufbau meinst, aber ich würde vermuten, dass das das Ereignis ist, das ausgelöst wird, wenn ein Bild erneuert wird. Wenn das Faceplate geschlossen und wieder geöffnet wird, ist der Wert wieder korrekt, aber ich möchte eigentlich, dass er nie falsch sein kann, um Verwirrung zu vermeiden.
Das erste Skript wird nur ausgeführt, wenn sich die Variable ändert, das ist richtig, aber das Skript, das ich oben geschrieben habe, sollte ausgeführt werden, wenn sich der Inhalt des EA-Feldes ändert, das tut es auch, aber da das EA-Feld nicht direkt auf die SPS schreibt, sondern über Umwege, kann ich es unten nicht wieder kontrollieren, um den Inhalt anzupassen. Es gibt aber Parameter, die man dem Read und Write mitgeben kann, um dieses Problem zu umgehen, aber ich habe dazu noch keine Dokumentation gefunden und das, was im JS-Editor dazu steht, ist auch nicht wirklich hilfreich.
Domi
 
Mit "bei Bild aufgebaut" meine ich das Ereignis "Bild aufgebaut" bei den Ereignissen eines Bildes.

Du müsstest Dir eigentlich nur mal anschauen, welche Ereignisse (Events) es bei Deinem EA-Feld gibt, und schauen/ausprobieren, welches Ereignis ausgelöst wird, wenn bei Deinem Problem der Eingabewert nicht übernommen wird. Und bei diesem Ereignis mußt Du vermutlich einfach nur den gleichen Code ausführen, wie bei der Wertänderung der mit der PLC verbundenen HMI-Variable - also den Wert der Integervariable mit dem Skalierfaktor multiplizieren/dividieren und auf die Panel-interne Variable ablegen. Welchen Modus hat Dein EA-Feld?

Ich habe keine TIA-Version, mit der man unified Panels oder Runtimes projektieren kann. Ich kann das nicht für Dich raussuchen. Mach doch mal ein Bild von den "Ereignissen" ("Events") des EA-Feldes und zeige uns das hier.
Welche TIA Version verwendest du eigentlich? Für welches Gerät?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit "bei Bild aufgebaut" meine ich das Ereignis "Bild aufgebaut" bei den Ereignissen eines Bildes.

Du müsstest Dir eigentlich nur mal anschauen, welche Ereignisse (Events) es bei Deinem EA-Feld gibt, und schauen/ausprobieren, welches Ereignis ausgelöst wird, wenn bei Deinem Problem der Eingabewert nicht übernommen wird. Und bei diesem Ereignis mußt Du vermutlich einfach nur den gleichen Code ausführen, wie bei der Wertänderung der mit der PLC verbundenen HMI-Variable - also den Wert der Integervariable mit dem Skalierfaktor multiplizieren/dividieren und auf die Panel-interne Variable ablegen. Welchen Modus hat Dein EA-Feld?

Ich habe keine TIA-Version, mit der man unified Panels oder Runtimes projektieren kann. Ich kann das nicht für Dich raussuchen. Mach doch mal ein Bild von den "Ereignissen" ("Events") des EA-Feldes und zeige uns das hier.
Welche TIA Version verwendest du eigentlich? Für welches Gerät?

Harald
Hallo Harald
Ja so etwas in die Richtung habe ich mir auch gedacht aber es gibt nur Events für wenn man das EA-Feld drückt oder loslässt aber keines das sich aktiviert wenn man die Eingabe beendet aber mit der Hilfe von den Tag Enums die Razor mir gezeigt hat funktioniert jetzt mein ursprünglicher Code und der wird immer ausgeführt wenn die Eingabe beendet wird also hat es eigentlich die selbe Wirkung aber danke dir nochmals🤝
 
Kannst Du uns den nun funktionierenden Code zeigen? z.B. ich kann mir gar nicht vorstellen, was Dein Problem mit Enums zu tun hat...


Das ist jetzt mein Code:

export function Umf_ersatzwertfeld_ProcessValue_OnPropertyChanged(item, value) {
Tags("UMF_ersatzwert").Write(value / Tags("UMF_scale").Read(),HMIRuntime.Tags.Enums.hmiWriteType.hmiWriteWait);

if(Tags("UMF_ersatzwert").Read(HMIRuntime.Tags.Enums.hmiReadType.hmiReadDirect) !== value / Tags("UMF_scale").Read()){
item.ProcessValue = Tags("UMF_ersatzwert").Read(HMIRuntime.Tags.Enums.hmiReadType.hmiReadDirect) * Tags("UMF_scale").Read();
}

}

Ich schreibe zuerst den wert auf den Tag und gebe den Parameter mit das er warten soll bis der Wert auf das PLC geschrieben wurde dann kontrolliere ich ob der wert wirklich auf den tag geschrieben wurde indem ich direkt vom PLC lese. Wenn es übereinstimmt passiert nichts aber wenn es nicht übereinstimmt setzt er den Inhalt des EA-Feldes zurück auf den Wert des tags.

Und ich benutze TIA 18 auf einem MTP700 Unified Comfort
 
Kannst Du uns den nun funktionierenden Code zeigen? z.B. ich kann mir gar nicht vorstellen, was Dein Problem mit Enums zu tun hat...
Ich denke er hat vorher einfach auf den Cache geschrieben und aus dem PLC gelesen also hat er nie den richtigen wert bekommen sondern immer den alten jetzt liest und schreibt er auf den gleichen also bekommt er auch den richtigen wert.
 
Zurück
Oben