Кусочно-линейная функция

Задача: разработать DFB для реализации кусочно-линейной функции.
Предназначение. С помощью кусочно-линейных функций можно организовать программный задатчик (формирования задания в зависимости от времени), задатчик отношения X/Y, реализовать кусочно-линейную аппроксимацию нелинейной функции, линеризация и т.д.
Кусочно-линейная функция определена в диапазоне всех вещественных чисел следующей зависимостью:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Описание интерфейса.
Координаты точек Xi и Yi во всём дипазоне будем задавать двумя массивами типа REAL. Учитывая, что количество точек зависит от задачи, в которой будет задействован данный блок, массив должен быть динамическим. 
В DFB параметры INPUTS, OUTPUTS и INOUT могут быть определены как ANY_ARRAY_xxx (где xxx тип массива), что позволяет привязывать к ним фактические параметры с любым размером массива. Мы воспользуемся этой функциональностью. Таким образом, интерфейс типа DFB с именем PWL_FN имеет следующий вид:
 X_IN и Y_OUT соответственно вход и выход функции. Массивы X и Y задают координаты узлов функции. Для работы DFB определены внутренние переменные private i - для задания индекса массива, и AR_LEN для определения длины массива. Без последней можно было бы и обойтись, но мы оставим для наглядности.
Описание программной секции.
Программную секцию есть смысл написать на ST либо IL, так как используются массивы, для обработки которых нужны циклы.
   
В начале секции определяется длина массива с помощью функции LENGTH_ARREAL, единственным аргументом которой есть один из массивов. Следует отметить, что:
- массивы X и Y обязательно должны быть одного размера;
- елемненты X должны возростать с возрастанием индекса в массиве 
- независимо от того, с какого индекса начинается фактический параметр для X и Y, в программной секции DFB массивы всегда будут начинаться с 0
- для работы с динамическими массивами, их нужно явно разрешить (Tools->Project Settings->Variables->AllowDynamicArray)
Далее в программе, в зависимости от значения X_IN расчитывается Y_OUT. Вот и всё, что касается DFB.    
 
Задача: разработать программу расчета объема жидкости по датчику уровня в резервуаре неправильной формы.
Объем жидкости в резервуарах правильной формы можно определить по уровню, подставив его в формулу расчета объема. Наиболее простой случай - это резервуары с неизменяемым сечением по вертикали (например цилиндрической формы), что позволяет просто отмасштабировать значение с датчика уровня, умножив его на коефициент. Однако для резервуаров с неправильной формой, расчитать объем по уровню довольно проблематично. 
Концепция. Один из способов - это экспериментально определить эту зависимость. Для этого на этапе наладки системы, на нелинейном участке (или по всей высоте) резервуара снимается характеристика V(L), где V - объём жидкости, L - уровень. Способ определиня объема и тип датчика уровня в данном случае не имеет значения, главное - это получить кусочно-линейную апроксимацию зависимости с той точностью, которая нужна согласно условию задачи. Далее в программе сделать обратную задачу, по заданной характеристике V(L) определять объем по уровню.    
Решение. По полученным точкам V(L), например 6 точек, задаем два массива V(0..5) и L(0..5). При определении массива можно сразу задать значение елементов при инициализации. Далее их можно менять, например, в конфигурационных экранах HMI/SCADA. Переменные и программа приведены ниже.  
 
 
 
 
 
 
 
 
 
 
   
Comments