//Рабочий скрипт контроля двух OPC UA и переключения клиентов серверов
const
TIMEOUT = 10;
RECREATE_INTERVAL = 60;
begin
// ===== ПЛК А =====
vrLinkTimer.Value := vrLinkTimer.AsInt64 + 1;
if (vrLost.AsBool = FALSE) and (vrLinkTimer.AsInt64 >= TIMEOUT) then
begin
vrLost.Value := True;
AddMessage(Now, mkMessage, 'Потеряна связь с OPC UA сервером ПЛК А', TRUE, FALSE);
UAServer1.RecreateSubscriptions;
AddMessage(Now, mkMessage, 'Выполняется автоматическое пересоздание подписок OPC UA сервера ПЛК А.', True, False);
vrRecreateTimer.Value := 0;
end;
if (vrLost.AsBool = True) then
begin
vrRecreateTimer.Value := vrRecreateTimer.AsInt64 + 1;
if vrRecreateTimer.AsInt64 >= RECREATE_INTERVAL then
begin
UAServer1.RecreateSubscriptions;
AddMessage(Now, mkMessage, 'Повторное пересоздание подписок OPC UA сервера ПЛК А (каждую 1 мин).', True, False);
vrRecreateTimer.Value := 0;
end;
end;
if (vrLost.AsBool = True) and (vrLinkTimer.AsInt64 < TIMEOUT) then
begin
vrLost.Value := False;
AddMessage(Now, mkMessage, 'Cвязь с OPC UA сервером ПЛК А восстановлена', TRUE, FALSE);
vrRecreateTimer.Value := 0;
end;
// ===== ПЛК Б =====
vrLinkTimer_B.Value := vrLinkTimer_B.AsInt64 + 1;
if (vrLost_B.AsBool = FALSE) and (vrLinkTimer_B.AsInt64 >= TIMEOUT) then
begin
vrLost_B.Value := True;
AddMessage(Now, mkMessage, 'Потеряна связь с OPC UA сервером ПЛК Б', TRUE, FALSE);
UAServer2.RecreateSubscriptions; // проверьте реальное имя объекта
AddMessage(Now, mkMessage, 'Выполняется автоматическое пересоздание подписок OPC UA сервера ПЛК Б.', True, False);
vrRecreateTimer_B.Value := 0;
end;
if (vrLost_B.AsBool = True) then
begin
vrRecreateTimer_B.Value := vrRecreateTimer_B.AsInt64 + 1;
if vrRecreateTimer_B.AsInt64 >= RECREATE_INTERVAL then
begin
UAServer2.RecreateSubscriptions;
AddMessage(Now, mkMessage, 'Повторное пересоздание подписок OPC UA сервера ПЛК Б (каждую 1 мин).', True, False);
vrRecreateTimer_B.Value := 0;
end;
end;
if (vrLost_B.AsBool = True) and (vrLinkTimer_B.AsInt64 < TIMEOUT) then
begin
vrLost_B.Value := False;
AddMessage(Now, mkMessage, 'Cвязь с OPC UA сервером ПЛК Б восстановлена', TRUE, FALSE);
vrRecreateTimer_B.Value := 0;
end;
// ===== Автопереключение серверов =====
//Кнопка автоматического переключения vrAutoFailoverEnabled !!
if vrAutoFailoverEnabled.AsBool and IsMasterServer and vrLost.AsBool and (not vrLost_B.AsBool) and (not vrFailoverActive.AsBool) then
begin
Switch_to_Slave(nil);
vrFailoverActive.Value := True;
AddMessage(Now, mkAlarm, 'Автопереход на резервный сервер: потеряна связь с ПЛК А', True, False);
end;
if vrAutoFailoverEnabled.AsBool and IsMasterServer and vrFailoverActive.AsBool and (not vrLost.AsBool) then
begin
Switch_to_Master(nil);
vrFailoverActive.Value := False;
AddMessage(Now, mkMessage, 'Автовозврат на основной сервер: связь с ПЛК А восстановлена', True, False);
end;
end.
(*
//Рабочий скрипт для одного сервера OPC UA. Функционал попытки переподключения через 1 минуту. Без переключения клиентов между серверами .
const
TIMEOUT = 10;
RECREATE_INTERVAL = 60;
begin
vrLinkTimer.Value := vrLinkTimer.AsInt64 + 1;
if (vrLost.AsBool = FALSE) and (vrLinkTimer.AsInt64 >= TIMEOUT) then
begin
vrLost.Value := True;
AddMessage(Now, mkMessage, 'Потеряна связь с OPC UA сервером', TRUE, FALSE);
UAServer1.RecreateSubscriptions;
AddMessage(Now, mkMessage, 'Выполняется автоматическое пересоздание подписок OPC UA сервера.', True, False);
vrRecreateTimer.Value := 0;
end;
if (vrLost.AsBool = True) then
begin
vrRecreateTimer.Value := vrRecreateTimer.AsInt64 + 1;
if vrRecreateTimer.AsInt64 >= RECREATE_INTERVAL then
begin
UAServer1.RecreateSubscriptions;
AddMessage(Now, mkMessage, 'Повторное пересоздание подписок OPC UA сервера (каждую 1 мин).', True, False);
vrRecreateTimer.Value := 0;
end;
end;
if (vrLost.AsBool = True) and (vrLinkTimer.AsInt64 < TIMEOUT) then
begin
vrLost.Value := False;
AddMessage(Now, mkMessage, 'Cвязь с OPC UA сервером восстановлена', TRUE, FALSE);
vrRecreateTimer.Value := 0;
end;
end.
*)
(*
//Рабочий скрипт попытки пересоздания подписок. Без повторных попыток
begin
vrLinkTimer.Value := vrLinkTimer.AsInt64 + 1;
// проверка на отсутствие связи
if (vrLost.AsBool = FALSE) and (vrLinkTimer.AsInt64 >= TIMEOUT) then
begin
vrLost.Value := True;
AddMessage(Now, mkMessage, 'Потеряна связь с OPC UA сервером', TRUE, FALSE);
UAServer1.RecreateSubscriptions; //Пересоздание подписок для регула (у них не стандартный сервер, подписка держится активной даже если данных нет)
AddMessage(Now, mkMessage, 'Выполняется автоматическое пересоздание подписок OPC UA сервера.', True, False);
end;
// проверка на восстановление связи
if (vrLost.AsBool) and (vrLinkTimer.AsInt64 < TIMEOUT) then
begin
vrLost.Value := False;
AddMessage(Now, mkMessage, 'Cвязь с OPC UA сервером восстановлена', TRUE, FALSE);
end;
end.
*)