UNITY PRO - быстрый старт

Цель данной статьи - ознакомить начинающих пользователей со средой UNITY PRO через реализацию простой задачки. Она не претендует на полное описание возможностей продукта и содержит некоторые упрощения. Данная статья будет частью учебного пособия, которое готовится к изданию.
Нам (авторам) очень важна обратная реакция начинающих и опытных пользователей UNITY PRO для внесения изменений ещё до издания пособия. Комментарии Вы можете оставлять на блоге  сайта или же в специально созданных для этого темах профессиональны6х форумов:   
 
 
Постановка задачи для решения на LD/FBD/ST.
Создать конфигурацию ПЛК и программу на LD, FBD и ST для реализации в M340/Premium следующей задачи. В напорном баке необходимо поддерживать заданный пределами уровень жидкости с помощью насоса М1.
При выбранном режиме START, насос М1 должен:
- включаться при отключении сигнализатора LS1 (нижний предел)
- отключаться при срабатывании сигнализатора LS2 (верхний предел).
Таким образом в напорном баке будет всегда жидкость в пределах размещения сигнализаторов предельных уровней.
При выбранном режиме STOP, насос М1:
- включается при нажатии оператором кнопки ManPump,
- отключается через 5с по отключении кнопки.
Питание датчиков, переключателя, кнопки и реле цепи управления пускателя =24В.        
 
 Концепция разработки
В UNITY Вы можете начать не с конфигурирования ПЛК (программируемый логический контроллер), а с написания программы, или можно даже с разработки интерфейса оператора. Таким образом последовательность разработки будет такая:
Шаг 1) создаем проект UNITY и выбираем платформу (позже это можно будет изменить);
Шаг 2) создаем переменные (не привязывая их к входам и выходам ПЛК);
Шаг 3) пишем программу;
Шаг 4) отлаживаем программу на симуляторе ПЛК;
Шаг 5) конфигурируем модули ПЛК;
Шаг 6) привязываем внешние переменные в входам/выходам ПЛК;
Шаг 7) после монтажа отлаживаем программу на реальном объекте;
Практически всегда эта последовательность имеет итерационный характер. То есть, например, после шага 4 нужно возвращаться на шаг 3.          
 
Шаг1. Проект UNITY.
Проект UNITY это база данных определённого формата, содержащая всю конфигурационную информацию для ПЛК и некоторую информацию для его распределенной периферии. Проект сохраняется на компьютере в виде одного файла формата *.STU. Файлы формата STU не
совместимы в разных версиях UNITY PRO (даже от младшей к старшей), поэтому при переносе нужно пользоваться командой File->SaveArchive и получить кросс-версионный файл STA. Оба формата файла являются архивами, изменив их расширение на *.RAR Вы сможете просмотреть содержимое архиватором.
 
Всё содержимое проекта доступно через ProjectBrowser. Это:
- аппаратная конфигурация ПЛК и его распределенной периферии;
- переменные (включая экземпляры функциональных блоков);
- создаваемые пользователем (производные) типы данных и функциональных блоков;
- конфигурация сетей;
- программа и подпрограммы;
- анимационные таблицы - для просмотра и изменения данных при отладке в виде таблицы;
- анимационные экраны - для просмотра и изменения данных при отладке в виде графических мнемосхем;
- документация по проекту (генерируется по запросу пользователя)
 
Для того, чтобы загрузить проект в ПЛК, его нужно скомпилировать или в терминах UNITY - построить (Build, далее по тексту всегда будет компилировать). При компилировании генерируется загрузочный код. Есть два варианта компилирования- Build Changes и Rebuild All Project.
При Rebuild All Project весь проект компилируется заново, и его придется полностью перегонять в ПЛК, перед этим переводя его в STOP.
При Build Changes компилируется только измененная после последней компиляции часть проекта. При этом, находясь в онлайн-режиме, эта часть автоматически засылается в ПЛК, не останавливая его работу. Далеко не всегда возможен Build Changes, особенно когда меняются конфигурационные настройки. 
Однако не все данные проекта UNITY на компьютере компилируются и отправляются в ПЛК. В минимальном варианте в ПЛК шлется только скомпилированный код программы и конфигурация. Некоторую другую информацию можно залить в область памяти Upload Information. Так, например, по умолчанию туда отправляется исходный код программ. Таким образом убрав опцию заливки исходников в ПЛК, проект с ПЛК скачать будет невозможно.     
  
1) откройте UNITY PRO, создайте новый проект;
2) выберите ПЛК Modicon M340 ->BMX P34 2000
3) выполните Build->RebuildAllProject, проанализируйте результат операции в окне OutputWindow
 

1-3

