Фрагменты учебного курса, часть 2
Журнал «Мир климата» продолжает публикацию фрагментов новой учебной программы Учебно-консультационного центра «УНИВЕРСИТЕТ КЛИМАТА» под названием «Автоматизация систем отопления, вентиляции и кондиционирования воздуха», начатую в № 94.
При разработке теоретической и практической составляющих курса сделан акцент на прикладных вопросах, касающихся современных систем автоматизации инженерного оборудования:
- принципы управления: P, I, D и их сочетания;
- датчики параметров среды и исполнительные устройства;
- свободно программируемые и параметрические контроллеры;
- методы и инструменты разработки приложений для свободно программируемых контроллеров;
- аппаратные и программные средства диспетчеризации.
Такой подход обеспечивает максимальное вовлечение аудитории в учебный процесс, так как основная масса участников обучения — сотрудники служб эксплуатации девелоперских и инжиниринговых компаний, представители сервисных организаций, которых прежде всего интересует возможность практического применения полученных знаний и опыта.
Свободнопрограммируемые контроллеры
Свободнопрограммируемые контроллеры предназначены для построения нестандартных систем автоматизации и диспетчеризации. Они предоставляют разработчику возможность реализации практически любых алгоритмов управления, и, при необходимости, модификации их в течение жизненного цикла системы автоматизации.
- операционная система реального времени;
- встроенный Ethernet: Modbus TCP master/slave, BACNet B-BC Webserver (HTTP), FTP сервер;
- встроенный USB-порт;
- встроенные порты RS485 с расширенными возможностями. Поддержка Modbus®, BACnet™;
- специализированный чип IO;
- универсальные входы/выходы U1…U10, каждый из которых может быть сконфигурирован как:
- АНАЛОГОВЫЙ ВХОД: NTC, PTC, PT100, PT500, PT1000, 0/1V, 0/5V, 0/10V, 0/20mA, 4/20mA,
- ДИСКРЕТНЫЙ ВХОД: сухой контакт (стандартный или быстродействующий),
- АНАЛОГОВЫЙ ВЫХОД: 0/10V или ШИМ;
- повышенная разрешающая способность АЦП — 14 ит;
- увеличенная нагрузочная способность SSR24В выходов, добавлены модели с SSR220В;
- расширенный диапазон рабочих температур (–40…+70°С для моделей без дисплея).
Средства разработки приложений
В случае с BIOS программный код выполняется последовательно, при необходимости отрабатывая запросы на прерывания, во время выполнения которых основной программный цикл останавливается.
Достоинством ОСРВ по сравнению с системой на основе BIOS является многозадачность и, как следствие:
- уменьшенное время программного цикла (в среднем с 1 секунды до 200 миллисекунд);
- уменьшенное время загрузки системы при запуске (в среднем с 50 секунд до 10 секунд);
- модульная структура программных компонентов, что позволяет легко модифицировать систему, добавляя, удаляя или меняя компоненты, но не ядро;
- независимость модулей системы, обеспечивающая ее отказоустойчивость.
Наиболее характерным примером современной среды разработки является CAREL c.Suite, имеющая следующие достоинства:
- представляет собой набор независимых приложений, каждое из которых предназначено для реализации определенного этапа в процессе разработки программы для контроллера;
- реализована поддержка стандартных типов данных (в том числе 32-битовых целых, с плавающей точкой и других);
- возможно использование стандартных языков программирования ST, FBD, LD, SFC в соответствии с IEC61131 с возможностью произвольного их комбинирования;
- интегрирована поддержка различных коммуникационных протоколов (Modbus, BACnet, FTP и др.), в том числе нестандартных.
- c.Strategy — служит для описания функциональной составляющей работы установки и предназначен для использования специалистом в технологии вентиляции/кондиционирования/отопления/охлаждения;
- c.Mask — используется для разработки пользовательских интерфейсов и рассчитан на использование промышленным дизайнером и специалистом в эргономике;
- c.Design — предназначен для конфигурирования физических входов/выходов контроллера, а также коммуникационных интерфейсов и должен использоваться инженером-проектировщиком щитов автоматики;
- c.Factory — утилита, предназначенная для загрузки готового приложения в контроллер. Загрузка может производиться через интерфейсы USB, Ethernet или с помощью стандартного USB-накопителя, на который предварительно записывается готовый файл приложения. Указанная утилита рассчитана на использование специалистами сборочного производства щитов автоматики и не требует от них специальных знаний.
Такой подход позволяет привлекать к каждому из этапов разработки приложения соответствующих узкопрофильных специалистов, что в итоге ведет к снижению требований к их квалификации и, как следствие, сокращает бюджет проекта.
В этой публикации мы подробно остановимся на двух первых приложения c.Strategy и c.Mask.
c.Strategy
Процесс разработки стратегии в c.Strategy полностью отвязан от аппаратной части контроллера, что позволяет создавать кроссплатформенные приложения, а также использовать однажды отлаженную логику в различных конфигурациях контроллеров.
В приложении могут быть в любом порядке использованы элементы стратегии, созданные на стандартных языках ST, FBD, SFC и Ladder в соответствии с IEC61131.
Кроме того, пользователь имеет возможность создавать свои собственные функции, оформляя их в виде независимых библиотечных компонентов.
Разработчик имеет возможность отлаживать приложение как в программном симуляторе, так и в реальном контроллере, наблюдая в c.Strategy значения переменных, поступающие из контроллера, подключенного к среде разработки через порт USB или Ethernet.
c.Suite поддерживает стандартные типы данных (табл. 1).
Табл. 1(*) поддерживается только в c. Strategy
Тип данных | Описание | Размер | Нижний предел | Верхний предел |
USINT | Unsigned Shot Integer | 8 | 0 | 255 |
SINT | Short Integer | 8 | -128 | 127 |
UINT | Unsigned Integer | 16 | 0 | 65535 |
INT | Integer | 16 | -32768 | 32767 |
UDINT | Unsigned Double Integer | 32 | 0 | 4294967295 |
DINT | Double Integer | 32 | -2147483648 | 2147483647 |
TIME (*) | Time | 32 | 0 | 49d17h2m47s294ms |
DATE (*) | Date | 32 | 1970-01-01 | 2038-01-18 |
BOOL | Boolean | 1 | – | – |
BYTE | Byte | 8 | 0 | 255 |
WORD | Word | 16 | 0 | 65535 |
DWORD | Double Word | 32 | 0 | 4294967295 |
REAL | Real | 32 | ±1.175494351E-38 | ±3.402823466E+38 |
STRING | String | – | – |
Разработка приложения в c.Strategy начинается с создания проекта.
При выборе места расположения проекта не рекомендуется использовать кириллицу в именах папок и файлов проекта.
Проект может быть создан пустым или на основе шаблона, включающего в себя ряд готовых функций:
- контроль и сброс тревог;
- ведение лога тревог;
- отслеживание факта перезапуска контроллера, например если пропадает питание;
- управление версиями проекта;
- задержка запуска приложения при подаче питания на контроллер для предотвращения фиксации неустановившихся значений на физических входах контроллера;
- экспорт списка тревог в виде файла формата CSV;
- управление включением/выключением установки по сигналам с дискретного входа, из системы BMS, с встроенного пользовательского интерфейса и т. д.;
- подсчет времени наработки;
- экспорт/импорт параметров.
Структура проекта представлена в окне Solution Explorer:
Для использования тех или иных библиотечных функций в раздел Dependencies следует добавить соответствующие библиотеки, прежде всего — CAREL_BASIC_LIB.
Результат:
А также иные пользовательские или стандартные библиотеки, доступные в разделе c.Suite портала ksa.carel.com
Например, для использования готового PID-регулятора в раздел Dependencies следует добавить библиотеку PID_Adv_2_1.0.0.otlib
Результат:
…и так далее.
Для добавления элементов программы следует выбрать один из четырех доступных языков:
После выбора FBD главное окно c.Strategy примет вид:
Для использования того или иного библиотечного элемента следует вставить его на свободное место.
Окно библиотеки:
Блоки можно отфильтровать по первым символам названия.
После выбора функционального блока он появится на странице стратегии.
Аналогичным образом вводятся переменные.
После нажатия левой кнопки мыши появится окно, где следует ввести имя создаваемой переменной и нажать Add.
Далее следует указать свойства переменной.
DataType — тип данных, соответствует назначению переменной. Для аналоговой величины, которая может иметь дробные значения, логично использовать тип REAL. Кроме того, необходимо, чтобы тип данных переменной совпадал с типом данных входа функционального блока, к которому подключается переменная, в противном случае на этапе компилирования проекта будет выдано сообщение об ошибке.
Min и Max — минимальное и максимальное значения выбранной переменной. Используются прежде всего в пользовательском интерфейсе для ограничения возможных изменений параметра.
Retain — крайне важное свойство, при выборе которого переменная будет храниться в энергонезависимой памяти контроллера. Следует помнить, что ресурс энергонезависимой памяти современных микроконтроллеров не бесконечен и ограничен в среднем 200–400 тысячами циклов записи, после чего ячейка памяти может перестать корректно работать. Следовательно, в памяти типа RETAIN следует хранить только те переменные, которые меняются относительно редко.
IO — при выборе данного свойства переменная будет доступна для привязывания к физическим входам/выходам контроллера.
Protocol — при выборе данного свойства переменная будет доступна для передачи в коммуникационные интерфейсы систем диспетчеризации или взаимодействия с полевыми устройствами.
UI — при выборе данного свойства переменная будет доступна для вывода на экран встроенного пользовательского интерфейса контроллера или на внешний дисплей типа pGD1.
DEV — свойство предназначено для установки значения по умолчанию для переменной, хранящейся в памяти типа Retain.
LOG — при выборе данного свойства переменная будет доступна для автоматической записи в архив, расположенный в энергонезависимой памяти контроллера.
UoM — единица измерения — необязательный параметр.
Comment — комментарий, можно использовать кириллицу.
Таким образом, для переменной, в которой будет храниться требуемое значение параметра (уставка), свойства могут выглядеть следующим образом:
После нажатия OK символическое обозначение переменной появится на поле проекта.
Далее следует подключить переменную к соответствующему входу функционального блока.
Аналогичным образом добавим другие необходимые переменные.
Обратите внимание, что переменную, которая может непрерывно меняться, мы храним в оперативной памяти контроллера, то есть параметр Retain не установлен!
Подключим новую переменную на соответствующий ее назначению вход функционального блока.
Похожим образом добавим константы. Здесь работает то же правило, что и для переменных: тип данных должен соответствовать типу данных входа функционального блока, к которому мы подключаем переменную или константу.
Для выполнения этого правила следует соблюдать формат записи констант:
- тип Real — должна иметь десятичную точку;
- тип Integer и его варианты — не должны иметь десятичной точки;
- тип Boolean —должна иметь значение True или False;
- Тип Time — должна иметь формат T#ххххMS, где хххх — время в миллисекундах. Допускается также указание времени в секундах и другие варианты в соответствии со стандартом.
Таким образом, константу типа Real следует создавать так:
После чего ее следует подключить к входу функционального блока аналогично переменной.
Аналогичным образом добавим недостающие константы и переменные.
Теперь мы полностью оформили стратегию, содержащую один PID-регулятор.
Добавим еще одну страницу в проект, выбрав на этот раз язык программирования ST.
Появится окно для ввода команд в соответствии с синтаксисом языка ST.
Для примера решим следующую задачу: будем считать, что значение текущей температуры поступает в контроллер от датчика, подключенного через последовательный интерфейс по протоколу Modbus. Часто такие устройства передают аналоговые величины в виде целых, умноженных на 10, то есть, например, величина 23.5 передается как 235.
Создадим соответствующую переменную.
В окне программы на ST введем следующую команду:
Данная команда сначала преобразует значение целой переменной Current_Temperature_BMS в формат Real, после чего производится ее деление на 10 и результат записывается в переменную Current_Temperature, которая далее поступает на вход PID-регулятора на ранее созданной FBD-странице.
Для упорядочивания элементов проекта пользователь имеет возможность переименовывать программные элементы и менять их последовательность в Solution Explorer.
Полученный проект может быть откомпилирован, для чего следует выбрать в меню соответствующий пункт.
В случае отсутствия ошибок в окне Output появится следующее сообщение:
На этом работа в c.Strategy может быть временно закончена, можно перейти к созданию пользовательского интерфейса в компоненте c.Mask.
c.Mask
c.Mask используется для определения вида отображения информации на встроенном в контроллер пользовательском терминале или на внешнем дисплее типа pGD1.
Переменные, созданные в c.Strategy, доступны в c.Mask, так обеспечивается связь между логикой работы приложения и отображением информации на дисплее.
Запуск c.Mask возможен как независимо от c.Strategy, так и непосредственно из меню редактора стратегии.
В результате откроется c.Mask с проектом, который был открыт в c.Strategy.
Одно из основных понятий c.Mask — цикл масок, Loop. Маски, входящие в цикл, то есть соединенные между собой связью и подключенные к объекту Loop, получают следующий встроенный функционал:
- при нажатии кнопок «ВВЕРХ» или «ВНИЗ» на пользовательском терминале происходит переход на маску, находящуюся в цикле выше или соответственно ниже текущей;
- при нажатии кнопки «ENTER» на какой-либо маске происходит переход курсора на ближайшее поле, в котором находится переменная, которая может быть записана, то есть не Read Only;
- при нахождении курсора в поле с переменной при нажатии кнопок «ВВЕРХ» или «ВНИЗ» происходит изменение значения выбранной переменной; при нажатии кнопки «ENTER» при нахождении курсора в поле переменной происходит запись текущего значения переменной и автоматический переход на следующее ближайшее поле с переменной не Read Only.
Все объекты интерфейса имеют свойства, причем они различны для проекта в целом, для конкретной маски и для конкретного поля на маске.
Например, если кликнуть мышью на пустом месте окна проекта, свойства будут выглядеть следующим образом:
Где, например, свойство BeginFromMask определяет маску, которая будет отображаться первой при запуске контроллера.
Свойства маски выглядят так:
Например, для использования кириллицы в пользовательском интерфейсе необходимо установить в свойстве Font значение CAREL_TERM_EAST. При этом если выполнить это действие в свойствах проекта, все объекты на листе (маски, текстовые поля и так далее) получат по умолчанию также свойство CAREL_TERM_EAST в поле Font.
Однако при необходимости можно установить это свойство на уровне маски, не меняя его на уровне проекта — в этом случае по умолчанию будет использоваться CAREL_TERM_STD.
Для вывода на экран значения той или иной переменной следует «вытащить» из Toolbox объект Variable и «уронить» его на выбранную маску.
Появится окно выбора переменных, в котором следует выбрать нужную. В данном окне также имеется поле фильтра, позволяющее отсеять переменные, начинающиеся с определенных символов.
После выбора переменной на маске появится соответствующее поле:
Поля с переменными на масках отображаются символами:
- RRR — для переменных типа Real;
- III — для переменных типа Integer;
- B — для переменных типа Boolean.
Заглавными символами обозначаются поля переменных, которые могут быть записаны, то есть не Read Only, а строчными — соответственно Read Only.
Количество символов обозначает количество цифр, с помощью которого будет отображаться переменная.
Поведение переменной можно менять с помощью полей свойств.
Например, при необходимости переменная может быть принудительно заблокирована от изменения с пользовательского интерфейса путем установки свойства Format в Output.
Соответственно поле переменной при этом изменится.
Аналогично из Toolbox перетаскивается на маску объект Text:
Для редактирования содержимого поля Text следует кликнуть по нему — появится окно для ввода текста.
Введите текст:
После нажатия Ok соответствующий текст появится на маске.
Аналогичным образом добавим переменную Temperature_Setpoint и поле с текстом «Уставка»:
Для изменения масштаба отображения информации на экране в 2 раза можно воспользоваться свойством маски ZoomCode — появится окно, в котором можно интерактивно выбрать строки экрана, в которых масштаб будет увеличен.
Результат:
При необходимости каждый из объектов можно подвинуть в нужное место на экране.
Для добавления масок в цикл следует перетащить соответствующий объект из Toolbox на поле проекта.
Как и все другие объекты, маски и циклы можно переименовывать для повышения читаемости проекта.
Действуя по уже известной схеме, добавляем на новую маску поле с переменной PID_Output и соответствующий текст:
После этого проект можно откомпилировать. При отсутствии ошибок в окне Output появится сообщение:
В следующем номере журнала мы продолжим публикацию фрагментов нового учебного курса по автоматизации, входящего в программу обучения в Учебно-консультационном центре «УНИВЕРСИТЕТ КЛИМАТА».