пн-чт 09:00-18:00, пт 09:00-17:00
+7 (812) 648-03-47
+7 (812) 648-03-47 +7 (495) 108-12-75

sales@rusavtomatika.com

Режим работы:

пн-чт 09:00-18:00, пт 09:00-17:00

Адрес:

199178, Санкт-Петербург,
Малый пр. В. О. 57 корп. 3

Карта проезда

Подробнее

Каталог

Макросы в EasyBuilder Pro. Пример использования. Терморегулятор

14.04.2020

Скачать

Допустим нам необходимо регулировать температуру объекта не имея в распоряжении специализированного устройства - терморегулятора. Мы хотим обойтись модулем ввода-вывода для считывания температуры и управления нагревателем с помощью реле. Таким модулем может быть, например, IECON EBM-B с 10 универсальными входами, каждый из которых может быть настроен на считывание температуры. Так же, имея на борту в общей сложности 10 выходов, с помощью этого модуля можно реализовать 10-канальный терморегулятор. Но, для простоты в нашем примере будем разрабатывать 1-канальный двухпозиционный терморегулятор с релейным выходом.

На панель оператора будет возложена задача поддержания заданной пользователем температуры. Модуль ввода-вывода будет измерять температуру, сообщать её панели по запросу, а по команде с панели включать/выключать нагреватель. Безопасность такой связки обеспечивается самим модулем ввода-вывода, в случае прерывания обмена данными по протоколу Modbus, модуль способен переводить выходы в выключенное состояние. Тем самым исключается вероятность бесконтрольного нагрева при разрыве связи.

Любая панель Weintek справится с этой задачей, для нашего примера возьмем самый простой вариант - модель MT8051iP.

Проект для MT8051iP


Создадим новый проект для MT8051iP и добавим устройство Modbus RTU.
Параметры подключения EBM-B по COM-порту находим в документации устройства. Для EBM-B введем такие: скорость 19200, биты данных 8 , четность None, стоповые 1. Документацию к модулю EBM-B вы можете скачать на нашем сайте.

Интерфейс оператора


Создадим простой интерфейс оператора для управления терморегулятором. Нас интересует текущая измеренная температура, установленная температура, индикатор включения нагревателя и общий выключатель регулятора. Текущая и измеренная температуры выводятся с помощью объекта “Числа”, индикатор включения нагревателя с помощью битового индикатора, а выключатель регулятора - это битовый переключатель (тумблер).

Теги для доступа к параметрам


В библиотеке адресных меток создадим теги для доступа к этим параметрам и привяжем их к объектам интерфейса.

Адрес измеренной температуры - 4x19. Он соответствует регистру измеренного значения с аналогового входа “I1” модуля EBM-B.

Для включения нагревателя будем использовать релейный выход “RO 1”, он управляется через регистр 4x69.
Для включения реле требуется записывать в этот регистр 1, а для выключения - 0. Так как нас интересуют только 2 состояния - вкл/выкл, будет удобнее использовать битовую адресацию. Установка младшего бита регистра даст необходимое значение - 1.
Привяжем тег управления релейным выходом к младшему биту регистра 4x69, получится адрес- 4x_bit-6900.
Правила битовой адресации можно почитать здесь.

Осталось добавить тег заданной температуры и тег общего выключателя, температуру мы разместим в регистре LW-1, а выключатель в LB-1.

Макросы терморегулятора


Логика работы EasyBuilder такова, что практически любое взаимодействие объектов между собой организуется через адресное пространство панели. Это же касается и макросов. Единственная возможность взаимодействия кода макроса с внешним миром, в том числе интерфейсом оператора - обмен данными через адресное пространство. Под адресным пространством панели подразумевается не только набор локальных регистров самой панели, но и регистры периферийных устройств, адресное пространство которых присоединяется к адресному пространству панели на этапе разработки проекта в EasyBuilder.

Основными функциями взаимодействия макроса с адресным пространством панели являются функции GetData для чтения данных и SetData для записи. Также есть производные этих функций - GetDataEx и SetDataEx. Разница между этими наборами функций заключается в том, что функции GetData и SetData прекращают работу функции макроса в случае возникновения ошибки, а функции GetDataEx и SetDataEx продолжают работу макроса несмотря на ошибку. Ошибка в функции может возникнуть при обращении к данным внешних устройств.

Для нашего проекта напишем 4 макроса:

  • макрос включения нагревателя;
  • макрос выключения нагревателя;
  • макрос автоматической регулировки температуры;
  • макрос инициализации.

Макрос включения нагревателя


Создаем новый макрос с названием “HeaterOn” и пишем следующий код:

macro_command main()

bool heater=true

SetData(heater, "MODBUS RTU", "Heater_switch", 1)

end macro_command

Нам необходимо вписать две строчки кода.
В первой объявляем булевскую переменную “heater” и присваиваем ей значение “true”.
Во второй строке нужно создать функцию SetData, которая будет записывать значение переменной “heater” в тег "Heater_switch". Этот тег мы ранее создали в библиотеке адресных меток.
Для этого удобнее всего воспользоваться мастером функций (смотрите на картинке ниже).
После создания переменной, вызываем мастер, выбираем нужную функцию, переменную и тег. После этого сформированная функция SetData появится автоматически.

 

Макрос выключения нагревателя


Макрос выключения нагревателя отличается от макроса включения не только значением переменной “heater”, которая должна быть <b'>false , но и задержкой в одну секунду перед записью значения в регистр (команда DELAY(1000)). Для чего это сделано, будет понятно чуть ниже в графе “безопасность”. Макрос называется “HeaterOff”:

macro_command main()

bool heater=false

DELAY(1000)

SetData(heater, "MODBUS RTU", "Heater_switch", 1)

end macro_command

 

Макрос автоматической регулировки температуры


А теперь напишем основной макрос нашего терморегулятора, который в автоматическом режиме будет принимать решение, когда следует включить нагреватель, а когда его выключить. Создаем новый макрос с названием “Thermoregulator” и пишем следующий код:

macro_command main()

short get_temp, set_temp //Переменные измеренной и установленной температуры

GetData(get_temp, "MODBUS RTU", "Measured_temperature", 1) //Считываем измеренную температуру

GetData(set_temp, "Local HMI", "Set_temperature", 1)//Считываем установленную температуру

if get_temp<(set_temp-3) then //Условие включения нагревателя с гистерезисом 3

SYNC_TRIG_MACRO("HeaterOn") //Включаем нагрев

else

 if get_temp>set_temp then //Условие выключения нагревателя

            SYNC_TRIG_MACRO("HeaterOff") //Выключаем нагрев

 end if

end if

end macro_command

Переменная типа short имеет размер 16 бит со знаком, используем этот тип для переменных измеренной и установленной температуры. Нам необходимо считать обе температуры функцией GetData, так как арифметические операции в макросе можно применять только к переменным макроса. Здесь точно так же можно воспользоваться мастером функций.
Далее вставляем два условных оператора if для определения условий включения и выключения нагревателя. Условием для включения нагревателя будет получение любого значение текущей температуры ниже значения, которое меньше установленной температуры на 3 градуса. А условием выключения - любое значение текущей температуры выше установленной. Включение и выключение нагревателя будут выполнять ранее написанные макросы HeaterOn и HeaterOff , вызывать их будет функция SYNC_TRIG_MACRO. Функцию также можно вставить с помощью мастера функций.

Основной макрос готов, при запуске он проверяет текущие показания температуры, включает, или выключает нагрев, либо ничего не делает, если температура в норме. Теперь, для того чтобы терморегулятор правильно работал, нужно организовать периодический запуск макроса после того как будет включен тумблер on/off, и остановку периодического запуска после выключения. Для этого воспользуемся способом запуска макроса №2 описанного в предыдущей статье. Укажем период выполнения в 1 секунду (10 х 100мс) и привяжем бит безопасности к тегу “Control_enabled”.

