Simatic Step 7, STL, масштабирование (Scale) сигнала аналогового входа 4-20mA.

PLC
  Масштабирование — это функция, которая преобразует входной набор данных в выходной набор в заданном диапазоне. Функция обеспечивает удобный способ сопоставления входного набора данных и данных, которые будут участвовать в вашей визуализации.

  Строго говоря, для работы программы контроллера масштабирование не обязательно. Оно применяется в основном для вывода данных в операционную панель в удобном для человека формате. Simatic Step 7 включает в стандартный дистрибутив библиотеку функций на все (почти) случаи типового применения. Среди них есть и функция масштабирования FC105 «SCALE». Она осуществляет перевод кодов АЦП (INT) в числовое значение (REAL) в соответствии с заданной шкалой датчика, проверяет на нахождение входного диапазона (4-20mA) в пределах шкалы и выводит результат вычисления.
  Чтобы добавить стандартный блок в собственную программу нужно находясь в окне редактора исходных кодов LAD\STL\FBD в окне «Overviews» найти блок Libraries -> TI-S7 Converting Blocks -> FC105 SCALE CONVERT и перетащить его в код. Если это окно скрыто, показать его можно установив галку в меню View -> Overviews. При перетаскивании блок перенесется в папку Blocks и пропишется в символьной таблице.

В коде появится вызов функции с формальными параметрами:

CALL «SCALE»
  • IN: INT — вход масштабируемого слова (выход датчика);
  • HI_LIM: REAL — верхняя граница шкалы датчика;
  • LO_LIM: REAL — нижняя граница шкалы датчика;
  • BIPOLAR: BOOL — TRUE, входной диапазон от –27648 до 27648; FALSE, входной диапазон от 0 до 27648;
  • RET_VAL: INT — результат успешности масштабирования (16#0 — успешно, 16#8 — не в диапазоне);
  • OUT: REAL — реальное значение на датчике в границах шкалы;
Формальным параметрам надо сопоставить фактические. Вот например вызов функции для датчика давления 0-10 бар:

  CALL FC105 (
    IN	     := "Analog_Input",  // заменить на фактический
    HI_LIM   := 1.000000e+001,   // 10 бар
    LO_LIM   := 0.000000e+000,   // 0 бар
    BIPOLAR  := FALSE,           // 4-20mA (0 - 27648)
    RET_VAL  := MW114,           // сохранить в слове меркеров
    OUT      := "Analog_Output");// заменить на фактический

  Есть небольшие различия в написании синтаксиса в редакторе LAD\STL\FBD для исходных кодов в папке Source и исполняемого кода в папке Blocks. Орфография написания немного отличается. В папке Blocks при написании кода не нужны скобки вокруг параметров функции и запятые между ними, операторы не надо заканчивать точкой с запятой. Об этом просто надо помнить.
  Проверить выход успешности масштабирования RET_VAL (RETURN_VALUE) можно по разному. Если выход RET_VAL присваивается слову меркера, проверяется нужный бит в нем, в данном случае M114.3. Недостаток в использовании только одного бита в меркерном слове (16 бит), остальные 15 уже нигде применены быть не могут. Если же RET_VAL присваивается внутренней переменной Int_Value или слову в глобальном блоке данных, проверка получится сложнее:

  L #Int_Value;	// ACCU 1 <- Int_Value	
  L 0;		// ACCU 2 <- ACCU 1, ACCU 1 <- 0 
  <>I;		// RLO <- Int_Value <> 0
  = M3.3;	// M3.3 <- RLO	

У меня подключены 4 датчика 4-20mA:
  • Давление, 0-16 бар:
  • Уровень воды, 0-600 мбар;
  • Температура конденсата, 0-150 С;
  • Уровень конденсата, 0-600 мбар;
И у всех заложена реакция на отказ датчика, т.е. нужен анализ RET_VAL после примения FC105. Жертвовать меркерами я не стал, применил присваивание RET_VAL внутренней переменной и анализ. Это работало, но четырежды повторенный код колол глаза, решил написать собственную функцию масштабирования, под свою задачу. Т.к. все датчики имеют нижнюю границу шкалы 0, вобще убрал параметр LO_LIM, BIPOLAR тоже мне не нужен, все датчики 4-20mA. О выходе за границы диапазона 4-20mA сигнализирует битовый параметр RANGE, RET_VAL используется как выходное значение функции масштабирования.

FUNCTION FC34: REAL

TITLE = Масштабирование аналогового сигнала 4-20mA

AUTHOR:   Anakost
FAMILY:   SOHO
NAME:     LIMSCALE 	// Limiter + Scale
VERSION:  1.0

VAR_INPUT
  INPUT: INT;   	// входной ток (Iвх)
  HI_LIM: REAL;		// верхняя граница шкалы датчика;
END_VAR

VAR_OUTPUT
  RANGE: BOOL; 		// выход за диапазон
END_VAR

BEGIN

NETWORK
TITLE = Ограничение и масштабирование для визуализации

  L #INPUT;		// ACCU 1 <- INPUT, входной ток	
  L 27648; 		// ACCU 1 <- константа 20, ACCU 2 <- ACCU 1
  >I; 			// в RLO результат сравнения ACCU 2 > ACCU 1
  = #RANGE; 		// RANGE <- RLO
  JC A00;	 	// в ACCU 1 верхняя граница диапазона
  POP; 			// ACCU 1 <- INPUT, входной ток
  L 0; 			// константа 4mA
  <I; 			// в RLO результат сравнения ACCU 2 < ACCU 1
  = #RANGE; 		// RANGE <- RLO
  JC A00; 		// в ACCU 1 нижняя граница диапазона
  POP; 			// ACCU 1 <- INPUT, входной ток
A00:
  ITD;			// расширение ACCU 1 до двойного целого
  DTR;			// преобразование ACCU 1 в формат REAL
  L 2.764800e+004; 	// ACCU 1 <- 27648, диапазон АЦП
  /R;			// ACCU 1 <- ACCU 2 / 27648, % соотношение
  L #HI_LIM; 		// ACCU 1 <- HI_LIM, верхняя граница шкалы
  *R; 			// ACCU 1 <- масштабирование
  T #RET_VAL;		// RET_VAL <- ACCU 1

END_FUNCTION

  Иногда параметр LO_LIM все же бывает нужен. Например вам попался термодатчик с нормирующим усилителем настроенным на ненулевой нижний предел (-50..+150 С) и нет возможности его перепрограммировать. Вот вариант с параметром LO_LIM:

FUNCTION FC22: REAL     

TITLE = Масштабирование аналогового сигнала 4-20mA

AUTHOR:   Anakost  
FAMILY:   SOHO     
NAME:     FULSCALE 	// Full Limiter + Scale   
VERSION:  1.0      

VAR_INPUT            
  INPUT: INT;   	// входной ток АЦП
  HI_LIM: REAL;		// верхняя граница шкалы датчика;
  LO_LIM: REAL;		// нижняя граница шкалы датчика;
END_VAR

VAR_OUTPUT            
  RANGE: BOOL; 		// выход за диапазон   
END_VAR

VAR_TEMP             
  TEMP_VAL: REAL;	// промежуточная локальная переменная
END_VAR

BEGIN

NETWORK
TITLE = Ограничение и масштабирование для визуализации

  L #INPUT;		// ACCU 1 <- INPUT, входной ток	
  L 27648; 		// ACCU 1 <- константа 20, ACCU 2 <- ACCU 1
  >I; 			// в RLO результат сравнения ACCU 2 > ACCU 1 
  = #RANGE; 		// RANGE <- RLO	   
  JC A00;	 	// в ACCU 1 верхняя граница диапазона
  POP; 			// ACCU 1 <- INPUT, входной ток
  L 0; 			// константа 4mA
  <I; 			// в RLO результат сравнения ACCU 2 < ACCU 1    
  = #RANGE; 		// RANGE <- RLO	   
  JC A00; 		// в ACCU 1 нижняя граница диапазона
  POP; 			// ACCU 1 <- INPUT, входной ток
A00:
  ITD;			// расширение ACCU 1 до двойного целого
  DTR;			// преобразование ACCU 1 в формат REAL
  L 2.764800e+004; 	// ACCU 1 <- 27648, диапазон АЦП 
  /R;			// ACCU 1 <- ACCU 2 / 27648, % соотношение 
  T #TEMP_VAL;		// в локальную переменную  
  L #HI_LIM; 		// ACCU 1 <- HI_LIM, верхняя граница шкалы
  L #LO_LIM; 		// ACCU 1 <- LO_LIM, нижняя граница шкалы
  -R;			// ACCU 1 <- диапазон датчика  
  L #TEMP_VAL;		// ACCU 1 <- % соотношение
  *R; 			// ACCU 1 <- масштабирование  
  L #LO_LIM; 		// ACCU 1 <- LO_LIM, нижняя граница шкалы
  +R;			// ACCU 1 <- сдвиг шкалы  
  T #RET_VAL;		// RET_VAL <- ACCU 1
  
END_FUNCTION

  И еще одна функция масштабирования. Толчком к ее написанию стало расхождение между показаниями показометра ПКЦ-1101 на удаленной периферии и выводом вышеописанной функции в операционную панель. Источник один и тот же. Причем расхождения начались после 1,5 месяцев эксплуатации, до этого показания совпадали. Самое простое — измерить ток датчика и перевести через инженерные величины в выходное значение. Сразу станет понятно кто врет. Элементарная задача, но тут у тестера MASTECH MAS838 отказал токовый вход. А ведь все замеры уже есть в аналоговом модуле, нужно только вывести их в операционную панель в правильном формате. Причину я нашел, неисправность показометра ПКЦ-1101, но на будущее решил вывести токи датчиков в операционную панель.
  Применение стандартной функции FC105 для отображения тока датчика (4-20mA) возможно, но ограничено. Дело в том, что она может масштабировать ток только в диапазоне 4-20mA. Выше и ниже диапазона будут отображены только граничные значения. В то же время аналоговый модуль может работать с входным током 1,185 — 22,81mA.



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

FUNCTION FC36: REAL     

TITLE = Ограничение и масштабирование аналогового значения 1,185-22,81mA

AUTHOR:   Anakost  
FAMILY:   SOHO     
NAME:     SCALECUR 	// Scale Current   
VERSION:  1.0      

VAR_INPUT            
  INPUT: INT;   	// входной ток
END_VAR

VAR_OUTPUT            
  RANGE: BOOL;  	// выход за диапазон   
END_VAR

BEGIN

NETWORK
TITLE = Ограничение и масштабирование в ток

  L #INPUT;     	// ACCU 1 <- INPUT, входной ток 
  L W#16#7EFF;  	// ACCU 1 <- константа 22,81mA, ACCU 2 <- ACCU 1
  >I;           	// в RLO результат сравнения, входной ток > 22,81mA
  = #RANGE;     	// RANGE <- RLO    
  JC A00;       	// в ACCU 1 верхняя граница диапазона
  POP;     		// ACCU 1 <- INPUT, входной ток
  L W#16#ED00;  	// ACCU 1 <- константа 1,185mA, ACCU 2 <- ACCU 1
  <I;           	// в RLO результат сравнения , входной ток < 1,185mA   
  = #RANGE;     	// RANGE <- RLO    
  JC A00;       	// в ACCU 1 нижняя граница диапазона
  POP;     		// ACCU 1 <- INPUT, входной ток
A00:
  ITD;			// расширение ACCU 1 до двойного целого
  DTR;			// преобразование ACCU 1 в формат REAL
  L 1.728000e+003; 	// ACCU 1 <- 1728, коэффициент масштабирования 
  /R;			// ACCU 1 <- ACCU 2 / 1728, масштабирование 
  L 4.000000e+000; 	// ACCU 1 <- 4.0, коэффициент смещения
  +R; 			// ACCU 1 <- масштабирование + смещение
  T #RET_VAL;		// RET_VAL <- ACCU 1
  
END_FUNCTION

Функция выводит ток в диапазоне 1,185 — 22,81mA, вне диапазона выставляется флаг RANGE, RET_VAL используется как выходное значение.


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


При включении начинает выполняться и эта ветвь кода.


При выходе тока из диапазона 1,185 — 22,81mA это сигнализируется прочерком показаний (просто откинул провод).

В стандартной библиотеке присутствует и функция обратного масштабирования REAL в INT, называется FC106 «UNSCALE».

CALL «UNSCALE»
  • IN: REAL — входное вещественное число;
  • HI_LIM: REAL — верхний предел входа;
  • LO_LIM: REAL — нижний предел входа;
  • BIPOLAR: BOOL — TRUE, выходной диапазон от –27648 до 27648; FALSE, выходной диапазон от 0 до 27648;
  • RET_VAL: INT — результат успешности масштабирования (16#0 — успешно, 16#8 — не в диапазоне);
  • OUT: INT — целое число, диапазон зависит от BIPOLAR;

P.S. Небольшая модификация представленной выше функции FC34.
  Я применил ее для масштабирования значения для PID регулятора SFB41. Все работало (и работает) прекрасно и без сбоев. Но выходу RANGE у меня присвоен меркер ошибки датчика. Поэтому выход за диапазон 4-20mA вызовет ошибку со световой и звуковой иллюминацией. Функция не учитывает что отклонения до 0,2mA допускаются действующими технормами (и здравым смыслом).
  Поэтому она была скорректирована, входное аналоговое значение для масштабирования по прежнему ограничено 4-20mA, но сигнал RANGE возникает после выхода из диапазона 3,8-20,2mA. Отличие только в ограничителе (Limiter):

...
  L #INPUT;		// ACCU 1 <- INPUT, входной ток	
  L 27994;              // ACCU 1 <- константа 20,2mA, ACCU 2 <- ACCU 1  
  >I; 			// в RLO результат сравнения ACCU 2 > ACCU 1
  = #RANGE; 		// RANGE <- RLO
  POP; 			// ACCU 1 <- INPUT, входной ток
  L 27648; 		// ACCU 1 <- константа 20mA, ACCU 2 <- ACCU 1
  >I; 			// в RLO результат сравнения ACCU 2 > ACCU 1
  JC A00;	 	// в ACCU 1 верхняя граница диапазона
  POP; 			// ACCU 1 <- INPUT, входной ток
  L -346; 		// константа 3,8mA
  <I; 			// в RLO результат сравнения ACCU 2 < ACCU 1
  = #RANGE; 		// RANGE <- RLO
  POP; 			// ACCU 1 <- INPUT, входной ток
  L 0; 			// константа 4mA
  <I; 			// в RLO результат сравнения ACCU 2 < ACCU 1
  JC A00; 		// в ACCU 1 нижняя граница диапазона
  POP; 			// ACCU 1 <- INPUT, входной ток
A00:
...
  • +1
  • 23 октября 2016, 19:17
  • anakost

Комментарии (5)

RSS свернуть / развернуть
Немного дополнил.
0
Небольшая модификация
0
Строго говоря, для работы программы контроллера масштабирование не обязательно. Оно применяется в основном для вывода данных в операционную панель в удобном для человека формате
ПИД-регулятор, имеет свои коэффициенты. Махнули ночью датчик (давления, уровня, тока...), но у него диапазон отличается. Что будет с техпроцессом и кто за это получит п***ы выговор?
Подсказка: те, кто меняет датчики, совсем необязательно разбирается в ПО контроллера.
(Ожидаемое поведение системы — подтянуть по hart диапазон измерения датчика и при отличии выдать об этом сообщение на чми.)
0
>>Подсказка: те, кто меняет датчики, совсем необязательно разбирается в ПО контроллера.
Это как? Поймали первого попавшегося, замени нам датчик? У нас так не делается.
Запас датчиков для замены есть, если время терпит, меня будят ночью и вызывают на завод. Еду на такси, предусмотрено договором. Если форс-мажорные обстоятельства и время не терпит, меня все равно будят и я консультирую электронщика дежурной смены. Так и работаем…
0
P.S. А разбираться в ПО контроллера дежурному электонщику совершенно не обязательно. Верхний предел HI_LI датчика выведен в меню настроек ОР, перебил и все…
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.