恭喜,你发布的帖子
发布于 2025-11-08 23:24:21
10楼
刚才做了下测试,此现象的原因找到了,其实很简单,就是SINA_POS内写了在ZSW1.%X11=TRUE(状态字已回参标志位)时,程序内复位ExecuteMode,导致STW2.%X11无法被触发(控制字回参启动命令),以至于无法执行回参动作。
将原程序内的
IF #sxRecvBuf.ZSW1.%X11 OR NOT #ExecuteMode THEN
#sbExecute := FALSE;
END_IF;
改为
IF NOT #ExecuteMode THEN
#sbExecute := FALSE;
END_IF;
即可进行多次回参
这个问题很难被定义为“故障”、“缺陷”或BUG,我测试了FB284、FB300、BPOS,都是这个情况,更多感觉是编程人员有意为之,不允许二次回参,只有当原参考点丢失后才能再次执行
原触发逻辑
现逻辑
回参控制字
测试程序
另将SINA_POS中ExecuteMode触发相关原程序段及注释贴在这里
// Betriebsart aktivieren erkennen (RQ 3901129, RQ 4094299)
IF #ExecuteMode AND NOT #sbExecuteEdge THEN(ExecuteMode上升沿时可触发静态变量#sbExecute置位,#sbExecute为后续程序内实际使用的触发命令)
#sbExecute := True;
#siExecuteCyc := 0;(复位触发时间计时器)
ELSIF #ActMode <> #ModePos THEN(如果当前实际激活的控制模式不等于输入的实参控制模式,则取消触发激活)
#sbExecute := FALSE;
ELSIF #siExecuteCyc > (2 * #siCycWait) THEN(当触发命令持续时间大于2*#siCycWait时根据不同的控制模式对ExecuteMode做对应处理,#siCycWait缺省值5)
IF #ModePos <> 4 THEN(如果控制模式不为4主动回参,则复位#sbExecute触发指令,因为除了Mode=4外,其它Mode的#ExecuteMode都是给定脉冲指令即可)
#sbExecute := FALSE;
ELSE(如果控制模式为4,则在已回参和外部输入实参被复位的情况下,复位#sbExecute)
IF #sxRecvBuf.ZSW1.%X11 OR NOT #ExecuteMode THEN
#sbExecute := FALSE;
END_IF;
END_IF;
ELSE
; // not used
END_IF;
IF #siExecuteCyc > 100 THEN
#siExecuteCyc := 0;
ELSE
#siExecuteCyc := #siExecuteCyc + 1;(复位触发时间计时器循环累加)
END_IF;
// Verfahrauftrag aktivieren Flanke merken
#sbExecuteEdge := #ExecuteMode;(#ExecuteMode,边沿触发状态记录)
请填写推广理由:
分享
只看
楼主