Здравствуйте.
Недавно начал разбираться с MasterSCADA и MasterOPC - создал небольшой проект по управлению задвижкой.
Работу контроллеров, разумеется, нужно как-то эмулировать. Я попробовал сделать это в самом OPC-сервере - сделал все теги SERVER_ONLY и пытаюсь изменить их значения при помощи скриптов.
Всего у меня 4 тега - Открыта, Закрыта, Открыть и Закрыть, все дискретные. Я хочу, чтобы при выполнении команды Открыть или Закрыть, индикаторы Открыта и Закрыта сначала сбрасывались (чтобы отобразить процесс в MasterSCADA), а потом через несколько секунд устанавливался нужный индикатор. Использую вот такой код:
Проблема в том, что код сброса значений (перед sleep) игнорируется - индикаторы не меняют свои значения. А вот код после sleep отрабатывает нормально. Сообщения при этом в консоль выводятся, sleep работает корректно.Код: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
В чем может быть проблема? Можно ли мою задачу решить какими-то другими способами?


Ответить с цитированием
