Здравствуйте!
Я хочу показать, как пишется программа для управления технологическим оборудованием на ПЛК.
Чаще всего я имел дело с ПЛК производства Schneider Electric. Выбранный мной для данной задачи Quantum является самым мощным и дорогим ПЛК данного производителя. Он может управлять оборудованием с тысячами сигналов, для светофора в реальной жизни его никто, естественно, использовать не будет.

Автоматизацией светофоров я никогда не занимался, поэтому алгоритм придумал сам. Вот он:
1. Светофор для регулируемого пешеходного перехода. Т.е. светофор для машин, светофор для пешеходов и кнопка для пешеходов, нажав которую, пешеход уведомляет о желании перейти дорогу.
2. После старта программы загорается зеленый для машин и красный для пешеходов.
3. После нажатия кнопки пешеходом начинает мигать зеленый для машин, затем загорается желтый, затем красный. После этого загорается зеленый для пешеходов, через заданное вре��я он начинает мигать, загорается красный для пешеходов, после этого для машин загорается желтый и красный, затем зеленый.
4. В течение заданного промежутка времени после зеленого на пешеходном светофоре нажатие кнопки пешеходом не запускает алгоритм перехода. Алгоритм перехода запускается в таком случае только по истечению заданного времени.
Программирование ПЛК ведется в среде программирования Unity на языках стандарта МЭК 61131-3. В данный стандарт входят 5 языков. Для примера я выбрал язык функциональных блоков – FBD.
Вот браузер проекта в Unity:

Конфигурируем ПЛК:

ПЛК состоит из монтажной панели, блока питания (1), контроллера (2), модуля дискретного ввода на 32 сигнала 24В постоянного тока (4), модуля дискретного ввода на 32 сигнала 24В постоянного тока (5). В реальном проекте монтажных панелей, подключенных к одному контроллеру по различным сетям, могут быть десятки, а модулей ввода-вывода – сотни.
Создаем переменные необходимых типов в редакторе переменных:

Переменные, привязанные к каналам модулей ввода-вывода имеют адрес, показывающий, к какой корзине, модулю и каналу привязан сигнал.
Программа состоит из секций, выполняемых каждый цикл сканирования контроллера по порядку.
Упрощенно цикл сканирования контроллера выглядит так:
1. Чтение входных сигналов из модуля ввода в переменные с адресам.
2. Выполнение секций.
3. Запись значений из переменных с адресами в выходные сигналы модулей вывода.
4. Переход на п.1.
Создаем секцию Clock с генератором импульса периодом 0,5 секунды. Блок TP при изменении входного сигнала из 0 в 1 на выходе выдает импульс заданной длительности.

Здесь и ниже скриншоты секций приведены в режиме анимации, а не режиме редактирования. На них отображены значения переменных в текущий момент времени при подключении к ПЛК с загруженной программой (числа для числовых переменных, цвет зеленый (1)-красный (0) для булевских).
Секция Main обрабатывает основную логику.
Блок SR устанавливает выход в 1 при S1=1 и сбрасывает выход в 0 при R=1.
Блок R_TRIG устанавливает выход на 1 цикл сканирования в 1 при переходе входа из 0 в 1 (детектор переднего фронта).
Блок F_TRIG устанавливает выход на 1 цикл сканирования в 1 при переходе входа из 1 в 0 (детектор заднего фронта).
Переменная inButton, привязанная к каналу кнопки, заменена в секции на inButtonForTest для того, чтобы можно было изменить ее значение на симуляторе контроллера без реального оборудования.

Секция Outputs формирует выходные сигналы для управления лампами светофоров.

Загружаем проект в симулятор контроллера:

Значение любых переменных можно посмотреть в анимационной таблице:

Но для удобства отладки можно сделать экран оператора с простой графикой, анимация которой привязана к переменным:

Пробуем перейти дорогу:

Не ожидал, что для управления такого простого объекта, как светофор, потребуется 30 блоков.
В следующей статье покажу, как написать данную программу, используя все языки стандарта МЭК 61131-3 одновременно.

UPD. Исправил ошибку в названии стандарта.