Здравствуйте.
Недавно начал разбираться с 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 работает корректно.

В чем может быть проблема? Можно ли мою задачу решить какими-то другими способами?