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', errors='ignore') 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 KiCad:X2支持最好但有例外
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时,默认设置并不完美,必须手动调整。希望这些经验对你有用。