Technical Article
FANUC ROUND 先存变量再输出,为什么小数坐标变成整数?
依据FANUC 21i-MB手册,区分宏赋值中的ROUND取整数与NC地址按最小输入增量舍入,并用两段增量算例解释0.001毫米不闭合的来源。
同一个12.3456,直接写在X地址中的ROUND得到12.346;先用ROUND算好存进变量,再把变量交给X,却只剩12。对下面这组FANUC 21i-MB算例,问题在ROUND所处的语句,不在小数点后显示几位。
本文限定GE Fanuc Series 21i/210i-MB加工中心、具备Custom Macro功能,依据GFZ-63614EN/01手册第15章。算例采用毫米、X轴最小输入增量0.001毫米、G91增量坐标、G94每分钟进给,无坐标旋转、比例缩放或刀径补偿。这里核对的是该手册版本的规则,不把它直接标成所有0i或新版系统的通则。
赋值里的ROUND,先把小数舍成整数
该手册明确区分两种语境:ROUND在算术或逻辑运算语句、IF、WHILE中,按小数第一位四舍五入,得到整数;在NC语句的地址中,则按该地址的最小输入增量舍入。
所以“先算一个中间变量,程序看起来更整齐”可能改变结果。下面的#2在赋值时已变成12,后面的X无法再找回被舍去的小数。
#1=12.3456
#2=ROUND[#1]
G91 G01 X#2 F100.
在上述条件下,最后一行的X指令增量是12.000毫米。F100仅是示例运动片段的进给值,不是针对材料或刀具给出的切削参数。

图1:把ROUND移出NC地址,不是只换一种写法。窄屏可左右滑动查看。
要按X的输入增量舍入,就在X地址中表达
保持#1原来的12.3456,在NC地址内使用ROUND,本例会按X的0.001毫米输入增量得到12.346毫米:
#1=12.3456
G91 G01 X[ROUND[#1]] F100.
两段代码是独立对照,不是要求顺序执行。G91会保持有效;后续若接绝对坐标程序,应在下一次绝对坐标运动前明确恢复G90。它们只讨论X增量的数值形成,没有包含进退刀、避让和加工起点建立。若实际机床采用另一种最小输入增量,就必须按那种增量重新计算,不能把本文的三位小数结果照搬。
去程分两段、回程合一段,为什么会差0.001毫米
再看一个与取整语境直接相关的问题:#1=12.3456,#2=7.8916。去程分别输出两段正向增量,控制器按0.001毫米输入增量得到12.346和7.892,合计20.238毫米。
如果回程先在方括号里相加,12.3456+7.8916=20.2372,再按输入增量舍入,回程只有20.237毫米。于是从起点算起,指令累计剩下+0.001毫米。
#1=12.3456
#2=7.8916
G91 G01 X#1 F100.
X#2
X-[#1+#2]

图2:比较的是指令数值的闭合,不是宣称机床实测偏差。窄屏可左右滑动查看。
在这个两段去程、一段回程的结构中,回程也先让两个数在X地址语境里分别舍入,再相加,才能使用与去程相同的数值:
X-[ROUND[#1]+ROUND[#2]]
这行得到反向20.238毫米,与两段正向指令闭合。不要把它重新整理成“#3=ROUND[#1]+ROUND[#2],再输出X-#3”:那又回到了宏赋值取整数的语境。
修改宏时,把中间值与NC地址一起回读
如果ROUND用于孔数、循环次数或整数判断,赋值中取整数可能正是目的;如果它用于尺寸坐标,先确认结果应保留到哪个输入增量。回读时至少把变量赋值和使用它的NC行放在一起,单看最终X#2无法判断前面丢掉了什么。
本例的0.001毫米来自舍入顺序。实际回到原位还涉及机床定位、补偿和执行路径,不能把指令累计为零直接当成实机精度结论。后处理或宏优化时,应先保持数值语义,再考虑减少变量或合并程序段。
变量还可能有另一类问题:参数未传与传0不是同一回事,可接着看FANUC 宏参数没传和传 0,为什么不能先加 0?。准备修改时保留完整赋值与运动段,资料可按后处理修改前,需要准备哪些资料整理。
资料依据:GE Fanuc Series 21i/210i-MB Operator's Manual,GFZ-63614EN/01,2001年7月,第15章,印刷页299“ROUND function”。链接为Warp9公开保存的厂商原始手册副本,不是FANUC官网地址。