1. 为什么文件名靠不住Gerber图层校验的底层逻辑做过PCB的人大概都有过这种经历板子发出去打样工厂回传的确认邮件里写着“顶层阻焊对不上”你打开工程一看文件明明叫TopSolder.GTO怎么会错问题就出在这里——Gerber文件的扩展名和文件名从来都不是可靠的身份证明。Gerber格式从RS-274X一路演进到X2、X3文件内部其实携带了大量元数据文件属性.FileFunction、层类型、极性、单位、坐标格式、光圈定义等等。但现实是很多EDA工具在导出时并不会把这些属性写全或者写进去了但工厂的CAM软件读不出来。更麻烦的是工程师手动改文件名的情况太普遍了——把Gerber1.gbr改成TopLayer.gbr只花三秒钟但文件内容里的层定义可能还是错的。这就是“Check Gerber layers beyond their filenames”这个命题的核心不要相信文件名要读文件内容本身。具体来说需要校验的东西包括文件内部声明的层功能是顶层铜、底层阻焊还是钻孔图极性正片还是负片单位与坐标格式英寸还是毫米前导零还是后导零光圈列表是否完整、是否与图形数据匹配各层之间的对齐关系原点是否一致我见过太多案例有人用Altium导出Gerber时忘了勾选“Embedded Apertures”结果工厂打开文件发现光圈全是空的也有人从AD25导出时选了RS-274X但没注意层顺序把底层铜箔命名成了顶层。这些问题光看文件名根本发现不了。这篇文章适合谁看如果你是PCB设计工程师、CAM工程师或者经常需要把Gerber发给板厂、组装厂的人那这些内容就是为你准备的。我会从Gerber文件结构讲起然后给出具体的校验方法和实操步骤最后分享一些踩过的坑和排查技巧。不需要你懂编程但需要你对PCB制造流程有基本概念。2. Gerber文件内部到底藏了什么结构拆解与关键字段2.1 RS-274X的文件骨架一个标准的RS-274X Gerber文件结构上大致分为几个区域头部参数区以%开头的扩展码定义单位、坐标格式、光圈等光圈定义区%ADD开头的语句定义每个D码对应的形状和尺寸图形数据区D01画线、D02移动、D03闪绘等操作码属性区X2格式引入的.FileFunction、.AperFunction等属性关键就在于属性区。X2格式2014年发布开始Gerber文件可以携带结构化的层信息。比如%TF.FileFunction,Copper,L1,Top*% %TF.FilePolarity,Positive*%这两行告诉任何能读懂X2的软件这个文件是顶层铜层正片。但问题在于很多老旧的CAM系统只认RS-274X的基础语法遇到%TF开头的行直接忽略。更糟的是有些EDA工具导出时根本不写这些属性。2.2 文件名与文件内容的脱节为什么文件名不可信我总结了几种常见情况情况文件名示例实际内容后果手动改名TopLayer.gbr底层铜箔数据层序颠倒导出模板错误Silk_Top.gto顶层阻焊数据阻焊开窗错误多版本覆盖Gerber_Rev2.gbr实际是Rev1数据版本混乱工具默认命名output_1.gbr未声明层功能工厂靠猜这些情况在Altium、KiCad、Cadence等工具之间来回转换时尤其常见。比如从AD导出Gerber时默认的命名规则是LayerName.gbr但如果你在Layer Stack Manager里改过层名导出的文件名就会跟着变而文件内部的属性可能还是旧的。2.3 X2/X3属性理想与现实的差距X2格式的.FileFunction属性理论上能解决所有问题。它的语法是%TF.FileFunction,function,position,type*%其中function可以是Copper、Soldermask、Legend、Paste、Profile等。position可以是Top、Bot、Inr。type用于铜层可以是Signal、Plane、Mixed。但现实很骨感。我实测过主流EDA工具的X2支持情况KiCad 7完整支持X2属性导出时自动写入Altium Designer 23支持但默认不开启需要在导出设置里手动勾选Cadence Allegro部分支持需要额外配置Eagle已停止更新基本不支持所以当你收到一个Gerber包时第一步应该是检查它到底有没有X2属性。如果没有就只能靠解析图形数据来推断层功能。3. 实操不依赖文件名的Gerber层校验方法3.1 用免费工具快速查看内部属性最直接的方法是使用支持X2的查看器。我常用的几个Gerbv开源能显示X2属性但界面比较简陋KiCad GerbView免费对X2支持好能直接看到层功能Tracespace View在线工具上传后能解析属性CAM350商业软件功能全但贵以KiCad GerbView为例操作步骤打开KiCad选择“GerbView”File → Open Gerber file(s)全选所有Gerber文件在左侧图层列表里右键点击某个层 → Properties查看“File Function”字段如果这个字段是空的或者显示“Unknown”那就说明文件没有X2属性需要进一步分析。3.2 直接读文件头命令行方法如果你不想装软件用命令行也能快速检查。Gerber文件是纯文本直接看头部就行head -50 TopLayer.gbr重点看这几类行%TF.FileFunction,...%层功能声明%TF.FilePolarity,...%极性%MOIN*%或%MOMM*%单位英寸或毫米%FSLAX...%坐标格式如果这些都没有那这个文件就是“裸”的RS-274X只能靠图形内容判断。我写过一个简单的Python脚本批量扫描文件夹里所有Gerber文件的头部属性import os import re def check_gerber_attributes(folder): results [] for fname in os.listdir(folder): if not fname.lower().endswith((.gbr, .ger, .gtl, .gbl, .gto, .gbo)): continue path os.path.join(folder, fname) with open(path, r, errorsignore) as f: head f.read(2000) func re.search(r%TF\.FileFunction,([^*])\*%, head) pol re.search(r%TF\.FilePolarity,([^*])\*%, head) unit IN if %MOIN*% in head else (MM if %MOMM*% in head else UNKNOWN) results.append({ file: fname, function: func.group(1) if func else NOT DECLARED, polarity: pol.group(1) if pol else NOT DECLARED, unit: unit }) return results for r in check_gerber_attributes(.): print(r)这个脚本能快速告诉你哪些文件有属性、哪些没有。对于没有属性的文件就需要进入下一步图形内容分析。3.3 图形内容分析从数据反推层功能没有X2属性时怎么判断一个Gerber文件是什么层我的经验是看三个东西图形密度、焊盘特征、文字内容。铜层图形密度高有大量填充区域和走线焊盘通常是圆形或矩形阻焊层图形是负片逻辑焊盘位置是开窗空其余是填充丝印层主要是线条和文字图形稀疏钻孔图只有圆形闪绘没有走线具体操作上可以用Gerbv打开文件然后按I键查看统计信息看图形元素数量放大看焊盘形状铜层焊盘通常有规则的光圈定义看是否有文字丝印层会有字符图形更精确的方法是解析光圈定义。铜层的光圈通常包含较大的D码如D10以上阻焊层的光圈通常比铜层大0.1mm左右开窗补偿丝印层的光圈通常很小0.15mm线宽。3.4 层对齐校验原点与缩放即使每个文件的层功能都对了还有一个隐藏问题各层的原点是否一致。我遇到过好几次顶层铜和底层铜的原点差了5mm导致钻孔对不上。校验方法在Gerbv或KiCad GerbView里同时加载所有层然后找一个所有层都有的特征点比如板角的一个安装孔测量它在各层的坐标如果坐标不一致说明原点没对齐在Altium中导出时确保所有层使用同一个原点。具体设置Output Job → Gerber → Advanced → 勾选“Use Origin from PCB”而不是“Relative to Drill”。4. 主流EDA工具导出Gerber时的层属性陷阱4.1 Altium Designer默认不写X2属性Altium是国内用得最多的PCB工具但它的Gerber导出默认不写X2属性。你需要手动开启File → Fabrication Outputs → Gerber Files在“Layers”标签页勾选所有需要的层在“Advanced”标签页找到“Gerber Options”勾选“Embedded Apertures (RS-274X)”勾选“Use X2 Format”AD21以后才有即使这样Altium的X2属性也只写.FileFunction不写.AperFunction。这意味着光圈级别的功能信息是缺失的。对于简单板子够用但对于高密度板工厂可能还是需要人工确认。另外AD25导出Gerber时有个坑如果你在Layer Stack Manager里改了层名导出的文件名会变但X2属性里的层功能可能还是旧的。我建议导出后立即用脚本检查一遍。4.2 KiCadX2支持最好但有例外KiCad从6.0开始默认写X2属性这点比Altium强。但有一个例外自定义层。如果你在KiCad里创建了自定义层比如“User.1”导出时它的.FileFunction会是Other,User.1工厂可能不认识。解决办法在导出前把自定义层映射到标准层功能。KiCad的Plot对话框里有“Gerber Options”可以手动指定每个文件的层功能。4.3 从AD导出Gerber的完整检查清单基于我的经验从Altium导出Gerber后应该按这个清单检查检查项方法合格标准层功能声明看文件头%TF.FileFunction每个文件都有明确声明极性看%TF.FilePolarity阻焊层应为Negative单位看%MOIN或%MOMM与工厂要求一致坐标格式看%FSLAX通常为%FSLAX46Y46*%光圈定义搜索%ADD数量与设计匹配原点对齐在查看器中叠加所有层特征点坐标一致这个清单看起来简单但能挡住80%的常见错误。5. 常见问题与排查技巧实录5.1 工厂说“层对不上”怎么快速定位这是最常见的问题。我的排查顺序是先看文件名和层数的对应关系如果工厂说有8层但你只发了6个铜层文件那明显少了用Gerbv叠加所有层看是否有层偏移检查钻孔文件钻孔文件通常是Excellon格式不是Gerber但它的原点必须和Gerber一致看阻焊层是否反相有些工厂的CAM软件会自动反相有些不会我遇到过一次顶层阻焊的文件名是TopSolder.gbr但内容其实是正片应该用负片。工厂的CAM工程师没注意直接按负片处理结果整板阻焊全开了。后来我养成了习惯导出后一定用Gerbv看一眼阻焊层的显示效果——负片阻焊在查看器里应该显示为“焊盘位置是空的”。5.2 X2属性写了但工厂读不出来这种情况通常是因为工厂的CAM软件版本太老。解决办法同时提供一份“层对应表”文本文件列出每个文件名对应的层功能在文件名里也体现层信息虽然不可靠但作为辅助如果工厂支持提供IPC-2581格式它比Gerber更结构化5.3 批量校验脚本的实用技巧前面给的Python脚本只能检查头部。如果要更彻底可以解析整个文件统计图形元素。但说实话对于日常使用头部检查查看器目视就够了。我自己的流程是导出Gerber后先跑脚本检查属性用KiCad GerbView打开所有层目视检查重点看阻焊层和丝印层这两个最容易出错确认无误后打包发给工厂这个流程花不了5分钟但能避免几天的返工。5.4 一个真实的踩坑案例去年有个项目板子比较简单4层板。我从AD导出Gerber时觉得文件名都对就没仔细检查。结果工厂回传确认时问“你们的底层丝印为什么是空的”我打开一看原来导出时底层丝印层被误命名成了BottomSilk.gbr但内容其实是空的——因为我在设计时把丝印都放在了顶层底层根本没放。但工厂看到文件名以为应该有内容就反复确认。这件事的教训是文件名不仅可能误导你也可能误导工厂。如果底层确实没有丝印要么不导出这个文件要么在文件名里明确写BottomSilk_EMPTY.gbr并在邮件里说明。6. 把校验流程固化下来从手动到自动6.1 建立自己的检查清单每个工程师都应该有一份Gerber导出检查清单。我的清单包括所有铜层是否都有对应的阻焊层钻孔文件是否与铜层对齐板框层是否闭合丝印是否避开了焊盘阻焊开窗是否比焊盘大0.05-0.1mm是否有未使用的层被误导出这份清单可以写在文本文件里每次导出后逐项打勾。6.2 用脚本自动化重复检查对于经常做板的人写一个自动化脚本是值得的。除了前面提到的属性检查还可以检查文件大小空文件通常小于1KB检查光圈数量太少可能意味着导出不完整检查坐标范围所有层的坐标范围应该大致相同我把这些检查集成到了一个Python脚本里每次导出后运行一次输出一个报告。这样即使赶时间也不会漏掉关键检查。6.3 与工厂的沟通模板最后分享一个我常用的邮件模板发给工厂时附上附件为Gerber文件共X层。层对应关系如下TopLayer.gbr → 顶层铜BottomLayer.gbr → 底层铜TopSolder.gbr → 顶层阻焊负片...所有文件已使用X2格式导出包含层功能属性。如有任何疑问请随时联系。这个模板看起来简单但能大幅减少沟通成本。工厂的CAM工程师看到这样的邮件基本不会再来回确认层功能。我个人在实际操作中的体会是Gerber校验这件事花5分钟检查能省5天返工。尤其是从AD25导出Gerber时默认设置并不完美必须手动调整。希望这些经验对你有用。