上个月有个朋友凌晨给我打电话,说生产的板子贴偏了,整批几百片全押在生产线上。我在电话里听完他的描述,第一反应不是问他钢网有没有开对,而是直接问了一句:你给贴片厂的坐标文件,用的是Body Center还是Symbol Origin?他愣了几秒钟,反问我:这两个有区别吗?
当然有区别,而且区别大了。坐标文件看着就是几行数字,它是PCB设计和SMT生产之间最直接的一座桥。你layout画得再漂亮,过孔再整齐,走线再讲究,只要坐标文件里那颗器件的坐标参考点选错了,贴片机就会照着错的坐标把器件放下去,等回流焊一过,全是偏位废板。更麻烦的是,这种问题往往不是一眼能看出来的,因为有些器件偏得多、有些偏得少,全看封装库建得规不规范。
这篇内容我想把Allegro导出坐标文件时Body Center和Symbol Origin这两个选项讲透,包括它们各自的底层逻辑、对贴片生产的影响、在Allegro里的具体操作步骤,以及我这些年踩过的坑和总结出来的排查方法。不管你是刚开始用Allegro的新手,还是已经画了好几年板子的老工程师,这篇都值得花十分钟看完,尤其是那些从来没关心过坐标文件是怎么被下游消费掉的人。
1. 坐标文件到了贴片厂之后发生了什么
先说清楚一个很多人没想明白的问题:你导出去的坐标文件,到了贴片厂手里之后,到底是怎么被用起来的?不搞清楚下游的逻辑,你永远只是在"导出文件",而不是在"交付生产数据"。
1.1 贴片机程序是怎么建立坐标的
贴片机的编程流程大概是这样:贴片厂拿到你给的坐标文件、BOM、Gerber和封装资料之后,首先把坐标文件导入到他们的编程软件里。这个软件会根据位号(RefDes)去匹配元件数据库,元件数据库里存着每一颗料的封装尺寸、吸嘴类型、贴装压力、吸取高度这些参数。匹配完成后,软件会生成一个贴装程序,里面定义了每一颗料的贴装顺序、取料位置、识别方式,以及最终放到PCB上的坐标和角度。
整个过程里,坐标文件中的X和Y是最关键的。贴片头移动到哪个位置、把料放在哪儿,全靠这两个数值。你可能会觉得,坐标文件直接来自PCB设计文件,肯定不会错吧?但问题恰恰出在"参考点"上。同样一颗芯片,它的几何中心坐标和它的封装原点坐标不一定相同,如果下游按照某个参考点解释你的坐标,而你导出的却是另一个参考点,整颗料的位置就跟着错了。
1.2 坐标文件里那几列数据的含义
我见过不少工程师,导出坐标文件之后从来不打开看一眼。实际上Allegro导出的Placement文件是纯文本格式,用记事本就能打开,里面每一行的结构大致是下面这个样子。
| 字段 | 含义 | 示例 |
|---|---|---|
| REFDES | 位号 | C1 |
| DEVICE | 器件类型 | CAP_0402 |
| VALUE | 容值/阻值 | 0.1uF |
| X | X坐标 | 12.3456 |
| Y | Y坐标 | -8.7654 |
| ROT | 旋转角度 | 90.0 |
| SIDE | 所在面 | TOP/BOTTOM |
其中REFDES、X、Y、ROT、SIDE这五列是贴片机编程的核心,DEVICE和VALUE是给工程师核对用的。很多贴片厂还要求必须包含Value列,因为他们的编程软件要靠位号加Value来校验BOM和坐标文件的一致性。
1.3 原点模式和整板原点是两个层面的问题
这里必须把两个概念分开:第一层是整块板的坐标原点,一般建议设在板框左下角,它决定了所有器件坐标的绝对数值;第二层是每一颗器件取哪个点作为它的参考点,也就是Body Center还是Symbol Origin。
这两个层面经常被人混在一起,排查问题时容易跑偏。整板原点设错了,所有器件的坐标会整体偏移一个固定量;但每颗器件的原点模式选错了,则是有的器件偏、有的不偏,偏的方向和大小也各不相同,因为每颗器件的封装库做好时,它的原点和本体中心的位置关系都不一样。判断问题属于哪一层,基本能从"整板偏移"还是"个别偏移"这个现象上看出来。
2. 拆解Body Center与Symbol Origin的底层机制
这两个概念的名字起得挺让人误会的。Body Center听上去应该是"器件的物理中心",Symbol Origin听上去像是"符号原点"。但真正去较真Allegro是怎么算出这两个值时,你会发现事情并没有名字看起来那么简单。
2.1 Symbol Origin:封装库原点在板上的映射
Symbol Origin其实就是封装库中定义的那个原点,在封装编辑器里就是(0,0)那个点,导出坐标时,这个点会被换算成在整块PCB上的绝对坐标。
问题在于,很多工程师建封装库的时候,压根没有认真规划过原点放在哪里。有人习惯放在引脚1,有人放在丝印左上角,有人随手放到了任意一个坐标位置。如果是一个统一的团队规范,Symbol Origin一般会被要求放在器件中心或者引脚1,这个规范本身没有绝对的对错,关键是下游得知道你的规范是什么。如果建库时完全没有考虑过后道贴片,那Symbol Origin模式和Body Center模式导出的坐标就会差得很离谱。
还有一个容易忽略的点:Symbol Origin和Allegro中放置元件时鼠标抓取的那个参考点是同一个点。你在PCB上移动一颗器件时,光标落点就是Symbol Origin在板上的投影,这在布局阶段能直观感受到。
2.2 Body Center:Place_Bound几何中心,不是想当然的视觉中心
这个坑我踩过。早期我一度以为Body Center是Allegro根据器件丝印或者焊盘自动算出来的物理中心,后来发现根本不是这么一回事。
Allegro里Body Center的计算依据是封装中的Place_Bound_Top或Place_Bound_Bottom层。Place_Bound本来是用来表示器件装到板上之后占用物理空间的区域,一般在建库时画成一块封闭的shape。Allegro会把这一层所有shape合并成一个区域,然后计算这个区域的几何中心,并把这个几何中心作为Body Center输出。
所以关键在于:只要Place_Bound画得不对称,Body Center就会跟着偏。比如一颗连接器的Place_Bound左侧比右侧多延伸了0.5mm,那么Body Center就会偏向左侧0.25mm。如果Place_Bound是多个小shape拼起来的,Allegro会先合并再算中心,所以中间被挖空或者split成多个区域不会产生多个中心点,最终出来的是一个合并区域后的几何中心。
2.3 两种模式在同一个封装上的数值差异实测
拿一个很常见的SOP16芯片举例。如果封装建得规范,Place_Bound左右对称,原点也定在正中心,那么无论选Body Center还是Symbol Origin,导出的坐标完全一样,都是(10.0000, 20.0000)。这也是为什么很多工程师用了一辈子Allegro都没发现这两个选项有什么区别——他们的库普遍建得比较规整。
但假设这颗SOP16的原点被定义在了引脚1,引脚1在左下角,而Place_Bound的中心在(10.5, 19.8),那么Symbol Origin导出的是(10.0, 20.0),Body Center导出的是(10.5, 19.8),X方向差了0.5mm,Y方向差了0.2mm。这个偏差对贴片来说已经非常可观了,SOP16的引脚宽度也才0.4mm左右,0.5mm的偏差足够让引脚吃不到足够的锡。
下面这张表可以比较直观地概括两者的差异:
| 对比项 | Body Center | Symbol Origin |
|---|---|---|
| 定义来源 | Place_Bound占位层的几何中心 | 封装库中定义的原点 |
| 与器件物理中心的接近程度 | 通常更接近,但取决于Place_Bound画法 | 取决于建库时的原点规范 |
| 依赖的封装要素 | Place_Bound层是否完整 | 原点是否规划合理 |
| 典型使用场景 | 贴片机坐标编程、装配图核对 | CAD数据交换、结构仿真、位号摆放 |
| 主要风险 | Place_Bound缺失或不规则导致坐标异常 | 原点偏离本体中心导致贴装偏移 |
3. Allegro导出Placement文件的分步操作
讲完原理,直接上操作。Allegro导出坐标文件的入口在File -> Export -> Placement,生成的文件就是贴片厂需要的坐标数据。整个过程并不复杂,但有几个关键选项一定要理解,否则导出结果跟你的预期可能完全不同。
3.1 导出前的三项准备
第一个准备是核对整板原点。如果你把原点设在板框右下角或者某个定位孔上,导出的坐标全部会是负数或者很大的正数,贴片厂导入他们的软件时很容易犯迷糊。最稳妥的做法是Setup -> Change Drawing Origin,把原点设在板框左下角,再开始导出。
第二个准备是确保封装库已经同步过。有些器件可能你在PCB里改了封装,但库里的原始封装并没有更新,或者反过来。导出前最好把PCB文件保存并完整更新一次封装,确保当前设计里的封装数据和库里的数据是一致的。
第三个准备是确认所有器件都已经被放置并且没有未放置的元件。如果板子上还有未放置的器件,坐标文件里要么少料,要么出现一堆(0,0)坐标,贴片厂拿到这种文件肯定要打电话来问。
3.2 导出对话框里每个关键选项怎么选
File -> Export -> Placement打开导出对话框后,重点关注下面这些设置:
- Placement File名称和路径:建议写清楚板卡名称和版本号,比如ProjectName_RevA_20250110.plc,方便跟贴片厂沟通时定位文件版本。
- Placement Origin:这就是本文的核心选项,Body Center或者Symbol Origin。我的建议是默认用Body Center,具体原因后面单独讲。
- Output Units:国内基本都用Millimeter,如果你导的是Mils,贴片厂导入时忘记换算,所有坐标都差25.4倍。
- Output decimals:一般设4位小数,0.0001mm的精度对贴片机来说完全够用。
- 是否包含未放置元件:不要勾选,贴片厂不需要未放置器件的坐标。
- 排序方式:按RefDes排序比较通用,按X/Y排序有时候也方便人工核对,看个人习惯。
Allegro不同版本之间界面细节有差异,但核心选项基本一致。导出后文件是纯文本,建议用记事本打开确认一下第一行注释里写的Units和Origin信息,这个细节能帮你发现导出时有没有选错参数。
3.3 导出的.plc文件逐行解读
用记事本打开导出的.plc文件,文件头部会有若干以#号开头的注释行,记录了文件格式、单位、原点模式等关键信息。接着是表头行,再往下就是每一颗器件的坐标数据。
我随便写一行做示意:
C12 CAP_0603 100nF 15.2345 -20.1234 90.0000 TOP这一行能读出来的信息是:位号为C12,器件类型是0603电容,容值100nF,X坐标15.2345mm,Y坐标-20.1234mm,旋转90度,在顶层。如果单位是mm但数字到了小数点后四位,说明精度是0.1um级别,这对于0201级别的元器件都足够应付了。
打开文件之后不要急着发给贴片厂,先自己扫一遍有没有明显异常。比如坐标一栏全是两位数的规整数字那基本没问题,但如果看到一堆器件坐标是0.0000或者完全相同,说明库里极可能有封装没画Place_Bound,或者有器件没有正确放置。
4. 选择指南:什么场景用Body Center,什么场景用Symbol Origin
到了核心问题:到底该选哪个。说实话,这个问题不能脱离你的封装库现状和贴片厂的要求来回答,但绝大多数情况下有一个默认最优解。
4.1 多数场景的默认推荐:Body Center
我现在做项目,默认就是Body Center。原因很朴素:贴片机的吸嘴吸的是器件的本体,贴片头要放的也是器件的本体,所以坐标代表器件物理中心是下游最直观、最不容易出错的解释方式。
只要封装库的Place_Bound画得没问题,Body Center导出的坐标就是每一颗料真正的几何中心。即使贴片厂的元件库和你的封装库有一些差异,只要他们的工程师按几何中心去核对,偏差也不会太大。这个模式对下游最友好。
而且Body Center还有一个隐藏优势:它不依赖封装原点的定义。哪怕建库的人当初把原点放在了一个很诡异的位置,只要Place_Bound正确,Body Center输出依然是物理中心。这在接手别人画的库、或者团队里建库规范不统一的时候,是很大的保险。
4.2 建议使用Symbol Origin的特殊场景
某些情况下,Symbol Origin反而更合适。第一种情况是贴片厂明确要求使用Symbol Origin模式。有的工厂编程软件有自己的一套补偿逻辑,他们自己的元件库里存储了每一颗料的"库中心"和"本体中心"的偏差值,导入坐标时只要拿到你自己的Symbol Origin坐标,再套他们库里的偏差,就能算出真正的贴装位置。这时候如果你给了Body Center,反而跟他们的补偿机制叠加出错。
第二种情况是封装库规范非常统一,所有元件的Symbol Origin都定义在器件几何中心,且Place_Bound层缺失比较严重。这种时候Symbol Origin反而是比Body Center更可靠的数据源,因为Body Center遇到没有Place_Bound的封装时,坐标输出会出现异常。
第三种情况是坐标文件不只是给贴片厂用的,还要给结构工程师做装配仿真、或者给仿真软件做三维布局。这种场景下,CAD系统中的原点对齐往往更关键,使用Symbol Origin能避免一些无谓的坐标转换。
4.3 与贴片厂对齐坐标规范的标准做法
不管选哪个模式,发出文件之前一定要跟贴片厂把下面这几项确认清楚,最好用邮件留底,不要只靠微信口头沟通。
| 确认项 | 建议值 |
|---|---|
| 整板原点位置 | 板框左下角 |
| 原点模式 | Body Center或按贴片厂要求 |
| 坐标单位 | 毫米mm |
| 小数精度 | 0.0001mm |
| 旋转角度方向 | 逆时针为正 |
| BOTTOM面镜像 | 由贴片厂软件处理 |
| 是否含未放置元件 | 不含 |
这七个问题确认完了,坐标文件的交付基本就不会出大岔子。如果贴片厂说"随便,都可以",那你就用默认的Body Center加板框左下角原点,同时把导出的参数写在邮件里。
5. 坐标异常排查与验证手段
坐标文件导出之后,我强烈建议做一次验证再发出去。很多人文件一导出就丢给工厂,等出了问题才回头查。下面这套验证手段花不了十分钟,但能帮你挡掉七八成的低级事故。
5.1 没有Place_Bound时,Body Center会给人挖什么坑
前面提过Body Center依赖Place_Bound层。如果某个封装压根没有画Place_Bound,Allegro在计算Body Center时会非常难受,不同版本的表现也不同,有的版本会把封装原点当作Body Center用,有的版本会直接输出0,0或者一些明显错乱的值。
最典型的症状就是:坐标文件里大部分数据正常,但某几个器件的坐标特别奇怪,要么和别的器件重合,要么跑到原点附近。如果你在导出时选了Body Center,又看到这种异常,第一反应应该是去检查这些器件的封装里到底有没有Place_Bound。
检查方式很简单:在封装编辑器里打开这个封装,看一眼Package Geometry -> Place_Bound_Top层有没有shape。没有的话,回到PCB里给这个封装补一块合适的占位shape再重新导出。已经出图的板子要改封装的话记得更新到PCB后再导出。
5.2 用Element命令在Allegro里直接对比两种坐标
还有一种快速验证方法,不需要先导出再导入,直接在Allegro里就能看到同一颗器件两种参考点的坐标。
在PCB编辑器里执行Display -> Element,然后点击任意一颗器件,弹出的报告里会列出这颗器件当前的放置信息。Element报告中显示的坐标就是Symbol Origin坐标。至于Body Center,可以通过导出一份API格式的Placement文件,在文件里和Element报告的数值对比。
我经常用的一个操作习惯是:同一个PCB文件,分别用Body Center和Symbol Origin各导出一份坐标文件,命名成xxx_BC.plc和xxx_SO.plc,然后打开Excel,把两份文件按位号关联起来,加一列算差值。这一列会非常直观地告诉你,哪些器件在这两种模式下几乎没有差别,哪些偏差超过了0.1mm。只要库规范做得好,大部分器件差值应该接近零,有差异的器件重点看一眼封装,就基本心里有数了。
5.3 用Excel和Skill快速批量校验坐标
Excel是检查坐标文件最顺手的工具。把.plc文件拖进Excel,按RefDes排个序,然后检查有没有重复位号、缺失位号、坐标完全相同的行、未放置的(0,0)点这些异常。
如果你想在Allegro里批量获取器件的Symbol Origin坐标,可以加载下面这段Skill脚本,它会遍历所有已放置的器件并把位号和坐标输出到命令行:
axlClearSelSet() axlSetFindFilter(?enabled list("NOALL" "COMPONENTS") ?onButtons "COMPONENTS") compList = axlAddSelectAll() foreach(comp compList printf("%s %.4f %.4f\n" comp->refdes comp->xy->x comp->xy->y) )这个脚本拿到的是Symbol Origin坐标。要验证Body Center,我建议还是用前面说的"导出两份文件做差值"的方法,这样效率和准确性都高。
6. 从板厂回来的返工单说起:三则真实案例
写到最后,分享三个真实经历过的案例。每一个都对应一类典型问题,也都是坐标文件相关事故里最常出现的场景。
6.1 整板偏移:原点没设在板框左下角
有一款背板,板子尺寸比较大,为了方便layout,我把原点设在了右下角的一个定位孔上,坐标导出也忘了改回来。贴片厂第一次试贴打完样一看,所有器件都整体往左上偏移了固定的距离,偏移量刚好等于板子的长和宽。工厂工程师来电话的时候,我第一反应是改坐标原点到左下角重新导出,之后试贴就正常了。
这个案例的问题不在Body Center还是Symbol Origin,而在于整板原点,但它提醒我每次导出坐标文件之前,第一步永远是核对原点的位置。
6.2 个别器件偏位:Symbol Origin偏离本体中心
一款QFN主控芯片,封装库是从别的项目抄来的。查库的时候发现,那颗QFN的Symbol Origin被定义在了引脚1上,但Place_Bound中心离引脚1有将近1.5mm。当时同事导出坐标文件时用了Symbol Origin,贴片机上料后芯片肉眼可见地偏了。
那次的解决办法特别简单:重新用Body Center导出坐标,重贴一次就完全对准了。这个案例也让我真正意识到Symbol Origin这个选项有多依赖建库的规范性。
6.3 坐标全部错乱:Place_Bound缺失导致的Body Center失效
还有一个更离谱的案例,某个老项目的封装库是从很久以前的版本迁移过来的,Place_Bound层在迁移过程中丢了一部分。导出坐标时选了Body Center,结果坐标文件里有一票器件坐标全部是乱值,有些甚至跑到板框外面去了。
排查过程也不复杂:先怀疑封装库,把异常器件在库中打开,发现Place_Bound层确实是空的。补画Place_Bound之后重新导出,数据恢复正常。但那次返工已经产生了废板,教训比较深刻。从那以后我每个封装做完了都会检查一遍Place_Bound层,同时出坐标文件之前都会用Excel做一遍上面说的差值和异常检查。
我个人在实际操作中体会是,坐标文件的坑大多是"库不规范"加"导出选项没理解透"两个因素叠加的结果。只要把封装库的Place_Bound和原点规范好,再在导出前花几分钟确认原点、单位、模式这三件事,贴片厂那边基本可以高枕无忧。最后想说的是,别嫌验证麻烦,你花在验证上的十分钟,可能省下来的是整批板子的钱和一周的工期。