Безопасность


Нужно учесть пару моментов, имея ввиду то, что наш терморегулятор - это два устройства, а не одно.

Первый момент. Пока макрос работает, он следит за изменением температуры. Но, как только мы блокируем макрос, выход на нагреватель остается в последнем установленном макросом состоянии. Если нагреватель был включен, то он так и останется включенным после блокировки макроса. Чтобы этого избежать, необходимо выключить нагреватель после блокировки макроса. Для этого воспользуемся опцией вызова макроса самим тумблером (Способ №6) и выберем вызов HeaterOffв момент переключения тумблера из положения ONв положение OFF:

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

Второй момент. Если произойдет разрыв связи с модулем ввода-вывода, панель выведет на экран окно с ошибкой. Так выглядит окно по умолчанию, при желании его можно полностью переделать, например, изменить надпись на "Устройство не отвечает". Окно будет вызвано экранными объектами привязанными к регистрам модуля ввода-вывода, как только один из запросов отправленный этими объектами вернется с ошибкой.

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

Экранные объекты, такие как поле измеренной температуры и битовый индикатор, запрашивают данные непрерывно с максимально возможной скоростью независимо от работы макроса. В то время как макрос запрашивает данные только один раз в секунду. Не смотря на это, и экранные объекты, и макрос используют одну и ту же очередь запросов в драйвере Modbus.

 

Макрос инициализации


Нам необходимо записать в регистр 4x42 значение 0, для того чтобы включить функцию сброса выходов при потере связи между модулем и панелью оператора. Для этого создаем макрос с названием “ Init” и пишем код:

macro_command main()

short value=0 //Значение, которое мы хотим передать в регистр

short err=1  //Код ошибки функции SetDataEx

while err>0

            SetDataEx(value, "EBM-B", 4x, 42, 1)

            GetError(err)

wend

end macro_command

Чтобы макрос запускался при старте панели, используем однократный вызов (способ №1).

Так как существует риск что запрос на запись параметра не пройдет по какой-либо причине, мы написали макрос, который не закончит свою работу до тех пор, пока запись не будет произведена. Цикл while-wend будет повторяться, пока значение переменной err не станет равной нулю. Используем функцию SetDataEx для записи значения в регистр, чтобы в случае ошибки макрос не прерывался. Функция GetError считывает код ошибки - результат выполнения функции SetDataEx. В случае успешного выполнения код ошибки равен нулю.

 

Готово


Проект готов. Сохраняем, компилируем и запускаем оффлайн-симуляцию, чтобы проверить работоспособность. Если сразу ввести значение в поле установленной температуры, мы увидим, что ничего не происходит. Но как только мы установим тумблер в положение ON, то сразу увидим включение нагрева. Макрос начнет работать и контролировать температу. При переключении тумблера в положение OFF, запустится макрос “HeaterOff”, а макрос “Thermoregulator” перестанет вызываться.

 

 

На этом простом примере можно убедиться насколько функциональным и удобным инструментом может быть операторская панель Weintek в решении множества тривиальных и не очень тривиальных задач промышленной автоматизации. Мы коснулись лишь одного аспекта применения макросов - взаимодействие с внешними и внутренними регистрами данных. Но в макросах также есть функции доступа к портам COM и TCP, математические функции, функции работы с массивами, строками, а также с базами данных. Сегодня панель оператора - далеко не только средство организации пользовательского интерфейса между оборудованием и пользователем, это полноценная интеллектуальная рабочая станция.

Скачать

  • Скачать файл проекта "Макрос автоматической регулировки температуры":
    Thermoregulator_1.emtp
  • Вы можете скачать готовые проекты с примерами макросов в этом разделе:
    Macro_Sample
  • Подробное руководство по макросам читайте в главе 18 в документации по Easybuilder Pro:
    EBPro_Manual_All_In_One_6.03.02.pdf