Написал простой скрипт, может кому-нибудь понадобится.
Задача. Я ввожу в поле ввода секунды, должен произойти пересчет, и в OPC должны уйти миллисекунды.
Ограничение ввода от 0 до 20 секунд.
Как это сделать.
Имеется переменная OPC: Имя Time_vibro, тип Integer, шкала от 0 до 20000, формат вывода 0 в которой будет хранится значение в миллисекундах.
Я создаю виртуальную переменную, например, a1. Тип integer, шкала от 0 до 20. Формат вывода 0. В ней будет хранится промежуточное значение в секундах.
Создаю поля ввода Field1 для ввода секунд. Переменная для этого поля будет а1. Также у него есть событие OnDoneInput. Оно будет вызвано по окончанию ввода в поле. Cоздаю следующий скрипт.
Procedure Field1_OnDoneInput(Sender: TM_Control);
begin
Time_Vibro.Value := Field1.ValueAsInt * 1000;
end.
Что он делает. Допустим мы ввели в поле секунд 2. Это значение будет выведено в Field1.ValueAsInt. Умножением на 1000 переведу секунды в миллисекунды и сохраню результат в переменную OPC.
Все работает, но. Так как виртуальная переменная не хранит результат после закрытия скады, то при перезапуске скады, мы в поле ввода увидим 0. Хотя какое-то значение записано в Time_Vibro.Value.
Значит нужно считать его из OPC в поле ввода секунд с обратным преобразованием.
Я это сделал так.
Создал вспомогательное поле ввода Field2. Сделал его недоступным и невидимым. Переменной для этого поля выбрал Time_Vibro. И использовал событие OnDataChange.
Procedure Field2_OnDataChange(Sender: TM_Control);
begin
Field1.Value := Time_Vibro / 1000
end.
При загрузке скады произойдет сравнение значение переменной Time_Vibro в клиенте скады и значение переменной Time_Vibro в OPC сервере. И если будет обнаружено различие вызовется событие OnDataChange. Миллисекунды переведем в секунды делением и полученное значение присвоим полю ввода секунд.
Так можно преобразовывать любые значение при вводе, а также дополнив скрипт OnDoneInput проверять введенное значение на соответствие нужным условиям и соответственно принимать какие то действия.