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

По просьбе наших посетителей, данный материал перенесен с сайта plc4good.org.ua, в связи с полной его потерей. Всё возражения принимаются через форму обратной связи.

plc4good.org.ua/view_post.php?id=34

MODPID

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

  • S7-SCL (Standard Control Language) – это PASCAL-подобный язык высокого уровня, предназначенный для программирования систем автоматизации SIMATIC. S7-SCL используется для описания комплексных алгоритмов управления и обработки данных.
  • Язык может быть использован для программирования систем автоматизации SIMATIC S7-300, SIMATIC S7-400, SIMATIC C7 и систем компьютерного управления SIMATIC WinAC.
  • S7-SCL имеет сертификат PLCopen Base Level.

От себя могу добавить, что язык конечно хороший, особенно для обработки данных, но имеет все-таки некоторые ограничения, кстати, результатом которых явилось невозможность написания 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 &gt,  32767.0 THEN rTemp:= 32767.0, END_IF,
IF rTemp &lt, 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. В следующих частях мы продолжим, до встречи…

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

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

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

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

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

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

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

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

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

0 0 голоса

Оцените статью!

guest
0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии