# Webvisu Multiclient bei Framesteuerung



## Bunkerwilli (4 November 2020)

Hallo zusammen,

ich erarbeite mir aktuell für meinen PFC200 unter e!Cockpit eine Visuoberfläche und nutze die Webvisu.
Jetzt habe ich die Frameansteuerung für mich entdeckt, da diese sehr flexibel ermöglicht Bilder unter bestimmten Vorraussetzungen umzuschalten.
Ich habe mir genauer gesagt ein zweiteiliges Menu erstellt, bei dem ich zwischen Ort und Funktion wählen kann. Aus der Kombination der beiden Auswahlen lasse ich mir dann das entsprechende Bild in einem Frame anzeigen.
Die Logik für die Kombinationen mit der Zuordnung der passenden Bilder habe ich im PLC Programm abgebildet. Soweit funktioniert das auch alles wirklich gut. Nur leider habe ich nicht bedacht, dass ich durch diese "zentrale" Bildsteuerung im PLC Programm natürlich die Multiclientfähigkeit der Webvisu aufgebe.
Habe ich vorher über die Visufunktionen einen einfachen Bildwechsel über eine Schaltfläche ausgeführt, betraf dies nur diesen Client (z.B. Rechner 1) auf einem anderen Client konnte ich zeitgleich ein anderes Bild aufrufen (Rechner 2), Multiclient halt.
Wenn ich nun aber im PLC Programm entscheide welches Bild das Frame-Element darstellen soll, ändert sich das auf allen Clients, da ich ja streng genommen die ganze Zeit nur ein und das selbe Bild anzeige und nur den Inhalt des Frames ändere.

Muss ich diesen Kompromiss eingehen oder ist mein Ansatz falsch? Könnte ich die Logik in der Visu abbilden? Und wäre das dann wieder von jedem Client einzeln durchführbar?


Ich hoffe ich konnte meine Problematik verständlich darstellen. Ansonst liefere ich gern noch zusätzliche Erläuterungen nach und hoffe auf eure kompetenten Antworten.

Gruß Bunkerwilli


----------



## holgermaik (5 November 2020)

Man kann in der Visu auch ST Code ablegen oder für jeden Client etwas seperat berechnen.
Zeige doch mal was du wie und wo berechnest.


Holger


----------



## Bunkerwilli (5 November 2020)

Hallo Holger,

was genau brächtest du?
Nachfolgend mal die Logik, die aus den Vorwahlen des Menues den anzuzeigenden Frameindex schreibt.


```
//Funktion 1=Licht;    2=Rollos;    3=Heizung
//Geschoss 1=KG;    2=EG;        3=OG;        4=KG
IF        HMI.NAV_Funktion = 1 AND HMI.NAV_Geschoss = 1 THEN
            HMI.NAV_Frame:= 1; //Licht KG
ELSIF    HMI.NAV_Funktion = 1 AND HMI.NAV_Geschoss = 2 THEN
            HMI.NAV_Frame:= 2; //Licht EG
ELSIF    HMI.NAV_Funktion = 1 AND HMI.NAV_Geschoss = 3 THEN
            HMI.NAV_Frame:= 3; //Licht OG
ELSIF    HMI.NAV_Funktion = 1 AND HMI.NAV_Geschoss = 4 THEN
            HMI.NAV_Frame:= 4; //Licht DG
            
ELSIF    HMI.NAV_Funktion = 2 AND HMI.NAV_Geschoss = 1 THEN
            HMI.NAV_Frame:= 5; //Rollos KG
ELSIF    HMI.NAV_Funktion = 2 AND HMI.NAV_Geschoss = 2 THEN
            HMI.NAV_Frame:= 6; //Rollos EG
ELSIF    HMI.NAV_Funktion = 2 AND HMI.NAV_Geschoss = 3 THEN
            HMI.NAV_Frame:= 7; //Rollos OG
ELSIF    HMI.NAV_Funktion = 2 AND HMI.NAV_Geschoss = 4 THEN
            HMI.NAV_Frame:= 8; //Rollos DG
            
ELSIF    HMI.NAV_Funktion = 3 AND HMI.NAV_Geschoss = 1 THEN
            HMI.NAV_Frame:= 9; //Heizung KG
ELSIF    HMI.NAV_Funktion = 3 AND HMI.NAV_Geschoss = 2 THEN
            HMI.NAV_Frame:= 10; //Heizung EG
ELSIF    HMI.NAV_Funktion = 3 AND HMI.NAV_Geschoss = 3 THEN
            HMI.NAV_Frame:= 11; //Heizung OG
ELSIF    HMI.NAV_Funktion = 3 AND HMI.NAV_Geschoss = 4 THEN
            HMI.NAV_Frame:= 12; //Heizung DG
            
ELSE
            HMI.NAV_Frame:= 0;
END_IF;
```

Die Variablen HMI.NAV_Funktion und HMI.NAV_Geschoss werden über einen ST-Code bei Mouseclick auf den jeweiligen Button geschrieben. Zusätzlich wird eine boolsche Triggervariable gesetzt die den o. g. Code ausführt, also einen Bildwechsel. Die Variable HMI.NAV_Frame ist an das Frame-Element angebunden und steuert direkt den Index der referenzierten Visualisierungen.

Hilft das?

Bunkerwilli


----------



## ccore (5 November 2020)

Es gibt von Codesys ein Beispiel wie man mit Frames und mehreren Clients arbeiten kann. 

```
/// 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
```


----------

