//该版本将模拟量输出值单独放到了另外的DB块数据当中,请注意本程序是FB程序,可直接修改为FC程序节约DB块 该程序只适合300/400PLC
//##############################################
//实现批量化的量程转换
//比较适合采样点特别多的情况
//仅适合需要量程转换的通道比如电流4~20MA电压+-10V
//仪表数量可修改
//版本V1.1
//############################################
FUNCTION_BLOCK FB81
TITLE = '模拟量输入转换'
//
// 模拟量输入量程批量转换
//
VERSION: '1.0'
AUTHOR: EBCLW
NAME: AI_OUT
FAMILY: EBC
KNOW_HOW_PROTECT
// Block Parameters
VAR_INPUT
ADDRESS:INT:=512;//开始的PIW地址
NUM:INT:=1;//仪表数量即多少个PIW地址
DATA:BLOCK_DB; //用于存放数据的量程 偏差设定
//DB数据结构为(每个仪表均是这样的结构建议用STL生成)
//------------------
// 量程上限 REAL
// 量程下限 REAL
// 修正偏差 REAL
// 极性设置 BOOL 1为双极性,0为单极性
//-------------------
VALUE:BLOCK_DB;//存放输出结果
//DB数据结构为(每个仪表均是这样的结构建议用STL生成)
//------------------
// 输出值 REAL
// 错误状态 bool
//-------------------
END_VAR
VAR_IN_OUT
END_VAR
VAR_OUTPUT
END_VAR
VAR_TEMP
I:INT;//循环变量
TEMP:REAL;
END_VAR
VAR
K1:REAL;
K2:REAL;
END_VAR
//循环批量转换循环体
FOR I:= 1 TO NUM BY 1 DO
//判断是否是双极性
IF DATA.DX[(I-1)*14+12,0] THEN
K1:= -27648.0;
K2:= 27648.0;
IF (WORD_TO_INT(PIW[ADDRESS +(I-1)*2]) <-27649) OR (WORD_TO_INT(PIW[ADDRESS +(I-1)*2]) >27649) THEN //双极性低于正常或者高于正常则通道标志位置1
VALUE.DX[(I-1)*6+4,0]:=1;
ELSE
VALUE.DX[(I-1)*6+4,0]:=0;
END_IF;
ELSE
K1:=0.0;
K2:=27648.0;
//判断是否在量程范围内不在测量范围内即对该仪表报警
IF (WORD_TO_INT(PIW[ADDRESS +(I-1)*2]) <-1) OR (WORD_TO_INT(PIW[ADDRESS +(I-1)*2]) >27649) THEN //单极性低于正常或者高于正常则通道标志位置1
VALUE.DX[(I-1)*6+4,0]:=1;
ELSE
VALUE.DX[(I-1)*6+4,0]:=0;
END_IF;
END_IF;
//若在量程范围内就做量程转换
//采用FC105相同的计算公式OUT = ((FLOAT (IN) -K1)/(K2-K1)) * (HI_LIM-LO_LIM) + LO_LIM
//增加一个修正偏差公式改为OUT = ((FLOAT (IN) -K1)/(K2-K1)) * (HI_LIM-LO_LIM) + LO_LIM + OFFSET
TEMP:=(INT_TO_REAL(WORD_TO_INT(PIW[ADDRESS +(I-1)*2]))-K1)/(K2-K1)*(DWORD_TO_REAL(DATA.DD[(I-1)*14])-DWORD_TO_REAL(DATA.DD[(I-1)*14+4]))+DWORD_TO_REAL(DATA.DD[(I-1)*14+4])+DWORD_TO_REAL(DATA.DD[(I-1)*14+8]);
VALUE.DD[(I-1)*6]:=REAL_TO_DWORD(TEMP);
END_FOR;
END_FUNCTION_BLOCK
//原创程序 欢迎交流 QQ 275578306