Это свершилось! Представьте себе, в ПР от ОВЕН теперь можно создавать функциональные блоки на ST.
Да-да, те самые загадочные блоки, которые раньше казались чем-то из разряда космических технологий. Пока что всё не так просто – готовых библиотек нет, как у бабушки пирожков с капустой на базаре – надо самому лепить. Но работать уже можно, и это круче, чем когда у тебя наконец заработал старенький принтер после полугода мучений.
Овеновцы – настоящие герои нашего времени!
Они не сидят сложа руки, а ежемесячно дорабатывают свою IDE OwenLogic, словно пчёлы на пасеке. Я эту статью писал довольно давно, и сейчас уже появились библиотеки для ПР205, причем такие удобные штуки как SYS.xxx (TON, TOF и прочие) позволяют не париться с триггерами и таймерами. Хотя писать триггеры вручную было сродни игре в русскую рулетку: вроде бы знаешь принцип работы – но лучше не рисковать.
Давайте поговорим о трёх легендарных блоках: R_TRIG, F_TRIG и TOF.
Их мы сами напишем – пока стандартных библиотек нет, приходится быть программистами-кулинариями: смешиваем ингредиенты из кода и получаем вкусный функциональный блок. После этого я даже перепишу свой домашний алгоритм включения и отключения света из CFC в ST – потому что кто сказал, что домашняя автоматика должна быть скучной?
Теперь немного теории от меня – правда без занудства! Функции в Owen Logic появились давно, но они как те друзья на вечеринке: у них есть свои ограничения.
Например, функция может иметь только один выход (даже если где-то там в других IDE можно несколько), а внутренняя память функции — это миф вроде единорога или честного политика. Локальные переменные функции при следующем цикле программы сбрасываются быстрее, чем новогодние обещания.
А теперь практика! Давайте создадим два простеньких детектора переднего и заднего фронтов: R_TRIG и F_TRIG. Можно написать их по-разному: с IF или без него – главное чтобы работало!
Представьте себе ситуацию: подали логическую единицу на вход «I», программа начинает выполнять строки кода по порядку — словно студент читает лекцию по расписанию.
Сначала установим выход Q в false (логический ноль). Потом проверяем: если «I» равно TRUE (то есть «включено»), а внутренняя память M равна FALSE (то есть «не включено»), тогда присваиваем Q значение TRUE — вот и мгновение истины! Далее устанавливаем M равным I — то есть запоминаем состояние входа.
Затем цикл заканчивается и возвращается к первой строке кода снова — как будто повторяется утренний будильник студента: сначала хочется выключить всё нафиг (Q:=false), но память M помнит своё состояние — поэтому пока «M» TRUE — Q не будет снова TRUE. Только когда уберём единицу с входа «I», память сбросится — можно снова подавать сигнал.
В итоге R_TRIG выдает логическую единицу всего на один цикл программы или ПЛК — словно миг световой вспышки камеры во время важного момента на вечеринке.
F_TRIG работает похожим образом – думаю вы догадались без моих объяснений!
А теперь задачка посложнее… Представьте длинный коридор-прихожую длиной почти 12 метров (да-да, я об этом уже сто раз говорил!).
Задача была простой: иметь возможность включать и выключать свет как из прихожей, так и с другого конца коридора. Это как если бы у вас был пульт управления светом для всей квартиры – только сделанный своими руками!