У меня возникла необходимость создания функции для масштабирования и последующей обработки сигнала с пирометра (нахождение разброса, медианы и т.п.). Сигнал заходит на модуль аналогового ввода sm431. Принцип работы функции следующий: если на вход поступает температура меньше 605 град, то на выходе постоянно 600 градусов. Если температура больше, то начинается нахождение среднего значения температуры за 50 измерений. Но у меня не получилось это реализовать, подскажите пожалуйста, в чём могут быть ошибки?
Ещё проблема в том, что таких пирометров несколько и если я вызываю одну и туже функцию по несколько раз и завожу на неё значения с разных пирометров. На выходах двух одинаковых функций я получаю одинаковые значения при разных входных данных. Если к примеру на входе одной функции ноль, а на другой какое-то значение, то в обоих функциях происходит расчёт и соответственно на первой показываются ложные значения (не ноль, а значения с других пирометров). Как от это избавится? Пробовал использовать var_temp - не помогло. Пробовал создавать разные функции с одинаковыми переменными - все равно не помогло(.
Заранее спасибо!)
code
Show
Code: Select all
FUNCTION FC33 : VOID
VAR_INPUT
data_in:INT;
reset:BOOL;
END_VAR
VAR_OUTPUT
OUT:REAL;
OUT2:REAL;
VERT_Q:REAL;
end_mes:BOOL;
OBERG:REAL;
UNTERGR:REAL;
END_VAR
VAR
tmp:DINT;
temper:REAL;
COUNT:INT;
//COUNT:INT; // Число измерений
MIWERT:REAL; // Среднее занчение
SIGMA:REAL; // СУММА КВАДРАТОВ
VERT:REAL;
END_VAR
BEGIN
IF RESET THEN
COUNT:=0;
MIWERT:=0.0;
SIGMA:=0.0;
VERT:=0.0;
end_mes:=0;
END_IF;
tmp:=INT_TO_DINT(data_in);
temper:=DINT_TO_REAL(tmp);
temper:=(temper*0.01822234)+600.0;
IF temper>650.0
THEN
MIWERT:=MIWERT+temper;
COUNT:=COUNT+1;
SIGMA:=SIGMA+(temper*temper);
//ELSE
//out:=600;
END_IF;
IF COUNT>=50 THEN
MIWERT:=MIWERT/COUNT;
out:=MIWERT;
SIGMA:=SQR((SIGMA-((MIWERT*MIWERT)*COUNT))/(COUNT-1)); // Вычисляем разброс
VERT_Q:=(SIGMA*0.2841)/MIWERT;
OBERG:=MIWERT+SIGMA+(MIWERT*0.05);
UNTERGR:=MIWERT-SIGMA-(MIWERT*0.05);
end_mes:=1;
COUNT:=0;
END_IF;
END_FUNCTION