Имея техническую возможность, решил завести в СПК показания счетчиков - электричество, вода и газ. Все три имеют импульсный выход. Рассматриваем пример с водяным счетчиком.
Вес импульса - 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


Ответить с цитированием