Тестовая программа. ПИД-регулятор ================================= Итак, мы научились подключать модули, добавлять их в Beremiz и настраивать адреса. Для закрепления пройденного, а также для ознакомления с некоторыми блоками в данном уроке мы рассмотрим ПИД-регулятор. **Пропорционально-интегрально-дифференцирующий (ПИД) регулятор** — устройство в управляющем контуре с обратной связью. Используется в системах автоматического управления для формирования управляющего сигнала с целью получения необходимых точности и качества переходного процесса. ПИД-регулятор формирует управляющий сигнал, являющийся суммой трёх слагаемых, первое из которых пропорционально разности входного сигнала и сигнала обратной связи (сигнал рассогласования), второе — интегралу сигнала рассогласования, третье — производной сигнала рассогласования. Подключим к ПЛК модули расширения BRIC-AO-4 и BRIC-AI-16. Добавляем их в Beremiz. Язык программирования выберем FBD для наглядности. Функциональный блок PID выбирается из "Additional function blocks". .. figure:: img/37.png :width: 600 :align: center *Функциональный блок PID* .. csv-table:: :header: "Вход", "Тип", "Описание" :widths: 1, 1, 10 "AUTO", "BOOL", "Включение режима ПИД-регулятора (0 - ручное регулирование, 1 - автоматическое)" "DIR", "BOOL", "Направление регулирования ( 0 - обратное регулирование, 1 - прямое. По умолчанию стоит прямое регулирование)" "PV", "REAL", "Входной сигнал (автоматический режим)" "SP", "REAL", "Заданное значение (уставка в автоматическом режиме)" "X0", "REAL", "Заданное значение (уставка в ручном режиме)" "KP", "REAL", "Пропорциональный коэффициент" "TR", "REAL", "Интегральный коэффициент" "TD", "REAL", "Дифференциальный коэффициент" "CYCLE", "TIME", "Время цикла" "**Выход**", "**Тип**", "**Описание**" "XOUT", "REAL", "Выход ПИД-регулятора" Добавим переменные *AO_1_ao_val_0* и *AI_1_ai_physical_0* в программу. В нашем случае задание PV будем получать от AI_1_ai_physical а выход ПИД-регулятора XOUT будет подключен к AO_1_ao_val. Добавим также остальные входные переменные. Также для нашей программы нужны будут SDO-регистры модуля AO, а именно калибровочные коэффициенты нулевого канала AO_1_ao_calib_a_0 и AO_1_ao_calib_b_0. Копируем регистры в программу, в "Polling" пишем "read". .. figure:: img/38.png :width: 600 :align: center *SDO-регистры модуля AO* .. note:: Расчет необходимого значения AO_val_x осуществляется по формуле: AO_val_x = (AO_OUT - AO_calib_b_x) * AO_calib_a_x где AO_OUT - необходимое выходное значение в "мА" или "В", AO_calib_a_x, AO_calib_b_x - индивидуальные калибровочные коэффициенты каждого канала. .. csv-table:: :header: "Параметр","Значение по умолчанию","Диапазон","Описание" :widths: 20, 10,20, 40 "AO_val_x",`-`,"0 – 4095","Выходное значение аналогового канала в единицах АЦП" "AO_calib_a_x","163.8 - для токовых каналов / 287.368 - для каналов напряжения",`-`,"Калибровочный коэффициент А" "AO_calib_b_x","0.0 - для токовых каналов / 0.0 - для каналов напряжения",`-`,"Калибровочный коэффициент В" Для того чтобы ручное значение записывалось в mA необходимо вычислить его с помощью формулы: X0 = (manual_set - AO_calib_b_x) * AO_calib_a_x Реализация на языке FBD представлена на рисунке ниже .. figure:: img/39.png :width: 600 :align: center *Подключение manual_set* Добавим Пропорциональный, Интегральный и Дифференциальные коэффициенты. Класс выбираем так же как и у других "External", для взаимодействия через WEB-страницу. .. figure:: img/40.png :width: 600 :align: center *Подключение коэффициентов* Для ПИД-регулятора выберем время цикла равную в 1 секунду. Прописываем "T#1s" в колонке "Initial Value". .. attention:: Тип данных "Time" не является внешним, поэтому класс необходимо выбрать "Local" .. figure:: img/41.png :width: 600 :align: center *Добавление времени цикла* Осталось подключить выход ПИД-регулятора. XOUT преобразуется в тип данных "UINT" и записывается в AO_1_ao_val_0. Чтобы выход выдавался в mA, добавим коэффициенты. В данном случае используется обратная формула: xout_ma = (XOUT / AO_calib_a_x) + AO_calib_b_x; .. figure:: img/42.png :width: 600 :align: center *Подключение выхода XOUT* Добавим переменные в главный проект. Опишем переменные в разделе "Documentation". Программа готова. .. figure:: img/43.png :width: 600 :align: center *Программа ПИД-регулятора* Подключим нулевой канал модулей расширения между собой. Финальный результат на рисунке ниже. .. figure:: img/gif10.gif :width: 600 :align: center *Подключение модулей расширения* Загружаем прошивку и заходим в WEB-страницу. Задаем *manual_set* значение в 5 mA. В данном случае ПИД-регулятор находится в ручном режиме и выход равен заданию. .. figure:: img/44.png :width: 600 :align: center *WEB-страница контроллера* .. figure:: img/gif11.gif :width: 600 :align: center *ПИД-регулятор в ручном режиме* Задаем параметры автоматического режима. После задания уставок и коэффициентов, задаем "auto_man" значение "1" тем самым запускаем ПИД-регулятор в автоматическом режиме. Выход регулятора XOUT стремится к уставке. .. figure:: img/gif12.gif :width: 600 :align: center *ПИД-регулятор в автоматическом режиме* После достижения заданной уставки, ПИД-регулятор удерживает выходное значение в пределах данного задания. .. figure:: img/gif14.gif :width: 600 :align: center *ПИД-регулятор в автоматическом режиме после достижения уставки* .. figure:: img/gif13.gif :width: 600 :align: center *Результат программы*