Здравствуйте!
Вчера мы с вами начали разговор о программировании на графическом языке FBD (или его логическом развитии – CFC).
Сегодня предлагаю изучить функции, и сделать несколько простых примеров на функциях. Медленно разогреваемся.
Немного занудства:
Если вы нашли ошибки, или неточности, не стесняйтесь мне об этом сообщить, с большой радостью сделаю интернет грамотнее.
Да, мне тоже не нравится Дзен, бесконечная реклама из-за которой невозможно нормально читать материал, но другой площадки для написания статей у меня нет.
Друг мой, на написание этой, предыдущей и будущих статей я потратил 56 часов своего личного времени, вечера и ночи, которые мог провести у телевизора, будь сдержан в комментариях, уважай чужой НЕ оплачиваемый труд.
Функции. 3.
Да! Все операции по соединению кубиков, по перетаскиванию их, делаются мышкой. Просто берём и тянем, ничего не бойтесь, Ctrl+Z поможет.
Логические функции. 4.
Всего 4 функции – И, ИЛИ, НЕ, Исключающее ИЛИ.
Принцип работы крайне прост.
«И» – имеет 2 входа и 1 выход, если на оба входа приходит Истина, или True, или единица (условно – включенный выключатель), тогда на выходе будет Истина. Если нужно получить «И» с 3,4 или более входами, можно их объединить, в случае объединения на выходе «И», истина появится лишь тогда, когда все 4 «выключателя» включены.
«ИЛИ» – имеет 2 входа и 1 выход, также как и «И» можно объединять на любое количество входов, принцип работы простой – если на каком-то входе есть Истина, или на обоих входах Истина, тогда выход – Истина.
«НЕ» – оператор отрицания, если на входе Истина, на выходе ничего (Ложь). И наоборот.
«Исключающее ИЛИ» – схоже с «ИЛИ» за исключением лишь того, что, если на обоих входах Истина, на выходе будет Ложь.
Арифметические функции.
Тут как в школе, сложение, вычитание, умножение, деление и т.д..
Если бы это был язык ST – тогда важно старшинство ((А+Б)\В). В случае с кубиками всё проще, что хотим, то и получаем, от первого кубика к последнему, то есть, если первый кубик сложение, а второй умножение, выполнение арифметической операции пройдёт именно в этом порядке, сначала сложение, потом умножение.
И в этом примере встречаемся с новыми данными из функционального поля 7. – Константы, Типы данных, и Переменные.
Константы – Фиксированные данные, будь то Истина или Ложь, Целое число или Число с плавающей запятой.
После того как вы перетащили мышкой «Константу», в окне свойств (1.) выбираем тип данных этой константы – Булевая, Цельночисленная, с Плавающей Запятой. Тип данных важен, в противном случае работать не будет, кубики для данных с плавающей запятой тоже имеются, к их названию добавляется f.
Чем проще тип данных – тем быстрее работает программа. Нет необходимости использовать данные с плавающей запятой, если достаточно цельного числа. Стремитесь к оптимизации во всём. Оптимальнее программа – быстрее выполнение.
Переменные – бывают также как и константы 3-ёх типов, BOOL, UDINT, FLOAT. Переменная может быть Выходная и Входная, правильнее сказать - это состояние переменной, или мы в неё записываем, или мы из неё читаем. В выходную мы получаем данные из блока или с входа ПР. Из входной задаем состояние входа блока (или выхода ПР).
После того как переменная перемещена на поле программы, щёлкаем по ней 2 раза мышью, попадаем в окно переменных. Задаем «Имя переменной», «тип её данных», «Энергонезависимость», «значение по умолчанию» и «комментарий». Если переменная в дальнейшем никуда не записывается (данные мы в нее записали, но ни где эти данные из нее не считываем), или необходимо задать ей стартовое значение, на ней нужно установить галочку «энергонезависимая», в противном случае не сможете видеть её статус в программе. Да, во всех ПЛК есть такое понятие как RETAIN переменные, без них никуда.
Существует 2 типа переменных – обычные и сетевые. Сетевые по умолчанию энергонезависимые, и они требуются для того, чтобы их данные можно было использовать для коммутации между различными устройствами (в сети ModBus, других сетей у ПР нет), обычные – нужны чтобы использовать внутри создаваемой программы или внутри только этого прибора (у некоторых приборов есть HMI, где можно использовать обычные переменные с основного поля). Энергонезависимая память ограничена, поэтому используйте эти (энергонезависимые) переменные лишь при необходимости.
Суть энергонезависимости заключается в том, чтобы сохранить данные переменной после отключения прибора. Обычные же переменные сбросят свои значения.
Функции сравнения или операторы сравнения.
Сравнение в CFC имеет всего 2 оператора, равенство и больше.
Казалось бы, всё просто если А=Б тогда на выходе Истина, или А>Б тогда на выходе Истина. Но есть один нюанс! Сравнение на равенство чисел с плавающей запятой невозможно, т.к. оно, число, может отличаться на 0,0001E-30 (Экспонента -30), и мы этого никогда не увидим. В OwenLogic это уже учли, и вы не сможете сравнивать «кубиками» число с плавающей запятой на равенство, но в случае использования языка ST (он так же есть в OwenLogic), эту ошибку можно допустить, будьте внимательны.
Особняком в функциях сравнения находится оператор выбора, Селектор, SEL или тернарная условная операция сравнения. Не спрашивайте, как он оказался в операторах сравнения:)…
Очень интересный оператор, который может пригодиться в различных ситуациях.
Принцип работы, изначально прост: если на входе 1 Ложь, на выходе число с входа 2, если на входе 1 Истина, на выходе число с входа 3. Но этот блок не так прост, при его помощи можно построить различные комбинации.
Остаются только Сдвиговые и Битовые функции, но о них мы поговорим позже.
Предлагаю закрепить полученный материал, и сделать небольшую программу.
В качестве примера – диммер, обычный двухклавишный, с яркостью лампы от 0 до 100%, или это может быть жалюзи, с открытием от 0 до 100%.
Нам потребуются все вышеописанные операторы.
Вышеописанный пример можно скачать - https://disk.yandex.ru/d/8da_Qyx_1KYYlQ
Для тех, кто пока ещё не знает принцип выполнения программ в ПЛК, будет не очень понятно почему цифра постоянно увеличивается, давайте я попробую вам объяснить почему так происходит.
Принцип работы ПЛК – циклическое выполнение программы, будь это текст, то вы читаете его от строчки к строчке, от начала до конца, и потом снова возвращаетесь в начало. В качестве переменной будет выступать количество раз прочтений, и это значение с каждым прочитанным разом будет увеличиваться на 1.
В ПЛК выполнение цикла всегда начинается с чтения входных данных, не важно, что это, физические входы или переменные.
Обращу ваше внимание на то, что я упускаю кое-какие нюансы, инициализацию и прочее, это вам пока не требуется. И да, не совсем «не важно» - очень даже важно, но для понимания, пусть пока будет не важно:).
После того как ПЛК прочитал данные, он начинает выполнять нашу программу, «от строчки к строчке», но в нашем случае, от кубика к кубику.
В нашем примере мы видим, на входе (физическом I1\I2 – DI1\DI2) появляется Истина (True), далее эта истина идёт на блок "И", и если у нас в блоке сравнения условие выполняется, а именно 100 > Lamp_1, тогда на выходе блока "И" – Истина. Следовательно, выполняется следующее условие ADD (Сложение) к переменной Lamp_1+4. Всё, программа завершена, т.к. дальнейшие условия не выполняются.
После этого все данные записываются на выходы ПЛК и условно в память переменных в том числе Lamp_1, в самом начале она имела значение 0, а в конце программы +4, это третий этап выполнения цикла. На самом деле это тоже немного иначе, но пока пусть это будет так.
Далее ПЛК снова смотрит статусы входных сигналов и переменных (переменные уже изменились в прошлом цикле), если I1 (DI1) всё ещё Истина, а Lamp_1 пока ещё не больше 100, тогда мы всё ещё выполняем операцию сложения.
Как только Lamp_1 станет больше 100, так сразу же сложение прекратиться, т.к. на блоке И будет – False, и на входе 1 SEL (Селектора), тоже буде False.
И вот вам домашнее задание:
Необходимо доработать этот алгоритм таким образом чтобы:
1. При нажатии обоих кнопок сразу – ничего не происходило, для кода, как будто они обе не нажаты.
2. Попробуйте изменить число в константе на 3, увидеть ошибки и исправить их добавлением новых функций.
Ну что же, Функции мы с вами освоили, пора переходить к функциональным блокам.
На сегодня заканчиваю, в следующий раз поговорим про Функциональные Блоки - это уже интереснее, и ближе к более серьёзным примерам.
До встречи, пока!
Следующая часть уже готова к вашему прочтению: