Marco Nie - 2021年9月 https://blog.niekun.net/2021/09/ zh-CN you are the company you keep... Fri, 03 Sep 2021 09:38:00 +0800 Fri, 03 Sep 2021 09:38:00 +0800 828D 执行程序提示:等待插补缓冲 https://blog.niekun.net/archives/2330.html https://blog.niekun.net/archives/2330.html Fri, 03 Sep 2021 09:38:00 +0800 admin 最近在编写西门子数控系统 NC 代码时,遇到一个问题:启动程序后在固定地方程序无法继续执行下去,提示:等待插补缓冲:
2021-09-03T01:27:34.png

程序代码如下:

WHILE((R0>=360) OR (R0<0))
    IF R0>=360
        R0=R0-360
    ELSE
        IF R0<0
            R0=360+R0
        ENDIF
    ENDIF
ENDWHILE

以上程序实现的功能是将 R0 的值控制在大于等于 0 小于 360 之间。理论上无论给 R0 赋予任何初值,执行以上代码后都可以将其自动计算为需要的结果。

在分析后发现,出现以上报警的原因是程序在此 while 循环中无法跳出。随即从这里下手寻找问题点。

在经过给 R0 赋予一些特殊的初值,然后执行程序后发现,当初值为 -0.0000000001 或 359.999999999 时无法跳出循环,R0 的值一直在这两者之间跳动,猜测应该是数控系统精度判断 359.999999999 等于 360,导致 IF R0>=360 一直成立并减去 360 后结果又成为了 -0.0000000001,然后就是反复的无限循环。

找到了问题点解决就很简单了,只需要将 R0=R0-360 修改为 R0=R0-360.00001 即可,这样在保证精度没有太大变化的情况下,也保证了循环可以正常跳出。

出现此处报警一般都是程序内出现死循环的问题,通过单步执行程序或设置断点可以快速定位故障位置然后就可以考虑一些特殊情况下是否会导致死循环。

]]>
2 https://blog.niekun.net/archives/2330.html#comments https://blog.niekun.net/feed/2021/09/