Режимы Online/Offline и Симулятор.
Для того чтоб залить/слить программу в ПЛК или просмотреть как она работает, нужно сначала соединиться с этим контроллером. В зависимости от типа ПЛК, возможны разные способы соединения, но в примере мы будем соединяться через драйвер TCP/IP (на самом деле используется протокол Modbus/TCP). Соединение осуществляется командой PLC->Connect. При успешной попытке, Unity PRO переходит с режима Ofline в режим Online.  В зависимости от ситуации, режим Online может быть в различных под-режимах. По умолчанию UNITY PRO пытается соединиться в качестве программатора (Programming Mode) хотя есть возможность соединиться только для мониторинга (Monitoring Mode). Вся эта информация отображается на панели статуса внизу экрана.  Если проекты на ПК и ПЛК идентичны, Вы попадаете в режим EQUAL, в противном случае в режим DIFFERENT.    
После соединения, в зависимости от режима, Вы сможете залить проект в ПЛК командой "PLC->Transfer Project to PLC", или слить проект с ПЛК командой "PLC->Transfer Project from PLC".
 
В комплекте с UNITY инсталлируется симулятор ПЛК (UNITY PRO PLC Simulator). Он имитирует работу всех функций ПЛК, за исключением некоторых системных, аппаратных (входы/выходы) и коммуникационных. Следует отметить немаловажный факт, что симулятор виден как устройство Modbus TCP Server с IP-шником ПК, на котором он выполняется. То есть, Вы можете "присоединить" к нему SCADA или другой ПЛК, выполняющие функции Modbus TCP Client. Ещё одна особенность симулятора по сравнению с аналогами - отсутствие карты входов/выходов для их имитации. То есть изменить (симулировать) какой-то вход в панели симулятора Вам не удастся. Имитация входов/выходов решается путем использования специальных программных функций. Для соединения с симулятором, перед подачей команды Connect, нужно выставить режим PLC->Simulation Mode.     
 
4) проанализируйте состояние панели статуса, выставьте режим соединения с симулятором;
5) соединитесь с симулятором, проанализируйте состояние панели статуса;
6) через контекстное меню иконки симулятора (в панели TRAY) вызовите его панель, ознакомьтесь с её содержимым;
7) загрузите скомпилированный проект в ПЛК (симулятор ПЛК), проанализируйте состояние панели статуса и панели симулятора ПЛК
8) сохраните проект с названием "LD_Exmpl", после чего закройте его File->Close;
9) не создавая и не открывая проекта, соединитесь с ПЛК (симулятором ПЛК), проанализируйте состояние панели статуса и панели симулятора ПЛК; 
10) выгрузите проект с ПЛК (симулятора) в UNITY PRO, проанализируйте состояние панели статуса и панели симулятора ПЛК;

Видео YouTube

 
 
Шаг2. Переменные.
Переменные в UNITY - это настоящие переменные с символьными именами, а не виртуальные ячейки памяти. Если Вы не работали с другими ПЛК, но программировали на языках высокого уровня, то для Вас ничего запутанного в этом абзаце не должно быть, но другим придется привыкать к новой терминологии.  В UNITY, строка %MW0 означает обращение к 0-й ячейке в области памяти MW(Memory Words), но это не переменная.
Для работы с переменными в UNITY, их нужно создать в разделе проекта Variables&FBInstances. Тем не менее в программе Вы можете работать как с переменными, так и непосредственно с адресами разных областей памяти. Последние, в отличии от переменных, объявлять не нужно, однако можно менять диапазон выделенных адресов.  
 
При компилировании проекта данные для переменных размещаются в определенной области памяти. Если Вы не желаете управлять размещением данных для этих переменных - они будут размещаться в нелокализированной зоне, а сами переменные будут называться нелокализированными (unlocated). 
Если же Вы хотите привязать переменную к определенной ячейке памяти (например %M20, %MW23, %IW0.0.0 и т.д.) то в её свойстве Address нужно вписать этот адрес. После этого переменная будет локализированной (located), и работать с одними и теми же данными можно будет как по имени переменной так и по адресу.
 
Области памяти.
При работе с локализированной областью памяти, Вы можете обращаться к данным по адресу. Вся локализированная область делится на зоны, каждая из которых имеет определённое предназначение. Ниже приведены некоторые Зоны(области) памяти:
 Приведенные области памяти не перекрываются между собой, то есть независимые одна от другой. Так, например, область %M предназначена для сохранения промежуточных дискретных результатов (типа EBOOL) и полностью управляется пользовательской программой. В каждой ячейке этой области можно сохранить одно значение типа EBOOL - TRUE либо FALSE. Все ячейки имеют уникальный адрес, начиная с 0, например %M34 - 35-я ячейка.
Область %MW имеет те же функции что и %M за исключением размера сохраняемых данных - 16-битное слово.
Ячейки %I и %IW обновляются автоматически по состоянию входных каналов ПЛК, и доступны только для чтения. Адреса ячеек этой области связаны с адресами каналов на модулях ПЛК. Например ячейка %I0.1.2 получает значение с дискретного входа 2-го канала, модуля с позицией 1 на шасси с номером 0. Значение ячеек %Q и %QW автоматически передаются на выходные каналы ПЛК, их номера также соответствуют номеру выходного канала.
Каждая из ячеек области %S и %SW отвечают за конкретную системную информацию.      
 
