Найти в Дзене
yura2507

Учимся программировать промышленную автоматику на примере ОВЕН ПР. Часть 2.

Оглавление

Здравствуйте!

Вчера мы с вами начали разговор о программировании на графическом языке FBD (или его логическом развитии – CFC).

Сегодня предлагаю изучить функции, и сделать несколько простых примеров на функциях. Медленно разогреваемся.

Немного занудства:

Если вы нашли ошибки, или неточности, не стесняйтесь мне об этом сообщить, с большой радостью сделаю интернет грамотнее.
Да, мне тоже не нравится Дзен, бесконечная реклама из-за которой невозможно нормально читать материал, но другой площадки для написания статей у меня нет.
Друг мой, на написание этой, предыдущей и будущих статей я потратил 56 часов своего личного времени, вечера и ночи, которые мог провести у телевизора, будь сдержан в комментариях, уважай чужой НЕ оплачиваемый труд.
Вспомним вчерашнее поле. Далее будем работать с цифрами этого поля.
Вспомним вчерашнее поле. Далее будем работать с цифрами этого поля.

Функции. 3.

Да! Все операции по соединению кубиков, по перетаскиванию их, делаются мышкой. Просто берём и тянем, ничего не бойтесь, Ctrl+Z поможет.

Логические функции. 4.

Всего 4 функции – И, ИЛИ, НЕ, Исключающее ИЛИ.

Принцип работы крайне прост.

«И» – имеет 2 входа и 1 выход, если на оба входа приходит Истина, или True, или единица (условно – включенный выключатель), тогда на выходе будет Истина. Если нужно получить «И» с 3,4 или более входами, можно их объединить, в случае объединения на выходе «И», истина появится лишь тогда, когда все 4 «выключателя» включены.

«ИЛИ» – имеет 2 входа и 1 выход, также как и «И» можно объединять на любое количество входов, принцип работы простой – если на каком-то входе есть Истина, или на обоих входах Истина, тогда выход – Истина.

«НЕ» – оператор отрицания, если на входе Истина, на выходе ничего (Ложь). И наоборот.

«Исключающее ИЛИ» – схоже с «ИЛИ» за исключением лишь того, что, если на обоих входах Истина, на выходе будет Ложь.

-3

Арифметические функции.

Тут как в школе, сложение, вычитание, умножение, деление и т.д..

Если бы это был язык ST – тогда важно старшинство ((А+Б)\В). В случае с кубиками всё проще, что хотим, то и получаем, от первого кубика к последнему, то есть, если первый кубик сложение, а второй умножение, выполнение арифметической операции пройдёт именно в этом порядке, сначала сложение, потом умножение.

-4

И в этом примере встречаемся с новыми данными из функционального поля 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%.

Нам потребуются все вышеописанные операторы.

-6

Вышеописанный пример можно скачать - 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, увидеть ошибки и исправить их добавлением новых функций.

Ну что же, Функции мы с вами освоили, пора переходить к функциональным блокам.

На сегодня заканчиваю, в следующий раз поговорим про Функциональные Блоки - это уже интереснее, и ближе к более серьёзным примерам.

До встречи, пока!

Следующая часть уже готова к вашему прочтению: