Я хочу показать, как пишется программа для управления технологическим оборудованием на ПЛК.
Чаще всего я имел дело с ПЛК производства Schneider Electric. Выбранный мной для данной задачи Quantum является самым мощным и дорогим ПЛК данного производителя. Он может управлять оборудованием с тысячами сигналов, для светофора в реальной жизни его никто, естественно, использовать не будет.
Автоматизацией светофоров я никогда не занимался, поэтому алгоритм придумал сам. Вот он:
1. Светофор для регулируемого пешеходного перехода. Т.е. светофор для машин, светофор для пешеходов и кнопка для пешеходов, нажав которую, пешеход уведомляет о желании перейти дорогу.
2. После старта программы загорается зеленый для машин и красный для пешеходов.
3. После нажатия кнопки пешеходом начинает мигать зеленый для машин, затем загорается желтый, затем красный. После этого загорается зеленый для пешеходов, через заданное время он начинает мигать, загорается красный для пешеходов, после этого для машин загорается желтый и красный, затем зеленый.
Урок светофор на Arduino UNO
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.
Программа для светофора (создание). Программирование логического контроллера, ПЛК. Часть 15.
Блок R_TRIG устанавливает выход на 1 цикл сканирования в 1 при переходе входа из 0 в 1 (детектор переднего фронта).
Блок F_TRIG устанавливает выход на 1 цикл сканирования в 1 при переходе входа из 1 в 0 (детектор заднего фронта).
Переменная inButton, привязанная к каналу кнопки, заменена в секции на inButtonForTest для того, чтобы можно было изменить ее значение на симуляторе контроллера без реального оборудования.
Секция Outputs формирует выходные сигналы для управления лампами светофоров.
Загружаем проект в симулятор контроллера:
Значение любых переменных можно посмотреть в анимационной таблице:
Но для удобства отладки можно сделать экран оператора с простой графикой, анимация которой привязана к переменным:
Пробуем перейти дорогу:
Не ожидал, что для управления такого простого объекта, как светофор, потребуется 30 блоков.
В следующей статье покажу, как написать данную программу, используя все языки стандарта МЭК 61131-3 одновременно.
UPD. Исправил ошибку в названии стандарта.
Источник: habr.com
Простой пример светофора

Светофор — хороший пример устройства, которое выполняет свою работу последовательно. В простейшей форме светофор имеет три состояния:
- Зеленый — иди
- Желтый — остановись, если сможешь
- Красный — стой!
Каждое состояние активно в течение некоторого временного интервала, и когда все заканчивается, то начинается с начала и повторяется снова и снова.
Давайте сделаем модель устройства светофора с несколькими электронными частями и XOD.
Схема #

Обзор структуры программы #
Создайте новый проект в XOD и назовите его что-то вроде этого my-traffic-light . Теперь у вас есть программа с одним патчем main . Что дальше?
У нас есть законченый концепт, который мы собираемся реализовать. Есть несколько способов это сделать. Рассмотрим один из них. Основная идея состоит в том, чтобы иметь одну патч-ноду для каждого состояния и соединительный (общий) патч, который будет связывать все ноды патча вместе. В нашем случае:
- state-green
- state-yellow
- state-red
- main — соединительный патч
У нас уже есть main , поэтому создайте патчи состояний. Нажмите “File → New Patch” (или Ctrl + N) и введите новое имя патча. Повторите три раза.
Примечание: Хотя именование патчей состояния с помощью префикса state- не обязательно, но это будет неплохой идеей и упростит понимание.
Теперь нам нужен механизм, позволяющий патч-нодам общаться друг с другом. Общая идия заключается в том, чтобы добавить импульсный вход на патчах состояний, чтобы начать это состояние, и добавить импульсные выходы, чтобы уведомить о завершении состояния.
Добавьте пару xod/patch-nodes/input-pulse и xod/patch-nodes/output-pulse каждого патча состояния:

Теперь каждое из наших состояний имеет вход и выход. Мы можем подключить их в цепочке, так что, когда одно состояние завершает работу, оно дает контроль над следующим состоянием. Давайте сделаем это на main :

