Работа со счетчиком

Задача. Создание счетчика моточасов.
В данном случае под счетчиком моточасов понимается количество проработанного двигателем времени. Для этого можно воспользоваться счетчиками. В качестве переменной, отвечающей за состояние работы двигателя будем использовать M1_RUN (тип BOOL или EBOOL). Переменная  M1_MTHR_RST (тип BOOL или EBOOL) является командой на сброс счетчика моточасов. Рассмотрим два варианта решения.

Решение 1
. В этом примере в качестве выходного значения нужно получать наработанные часы.
Перед тем как решить задачу, определимся с типом переменной, сохраняющей количество наработанных моточасов. Если это будет INT, иаксимальное количество моточасов будет 32767 ч (около 3-х лет), UINT - 65535 ч (около 7-ми лет), DINT - 2147483648 ч (245 тис. лет) UDINT - 4294967295 (500 тис. лет). Возможно INT вполне хватит, однако для счетчиков такого типа обычно используют беззнаковые типы, так как они не могут быть меньше 0. Таким образом есть два варианта либо UINT/UDINT.
Для подсчета моточасов будем использовать счетчик. Однако считать будем не часы а минуты, так как при подсчете часов  в момент перекидывания часового меандра двигатель может не работать, и включаться на 20 минут в момент отключенного импульса. Это всё приведет к большим расхождениям. Проблему можно решить и другим способом, но в данном примере мы используем минутный системный меандр доступный в ячейке %S7 (30 с = TRUE, 30 с = FALSE) и счетчик CTU_UDINT.
Тип счетчика выбираем UDINT, так как счетчик UINT с максимальным значением 65535 минут (45 дней) явно маловат для подсчёта "мотоминут". 
Учитывая, что выход счетчика имеет тип UDINT, переменную, содержащую значение моточасов M1_MTHR есть смысл тоже определить как UDINT. Таким образом программа выглядит следующим образом:      
    
   Уставку PV "счетчику мотоминут" M1_CTU выставляем максимально возможную. Расчет моточасов производится обычным делением текущего значения счетчика (минуты) на 60. Подсчет импульсов %S7 производится только при работающем двигателе, так как M1_RUN определяет состояние выполнения блоков через вход EN.
При команде M1_MTHR_RST текущее значение счетчика обнуляется. Однако в данной программе сброс возможен только при работающем двигателе. Для возможности сброса счетчика в любой момент, можно на вход EN блока M1_CTU подать значение результата логической операции M1_RUN OR M1_MTHR_RST.        

Решение 2
. Этот пример более академический чем практический. Нужно получать время работы двигателя в трех отдельных значениях: дни, часы и минуты. Для хранения этих значений достаточно размера переменных типа UINT. Хоть для минут и часов сгодился б и BYTE, счетчиков с выходом такого типа в UNITY нет и, честно говоря, в нём нет необходимости. Итак, для подсчёта "мотоминут", "моточасов" и "мотодней" используем три счетчика типа CTU_UINT. Программа выглядит следующим образом:      
Как и в первом примере, счетчик CTU_M1_MIN в момент работы двигателя (M1_RUN=TRUE) подсчитывает импульсы минутного меандра %S7. Текущее значение выводится в переменную M1_MTMNs (тип UINT).  Уставка для счетчика CTU_M1_MIN равна 60. Это означает, что при достижении 60 минут, на выходе Q этого счетчика сформируется логическая 1 (CTU_M1_MIN.Q=TRUE), которая увеличит на 1 значение счетчика CTU_M1_HOUR, тоесть прибавит 1 час к M1_MTHRs (тип UINT). Выход CTU_M1_MIN.Q продержится один цикл задачи, так как на следующем цикле он же обнулит счетчик через вход R, "проскочив" через функцию OR.
Работа счетчиков CTU_M1_HOUR и CTU_M1_DAYS происходит по тому же принципу. То есть через 24 часа сработает выход CTU_M1_HOUR.Q, увеличивая тем самым счетчик дней (суток) и скидывая свой счетчик на следующем цикле.
При команде M1_MTHR_RST текущие значения всех счетчиков обнуляется. Однако как и в предыдущем примере, в данной программе сброс возможен только при работающем двигателе. Для возможности сброса счетчика в любой момент, можно на вход EN счетчиков подать значение результата логической операции M1_RUN OR M1_MTHR_RST.         
      

 
Comments