上次发的那个二选一程序是自己编写给PCS7用的,没有判断数值的正确与否,这个程序尽量考虑了各种情况,网友在问有没有 这里给出程序供大家参考
该程序可以再优化一下就是把线性转换加上,也就不必读了通道又去读转换后的值。
源程序如下
//**************************************************************************************
// 两个传感器二选一输出
//**************************************************************************************
FUNCTION FC78: VOID
TITLE = 'TWO_SL_ONE'
AUTHOR: EBC_LW
NAME: TWOSLONE
VERSION: '0.01'
FAMILY: EBC
KNOW_HOW_PROTECT
VAR_INPUT
PV1:WORD;
PV2:WORD;
PV1_REAL:REAL;
PV2_REAL:REAL;
PV_DEV_SET:REAL;
ERR_MAN_SET:REAL;
END_VAR
VAR_IN_OUT
END_VAR
VAR_OUTPUT
PV:REAL;
PV1_FAIL:BOOL;
PV2_FAIL:BOOL;
PV_DEV:REAL;
END_VAR
VAR_TEMP
END_VAR
VAR
END_VAR
// 判断值是否正常
// TEMP1:=WORD_TO_INT(PV1);
IF (WORD_TO_INT(PV1) <-1) OR (WORD_TO_INT(PV1) >27649) THEN //低于正常或者高于正常则通道标志位置1
PV1_FAIL:=1;
ELSE
PV1_FAIL:=0;
END_IF;
IF (WORD_TO_INT(PV2) <-1) OR (WORD_TO_INT(PV2) >27649) THEN //低于正常或者高于正常则通道标志位置1
PV2_FAIL:=1;
ELSE
PV2_FAIL:=0;
END_IF;
// 计算偏差
PV_DEV:=ABS(PV1_REAL-PV2_REAL);
// 若偏差大于设定值且无通道故障则采用平均值,若其中有一个有问题就采用正常的那个数值
IF (PV_DEV < PV_DEV_SET ) AND (PV1_FAIL=0) AND (PV2_FAIL=0) THEN
PV:=(PV1_REAL+PV2_REAL)/2;
ELSE
//
IF (PV1_FAIL=1)AND(PV2_FAIL=1) THEN
PV:=ERR_MAN_SET;//若两个传感器都出现故障则采用预先设定的值
ELSE
//
IF ABS(PV1_REAL-ERR_MAN_SET)>=ABS(PV2_REAL-ERR_MAN_SET) THEN //若两个表没有故障则判断两个表的值接近设定值的那个表的值优先输出
PV:=PV2_REAL;
ELSE
PV:=PV1_REAL;
END_IF;
//
END_IF;
//
END_IF;
END_FUNCTION
//原创程序 欢迎交流 QQ275578306
关于为什么判断那样是有问题的仪表看看下面的表格
