Здравствуйте.
Существует скрипт который исполняется раз в секунду, данные накапливаются и выводятся в рапорт, но столкнулся с проблемой что запись в переменные накопления происходят не у всех.
Вопрос: это неправильно сделанный скрипт или что то еще - куда смотреть?
Проверить на ошибки фазы выполнения проекта. См. журнал сервера.
Сам скрипт можно проверить тестовыми последовательностями (константа - линейное нарастание результата, пила - весь диапазон входной переменной).
При выполнении функции возможно изменение значения входной переменной. Значение входной переменной типа TM_Variable следует передавать как типизированное значение (формально параметр по значению передается локальной копией, однако при передаче объекта (экземпляра класса), внутри функции/процедуры работа идет со ссылкой на тот же объект, а не с копией его полей):
procedure CalcWeightSum(FLeistung: single; var WeightSum, WeightDelta: TM_Variable);
begin
// 1. Проверяем, входят ли текущие показания в допустимый диапазон
if (0 <= FLeistung) and (FLeistung <= MaxLimit) then
. . .
end;
begin
CalcWeightSum(FLeistung_BW_P10_1_db256.AsFloat, WeightSum_P10_1, WeightDelta_P10_1);
. . .
end;
или однократным присвоением локальной переменной:
procedure CalcWeightSum(FLeistung: TM_Variable; var WeightSum, WeightDelta: TM_Variable);
var aFLeistung: single;
begin
aFLeistung := FLeistung.AsFloat;
// 1. Проверяем, входят ли текущие показания в допустимый диапазон
if (0 <= aFLeistung) and (aFLeistung <= MaxLimit) then
. . .
end;
Дальнейшие проверки определятся уже из методики обнаружения отсутствия записи.
Добавлено 26.09.2026.P.S. Замечания по алгоритму скрипта и (в случае архивирования данных) использование функций для работы с архивом. Правило для вышедших за границы значений:
- принимает граничное значение. Архивирование переменной с применением фильтра "Фильтр мин. макс.", функции работы с архивом будут выдавать правильный результат;
- принимает предыдущее значение или игнорируется. Архивирование дополнительной переменной после соответствующей фильтрации. функции работы с архивом будут выдавать правильный результат;
- принимает предыдущее значение. В скрипте необходимо перенести суммирование за условное выражение, а само условное выражение оставить только для корректных значений;
- игнорируется. Как это сделано в скрипте. Появление игнорируемых входных значений приведёт к искажению результата в сторону уменьшения, т.к. [за период 3600 сек] суммируется меньшее число отсчетов. Т.е. для каждой переменной необходим счётчик числа корректных значений. Для правильного результата применяется повышающий коэффициент 3600/<значение счетчика>.