本程序想给偷懒不想用FC105一个个转换仪表量程使用(假如有几十上百个一个个转换比较费时间),即批量话转换。刚写好就发出来了 各位测试哈吧 不明白请回帖
第一次发的程序有点问题 以下是修改后的程序给大家测试。
源代码如下
//##############################################
//实现批量化的量程转换
//比较适合采样点特别多的情况
//仅适合需要量程转换的通道比如电流4~20MA电压+-10V
//默认最大1000个仪表以内可以修改
//############################################
FUNCTION_BLOCK FB80
TITLE = 'AI_OUT'
//
// 模拟量输入量程批量转换
//
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
//-------------------
BIPOLAR:ARRAY[1..1000] OF BOOL;//1为双极性,0为单极性
END_VAR
VAR_IN_OUT
// I/O Parameters
END_VAR
VAR_OUTPUT
//默认一千个
OUT:ARRAY[1..1000] OF REAL;
ERR:ARRAY[1..1000]OF BOOL;
// Output Parameters
END_VAR
VAR_TEMP
I:INT;//循环变量
END_VAR
VAR
K1:REAL;
K2:REAL;
END_VAR
//循环批量转换循环体
FOR I:= 1 TO NUM BY 1 DO
//判断是否是双极性
IF BIPOLAR[I] 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
ERR[I]:=1;
ELSE
ERR[I]:=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
ERR[I]:=1;
ELSE
ERR[I]:=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
OUT[I]:=(INT_TO_REAL(WORD_TO_INT(PIW[ADDRESS +(I-1)*2]))-K1)/(K2-K1)*(DWORD_TO_REAL(DATA.DD[(I-1)*12])-DWORD_TO_REAL(DATA.DD[(I-1)*12+4]))+DWORD_TO_REAL(DATA.DD[(I-1)*12+4])+DWORD_TO_REAL(DATA.DD[(I-1)*12+8]);
END_FOR;
END_FUNCTION_BLOCK
//原创程序 欢迎交流 QQ275578306?
//本程序编译通过测试,有BUG的话请告知
//修改了双极性的问题20161229