PDA

Просмотр полной версии : Учет показаний счетчика с импульсным выходом.



vnkorol
21.04.2015, 11:10
Имея техническую возможность, решил завести в СПК показания счетчиков - электричество, вода и газ. Все три имеют импульсный выход. Рассматриваем пример с водяным счетчиком.
Вес импульса - 10л, выходное устройство - геркон.
Количество цифр на табло - 5, плюс мелкие крутилки - сотни, десятки, литры и дециметры.
Учитывая вес импульса, учет будет вестись в кубах с двумя знаками после запятой.
Т.к. в наличии имеется подключенный МДВВ, который имеет очень приятный бонус в виде счетчика импульсов, который прекрасно работает с герконом, решил задействовать его.

Теперь о грустном. Счетчик в МДВВ - int16, т.е. считает до 65535. Значит если просто смотреть, сколько импульсов насчитало переводить в кубы, то получится 655,35м3. А на счетчике - 99999м3. Посему было решешено завести переменную в ретейне для значения со счетчика. И промежуточную переменную, с которой сравнивается значение счетчика в МДВВ и, если отличается, то прибавлять 0,01м3 к значению счетчика. Ниже прикрепил код.

Всё нормально работает, но осталось ощущение, что как-то криво сделал. Посоветуете более изящное решение?



PROGRAM WATER_COUNTER
VAR RETAIN
counter_water : REAL; (*водяной счетчик*)
mdvv_in01_counter_past :UINT; (* предыдущее значение счетчика 01 канала МДВВ*)

END_VAR
VAR
END_VAR

// PLC_PRG.mdvv_in01_counter - значение счетчика импульсов на входе МДВВ

IF mdvv_in01_counter_past <> PLC_PRG.mdvv_in01_counter THEN
counter_water:=counter_water +0.01;
mdvv_in01_counter_past:= PLC_PRG.mdvv_in01_counter;
END_IF

Serge_krd
21.05.2016, 14:20
Примерно так. Переменные ind конечно в ретайн. Разрядов рисуем сколько нужно.
24534