Unterschied GlobalClientID vs. CurrentClientID vs. GetClientID

dkugler
2019-04-17
2019-07-16
  • dkugler - 2019-04-17

    Originally created by: D. Kugler

    Entweder versteh ich das System nicht oder es ist ein Bug, aktuell arbeite ich mit SP13P3 ist aber in den früheren SP's auch schon so:
    TargetVisu aktiv, 2x Webvisu aktiv, drücke ich im Browser von Webvisu1 1x F5 für aktualisieren, dann passiert folgendes:
    Die WebVisu zeigt mir jetzt die CurrentClientID von 3 an(bisher CurrentClientID 1).
    Gehe ich die Clients im IEC-Code per GetNextClient durch meldet mir die Funktion
    VU.VisuElemBase.Visu_Globals.g_ClientManager.GetClientId(pClient:= pClientData) weiterhin eine ClientID 1 zurück
    eine Zeile später ohne GetNextClient auszuführen bekomme ich über aiGlobalClientId[iIndex]:=pClientData^.GlobalData.GlobalClientID;
    die GlobaleClientID von 3 angezeigt. Für mich sieht es so aus, wie wenn die Funktion GetClient da noch eine veraltete ClientID zurück gibt?

    IMG: CurrentClient_GlobalClient1.JPG

    IMG: CurrentClient_GlobalClient2.JPG

    IMG: CurrentClient_GlobalClient3.JPG

     
  • m.prestel - 2019-04-24

    Hallo,

    hier ein paar erklärende Sachen.
    - GlobalClientID = interne ID für den Client
    - CurrentClientID = wird für den spezifischen Client immer auf dessen GlobalClientID aktualisiert. Keine Garantie, was passiert, was in dem Wert steht, wenn nicht aus der Visu darauf zugegeriffen wird
    - GetClientID = Anderer Wertebereich (hat nichts mit der GlobalClientID zu tun)

    Für das Iterieren über Clients gibt es in den Visu Utils ein paar nütliche FBs, siehe hierzu https://help.codesys.com/webapp/t6Wggu4 ... n=3.5.12.0
    Das ist das empfohlene Vorgehen.

    LG
    Marcel

     
  • dkugler - 2019-04-24

    Originally created by: D. Kugler

    Vielen Dank für die Erklärung!
    Habe mich an dem FB und auch den Methoden versucht, leider ohne Erfolg. Der FB meldet mir immer den Error NO_ITERATION_CALLBACK.
    Mein Code sieht folgendermaßen au, das Programm VisuPrg rufe ich im Visutask auf:

    PROGRAM VisuPrg
    VAR
       fbVisuIt : VU.FbIterateClients;
       instItCallback : VU.IVisualizationClientIteration;
       iVisuClient : VU.IVisualizationClient;
       xItStart : BOOL;
    END_VAR
    fbVisuIt(itfClientFilter:= VU.Globals.AllClients, xExecute:= xItStart, itfIterationCallback:=instItCallback);
    //instItCallback.EndIteration();
    //instItCallback.HandleClient(iVisuClient);
    //instItCallback.StartIteration();
    

    Wie ist die richtige Vorgehensweise, bzw. wo mache ich Fehler. Was kann ich mir unter dem IterationCallback vorstellen?
    Muss man die Iteration auch erst stoppen und nach der schrittweisen Iteration wieder stsrten, wie bisher beim g_ClientManager?
    Wäre genial, wenn ich da nochmal Informationen bekommen könnte!

     
  • m.prestel - 2019-04-26

    Hallo,

    VisuUtils hat den Vorteil, dass diese nicht aus der VisuTask ausgerufen werden muss!

    Aktuell sehe ich auch keine Implementierung für instItCallback : VU.IVisualizationClientIteration;

    Anbei ein kleines Beispiel!

    LG
    Marcel

    Visu Util Iterate.project [177.7 KiB]

     
  • dkugler - 2019-05-06

    Originally created by: D. Kugler

    Vielen Dank für das Beispiel, Marcel! Muss ich mir in Ruhe anschauen. Warum ich mich überhaupt mit der Iteration rumschlage:
    ich habe die TargetVisu und eine Webvisu mit fester IP Adresse die ich synchronisieren muss(Hauptpanel und RemotePanel an einer Anlage), die restlichen Webvisu's(Fernzugriff,ProgrammingSystem..) sollen unabhängig von der TargetVisu bedienbar sein und diese nicht beeinflussen. Somit kann ich nicht die CurrentVisuVariablen aktivieren, benötige sozusagen eine "selektive CurrentVisuVariable". Hättest Du mir da einen Tipp/Vorgehensweise, wie ich das sauber umsetzen kann? Aktuell habe ich für jeden der beiden Clients eine Struktur angelegt, ermittle und speichere die aktuellen Visu's/Frames und überwache diese auf Änderung. Erfolgt in einem der beiden Client eine Änderung, löse ich den Wechsel beim anderen Client über IEC-Code aus, incl. Login in die entsprechende UserGroup usw. Vielleicht geht das ja viel einfacher.
    VG. David

     
  • m.prestel - 2019-05-07

    Hallo David,

    die aktuell aktive Visu für jeden Client findet sich auch im Interface IVisualizationClient im Feld CurrentVisuName.

    Ebenso kann das Iterieren auch zum spezifischen Wechseln von Visu-Seiten verwendet werden, siehe https://help.codesys.com/webapp/t6Wggu4 ... =VisuUtils .

    LG
    Marcel

     
  • Chris.O - 2019-05-08

    Hallo,

    ich hoffe ich darf mich hier mal einklinken...
    Ich würde gerne die aktuelle ClientID, ClientType, UserName sowie die IP-Adresse des Clients auslesen.

    Ich hab mir das Beispiel angesehen und bin auf ein paar Problemchen gestoßen.

    1. Wenn ich das Beispiel nehme und eine Visualisierung öffne, funktioniert das wunderbar. So bald ich eine zweite Visu öffne (also mehrere Clients habe) und die entsprechend andere Visualisierungsseite aufrufe, klappt das nicht mehr.

    2. Wenn ich in der GVL noch z.B: iClientID und wsUserName hinzufüge und in der Methode "HandleClient" entsprechend das Interface "itfClient.ClientID" und "UserName" darauf zu weiße, bekomme ich bei der ID nur -1 und bei UserName "" raus (hab einen Benutzer angelegt und angemeldet).
      EDIT: Berichtigung... der User wird richtig ausgegeben... die ID nur leider mit -1

    Ich bräuchte insgesamt eine Übersicht, bei der mir Alle aktiven Clients mit ID, IP-Adresse, VisuType und aktuell angemeldeter Benutzer angezeigt wird. Wie könnte ich das hin bekommen? Ich bräuchte irgendwie ein Array, in das mir die Daten der einzelnen Clients geschoben werden.

    Wie läuft das jetzt allgemein mit der Iteration...Bei Execute TRUE startet er die Iteration und bei Execute auf FALSE stoppt sie? Ich komm mit der Doku nicht so ganz klar...
    In deinem Beispiel hast du das über den Taster gemacht...wird dann pro Client eine neue Flanke benötigt?

    Wäre schön wenn du mir hier noch Hilfestellung geben könntest.

    Gruß Chris

     
  • m.prestel - 2019-05-08

    Hallo Chris,

    das Beispiel hatte nicht den Anspruch alle Werte auszulesen. Es sollte bloß kurz erläutern, wie das mit den VisuUtils funktioniert.

    Wir verwenden für die VisuUtils auch nur das Common Behaviour Model (https://help.codesys.com/webapp/behavio ... DevSummary) genauer gesagt CBML.ETrig

    Wenn ich dazu komme, mach ich ein kleines Bespiel zum Auslesen aller Daten.

    LG
    Marcel

     
  • Chris.O - 2019-05-08

    Hallo Marcel,

    ok hatte nur gedacht vielleicht hast du ein Beispiel parat.

    Ich hab da selbst mal was erstellt... bin jetzt doch von allein etwas weiter gekommen...
    Das würde für mich auch soweit reichen. Bin mir aber nicht sicher ob das generell so gedacht ist.
    Bin mir nur nicht sicher, ob ich alle "bösen Fehler", die auftreten können abgefangen habe...vielleicht kannst dus dir mal bei Gelegenheit ansehen.

    Gruß Chris

    Visu Util Iterate.project_V01.project [217.34 KiB]

     
  • dkugler - 2019-05-08

    Originally created by: D. Kugler

    Danke Chris für das Erweitern des Beispiels, das ist doch schon mal ein guter Anfang. Ich habe noch den ClientType ermittelt und in der Tabelle ergänzt, da das in meinem Fall eine Rolle spielt.

    Visu Util Iterate_V2.project [202.47 KiB]

     
  • Chris.O - 2019-05-09

    Hi,

    eine Frage hätte ich noch an Marcel...
    Ich habe das Projekt bei mir getestet und es hat funktioniert...Ich gebe das Projekt weiter und beim Kollegen wird immer ClientID = -1 ausgelesen.
    An was könnte das liegen?

    Edit: Hab festgestellt, dass es das Problem nicht gibt, wenn ich einmal z.B. ein Rechteck mit Textvariable "CURRENTCLIENTID" verwendet habe

    Gruß Chris

     
  • m.prestel - 2019-05-10

    Hallo ihr beiden,

    erst mal vielen Dank fürs Teilen der Projekte!

    Ich habe direkt noch eine Tabelle verwendet

    Bezüglich deiner Frage: Nein, dass sagt mir nichts. Wenn du es nachstellen kannst, schau ich es mir gerne an!

    LG
    Marcel

    Visu Util Iterate_V3.project [192.23 KiB]

     
  • Chris.O - 2019-05-15

    Hi,

    naja das war jetzt eigentlich immer so, wenn ich das Projekt neu aufgemacht habe und nirgends "CURRENDUSERID" verwendet habe.
    So bald das mal drin war, klappts...

    Ich hätte da noch eine andere Frage:
    Ich habe mir mit "VisuElems.CurrentRemainingAutoLogoutTime" in der Visualisierung die noch verbleibende Zeit bis zum automatischen Ausloggen anzeigen lassen.
    Ebenso habe ich mir mit Hilfe unserer Client-Iteration eine Routine geschrieben, die sich merkt, sobald ein User bei einem Client eingeloggt ist.
    So kann ich sehen, ob auf irgend einem Client ein bestimmter User eingeloggt ist.
    Ich möchte jetzt als Administrator die Möglichkeit haben einen ...nennen wir es "maintenance-mode" einzuschalten. Dieser soll, wenn auf irgend einem Client ein Administrator ist, von diesem aktiviert werden können. Anschließend wird das automatische Ausloggen abgeschaltet, bis der "maintenance-mode" wieder deaktiviert wird.

    Nun bräuchte ich noch eine Möglichkeit entweder das automatische Ausloggen vom Code aus im laufenden Betrieb zu deaktivieren und aktivieren, oder die verbleibende Zeit immer wieder zu überschreiben.

    Es scheint auch einen Baustein zu geben, der das kann... nur leider ist die Doku dazu sehr spärlich...
    "VisuUserManagement.VisuUserMgmt" und hier die Property "CurrentUserLockoutTime"
    Da müsste man doch "get" und "set" machen können oder nicht? Wie kann man das verwenden?

    Wäre dankbar über Vorschläge

    Gruß Chris

     
  • m.prestel - 2019-05-22

    Hallo Chris,

    dafür gibt es aktuell nicht wirklich was.
    Mal abgesehen davon, dass es sicherheitstechnisch Probleme machen könnte wenn man sich als Admin vergisst auszuloggen (voller Zugriff & keine Auto-Logout).

    Ich hab jedoch ein Improvement dafür eingetragen!

    LG
    Marcel

     
  • Chris.O - 2019-05-22

    Hi Marcel,

    Ich hab jetzt mal ein wenig rum probiert und folgendes scheint zu funktionieren (Hab hier nen FB geschrieben):
    Deklaration:

    FUNCTION_BLOCK MaintenanceMode_31
    VAR_IN_OUT
       xActivateMaintenanceMode:BOOL; //IF TRUE then Maintenance-Mode is active
    END_VAR
    VAR_INPUT
       xAdminActive:BOOL;         //If TRUE then min. one admin is active
       iNumberOfActiveAdmins:INT;   //Here the number of active Admins must be given
    END_VAR
    VAR_OUTPUT
    END_VAR
    VAR
       pClient:POINTER TO VisuElems.VisuStructClientData;
       _VisuFbClientTagDataHelper                    : VisuElems.VisuFbClientTagDataHelper;
       asClientName:ARRAY [0..50] OF WSTRING;
       aiClientID:ARRAY [0..50] OF INT;
       _apVisuStructClientData : ARRAY[0..50] OF POINTER TO VisuElems.VisuStructClientData;
       xSetDone: BOOL;
       iNumberOfActiveAdmins_old: INT;
    END_VAR
    

    Programmteil:

    // Iterate over all currently active visualization clients
    VisuElems.g_ClientManager.BeginIteration();
    WHILE (pClient := VisuElems.g_ClientManager.GetNextClient()) <> 0 DO //if min. one client is logged in
       aiClientID[pClient^.GlobalData.GlobalClientID]:=pClient^.GlobalData.GlobalClientID; //read Client ID
       _apVisuStructClientData[pClient^.GlobalData.GlobalClientID] := pClient; //store all client infos in an array
       asClientName[pClient^.GlobalData.GlobalClientID]:=pClient^.GlobalData.CurrentUserName; //store CurrentUserName in array
          
       IF asClientName[pClient^.GlobalData.GlobalClientID] = "Admin" AND xActivateMaintenanceMode AND NOT xSetDone THEN //If Maintenance-Mode TRUE and one Admin is logged in 
          pClient^.GlobalData.UseAutoLogoutTime:=FALSE;
          xSetDone:=TRUE;
       END_IF
       
       IF asClientName[pClient^.GlobalData.GlobalClientID] = "Admin" AND NOT xActivateMaintenanceMode AND xSetDone THEN //If no Maintenance Mode then AutoLogout active
          pClient^.GlobalData.UseAutoLogoutTime:=TRUE;
          xSetDone:=FALSE;
       END_IF
       
       //check if no admin is active
       IF NOT xAdminActive THEN
          xSetDone:=FALSE;
       END_IF
       
       //check if one admin logs out
       IF iNumberOfActiveAdmins < iNumberOfActiveAdmins_old THEN
          xSetDone:=FALSE;
       END_IF
       
    END_WHILE
    //Maintenance mode deactivate if no admin is logged in
    IF iNumberOfActiveAdmins <=0 THEN
       xActivateMaintenanceMode:=FALSE;
    END_IF
    iNumberOfActiveAdmins_old:=iNumberOfActiveAdmins;
    

    Im Vorlauf habe ich auch einen Baustein geschrieben, der mir ausließt wie viele Admins gerade eingeloggt sind. Diesen verschalte ich auf die hier verwendeten Inputs.

    Bis jetzt funktioniert das ganz gut... Ich hoffe da kann im Hintergrund nichts böses passieren?

    Gruß Chris

     
  • m.prestel - 2019-05-22

    Hallo Chris,

    von mir wird es keine Garantie geben, dass beim Zugriff auf interne Daten nichts schief geht
    Und auch keine Aussage, dass das für immer so gehen wird.

    LG
    Marcel

     
  • dkugler - 2019-05-22

    Originally created by: D. Kugler

    @Marcel: wird es in absehbarer Zeit eine Schulung geben, wo man einen Ãœberblick/Einblick in den Aufbau und die Arbeitsweise der Visu bekommt?
    Wo kann man Ideen/Wünsche für neue VisuElemente einreichen?

     
  • m.prestel - 2019-05-23

    @D.Kugler

    Zitat:
    wird es in absehbarer Zeit eine Schulung geben, wo man einen Ãœberblick/Einblick in den Aufbau und die Arbeitsweise der Visu bekommt?

    Dazu kann ich leider überhaupt nichts sagen, das liegt im Bereich des Produktmanagement...

    Zitat:
    Wo kann man Ideen/Wünsche für neue VisuElemente einreichen?

    Das einfachste wird sein über mich... Sonst könnte man wahrscheinlich über den Store auch eine Anfrage schicken.

    LG
    Marcel

     
  • Chris.O - 2019-07-16

    Hallo,

    ich hätte mal noch eine Frage zu dem Thema.
    Warum ist es denn nicht bei allen Clients möglich eine IP-Adresse zu erhalten? Z.B. mit "ProgrammingSystem" ist es nicht möglich eine IP zu bekommen.
    Ebenso wenn ich als Client den MicroBrowser von IniNet nutze. Er zeigt mir als VisuType WebVisualization an, jedoch kann er keine IP ermitteln.
    Mit einem normalen Browser bekomm ich die IP aber.

    Gruß Chris

     
  • m.prestel - 2019-07-16

    Hallo Chris,

    Bezüglich dem ProgrammingSystem: Das ist aktuell nicht unterstützt, da es viele Wege gibt sich mit der Steuerung zu verbinden.

    Bezüglich dem MicroBrowser: Bitte wende dich direkt an IniNet.

    LG
    Marcel

     

Log in to post a comment.