Здравствуйте.
Недавно начал разбираться с MasterSCADA и MasterOPC - создал небольшой проект по управлению задвижкой.
Работу контроллеров, разумеется, нужно как-то эмулировать. Я попробовал сделать это в самом OPC-сервере - сделал все теги SERVER_ONLY и пытаюсь изменить их значения при помощи скриптов.
Всего у меня 4 тега - Открыта, Закрыта, Открыть и Закрыть, все дискретные. Я хочу, чтобы при выполнении команды Открыть или Закрыть, индикаторы Открыта и Закрыта сначала сбрасывались (чтобы отобразить процесс в MasterSCADA), а потом через несколько секунд устанавливался нужный индикатор. Использую вот такой код:
Код:
function sleep(s)
local ntime = os.time() + s
repeat until os.time() > ntime
end
function setOpenIndicator(v)
server.WriteTag("Насосная станция.Клапан 1.Kl1_IndO", v, OPC_QUALITY_GOOD);
end
function setClosedIndicator(v)
server.WriteTag("Насосная станция.Клапан 1.Kl1_IndC", v, OPC_QUALITY_GOOD);
end
function OnWrite()
TV, TQ, TS = server.ReadCurrentTag();
if TV then
server.Message("КЛ1: Открывается");
server.RunFunctionFromDevice("setOpenIndicator", 0, false);
server.RunFunctionFromDevice("setClosedIndicator", 0, false);
sleep(3);
server.RunFunctionFromDevice("setOpenIndicator", 0, true);
server.Message("КЛ1: Открыт");
end
end
Проблема в том, что код сброса значений (перед sleep) игнорируется - индикаторы не меняют свои значения. А вот код после sleep отрабатывает нормально. Сообщения при этом в консоль выводятся, sleep работает корректно.
В чем может быть проблема? Можно ли мою задачу решить какими-то другими способами?