Возникла странная ошибка.
Есть внешняя переменная в OPC сервере тип DWord (4 байта)
В Simple-Scada тип LongWord.
Внутренней переменной типа Boolean присваивается младший бит
// Состояние РКН
PKH.Value:=Out2.Value and 1;
При очередном запуске проекта сервер начал ругаться в run-time
Ошибка в скрипте "MainCycle" в строке 15. Overflow while converting variant of type (Double) into type (Integer)
При этом "съедалось" содержимое тега (на OPC сервере смотрел)
Добавил явное приведение типа
// Состояние РКН
PKH.Value:=Out2.Value and LongWord(1);
Стало ругаться на строку 97 (до этого ошибку не показывало)
Ошибка в скрипте "MainCycle" в строке 97. Overflow while converting variant of type (Double) into type (Integer)
Поменял
// Включить вентиляторы
if (Out2.Value and $3A000000) = 0 then Out2.Value:=Out2.Value or $3A000000;
на
// Включить вентиляторы
if (Out2.asInt and $3A000000) = 0 then Out2.Value:=Out2.asInt or $3A000000;
Ошибка пропала.
Для проверки вернул Value вместо asInt - всё рабоатет...
ОС Win7 x64, Simple-Scada 2.5.13
Здравствуйте.
Всё верно. Свойство Value переменной имеет тип данных Variant (http://www.delphibasics.ru/Variant.php), потому при выполнении операций компилятор будет пытаться угадать тип данных в зависимости от выражения и текущего значения переменных. Кроме того, ничего не мешает OPC-серверу передать в скаду в переменную одного типа значение другого типа. Например, в переменную LongWord передать значение типа Double, в том случае, если адресация по OPC-сервере настроена неправильно, или выбран неправильный тип данных.
Когда Вы указали явное приведение к типу компилятор начал работать с конкретными значениями с правильными типами данных и ошибка исчезла. Только в Вашем случае правильнее было бы использовать приведение .AsInt64, так как максимальное значение переменной LongWord может быть выше максимального Integer значения.
Нужно также отметить, что если в момент выполнения приведённого Вами кода во всех переменных будут корректные значения соответствующего типа, то все варианты кода будут работать правильно. Например, на всех наших ПК приведённый Вами код работает без ошибок (мы в тестах используем OPC-сервер в котором на 100% значения переменных совпадают с типом переменных). Если испортить адреса переменных на OPC-сервере (чтобы в скаду попадали некорректные значения не соответствующие типу), то начинают возникать ошибки о которых Вы написали, что верно.
При очередном запуске проекта сервер начал ругаться в run-time
Если до какого-то момента они не возникали и вдруг начали возникать, значит исходные данные изменились и нужно искать причину изменений и устранять её.
Если вышеописанное не подходит под Ваш случай, то просьба выслать текущую версию проекта (на support@simple-scada.com) и точные значения переменных в момент выполнения скрипта с ошибкой. Вывести значения переменных проще всего в лог-файл, так:
Log_Add('vrOuterLongWord = ' + vrOuterLongWord.AsStr);