11) откройте проект LD_Exmpl и создайте следующие переменные:
 При необходимости локализации в поле Address указывается адрес ячейки, в поле Value - значение инициализации (при старте ПЛК).  

Видео YouTube

Шаг3. Структура программы.
 ПЛК разработан для задач реального времени. Таким образом он должен постоянно опрашивать состояние процесса, обрабатывать эту информацию согласно написанной программы, и изменять управляющие сигналы, которые передаются на исполнительные механизмы. 
Всё время, пока ПЛК находится в состоянии RUN, он проделывает следующую работу:
0) делает внутреннюю системную обработку (диагностика, сетевые коммуникации)
1) опрашивает входы  и обновляет ячейки %I, %IW, согласно считанной информации с АЦП, ДЦП;
2) выполняет программу, написанную на язіках FBD, LD, IL, ST, SFC;
3) записывает значения с ячеек %Q, %QW на выходы ПЛК        
Последовательность 0-3 повторяется до тех пор, пока ПЛК не перейдет в STOP. В режиме STOP ПЛК циклично выполняет операции 0-го и 1-го шага.   
Контроллеры M340, Premium и Quantum могут работать в многозадачном режиме, но тут мы будем рассматривать только однозадачный режим. Основная задача (MAST Task) в циклическом режиме (Cyclic mode) работает по описанному выше алгоритму.
 Программа задачи состоит из частей, называемые секциями (Sections). Большие программы удобно делить на секции, так как это упрощает процесс разработки и отладки. Кроме того, каждая секция может быть написана на том языке, какой наиболее удобен для этой части программы. Также выполнением программ секций можно управлять, секции можно защищать от чтения или чтения и записи. Секции выполняются последовательно одна за другой в порядке их размещения в разделе Sections. Секции создаются в разделе Program->Mast->Sections. При создании секции обязательно нужно указать имя (только латинские символы без пробелов) и язык (LD,ST,FBD,IL,SFC), всё остальное можно задать потом.  
 
 
  12) в задаче MAST создайте секцию с названием "Intro_LD" на языке LD   

Видео YouTube

 
Язык LD.
 Поставленную в начале задачу можно бы было реализовать на релейно-контактной логике с использованием различных реле. Релейно-контактная схема (РКС) выглядела бы приблизительно таким образом, как на рисунке слева, а в LD такая же задача реализуется так, как на рисунке справа.   
Рассмотрим сначала РКС. Переключатель SA1 с двумя позициями "Start"/"Stop" используется для выбора режима работы установки. Кнопка SB2 с надписью "ManPump" используется для ручного включения насоса. Используются две группы нормально-замкнутых контактов от реле сигнализаторов уровня LS1 и LS2, которые размыкаются при достижении жидкостью определенного уровня. Контактор К1 используется для запуска двигателя М1 привода насоса воды, используются также доп. контакты контактора. Для реализации задачи также нужно реле времени KT1 с задержкой на отключение. 
  При положении переключателя SA1 в позиции "Start", а также замкнутыми LS1 и LS2 (напорный бак пустой), ток потечет через катушку контактора К1, которая замкнёт цепь двигателя М1 привода насоса (на РКС силовая цепь двигателя не показана). Одновременно с ним замкнутся доп. контакты контактора К1, что обеспечит подхват цепи управления двигателем, даже если LS1 разомкнётся. При достижении верхнего уровня отключатся контакты LS2, что приведёт к размыканию электрической цепи и отключении катушки контактора К1, то есть останова двигателя насоса. Когда уровень в баке упадет ниже верхнего предела, LS2 опять замкнется, но цепь катушки контактора будет разомкнута: LS1 разомкнут так как уровень выше сигнализатора, доп. контакты К1 разомкнуты, так как не сработала его катушка. Таким образом, двигатель включится только при повторном замыкании LS1, что произойдет при падении уровня ниже нижнего предела.          
  При положении переключателя SA1 в позиции "Stop", цепь катушки контактора К1 замыкается только через контакты реле времени КТ1. Контакты реле замыкаются сразу, при прохождении через него тока, то есть после замыкания кнопки SB2 ("ManPump"). После отпускания кнопки, она размыкает цепь с КТ1, а через заданное время размыкаются и контакты этого реле. 
 
