上周接到一个老客户的邮件,别的没多说,就一句话:这板子的加工文件别发Gerber了,直接让AD导出ODB++,记得发.tgz格式。当时项目已经画完板,DRC也清干净了,突然说要换一种我平时几乎不用的输出格式,说实在的有点措手不及。后来查了一圈资料、折腾了几块板子,才算把AD里导出ODB++Files这件事彻底摸透。现在回过头看,ODB++其实是比Gerber更“聪明”的一种交付格式,尤其适合大批量、高密度、自动化程度高的产线,工厂拿着.tgz直接往DFM系统里扔,省掉大量人工整理时间。这篇就把我自己的实际操作流程、选项解释、踩过的坑和验证方法全部写出来,给还没用过AD导ODB++的工程师一个完整的参考。
看完这篇,基本可以搞清楚三件事:ODB++到底是什么,AD里怎么一步步导出.tgz文件,以及导完以后怎么检查文件质量。不管你是刚入门PCB设计、正在对接新板厂,还是被客户要求“不要发Gerber”但不知道怎么操作,应该都能用得上。
1. 先搞清楚ODB++是什么:它不是一张图纸,而是一个数据包
很多工程师第一次听到ODB++的时候,第一反应是“是不是一种新型光绘文件”。这种理解不能说错,但有点低估它了。ODB++全称是Open Database for PCB Manufacturing,最早是由Valor推出来的,后来慢慢成为PCB制造和组装领域的一种标准数据交换格式。它的本质不是单张图形文件,而是一个完整描述板卡制造信息的数据集合:层叠结构、铜箔图形、钻孔、网络连接、元器件位置、材料信息、外形尺寸,全部打包在一起。
1.1 它和Gerber最核心的区别在哪
我们平时发Gerber,本质上是发一组“图形照片”。每层铜箔是一张图,阻焊是一张图,字符是一张图,钻孔又是一张图。板厂的CAM工程师拿到这一堆文件后,需要人工把它们整理成一套能用的生产资料:先确认层顺序,再把钻孔文件对应到每一层,接着做网表比对,最后检查有没有漏层、缺孔、图形变形。整套流程非常依赖操作员经验,而且文件一多,出错的概率其实是几何级上升的。
ODB++不太一样。它不是“照片”,更像是把整个PCB的“工程数据库结构”整个封装起来。里面不只有每一层的图形,还包含了这些图形之间的电气关系。板厂的DFM系统拿到ODB++之后,可以自动读取网络连接,自动做开短路分析,自动比对BOM和元件位置,飞针测试、AOI检测的数据也能直接从里面抽。所以ODB++不是一个格式的文件,而是一个结构化的数据包,工厂端解析效率高很多。
1.2 和Gerber放在一起比,优势一目了然
我整理了一个表格,方便大家直观理解:
| 对比项 | ODB++ | Gerber |
|---|---|---|
| 数据类型 | 含网络连接、层叠、外形、钻孔、坐标等结构化信息 | 主要是图形与钻孔数据,无电气语义 |
| 文件形态 | 单个.tgz压缩包,所有数据统一在一个包里 | 多张光绘+钻孔文件,依赖人工整理 |
| 工厂侧读取 | 可自动导入DFM系统,自动化程度高 | 需要CAM工程师手动组合、核对 |
| 网络表信息 | 自带,可用于飞针测试、AOI分析 | 通常需要另发网表文件,或由工厂重新提取 |
| 适合场景 | 高密度板、批量化、自动化产线 | 小批量打样、传统工厂、修板急用 |
| 常见问题 | 版本兼容性需确认 | 漏层、顺序错、格式不统一 |
这个表不是说Gerber一无是处,Gerber仍然是非常通用、几乎所有工厂都接的格式。但如果你是给大型EMS工厂或者自动化程度比较高的板厂供货,对方要求ODB++其实是有道理的,因为他们生产线的CAM系统能直接“吃进去”,效率高,错误率也低。
1.3 为什么说.tgz是“标准动作”
ODB++本身是一个目录结构规范,里面包含大量的文件夹和文件,如果直接交付,往往会有成百上千个小文件,传输和管理都不方便。所以行业里约定俗成,用tar加gzip的方式把整个目录打包成一个压缩包,这就是.tgz文件。AD里导出时,默认选项就是生成这一个压缩文件包,客户收到后解压,或者直接丢给CAM系统,系统内部自己解包,不用人工干预。
我一开始看到.tgz还有点懵,想着要不要转换成ZIP。后来发现完全没必要,主流CAM软件和板厂的DFM系统全都支持直接读取.tgz包,强行转成ZIP反而降低兼容性。相信我,只要对方说“把ODB++发过来”,你就直接给.tgz,不会错。
2. 动手导出前,先把这几处设置梳理一遍
AD里导出ODB++本身很快,菜单点几下就出文件了。但如果你的PCB工程本身很乱——叠层命名不规范、板框层乱画、钻孔对设置含糊、装配变量选错——那么导出来的ODB++包就是“垃圾进、垃圾出”,工厂读出来的板子结构可能和你设计的完全不一样。这章说几个我在实际项目里反复踩过、后来养成习惯去检查的点。
2.1 叠层设置:板厂第一眼看到的就是这里
ODB++里的matrix(矩阵文件)会详细描述整个叠层结构,包括每一层的名称、类型、介质材料、厚度、铜箔厚度,以及层与层之间的顺序关系。板厂拿到ODB++后,第一件事就是读matrix,确认这个板子有多少层、每层是什么类型。如果你的Layer Stack Manager里层名称和类型乱写,矩阵信息就会跟着乱,工厂做阻抗计算和压合设计的时候就会出问题。
所以我现在的习惯是:导出前打开Layer Stack Manager,逐层看过去,确保每一层的“Type”是准确的。信号层标Signal,平面层标Plane,介质层标Dielectric,千万别把电源平面层设成Signal又铺了一大片铜,这样matrix里这层就会被当成普通走线层处理,板厂在压合顺序和负片理解上都会出偏差。
2.2 板框和外形:一张图纸说清的事,别拆到三张
板框信息在ODB++里属于外形(Profile)数据,这个数据最终决定板厂怎么铣外形、怎么开V槽。很多工程师习惯把板框画在机械层1,又把工艺边画在机械层2,还在Keepout层画了一圈“示意”线框。这是我在很多工程里见过的通病。AD导出ODB++时,对于板框的识别通常依赖于板框层(Board Outline)定义,如果你把机械层1、2、Keepout都画了近似一样的线,工厂的CAM系统在读取profile时就会困惑:到底以哪一层为基准?
更稳妥的做法是:全板只有一层画真正的板框外形,其他辅助线的线宽设成0或者放在不参与导出的机械层,并把这些机械层在“Properties”里设置为非ODB++输出层。如果你的PCB是不规则的异形板,还要注意板框上的圆弧和倒角是否清晰,不要用大量极短的线段去拟合一个圆弧,否则工厂的铣刀路径会出现奇怪的抖动。AD里画板框推荐直接使用圆弧指令,而不是拉很多小线段。
2.3 钻孔对与装配变量:最容易忽略的两个角落
钻孔信息是ODB++里非常重要的一部分,但很多人忽略了一个前提:盲埋孔板子的钻孔对(Drill Pair)定义必须和叠层一致。AD里钻孔对是在Layer Stack Manager或钻孔设置中定义的,导出ODB++时,钻孔数据会按照钻孔对关系写入。如果叠层是8层板,盲孔设计在L1-L3,但你的钻孔对设置里把这组盲孔定义成了L1-L2,那么孔的信息就会错位,工厂钻孔程序直接报废。
装配变量(Assembly Variant)也是一个容易被忽略的细节。ODB++包里不只是铜箔和钻孔,还包含元器件信息,比如RefDes、封装、坐标、位号、极性方向。如果你的设计里有选配方案,或者说不同型号板子贴不同位置的元件,导出前一定要确认当前正在使用的装配变量是最终要生产的那个版本。我见过有人导出一整套ODB++发到工厂,结果里面的元器件位置全是默认变量,几十个不该贴的元件全在包里面,后面SMT编程阶段才被发现,凭空多耽误两天。
还有一点,板子的原点坐标也建议顺手看一下。有些工程师习惯把原点放在板子以外的位置,或者放在板子中心,这本身不违反规则,但如果你能在导出前把原点设置在板框左下角,并写清楚单位,SMT编程和铣边对位都会省事很多。
3. 从菜单到tgz:AD里导出ODB++的完整操作
设置梳理清楚以后,实际操作其实很快。AD里导出ODB++有两条路径,新手推荐直接用对话框方式,一次搞定;生产线上的老手建议用OutJob,方便归档和重复生成。我下面把两种方式都写出来,并逐个解释导出对话框里的关键选项。
3.1 两种入口,推荐用OutJob
第一种方式,直接打开PCB文件,点击File菜单,往下找到Fabrication Outputs,再找到ODB++ Files。这种操作最快,适合临时要文件、马上发给板厂的情形。AD会弹出ODB++导出设置对话框,你设置好目录和选项,点击生成,稍等片刻就会在输出目录里出现.tgz包。
第二种方式,是新建一个Output Job文件:File > New > Output Job。然后在Output Job编辑器里,右键左侧的Outputs列表,选择Fabrication Outputs > ODB++ Files,把任务加进去。这种方式比较适合我已经讲过的批量归档场景,因为你可以把Gerber、坐标文件、装配图、ODB++全部挂到同一个Job里面,以后工程有改动,重新跑一遍这个Job就全部更新了,不用每个文件再去菜单找一遍。
3.2 导出对话框里的选项,每一项都勾了什么
AD导出ODB++的对话框在不同版本里略有差异,但核心选项基本跑不出下面这些。我挨个说。
- 输出目录(Output Directory):就是最终.tgz生成的位置。建议在工程目录下新建一个专门的文件夹,不要和工程文件混在一起。
- Job名称:默认会取PCB文件的名称,一般不用改。客户如果有命名规范,可以在这里统一。
- 生成ODB++归档(Generate ODB++ archive):这就是是否生成.tgz的关键选项。勾上才会生成一个压缩包,不勾的话只生成一个松散目录。工厂要.tgz,所以这个一定要勾。
- 不包含铜箔层数据(Not including Copper):这个选项比较坑,乍一看不知道什么意思。它的用途是生成一个“不含铜箔数据”的包,早期报价或结构确认时可以用,但正常生产交付绝对不能勾,否则工厂拿到的板子没有铜箔层,做不了任何电气检查。
- 检查缺失PCB数据(Check for missing PCB Data):勾上之后,导出过程中会检查网络表、元件、焊盘等数据是否存在并完整。如果设计里有缺失,会弹警告。这个强烈建议勾上,宁可在这里被警告拦一下,也不要发到工厂被拦。
- 信号层使用网络名(Use Net Names for signal layer features):勾选后,ODB++里信号层的铜箔对象会携带网络名信息,DFM系统做短路检查、飞针测试读网络时会非常方便。建议勾上。
- 生成钻孔文件(Generate Drill File):把钻孔数据生成到ODB++包里。不勾的话包里面就没有钻孔信息,生产没法打孔。生产交付一定要勾。
- 生成坐标文件(Generate Pick and Place Files):这个选项会额外生成SMT贴片用的坐标文件,内容包含位号、X/Y坐标、旋转角度、所在层。如果你的客户只要求ODB++,但SMT工厂还想要一份独立坐标,这个选项可以一并生成,省得再去导出坐标文件。
- 生成测试点文件(Generate Test Point Files):生成ICT/FCT测试点数据。如果板子有测试点设计,就勾上;如果板子上没有测试设计,不勾也没关系。
- 包含CAD数据(Include CAD Data):是否在包里附加一份AD原始的CAD数据。从保密角度不用勾,除非客户明确要求或者是内部协作,否则不建议外发。
我把这些选项的作用整理成一个表,方便对照查阅:
| 选项名称(常见) | 勾选作用 | 生产交付建议 |
|---|---|---|
| Generate ODB++ archive | 生成.tgz压缩包 | 必须勾 |
| Not including Copper | 导出不含铜箔的数据 | 不要勾 |
| Check for missing PCB Data | 检查数据缺失并提示 | 建议勾 |
| Use Net Names for signal layer features | 信号层图形附加网络名 | 建议勾 |
| Generate Drill File | 包含钻孔数据 | 必须勾 |
| Generate Pick and Place Files | 包含SMT坐标文件 | 建议勾 |
| Generate Test Point Files | 包含测试点文件 | 按需勾 |
| Include CAD Data | 包含原始CAD数据 | 外发建议不勾 |
3.3 生成后的文件长什么样
点击确定之后,AD会在后台执行导出操作。板子越大、层数越多,耗时越长。普通的四层板一般几秒钟就好,十几层的高密度板可能要等上一两分钟。生成完成后,到输出目录里去看,正常情况下会有一个后缀为.tgz的文件,文件名一般是“PCB文件名.tgz”。
用压缩软件解压后,你能看到一个标准ODB++目录树,其中最核心的是matrix目录下的matrix.db文件,这个文件描述了整个板卡的层叠、材料、物理结构信息。另外还有steps目录,里面按层次存放了各层图形和钻孔数据;apertures目录存放孔径和图形定义;fonts目录存放字体资源。总之,整个板子的制造信息都在里面,结构规范,层次分明。我解压后一般是先去matrix.db里确认层叠顺序和总层数,再随机打开一两层图形看看铜箔和钻孔是否跟AD里一致。
4. 导出之后不检查,等于白导:分享我踩过的几个坑
如果你以为导出.tgz文件以后就万事大吉,直接把文件发给板厂,那我建议你冷静一下。我在刚开始用ODB++的时候,就因为这个“以为没问题”的心态踩过几次坑,有的甚至在样板已经进工厂开工之后才发现,虽然最后能补救,但时间成本已经搭进去了。这一章我把实际遇到过的三个典型问题拆开讲,顺便附上我现在用的验证方法。
4.1 坑一:负片平面层在ODB++里显示成整片铜
有一次我导出一块六层板,叠层里有两个电源平面,为了提升大电流过流能力,我习惯性地把电源层设成了负片(Negative),只在需要挖开的地方画了禁止铺铜区域。Gerber阶段没有出过问题,因为负片在光绘里就是反向输出,工厂CAM系统能够正确识别。但换到ODB++后,板厂反馈说这两个电源层变成了一整块完整的铜箔,所有我画的避让区域全部消失。
后来我查了很多资料,问题出在AD对负片层的ODB++转换机制上。AD导出ODB++时,对于负片层的处理逻辑并不像我预想的那样“自动反向”,部分版本需要你保证负片层上有明确的铺铜边界和挖空区域描述,如果只是依赖负片的“反向思维”去画图,转换出来的结果就会变成整片实心铜。从那以后,我的习惯是:只要板子要发ODB++,电源平面层就尽量改用正片(Positive)方式设计,用实心铜箔铺出平面,再在需要隔离的区域画禁布区或者直接开铜箔窗口。虽然绘制的时候麻烦一点,但导出的数据在DFM系统里绝对清楚,不会出现“一层铜凭空消失”这种诡异事故。
4.2 坑二:matrix.db里的层顺序和你想的不一样
还有一次,ODB++包导出来以后,我自己用第三方CAM工具打开检查,发现matrix.db里对层顺序的描述和AD里Layer Stack Manager看到的不一致。AD显示L1到L8的顺序是从上到下,但ODB++的matrix里把GND层和PWR层的位置做了交换。我当时第一反应是AD导出有Bug,后来仔细看了叠层设置才发现,是因为我中间改过几次叠层顺序,AD虽然自动更新了走线和过孔,但部分对象还挂在新层名和旧层名的混合状态,导出时matrix实际描述的是对象所在的物理顺序,而不是我从命名上看出来的逻辑顺序。
这个问题很隐蔽,因为PCB文件在AD里打开是正常的,肉眼完全看不出问题。从此我养成了一个习惯:不管多急,ODB++导出后一定要用第三方CAM工具打开matrix和层数据,核对“最上层是不是L1,最底层是不是L8,中间层顺序是否和设计一致”。不要嫌多花十分钟,这一眼能在后面省下几天的返工时间。
4.3 坑三:漏了钻孔或坐标,整个包白导
第三个坑是我刚开始不熟悉导出选项的时候踩的。那次赶着发文件,我在导出对话框里直接点了OK,没注意“Generate Drill File”和“Generate Pick and Place Files”这两个选项没勾上。生成的包看起来也很正常,大小也差不多,但工厂那边一打开就报错:“没有钻孔数据,没有坐标文件。”我重新打开PCB再导一次才解决。你说这事难吗,其实不难,就是导出前少勾了两个框。可就是因为少这两个框,整个包就是废的,工厂那边流程已经排队到你了,再重新发版本又要往后排。
现在我不管客户只要ODB++还是同时要Gerber,导出之前都会先看一眼对话框底部的勾选汇总,确认三件套:钻孔、坐标、测试点(如果有)都勾上了,再点确定。同时,导出完以后我会直接解压.tgz,在目录里搜一下有没有钻孔文件、坐标文件这些关键字,没有就回头重新导。
4.4 我现在的验证步骤,三步走
说到验证,我目前形成了一套固定的三步检查法,适用于所有要外发的ODB++包:
第一步,解压.tgz,看目录结构。用7-Zip或者WinRAR把压缩包解开,先扫一眼顶层目录是否有matrix、steps、apertures这些标准文件夹,别解压出个乱七八糟的东西。
第二步,打开matrix.db,核对关键字段。重点看总层数、层顺序、介质厚度、铜箔厚度。不要只看层数对不对,还要看每层的类型描述和AD设计的是否一致。有条件的可以用专业的CAM工具直接打开ODB++工程,图形化确认每层内容。
第三步,发板厂之前,先发一个“测试包”给对方。这个是我个人强烈推荐的做法,尤其第一次和新板厂合作的时候,先不发最终的正式文件,而是找一个旧工程或者相同叠层结构的测试板导出一包ODB++发过去,让他们的CAM工程师先读一读,确认能正常导入、层叠和钻孔信息完整,再发正式包。这点沟通时间,比正式交付时被卡住强得多。
5. 从ODB++再往外走一步:装配图、坐标和Gerber的配合使用
ODB++本身已经包含了元器件位置和网络信息,但在真实的交付对接中,很多SMT工厂和测试工厂仍然会向你单独要坐标文件、装配图,甚至要求Gerber也一起留档。一开始我觉得重复,直到有一次合作的SMT供应商告诉我,他们的贴片机编程系统里拿ODB++里的数据还要转一道,不如直接给一份Pick and Place文件方便,我才理解:ODB++再强大,你的客户和供应商也有自己习惯的工作流程,配合交付比纠结“谁更先进”重要得多。
5.1 坐标文件和装配图,怎么顺手一起导出来
AD里生成坐标文件非常简单,File > Fabrication Outputs > Pick and Place Files,弹出对话框后选好格式、单位、小数点位数,点击确定就生成一个.txt或者.csv文件。如果你已经挂好OutJob,也可以把Pick and Place任务一起挂进去,每次批量生成。
生成坐标文件时注意两点:一是单位一定要和ODB++包里的单位保持一致,AD里PCB的单位如果是mm,坐标文件就选Metric;二是原点设置要和板框原点一致,否则SMT编程师傅拿到手第一件事就是全板坐标偏移。装配图也一样,File > Fabrication Outputs > Assembly Drawings,选择要生成哪几层的装配图,AD会输出PDF格式的装配图。这些图和ODB++包一起打包交付,SMT那边的工程师就能看得明明白白。
5.2 Gerber还导不导,我的建议是导
有些工程师觉得“客户都要ODB++了,Gerber就没必要了吧”。其实从制造兼容性角度讲,Gerber仍然是我自己留档和沟通时习惯性保留的一套文件。原因很简单:ODB++虽然信息丰富,但有些老的CAM系统或个别工厂的设备软件就是只认Gerber。不是你不好,而是对方系统不支持,这时候你手上如果只有ODB++,就会非常被动。
所以我现在的习惯是同一个工程项目里,给一个版本的ODB++,配一整套Gerber和钻孔文件,再加上坐标文件和装配图,一起归档在一个Output Job里。客户要什么就给什么,工厂打样先用ODB++,出了问题就拿Gerber对比定位,双保险。如果项目保密要求高,Gerber这种纯图形文件也可以作为外部沟通版本,ODB++只在内部和确认过的工厂之间流通。
5.3 版本兼容性,以及和新板厂第一次合作的建议
ODB++本身也分版本,AD导出的ODB++在兼容性上已经做得很成熟,绝大多数主流CAM工具都能直接读取。但如果你合作的板厂使用非常老的DFM系统,他们的系统版本不一定支持最新规范里的某些字段,最稳妥的方法是先给对方一个小包试一试,确认能读再发正式文件,千万不要在打样节点上赌兼容性。
关于第一次合作,我个人的经验是:正式交付前,主动给对方发一个包含“ODB++ + 坐标文件 + 装配图 + Gerber”的样例包,并附一封简单的邮件,说明层数、材料、板厚、表面处理这些基本信息。工厂的CAM工程师拿到这份资料,如果有什么读不懂、对不上的地方,在开板之前就会提出来,这个过程比什么都重要。ODB++确实能减少很多沟通成本,但它不能替代你和板厂之间的技术沟通。
说了这么多,最后还是分享一个我的实操习惯:现在不管客户最终要的是Gerber还是ODB++,每次导出完ODB++的.tgz包,我都会顺手用压缩软件解压一次,花两分钟看一下matrix.db里的层叠信息,再确认一下钻孔文件和坐标文件都在里面,没问题了再发出去。这个习惯帮我挡掉了好几次低级错误,也让我意识到,文件导出这项“基本功”虽然不起眼,但恰恰是决定项目能不能顺利投产的关键一环。希望这篇经验能让你少走几步弯路。