PDA

Просмотр полной версии : Принудительная запись в MasterOPC



ASo
04.12.2014, 16:56
Можно ли настроить MasterOPC так, что бы он каждый цикл "опроса" принудительно записывал значение WriteOnly переменной в устройство, даже если она не изменилась?

SCADAMaster
04.12.2014, 18:07
Можно через скрипт.
Включите скрипт После чтения, и проводите запись последовательно двумя командами:
server.WriteCurrentTag(val,qual);
server.WriteCurrentTagToDevice(val,qual);

ASo
04.12.2014, 18:12
Это точно работает? Я специально указал для тега WriteOnly.
И что подставить в качестве val, чтобы бралось текущее записываемое значение?

SCADAMaster
04.12.2014, 21:06
Как выяснилось сейчас через WriteCurrentTag не работает. Это ошибка - мы ее исправим в следующей версии (планируем выпустить завтра или в начале недели).
Можно также сделать в уже имеющейся версии при помощи функций WriteTagByRelativeName:
server.WriteTagByRelativeName("ИмяТега",10,192);
server.WriteTagByRelativeNameToDevice("ИмяТега",10,192);

ASo
04.12.2014, 21:23
На самом деле, у меня получилось через ReadCurrentTag с последующей записью считанного значения через WriteCurrentTagToDevice. Это логично - считали тег (значение в сервере) - записали в устройство.

Появился один доп. вопрос. Хочется при старте серевера считать стартовое значение с этого или иного регистра и присвоить тегу. Но только один раз, при старте. Вопрос - можно вставлять modbus.ReadHolding.... в процедуру Init или это надо делать основной процедуре, вводя переменную для отслеживания старта?

SCADAMaster
04.12.2014, 21:50
В OnInit запросы не выполняются.
Поэтому нужно выполнить запрос в OnRead, а затем установить флаг что чтение выполнение и больше запрос не выполнять.

ASo
05.12.2014, 10:11
Где надо объявлять "флажковую" переменную? Глобальную или локальную для всего скрипта? Или локальную для метода?

SCADAMaster
05.12.2014, 11:06
Ну вы можете в самом начале скрипта объявить переменную:
StartFlag=false;

затем в OnRead проверить:
if StartFlag==false then
--код запроса
StartFlag=true;
end;