Доброгово времени суток, подскажите как можно реализовать следующую задачу: в OPC переменной прибора может быть число 1 или 2, если значение изменилось, необходимо выполнить скрипт.
Доброгово времени суток, подскажите как можно реализовать следующую задачу: в OPC переменной прибора может быть число 1 или 2, если значение изменилось, необходимо выполнить скрипт.
Вне функции OnRead заводите переменную:
local lastVal=0;
В каждом OnRead сравниваете значение lastVal с текущим значением тега - если изменилось, делаете что вам нужно.
В конце OnRead сохраняете в lastVal текущее значение.
Спасибо.
В скрипте c# отсутствует функция OnRead, видим только Execute. И ещё подскажите, опрос у скрипта должен быть периодический или По изменению входов.
В скаде - аналогично. В теле класса, вне метода Execute объявляете переменную:
int lastVal=0;
В execute сраниваете в текущим значением, если отличается - выполняете что вам нужно.
В конце сохраняете значение в lastVal.
Способ выполнения скрипта роли не играет.
Спасибо.
На данный момент так и реализовали. Но при этом значение данной переменной обновляется через 5 секунд, однако остальные переменые обновляются раньше (менее 1 секунды) из за чего возникает "коллизия" в обработке данных.
Какой переменной?
Спасибо.
В общем решили данную задачу немного по другому. Столкнлись с такой проблемой на данный момент: у скрипта два дискретных выхода, в теле скрипта этим выходам присваивается состояние true, после того как состояние этих выходов передали в тэг (OPC переменную) необходимо вернуть состояние выхода скрипта в false. Но ни как не можем понять, как это сделать, т.к. если в самом скрипте добавить строчки с присвоением состояния false этим выходам, состояние true не успевает передать состояние в тэг. Не подскажите, как это сделать правильно?
А как вы понимаете что ОРС принял значение? Если например нет связи с контроллером?
Самое простое - можете включить периодический опрос у скрипта, после того как включили выход, начинайте считать такты опроса. Прошло 5 тактов например - выключили.
Спасибо.
Периодический опрос не подходит, т.к. скрипт играет роль события. Если на форме нажали кнопки 1 или 2, то на выход_1 результат true, если нажали кнопки 3 или 4, но на выход_2 результат true. И вот тут по идее напрашивается счётчик (задержка или что-то в этом роде), но sleep не помогает, просто пустой цикл тоже.
Sleep или цикл - вы просто остановите весь поток и все.
Или периодический опрос и считать циклы или вызвать HostFB.SetNeedUpdate() - это заставит на следующем цикле опять выполнится Execute, даже если входы не менялись.
Спасибо.