Версия для печати

Modular PID Control что внутри? Часть 1.

Дата: 2009-02-13

Добавлено: komatic

Тема: ModPID



MODPID

В первой части рассмотрим 4-е простейших функции, включенные в состав пакета – SCALE, CRP_IN, CRP_OUT и SWITCH . Почти все функции пакета написаны на языке SCL . Как сказано в описании:

От себя могу добавить, что язык конечно хороший, особенно для обработки данных, но имеет все-таки некоторые ограничения, кстати, результатом которых явилось невозможность написания 100% функций пакета на SCL . Все SCL исходные файлы рабочие и компилируются без ошибок.

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

SCALE

Итак, SCALE – очень, ОЧЕНЬ простая функция :), несмотря на то, что в документации говорится про какой-то угол наклона и приводятся три страницы сопроводительного текста с графиком…

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

FUNCTION_BLOCK FB123
TITLE =" linear scaling"
AUTHOR : AUT_1
FAMILY : MODCONT
NAME : SCALE
VERSION : " 1.0"
// reverse by komatic
(*
Элемент   масштабирования. Масштабирует входную величину.
Масштаб   задается углом наклона линейной характеристики.
*)
VAR_INPUT
  INV           : REAL ;                    //входная переменная
  FACTOR        : REAL  := 1.000000e+000;   //умножающий фактор
  OFFSET        : REAL ;                    //сдвиг
END_VAR
VAR_OUTPUT
  OUTV          : REAL ;                    //выходная переменная
END_VAR
BEGIN
    OUTV:=INV * FACTOR + OFFSET;
END_FUNCTION_BLOCK

CRP_IN

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

FUNCTION_BLOCK FB102
TITLE =" change range periphery input"
AUTHOR : AUT_1
FAMILY : MODCONT
NAME : CRP_IN
VERSION : " 1.0"
// reverse by komatic
(*
Преобразование входной аналоговой величины.
Входная аналоговая величина
преобразуется в числовое значение с плавающей запятой,
которое используется ПИД-регулятором.
*)
VAR_INPUT
  INV_PER           : WORD ;                        //входная переменная
  FACTOR            : REAL  := 1.000000e+000;       //умножающий фактор
  OFFSET            : REAL ;                        //сдвиг
  START_ON          : BOOL  := TRUE;                //вывести стартовое значение
  STARTVAL          : REAL ;                        //стартовое значение
END_VAR
VAR_OUTPUT
  OUTV              : REAL ;                        //выходная переменная
END_VAR
BEGIN
IF START_ON
THEN
    OUTV:=STARTVAL;
ELSE
    OUTV:= INT_TO_REAL(WORD_TO_INT(INV_PER)) * FACTOR * 100.0 / 27648.0 + OFFSET;
END_IF;
END_FUNCTION_BLOCK

CRP_OUT

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

FUNCTION_BLOCK FB103
TITLE =" change range periphery output"
AUTHOR : AUT_1
FAMILY : MODCONT
NAME : CRP_OUT
VERSION : " 1.0"
// reverse by komatic
(*
В блоке производится приведение значений сигнала в формате
чисел с плавающей точкой (формат внутреннего представления в
модульном регуляторе) в значение сигнала в формате периферии.
*)
VAR_INPUT
  INV           : REAL ;                        //входная  переменная
  FACTOR        : REAL  := 1.000000e+000;       //умножающий фактор
  OFFSET        : REAL ;                        //сдвиг
END_VAR
VAR_OUTPUT
  OUTV_PER      : WORD ;                        //выходная переменная (периферия)
END_VAR
VAR_TEMP
  rTemp         : REAL ;                        //выходная переменная (переферия)
END_VAR
BEGIN
rTemp:=(FACTOR * INV + OFFSET) * 27648.0 / 100.0;
IF rTemp >  32767.0 THEN rTemp:= 32767.0; END_IF;
IF rTemp < -32768.0 THEN rTemp:=-32768.0; END_IF;   
OUTV_PER:=INT_TO_WORD(REAL_TO_INT(rTemp));
END_FUNCTION_BLOCK

SWITCH

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

FUNCTION_BLOCK FB126
TITLE =" switch"
AUTHOR : AUT_1
FAMILY : MODCONT
NAME : SWITCH
VERSION : " 1.0"
// reverse by dda
(*
Функциональный блок используется как мультиплексор с функцией
И/ИЛИ по входу для двух входных/выходных сигналов.
*)
VAR_INPUT
  INV1          : REAL ;            //входная переменная 1
  INV2          : REAL ;            //входная переменная 2
  INV1_ON       : BOOL ;            //соединить через INV 1
  OUTV1_ON      : BOOL ;            //соединить через OUTV 1
  COM_RST       : BOOL ;            //полный рестарт
END_VAR
VAR_OUTPUT
  OUTV1         : REAL ;            //выходная переменная 1
  OUTV2         : REAL ;            //выходная переменная 2
END_VAR
BEGIN
IF COM_RST
THEN
    OUTV1:=0.0;
    OUTV2:=0.0;
ELSE
    IF INV1_ON
    THEN
        IF OUTV1_ON
        THEN
            OUTV1:=INV1;
        ELSE
            OUTV2:=INV1;
        END_IF;        
    ELSE
        IF OUTV1_ON
        THEN
            OUTV1:=INV2;
        ELSE
            OUTV2:=INV2;
        END_IF;        
    END_IF;
END_IF;       
END_FUNCTION_BLOCK

Итак, первая часть закончена, мы рассмотрели простейшие функции из пакета Modular PID control. В следующих частях мы продолжим, до встречи…





Просмотров: 7083

Комментарии к материалу

Добавлен: Artur    Дата: 2011-01-05

где находится этот FB102?? как его добавит?

Добавлен: komatic    Дата: 2011-01-05

Выделяете, вставляете в SCL source и компилируете... Или находите саму библиотеку и копируете из нее уже скомпилированный...

Добавлен: nuk    Дата: 2014-11-03

можно ссылки на продолжение

Добавлен: komatic    Дата: 2014-11-03

http://plc4good.org.ua/index.php?sub=4

Добавить комментарий

Ваше имя:

Текст комментария (4000 max):

Введите сумму с картинки: