WinCC Unified Unified Panel/Faceplate: Script ausführen, wenn sich der Wert einer Variable ändert.

wollbit

Level-2
Beiträge
53
Reaktionspunkte
8
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin zusammen,

ich habe momentan ein Unified Panel vor mir und darf alle Bildbausteine eines Projekts komplett nachbauen.
Trotz zahlreicher Problem, klappt es bisher "einigermaßen" gut. 🙄
Momentan erstelle ich ein Faceplate für die IO Anzeige. Dafür habe ich ein DWORD als Input und eins für Output.

Meine Frage:
Ich habe bisher keine Möglichkeit gefunden, eine Script (Innerhalb des Faceplates) zu starten, wenn sich der Wert der Variablen ändert. (Variablen Schnittstelle)

Die einzige Möglichkeit, die ich jetzt kenn, ist:
Unter Eigenschaften eines beliebigen Elements bei einem beliebigen Attribut den Wert auf Dynamisch per Script zu stellen
und dort einen Trigger von z.B.100ms zu setzen.
Das ist alles andere als sauber!

Kennt jemand eine bessere Lösung, die später auch noch von anderen nachvollzogen werden kann?


Grüße Olli 😎
 
Servus Olli,

ich denke das müsste eleganter gehen.

1655274338835.png

Über die Eigenschaft Prozesswert lässt sich bei Änderung ein Skript starten, falls sich die Variable ändert.

Gruß Luki
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Luki,
in etwa so mache ich das auch.
In meinem Fall kann ich allerdings unterschiedliche Darstellungsformen und muss daher Scripten. Und steuer mit einem Aufruf alle auf einmal.



Anmerkung:
Das viel größere Problem ist hier aber, dass die Scripte der Eigenschaften und die der Ereignisse voneinander getrennt sind und jede seinen eigenen globalen Bereich hat. Natürlich kann man nicht auf Funktionen oder Variablen des anderen globalen Bereichs zugreifen. :mad:

Es gibt zwei mögliche Lösungen:
1) Im Projekt ein Script Modul anlegen. Ist mit Faceplates etwas unpraktisch.
2) Mit einer Eigenschafts-Variable des Faceplates die Variablen übergeben. Auf diesen Bereich können beide zugreifen.



Gruß Olli
 
Der Thread ist jetzt zwar schon ein paar Jahre alt aber ich stehe vor einem ähnlichen Problem.
Bei Advanced konnte ich auf die Wertänderung einer Variable direkt aus der Variablentabelle aus reagieren.
Da das nicht mehr geht habe ich ein unsichtbares E/A Feld, die Variable als Prozesswert angegeben und rufe bei Prozesswertänderung ein Skript auf. Solange das E/A Feld irgendwo in der Anzeige ist, geht das auch. Das Problem was ist habe ist aber, dass ich keine anderen Skripte, die ich global definiert habe aufrufen kann und das macht das ganze dann quasi wieder unbrauchbar für meine Zwecke. Ich müsste in jedem Bild, wo ich ein anderes unsichtbares E/A Feld habe das Skript neu einfügen und Änderungen überall nachziehen. Außerdem versteht ja nachher kein Mensch mehr, wie meine Visu Funktioniert.

Konkret geht es gerade darum, dass die CPU dem Panel mitteilen soll, wann eine bestimmte Rezeptur geladen werden muss.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei Bildwechsel funktioniert ja nicht. Es ist nicht sichergestellt, dass regelmäßig Bilder gewechselt werden. Aufgabenplaner wäre ja nur Zeitgetriggertes Pollen möglich. Auch die letzte Option die ich machen wollen würde. Ich wollte mal in einem Skript im Aufgabenplaner die Benutzerrechte auslesen. Das ging auch nicht.

Ich habe gerade mal meine lokale Simulation von einem zweiten Rechner aus aufgerufen. Ich glaube ich habe da noch ein grundsätzliches Verständnis Problem, mit dem was quasi auf dem Server läuft und dem was die Instanz der Runtime betrifft.

Interne Variablen werden nämlich ach Global über alle Runtime Instanzen verwendet. Damit funktioniert ein großer Teil meiner Visu dann eh nicht mehr. Der Aufgabenplaner scheint in auf dem Server ausgeführt zu werden. Die Benutzerrechte hingegen liegen in der Instanz von der Runtime. Ich vermute, dass das mit meinem Skripten einen ähnlichen Hintergrund hat.
 
Bei Bildwechsel funktioniert ja nicht. Es ist nicht sichergestellt, dass regelmäßig Bilder gewechselt werden
Braucht es auch nicht.
Du erstellt die Subscription im Aufgebaut Ereignisse des Hauptbildes.
Panel fährt hoch => Hauptbild wird einmalig aufgebaut => Subscription wird erstellt und ruft jedes Mal ihre Callback Funktion auf sobald sich die Variable ändert.
Solange das Hauptbild geladen bleibt, bleibt auch dessen Scriptkontext aktiv.
Deswegen auch im Hauptbild, da dieses nur einmalig geladen wird. Willst ja nicht andauern die Subscription neu erstellen.
Wenn du dann im laufenden Betrieb den Inhalt des Hauptbildes änderst ist das für die gestartete Subscription im Kontext des Hauptbildes irrelevant.
Ich wollte mal in einem Skript im Aufgabenplaner die Benutzerrechte auslesen. Das ging auch nicht.
Jep, im Aufgabenplaner hast du ein paar Einschränkungen, da dieser nicht mit UI interagieren kann.
Der Aufgabenplaner scheint in auf dem Server ausgeführt zu werden.
Korrekt.
Ich vermute, dass das mit meinem Skripten einen ähnlichen Hintergrund hat.
Mehr oder weniger.
Du musst immer etwas aufpassen in welchem Scriptkontext du dich gerade bewegst.
Gab mal irgendwo eine Siemens Anleitung dazu was du beim Einsatz von mehreren Client-Instanzen beachten musst.
Finde die leider Grade nicht mehr...
 
Danke dann versuche ich das mal mit der Subscription.
Ich habe schon herausgefunden, dass ich interne Variablen auf "Sitzungslokal" stellen kann. Dann gelten sie nur in einer Client-Instanz. War zum Glück dann nur eine kleine Änderung und das wichtigste von meiner Visu läuft jetzt wie gewünscht.
 
nun läuft es...

Ich habe versucht Auf Test() bzw. auf Navigation.Test() zu zugreifen. Richtig ist aber module_navigation.Test().
Da bin ich drauf gekommen weil ich unter Ereignisse vom E/A Feld ein Sktipt aufrufen konnte per Auswahl und das dann in Skript geändert habe. Dort habe ich dann gesehen, was generiert wurde.

Dein Link geht leider nicht aber ich schaue mir das jetzt mal mit F1 an weil das ist ja schon Eleganter als ein Verstecktes E/A Feld dafür zu missbrauchen
 
Noch eine Falle. Wenn man unter Ereignisse so ein Skript aufruft, dann wird unter globale Definitionen ein Import gemacht

import * as module_navigation from "Navigation";

Der Import muss auch da sein, damit mit auf module_navigation.Test() zugreifen kann.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dein Link geht leider nicht
Ist korrigiert.
Der Import muss auch da sein, damit mit auf module_navigation.Test() zugreifen kann.
Das ist Javascript-spezifisch, nicht direkt Siemens.
Die Script-Instanz kann prinzipiell beliebig benannt werden, muss nicht speziell module_irgendwas heißen.
Siehe https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import
 
Zurück
Oben