В CODESYS Store есть пример подписки на изменение переменных с визуализации (ссылка) к сожалению он актуален только для 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. Пароль соответствует имени)
Сообщение от
andrey96
в тот же Alarm manager, например авария N1, текущий пользователь : user1. Возможно ли такое вообще на CDS?
AlarmManager не совсем подходит для этой цели т.к. нет возможности на лету менять описание события.