Sepsis
27.10.2015, 07:04
Добрый день, уважаемые коллеги!
В проекте используется связка СПК110 с модулями Мх110. Встала задача контроля и учета расхода сырья с использованием импульсного расходомера (Kracht VC). Для подсчета импульсов используем каналы счетчика модуля МВ110-24.32ДН.
Задача и решение тривиальное - опрашиваем каналы счетчика, раз в секунду сохраняем значения, обнуляем каналы.
Вроде бы ничего криминального в такой логике нет и все работает.
Вот выдержка исходного кода:
flush_cnt_on_timeout := FALSE;
IF cnt_timeout.Q THEN
r1 := 1.48*WORD_TO_REAL(cnt_03_ch_16_19_read[1]);
r2 := 0.45*WORD_TO_REAL(cnt_03_ch_16_19_read[3]);
cnt_03_ch_16_19_write[1] := 0;
cnt_03_ch_16_19_write[3] := 0;
flush_cnt_on_timeout := TRUE;
END_IF
cnt_timeout(IN:=((auto_mode AND out_open_horizont AND out_open_vertical) OR ((manual_mal_circ OR manual_bol_circ) AND out_enable_invrtors)) AND NOT flush_cnt_on_timeout,PT:=T#1S);
где flush_cnt_on_timeout - булева переменная, по триггеру R_EDGE которой происходит обнуление каналов счетчика, cnt_timeout.Q - выход TON'a cnt_timeout, отрабатывающий с частотой раз в секунду, r1 и r2 - значения с каналов счетчика, уже преобразованные и умноженные на необходимый коэффициент.
Сам модуль в списке устройств выглядит следующим образом:
20564
Проблема в том, что стабильно раз в 3 секунды считанное значение "прыгает", являясь, по сути, суммой текущего и предыдущего, например ... 65,3 ; 60 ; 125,3 ... В отладчике та же картина, раз в 3 секунды значение счетчика не обнуляется. Но почему так выходит?
Как я понимаю, у модуля, после переполнения счетчика (значение 65535) автоматическое обнуление канала не происходит, поэтому непрерывный подсчет импульсов произвести не удастся. Сейчас думаю обнуление производить не ежесекундно, а по значению счетчика (скажем, по условию >50 000).
Такой подход корректен?
В проекте используется связка СПК110 с модулями Мх110. Встала задача контроля и учета расхода сырья с использованием импульсного расходомера (Kracht VC). Для подсчета импульсов используем каналы счетчика модуля МВ110-24.32ДН.
Задача и решение тривиальное - опрашиваем каналы счетчика, раз в секунду сохраняем значения, обнуляем каналы.
Вроде бы ничего криминального в такой логике нет и все работает.
Вот выдержка исходного кода:
flush_cnt_on_timeout := FALSE;
IF cnt_timeout.Q THEN
r1 := 1.48*WORD_TO_REAL(cnt_03_ch_16_19_read[1]);
r2 := 0.45*WORD_TO_REAL(cnt_03_ch_16_19_read[3]);
cnt_03_ch_16_19_write[1] := 0;
cnt_03_ch_16_19_write[3] := 0;
flush_cnt_on_timeout := TRUE;
END_IF
cnt_timeout(IN:=((auto_mode AND out_open_horizont AND out_open_vertical) OR ((manual_mal_circ OR manual_bol_circ) AND out_enable_invrtors)) AND NOT flush_cnt_on_timeout,PT:=T#1S);
где flush_cnt_on_timeout - булева переменная, по триггеру R_EDGE которой происходит обнуление каналов счетчика, cnt_timeout.Q - выход TON'a cnt_timeout, отрабатывающий с частотой раз в секунду, r1 и r2 - значения с каналов счетчика, уже преобразованные и умноженные на необходимый коэффициент.
Сам модуль в списке устройств выглядит следующим образом:
20564
Проблема в том, что стабильно раз в 3 секунды считанное значение "прыгает", являясь, по сути, суммой текущего и предыдущего, например ... 65,3 ; 60 ; 125,3 ... В отладчике та же картина, раз в 3 секунды значение счетчика не обнуляется. Но почему так выходит?
Как я понимаю, у модуля, после переполнения счетчика (значение 65535) автоматическое обнуление канала не происходит, поэтому непрерывный подсчет импульсов произвести не удастся. Сейчас думаю обнуление производить не ежесекундно, а по значению счетчика (скажем, по условию >50 000).
Такой подход корректен?