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

Функциональные блоки ST (Structured Text) в ПР205.

Сегодня внеплановое включение, многим из вас эта тема будет не особо понятна и интересна, но вы не отключайтесь, скоро вернемся к строительной тематике! Это свершилось! Наконец-то теперь в ПР от ОВЕН можно создавать функциональные блоки на ST! Пока всё не очень просто, нет привязанных, готовых библиотек, но в полноценном режиме работать уже можно. Upd_01_2025. Овеновцы просто молодцы, и они буквально ежемесячно дорабатывают IDE OwenLogic. Данная статья была написана довольно давно, и сейчас уже появились библиотеки и прочие нюансы, касающиеся лучшего на сегодняшний день ПР - ПР205. Суть статьи не меняется, но писать триггеры и таймеры уже не требуется, все они могут быть вызваны через ключ SYS.xxx (TON, TOF и т.д.). Ну а триггеры и раньше писать не стоило:), зная принцип их работы - вы можете в любом участке кода написать этот "триггер". Продолжим:). Сегодня будет небольшая запись про новые функции Owen Logic, и как с их помощью можно упростить жизнь. Рассмотрим три стандартных блока R
Оглавление

Приветствую вас друзья!

Сегодня внеплановое включение, многим из вас эта тема будет не особо понятна и интересна, но вы не отключайтесь, скоро вернемся к строительной тематике!

Это свершилось! Наконец-то теперь в ПР от ОВЕН можно создавать функциональные блоки на ST!

Пока всё не очень просто, нет привязанных, готовых библиотек, но в полноценном режиме работать уже можно.

Upd_01_2025.

Овеновцы просто молодцы, и они буквально ежемесячно дорабатывают IDE OwenLogic. Данная статья была написана довольно давно, и сейчас уже появились библиотеки и прочие нюансы, касающиеся лучшего на сегодняшний день ПР - ПР205. Суть статьи не меняется, но писать триггеры и таймеры уже не требуется, все они могут быть вызваны через ключ SYS.xxx (TON, TOF и т.д.). Ну а триггеры и раньше писать не стоило:), зная принцип их работы - вы можете в любом участке кода написать этот "триггер". Продолжим:).

Сегодня будет небольшая запись про новые функции Owen Logic, и как с их помощью можно упростить жизнь.

Рассмотрим три стандартных блока R_TRIG, F_TRIG и TOF, которые сами же и напишем, т.к. пока стандартных библиотек в функционале Owen Logic нет.

После того как прочитаете эту запись, рекомендую прочитать и следующую, там тоже есть примеры с ST:

А также перепишем блок включения и отключения света, на примере моего домашнего алгоритма. Перепишем его из CFC в ST.

-2

Погнали.

Прежде всего немного теории, не буду углубляться, переписывать чьи-то статьи, расскажу так, как сам это понимаю, вы же помните - я только учусь, вместе с вами!

Функции в Owen Logic появились давно, но функция это всего лишь функция, она имеет ряд ограничений.

- У функции может быть только 1 выход (в некоторых IDE функция может иметь несколько выходов).

- У функции нет внутренней памяти, и она не запоминает значения своих локальных переменных, и при следующем цикле основной программы её локальные переменные сбросятся.

А теперь к практике, сейчас вы поймёте, о чем я сказал выше.

Давайте создадим 2 простейших функциональных блока, R_TRIG и F_TRIG, детекторы переднего и заднего фронтов. Raise и Fall Trigger.

Данные триггеры можно написать по-разному, с использованием IF и без его использования, нет какого-то правильного кода, есть рабочий и не рабочий.

-3

Давайте разберем один из них, 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.

На скриншоте постарался подробно описать происходящий цикл, попробуйте с моими подсказками разобрать его самостоятельно.

-4

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

Сначала расскажу, что и как, а чуть ниже прикреплю скриншоты.

У меня дома есть длинный коридор\прихожая (100 раз уже это писал и рассказывал:)). Длина этого коридора-прихожей практически 12 метров.

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

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

Чтобы не идти через весь дом, для того чтобы погасить свет в коридоре, к тому же прихожая используется только для входа в дом, а коридор для постоянного пребывания.

Затем задача усложнилась. Т.к. в доме никто не хочет выключать свет:), пришлось сделать таймер отключения по датчику движения, коих в прихожей и коридоре 2 штуки.

Суть простая, свет в прихожей должен гореть 3-N минут, значения можно корректировать с дисплея ПР, а в Коридоре 5-N минут, по истечению этого времени свет должен по очереди отключиться и там, и там. Но! Только в том случае, если нет движения. Если люди находятся в коридоре\прихожей, значит свет им требуется.

А также! Для удобства проживания, потребовалось добавить ещё и включение, и выключение света с телефона, чтобы встать с дивана и сказать «тётке» в телефоне, включи свет в коридоре, и идешь себе спокойно, куда шел, не подходя к выключателю.

Пробовал так же внедрить включение света по движению, но данная функция показалась всем жителям излишней, т.к. далеко не всегда требуется включать свет.

Переходим к прошлой, громоздкой реализации на FB или CFC, и к настоящей, компактной, на ST.

Так было
Так было
Блок 8OR (Так было)
Блок 8OR (Так было)
Это просто функция, она так же была ранее
Это просто функция, она так же была ранее

А вот так стало:

Весь текст можно уместить всего в 7 строк! Это я растянул сознательно, для удобства (моего) чтения.
Весь текст можно уместить всего в 7 строк! Это я растянул сознательно, для удобства (моего) чтения.

На этом сегодняшний обзор заканчиваю. ОВЕН молодцы, хоть и не быстро, но идут в нужном направлении. Думаю, что в ближайшее время реализуют библиотеки, и пропишут стандартные библиотеки стандартных блоков, вроде TON\TOF\TP и прочего, а то писать каждый блок самому – лениво:).

Желаю всем вам удачи, и новых открытий. Всем Мир! Пока!