数控编程代码实战:G代码、刀补、固定循环与宏程序避坑 数控编程这项工作说白了就是用一堆字母加数字指挥一台几吨重的铁疙瘩在毛坯上啃出想要的形状。刚入行那会儿我也干过在论坛里到处扒“代码大全”、复制粘贴存进手机备忘录的事结果真到了机床上G41和G42谁是左谁是右还得翻回去看刀补方向反了直接过切一件活报废。后来才明白数控编程代码根本不存在“背下来就行”的说法G代码表只是字典能不能写出一段稳定跑得下来的程序靠的是知道每条指令在什么场景下用、用错了会出什么事、以及系统在背后到底算了什么。下面这些内容是我这些年从铣床到车床、从简单轮廓到宏程序一点点攒下来的适合刚摸机床的新手照着捋一遍也适合干了几年但一直被报警和尺寸超差困扰的同行对照排查。1. 背代码表没用先搞懂数控程序的四层结构很多人学编程的第一步是找一张G代码对照表把G00到G99全抄一遍。抄完之后脑子里是一团浆糊因为代码表是按编号排的而实际加工是按功能顺序走的。真正靠谱的记忆方式是把一段程序拆成四个层次基准层、运动层、补偿层、循环层。基准层决定机床“认哪个点为原点”运动层决定刀具“怎么走”补偿层决定“刀具的实际尺寸算不算进去”循环层决定“重复动作怎么偷懒”。这四层厘清了绝大多数指令自然就有了归属忘掉某一条时也知道该去哪个抽屉里翻。举个最直观的例子。同样一句G01 X100. Y50. F200在G90绝对坐标下是走到100,50在G91增量坐标下是往前再走100、往右再走50。指令字符一个没变含义完全变了。这就是为什么很多人抄别人程序抄出问题——人家开头写了G90你只抄了中间那段坐标系一乱刀具直接扎进夹具。所谓“代码大全”最有价值的部分从来不是指令本身而是指令之间的从属关系和生效条件。还有一层容易忽视的东西模态指令。G00、G01、G02、G03这些都是模态的写了之后会一直生效直到被同组指令覆盖。所以程序里经常看到G01 X.. Y..后面跟一句只有X.. Y..的行它依然是G01在走。新手看到这种写法会觉得“少写了什么”其实完全正确。反过来非模态指令比如G04暂停、G28回参考点执行完就失效下次要用还得再写。这个区别必须分清否则读别人程序时会完全摸不着头脑。1.1 基准层坐标系与单位怎么定比写多少行代码都关键基准层里最重要的三个指令是G90/G91、G54~G59、G17/G18/G19。前两个决定“怎么算位置”后一个决定“在哪个平面上做圆弧补偿”。这三条定错了后面写一万行都是白搭。G54到G59是工件坐标系本质是告诉机床“我现在的编程原点相对于机床原点偏移了多少。”对刀的过程就是把偏置值测出来填进系统。理论上一条零件程序只需要一个工件坐标系但实际加工中经常用到多个比如一件活有正面和反面两道工序或者一台机床一次装夹做两个工位。这时候G54装正面、G55装反面程序里切换一下就行不用重新对刀。G53是比较特殊的一条它不走工件坐标系直接按机床坐标系定位一般只用在换刀点、托盘交换这类需要绝对安全位置的地方写G53 Z0.就是老老实实回机床Z零点不受任何偏置影响。这条指令在防止撞刀上价值极大但也因为“绕过偏置”用之前脑子必须清醒。G17/G18/G19是平面选择铣床默认G17XY平面圆弧插补时I、J、K对应哪个轴全看这条指令。车床默认G18ZX平面。我曾经遇到过一个问题铣床上加工一个侧面圆弧程序里用的是G18但前面某处残留了G17没取消结果圆弧直接走成了空间曲线撞了刀。平面选择是模态的切换之后要养成显式写回G17的习惯尤其是在一段侧面加工完成、要回到顶面继续干的时候。单位指令G20英寸和G21毫米同理一般在程序头写死中途不要切换。有些老系统默认单位跟机床参数绑定如果程序头没写换一台机床跑出来的尺寸可能差25.4倍这种事故听着离谱但真发生过。1.2 运动层G00、G01、G02、G03四个指令撑起全部轮廓所有轮廓加工剥到最里面就是这四个指令在循环。G00是快速定位按机床设定的快移速度走不切削G01是直线插补按F指定的进给速度走G02/G03是圆弧插补一个顺时针一个逆时针方向判断标准是从第三轴正方向往负方向看在G17平面就是从Z正向往Z负向看也就是从上往下俯视工件。圆弧有两种写法。一种是圆心法用I、J、K表示圆心相对起点的增量G02 X.. Y.. I.. J.. F..。I是圆心X减起点XJ是圆心Y减起点YK是Z方向。这种写法精度最高不会因为四舍五入产生误差。另一种是半径法用R表示圆弧半径G02 X.. Y.. R..。R写正值表示圆心角小于等于180度写负值表示大于180度。很多“圆弧半径超差”报警就是因为R值和起点终点距离对不上——起点到终点的直线距离是弦长R必须大于等于弦长的一半差一点点系统就会报错或者在容差范围内自行调整圆心位置导致圆弧形状跑偏。(圆心法逆时针圆弧半径50从(50,0)到(0,50)) G03 X0. Y50. I-50. J0. F200. (半径法同一个圆弧) G03 X0. Y50. R50. F200. (大于180度的大圆弧R取负值) G03 X0. Y50. R-50. F200.我个人的做法是小于180度的简单圆角用R值写起来快大于180度的圆弧、以及需要精确控制圆心的全圆加工一律用I、J、K。全圆加工尤其要注意起点和终点重合时用R值是无法确定唯一圆心的系统会报警或者走成零长度必须用I、J、K。进给速度F的单位是mm/minG94状态下实际取值要结合刀具、材料、齿数来算不是拍脑袋写的。硬质合金立铣刀加工中碳钢切削速度大致在60到120m/min这个区间转速 n 1000 × vc ÷ (π × D)。比如φ10的四刃立铣刀取vc80m/min算下来n≈2548机床取整到2500r/min。进给F 每齿进给 × 齿数 × 转速每齿进给取0.05mm就是 0.05 × 4 × 2500 500mm/min。这两个公式没什么玄机但把计算过程走一遍比在刀具样本上瞎找参数靠谱得多因为样本参数往往是理想工况实际还要乘上机床刚性、夹具刚性的折扣系数。1.3 补偿层G41/G42方向搞反是过切报废的头号原因刀具是有半径的程序里给的坐标是刀心轨迹还是轮廓轨迹这个区别就是补偿存在的意义。G41是刀具半径左补偿G42是右补偿判断标准是沿着进给方向往前看刀具位于工件轮廓的左侧用G41右侧用G42。G40取消补偿。方向一旦搞反表现是切进去一个刀半径的量等于过切了一整个刀具直径的深度小零件基本当场报废。我见过的最典型翻车场景是外轮廓顺铣用G41有人觉得“顺铣是顺时针那应该是G42”结果整圈轮廓全部偏移。正确的记忆锚点是位置关系不是顺逆铣——把刀具想象成一辆车你坐在驾驶位往前开路沿在左手边就是G41在右手边就是G42。加工场景常见补偿指令说明铣外轮廓沿轮廓外侧走刀G41刀具在轮廓左侧工件留右侧铣内型腔沿内壁走刀G42刀具在内壁右侧车外圆常规右偏刀G42以实际刀架位置空运行验证车内孔G41方向随走刀方向变化必须实测取消补偿G40必须写在离开工件的空行程上补偿还有一个必须注意的点建立和取消补偿的那一段移动长度必须大于刀具半径。如果只走了0.5mm就建立补偿系统没法算出正确的切入矢量会报“刀具补偿非法”或者直接切出奇怪形状。通常做法是在距离工件5到10mm的位置起刀用一段足够长的直线建立补偿然后再切入。长度补偿G43和G44用在加工中心上配合H值指定补偿号。G43是正向补偿G49取消。换刀之后如果不写G43 H_主轴端面到刀尖的距离就按零算Z轴按程序里的深度走十有八九是直接扎进工作台。每次换刀必须配一条G43这在老手看来是肌肉记忆在新手眼里就是一句可有可无的代码差别就在这儿。1.4 循环层固定循环把七八行代码压成一行钻孔、攻丝、镗孔这些动作工艺过程是固定的快速定位到孔位上方、下到R平面、进给钻到深度、快速退回。如果每个孔都手写这几行一个面上几十个孔写下来程序几百行改起来还容易漏。固定循环就是把这些动作打包。(钻孔循环G98返回初始平面G99返回R平面) G98 G81 X50. Y50. Z-20. R3. F120. X100. X150. G80这里有几个参数必须理解透。R是安全平面高度一般取工件表面上方2到5mm它的作用是让快速定位只到R平面从R往下才开始用进给速度。**R值设得太高浪费时间设得太低或者设成负值刀具会在快移过程中直接撞上工件或夹具。**Z是孔底深度要算上钻尖的锥高不然实际孔深会浅一截。G98和G99的区别在于循环结束后刀具回到哪里G98回初始平面也就是循环开始前的高度G99回R平面。同一组孔加工完要去换刀或者跨越凸台用G98连续在一大片平面上打孔用G99能省不少空行程时间。常用固定循环整理如下指令用途关键参数G81普通钻孔Z、R、FG82带孔底暂停的钻孔增加P暂停秒数G83深孔啄钻、每钻一段退回R平面排屑Q每次钻深G73高速深孔断屑、小退刀Q每次钻深G84刚性攻丝F 转速 × 螺距G76精镗需配合偏移参数各系统差异大G85镗孔、进给退刀Z、R、FG80取消固定循环必须写在循环结束处深孔加工用G83还是G73取决于排屑需求。G83每次钻Q深度就退回R平面排屑彻底适合钢件、深孔G73只退一点点距离断屑效率高但排屑能力弱适合铸铁、铝合金这类切屑易碎的料。Q值一般取刀具直径的0.5到1倍太小效率低太大排屑不畅容易烧钻头。攻丝要算F值进给等于转速乘以螺距。M10×1.5的螺纹转速300r/minF就是450mm/min。这个数算错一点点螺纹就乱牙丝锥断在孔里取不出来麻烦得很。刚性攻丝还要求主轴和进给严格同步参数里要打开对应选项否则只能退回到柔性攻丝加浮动夹头。2. M代码不是配角辅助功能搞错程序一样跑不起来大部分人把注意力全放在G代码上M代码随口带过。实际在车间里因为M代码写错而导致撞机、烧刀、工件飞出的事情一点都不少。M代码管的是主轴、冷却、换刀、程序流向这些“非几何”的动作它们不参与轨迹计算但直接决定机床此刻处于什么状态。2.1 主轴与冷却M03和M04的方向别凭感觉M03主轴正转M04反转M05停止。正反转的判断标准是从主轴尾部向刀具方向看顺时针为M03。铣刀因为刃口对称方向错了顶多切削效率差、刀具寿命短但攻丝、铰刀、左旋刀具方向错了就是直接崩刃。车床更敏感卡盘上的三爪如果没锁紧反向启动的瞬间工件就可能飞出来。冷却M08开、M09关。听起来没技术含量但开冷却的时机很有讲究。钢件粗加工必须在刀具接触工件之前就开冷却不然刀片忽冷忽热涂层崩得很快而某些铸铁、粉末冶金件干切更好冷却液反而会让粉尘糊住导轨。我一般的习惯是程序头开冷却程序结束前给几秒延时让主轴停稳再关中间尽可能不频繁开关——电磁阀频繁动作寿命掉得比刀片还快。2.2 换刀与程序控制M06、M30、M98/M99加工中心换刀用M06后面跟刀号比如T05 M06。这里有个坑刀号、刀补号、长度补偿号是三套独立的编号刀库里第5号刀长度补偿可能填在H5也可能按刀具实际长度填在别的补偿号里具体看车间规范。盲目照抄别人的程序T05 M06后面跟着G43 H05看起来天经地义但如果你的刀具长度数据填在H15一样是撞刀。所以拿到一段新程序第一件事是核对刀补表而不是直接跑。M98和M99是子程序调用与返回。把重复出现的加工动作比如一组规律排列的沉孔、一段固定形状的清角写成子程序主程序里用M98 P_ L_ 调用。L是调用次数这个参数能省掉大量重复代码。子程序的好处是改一处等于改全部坏处是子程序里的坐标系和补偿状态会带到主程序里如果子程序结束前没有恢复后面主程序接着跑就可能出问题。稳妥做法是子程序开头也写一遍G90、G40、G80这些“复位三件套”。M00程序暂停、M01选择性暂停要打开面板上的“选择停”开关才生效、M30程序结束并复位。M01在实际加工中很有用在关键工序之间插一条M01首件试切时可以逐个动作确认批量生产时把开关关掉程序照样连续跑。这个习惯救过我很多次尤其是加工贵重毛坯的时候走到一半发现刀装错了一个暂停能挽回整件活。2.3 不同系统之间的差异抄代码前必须核对同样是G84刚性攻丝有的系统要求用M29指定刚性模式有的系统在参数里打开就行同样是G76精镗参数顺序在不同系统上可能完全不一样同一个G代码在两个系统里甚至可能代表不同功能。这就是为什么“代码大全”这种东西只能当字典用不能当模板抄。我的做法是给每台机床建一个自己的“常用指令备忘”把真正跑通过的片段记下来包括系统型号、参数含义、实测效果。换一台机床先花半天时间用它自带的空运行和图形模拟验证几条关键指令别信论坛上的通用写法。表格对比一下常见差异点功能日系系统常见写法欧系系统常见写法注意事项刚性攻丝需M29进入刚性模式参数开启后直接G84必须查机床手册刀尖半径补偿G41/G42配合R或DG41/G42配合补偿号补偿表格式不同附加坐标系扩展G54.1用G505等扩展组数量与编号差异大宏程序变量#1~#33局部变量#1~#99局部变量变量范围差别明显3. 宏程序把“重复劳动”换成“一次写好”如果说普通G代码是手写宏程序就是写脚本。它会算术、会判断、会循环能把一段重复几十次的轨迹压缩成十几行。刚接触宏程序的时候我觉得这是高阶玩意后来发现只要掌握变量和两种控制语句能解决的问题立刻翻倍——圆周均布孔、变螺距螺旋、按图纸参数自动生成轮廓这些用普通代码写到手抽筋的活宏程序几行就搞定。3.1 变量体系局部、公共、系统三类各管什么局部变量一般是#1到#33只在当前程序内有效程序结束就清零适合做临时计算和子程序传参。公共变量#100到#199、#500到#999掉电保持特性不同前者一般断电清除后者断电保留适合存一些跨程序共享的数值。系统变量#1000以上直接读写机床内部状态比如当前位置、刀具补偿值、报警状态属于进阶用法改错了会影响机床参数动手前务必备份。变量赋值很直白#150。参与运算可以嵌套#2[#110]*2。函数也支持SIN、COS、SQRT、ABS、ROUND、FIX这些常用。要注意角度单位有的系统SIN/COS吃的是角度值有的吃弧度写错了圆会画成一个奇怪的形状而且不报警很难查。3.2 两种控制语句WHILE循环和IF跳转最常用的是WHILE...DO...END。格式是WHILE [条件] DO 1到END 1中间的内容循环执行直到条件不成立。另外还有IF...GOTO做条件跳转逻辑上更接近早期的BASIC但可读性差我现在基本只用WHILE。(沿圆周均布8个孔半径80圆心在原点) #18 (孔数) #280 (分布圆半径) #31 (计数器) WHILE [#3 LE #1] DO 1 #4[#3-1]*360/#1 G90 G81 X[#2*COS[#4]] Y[#2*SIN[#4]] Z-15. R3. F100. #3#31 END 1 G80这段东西的威力在于孔数从8改成12只改#1一个数。手写的话要重新算12组坐标算错一个就撞。3.3 三个能直接抄去用的宏程序片段第一个椭圆轮廓。椭圆的参数方程是Xa·cosθYb·sinθ用微小角度步进逼近#160 (长半轴) #240 (短半轴) #30 (角度起点) #4360 (角度终点) #51 (角度步距) G01 X#1 Y0. F300. WHILE [#3 LE #4] DO 1 #3#3#5 #6#1*COS[#3] #7#2*SIN[#3] G01 X#6 Y#7 END 1步距#5决定了轮廓的平滑程度取1度时每段弦长对应误差已经很小取0.5度更保险代价是程序段数翻倍。步距不能太大超过5度肉眼就能看出多边形棱角。第二个矩形型腔螺旋下刀。从中心开始每转一圈向外扩一个刀具直径的70%同时Z轴按比例下深避免满刀垂直扎下去#10 (当前半径) #240 (目标半径) #32 (每圈下深) #4-20 (总深度) #50 (当前深度) WHILE [#5 GT #4] DO 1 #5#5-#3 IF [#5 LT #4] THEN #5#4 #1#17 IF [#1 GT #2] THEN #1#2 G03 I#1 Z#5 F200. END 1这里用了IF...THEN做数值钳位防止最后一步超程。螺旋下刀是加工深腔最稳的方式之一比垂直下刀对刀具的冲击小得多排屑也顺畅。第三个变螺距螺纹。普通G32只能走等螺距用宏程序可以按Z位置实时算F值做出渐变螺距的效果。这类活在实际中不多但真碰上了手写是写不出来的。写宏程序最容易翻车的地方是变量被意外覆盖。局部变量在子程序调用时会互相影响如果主程序和子程序都用了#1值就乱了。我的习惯是主程序用#100段子程序用#1段中间通过参数传递互不干扰。4. 拿一件真实零件走完整个流程从图纸到首件光看指令永远是纸上谈兵。找一件典型件——比如一块100×80×30的铝板四角倒圆角R10中间一个φ40的通孔四角各一个φ8的通孔——把整个流程走一遍才能把所有知识点串起来。4.1 工艺路线和编程原点怎么定先定工序铣顶面 → 铣外轮廓含圆角→ 铣中间φ40孔 → 钻四角φ8孔。如果板厚公差要求高还要翻面铣底。装夹方式用平口钳夹两侧夹持高度留出8mm以上露出加工面。编程原点定在工件顶面中心Z0在顶面。理由有三条轮廓关于中心对称坐标值正负对称写起来不容易错孔位相对于中心容易算翻面加工时如果厚度一致原点可以直接复用。如果原点定在左下角所有坐标都是正值看起来直观但对称件的计算量翻倍且一旦工件尺寸有偏差累积误差全压在一边。原点选定之后对刀必须严格按这个点来。X、Y用寻边器或分中棒分中Z用刀尖碰顶面后输入机床。分中这个动作看着简单但两个方向各碰一次、取平均值中间任何一次碰的位置有铁屑整个坐标系就偏了0.05以上。我一般碰之前用气枪把工件表面和侧面吹干净这一下省下来的返工时间远超那几秒钟。4.2 程序逐段读每行都要知道在干什么O1001 (铝板外轮廓孔加工) G21 G17 G40 G49 G80 G90 (复位公制、XY平面、取消补偿、取消循环、绝对坐标) G91 G28 Z0. (Z轴回参考点安全) T01 M06 (换φ10立铣刀) G90 G54 G00 X0. Y0. (定位到工件中心上方) S2500 M03 (主轴正转) G43 H01 Z50. M08 (长度补偿下到安全高度开冷却) (铣外轮廓刀具半径5轮廓100x80圆角R10) G00 X-60. Y-50. (起刀点在轮廓外) G01 Z-5. F300. (下刀第一层) G41 D01 G01 X-50. Y-40. F500. (建立左补偿切入轮廓左下角) G01 X50. G03 X60. Y-30. R10. G01 Y30. G03 X50. Y40. R10. G01 X-50. G03 X-60. Y30. R10. G01 Y-30. G03 X-50. Y-40. R10. G01 X-50. Y-40. G40 G01 X-60. Y-50. (取消补偿退刀)逐行拆一下。开头那行“复位串”是好习惯把所有模态状态清一遍避免上一个程序残留。G91 G28 Z0.用的是增量方式回参考点这是很多系统的标准写法直接G28 Z0.在部分系统上含义不同跨机床时要注意。G43后面跟H01如果刀补表里1号位没填长度等于没补偿下刀就会撞——每换一次刀先确认补偿表再运行程序。轮廓段的起刀点设在轮廓外侧10mm处是为了给建立补偿留出足够距离。切入时用G41并给一段带进给的直线让系统有时间计算切入矢量。四个圆角用G03方向是从上方俯视逆时针与外轮廓走向一致。最后用G40退刀同样要走出足够距离。中间φ40的孔和四个φ8的孔思路一样先用小直径刀螺旋铣出孔或者直接钻。φ8的孔直接用φ8钻头配G81循环。4.3 首件试切把“跑程序”拆成五个动作新程序第一次跑直接按启动是最危险的做法。我固定按这五步来第一步图形模拟。机床自带的图形仿真把刀具轨迹画出来重点看有没有超出工件范围、有没有扎进夹具、Z轴有没有走到负得离谱。第二步单段空运行。把进给倍率打到最低开单段一段一段按。每按一次看一次坐标显示和下一段的动作尤其是换刀、G43、G41这些状态切换的地方眼睛盯着主轴和工件之间的实际距离。第三步抬高Z轴跑一遍。把G54的Z偏置统一加50mm整段程序空跑一次观察轨迹是否正确确认无误再把偏置改回来。这一步能抓出绝大多数几何错误。第四步试切第一层。只切深度1到2mm切完停机用卡尺量尺寸。外轮廓量总长总宽孔量直径和位置。差多少就调刀补——尺寸偏大调D值增大偏小调D值减小这是外轮廓内腔反过来。第五步逐层加深直到全深。每一层切完检查一次别一口气切到底。铝件还好钢件切深一刀切到底刀具让刀、让出的尺寸能超差0.1以上。5. 报警和异常把排查顺序固化成习惯车间里最耽误时间的不是编程是程序跑一半报警或者切出来的活不对站在机床前不知道从哪查起。我把自己遇到的常见问题按“先查什么、后查什么”排了个顺序基本能覆盖八成场景。5.1 程序格式类报警先看最近改的那一行“格式错误”“非法字符”“地址重复”这类报警九成出在刚改过的地方。排查路径是光标停在报警段 → 往前看两到三行 → 检查有没有漏写小数点、有没有把O写成0、有没有字母大小写混用、括号是不是成对。有一个非常隐蔽的坑部分系统不认小写字母从网页或者文档里复制过来的程序字母是小写的系统直接报格式错误。看起来代码一模一样就是跑不了。还有小数点X50和X50.在部分系统上含义不同前者可能被理解为50微米。稳妥起见所有坐标都写小数点。5.2 圆弧与补偿报警九成是几何关系不成立“圆弧半径超差”已经说过了本质是R值和弦长矛盾。还有一个“刀具补偿非法”原因通常是三种补偿号对应的半径值为0或超过系统上限、建立补偿的移动距离小于刀具半径、以及在同一程序段里同时写了G41和G02/G03。最后这种写法很多系统不支持补偿必须单独占一行下一行再走圆弧。补偿方向的错误不报警但会切废。判断方法很简单空运行一段观察刀具相对轮廓是偏在里侧还是外侧偏反了立刻停机改。或者用图形仿真把补偿量放大到实际值的3倍轨迹偏移方向一眼就能看出来。5.3 尺寸不对但没报警按这个顺序查这类问题最耗人因为机床不吭声活已经废了。我按下面的顺序捋一般十分钟内能定位排查顺序检查项典型表现1刀具实际直径与补偿值是否一致整圈轮廓系统性偏大或偏小2反向间隙是否过大换向后第一段尺寸偏同向连续走尺寸正常3工件是否装夹变形松开钳口后尺寸回弹测量值与加工时不一致4刀具是否磨损连续加工多件后尺寸逐渐变化5机床热变形开机头两件合格跑两小时后偏移6编程原点与对刀点是否一致整体偏移一个固定值形状正确反向间隙这一项特别值得说。表现是走一个方形轮廓四个角里的某两个角尺寸对另外两个差0.03到0.08。这是因为丝杠反向时有空程系统虽然可以设置间隙补偿但补偿值本身需要定期用千分表实测。铣圆时如果间隙大圆会变成一个略微扁的形状肉眼看不出来一测就现形。刀具磨损导致的尺寸漂移最好的办法是做首件、中件、末件三件检测画出趋势。如果尺寸是一条单调下降的线那就是刀具在磨及时换刀或者改补偿。6. 攒了这些年的几条编程习惯比代码本身更值钱代码可以查习惯查不到。下面这几条是我吃过亏之后一点点改过来的分享出来给同行参考。程序头固定写一套“复位串”G21 G17 G40 G49 G80 G90。这七个指令一共不到三十个字符能挡掉大量因为状态残留导致的诡异问题。写程序的时候不觉得出了事回头看十次里有三次是上一个程序没清干净。每一段加工前留一条注释用括号包起来写清楚这一段在干什么、用的什么刀、切多深。三个月后回头改程序没有注释的代码跟天书没区别。Z轴永远先抬到安全高度再移动XY。这条规则的代价是我早年撞过一次刀——程序里先走XY再抬Z中途经过一个凸台刀柄直接撞上去。现在我的程序里凡是跨区域移动都是先G00 Z50.再动XY哪怕多花两秒钟。补偿值不要在程序里写死走刀补表。有人图省事直接把刀具半径写进坐标里程序里全是算好的刀心轨迹。这样做的后果是换一把刀、磨一次刀整个程序就得重算。走G41/G42配合D值改一个数就完事。首件必量批量必抽。再熟练的编程员也会算错区别只在于错误是在第一件被发现还是在第五十件。给宏程序留注释和变量说明。宏程序最难受的地方是过两个月自己也看不懂了#1到#10分别是什么全凭记忆。我现在习惯在程序头写一段变量清单几行字的事省掉大量抓头发的时间。不同系统的程序分文件夹存。同一件活在不同机床上跑程序不能混着放。文件名里带上机床代号和日期比如“某机床-铝板轮廓-改2”比“最终版”“最终版2”“真的最终版”靠谱得多。还有一个体会别迷信“大全”。任何一份代码清单覆盖的都是语法真正决定成败的是工艺判断——这道工序该不该这么排、这个刀该不该这么走、这个公差该不该这么给。语法错了机床会报警工艺错了机床一声不吭等发现的时候活已经废了。所以看到一份代码表正确的用法是拿它当索引遇到不确定的指令回来查一下参数含义而不是整段整段往自己程序里贴。贴进去能跑跑出来的东西对不对那是另一回事。