Здравствуйте!
Для правильной работы счетчика DiscreteInputCount0_8_GeneralQ можно применить коррекцию текущего значения счетчика на величину изменения DiscreteInputCount0_8 с момента последней коррекции. Для этого используется внутренняя переменная HoldCount0_8, запоминающая значение DiscreteInputCount0_8 в момент последней коррекции.
Сам скрипт может вызываться по событиям: изменение переменной (например, DiscreteInputCount0_8), по времени ("Прошла секунда") и т.д.
Пример скрипта, в предположении, что DiscreteInputCount0_8 представляет собой образ 32-разрядного счетчика в контроллере.
var i, j: int64;
begin
i := DiscreteInputCount0_8.AsInt64 and $FFFFFFFF;
j := i - (HoldCount0_8.AsInt64 and $FFFFFFFF); // добавка к "большому" счетчику со времени последней коррекции
if j < 0 then j := j + 4294967296; // коррекция при переполнении 32-разрядного счетчика
DiscreteInputCount0_8_GeneralQ.Value := DiscreteInputCount0_8_GeneralQ.AsInt64 + j;
HoldCount0_8.Value := i; // запомнить текущее значение счетчика
end.
Скрипт установки счетчика в 0:begin
DiscreteInputCount0_8_GeneralQ.Value := 0;
HoldCount0_8.Value := DiscreteInputCount0_8.Value;
end.
Во вложении пример модели счетчика контроллера (изменение: прямая запись, генератор 1 Гц, +1, число 4294967290)
с возможностью отключения/подключения данных от ОРС-сервера и сохранением данных при перезапуске проекта.
К сожалению, я так и не понял алгоритм калибровки.