Сообщение от
rwg
Когда вы вычисляете скорость изменения температуры, вы делите 0 на 0, микроизменение температуры на секундный интервал времени. Чтобы повысить точность, нужно увеличить время между измерениями и фильтровать результат. Но это приведёт к задержкам измерения, что снижает точность регулирования и может вызвать автоколебания регулятора. Проще настроить регулятор температуры и с заданной скоростью изменять его уставку, заданная скорость нагрева получится автоматически, а погрешности её вычисления не будут влиять на работу регулятора.
Подтверждаю, регулировку скорости много проще делать изменением уставки, но и подсчет скорости не помешает. Я это делаю накапливая массив:
Код:
TYPE mnt_temp_time :
STRUCT
temp:REAL;
mt_time:DWORD;
END_STRUCT
END_TYPE
VAR
(*переменные подсчета скорости температуры*)
arr_tt:ARRAY [0..20] OF mnt_temp_time;(*массив меток времени и температур для расчёта скорости*)
j:INT:=0;
j2:INT:=0;
n:INT:=20;
END_VAR
(*подсчет скорости изменения температуры*)
IF NOT(arr_tt[j].temp=mashina.tek_t) AND (timer.dw_time_ms-arr_tt[j].mt_time)>1000 THEN
IF j=n THEN j:=0;
ELSE j:=j+1; END_IF
arr_tt[j].temp:=mashina.tek_t;
arr_tt[j].mt_time:=timer.dw_time_ms;
IF j=n THEN j2:=0;
ELSE j2:=j+1;END_IF
mashina.spid_temp2:=((arr_tt[j].temp - arr_tt[j2].temp)/
(DWORD_TO_REAL(arr_tt[j].mt_time)-DWORD_TO_REAL(arr_tt[j2].mt_time)))*60000;
END_IF