
Сообщение от
kondor3000
Спасибо,
Достаточно было опрометчиво переместить одну строчку, в начало IF и всё...
Правильный код
Код:
function_block RASHOD_Ex (* (с) PeterA для форума ОВЕН *)
var_input
TIC: BOOL; (*импульс счетчика*)
Cimp: REAL; (*Вес импульса, л*)
Qmin: REAL; (*Минимальный расход м.куб/час*)
end_var
var_output
Q: REAL; (*мгновенный расход мкуб/час*)
overflow: BOOL; (*Нет расхода (период импульсов больше максимального)*)
end_var
var
M: BOOL;
period: TIME;
start: TIME;
INIT: BOOL; (*пришел первый, начальный импульс, последовательности*)
cur_TIME: TIME; (*текущее время*)
period2: TIME; (*сколько прошло времени от фронта импульса*)
end_var
cur_TIME:= GET_TIME();
IF TIC AND NOT M THEN (*если фронт импульса*)
(* Было тут period2:=cur_TIME- start; *)
IF NOT INIT THEN (*если зто первый импульс*)
INIT:= TRUE; (*начинаем подсчет времени до фронта следующего импульса*)
Q:= 0; (* а пока расход = 0*)
ELSE (*если не первый импульс, то*)
period:= cur_TIME - start; (*время между импульсами*)
Q:= 3600/udint_to_real(time_to_udint(period)) * Cimp; (*мгновенный расход*)
overflow:= FALSE; (*переполнения по времени между импульсами нет*)
END_IF
start:= cur_TIME; (*фиксация времени прихода фронта импульса*)
END_IF
M:= TIC; (*пришел фронт импульса*)
period2:=cur_TIME- start; (*сколько прошло времени от фронта последнего импульса*)
IF period2 >= udint_to_time(real_to_udint(3600 * Cimp / Qmin)) THEN (*если от фронта последнего импульса прошло время больше допустимого по Qmin*)
Q:=0; (*значит нет расхода*)
INIT:= FALSE; (*следующий импульс будет первым*)
overflow:= TRUE; (*флаг переполнения по времени между импульсами*)
END_IF
end_function_block