Задача простая.
Управление вытяжкой по двум датчикам температур (ai_0, ai_1)
Если хотя бы по одному попадаем в диапазон (у каждого свой)
то включаем,
дополнительно введены
принудительный стоп (дискретный вход 1)
принудительный старт (дискретный вход 2)
стоп имеет приоритет (если включен, то пуск невозможен)
Переключение экранов - клавиша F1.
Экран1 - вывод текущего состояния
Экран2 - настройка диапазона датчика 1
Экран3 - настройка диапазона датчика 2
Включение вытяжек распределено на три выхода с задержкой 5 с
выход 0 - включается сразу
выход 1 - через 5 секунд
выход 2 - через 10 секунд
Начнем. Датчики температур. Для них используем макросы из конструктора вентиляций:
Раскроем один, на один уровень
Перейдем к составлению программы.
Сначала займемся логикой, а интерфейсом потом.
Сделаем макрос попадания в интервал
Входы:
limit_up - верхний предел (задается в настройках)
te1 - текущая температура
limit_down - нижний предел (задается в настройках)
use - флаг использования (если false, то не включаем)
Основа макроса блок мин-макс
В блоке мин-макс нас интересуют выходы ">max" и "<min". Если находимся в диапазоне, то они оба "0", если хотя бы один "1", то не включаем. Блок "or-not" как раз и выполняет эту операцию, на выход добавляем "И" для отработки флага 'use'.
Это все легко пока, сверху на это надо навесить кнопки, вывод на экран и настройки. Пойдем от простого к сложному.
Логика простая, если нет блокировки 'force_stop') и есть хотя бы один сигнал включения, то на выход подаем "1".
Вот как это выглядит в программе
За макросом добавлены задержки (оказалось, что вентиляторов 6, и чтоб снизить пусковые токи, запускаем парами с интервалом 5 с.)
Теперь самое интересное - интерфейс с пользователем. У меня обычно это самая трудоемкая часть программы.
Программа имеет три экрана:
- первый - вывод температур, состояние вентиляторов, внешняя блокировка есть/нет
- настройки интервала 1
- настройки интервала 2
Работу с экранами придется делать стандартными блоками (контроллер не поддерживает смарт)
Для первого экрана я создал три макроса show_te (2шт) и screen1
Макрос "SHOW_TE". Выводит температуру датчика, его имя (датчик 1(2)), если датчик в ошибке, то имя сменяет слово "ошибка" раз в секунду.
Входы:
- alarm_sens - ошибка датчика
- enable - включить экран
- sensor - значение температуры с датчика
- Y - номер строки, куда выводим
Макрос выводит строчку "вентилятор ВКЛ / ВЫКЛ" (выбор строчки через преобразование BOOL_TO_INT сигнала "fan_work")
И строчку с надписями "внешняя блокировка/принудительно вкл/АВТО". Выбор строки построен на мультиплексорах (достаточно гибко получается)
На самом деле - пока все просто.
Сейчас рассмотрим переходы между экранами. Переключение я сделал максимально просто - нажатие кнопкой F1.
Посмотрим. что у него внутри
Идея в следующем. Если нет редактирования в каком либо окне (входы LOCK), то при нажатии кнопки F1 (вход KEY_SWITCH), сигнал проходит на детектор переднего фронта, фронт увеличивает значение счетчика, счетный выход подключен к демультиплексору, который вывешивает единицу, на выход, который задает счетчик. Этот экран становится активным. При переполнении счетчика - он сбрасывает сам себя и включает первый экран.
Осталось рассмотреть скрины с уставками, в них реализованы функции:
- вывод и выбор уставки
- редактирование выбранной уставки
- блокировка перехода на другой экран во время редактирования
- Запись в энергонезависимую память