Переходим к следующему шагу: программное обеспечение (ПО) ПЛК.
Особенность ПО для ПЛК заключается в его названии: по определению универсального ПО не существует, каждый раз ПЛК программируется под конкретную задачу, конкретную логику работы. Даже в случае, когда основная микропрограмма фиксирована, у ПЛК есть свой язык программирования со своим интерфейсом настройки. Такая разработка сильно выходит за рамки простого бытового ПЛК, да и задача описания логики работы на языке программирования AVR сопоставима по сложности с программированием логики работы, например, в среде CodeSys. Поэтому примем, что программирование логики работы будет реализовано через программу на языке Си, а настройка микроконтроллера - загрузкой программы через интерфейс ISP
Не будем касаться деталей, например, относительно использования бут-лоадера и т. п., рассмотрим лишь общие принципы. Предполагается, что далее, возможно, с использованием специальной литературы, читатель напишет логику работы по своим требованиям. Кратко распишем основные блоки, полный исходный текст программы размещён на сайте журнала.
Структурно программа состоит из системных аппаратных настроек и основного цикла. Последний, в свою очередь, состоит из блока опроса входов, логического обработчика, блока установки значения выходов. Предварительно необходимо запрограммировать соответствующие разряды конфигурации на использование внешнего кварцевого резонатора.
Аппаратные настройки включают в себя конфигурирование входов/выходов микроконтроллера, выведенных на многофункциональный разъём в соответствии с алгоритмом их использования, настройку системного интерфейса UART (как минимум для установки ЧРВ) и настройку интерфейса I2C в режиме мастера (табл. 1).
Таблица 1
Скорость работы интерфейса I2C выбрана небольшой, соответствующей минимальной для установленных устройств. Лучше, конечно, настраивать её при каждом обращении к шине.
Главный цикл программы начинается с проверки символа в канале последовательного порта, его обработки (если он есть) и опроса входов. Пример опроса коммуникационного порта приведён в табл. 2.
Таблица 2
Каждому порту ввода соответствует определённый бит в прочитанной переменной. Целесообразно завести два набора переменных, отражающих предыдущие значения входов и новые, чтобы для обработки были доступны четыре состояния: выключатель (предполагаем, что выключатели подключены между выходом и общим проводом) замкнут, разомкнут, был включён, был выключен. Тогда логика работы будет оперировать не с состоянием выключателя, а с действиями с ним (включение, выключение), что даст возможность параллельно управлять выходами как выключателями, так и внешними командами.
Один из выключателей используем для включения режима "имитация присутствия". В этом режиме (проверка нажатого состояния выключателя идёт первой командой логического блока) состояние других выключателей не опрашивается, а из ПЗУ считывается предварительно запрограммированный набор команд включения/выключения выходов с временной меткой, включающей день недели. Если эта метка соответствует времени ЧРВ, устанавливается состояние соответствующего выхода.
В обычном режиме логический блок выполняет стандартные проверки: если выключатель включился, надо активировать соответствующий выход, если выключился - деактивировать. Так, кстати, легко делать любые комбинации "проходных" выключателей.
Можно добавить ещё немного логики, например, выключение режима "имитация присутствия" устанавливает выходы в соответствии с состоянием основных выключателей, а его включение выключает всё освещение в доме. Или как-то иначе.
После блока логики необходимо установить физические выходы в нужное состояние. Тут следует обратить внимание на то, что расширитель PCF8574Р не имеет раздельных режимов ввода или вывода, поэтому биты, соответствующие входам при записи значения в расширитель, необходимо установить в логическую 1, например, как показано в табл. 3 (для DD3).
Таблица 3
На этом разработка своего контроллера завершена. Полученное устройство обладает всеми функциями "настоящего" ПЛК: внутренняя логика работы (причём достаточно сложная), возможность управления внешними командами от домашнего сервера, удобное подключение управляющих сигналов (выключатели) и управляемых устройств (источники света) к контроллеру без внешних колодок, лёгкий доступ к порту программирования для загрузки управляющих программ. И огромные возможности для развития: журналирование включений/выключений освещения, в зависимости от времени включение яркого или дежурного освещения, возможность формирования различных задержек выключения света, обработка внешних датчиков движения с включением сразу света в коридоре и т. д. и т. п.
И это только одно из возможных применений. Выбранная архитектура позволяет разрабатывать исполнительные платы любой сложности без изменений в управляющей, а наличие внешних выводов многофункционального разъёма, напрямую подключённых к микроконтроллеру, - использовать внешние индикаторы (например, на основе TM1637), 1-wire датчики температуры и т. д. Даже сделать подключение к Ethernet через SPI-интерфейс. И не забывайте, сразу было предусмотрено, что ПЛК могут быть объединены друг с другом, это многократно расширяет его возможности.
Автор: И. Решетников, г. Видное Московской обл.