Задание 4. Простой счетчик (туториал)
Описание задачи
Предприятие "Ромашка" производит кнопки. Эти кнопки проходят испытания по надежности - высчитывается максимальное количество нажатий, которое может выдержать кнопка. Обычно это большое число - не одна тысяча. Рабочий, который этим занимается, часто сбивается и результат получается неудовлетворительным. Предприятие хочет, чтобы вы сделали для них счетчик нажатий кнопки для устранения этой проблемы.
$$ Оплата: 25 токенов.
Описание тех процесса

На шкафе установлены:
Кнопка Start Button 1, количество нажатий на которую и должна считать программа
Экран Digital Display 1, на него выводится количество нажатий
Лампа зеленая Light indicator Green 1 - загорается, если было сделано >= 10 нажатий
Лампа красная Light indicator Red 1 - загорается, если количество нажатий четное
Задание 1. Считаем, выводим на экран, сбрасываем
Удобнее всего будет использовать язык FBD. Создаем новый проект, выбираем FBD.
Как обычно, создаем список переменных FIO (правой кнопкой на Application -> Добавить объект -> список глобальных переменных -> называем FIO)
Пока у нас только 1 сигнал - кнопка. Называем его iButton
VAR_GLOBAL
iButton: BOOL;
END_VAR
Далее переходим к коду программы. Для счетчика используются специальные блоки, CTU и CTD:

Для счетчика CTU сигналы такие:

Для счетчика CTD все то же самое, но на выход PV подается число, ОТ которого считаем до 0, а выход RESET у него называется LOAD, выполняет ту же функцию - сбрасывает значение счетчика до начального.
Итак, на вход PV записывается просто число (или переменная, при необходимости); | CU (CD), RESET (LOAD), Q - это сигналы.
Попробуем выполнить задание: нам нужно считать нажатия на кнопку, значит, по нажатию на кнопку iButton должно происходить увеличение значения счетчика на +1 - значит нужно использовать счетчик CTU:

На вход CU записываем кнопку FIO.iButton. До какого числа считать - нам не важно, поэтому поставим просто большое число, например, 1000.
Теперь нужно разобраться, что делать с остальными сигналами. Когда сбрасывать счетчик? Если сбрасывать его по программе вообще не нужно, то на вход RESET (LOAD если CTD) можно просто написать false. Однако, в нашем случае на шкафе есть большая красная кнопка сброса. Нужно добавить ее в FIO:

Теперь эту кнопку можно записать на RESET счетчика:

Что же делать с выходами? Сначала выход Q - там появится true, когда счетчик досчитает до максимального значения (указанного на PV). Если мы хотим просто считать нажатия и нам не важно, досчитал ли счетчик до конца, можно просто написать там любую переменную и сохранить ее в списке переменных (сверху над программой):

И, наконец, нам нужно разобраться с количеством нажатий. Если нам не нужно выводить текущее значение счетчика на экран (так обычно бывает во всех заданиях по мехатронике), то мы просто создаем на выходе CV переменную counterValue1, нажимаем enter, она сохраняется в списке локальных переменных (который над программой, см скрин выше).
НО, если есть необходимость выводить число на физический экран, как в данном задании, то переменную нужно создать в FIO. Она имеет тип WORD:

Добавляем ее на выход CV счетчика:

У нас появился выходной сигнал (значение счетчика на дисплей), который не влезает на обычный выход. Поэтому есть особенность подулючения:

Все готово, можно проверить в Factory IO:

Задание 2. Добавляем лампы
Теперь нужно добавить свечение ламп по техническому заданию:
Лампа зеленая Light indicator Green 1 - загорается, если было сделано >= 10 нажатий
Лампа красная Light indicator Red 1 - загорается, если количество нажатий четное
Сначала добавим лампы в FIO:

Зеленая лампа должна загореться, когда мы нажмем 10 раз. Можно было бы изменить максимальное значение счетчика с 1000 на 10 и поставить лампу на выход Q. Однако, в таком случае счет после 10 прервется. Этот вариант не подходит.
Значит, нужно как-то сравнить текущее значение счетчика с 10, и если оно больше или равно 10, зажечь лампу.
Такой блок есть в Codesys, он называется GE (greater equal = больше или равно):

Важно: при использовании блоков сравнения важен порядок, если мы математически хотим узнать результат сравнения a>b, то a будет на верхнем входе, а b - на нижнем.
В нашем случае, имеем выражение counterValue1 >= 10, значит в коде это будет выглядеть так:

А что на выходе? Что должно произойти, если значение счетчика >= 10? Должна загореться зеленая лампа. Поэтому добавляем через присвоение зеленую лампу qLampGreen на выход сравнения:

И код целиком:

Можно проверить рабту первой лампы (не забудьте добавить лампы в таблицу входов-выходов в codesys)
Теперь нужно разобраться со второй лампой. Красная лампа горит, если число нажатий (текущее значение счетчика) - четное. Четное число - это такое число, которое делится на 2 без остатка. Без остатка - это значит остаток = 0. В codesys есть блок, который позволяет вычислить остаток от деления одного числа на другое. Он называется MOD:

Мы проверяем остаток от деления counterValue1 на 2:

На выходе будет появляться число, равное остатку деления. В случае деления на 2 может быть только 2 варианта - 1, если число нечетное и 0, если четное. Напоминает сигналы true и false, верно? Но остаток от деления - это число типа INTEGER, а сигналы true/false, которые подойдут для управления лампой, имеют тип BOOL. Это значит, что нам нужно преобразовать Integer в Bool, и тогда мы сможем напрямую использовать этот остаток от деления для управления лампой, без доп блоков. Для преобразования типов есть блок "Конверсия":

Вместо ??? в названии блока записываем bool и получаем:

Теперь на выход можно присоединить красную лампу qLampRed (через присвоение):

Итак, работа будет следующей:

А нам нужно, чтобы при четном числе лампа включалась. Значит нужно сигнал на выходе инвертировать:

Задание выполнено.

Last updated