Es geht - aber nicht so einfach wie du es dir vorstellst. Die
CoDeSys Oberfläche ermöglicht dir ja z.B. verschiedene unabängige Visu-Anzeigen und somit verschiedene Benutzer...
Ich habe von anno-muff für TwinCAT (ist bestimmt 3-4 Jahre her) einen Codeschnipsel. Müsste hier eigentlich passen - aber ob sich etwas wie/wo geändert hat kann ich nicht sagen.
=====
Visu-Variablen im Manager aktivieren
Current User : VisuElemsWinControls.CurrentFullUserName
CurrentUserGroupName VisuElems.CurrentUserGroupName
currentUserGroup: VisuElems.CurrentUserGroupId
CurrentUserName: VisuElems.CurrentUserName
CurrentfullUserName: VisuElems.CurrentFullUserName
AutoLogOff: VisuElems.CurrentUseAutoLogoutTime
Remaining Time: VisuElems.CurrentRemainingAutoLogoutTime
Über Benutzerverwaltung
-Anmelden
-Abmelden
-Passwort ändern
-Benutzerverwaltung öffnen
===== Benutzer in der PLC auslesen ====
bStart: BOOL;
udiNum: UDINT;
fbVisuUserMgr: VisuUserManagement.VisuUserMgmt;
pArr: POINTER TO ARRAY[0..0] OF VisuUserManagement.VUM_User;
users : ARRAY[0..4] OF VisuUserManagement.VUM_User; //user
.wstUserName ; wString(79);
GetUserCount: INT;
dwUserDb: DWORD;
GetUserDBAsCopy: INT;
i: UDINT;
j: UDINT;
GetUsers: INT;
fbVisuLoginProvierder :VisuUserManagement.VisuLoginProvider;
IF(bStart) THEN
bStart := FALSE;
dwUserDb:=fbVisuUserMgr.GetUserDBAsCopy();
udiNum:= fbVisuUserMgr.GetUserCount(dwUserDB:=dwUserDb);
FOR i:= 0 TO udiNum-1 DO
j:=i; // Bausteinaufruf .GetUsers() überschreibt den Index. Keine Ahnung warum.
// alle 5 Parameter sind als INOUT definiert.
fbVisuUserMgr.GetUsers(
dwUserDB:= 0, // für was ist dieser Parameter überhaupt.
udiStartIndex:= j,
udiEndIndex:= j , // Wert wird auf 0 zurückgesetzt.
pArr:= ADR(users[j]),
udiArrSize:= SIZEOF(Users[j])) ;;
END_FOR
END_IF
=== Login per PLC (TC3_PLCHMI_UserManagement_LoginfromPLC)
// durch die Clients durchiterieren
// Login prüfen
// dann login, UserGroupID muss entsprechend config (siehe graphisches Element) gewählt werden.
pClient: POINTER TO VisuElems.VisuStructClientData;
sUsername: STRING:
sPassword: STRING;
wsUsername: WSTRING;
wsPassword: WSTRING;
ReturnVal : VisuUserManagement.VUM_ReturnValues;
sReturnVal : STRING:='';
VisuElems.g_ClientManager.BeginIteration();
pClient := VisuElems.g_ClientManager.GetNextClient();
WHILE pClient <> VisuElems.NULL DO // wenn die TargetVisu nicht läuft ist pClient = Null. Dann kommt es bei den nachfolgenden Aufrufen zu Exceptions.
IF (pClient^.GlobalData.CurrentUserGroupId <> 1) THEN
wsUsername:=STRING_TO_WSTRING(sUsername);
wsPassword:=STRING_TO_WSTRING(sPassword);
ReturnVal:=VisuUserManagement.g_VisuUserMgmt2.CheckLogin(wsUsername, wsPassword);
IF ReturnVal = 0 THEN
sReturnVal :='Password correct';
VisuUserManagement.g_VisuUserMgmt2.LoginToUserGroup(pClient, 1, wsUsername, "");
END_IF
IF ReturnVal = 20486 THEN
sReturnVal :='Wrong Password';
END_IF
END_IF
pClient := VisuElems.g_ClientManager.GetNextClient();
END_WHILE
======LOGOUT per PLC, analog Login===
sReturnVal:='';
VisuElems.g_ClientManager.BeginIteration();
pClient := VisuElems.g_ClientManager.GetNextClient();
WHILE pClient <> VisuElems.NULL DO
VisuUserManagement.g_VisuUserMgmt2.LoginToUserGroup(pClient, 0, "", "");
pClient := VisuElems.g_ClientManager.GetNextClient();
END_WHILE
=== Logon mit Drop-Box für die Benutzer (somit nur Passwort-Eingabe)===
war damals noch nicht möglich.