Учимся создавать устройства на микроконтроллерах: светофор
Эта статья предназначена для начинающих, и тех, которые немного имеют представление о том, что такое микроконтроллер, и понимают что такое алгоритм. Вы узнаете насколько легко и быстро можно создавать цифровые устройства на основе микроконтроллеров AVR и, «вдыхать» в них жизнь, подчиняющуюся Вашим законам (алгоритму).
В качестве простого устройства автоматики я выбрал светофор, поскольку алгоритм его работы известен всем и каждому. Для проектирования и симуляции работы схемы светофора, (в дальнейшем устройства) я выбрал всеми известную программу ISIS Proteus Professional, с которой вы уже немного знакомы из статьи «обучающий видео курс для начинающих по микроконтроллерам» и возможно не только из неё.
Для создания прошивки, (программы для работы устройства) я выбрал графическую среду программирования Flowcode AVR. Которая, по моему мнению, (особенно для начинающих) будет очень интересна.
И не только тем, что написание программы происходит фактически построением алгоритма из кубиков, ромбиков и т.д., а ещё вдобавок, начинающий сам начинает понимать как всё-таки работает микроконтроллер, и что ему нужно для того что бы он делал то что от него требуют. Сам я могу писать на СИ , но если нужно создать что то несложное и очень быстро, да ещё и нет ограничений в быстродействии, ресурсах памяти и т.д., всегда запускаю Flowcode и алгоритм быстро, как бы сам собой, превращается в готовую прошивку.
Версии используемых в статье программ: ISIS Proteus Professional 7, и Flowcode AVR v4.3.6.61. Установите указанные программы на Ваш компьютер, и начнём работать. 1. Создадим схему нашего устройства, используя ISIS Proteus Professional.
Для начала создайте папку для выходных файлов проектов в корневом каталоге любого из дисков С или D или другого (например с именем “myprojects”), причём имя папки должно быть латинским (это для того что бы не ругался Flowcode, и не было потом проблем с компиляцией программы). Да и Вам будет удобно, будете знать, где лежат файлы Ваших проектов. Открываем или запускаем (кому как нравиться называть) ISIS Proteus Professional. Далее в выпадающем меню файл выбираем «сохранить проект как», или на английском «save as …», указываем путь сохранения файлов проекта (наша папка в корневом каталоге диска “myprojects”). Ну и вводим имя файла “svetofor” например, жмём кнопку сохранить. (см. рис.1,2) 
Рис. 1.
Рис.2. Далее нужно выбрать из многочисленной библиотеки компонентов необходимые нам. Так что же нам нужно из компонентов для реализации нашего проекта? Поскольку наше устройство не сложное, выберем недорогой микроконтроллер Attiny13A. Для этого в выпадающем меню «Библиотека» выбираем «выбор устройства» (рис.3), можно просто нажать кнопку «Р», в появившемся окне в поле «маска» набираем “attiny”(рис.4), и два раза кликнем по “attiny13”. Микроконтроллер теперь добавлен в список наших устройств. (рис.5)
Рис. 3.
Рис. 4.
Рис. 5. Далее выберем чем управлять микроконтроллеру, (в светофоре красный, желтый, зелёный) свет. Выбираем светодиоды, в поле «маска» набираем “led” , в категории “optoelectronics” выбираем (два раза кликаем на каждом) “led-red”, “led-green”, “led-yellow” .(рис.6)
Рис. 6. Теперь поскольку падение напряжения на светодиодах 2.2в, а питание у нас 5в., то нужно ставить ограничительные резисторы, для того, чтобы не вывести из строя порты (выходы) микроконтроллера. В поле маска “resistor”, в категории “modeling primitives” находим наш резистор “analog resistor primitive” и тоже два раза кликаем. (рис.7)
Рис. 7.
Рис. 8. Всё! Для построения модели нашего устройства у нас почти все есть (рис.8). Почему почти спросите Вы? Казалось бы, всё есть – «мозг» и «исполнительное устройство», но это не совсем так, поскольку нужен еще источник питания устройства, а точнее его модель. Ну об этом ниже. Начинаем собирать схему.
Правой кнопкой мыши кликаем на чистом листе и в появившемся меню выбираем «разместить», «компонент», “attiny13”(рис.9,10). Затем наши три светодиода и три резистора (рис.11). Далее выбираем «разместить», «терминал», “ground” . Это как раз и есть один из выводов питания нашей модели устройства (для наглядности схемы договоримся включить светодиоды с общим катодом), как раз этим катодам и нужен минус питания (земля). Обратите внимание на то, что у микроконтроллера отсутствуют выводы питания. Дело в том что программа работает с моделями компонентов, и соответственно выводы питания присущие любой из моделей считает скрытыми.
Рис. 9.
Рис.10.
Рис.11. Теперь выбираем выводы микроконтроллера, которые нам нужно будет запрограммировать на вывод данных (выход). Но нужно учесть, что вывод 1 (порт В5) нужен ещё и в качестве “RESET” для программатора, поэтому если мы его задействуем, то запрограммировать микроконтроллер сможем один только раз. Поэтому его трогать не будем, по крайней мере пока. И так обозначим себе следующее:
А. порт В0 будет управлять красным светодиодом(вывод 5);
Б. порт В1 – желтым(вывод 6);
В. порт В2 – зелёным(вывод 7). Устанавливаем карандашик на нужный вывод, кликаем левой кнопкой мыши и соединяем порты микроконтроллера с ограничительными резисторами(рис.12,13).
Рис.12
Рис.13 Аналогично соединим светодиоды по схеме с общим катодом, и подключим каждый анод на нужный резистор: красный на R1; желтый на R2; зелёный на R3 (рис.14). 
Рис.14. Любуемся созданной схемой, и замечаем что номиналы резисторов сильно велики для зажигания светодиодов, нужно где то порядка 300 Ом, а у нас 10кОм. Кликаем правой кнопкой на резисторе, выбираем в выпадающем меню «правка свойств», и устанавливаем нужный номинал резисторов (рис.15,16,17).
Рис.15.
Рис.16.
Рис.17. Вот теперь уже схема модели устройства под названием «светофор» готова. Можно на всякий случай нажать на дискетку и сохранить файл нашего проекта.
2. Напишем управляющую программу для нашего устройства при помощи Flowcode AVR v4.3.6.61. Запускаем Flowcode AVR v4.3.6.61. Выбираем “create a new flowcode flowchart”, в появившемся меню прокруткой выбираем тип микроконтроллера, нам нужен “Attiny13” (рис18,19,20). Далее появляется окно программы с панелями.
В выпадающем меню «файл» выбираем «сохранить как», и указываем путь к созданной нами папке в корневом каталоге диска “myproject”, называем файл его именем на английской раскладке клавиатуры “svetofor”. И мы готовы к написанию алгоритма программы.
Рис.18.
Рис.19.
Рис.20. Немного о Flowcode. Первая инструментальная панель — это панель команд
Рис.21. Перечень представленных команд (с лева — на право на рис.21). Input (ввод), Output (вывод), Delay (пауза), Decision (ветвление), Connection Point (две точки соединения), Loop(цикл), Macro (макрос), Component Macro (макрос компонента, добавленного в программу), Calculation (вычисление),String Manipulation (строковые операции), Interrupt (прерывание), C Code (блок кода на языке Си), Comment(комментарий). Ниже расположена вторая панель инструментов.
Рис.22 На ней расположено много всяких устройств, для подключения к портам микроконтроллера (рис.22). Вообще я прилагаю к статье “help” на русском языке по работе с этой программой, если что, то заглядывайте туда, (правда перевод там смешной, но разобраться можно). Далее давайте определимся с алгоритмом работы светофора и опишем его словами:
1. Зажигается красный свет и горит, к примеру — 5 секунд (не смейтесь, у нас же всё — таки не настоящий светофор с перекрёстка);
2. Зажигается желтый на 2 секунды (красный при этом не тухнет);
3. Тухнет красный и желтый;
4. Загорается зелёный на 5 секунд;
5. Зелёный мигает 3 раза;
6. Тухнет зелёный;
7. Загорается желтый на 2 секунды;
8. Тухнет желтый;
9. Повтор пункта 1 (или конец цикла). Теперь этот алгоритм нужно нам запрограммировать в наш микроконтроллер. Настроим выходы микроконтроллера, для этого на второй инструментальной панели выбираем «выходы» и «LED», на панели видим добавился наш светодиод (рис.23,24).
Рис.23
Рис.24 Кликнем на светодиоде правой кнопкой , выберем «расширенные свойства»(ext properties), выберем цвет, размер, и активный уровень (вспомним нашу модель в протеусе, светодиоды подключили с общим катодом, а значит активный уровень выбираем высокий) (рис.25,26) . Теперь ещё раз кликнем правой кнопкой на нём и выберем “connections” (вспомним модель в протеусе, у нас красный порт — В0, желтый — В1, зелёный — В2.) (рис.27,28). 
Рис.25
Рис.26
Рис.27
Рис.28 Таким образом подключаем все три наших светодиода (рис.29).
Рис.29 Теперь у нас есть чем управлять программно. На клетчатом фоне видим два связанных элемента алгоритма, они неизменно присутствуют всегда. Без них никак нельзя это “BEGIN” и “END”, то есть начало и конец выполнения программы. Поскольку микроконтроллеры AVR выполняют программу от начала и до конца, то выполнив «тело программы» он дойдёт до “END” и остановится.
Нам этого не нужно, светофор ведь должен работать всё время, пока его не отключат. Для этого установим бесконечный цикл выполнения нашей будущей программы. Для этого в первой панели инструментов находим значок “Loop”, что значит цикл, и перетягиваем этот значок на место, между “BEGIN” и “END” (рис.30) .
Рис.30 Теперь в теле этого цикла и будем осуществлять наш алгоритм. Первым пунктом у нас идёт — включить красный на 5 секунд. Перетягиваем значок “component macro” что значит макрос компонента, а компонент у нас это наш красный светодиод (кстати у него есть имя, он у нас LED0, это можно посмотреть если на нём кликнуть и посмотреть в панель свойств — “property” (рис.31,32).
Рис.31
Рис.32 Далее, два раза кликнув по значку «макрос компонента» выбираем LED0 и ON, что значит – включить светодиод 0 (рис.33).
Рис.33 Можно ещё вставить комментарий, что бы было легче ориентироваться по своему алгоритму. Перетянем значок “comment”, два раза на нём кликнем, и пишем свой комментарий (рис.34). 
Рис.34 Красный должен гореть 5 секунд, есть значок “DELAY” что значит задержка (пауза), перетянем его и в его свойствах укажем единицу времени ( с ), и их количество ( 5 ) (рис.35).
Рис.35 Пунктом 2 у нас идёт включение желтого на 2 секунды, при этом красный не тухнет. Снова: макрос компонента LED1 (он у нас желтый), выбираем LED1, ON, далее DELAY , выставляем 2 и единицы измерения – секунды (рис.36).
Рис.36 Далее пункт 3, тухнет красный и желтый. И пункт 4, загорается зелёный на 5 секунд. Перетягиваем: макрос компонента , LED0, OFF (выключили красный), макрос компонента, LED1, OFF (выключили желтый), снова макрос компонента , LED2, ON (включили зелёный). Далее перетянем DELAY, 5 sec. (рис.37) .
Рис.37 Пунктом 5, у нас зелёный мигает 3 раза, то есть тухнет затем пауза, загорается, пауза, и снова тухнет. Здесь немного подумаем, стоит ли переписывать одни и те же действия 3 раза? Конечно же, нет. Используем цикл, перетянем его и кликнем по нему два раза. Поставим галочку на LOOP COUNT (что значит количество циклов), поставим в поле нужное нам количество – это 3 цикла (рис.38).
Для наглядности примем паузу между включением и выключением зелёного 0.5 секунды(или 500мс.). Перетягиваем теперь в тело нашего троекратного цикла: макрос компонента LED2, OFF, дальше DELAY, 500 ms, LED2, ON, и DELAY, 500ms. (рис.39). 
Рис.38
Рис.39 Далее пункт 6, выключаем зелёный. Пункт 7 включаем желтый на 2 секунды. Пункт 8 – выключаем желтый. (LED2, OFF; LED1, ON; DELAY, 2 sec.; LED1, OFF). Думаю, что такая запись Вам будет понятна, поскольку эти действия выполнялись уже неоднократно (рис.40). Ну вот, и всё ! Мы написали алгоритм программы управления светофором. Давайте проверим, что у нас получилось.
Для этого в выпадающем меню “view” выберем “project option”, откроется окно опций проекта. Установим тактовую частоту микроконтроллера 4800000 Гц. (это нужно для правильного расчёта пауз ), и скорость симуляции, в данном случае “fast as possible” (рис.41,42).
Рис.40
Рис.41
Рис.42 Теперь жмём «ОК», ищем и нажимаем синий треугольник вверху «RUN», (или нажимаем клавишу F5), и наслаждаемся симуляцией работы нашего светофора в Flowcode. Если не работает, или не так работает как надо, то ищем ошибки. Поскольку статья очень подробная то ошибок быть не должно. Приступим теперь к компиляции проекта. В выпадающем меню “chip”, выбираем “compile to hex”.
Появляется окно компилятора, и индикация его работы (рис.43).
Рис.43 Должно получится так как на картинке, если ”Return code=1”, проверяем путь к файлу проекта. Напомню что названия всех папок в пути от корневого каталога и файла должно состоять только из латинских символов. Иначе компилятор будет выдавать ошибку (рис.44).
Рис.44 Открываем папку с проектом, и смотрим на наш HEX файл прошивки (рис.45,46).
Рис.45
Рис.46 А вот и наш Си файл (рис.47,48).
Рис.47
Рис.48
Рис.49 (наш алгоритм)
Собственно полученная нами прошивка (код).
:1000000009C016C015C014C013C012C011C010C062 :100010000FC00EC011241FBECFE9CDBF10E0A0E677 :10002000B0E001C01D92A737B107E1F702D0C5C00B :10003000E7CF14BE88E10FB6F89481BD11BC0FBEA6 :1000400040EB54E0B89AC09A30E01EC0CA01019754 :10005000F1F72F5F2A3FD1F720E0CA010197F1F7AE :100060002F5F2A3FD1F720E0CA010197F1F72F5FF8 :100070002A3FD1F720E0CA010197F1F72F5F2A3F0D :10008000D1F73F5F353011F020E0E0CFB99AC19A47 :1000900030E01EC0CA010197F1F72F5F2A3FD1F768 :1000A00020E0CA010197F1F72F5F2A3FD1F720E046 :1000B000CA010197F1F72F5F2A3FD1F720E0CA016B :1000C0000197F1F72F5F2A3FD1F73F5F323011F0F0 :1000D00020E0E0CFB89AC098B99AC198BA9AC29A6B :1000E00030E01EC0CA010197F1F72F5F2A3FD1F718 :1000F00020E0CA010197F1F72F5F2A3FD1F720E0F6 :10010000CA010197F1F72F5F2A3FD1F720E0CA011A :100110000197F1F72F5F2A3FD1F73F5F353011F09C :1001200020E0E0CF33E0BA9AC29820E0CA010197FC :10013000F1F72F5F2F3FD1F720E0CA010197F1F7C8 :100140002F5F253FD1F7BA9AC29A20E0CA010197E2 :10015000F1F72F5F2F3FD1F720E0CA010197F1F7A8 :100160002F5F253FD1F73150F1F6BA9AC298B99A6C :10017000C19A1EC0CA010197F1F72F5F2A3FD1F73C :1001800020E0CA010197F1F72F5F2A3FD1F720E065 :10019000CA010197F1F72F5F2A3FD1F720E0CA018A :1001A0000197F1F72F5F2A3FD1F73F5F323011F00F :0E01B00020E0E0CFB99AC19845CFF894FFCF78 :00000001FF
И программа на СИ (находится в архиве ниже). Теперь возвращаемся к нашему проекту в Proteus professional. Нам нужно проверить, функционирует ли полученный нами код в модели созданного нами устройства, или нет. Для этого открываем наш файл svetofor.DSN (он у нас в папке myproject), делаем двойной клик на микроконтроллере, откроется окно его свойств (рис.50), так называемые фьюзы поставьте такие как на рисунке (WDTON=1; CLKDIV8=1; RSTDISBL=1; CKSEL=10; SUT=10).
Рис.50 Выберите путь к “Program file” нажав на кнопку с папкой (укажите путь к нашему HEX файлу) (рис.51).
Рис.51 Нажимаем кнопку треугольник внизу (воспроизвести), и наслаждаемся работой схемы.
От автора Как Вам понравилась статья? Старался объяснить, как мог понятней и подробней. Любой (осознанной) критике буду только рад.
Прикрепленные файлы:
- svetofor3.rar (578 Кб)
Теги:
Источник: cxem.net