Как видно с примера, на графическом языке LD (Ladder Diagramm) программа выглядит очень похоже на РКС. Состояние нормально разомкнутых контактов  "-| |-" и нормально замкнутых контактов "-|/|-" управляются переменными типа BOOL или EBOOL, которые могут принимать значение TRUE(логическая 1) или FALSE (логический 0). То есть, если на нормально-разомкнутый контакт "-| |-" действует переменная ManPump, то этот контакт замыкается при ManPump=TRUE и размыкается при ManPump=FALSE. А если на нормально замкнутый контакт "-|/|-" действует переменная LS1, то этот контакт замыкается при LS1=FALSE и размыкается при LS1=TRUE.
Соединенные контакты организуют цепи, соединяющие условную фазу с условным нулём через исполнительные элементы. В качестве исполнительных элементов могут использоваться различного рода катушки или блоки (функциональные блоки, функции и др). В приведенной программе используется нормально разомкнутая катушка "-( )-", которая действует на переменную M1. Если через цепь катушки проходит условный ток (настоящего тока там не может быть, так как это программа :-) ), то переменная M1=TRUE иначе (если ток не проходит) M1=FALSE.
Также в качестве исполнительного элемента в программе используется функциональный блок таймера "Timer1" типа TOF (таймер с задержкой на отключение). Выход таймера Timer1.Q - используется как  нормально разомкнутый контакт в цепи катушки М1. Таймер настроен на 5 секунд путем задания на входе PT=t#5s, где "t#" указывает на то, что используется временная константа. Таймер (вернее экземпляр таймера), также как и переменные нужно создавать. 
 
13) в разделе Variables & FB Instances ->вкладка Function Blocks создайте Timer1 TOF        
14) в секции "Intro_LD", пользуясь палитрой элементов, наберите программу, приведенную на рисунке выше (справа от РКС); вставка экземпляра Timer1 проводится путем команды Edit->DataSelection...->вкладка Function Blocks; после вставки Timer1 нужно снять опцию Show EN/ENO (контекстном меню Timer1->Properties);
15) скомпилируйте проект, проверьте наличие ошибок в окне OutputWindow, если ошибки присутствуют исправьте их (двойной клик по тексту ошибки отправляет курсор в позицию её источника);
 

Видео YouTube

Шаг4. Проверка работы и отладка.
 UNITY PRO богат на отладочные средства (не так конечно как среды программирования ПК), но тут мы рассмотрим только самые примитивные. 
Для того, чтоб проверить как работает программа без наличия самого объекта, нужно смотреть правильно ли она реагирует на состояние процесса. Состояние процесса - это значение датчиков, которые подключаются к ПЛК. Но поскольку в момент написания программы зачастую процесса нет, датчиков нет, да и самого ПЛК нет, - то проверка работоспособности будет происходить, следующим образом. 
Напомню, что в программе мы использовали нелокализированные переменные, то есть не привязанные к ячейкам, в том числе и входам/выходам. Таким образом для проверки работы программы нам нужно изменять значение переменных, отвечающих за датчики, и смотреть за значениями переменных, отвечающих за исполнительные механизмы. Если поведение переменных будет удовлетворять условиям задачи, то программа работает корректно. Если же нет - придется вносить изменения в программу, компилировать изменения, пересылать их в ПЛК, после чего опять проверять корректность работы. И так до тех пор, пока программа не будет выполнять все возложенные на неё функции.
Разработка последовательности проверки и её добросовестное исполнение - очень важный этап, от которого очень сильно зависит сколько будет потрачено времени (а иногда и количество испорченного продукта) при пуско-наладке на самом объекте. Не пренебрегайте этим этапом.
Определим последовательность проверки для поставленной задачи. Для этого нужно представить как будет вести себя объект. В качестве исходной точки возьмём ситуацию, когда бак пустой. То есть, при пуске программы ПЛК, будем проделывать следующую последовательность:
Таблица1.
Состояние переменных с пометкой "не важно", не должны влиять на выполнение программы, а значит должны быть проверены при всех возможных состояниях.  
 
Для того чтоб изменять и просматривать значение переменных  в UNITY используются анимационные таблицы (Animation Tables).  После создания анимационной таблицы, туда заносятся те переменные, которые интересуют при отладке нужной части программы. В онлайн режиме, в поле Value автоматически отображается значение этих переменных, а при нажатой кнопке Modification можно их также изменять.
Наполнять анимационные таблицы переменными можно вручную, или автоматически, выделив их в редакторе данных или редакторе языка.
Для запуска программы в ПЛК нужно дать команду PLC->RUN.
 
16) перейдите в онлайн режим с симулятором ПЛК;
17) в редакторе данных DataEditor->вкладка Variables выделите все переменные, и в контекстном меню выберете "Intialize Animation Table", после чего должна активироваться анимационная таблица а также появиться ссылка на неё в разделе проекта Animation Tables в Project Browser;
18) в редакторе данных DataEditor->вкладка Function Blocks выделите Timer1 и проделайте с ним то же, что с предыдущими переменными; в контекстном меню анимационной таблицы в Project Browser выберите Properties, уберите опцию Temporary, чтоб сделать таблицу постоянной;
19) запустите программу на выполнение командой RUN;
20) в анимационной таблице включите режим Modification;
21) проверьте работу программы, согласно приведенной (в таблице 1) последовательности;
22) при некорректной работе программы, проверьте действия, согласно пп.13-15, при необходимости исправьте ошибки, скомпилируйте изменения и повторите п.21;

