Программный задатчик

Задача: разработать программный задатчик.
Предназначение. Существуют задачи, где регулятор должен поддерживать значение, заданое кусочно-линейной зависимостью от времени. Допустим зависимость задается следующим графиком:  
Такой регулятор кроме блока, реализующего один из законов регулирования (например П, ПИ или ПИД), должен содержать блок программного задатчика (далее по тексту ПРЗ).
 
В отличии от законов регулирования, которые реализованы в большинстве современных ПЛК (в том числе и поддерживаемые UNITY), готовые программные задатчики в их библиотеках практически отсутствуют. Хотя в отечественных (советских) контроллерах таких как Ремиконт-130 и Ломиконт, блоки ПРЗ являются библиотечными элементами.  В UNITY есть для этого функция LOOKUP_TABLE1, но мы попытаемся создать аналогичную. Этим мы и займемся. Рассмотрим два варианта, представленых сугубо в образовательных целях.
LOOKUP_TABLE1
 
Вариант1: разработка функционального блока ПРЗ.
Функции ПРЗ и описание интерфейса.    
Конкретизируем задачу. Итак, нужно создать производный функциональный блок, вернее тип (Derived Function Block Type), который будет на основе заданных координат 4-х узлов графика зависимости рассчитывать Y=f(T). Назовем этот тип PRZ3. Нв рисунке ниже представлен вызов экземпляра блока PRZ1 и интерфейс блока. 
Start - запуск внутреннего таймера, по которому будет осуществляться расчет выходного значения. При Start=FALSE значение выхода Y будет равняться значению инициализации Y0. Входы T1,Y1 и T2,Y2 и T3,Y3 - заданные координаты соответственных узлов. Кроме расчетного значения на выход PRZ3 также будем подавать значение внутреннего таймера.        
  
 
Для работы блока нужен таймер, по этому в раздел Private включен экземпляр TON с именем Timer1. Остальные переменные секции обсудим позже.     
Описание программной секции. 
Ниже представлена программная секция PRZ3. Идея заключается в расчете значения выхода на каждом участке между узлами. На участке T<=T0 (до старта) значение Y=Y0, а на участке T>=T3 значение Y=Y3. Расчетных участков всего три: 0-T1, T1-T2, T2-T3. В пределах этих участков выходное значение рассчитывается по формуле:
  Y=(T-Tp)*(Yk-Yp)/(Tk-Tp)+Yp 
где Tp, Yp - координаты узла начала участка; Tk, Yk - координаты узла конца участка. То есть, программа определяет на каком участке она находится, и присваивает Tp,Yp и Tk,Yk значения соответсвующих координат. Учитывая что координаты T1,Т2,T3 имеют тип TIME, их предварительно нужно преобразовать к типу REAL, так как такой тип у выхода Y. Таким образом раздел блока Private включает переменные Tp_REAL, Tk_REAL и T_REAL.
В блоке учитывается, что количество узлов может быть меньше, чем 4-ре. В этом случае узлы с 0-й отметкой времени не учитываются. Для этого на вход внутреннего таймера Timer1 в качестве уставки подается максимальное значения среди T1,T2,T3.      
 Выход таймера ET подается на выход блока (T), а также преобразовуется в значения типа REAL.  Далее определяется участок, сравнивая текущее значение таймера с временными координатами узлов. Для предотвращения работы незадействованных узлов используется условие срабатывания предыдущей уставки по AND. На каждом из участков осуществляется переприсвоение конечных точек.  
В нижней части программы реализована расчетная формула на каждом из участков.
Проверка работы. 
На рисунке к описанию интерфейса показан пример программы использования PRZ3. Он состоит всего с одного вызова экземпляра функционального блока с именем PRZ1. Для удобства в операторских экранах можно создать экран, туда вставить прямоугольник, привязать анимацию (вкладка Animation) к выходу PRZ1.Y, а во вкладке AnimationType выбрать Trend Diagram. Рядом поставить кнопку с привязкой к Start_Prog.
Этот пример является демонстрацией для начинающих. Приведенную программу можно модернизировать под свои задачи, однако она достаточно ресурсоёмка. Для большого количества узлов есть смысл использовать массивы для задания их координат, а в секции использовать циклы и соответственно языки ST и IL. В следующем примере используется функциональный блок реализации кусочно-линейной функции.
 
Вариант2: использование универсальной кусочно-линейной функции  
В этом варианте используем функциональный блок с реализацией универсальной кусочно-линейной функции. С описанием функционирования и программы можно ознакомиться тут

 

 

 
Счетчик формирует значение времени в секундах, от начала срабатывания Start_Prog. Для этого на CU подаются импульсы системного секундного миандра %S6. При Start_Prog=FALSE, счетчик обнуляется (CV=0). Уставка PV=3600 взята произвольно, главное чтоб была >=35. Функция INT_TO_REAL используется лишь потому, что PWL_FN работает с типом REAL. Проверить работу программы можно аналогично как в предыдущем примере.
Преимущество данного подхода сравнительно с предыдущим в его универсальности и компактности.      
 
 
Comments