Я вынужден был из-за большой пересортицы по токовым датчикам использовать модули 0-20мА у которых статус есть только на зашкал по верхней границе, использовал FB для обработки сигнала, меня такое решение устроило собственно:
Объявленные переменные:
(*Функциональный блок первичной обработки аналогового сигнала*)
(*Ориентированный для внутренних вычислений*)
FUNCTION_BLOCK rAI_chanel_4_20mA_452
VAR_INPUT
(*Входное значение переменной в полном десятичном коде*)
AI_Input :WORD;
(*ЛИНЕЙНОЕ КАЛИБРОВОЧНОЕ СМЕЩЕНИЕ*)
AI_Calib:WORD;
(*Верхняя граница технологического диапазона*)
Tech_HLimit:REAL;
(*Нижняя граница технологического диапазона*)
Tech_LLimit:REAL;
END_VAR
VAR_OUTPUT
(*Достижение верхнего предела по току*)
W_HiLimit: BOOL;
(*Достижение нижнего предела по току*)
W_LowLimit: BOOL;
(*Текущее значение по току*)
AI_value: REAL;
(*Текущее технологическое значение*)
Tech_value:REAL;
(*ТИП ДАТЧИКА*)
TYPE_DAT:STRING(10);
END_VAR
VAR
(*Входное значение бита статуса канала*)
AI_Status: BOOL;
AI: REAL; (*Внутренняя переменная для хранения результатов битового сдвига*)
AI_HLimit: REAL:=4095; (*Верхний предел по току 20mA*)
AI_LLimit: REAL:=819; (*Нижний предел по току 4mA*)
END_VAR
AI_Status:=AI_Input.0;
AI:=SHR(AI_Input,3);(*Битовый сдвиг вправо для удаления неиспользуемых битов*)
AI:=AI+ AI_Calib;
IF AI<AI_LLimit AND AI_Status=FALSE THEN
(*Состояние нижнего предела*)
W_HiLimit:=FALSE;
W_LowLimit:=TRUE;
AI_value:=4;
Tech_value:=Tech_LLimit;
ELSIF AI>=AI_LLimit AND AI_Status=FALSE THEN
(*Состояние НОРМА*)
W_HiLimit:=FALSE;
W_LowLimit:=FALSE;
(*Расчет токового значения*)
AI_value:=20 * AI / AI_HLimit;
(*Расчет технологического значения*)
(*Tech_value:=((AI_value - 4) * (Tech_HLimit - Tech_LLimit))/(16);*)
Tech_value:=(((AI - AI_LLimit))*(Tech_HLimit - Tech_LLimit ))/(AI_HLimit - AI_LLimit) + Tech_LLimit;
ELSIF AI_Input>32760 AND AI_Status=TRUE THEN
(*Состояние верхнего предела*)
W_HiLimit:=TRUE;
W_LowLimit:=FALSE;
AI_value:=20;
Tech_value:=Tech_HLimit;
END_IF;
TYPE_DAT:=El_4_20mA;