Видео YouTube

 
 Кроме анимационных таблиц, просмотр значения переменных а также их изменение можно проводить в окне самого редактора. Для этого в онлайн режиме при активации окна редактора должна стоять опция Services->Animation. Значение булевых переменных отображается цветом: красный - FALSE, зеленый  -TRUE. То же самое касается контактов и соединений: зеленый - ток (условный) проходит, красный - не проходит. Таким образом, по  том, где заканчивается зеленая линия можно быстро определить, где разрывается цепь. Это одна из сильных сторон отладки программ на LD. Следует помнить, что для нормально замкнутых контактов переменные в значении TRUE будут подсвечиваться зеленым, тогда как контакты будут красными, поскольку будут разомкнутыми (новички часто путаются) . На рисунке слева видно, что цепь разомкнута в местах контактов с ManPump, Timer1.Q а также на нормально-разомкнутом контакте Start.     
Кроме просмотра значений переменных в редакторе LD, можно также их изменять. Изменение доступно через контекстное меню элемента, к которому привязана переменная.Это хорошо видно на правом рисунке.       
 
23) перейдите в редактор LD, проверьте чтоб был включен режим Animation, проверьте работу программы, согласно приведенной (в таблице 1) последовательности
 
Шаг5. Конфигурирация модулей ПЛК
Для решения этой задачи понадобиться 4 дискретных входа (датчики LS1, LS2, переключатель Start/Stop, и кнопка ManPump) и один дискретный выход (реле цепи контактора M1). Учитывая что все датчики и реле запитываются =24В, для М340 можно выбрать один из 3-х типов смешанных модулей (дискретные входы + дискретные выходы): BMX DDM 16022, BMX DDM 16025, BMX DDM 3202K. Конфигурация аппаратной части проводится в оффлайн режиме.       
 
24)  Перейдите в режим оффлайн, откройте окно конфигурации ПЛК: ProjectBrowser->Configuration->PLC BUS;
25)  В контекстном меню 1-го посадочного места выберите пункт NewDevice;
26) В списке модулей выберите BMX DDM 16025 и подтвердите свой выбор
 
 
 Каждый модуль можно дополнительно настроить. В конфигурационном окне можно посмотреть информацию о модуле, а также доступных объектах (ячейки локализированной памяти связанные с этим модулем).   
 
27) откройте окно конфигурации модуля на 1-й позиции: в контекстном меню выбранного дискретного модуля выберите пункт Open Module;
28) в конфигурационном окне выберите модуль, и посмотрите характеристику модуля во вкладке Overview;   
 
 
Настраиваются каналы модуля. Настройки каналов проводится по группам, а некоторые индивидуально. Так, на рисунке ниже, отдельно настраиваются входные каналы 0-7 (Channel 0) и выходные каналы 16-23 (Channel 16). Для всех каналов задается задача, вначале которой они опрашиваются (Task:Mast). Для выходов также задается функциональность каналов (Function:Discrete outputs), и режим состояния выходов при остановке ПЛК (Fallback mode: Fallback - перевод в безопасное состояние). Для каждого выходного канала индивидуально задается безопасное  значение выхода при останове ПЛК.     
 
28) в конфигурационном окне поочередно выберите Channel 0 и Channel 16, посмотрите настройки каналов и их возможные значения; 
 

Видео YouTube

Обращение к входным/выходным каналам
Для того, чтобы обращаться к значениям дискретных входов, существуют ячейки памяти типа %I, а к выходам - %Q. Напомним, что область данных %I обновляется значениями входных каналов вначале цикла задачи, а выходы обновляются значениями области %Q  в конце задачи.  Номер ячейки определяется номером канала, который в свою очередь полностью определяется размещением канала в структуре ПЛК. Допустим, в нашем случае, мы будем подключать датчики, кнопки и реле к следующим каналам:
Входы:
    0-й канал: датчик LS1;
    1-й канал: датчик LS2;
    2-й канал: переключатель Start/Stop;
    3-й канал: кнопка ManPump;
Выходы:
    16-й канал: реле в цепи контактора двигателя насоса М1; 
 
Учитывая, что дискретный модуль находится на 1-м посадочном месте в 0-м шасси (смотри окно аппаратной конфигурации ПЛК), данные каналов будут доступны в следующих ячейках:
Входы:
0-й канал: датчик LS1; %I0.1.0 
1-й канал: датчик LS2; %I0.1.1
2-й канал: переключатель Start/Stop; %I0.1.2
3-й канал: кнопка ManPump; %I0.1.3
Выходы:
16-й канал: реле в цепи контактора двигателя насоса М1;%Q0.1.16
 
