Codesys (824048), страница 7
Текст из файла (страница 7)
Чтобы избежать несчастных случаев, мы добавим общепринятые переходные стадии: желтый и желто-красный. Последняястадия должна быть длиннее предыдущей.В этом примере мы покажем, как управляемые по времени процессы можно представить средствамиязыков стандарта МЭК 61131-3, как легко можно комбинировать различные языки в CoDeSys и познакомимся со средствами моделирования в CoDeSys.Создайте POUНачинать всегда легко: запустите CoDeSys и выберите "File" "New".В окне диалога определим первый POU. По умолчанию он получает наименование PLC_PRG. Не изменяйте его.
Тип этого POU, безусловно, должен быть - программа. Каждый проект должен иметь программу с таким именем. В качестве языка программирования данного POU мы выберем языкContinuous Function Chart (CFC).Теперь создайте еще три объекта. Воспользуйтесь командой "Project" "Object Add" в системном или вконтекстном (нажмите правую кнопку мыши в окне Object Organizer) меню. Создайте: программу наязыке Sequential Function Chart (SFC) с именем SEQUENCE, функциональный блок на языке FunctionBlock Diagram (FBD) с именем TRAFFICSIGNAL и еще один аналогичный блок - WAIT, который мыбудем описывать на языке Список Инструкции (IL).Что делает TRAFFICSIGNAL?В POU TRAFFICSIGNAL мы сопоставим определенные стадии процесса соответствующим цветам.
Тоесть мы удостоверимся, что красный свет зажжен в красной стадии и в желто-красной стадии, желтыйсвет в желтой и желто-красной стадии и т.д.Что делает WAIT?В WAIT мы создадим простой таймер, который на вход получает длину стадии в миллисекундах и навыходе выдает состояние ИСТИНА по истечении заданного периода времени.Что делает SEQUENCE?В SEQUENCE все будет объединено так, чтобы нужные огни зажигались в правильное время и на нужный период времени.Что делает PLС_PRG?В PLC_PRG вводится входной сигнал включения, разрешающий начало работы светофора и 'цветовыекоманды’ каждой лампы связаны с соответствующими выходами аппаратуры.Объявления "TRAFFICSIGNAL"Вернемся теперь к POU TRAFFICSIGNAL.
В редакторе объявлений определите входную переменную(между ключевыми словами VAR_INPUT и END_VAR) по имени STATUS типа INT. STATUS будетПишем простой примериметь четыре возможных состояния, определяющие соответствующие стадии - зеленая, желтая, желтокрасная и красная.Поскольку наш блок TRAFFICSIGNAL имеет три выхода, нужно определить еще три переменных RED,YELLOW и GREEN. Теперь раздел объявлений блока TRAFFICSIGNAL должен выглядеть так:Функциональный блок TRAFFICSIGNAL, раздел объявлений:Программируем "TRAFFICSIGNAL"Теперь пора описать, что связывает вход STATUS с выходными переменными.
Для этого перейдите враздел кода POU (body). Щелкните на поле слева от первой цепи (серая область с номером 1). Вы теперь выбрали первую цепь. Теперь дайте команду меню "Insert" "Operator".В первой цепи будет вставлен прямоугольник с оператором AND и двумя входами:Щелкните мышкой на тексте AND и замените его на EQ.Три знака вопроса около верхнего из двух входов замените на имя переменной STATUS. Для нижнеговхода вместо трех знаков вопроса нужно поставить 1.
В результате Вы должны получить следующийэлемент:Щелкните теперь на месте позади прямоугольника EQ. Теперь выбран выход EQ. Выполните командуменю "Insert" "Assignment".Измените три вопроса ??? на GREEN. Вы теперь создали цепь следующего вида:CoDeSys V2.33-2Пишем простой примерSTATUS сравнивается с 1, результат присваивается GREEN. Таким образом, GREEN будет включен,когда STATUS равен 1.Для других цветов TRAFFICSIGNAL нам понадобятся еще две цепи.
Создаете их командой "Insert""Network (after)". Законченный POU должен выглядеть следующим образом:Функциональный блок TRAFFICSIGNAL:Чтобы вставить оператор перед входом другого оператора, Вы должны выделить сам вход, а не текст(выделяется прямоугольником). Далее используйте команду "Insert" "Operator".Теперь наш первый POU закончен. Как и планировалось, TRAFFICSIGNAL будет управлять включением выходов, руководствуясь значением переменной STATUS.Подключение standard.libДля создания таймера в POU WAIT нам понадобится POU из стандартной библиотеки. Итак, откройтеменеджер библиотек командами "Window" "Library Manager".
Выберете "Insert" "Additional library".Должно открыться диалоговое окно выбора файлов. Выберете standard.lib из списка библиотек.CoDeSys V2.33-3Пишем простой примерОбъявления "WAIT"Теперь давайте вернемся к POU WAIT. Как предполагалось, этот POU будет работать таймером, задающим длительность стадий TRAFFICSIGNAL. Наш POU должен иметь входную переменную TIMEтипа TIME и генерировать на выходе двоичную (Boolean) переменную, которую мы назовем OK. Данная переменная должна принимать значение TRUE, когда желательный период времени закончен.Предварительно мы устанавливаем эту переменную в FALSE в конце строки объявления (но до точки сзапятой, однако) " := FALSE ".Теперь нам нужен генератор времени POU TP.
Он имеет два входа (IN, PT) и два выхода (Q, ET). TPделает следующее:Пока IN установлен в FALSE, ET будет 0 и Q будет FALSE. Как только IN переключится в TRUE, выход ET начнет отсчитывать время в миллисекундах. Когда ET достигнет значения заданного PT, счетбудет остановлен. Тем временем выход Q равен TRUE, пока ET меньше PT. Как только ET достигнетзначения PT, выход Q снова переключится в FALSE.Описание всех POU из стандартной библиотеки приведено в приложении.Чтобы использовать TP в POU WAIT, мы должны создать его локальный экземпляр. Для этого мы объявляем локальную переменную ZAB (отсчитанное время) типа TP (между ключевыми словами VAR,END_VAR).Раздел объявлений WAIT теперь должен выглядеть так:CoDeSys V2.33-4Пишем простой примерПрограммируем "WAIT"Для создания желаемого таймера текст программы должен быть следующим:Сначала проверяется, установлен ли Q в TRUE (возможно, отсчет уже запущен), в этом случае мы нетрогаем установки ZAB, а вызываем функциональный блок ZAB без входных переменных - чтобы проверить, закончен ли период времени.Иначе мы устанавливаем переменную IN ZAB в FALSE и одновременно ET в 0 и Q в FALSE.
Таким образом, все переменные установлены в начальное состояние. Теперь мы устанавливаем необходимоевремя TIME переменной PT и вызываем ZAB с IN:=TRUE. Функциональный блок ZAB теперь будетработать, пока не достигает значения TIME и не установит Q в FALSE.Инвертированное значение Q будет сохраняться в переменной OK после каждого выполнения WAIT.Как только Q станет FALSE, OK примет значение TRUE.С таймером покончено. Теперь пришло время объединять наши два блока WAIT и TRAFFICSIGNAL вглавной программе PLC_PRG."SEQUENCE" версия 1Сначала объявим необходимые переменные. Это входная переменная START типа BOOL, две выходных переменные TRAFFICSIGNAL1 и TRAFFICSIGNAL2 типа INT и одна типа WAIT (DELAY оригинально, не так ли). Программа SEQUENCE теперь выглядит так:CoDeSys V2.33-5Пишем простой примерПрограмма SEQUENCE версия 1, раздел объявлений:Создаем SFC диаграммуПервоначально SFC граф всегда состоит из этапа "Init" перехода "Trans0" и возврата назад к Init, естественно, нам придется несколько дополнить его.Прежде чем программировать конкретные этапы и переходы, выстроим структуру графа.
Сначала нампонадобятся этапы для каждой стадии TRAFFICSIGNAL. Вставьте их, отмечая Trans0 и выбирая команды "Insert" "Step transition (after)". Повторите эту процедуру еще три раза.Для редактирования названия перехода или этапа нужно просто щелкнуть мышкой на нужном тексте.Назовите первый переход после Init "START", а все прочие переходы "DELAY.OK".Первый переход разрешается, когда START устанавливается в TRUE, все же прочие - когда DELAY вOK станет TRUE, т.е. когда заданный период закончится.Этапы (сверху вниз) получают имена Switch1, Green2, Switch2, Green1, ну и Init, конечно, сохранит своёимя. "Switch" должен включать жёлтую фазу, в Green1 TRAFFICSIGNAL1 будет зеленым, в Green2TRAFFICSIGNAL2 будет зеленым.
Наконец, измените адрес возврата Init на Switch1. Если вы всё сделали верно, диаграмма должна выглядеть так:CoDeSys V2.33-6Пишем простой примерПрограмма SEQUENCE версия 1, раздел инструкций:Теперь мы должны запрограммировать этапы. Если вы сделаете двойной щелчок мышью на изображении этапа, то должен открыться диалог определения нового действия. В нашем случае мы будем использовать язык IL (Список Инструкций).Программирование этапов и переходовВо время действия этапа Init проверяем, активен сигнал включения START или нет.
Если сигнал не активен, то светофор выключается. Этого можно достичь, если записать в переменныеTRAFFICSIGNAL1 и TRAFFICSIGNAL2 число 5.CoDeSys V2.33-7Пишем простой примерЭтап Init:В Green1 TRAFFICSIGNAL1 будет зеленым (STATUS:=1), TRAFFICSIGNAL2 будет красным(STATUS:=3), задержка в 5000 миллисекунд.Этап Green1:Switch1 изменяет состояние TRAFFICSIGNAL1 на 2 (жёлтое) и, соответственно, TRAFFICSIGNAL2 на4 (жёлто-красное).
Кроме того, теперь устанавливается задержка в 2000 миллисекунд. Это выглядиттак:Этап Switch1:Green2 включает красный в TRAFFICSIGNAL1 (STATUS:=3) и зеленый в TRAFFICSIGNAL2(STATUS:=1). Задержка устанавливается в 5000 миллисекунд.Этап Green2:В Switch2 STATUS в TRAFFICSIGNAL1 изменяется на 4 (жёлто-красный), соответственно,TRAFFICSIGNAL2 будет 2 (жёлтый).
Задержка теперь должна быть в 2000 миллисекунд.CoDeSys V2.33-8Пишем простой примерЭтап Switch2:Первая версия нашей программы закончена.Если вы хотите проверить ее работу в режиме эмуляции, сделайте следующее:Откройте POU PLC_PRG. Каждый проект начинает работу с PLC_PRG. Вставьте в него компонент изамените “AND” на “SEQUENCE”. Входы и выходы оставьте пока свободными.Теперь вы можете откомпилировать ('Project' 'Build') и её проверить отсутствие ошибок.