CODESYS - das IEC 61131-3 Programmiersystem

Willkommen im offiziellen CODESYS - Forum von 3S-Smart Software Solutions | A member of the CODESYS Group
Deutsche Version English version russian version 
Aktuelle Zeit: Do Jul 18, 2019 5:39 pm

Alle Zeiten sind UTC




Ein neues Thema erstellen  Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1 2 Nächste
Autor Nachricht
BeitragVerfasst: Mi Apr 17, 2019 9:22 am 
Offline

Registriert: Do Aug 04, 2016 3:21 pm
Beiträge: 37
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?


Dateianhänge:
CurrentClient_GlobalClient1.JPG
CurrentClient_GlobalClient1.JPG [ 109.07 KiB | 680 mal betrachtet ]
CurrentClient_GlobalClient2.JPG
CurrentClient_GlobalClient2.JPG [ 38.84 KiB | 680 mal betrachtet ]
CurrentClient_GlobalClient3.JPG
CurrentClient_GlobalClient3.JPG [ 23.72 KiB | 680 mal betrachtet ]
Nach oben
   
BeitragVerfasst: Mi Apr 24, 2019 8:29 am 
Offline

Registriert: Do Aug 30, 2018 7:40 am
Beiträge: 94
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


Nach oben
   
BeitragVerfasst: Mi Apr 24, 2019 7:20 pm 
Offline

Registriert: Do Aug 04, 2016 3:21 pm
Beiträge: 37
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:
Code:
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!


Nach oben
   
BeitragVerfasst: Fr Apr 26, 2019 8:23 am 
Offline

Registriert: Do Aug 30, 2018 7:40 am
Beiträge: 94
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


Dateianhänge:
Visu Util Iterate.project [177.7 KiB]
31-mal heruntergeladen
Nach oben
   
BeitragVerfasst: Mo Mai 06, 2019 10:02 am 
Offline

Registriert: Do Aug 04, 2016 3:21 pm
Beiträge: 37
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


Nach oben
   
BeitragVerfasst: Di Mai 07, 2019 7:40 am 
Offline

Registriert: Do Aug 30, 2018 7:40 am
Beiträge: 94
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


Nach oben
   
BeitragVerfasst: Mi Mai 08, 2019 8:41 am 
Offline

Registriert: Mo Aug 14, 2017 8:33 am
Beiträge: 32
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


Nach oben
   
BeitragVerfasst: Mi Mai 08, 2019 9:10 am 
Offline

Registriert: Do Aug 30, 2018 7:40 am
Beiträge: 94
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


Nach oben
   
BeitragVerfasst: Mi Mai 08, 2019 1:20 pm 
Offline

Registriert: Mo Aug 14, 2017 8:33 am
Beiträge: 32
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


Dateianhänge:
Visu Util Iterate.project_V01.project [217.34 KiB]
22-mal heruntergeladen
Nach oben
   
BeitragVerfasst: Mi Mai 08, 2019 9:19 pm 
Offline

Registriert: Do Aug 04, 2016 3:21 pm
Beiträge: 37
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.


Dateianhänge:
Visu Util Iterate_V2.project [202.47 KiB]
23-mal heruntergeladen
Nach oben
   
BeitragVerfasst: Do Mai 09, 2019 11:30 am 
Offline

Registriert: Mo Aug 14, 2017 8:33 am
Beiträge: 32
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


Nach oben
   
BeitragVerfasst: Fr Mai 10, 2019 6:47 am 
Offline

Registriert: Do Aug 30, 2018 7:40 am
Beiträge: 94
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


Dateianhänge:
Visu Util Iterate_V3.project [192.23 KiB]
25-mal heruntergeladen
Nach oben
   
BeitragVerfasst: Mi Mai 15, 2019 1:32 pm 
Offline

Registriert: Mo Aug 14, 2017 8:33 am
Beiträge: 32
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


Nach oben
   
BeitragVerfasst: Mi Mai 22, 2019 6:38 am 
Offline

Registriert: Do Aug 30, 2018 7:40 am
Beiträge: 94
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


Nach oben
   
BeitragVerfasst: Mi Mai 22, 2019 8:52 am 
Offline

Registriert: Mo Aug 14, 2017 8:33 am
Beiträge: 32
Hi Marcel,

Ich hab jetzt mal ein wenig rum probiert und folgendes scheint zu funktionieren (Hab hier nen FB geschrieben):
Deklaration:
Code:
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:
Code:
// 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


Nach oben
   
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen  Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1 2 Nächste

Alle Zeiten sind UTC


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.
Sie dürfen keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Deutsche Übersetzung durch phpBB.de