TC3 WebVisu - Visualisierungsseite auf einzelnen Endgeräten umschalten

sbzt

Level-1
Beiträge
11
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich habe kürzlich in einem Projekt erstmals die TC3 PLC HMI Web eingesetzt, bei dem die Anforderung bestand, die Anlage von mobilen Endgeräten aus bedienen zu können. I.d.R. erfolgt die Visualisierung bei unseren Anlagen sonst über EATON Galileo.

Ich habe so weit alles in der WebVisu realisieren können, nur eine Sache fehlt: In der Galileo kann ich über entsprechende Control-Variablen der Endgeräte einen externen Seitenwechsel der Visualisierung auslösen. Nun bin ich auf der Suche nach einer Möglichkeit, das auch mit der Twincat Web-Visualisierung zu erreichen.

Man kann ja die die Variable "CurrentVisu" aktivieren und nutzen, damit werden aber alle aktiven Visualisierungen umgeschaltet, bringt mir also nichts für meine Anforderung. Ich müsste das spezifisch für einzelne Clients auslösen können.

Grundlegende Ansätze meinerseits, um der Lösung zumindest näher zu kommen:

- Beim Aufruf an die URL einen Clientnamen übergeben. Da heißt es im Handbuch ja sogar explizit "um sie [die Visualisierung] später in der Applikation gezielt ansprechen zu können.

- Endgeräte über die aufgerufene HTML-Seite unterscheiden. Endgerät 1 ruft z.B. "panel1.htm" auf, das zweite "panel2.htm" usw. Das ließe sich realisieren.

Seitenwechsel über Buttons auf der Visu selbst gestalten sich völlig problemlos. Hierzu verwende ich das OnClick-Event "Change Shown Visualization". Falls es sich nicht anderweitig lösen lässt, wäre meine letzte Idee noch, ob in der Visu-Instanz selbst im Hintergrund ein ST-Programm ablaufen kann, das z.B. den Status einer SPS-Variable prüft und in deren Abhängigkeit ggf. einen Seitenwechsel auslöst. Hier müssten dann auf Panel 1 und Panel 2 natürlich unterschiedliche Variablen überwacht werden. Das ist aber auch logisch - irgendeine Zuordnung zum Endgerät brauche ich ja.

Die Frage ist eben nur, wie es am Besten realisierbar ist. Ich habe einiges zum Thema gelesen, aber irgendwie führt das immer in eine Sackgasse.

Hier habe ich noch etwas gefunden - https://forge.codesys.com/forge/talk/Engineering/thread/db5c396ba4/#f1fe - hilft mir aber auch nicht wirklich weiter.

Ist mein Vorhaben überhaupt realisierbar? Hat jemand schon mal sowas umgesetzt?

Danke & Gruß
Stephan
 
Zuletzt bearbeitet:
Hallo
Ich kenne mich jetzt mit TC3 nicht aus aber es beruht ja auf Codesys 3.5
Eventuell funktioniert ja der Codesys Weg

Code:
PROGRAM Visu_Client_Auswertung
// Umschalten einer Visu
VAR
 // Clientauswertung für 11 Client
 // Um den aufrufenden Client feststellen zu können muss beim Aufruf der Webvisu bei jedem
 // Client ein eindeutiger Name übergen werden z.B. ClientPanel1
 // [URL]http://IP-Adresse/visu.htm?ClientName=ClientPanel1[/URL]
 // Der Aufruf des Programm erfolgt im Visu Task
 pClient:POINTER TO VisuElems.VisuElemBase.VisuStructClientData;
 _VisuFbClientTagDataHelper: VisuElems.VisuFbClientTagDataHelper;
 iVisuAnzahl :INT := 0;  // Anzahl der Client Webvisu
 strVisuName : ARRAY [0..10] OF STRING; // Name des aufrufenden Client
 iaktuelleVisu : ARRAY [0..10] OF INT; // Nummer der angezeigten Visu
 iDelay: INT; // Delay time counter
 iaktuelleVisuIndex:INT;
END_VAR

VisuElems.g_ClientManager.BeginIteration();
iVisuAnzahl := 0;   
iDelay := iDelay + 1;
pClient := VisuElems.VisuElemBase.g_ClientManager.GetNextClient(); // lese den 1. Client
WHILE pClient <> 0 AND iDelay MOD 10 = 0 DO // Delay time: nur alle 10 cycles
    IF pClient^.GlobalData.ClientType = VisuElems.VisuElemBase.Visu_ClientType.WebVisualization THEN  // Wenn Client eine WebVisu
  _VisuFbClientTagDataHelper(pClientData := pClient);      // Datenstruktur lesen
  iaktuelleVisuIndex :=  pClient^.GlobalData.VisuHistory._iCurrent;    // Index des Client feststellen
  iaktuelleVisu[iVisuAnzahl] := pClient^.GlobalData.VisuHistory._arrData[iaktuelleVisuIndex]; // aktuelle Nummer der angezeigten Visu lesen
  strVisuName[iVisuAnzahl] := _VisuFbClientTagDataHelper.stName;     // aktuellen Client Namen lesen
  // jetzt kann bei einem bestimmten Client und einer bestimmten Visu Seite eine Aktion ausgelöst werden
  IF  Bedingung THEN          // Bedingung erfüllt dann Bild umschalten
   VisuElems.VisuElemBase.g_VisuManager.SetMainVisu(pClient , 'Bildname');         // Client umschalten auf Bild mit Namen ".."
  END_IF
  iVisuAnzahl := iVisuAnzahl + 1;
 END_IF
 pClient := VisuElems.VisuElemBase.g_ClientManager.GetNextClient();      // Lese den nächsten Client
END_WHILE


// Umschalten einer Frame Visu  - Beispiel ist aus Codesys Store - Visualization Switching
/// Switch visualizations via program.
/// Important: This program must be called in the VISU_TASK
PROGRAM FrameSwitch
VAR
 pClient: POINTER TO VisuElems.VisuElemBase.VisuStructClientData; // Pointer to the client
 iDelay: INT; // Delay time counter
 mgr: VisuElems.VisuElemBase.IFrameManager;
 iClientIndex: INT; // current client index
 aClientIndices : ARRAY[0..8] OF INT := [0,0,0,0,0,0,0,0]; // Max 8 clients are supported
END_VAR

VisuElems.VisuElemBase.g_ClientManager.BeginIteration();
pClient := VisuElems.VisuElemBase.g_ClientManager.GetNextClient(); // Get the first client
iDelay := iDelay + 1;
iClientIndex := 0;
WHILE pClient <> 0 AND iDelay MOD 10 = 0 DO // Delay time: 10 cycles, 100 ms * 10 = 1 s
 mgr := VisuElems.VisuElemBase.g_VisuManager.GetFrameManager();  
 aClientIndices[iClientIndex] := (aClientIndices[iClientIndex] + 1) MOD 3;
 mgr.SwitchToVisu('Visualization.frameprog', pClient, aClientIndices[iClientIndex]); // Swtitch to visualization.
 pClient :=  VisuElems.VisuElemBase.g_ClientManager.GetNextClient();
 iClientIndex := iClientIndex + 1;
END_WHILE
Holger
 
Zurück
Oben