拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Gerber图层校验:不靠文件名,如何准确识别PCB层功能

Gerber图层校验:不靠文件名,如何准确识别PCB层功能

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为例,操作步骤:

  1. 打开KiCad,选择“GerbView”
  2. File → Open Gerber file(s),全选所有Gerber文件
  3. 在左侧图层列表里,右键点击某个层 → Properties
  4. 查看“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打开文件,然后:

  1. 按I键查看统计信息,看图形元素数量
  2. 放大看焊盘形状,铜层焊盘通常有规则的光圈定义
  3. 看是否有文字,丝印层会有字符图形

更精确的方法是解析光圈定义。铜层的光圈通常包含较大的D码(如D10以上),阻焊层的光圈通常比铜层大0.1mm左右(开窗补偿),丝印层的光圈通常很小(0.15mm线宽)。

3.4 层对齐校验:原点与缩放

即使每个文件的层功能都对了,还有一个隐藏问题:各层的原点是否一致。我遇到过好几次,顶层铜和底层铜的原点差了5mm,导致钻孔对不上。

校验方法:在Gerbv或KiCad GerbView里,同时加载所有层,然后:

  1. 找一个所有层都有的特征点(比如板角的一个安装孔)
  2. 测量它在各层的坐标
  3. 如果坐标不一致,说明原点没对齐

在Altium中导出时,确保所有层使用同一个原点。具体设置:Output Job → Gerber → Advanced → 勾选“Use Origin from PCB”,而不是“Relative to Drill”。

4. 主流EDA工具导出Gerber时的层属性陷阱

4.1 Altium Designer:默认不写X2属性

Altium是国内用得最多的PCB工具,但它的Gerber导出默认不写X2属性。你需要手动开启:

  1. File → Fabrication Outputs → Gerber Files
  2. 在“Layers”标签页,勾选所有需要的层
  3. 在“Advanced”标签页,找到“Gerber Options”
  4. 勾选“Embedded Apertures (RS-274X)”
  5. 勾选“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 工厂说“层对不上”,怎么快速定位?

这是最常见的问题。我的排查顺序是:

  1. 先看文件名和层数的对应关系:如果工厂说有8层,但你只发了6个铜层文件,那明显少了
  2. 用Gerbv叠加所有层:看是否有层偏移
  3. 检查钻孔文件:钻孔文件通常是Excellon格式,不是Gerber,但它的原点必须和Gerber一致
  4. 看阻焊层是否反相:有些工厂的CAM软件会自动反相,有些不会

我遇到过一次,顶层阻焊的文件名是TopSolder.gbr,但内容其实是正片(应该用负片)。工厂的CAM工程师没注意,直接按负片处理,结果整板阻焊全开了。后来我养成了习惯:导出后一定用Gerbv看一眼阻焊层的显示效果——负片阻焊在查看器里应该显示为“焊盘位置是空的”。

5.2 X2属性写了但工厂读不出来

这种情况通常是因为工厂的CAM软件版本太老。解决办法:

  • 同时提供一份“层对应表”文本文件,列出每个文件名对应的层功能
  • 在文件名里也体现层信息(虽然不可靠,但作为辅助)
  • 如果工厂支持,提供IPC-2581格式,它比Gerber更结构化

5.3 批量校验脚本的实用技巧

前面给的Python脚本只能检查头部。如果要更彻底,可以解析整个文件,统计图形元素。但说实话,对于日常使用,头部检查+查看器目视就够了。

我自己的流程是:

  1. 导出Gerber后,先跑脚本检查属性
  2. 用KiCad GerbView打开所有层,目视检查
  3. 重点看阻焊层和丝印层,这两个最容易出错
  4. 确认无误后,打包发给工厂

这个流程花不了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时,默认设置并不完美,必须手动调整。希望这些经验对你有用。

返回列表