CoDeSys输入变量越界的处理

阔奥智能

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

Add your comment