CoDeSys输入变量越界的处理
某个项目用到一个编码器,输入DINT类型,存在越界可能。
一个类似传送带的设备,正反转,分辨率很高。用DINT类型直接计算很容易遇到距离过长,数据越界的情况。使用这种方式可以将32位的DINT转为64位的LINT来计算,越界可能小很多。INT也可以用这种方法转为DINT。
主要原理为:正常情况下最高2位不会突变,如果最高2位突变,根据两种突变规律(00->11或11->00)可以判断正向或负向越界。
变量声明:
FUNCTION_BLOCK FB_PosCalc
VAR_INPUT
In:DINT;
xReset:BOOL;
END_VAR
VAR_OUTPUT
Out:LINT;
END_VAR
VAR
udiTemp:UDINT;
byTemp:byte;
byTempOld: BYTE;
diTemp:DINT;
udiOffset: UDINT;
END_VAR
功能块程序:
//越界后正负不好判断,转为UDINT后判断越界
udiTemp:=DINT_TO_UDINT(In);
//正向越界(11xxx=>00xxx),当前值00,旧值11。反向越界(00xxx=>11xxx),当前值11,旧值00。
byTemp.0:=udiTemp.30;
byTemp.1:=udiTemp.31;
IF byTemp = 0 AND byTempOld = 3 THEN
diTemp:=diTemp+1;
ELSIF byTemp = 3 AND byTempOld = 0 THEN
diTemp:=diTemp-1;
END_IF
byTempOld:=byTemp;
//高位移位,正负依然有效(最高位)。低位借用当前值减偏置值
Out:=diTemp;
Out:=ROL(Out,32);
Out:=Out+udiTemp-udiOffset;
IF xReset THEN
udiOffset:=udiTemp;
diTemp:=0;
END_IF
No Comments