PDA

Просмотр полной версии : Активный пользователь в системе



andrey96
15.05.2018, 15:50
Всем привет, пытаюсь реализовать в проекте разграничение прав доступа между пользователями, с этим проблем нет, но мне необходимо еще отслеживать действия активного пользователя в системе. Например , пользователь залогинился, нажал кнопку, произошло какое либо действие , как это отследить и вывести в список аварии например в тот же Alarm manager, например авария N1, текущий пользователь : user1. Возможно ли такое вообще на CDS?

Осинский Алексей
16.05.2018, 09:28
В CODESYS Store есть пример подписки на изменение переменных с визуализации (ссылка (https://store.codesys.com/visu-value-change-handler-example.html?___store=en)) к сожалению он актуален только для CODESYS 3.5 SP9 и выше.
Т.е. на СПК не заработает.

Но, если у Вас изменение переменных подтверждается нажатием на кнопку (а-ля "Применить"), то можно использовать следующий подход:

В визуализации есть неявная переменная
pClientData типа VisuElems.VisuStructClientData, которая содержит информацию о текущем клиенте, визуализации и т.д.

Пишем функцию, которая будет добавлять сообщения о событиях в лог. Добавляя к описанию события имя текущего пользователя


FUNCTION LogVisuEvent : BOOL
VAR_INPUT
// Данные о текущем клиенте визуализации
pClient : POINTER TO VisuElems.VisuStructClientData;
// Описание события
wsEventDescription : WSTRING;
END_VAR
VAR
_c_wsNoClient : WSTRING := "Пользователь не указан";
_c_wsClientNamePrefix : WSTRING := "Пользователь: ";
_c_wsEventPrefix : WSTRING := ". Cобытие: ";
END_VAR
VAR
_wsEventWithClient : WSTRING;
_wsCurrentUserName : WSTRING;
END_VAR


Наполнение функции может быть примерно таким:


_wsCurrentUserName := "";
IF pClient <> 0 THEN
_wsCurrentUserName := pClient^.GlobalData.CurrentUserName;
END_IF

// Добавляю имя клиента к сообщению
IF _wsCurrentUserName = "" THEN
_wsEventWithClient := WCONCAT (_c_wsNoClient, _c_wsEventPrefix);
_wsEventWithClient := WCONCAT (_wsEventWithClient, wsEventDescription);
ELSE
_wsEventWithClient := WCONCAT (_c_wsClientNamePrefix, _wsCurrentUserName);
_wsEventWithClient := WCONCAT (_wsEventWithClient, _c_wsEventPrefix);
_wsEventWithClient := WCONCAT (_wsEventWithClient, wsEventDescription);
END_IF

// Добавляю сообщение на 1ю позицию лога
ShiftVisuEventLog();
g_awsVisuEventLog[0] := _wsEventWithClient;


Идем к кнопке, которая сохраняет настройки, и пишем в обработчике события OnMouseDown


LogVisuEvent (pClientData, "Какое-то событие");


Все, что осталось сделать - сформировать описание события (что было изменено).


В приложении к сообщению архив проекта с описанной функцией.
(Добавил 3 пользователя с именами 1, 2, 3. Пароль соответствует имени)



в тот же Alarm manager, например авария N1, текущий пользователь : user1. Возможно ли такое вообще на CDS?

AlarmManager не совсем подходит для этой цели т.к. нет возможности на лету менять описание события.

andrey96
16.05.2018, 23:15
Спасибо большое) буду пробовать!