PDA

Просмотр полной версии : СПК110 + МВ110 32ДН Грамотный опрос каналов счетчика



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).
Такой подход корректен?

murdemon
27.10.2015, 11:49
не надо не чего обнулять... просто в программе вычитаешь из нового значения то которое было при прошлом считывании (если новое больше), если новое меньше то значит мы прошли уже через 65535 и число импульсов будет новое значение + 65535-старое значение. Как то так. Но все равно ошибка будет из-за неточности временных интервалов и времени опроса модуля. (небольшая)

Sepsis
27.10.2015, 12:06
если новое меньше то значит мы прошли уже через 65535
Так я так и хотел изначально. А это точно, что счетчик через ноль проходит?


При переполнении счетчика его значение обнуляется, и счет продолжается.
Все, простите за невнимательность, в документации все черным по белому написано.
Спасибо!

Sepsis
09.11.2015, 14:56
Дорвался я на прошлых выходных до контроллера, поправил код с учетом прохождения счетчика через ноль. В итоге он выглядит так:


IF cnt_timeout.Q THEN
r1_current := cnt_03_ch_16_19_read[1];
r2_current := cnt_03_ch_16_19_read[3];

IF r1_current < r1_old THEN
r1 := r1_kef*WORD_TO_REAL(65535-r1_old+r1_current+1);
ELSE
r1 := r1_kef*WORD_TO_REAL(r1_current-r1_old);
END_IF
IF r2_current < r2_old THEN
r2 := r2_kef*WORD_TO_REAL(65535-r2_old+r2_current+1);
ELSE
r2 := r2_kef*WORD_TO_REAL(r2_current-r2_old);
END_IF

r1_old := r1_current;
r2_old := r2_current;

recharge_cnt_timer := TRUE;
END_IF


И вроде бы не на что списать больше скачки значений расхода - а по факту, такое хоть и реже стало происходить, но все же проявляется с определенной периодичностью.
Поток сырья не изменяется, значения расходомеров, к примеру, в течении нескольких секунд вполне адекватно меняются, скажем, 50.3 г/с, 50.8 г/с, 50.5 г/с ... а потом разовый скачок до 70 г/с.

Чем может быть вызвано такое поведение программы? (значения меняются не только на визуализации, такой скачок в отладчике проскакивает точно так же).
Единственное, что могу предположить, "подвисание" цикла исполнения программы на СПК110.
Может быть стоит, например, производить опрос чаще, 5 раз в секунду, усреднять и выводить на визуализацию раз в секунду?