Здравствуйте. Раннее в теме "Расчёт удельной потребляемой мощности" я писал о том, что функция ArchiveValueByTime иногда пишет ошибку NAN после расчётов. Я думал, что исправил, но за сутки довольно таки много раз попадается ошибка NAN, а если значение переменной перевести в строку, то будет ошибка INF.
Ошибка происходит именно в расчёте удельной потребляемой мощности. Эта функция ещё используется в расчётах суточной воды и часовой, но там всё в порядке и никаких ошибок не было.
Скрипт который выполняется каждый час:
var
aDateSpecPower: TDateTime;
begin
//Удельная потребляемая мощность ВНС 19
aDateSpecPower := RecodeTime(Now, HourOf(Now), MinuteOf(Now), 0, 0);
ArchiveValueByTime(kWh_Counter_19, SpecificPowerConsumption_VNS19_End, aDateSpecPower);
aDateSpecPower := IncHour(Now, -1);
ArchiveValueByTime(kWh_Counter_19, SpecificPowerConsumption_VNS19_Start, aDateSpecPower);
end.
Скрипт "Изменилась переменная". Он срабатывает по тегам SpecificPowerConsumption_VNS19_End и SpecificPowerConsumption_VNS19_Start
begin
SPC_VNS19.Value := SpecificPowerConsumption_VNS19_End.Value - SpecificPowerConsumption_VNS19_Start.Value;
//Вычисляем удельную потребляемую мощность ВНС19
SpecificPowerConsumption_VNS19_Result.Value := SPC_VNS19.value / HourlyWaterConsumption_VNS19_Result.Value;
end.
Потом бывает очень странный график (красная линия)
Тег HourlyWaterConsumption_VNS19_Result имеет результат расчёта часового расхода воды, но через туже самую ArchiveValueByTime расчёт происходит правильно и без ошибок.
Расчёты суточной воды и часовой абсолютно одинаковы вместе с расчётом удельной потребляемой мощности, но меняются в расчётах только теги.
Здравствуйте.
Я думал, что исправил, но за сутки довольно таки много раз попадается ошибка NAN
Какая именно переменная у Вас становится равна NAN? В этой теме (https://simple-scada.com/forum/index.php?topic=949.msg8081#msg8081) Вы писали, что это переменная "SpecificPowerConsumption_VNS19_Result". Тогда причём здесь процедура "ArchiveValueByTime"? Пожалуйста, разберитесь немного в собственном коде, подумайте что, когда и как вычисляется, исключите ситуации с делением на ноль (на ноль делить нельзя). Если взять переменную "SpecificPowerConsumption_VNS19_Result", то она в Вашем коде вычисляется так:
SpecificPowerConsumption_VNS19_Result.Value := SPC_VNS19.value / HourlyWaterConsumption_VNS19_Result.Value;
т.е. в неё записывается результат деления двух чисел. А процедура "ArchiveValueByTime" здесь не при чем. В коде Вы не проверяете является ли делитель нулём или нет. Если он ноль, то результат конечно будет NAN, т.к. на ноль делить нельзя. Поэтому перед присвоением следует убедиться в том, что делитель не является нулём. Это очень просто:
if HourlyWaterConsumption_VNS19_Result.Value <> 0 then
SpecificPowerConsumption_VNS19_Result.Value := SPC_VNS19.value / HourlyWaterConsumption_VNS19_Result.Value;
Ошибка происходит... то будет ошибка INF.
Ошибки не происходит вовсе. Всё работает строго в соответствии с тем кодом, который Вы написали.
Ошибка происходит именно в расчёте удельной потребляемой мощности.
Из этого следует очень простой вывод: у Вас деление на ноль происходит только в расчёте удельной потребляемой мощности. Если бы деления на ноль не было, то и "ошибки" тоже не было бы.