最近在编写西门子数控系统 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 即可,这样在保证精度没有太大变化的情况下,也保证了循环可以正常跳出。

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

标签: none

已有 7 条评论

  1. ahxinny ahxinny

    一个问题是系统计算精度引起的。所以我在程序中很少用相等的比较,例如if 30.0-30=0,在软件中永远不满足。

  2. ahxinny ahxinny

    在endwhile之前可以增加一句,if abs(R0)

  3. ahxinny ahxinny

    在endwhile之前可以增加一句,if abs(R0)

  4. ahxinny ahxinny

    显示不出来后面的文字?

  5. ahxinny ahxinny

    好像有空格就断句了。

添加新评论