搜索文章与案例

Technical Article

西门子828D分层步距写0.2,为什么变量成了0?

按SINUMERIK 828D CNC 5.24手册,解释DEF INT接收0.2时的隐式取整。用无轴运动代码区分INT与REAL,说明转存REAL不能恢复已丢小数,并把分层步距与整数层号分开。

分层步距明明赋了 0.2,累计深度却不增加,变量窗口里也只剩 0。如果程序开头写的是 DEF INT CXISTEP,先别改进给或显示小数位:0.2在赋给整数变量时已经变成了0。即使整段没有写ROUND,这次转换也会发生;后面再把它用于计算,不会自动恢复成0.2。

本文限定SINUMERIK 828D、西门子语言编程,依据CNC软件5.24的07/2024《NC programming》手册。用正数0.2毫米作为自建分层步距示例;毫米是本例给变量安排的工程含义,普通REAL变量本身不会替程序指定长度单位。以下程序只做数值赋值,没有轴运动、主轴或切削参数。

先看接收变量的声明,不是只看等号右边

INT用于整数,REAL用于实数。手册第430–431页说明:赋值双方类型兼容时会自动转换;REAL转INT参照ROUND规则。对这里两个正数,0.2转为0,0.8转为1。因此,它不是“所有小数都直接砍掉”。若把步距从0.2改成0.8后突然有数值了,也不代表原问题已经修好。

DEF INT CXISTEP
DEF REAL CXRSTEP,CXCOPY
CXISTEP=0.2
CXRSTEP=0.2
CXCOPY=CXISTEP
M30

按上述规则,三次赋值完成后的预期数值依次是:CXISTEP为0,CXRSTEP为0.2,CXCOPY为0。第三个变量虽然声明成REAL,拿到的却是已经转换后的0。这些是三次赋值完成后的规则推导值,不能把M30结束后局部变量是否仍可见混作赋值结果。

828D将0.2分别赋给INT和REAL时得到0与0.2,INT的0再转存REAL仍为0的原创数据流图
图1:数值在哪一步丢失,就应回到哪一步修正。

最小改动:让步距一直走REAL这条赋值链

如果CXISTEP确实代表允许小数的每层步距,修改它的定义类型,而不是在后面增加一个REAL中间变量。下面两段是修改前后的独立片段,不要把同名定义并排放进一个程序:

; BEFORE: INT STEP
DEF INT CXISTEP
CXISTEP=0.2
; AFTER: REAL STEP
DEF REAL CXISTEP
CXISTEP=0.2

定义仍应放在程序开头的定义区。接入已有程序时,还要查看所有接收CXISTEP的中间变量:如果下一步又赋给另一个INT,问题只会往后挪一行。变量名在此用于说明,合并前应确认未与现有程序中的定义冲突。

层号是整数,步距不是层号

一个深度为1毫米、每层0.2毫米的理想分层算例,应得到0.2、0.4、0.6、0.8、1.0毫米五个累计深度。层号1到5可以用整数;每层步距和累计深度则需要容纳小数。把“所有循环相关量”统一声明成INT,会把这两类数据混在一起。

正数0.2转INT得到0而0.8转INT得到1,并说明零步距无法累计到1毫米深度的原创示意图
图2:正数转换对照与分层算例。图示没有把变量取整当作机床定位误差。

若循环依靠“累计深度加步距”向终止值推进,步距被转换为0以后,累计值就不再增加;实际程序是否重复执行、是否被其他计数器终止,取决于那段控制逻辑。不能只凭这一处赋值就断言控制器必报某个报警号。也不要用除以步距来计算层数后才检查它:应在使用前拒绝零或负步距。

本例恰好整除,不展开最后不足一层的余量处理。对于不整除的总深度,最后一层仍需限制到目标深度;把变量改成REAL只是修复数值类型,不会自动补齐分层算法。

回读NC时,把定义、赋值和使用连起来

从声明开始追踪:步距在哪里定义,原始0.2赋给谁,经过哪些变量,最终在哪里参与深度计算。仅看末尾运动行或把显示改成更多小数位,找不到已经发生的整数转换。可以先用上面的无轴运动片段核对变量语义,再把最小改动接回原程序;这里不提供省略进退刀条件的直接加工循环。

同样需要分清整数与尺寸的场景,可读828D孔阵列中的孔号、行列与坐标。那篇用整数行列配合实数坐标,不应把“孔号用INT”扩展成“所有计算变量都用INT”。

资料依据:西门子SINUMERIK 828D NC programming,07/2024,CNC软件5.24,A5E48764001B AH;变量定义第393–395页,类型转换第430–431页。