Здравствуйте.
Всё верно. Свойство Value переменной имеет
тип данных Variant, потому при выполнении операций компилятор будет пытаться угадать тип данных в зависимости от выражения и текущего значения переменных. Кроме того, ничего не мешает OPC-серверу передать в скаду в переменную одного типа значение другого типа. Например, в переменную LongWord передать значение типа Double, в том случае, если адресация по OPC-сервере настроена неправильно, или выбран неправильный тип данных.
Когда Вы указали явное приведение к типу компилятор начал работать с конкретными значениями с правильными типами данных и ошибка исчезла. Только в Вашем случае правильнее было бы использовать приведение .AsInt64, так как максимальное значение переменной LongWord может быть выше максимального Integer значения.
Нужно также отметить, что если в момент выполнения приведённого Вами кода во всех переменных будут корректные значения соответствующего типа, то все варианты кода будут работать правильно. Например, на всех наших ПК приведённый Вами код работает без ошибок (мы в тестах используем OPC-сервер в котором на 100% значения переменных совпадают с типом переменных). Если испортить адреса переменных на OPC-сервере (чтобы в скаду попадали некорректные значения не соответствующие типу), то начинают возникать ошибки о которых Вы написали, что верно.
При очередном запуске проекта сервер начал ругаться в run-time
Если до какого-то момента они не возникали и вдруг начали возникать, значит исходные данные изменились и нужно искать причину изменений и устранять её.
Если вышеописанное не подходит под Ваш случай, то просьба выслать текущую версию проекта (на
support@simple-scada.com) и точные значения переменных в момент выполнения скрипта с ошибкой. Вывести значения переменных проще всего в лог-файл, так:
Log_Add('vrOuterLongWord = ' + vrOuterLongWord.AsStr);