自制工业控制系统:G代码与3B代码详解——两代线切割程序语言的来历、格式与方言
Contents
起因
解析篇贴着实现写:词法、模态、象限重建。但留了一堆"是什么"没讲——为什么 3B 长成 B X B Y B J G Z 这个怪样子,为什么坐标不带符号,为什么 G 代码要搞模态续效,线切割的 G 和铣床的 G 到底差在哪。这些问题在行业里待久了会当成理所当然,新人对着格式表背规则却不知道每条规则背后是什么约束。这篇把两代程序语言的来历、格式细节和方言地图摊开——也是给自己写解析器补的一课:看得懂格式的人多,说得清"为什么"的人少,而说不清为什么的时候,设计决定就只能拍脑袋。
一、3B:为逐点比较法量身裁的格式
上世纪六十年代末,国内高校和机床厂联合搞数控线切割控制台,那一代数控柜是分立元件和小规模逻辑电路——没有乘法器,更没有浮点,能做的运算就是加减、比较、移位。插补方案因此选了逐点比较法,而 3B 格式是给这个算法量身裁的:格式里每个字段,都对应硬件的一个具体需求。
先看逐点比较法怎么干活。它把轨迹控制变成一步一判:每走一步(一个脉冲当量,1µm),算一次偏差函数,判别当前点在轨迹的哪一侧,决定下一步朝哪个轴走 1µm,步步逼近:
- 直线的偏差函数:F = Xe·Y − Ye·X(起点为原点,叉积判侧)
- 圆弧的偏差函数:F = X² + Y² − R²(圆心为原点,判内外)
每步只有加减(F 用递推式增量更新,不用真乘方),每步只走一个轴 1µm,最大偏差不超过一个脉冲当量——1µm 的插补精度就是从这来的,跟丝的放电间隙恰好在一个量级上,正好够用。
对着这个算法看 3B 的五个字段,全部对上:
| 字段 | 机器拿它干什么 | 为什么这样设计 |
|---|---|---|
| B ×3 | 字段边界 | 纸带时代一个专用分隔码,无语义纯分界 |
| X Y | 直线给终点(相对起点)、圆弧给起点(相对圆心)的坐标 | 偏差函数需要的正是这两组原点:直线以起点为原点,圆弧以圆心为原点——格式直接按算法的原点习惯给数 |
| 无符号 | 符号藏在 Z 的象限里 | 省电路:一个象限码同时携带两个轴的方向和几何类型,比两个符号位加类型码省得多的硬件 |
| G 计数方向 | 判终用哪个轴 | 终点比较每步要做坐标全等判别,计数器判终只做递减到零——硬件便宜一个量级 |
| J 计数长度 | 计数器的初值 | 同上:判终不需要终点全坐标,只要一个轴上的总投影 |
计数方向的规则是两套,方向相反,背反了 J 就错:直线取终点坐标绝对值大的轴(投影长的轴计满即到);圆弧取终点落在 45° 分界线的哪一侧——终点靠 X 轴(|x|>|y|)取 GY,靠 Y 轴取 GX。圆弧相反的原因用几何一想就通:判终轴的投影必须单调走到头才不误停,直线天然单调,圆弧在一个象限内才单调,所以规则要按"终点在哪个区域投影仍然单调"来选。跨象限的圆弧,J 是逐象限累加的投影和——这也是手工编程最容易算错的地方,当年程序单上 J 抄错一位数是高频事故,所以解析篇把 J 当校验和复核,就是冲着这段历史来的。
顺带把 3B 的长短处说全。长处:极紧凑(纸带贵,一条 3B 十几个字符就一段轨迹);逐段相对坐标,没有长程序的累积误差;判终硬件极简。短处:没有补偿指令(后来 4B 在尾部加了补偿符号和半径,5B 再扩,都是打补丁);表达不了整圆(必须拆四段);人不可读,手工编程要画轨迹分解、算投影、查象限,门槛全在编程员脑子里。这些短处在它诞生的年代都不是事——那个年代"程序"本来就是编程员在纸上算好、穿孔员打出来的中间产物。
二、G 代码:从 APT 到字地址
G 代码的谱系比 3B 长得多。1952 年 MIT 伺服实验室做出第一台数控铣床,控制介质是穿孔纸带,当时编程是直接手写机器指令——于是很快有了 APT(Automatically Programmed Tools,自动编程工具):人写贴近几何的语句,计算机翻译成纸带。G 代码是从这个谱系里沉淀下来的字地址格式:一个块(一行)由若干个"字母+数值"的词组成,字母是地址,数是值,N10 G01 X12.5 Y-8.0 F150 各词各管各的。
它身上有两处设计遗产,直接来自纸带时代的成本约束:
- 模态续效:纸带按字节计费、读取按块进行,运动方式不变时重复写 G01 是浪费——所以"本块没写的词沿用上块",这就是模态。今天看是状态机,当年看是省带
- 前导零压缩:老纸带格式词长按位数定,
X0001230这种前导零一串,后来的格式允许省略,省的都是纸带和读取时间
标准化线:EIA 的 RS-274-D(1980)把字地址格式定成美国标准,ISO 6983 接过去成了国际标准,NIST 九十年代为 EMC(LinuxCNC 前身)写的 RS274NGC 释义文档是迄今最完整的公开参考。但"标准"管住的只是骨架——每个控制器厂商都在骨架上长自己的方言,G 代码从来不是一种语言,是一族语言。
坑:无小数点方言。 纸带时代一部分格式没有小数点,数值默认放大一千倍——X1000 是 1.0mm;现代方言 X1000 就是 1000mm。后处理配错机床,行程直接撞穿。这就是解析篇把"我们的方言子集定义清楚、越界显式报错"当第一条纪律的历史原因。
三、线切割的 G:借来的骨架,换掉的内脏
线切割借用铣削 G 代码的骨架(字地址、模态、G01/G02/G03),但内脏换了大半——它没有主轴、没有刀具,多了丝、放电间隙和锥度。逐项对照:
| 项目 | 铣削 | 线切割 | 后果 |
|---|---|---|---|
| 主轴转速 S、换刀 T | 有 | 无(慢走丝的 T 常被挪去做冲液/穿丝等辅助) | 方言里 T 的语义要查各家手册 |
| F 进给速度 | 恒速目标 | 放电状态反馈变频的初值/上限 | F 直接当恒速用,效率掉一半(解析篇) |
| 刀具半径补偿 G41/G42 | 铣刀半径 | 丝半径 + 单边放电间隙 | 补偿量随规准变,不是常数——多次切割每刀还不一样 |
| 锥度 | 无对应 | G51/G52 加角度、XYUV 四坐标、慢走丝专用语句,各家五花八门 | 解析器方言子集要明确收哪几种 |
| 加工条件 | 切削参数进 G/M | 不在 G/M 里:慢走丝用 C××条件号,中走丝用规准组 | 程序与规准的绑定是系统设计问题,不是格式问题 |
| 找边/找中心 | 对刀循环 | 有的方言给了 G80 系代码,有的只是界面功能 | 我们归手动子模式(机床界面篇) |
中间那行值得展开:丝径补偿是"活的"补偿量。铣刀半径刻在刀上,一个月不变;丝半径加放电间隙,随规准(脉宽/电流)漂,粗加工间隙大、修光刀间隙小,多次切割每刀的留量还层层相扣。所以补偿值不写死在程序里,D 号/组号挂在程序上、真值放参数区按刀查——这个"程序引用号、参数区存值"的分层,就是被这个行业特性逼出来的设计。
方言地图按系族看:
- 3B 系:HF 为代表的 DOS 控制系统,吃 3B/4B,程序是"轨迹+界面上的规准/次数配置"两分离
- XYUV 系:AutoCut 为代表,G 骨架,锥度直接用 XYUV 四坐标编,直观但四坐标联动逻辑复杂
- 角度系:G51/G52 加 A 角度(或 R 锥度比),机器按上下导轮几何参数自己算 UV
- 慢走丝 ISO 系:G 骨架 + C 条件号 + T 辅助 + 专用锥度语句,FANUC/三菱/沙迪克/夏米尔各家细节互不兼容——同一个后处理不可能通吃两家慢走丝
编程方式的变迁也在这个谱系里:程序单手算 + 穿孔纸带 → 八九十年代微机自动编程(绘图式编程软件普及,轨迹自动分解成 3B)→ CAD/CAM 后处理出 G 代码 → 编控一体(HF/AutoCut 在控制系统里直接绘图编程)。每一步都是把"编程员脑子里的几何"往机器里搬——搬得越多,格式背后的人越不需要懂投影和象限,但机器这头,总得有人还懂。
四、线切割编程到底特殊在哪
回到最初的问题:线切割的编程是不是有它特殊的地方——有,而且条条落在系统设计上:
- 丝中心轨迹 + 非常数补偿:程序描述的是丝中心的轨迹,真实轮廓要退丝半径加放电间隙,间隙随规准漂。设计后果:补偿是插补层的实时几何变换(段表只记 D 号),真值在参数区按规准组查
- 多次切割把程序和工艺焊在一起:中走丝一刀粗、二到四刀修,每刀轨迹偏移一个留量、换一组规准。设计后果:程序按切割次数分段挂规准组(机床界面篇编程屏),程序文本里不发明私有代码
- 进给不是恒速是自适应:放电间隙状态(平均电流/短路率)实时调插补步频。设计后果:F 只做初值,反馈环在放电 ISR 和插补 ISR 之间(调度篇)
- 起割要从穿丝孔开始:钼丝得先穿进孔里,所以程序有引入线(孔到轮廓)和引出线,切完还有废料处理。这些是轨迹组织问题,解析器不管,编程界面和工艺层管
- 尖角是放电加工的软肋:拐角处放电集中在丝的进给侧,尖角会被"烧塌"——方言里有塌角策略指令(拐角减速/改规准)。设计后果:段表转接处理时留策略钩子,归补偿/插补篇
- 锥度要吃机床几何参数:同一句锥度指令,不同机床上下导轮距离不一样,UV 联动量就不同。设计后果:锥度计算依赖设置篇的厂家级参数,程序可移植的前提是参数区配好
- µm 文化的语言层表达:3B 坐标天生 µm 整数,G 代码 mm 三位小数(µm 分辨率),两侧在解析层就归一成 i64 µm——内部单位一套(国际化篇),这两种格式给了现成的借口
五、我们的选择
系列口径回收:两种都吃。3B 是行业三十年存量的载体,不吃它等于让用户把老程序全重编;G 是新工具链的通用语,不吃它对不上 CAD/CAM。解析器两路输入、一张段表输出(解析篇),方言子集显式声明、越界报错不静默忽略。对内的应用篇语言(插补、补偿、锥度、多次切割)不发明新代码——工艺语义走规准组和参数区,几何语义走段表,人读的部分归界面。
总结
这篇没有代码,全是"为什么":3B 的五个字段逐一对上逐点比较法的硬件需求(B 分隔、无符号省电路、计数判终省比较器),计数方向两套规则相反的几何原因;G 代码从 APT/纸带来的两处遗产(模态省带、前导零压缩)和无小数点方言的坑;线切割 G 与铣削 G 的逐项差异(F 变变频初值、补偿变活的、锥度多方言、条件出 G/M 走规准组);线切割编程七条特殊性及其在系统上的落点。验收方式也简单:能把这段讲给一个只会按格式的老师傅听,他点头,这篇就算写对了。
下一篇进执行侧的地基:步进/伺服电机怎么吃脉冲、高频电源怎么吐放电——这两个洞不补上,插补器写得再好也是有的放矢打不出去,逐点比较法从"当年省电路的办法"变成"我们 ISR 里的代码"要等这两篇铺完。
参考链接
- LinuxCNC G 代码文档——字地址格式与模态组的最完整公开参考
- NIST RS274NGC 解释器文档——G 代码解释器语义的经典释义
- APT 语言历史(Wikipedia)——自动编程工具的来龙去脉
- 本系列:G代码与3B解析实战(格式怎么变成段表)、机床界面实战(编程屏与规准挂接)、中断驱动的硬实时层与协作式主循环(放电反馈变频的通路)
Author 软件开发大郭
LastMod 2026-09-11