Шаг 6. Привязка переменных к входным/выходным каналам
В программе мы использовали нелокализированные переменные, то есть не привязанные к локализированной области памяти. Для того, чтобы значение переменных LS1, LS2, Start, ManPump обновлялись соответствующими дискретными входами, а значение M1 управлял нужным дискретным выходом, можно пойти тремя путями:
1) привязать их свойство Address к конкретной ячейке локализированной памяти, отвечающей за этот канал, тем самым локализировать их;
2) переприсвоить их значение значению конкретной ячейки локализированной памяти, отвечающей за этот канал.
3) вообще обойтись без переменных, привязав контакты и катушки к ячейкам памяти, а не к переменным.
 
В каждом из этих подходов есть плюсы и минусы. Начнем с 3-го пути. Программа в этом случае выглядела бы так, как на рисунке слева. На рисунке справа для сравнения дана исходная версия программы.
 
   
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 Такой подход эффективен для небольших программ или небольших контуров управления, где один канал фигурирует в одном-двух местах программы.
 
2-й путь предполагает в 1-й секции (перед выполнением основного кода программы) реализовать переприсвоение входных переменных, а в последней секции (после выполнения всех программных секций) - выходных. В LD это бы выглядело как на рисунке ниже: слева - 1-я секция, справа - последняя секция.
 
 
   
 
 
 
 
 
 
 
 
 
 
 
Такой подход имеет следующие преимущества:
- отладить программу можно заменив 1-ю и последнюю секции программными имитаторами;
- для универсальных программ для одного типа объектов, программа просто настраивается под конкретное "железо";
- при замене неисправного канала на резервный, адрес меняется только в одном месте;
 
1-й путь. Для привязки переменной к каналу, в поле Address указывается нужная ячейка. После привязки переменных к ячейкам типа %I, %IW или %Q, %QW, имена переменных будут отображаться в конфигурационных окнах соответствующих модулей. Такой подход имеет преимущества 2-го и 3-го подхода. Однако для того, чтоб имитировать работу объекта нужно использовать специальные функции, предназначенные для записи в область памяти %I и %IW.
 
29) в окне конфигурации переменных определите в поле Address указанные на рисунке ячейки, сделайте компиляцию;   
    
 30)  откройте окно конфигурации модуля и убедитесь, что имена переменных отображаются на соответствующих каналах;    
 

Видео YouTube

 Разные варианты реализации. Одну и ту же программу можно реализовать различными способами. Для сравнения, ниже приводится программа на LD реализованная через катушки -(S)- и -(R)- . Катушка -(S)- имеет особенность фиксировать свое включенное состояние. То есть после прохода через цепь катушки тока, привязанной к ней переменной присваивается значение TRUE. Если после этого в цепи катушки не будет тока, переменная останется в TRUE. Для того, чтоб обнулить переменную, нужно использовать катушку -(R)-, привязанную к той же переменной. Таким образом в большинстве корректно написанных программ вместе с катушкой -(S)- с такой же переменной должна где-то быть и катушка -(R)-. 
 
  
 Язык FBD.
Поставленную задачу можно бы было реализовать на электронных компонентах бинарной логики, или независимых электронных устройств, соединенных элетрическими связями.
 
Для реализации приведенной задачи, схема электронного устройства согласно стандарту IEC 60617-12(Графические символы для диаграмм. Часть 12. Двоичные логические элементы) выглядела бы приблизительно так:
 

Схема устройства могла бы состоять из 3-х элементов: DELAY (задержка), RS Trigger (триггер ВКЛ/ОТКЛ), SELECT (управляемый переключатель).

Для выбора режима управления двигателем (Start/Stop) катушка реле пускателя подключается к выходу элемента с функциями переключателя (SELECT). Состоянием переключателя управляет вход X1. Если на входе X1=0, переключатель находится в нормальном состоянии, то есть его  выход соединяется со 2-м входом, если X1=1 то выход переключается на 3-й вход. 

Таким образом, в режиме Stop (Start=0) двигатель будет управляться элементом DELAY. Особенность этого элемента в том, что он задерживает сигнал на включение (на диаграмме указывается левым значением) и на отключение (указывается правым значением). В поставленной задаче двигатель должен отключаться после 5 с по отпусканию кнопки. То есть, элемент будет реализовывать задержку на выключение 5 с. 

В режиме Start двигателем будет управлять RS Trigger. Выход триггера управляется двумя входами: S - установить и запомнить на выходе логическую "1"; R1 - скинуть и запомнить на выходе логический "0". Символ 1 после R ("R1") означает, что R имеет приоритет над S. Кружочек на соединении S - это знак инверсии, то есть при LS1=TRUE на входе S=FALSE, а при LS1=FALSE на входе S=TRUE. Таким образом, при отключении сигнализатора LS1 (напорный бак пустой) на входе триггера появится логическая "1", что приведет к запуску двигателя, а при замыкании LS2 (напорный бак полный) на выходе появится логический 0 - то есть останов двигателя. Если по техническим неисправностях сигнализатор нижнего уровня будет разомкнут, а верхний замкнут, то двигатель всё равно отключится, так как вход R приоритетнее над S.   

