Приветствую вас друзья!
Сегодня внеплановое включение, многим из вас эта тема будет не особо понятна и интересна, но вы не отключайтесь, скоро вернемся к строительной тематике!
Это свершилось! Наконец-то теперь в ПР от ОВЕН можно создавать функциональные блоки на ST!
Пока всё не очень просто, нет привязанных, готовых библиотек, но в полноценном режиме работать уже можно.
Upd_01_2025.
Овеновцы просто молодцы, и они буквально ежемесячно дорабатывают IDE OwenLogic. Данная статья была написана довольно давно, и сейчас уже появились библиотеки и прочие нюансы, касающиеся лучшего на сегодняшний день ПР - ПР205. Суть статьи не меняется, но писать триггеры и таймеры уже не требуется, все они могут быть вызваны через ключ SYS.xxx (TON, TOF и т.д.). Ну а триггеры и раньше писать не стоило:), зная принцип их работы - вы можете в любом участке кода написать этот "триггер". Продолжим:).
Сегодня будет небольшая запись про новые функции Owen Logic, и как с их помощью можно упростить жизнь.
Рассмотрим три стандартных блока R_TRIG, F_TRIG и TOF, которые сами же и напишем, т.к. пока стандартных библиотек в функционале Owen Logic нет.
После того как прочитаете эту запись, рекомендую прочитать и следующую, там тоже есть примеры с ST:
А также перепишем блок включения и отключения света, на примере моего домашнего алгоритма. Перепишем его из CFC в ST.
Погнали.
Прежде всего немного теории, не буду углубляться, переписывать чьи-то статьи, расскажу так, как сам это понимаю, вы же помните - я только учусь, вместе с вами!
Функции в Owen Logic появились давно, но функция это всего лишь функция, она имеет ряд ограничений.
- У функции может быть только 1 выход (в некоторых IDE функция может иметь несколько выходов).
- У функции нет внутренней памяти, и она не запоминает значения своих локальных переменных, и при следующем цикле основной программы её локальные переменные сбросятся.
А теперь к практике, сейчас вы поймёте, о чем я сказал выше.
Давайте создадим 2 простейших функциональных блока, R_TRIG и F_TRIG, детекторы переднего и заднего фронтов. Raise и Fall Trigger.
Данные триггеры можно написать по-разному, с использованием IF и без его использования, нет какого-то правильного кода, есть рабочий и не рабочий.
Давайте разберем один из них, R_TRIG.
Что мы видим, у нас есть:
- Входной «сигнал» I
- Выходной «сигнал» Q
- Переменная М, сохранение данных которой нам как раз и нужно, для реализации правильной работы функционального блока (ФБ), функция не запоминает информацию из прошлого цикла, и наша М всегда будет равна I, что не даст нам выполнить корректно алгоритм.
Алгоритм:
«Подаем» на вход "I" ФБ логическую единицу, программа выполняет цикл построчно, и как заканчиваются строки возвращается к первой строке.
1. Q:=false; //устанавливаем на выходе логический ноль
Проверяем, I:=TRUE? Да! M:=FALSE? Да, ведь мы только что подали единицу на вход "I".
2. if I and not M then Q:=true; end_if //Проверяем, если I:=TRUE, и M:=False, присваиваем Q:=TRUE
Дошли до последней строки и установили на "M" логическую единицу, т.к. в данный момент I:=TRUE
3. M:=I;
4. Хорошо, теперь у нас с вами и на выходе Q:=TRUE и локальная переменная "М" тоже TRUE.
5. Цикл закончен, возвращаемся на первую строчку и присваиваем Q логический ноль.
6. Q:=false;
7. В следующей строчке наше условие уже не может быть выполнено, т.к. M:=TRUE, следовательно, до тех пор, пока "M" не станет FALSE, Q не будет TRUE.
А когда "M" будет FALSE? Правильно, тогда, когда мы с вами уберем логическую единицу (TRUE) с входа "I". И лишь тогда, можно будет вновь подать TRUE на вход "I", и повторить установку логической единицы на выход "Q".
В случае с R_TRIG, логическая единица появляется на выходе ФБ лишь на «мгновение», пока выполняется один цикл ПР, или ПЛК.
ФБ F_TRIG, как мне кажется вы сможете разобрать и без меня.
Переходим дальше. Теперь задачка посложнее.
Создадим ФБ таймер TOF на ST.
На скриншоте постарался подробно описать происходящий цикл, попробуйте с моими подсказками разобрать его самостоятельно.
Ну а теперь давайте вернёмся к тому, с чего начали, к реализации включения и выключения света в прихожей и коридоре моего дома.
Сначала расскажу, что и как, а чуть ниже прикреплю скриншоты.
У меня дома есть длинный коридор\прихожая (100 раз уже это писал и рассказывал:)). Длина этого коридора-прихожей практически 12 метров.
- На самом входе в прихожей стоит 2-ух клавишный кнопочный выключатель, это тот, который без фиксации, всегда в одном положении.
- В самом конце коридора, перед спальней, стоит тоже 2-ух клавишный выключатель, но, т.к. в том краю дома есть второй с\у, этот 2-ух клавишный выключатель пришлось разделить. Одна клавиша осталась без фиксации, а вторую пришлось немного переделать, и сделать с фиксацией для включения света в с\у.
Задача была простая. Прежде всего, мы из прихожей должны иметь возможность включать и выключать свет и в коридоре, и в прихожей. А в другом конце дома, мы должны иметь возможность свет отключать и в коридоре, и в прихожей, а вот включать только в коридоре.
Чтобы не идти через весь дом, для того чтобы погасить свет в коридоре, к тому же прихожая используется только для входа в дом, а коридор для постоянного пребывания.
Затем задача усложнилась. Т.к. в доме никто не хочет выключать свет:), пришлось сделать таймер отключения по датчику движения, коих в прихожей и коридоре 2 штуки.
Суть простая, свет в прихожей должен гореть 3-N минут, значения можно корректировать с дисплея ПР, а в Коридоре 5-N минут, по истечению этого времени свет должен по очереди отключиться и там, и там. Но! Только в том случае, если нет движения. Если люди находятся в коридоре\прихожей, значит свет им требуется.
А также! Для удобства проживания, потребовалось добавить ещё и включение, и выключение света с телефона, чтобы встать с дивана и сказать «тётке» в телефоне, включи свет в коридоре, и идешь себе спокойно, куда шел, не подходя к выключателю.
Пробовал так же внедрить включение света по движению, но данная функция показалась всем жителям излишней, т.к. далеко не всегда требуется включать свет.
Переходим к прошлой, громоздкой реализации на FB или CFC, и к настоящей, компактной, на ST.
А вот так стало:
На этом сегодняшний обзор заканчиваю. ОВЕН молодцы, хоть и не быстро, но идут в нужном направлении. Думаю, что в ближайшее время реализуют библиотеки, и пропишут стандартные библиотеки стандартных блоков, вроде TON\TOF\TP и прочего, а то писать каждый блок самому – лениво:).
Желаю всем вам удачи, и новых открытий. Всем Мир! Пока!