«Автоматизация систем отопления, вентиляции и кондиционирования воздуха». Фрагменты программы ДПО, ч. 2 - УКЦ

h2. Фрагменты учебного курса, часть 2

!(alignright)/upload/files/u/ukc96_02_01.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)! Журнал «Мир климата» продолжает публикацию фрагментов новой учебной программы Учебно-консультационного центра «УНИВЕРСИТЕТ КЛИМАТА» под названием «Автоматизация систем отопления, вентиляции и кондиционирования воздуха», начатую в № 94.

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

При разработке теоретической и практической составляющих курса сделан акцент на прикладных вопросах, касающихся современных систем автоматизации инженерного оборудования:

* !(alignleft)/upload/files/u/ukc96_02_02.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)! принципы управления: P, I, D и их сочетания;
* датчики параметров среды и исполнительные устройства;
* свободно программируемые и параметрические контроллеры;
* методы и инструменты разработки приложений для свободно программируемых контроллеров;
* аппаратные и программные средства диспетчеризации.

В ходе обучения перед слушателями последовательно выстраивается целостная картина принципов работы систем автоматизации и способов их практического воплощения с использованием наиболее продвинутых современных технологий.

Такой подход обеспечивает максимальное вовлечение аудитории в учебный процесс, так как основная масса участников обучения — ​сотрудники служб эксплуатации девелоперских и инжиниринговых компаний, представители сервисных организаций, которых прежде всего интересует возможность практического применения полученных знаний и опыта.

h2. Свободнопрограммируемые контроллеры

Свободнопрограммируемые контроллеры предназначены для построения нестандартных систем автоматизации и диспетчеризации. Они предоставляют разработчику возможность реализации практически любых алгоритмов управления, и, при необходимости, модификации их в течение жизненного цикла системы автоматизации.

!(alignright)/upload/files/u/ukc96_02_03.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)! Отличительными особенностями наиболее современных контроллеров являются:

* операционная система реального времени;
* встроенный 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°С для моделей без дисплея).

h2. Средства разработки приложений

!(alignleft)/upload/files/u/ukc96_02_04.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)! Фундаментальное отличие наиболее современных свободнопрограммируемых контроллеров от предыдущих поколений такого рода устройств — ​использование в качестве программного ядра операционной системы реального времени (ОСРВ) вместо BIOS.

В случае с BIOS программный код выполняется последовательно, при необходимости отрабатывая запросы на прерывания, во время выполнения которых основной программный цикл останавливается.

Достоинством ОСРВ по сравнению с системой на основе BIOS является многозадачность и, как следствие:

* уменьшенное время программного цикла (в среднем с 1 секунды до 200 миллисекунд);
* уменьшенное время загрузки системы при запуске (в среднем с 50 секунд до 10 секунд);
* модульная структура программных компонентов, что позволяет легко модифицировать систему, добавляя, удаляя или меняя компоненты, но не ядро;
* независимость модулей системы, обеспечивающая ее отказоустойчивость.

Наиболее характерным примером современной среды разработки является CAREL c.Suite, имеющая следующие достоинства:

* представляет собой набор независимых приложений, каждое из которых предназначено для реализации определенного этапа в процессе разработки программы для контроллера;
* реализована поддержка стандартных типов данных (в том числе 32-битовых целых, с плавающей точкой и других);
* возможно использование стандартных языков программирования ST, FBD, LD, SFC в соответствии с IEC61131 с возможностью произвольного их комбинирования;
* интегрирована поддержка различных коммуникационных протоколов (Modbus, BACnet, FTP и др.), в том числе нестандартных.

!(alignright)/upload/files/u/ukc96_02_05.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)! Разработка приложений в среде c.Suite может производиться как одним универсальным разработчиком, так и распределенной командой инженеров, каждый из которых отвечает за определенную часть проекта, используя при этом соответствующий компонент пакета c.Suite:

* c.Strategy — ​служит для описания функциональной составляющей работы установки и предназначен для использования специалистом в технологии вентиляции/кондиционирования/отопления/охлаждения;
* c.Mask — ​используется для разработки пользовательских интерфейсов и рассчитан на использование промышленным дизайнером и специалистом в эргономике;
* c.Design — ​предназначен для конфигурирования физических входов/выходов контроллера, а также коммуникационных интерфейсов и должен использоваться инженером-проектировщиком щитов автоматики;
* c.Factory — ​утилита, предназначенная для загрузки готового приложения в контроллер. Загрузка может производиться через интерфейсы USB, Ethernet или с помощью стандартного USB-накопителя, на который предварительно записывается готовый файл приложения. Указанная утилита рассчитана на использование специалистами сборочного производства щитов автоматики и не требует от них специальных знаний.

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

В этой публикации мы подробно остановимся на двух первых приложения c.Strategy и c.Mask.

h2. c.Strategy

Процесс разработки стратегии в c.Strategy полностью отвязан от аппаратной части контроллера, что позволяет создавать кроссплатформенные приложения, а также использовать однажды отлаженную логику в различных конфигурациях контроллеров.

!(alignright)/upload/files/u/ukc96_02_06.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

В приложении могут быть в любом порядке использованы элементы стратегии, созданные на стандартных языках ST, FBD, SFC и Ladder в соответствии с IEC61131.

Кроме того, пользователь имеет возможность создавать свои собственные функции, оформляя их в виде независимых библиотечных компонентов.

Разработчик имеет возможность отлаживать приложение как в программном симуляторе, так и в реальном контроллере, наблюдая в c.Strategy значения переменных, поступающие из контроллера, подключенного к среде разработки через порт USB или Ethernet.

c.Suite поддерживает стандартные типы данных (табл. 1).

Табл. 1(*) поддерживается только в c. Strategy

table(table).
|_. Тип данных |_. Описание |_. Размер |_. Нижний предел |_. Верхний предел|
| 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 начинается с создания проекта.

!/upload/files/u/ukc96_02_07.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

При выборе места расположения проекта не рекомендуется использовать кириллицу в именах папок и файлов проекта.

Проект может быть создан пустым или на основе шаблона, включающего в себя ряд готовых функций:

* контроль и сброс тревог;
* ведение лога тревог;
* отслеживание факта перезапуска контроллера, например если пропадает питание;
* управление версиями проекта;
* задержка запуска приложения при подаче питания на контроллер для предотвращения фиксации неустановившихся значений на физических входах контроллера;
* экспорт списка тревог в виде файла формата CSV;
* управление включением/выключением установки по сигналам с дискретного входа, из системы BMS, с встроенного пользовательского интерфейса и т. д.;
* подсчет времени наработки;
* экспорт/импорт параметров.

Структура проекта представлена в окне Solution Explorer:

p=. !/upload/files/u/ukc96_02_08.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Для использования тех или иных библиотечных функций в раздел Dependencies следует добавить соответствующие библиотеки, прежде всего — ​CAREL_BASIC_LIB.

p=. !/upload/files/u/ukc96_02_09.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Результат:

p=. !/upload/files/u/ukc96_02_10.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

А также иные пользовательские или стандартные библиотеки, доступные в разделе c.Suite портала ksa.carel.com

!/upload/files/u/ukc96_02_11.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Например, для использования готового PID-регулятора в раздел Dependencies следует добавить библиотеку PID_Adv_2_1.0.0.otlib

p=. !/upload/files/u/ukc96_02_12.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Результат:

p=. !/upload/files/u/ukc96_02_13.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

…и так далее.

Для добавления элементов программы следует выбрать один из четырех доступных языков:

!/upload/files/u/ukc96_02_14.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

После выбора FBD главное окно c.Strategy примет вид:

!/upload/files/u/ukc96_02_15.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Для использования того или иного библиотечного элемента следует вставить его на свободное место.