Если бы подобную задачу реализовывать на электронных устройствах, для этого можно было бы выбрать: таймер с задержкой на включение, переключатель, триггер. Допустим все эти устройства имеют независимое питание =24В, и работают с унифицированными сигналами =24В. Соединив их между собой, получим схему, аналогичную предыдущей.  

  
На данной схеме уставка таймера (заданное значение) настраивается отдельным потенциометром PT (Preset Time) , а значение таймера выводится на дисплей ET (intErnal Time). Вход G блока SELECTOR переключает его выход OUT между входами INO и IN1.  
 
Программа для реализации поставленной задачи в FBD будет выглядеть следующим образом:
 Описание работы программы аналогично описанию приведенных выше схем электронного устройства и системы, построенной на базе отдельных устройств. 
Работа таймера описана при рассмотрении программы на LD. Программа (часть программы) FBD отлаживается аналогично, как и для LD. Встроенные анимационные средства редактора делают отладку ещё удобнее.
 
31) откройте проект "LD_Exmpl" и сохраните его под именем "FBD_Exmpl";   
32) уберите привязку з переменных, то есть сделайте все переменные нелокализированными;
33) удалите секцию с программой на LD;
34) в задаче MAST создайте секцию с названием "Intro_FBD" на языке FBD;
35) используя панель инструментов создайте приведенную выше программу;
36) соединитесь с симулятором ПЛК, откомпилируйте проект, загрузите в симулятор программу и запустите её на исполнение;
37) отладьте проект с помощью таблицы анимаций и согласно описанной выше последовательности для LD;
38) отладьте проект с помощью анимационных средств FBD редактора и согласно описанной выше последовательности для LD;   
 

Видео YouTube

  
Язык ST.
ST - это текстовый язык программирования, и в отличии от графических пришёл с классических структурных языков программирования компьютеров. Приведенную выше задачу можно записать различными способами. Для простоты можно написать "аналоги" уже приведенных выше программ.
 
 LD->ST
 
 
 
 
 
 
 
 
 
 
 
FBD->ST
 
 
 
 
 
 
 
 
 
 
 
LD(2 вариант)->ST
 
 
 
 
 
 
 
 
 
 
 
 
 
39) откройте проект "FBD_Exmpl" и сохраните его под именем "ST_Exmpl";
40) удалите секцию с программой на FBD;
41) в задаче MAST создайте секцию с названием "Intro_ST" на языке ST;
42) наберите одну из приведенных выше программ;
43) соединитесь с симулятором ПЛК, откомпилируйте проект, загрузите в симулятор программу и запустите её на исполнение;
44) отладьте проект с помощью анимационной таблицы и согласно описанной выше последовательности для ST;

Видео YouTube

 
 
 Язык SFC.
 Для знакомства с SFC рассмотрим другую задачу.
Постановка задачи для решения на SFC.
После нажатия кнопки START открывается клапан kl1 и аппарат заполняется жидкостью до срабатывания LS2. После этого включается мешалка, открывается клапан kl2 для подачи ферментов. После срабатывания датчика  LS3, клапаны и мешалка отключаются, открывается клапан kl3, и продукт сливается с аппарата.
Когда аппарат пустой (LS1 отключен) клапан kl3 закрывается, и система переходит в начальное состояние.
         
 
 
 
 
 
Решение на SFC
SFC базируется на описании процесса в виде сетей Петри. Опишем поведение системы через механизмы сетей Петри.
Система может находится в одном из 4-х состояний (шагах программы):
1) начальное состояние - ожидание старта;
2) наполнение жидкостью;
3) добавление ферментов;
4) слив продукта;    
Во время каждого состояния положение исполнительных механизмов (и конечно же регулирующих органов) чётко определено: например, при наполнении жидкостью  - kl1 должен быть открыт.
Переход с состояния в состояние осуществляется по определенным условиям: например, система переходит в состояние "наполнение жидкостью" только после состояния "ожидание старта" и срабатывания условия перехода "если нажата кнопка START".
Таким образом, поведение системы можно записать в виде сети Петри, где шаги (состояния, позиции) соединены между собой переходами, которые активируются при срабатывании условий. Когда активируется какой-то шаг (Step), он получает маркер (Token) от шага, который деактивируется.
На левом рисунке показана программа управления в виде сети Петри, где маркер находится на шаге "Наполнение жидкостью".
На правом рисунке показана программа SFC в UNITY PRO. Все шаги и переходы объединяются в одну последовательность, именуемую сетью SFC.  В одной секции SFC может быть много сетей, но в нашем примере она только одна.  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Каждый шаг SFC характеризуется рядом свойств, которые задаются в окне свойств (контекстное меню шага -> Properties). Шаги должны иметь уникальные имена, с помощью которых их можно будет контролировать и даже управлять ими. Каждая сеть SFC должна начинаться с шага инициализации, который получит маркер (активируется) при старте ПЛК. Шаг инициализации в UNITY PRO делается с обычного шага, путем выставления опции "Initial Step".
 
