TwinCAT HMI: Serverseitigen code ausführen

Privatprogramm

Level-1
Beiträge
17
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo ihr lieben,

ich habe zwei Probleme und ich glaube die mit serverseitig ausführbaren Code lösen zu können:

1.
Ich berechne aus OPC-UA Daten einen neuen Wert. Diesen speichere ich in ein neuen Serversymbol/Variable. Das ganze geschieht über ein Globales Event und wird bei Änderung einer Servervariable ausgelöst. Die berechnete Servervariable wird historisiert und in einem Zeitreihendiagram dargestellt.
Das Problem ist: Die globalen Events werden nur ausgelöst, wenn ein Client die Webseite geöffnet hat. Ich möchte, dass diese Events serverseitig erkannt und ausgelöst werden. Damit meine Zeitreihe immer aktuell ist und nicht ein Client ständig aktiv sein muss.

2.
Durch die vielen Events, die durch Serversymbole/Variablen ausgelöst werden, ist meine Visualisierung ziemlich langsam und springt in Timeouts. Leider ist es alles etwas undurchsichtig, um herauszufinden, welche Events jetzt genau dafür verantwortlich sind, dass meine Visu viel im Leerlauf ist und und auf Serveranworten wartet.

Jetzt zu meiner Frage:
Ist serverseitiger Code möglich? Damit könnten die Funktionen auf dem Server ausgeführt werden, wo auch meine Servervariablen und OPC-UA Variablen sind.

Beim Code-Behind ist mir leider nicht klar, wie dieser genau arbeitet. Aber hier habe ich auch nicht herausgefunden, wie ich Events durch Servervariablen auslösen kann. Wie ich das verstehe, kann man nur Events machen wie: 'onInitialized' oder ControlEvents wie 'onPressed' etc.

Viele Grüße
Stefan
 
Ich bin unsicher, was du bisher gemacht hast.
Hast du im "HMI Config window" unter "global events" einen Eintrag ergänzt und schreibst bei Änderung des UA Symbols die Werte in ein anderes Server Symbol um das dann über das TrendLineChart darzustellen?
Damit laufen die Werte 0 (kein client), 3 (ein Client), 6 (zwei Clients),... mal durch die Gegend.
UA > Client > Server > Client

Wieso historisierst du nicht das UA Symbol direkt?



---------------------------------------
Ja, du kannst eine Server Extension mit C# schreiben:

Code behind ist Javascript und läuft im Client. Dort hast du beliebig eigene Events auslösen oder code bei anderen Events ausführen:


Du kannst auch (Server-)Symbole über die JS API überwachen:
Aber das hat alles nichts mit dem TrendLineChart zu tun.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hast du im "HMI Config window" unter "global events" einen Eintrag ergänzt und schreibst bei Änderung des UA Symbols die Werte in ein anderes Server Symbol um das dann über das TrendLineChart darzustellen?
Hi @zuse ,
ich habe mich vielleicht undeutlich ausgedrückt, sorry.

Konkret:
Ich bekomme zwei UA-Variablen. Einer der beiden wird als "Custom-global-event" verwendet. Dieses Event Löst eine Funktion aus. Dieser Funktion werden die beiden UA-Variablen übergeben. In der Funktion werden die beiden UA-Variablen subtrahiert.
Das Ergebnis der Berechnung wird in eine neue Servervariable geschrieben.
Diese neue Servervariable wird historisiert.
Nur so kann ich die subtrahierten Werte in einem TrendLineChart darstellen.

Ja, du kannst eine Server Extension mit C# schreiben:
Extensions
Ist es möglich in einer Server-Extension die UA- oder Servervariablen anzusprechen? Oder Vielleicht sogar die Daten der integrierten SQLite-Datenbank ?


Du kannst auch (Server-)Symbole über die JS API überwachen:
watch
Ich werde die watch-Funktion probieren und berichten, ob es bei mir geklappt. Sieht auf jeden Fall vielversprechend aus.

Viele Grüße
Stefan
 
Einer der beiden wird als "Custom-global-event" verwendet. Dieses Event Löst eine Funktion aus.
Was ist, wenn sich nur die andere Variable ändert? :)
Ich werde die watch-Funktion probieren und berichten, ob es bei mir geklappt. Sieht auf jeden Fall vielversprechend aus.
Löst dir dein "sind viele Requests" Problem nicht. Wird von der Systemlast genau gleich, da du genauso häufig Daten durch die Gegend sendest.
Ist das gleiche nur in einer anderen Programmiersprache implementiert.

Und das "kein client geladen" Problem hast du dann auch nicht gelöst.

Ist es möglich in einer Server-Extension die UA- oder Servervariablen anzusprechen?
Ja:

Oder Vielleicht sogar die Daten der integrierten SQLite-Datenbank ?
Die Variable deiner Extension würdest du einfach Historisieren. Zugriff auf die Datenbank brauchst du wohl nicht.
 
Hi @zuse ,

leider ist meine TwinCAT Software verbugged, sodass ich keine Serverextension per "Shell"- oder "VS19"-Entwicklungsumgebung einbinden kann.
Konnte das Problem hier bisher noch nicht beheben, dass ist aber ein anderes Thema.

Damit meine Daten auch in Abwesenheit eines Client erstmal berechnet werden, würde ich das mit dem Watch erstmal probieren.
Leider klappt es nicht, hier der Code:

1652274610713.png

Bekomme immer diesen Fehler:
1652274669563.png

Grüße
Stefan
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du hast aus dem Beispielcode vom codebehind die folgenden Zeilen rausgenommen.
Damit läuft dein Code zu früh, wo das System noch nicht geladen ist:

// If you want to unregister an event outside the event code you need to use the return value of the method register() let destroyOnInitialized = TcHmi.EventProvider.register('onInitialized', (e, data) => { // This event will be raised only once, so we can free resources. // It's best practice to use destroy function of the event object within the callback function to avoid conflicts. e.destroy(); // ---------------------- // Place your code here! // ---------------------- });
 
@zuse - Tatsächlich... hast Recht 😅,

also bleibt mir für mein Problem nur die Möglichkeit:

1.
eine "Custom-Extension" zu entwickeln oder

2.
die Werte vorher auf der SPS zu verrechnet und das Ergebnis dann als UA-Variable zu versenden?

Viele Grüße
Stefan
 
Zurück
Oben