p=. !/upload/files/u/ukc96_02_16.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Окно библиотеки:

!/upload/files/u/ukc96_02_17.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Блоки можно отфильтровать по первым символам названия.

!/upload/files/u/ukc96_02_18.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

После выбора функционального блока он появится на странице стратегии.

!/upload/files/u/ukc96_02_19.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Аналогичным образом вводятся переменные.

p=. !/upload/files/u/ukc96_02_20.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

После нажатия левой кнопки мыши появится окно, где следует ввести имя создаваемой переменной и нажать Add.

!/upload/files/u/ukc96_02_21.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Далее следует указать свойства переменной.

!/upload/files/u/ukc96_02_22.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

*DataType* — ​тип данных, соответствует назначению переменной. Для аналоговой величины, которая может иметь дробные значения, логично использовать тип REAL. Кроме того, необходимо, чтобы тип данных переменной совпадал с типом данных входа функционального блока, к которому подключается переменная, в противном случае на этапе компилирования проекта будет выдано сообщение об ошибке.

*Min и Max* — ​минимальное и максимальное значения выбранной переменной. Используются прежде всего в пользовательском интерфейсе для ограничения возможных изменений параметра.

*Retain* —​ крайне важное свойство, при выборе которого переменная будет храниться в энергонезависимой памяти контроллера. Следует помнить, что ресурс энергонезависимой памяти современных микроконтроллеров не бесконечен и ограничен в среднем 200–400 тысячами циклов записи, после чего ячейка памяти может перестать корректно работать. Следовательно, в памяти типа RETAIN следует хранить только те переменные, которые меняются относительно редко.

*IO* — ​при выборе данного свойства переменная будет доступна для привязывания к физическим входам/выходам контроллера.

*Protocol* — ​при выборе данного свойства переменная будет доступна для передачи в коммуникационные интерфейсы систем диспетчеризации или взаимодействия с полевыми устройствами.

*UI* — ​при выборе данного свойства переменная будет доступна для вывода на экран встроенного пользовательского интерфейса контроллера или на внешний дисплей типа pGD1.

*DEV* — ​свойство предназначено для установки значения по умолчанию для переменной, хранящейся в памяти типа Retain.

*LOG* — ​при выборе данного свойства переменная будет доступна для автоматической записи в архив, расположенный в энергонезависимой памяти контроллера.

*UoM* — ​единица измерения — ​необязательный параметр.

*Comment* — ​комментарий, можно использовать кириллицу.

Таким образом, для переменной, в которой будет храниться требуемое значение параметра (уставка), свойства могут выглядеть следующим образом:

!/upload/files/u/ukc96_02_23.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

После нажатия OK символическое обозначение переменной появится на поле проекта.

!/upload/files/u/ukc96_02_24.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Далее следует подключить переменную к соответствующему входу функционального блока.

!/upload/files/u/ukc96_02_25.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Аналогичным образом добавим другие необходимые переменные.

!/upload/files/u/ukc96_02_26.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Обратите внимание, что переменную, которая может непрерывно меняться, мы храним в оперативной памяти контроллера, то есть параметр *_Retain_* не установлен!

Подключим новую переменную на соответствующий ее назначению вход функционального блока.

!/upload/files/u/ukc96_02_27.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Похожим образом добавим константы. Здесь работает то же правило, что и для переменных: тип данных должен соответствовать типу данных входа функционального блока, к которому мы подключаем переменную или константу.

Для выполнения этого правила следует соблюдать формат записи констант:

* тип *Real* —​ должна иметь десятичную точку;
* тип *Integer* и его варианты — ​не должны иметь десятичной точки;
* тип *Boolean* —​должна иметь значение True или False;
* Тип *Time* — ​должна иметь формат T#ххххMS, где хххх — ​время в миллисекундах. Допускается также указание времени в секундах и другие варианты в соответствии со стандартом.

Таким образом, константу типа Real следует создавать так:

!/upload/files/u/ukc96_02_28.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

После чего ее следует подключить к входу функционального блока аналогично переменной.

!/upload/files/u/ukc96_02_29.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Аналогичным образом добавим недостающие константы и переменные.

!/upload/files/u/ukc96_02_30.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Теперь мы полностью оформили стратегию, содержащую один PID-регулятор.

Добавим еще одну страницу в проект, выбрав на этот раз язык программирования ST.

!/upload/files/u/ukc96_02_31.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Появится окно для ввода команд в соответствии с синтаксисом языка ST.

!/upload/files/u/ukc96_02_32.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Для примера решим следующую задачу: будем считать, что значение текущей температуры поступает в контроллер от датчика, подключенного через последовательный интерфейс по протоколу Modbus. Часто такие устройства передают аналоговые величины в виде целых, умноженных на 10, то есть, например, величина 23.5 передается как 235.

Создадим соответствующую переменную.

!/upload/files/u/ukc96_02_33.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

В окне программы на ST введем следующую команду:

!/upload/files/u/ukc96_02_34.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Данная команда сначала преобразует значение целой переменной Current_Temperature_BMS в формат Real, после чего производится ее деление на 10 и результат записывается в переменную Current_Temperature, которая далее поступает на вход PID-регулятора на ранее созданной FBD-странице.

Для упорядочивания элементов проекта пользователь имеет возможность переименовывать программные элементы и менять их последовательность в Solution Explorer.

p=. !/upload/files/u/ukc96_02_35.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Полученный проект может быть откомпилирован, для чего следует выбрать в меню соответствующий пункт.

p=. !/upload/files/u/ukc96_02_36.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

В случае отсутствия ошибок в окне Output появится следующее сообщение:

p=. !/upload/files/u/ukc96_02_37.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

На этом работа в c.Strategy может быть временно закончена, можно перейти к созданию пользовательского интерфейса в компоненте c.Mask.

p=. !/upload/files/u/ukc96_02_38.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

h2. c.Mask

c.Mask используется для определения вида отображения информации на встроенном в контроллер пользовательском терминале или на внешнем дисплее типа pGD1.

Переменные, созданные в c.Strategy, доступны в c.Mask, так обеспечивается связь между логикой работы приложения и отображением информации на дисплее.

Запуск c.Mask возможен как независимо от c.Strategy, так и непосредственно из меню редактора стратегии.

p=. !/upload/files/u/ukc96_02_39.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

В результате откроется c.Mask с проектом, который был открыт в c.Strategy.

!/upload/files/u/ukc96_02_40.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Одно из основных понятий c.Mask — ​цикл масок, Loop. Маски, входящие в цикл, то есть соединенные между собой связью и подключенные к объекту Loop, получают следующий встроенный функционал:

p=. !/upload/files/u/ukc96_02_41.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

* при нажатии кнопок «ВВЕРХ» или «ВНИЗ» на пользовательском терминале происходит переход на маску, находящуюся в цикле выше или соответственно ниже текущей;
* при нажатии кнопки «ENTER» на какой-либо маске происходит переход курсора на ближайшее поле, в котором находится переменная, которая может быть записана, то есть не Read Only;
* при нахождении курсора в поле с переменной при нажатии кнопок «ВВЕРХ» или «ВНИЗ» происходит изменение значения выбранной переменной; при нажатии кнопки «ENTER» при нахождении курсора в поле переменной происходит запись текущего значения переменной и автоматический переход на следующее ближайшее поле с переменной не Read Only.

Все объекты интерфейса имеют свойства, причем они различны для проекта в целом, для конкретной маски и для конкретного поля на маске.

Например, если кликнуть мышью на пустом месте окна проекта, свойства будут выглядеть следующим образом:

p=. !/upload/files/u/ukc96_02_42.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Где, например, свойство BeginFromMask определяет маску, которая будет отображаться первой при запуске контроллера.

Свойства маски выглядят так:

p=. !/upload/files/u/ukc96_02_43.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Например, для использования кириллицы в пользовательском интерфейсе необходимо установить в свойстве Font значение CAREL_TERM_EAST. При этом если выполнить это действие в свойствах проекта, все объекты на листе (маски, текстовые поля и так далее) получат по умолчанию также свойство CAREL_TERM_EAST в поле Font.

p=. !/upload/files/u/ukc96_02_44.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Однако при необходимости можно установить это свойство на уровне маски, не меняя его на уровне проекта — ​в этом случае по умолчанию будет использоваться CAREL_TERM_STD.

p=. !/upload/files/u/ukc96_02_45.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Для вывода на экран значения той или иной переменной следует «вытащить» из Toolbox объект Variable и «уронить» его на выбранную маску.

p=. !/upload/files/u/ukc96_02_46.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Появится окно выбора переменных, в котором следует выбрать нужную. В данном окне также имеется поле фильтра, позволяющее отсеять переменные, начинающиеся с определенных символов.

!/upload/files/u/ukc96_02_47.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

После выбора переменной на маске появится соответствующее поле:

p=. !/upload/files/u/ukc96_02_48.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Поля с переменными на масках отображаются символами:

* *RRR* — ​для переменных типа Real;
* *III* — ​для переменных типа Integer;
* *B* —​ для переменных типа Boolean.

Заглавными символами обозначаются поля переменных, которые могут быть записаны, то есть не Read Only, а строчными — ​соответственно Read Only.

Количество символов обозначает количество цифр, с помощью которого будет отображаться переменная.

Поведение переменной можно менять с помощью полей свойств.

p=. !/upload/files/u/ukc96_02_49.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Например, при необходимости переменная может быть принудительно заблокирована от изменения с пользовательского интерфейса путем установки свойства Format в Output.

p=. !/upload/files/u/ukc96_02_50.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Соответственно поле переменной при этом изменится.

p=. !/upload/files/u/ukc96_02_51.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Аналогично из Toolbox перетаскивается на маску объект Text:

p=. !/upload/files/u/ukc96_02_52.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Для редактирования содержимого поля Text следует кликнуть по нему — ​появится окно для ввода текста.

p=. !/upload/files/u/ukc96_02_53.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Введите текст:

p=. !/upload/files/u/ukc96_02_62.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

После нажатия Ok соответствующий текст появится на маске.

p=. !/upload/files/u/ukc96_02_54.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Аналогичным образом добавим переменную Temperature_Setpoint и поле с текстом «Уставка»:

p=. !/upload/files/u/ukc96_02_55.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Для изменения масштаба отображения информации на экране в 2 раза можно воспользоваться свойством маски ZoomCode — ​появится окно, в котором можно интерактивно выбрать строки экрана, в которых масштаб будет увеличен.

p=. !/upload/files/u/ukc96_02_56.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Результат:

p=. !/upload/files/u/ukc96_02_57.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

При необходимости каждый из объектов можно подвинуть в нужное место на экране.

Для добавления масок в цикл следует перетащить соответствующий объект из Toolbox на поле проекта.

p=. !/upload/files/u/ukc96_02_58.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Как и все другие объекты, маски и циклы можно переименовывать для повышения читаемости проекта.

p=. !/upload/files/u/ukc96_02_59.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

Действуя по уже известной схеме, добавляем на новую маску поле с переменной PID_Output и соответствующий текст:

p=. !/upload/files/u/ukc96_02_60.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

После этого проект можно откомпилировать. При отсутствии ошибок в окне Output появится сообщение:

!/upload/files/u/ukc96_02_61.jpg (Автоматизация систем отопления, вентиляции и кондиционирования воздуха)!

*_В следующем номере журнала мы продолжим публикацию фрагментов нового учебного курса по автоматизации, входящего в программу обучения в Учебно-консультационном центре «УНИВЕРСИТЕТ КЛИМАТА»._*