При активности шага (при владении маркером), выполняется набор действий, прописанный в этом шаге. Действия прописываются в свойствах шага на вкладке Actions.
Действия могут осуществляться с булевыми переменными (BOOL/EBOOL) либо с целыми секциями, написанными на одном из 4-х языков ST/LD/IL/FBD. Действия могут производиться только типа ВКЛ/ОТКЛ: для переменных - это изменение состояния, а для секций - это запуск и останов выполнения секций. Не смотря на всего два типа действий, они могут осуществляться с фиксацией, с различными типами задержек и другими особенностями. Все эти особенности определяются квалификатором (Qualifier). В нашей программе используются только 3 типа квалификаторов:
N - при активности шага действие включено; для переменной это означает, что когда шаг активный - ей присваивается TRUE, а когда не активный - FALSE;
S - действие включается при активации шага; для переменной это означает, что когда шаг активируется - ей присваивается TRUE, и она остается в этом состоянии даже при деактивации шага;
R - действие отключается при активации шага; для переменной это означает, что когда шаг активируется - ей присваивается FALSE, и она остается в этом состоянии даже при деактивации шага;
 Таким образом для каждого действия определяется квалификатор и переменная (или секция) с которой осуществляется действие. Создается действие кнопкой New Action.
 
Каждый из переходов привязан к условию. Переход "пропускает" через себя маркер, при срабатывании условия перехода (Transition condition). Условие перехода может быть задано булевой переменной (BOOL/EBOOL) или же целой секцией, возвращающей булевый результат. В нашей программе в качестве условия перехода мы использовали только булевые переменные. Условия переходов настраиваются в соответствующем окне (контекстное меню перехода-> Properties)   
 
 
Сеть SFC должна быть зациклена, то есть после выполнения последнего (нижнего) шага, маркер должен вернуться на один из предыдущих шагов, но НЕ обязательно шага инициализации. В нашей программе, по условии задачи, после слива продукта с резервуара, нужно перейти на начало программы - ожидания кнопки Start. 
 В программе в качестве действий используются только булевые переменные (перечень действий указанный с правой стороны от шагов). Шаг инициализации "PreStart" не содержит действий, он используется только для ожидания. При активации шага "Nabor1" переменная kl1 устанавливается в TRUE ("S kl1"), и остается в этом положении до активации шага "Sliv", где выполняется действие "R kl1". При активности шага  "Nabor2" переменные kl2=TRUE и M1=TRUE, поскольку квалификатор указан "N". При деактивации шага эти переменные возвращаются в FALSE. Аналогично при активности шага "Sliv" переменная kl3=TRUE, при деактивации kl3= FALSE.
  Переходы с переменными Start, LS2, LS3 срабатывают только тогда, когда эти переменные = TRUE и соответствующие шаги перед ними активные. Переход с шага Sliv на PreStart срабатывает, когда активным является шаг "Sliv" и LS1=FALSE.
 
 
 
 
 
 
 
 
 
 
 
 
 
 45) создайте новый проект на базе М340 и сохраните его под именем SFC_Exmpl (шаг 1);
 46) создайте переменные, согласно таблице (шаг 2);
 
47) создайте секцию на языке SFC с названием Intro_SFC и с помощью панели инструментов наберите приведенную выше программу (шаг 3); 

Видео YouTube

48) скомпилируйте программу, соединитесь с симулятором ПЛК, загрузите в него программу и запустите на выполнение;
49) выделите все переменные в DataEditor и через контекстное меню создайте таблицу анимаций;
50) проверьте работу программы (шаг 4), обратите внимание на анимационные средства редактора SFC; 

Видео YouTube

Анимационные экраны.
Альтернативой анимационным таблицам есть анимационные экраны.
 

Видео YouTube

ą
Александр Пупена,
11 сент. 2012 г., 2:57
ą
Александр Пупена,
11 сент. 2012 г., 6:04
ą
Александр Пупена,
11 сент. 2012 г., 6:04
ą
Александр Пупена,
11 сент. 2012 г., 6:04
ą
Александр Пупена,
11 сент. 2012 г., 4:05
ą
Александр Пупена,
11 сент. 2012 г., 4:05
ą
Александр Пупена,
11 сент. 2012 г., 5:55
ą
Александр Пупена,
11 сент. 2012 г., 4:05
ą
Александр Пупена,
11 сент. 2012 г., 3:09
ą
Александр Пупена,
11 сент. 2012 г., 3:09
ą
Александр Пупена,
11 сент. 2012 г., 3:09
Comments