
做PCB设计的人十有八九都遇到过这种场景板子拉完了、布局也定得差不多了结构工程师突然甩过来一个问题——“这几个器件到底多高我这个限高区域能不能放下”你打开Allegro对着封装库翻半天要么找不到高度数值要么找到一堆不知道哪个版本遗留的、明显不准的数字。更麻烦的是如果你的板子上有几百个器件一个个去查高度那基本等于加班到天亮。元器件高度这东西听起来是个小数据实际牵扯到结构干涉检查、3D模型导出、限高区规划、装配体BOM核对等一大串环节。Allegro里获取高度的方式其实有好几条路但很多教程只讲其中一两种而且不少方法只适合单器件查看没法批量用。这篇文章就把我在实际项目里用过的、以及这几年在社区里跟同行学到的各种取高度技巧一次性整理出来从最基础的单器件查询到报表批量导出、Skill脚本全自动提取再到用3D模块和EMN/EMP文件做交叉验证一次讲透。1. 高度数据到底存在哪里先搞懂Place Bound和HEIGHT属性很多人查不到器件高度不是因为Allegro没有这个数据而是压根不知道这个数据是放在哪个层、以什么形式存的。说白了Allegro里绝大部分跟“外形”“占位”“高度”相关的信息都不是凭空存在的而是挂在封装Symbol内部的某个结构层上。1.1 Place Bound层的核心作用在Allegro的封装设计中每个器件都有一个叫Place Bound的层具体来说一般叫PACKAGE GEOMETRY/PLACE_BOUND_TOP表贴或者PLACE_BOUND_BOTTOM底层。这个层的作用可不止是给电路设计软件看它在结构上代表“这个器件在二维空间内实际占用的范围”。你想想看为什么布局的时候两个器件靠得太近Allegro会报DRC错误为什么用Auto Placer做自动布局时它能知道哪里放得下、哪里放不下靠的就是Place Bound。这个层的边界框Boundary描述的就是器件在板子上的物理投影大小。而元器件高度就附着在这个Place Bound之上以属性Property的方式存在。属性名就叫HEIGHT。换句话说一个封装如果没有画Place Bound或者画了Place Bound但没填HEIGHT属性那Allegro就算想告诉你它多高也说不出来。这一点是后面所有操作的基础一定先搞清楚。1.2 HEIGHT属性是怎么填上去的在封装编辑器PCB Editor里打开任何一个封装点击菜单Setup - Areas - Package Height然后框选封装会弹出一个设置对话框里面可以填Minimum Height和Maximum Height。很多工程师填的“高度”其实是Maximum Height也就是器件最高点离焊盘所在平面的距离。还有一种情况器件的Place Bound图形画好了之后右键打开属性编辑器手动给图形添加HEIGHT属性数值单位跟随当前图纸设置。如果板子单位是mil那HEIGHT就填mil如果是mm就填mm。这里特别容易出问题因为封装库可能来自不同版本、不同工程师有人用mm画封装但忘了改单位导出的高度报表数值就完全对不上。所以你在学“怎么获取高度”之前先要养成一个习惯拿到一个封装库先确认它的Place Bound上有没有HEIGHT属性数值单位是什么。不然查出来的数据可能就是错的。2. 单器件快速查看高度不用翻库几步搞定如果你只想知道某几个器件的高度完全不用去封装库翻PCB文件直接在Allegro当前编辑环境里就能查而且很快。2.1 用属性编辑器直接看在Allegro PCB编辑界面菜单栏找到Edit - Properties点开之后右侧Find面板里只勾选Symbols然后鼠标去画布上点你要查的那个器件。这时候会弹出一个Edit Property的窗口里面列出这个Symbol的所有属性包括REFDES、DEVICE、VALUE、TOLERANCE当然也包括HEIGHT。如果窗口里没看到HEIGHT说明这个封装的Place Bound上没有存高度。这种情况多出现在很早以前建的封装里或者从别的EDA工具转换过来的库。解决办法后面专门讲。这种方法是我个人最常用的单器件查询方式因为我还能顺便看到VALUE、DEVICE这些信息相当于查一个器件属性总表不用记那么多命令。2.2 用Show Element命令查另一种方式是点击菜单Display - Element或者直接在命令行输入show element然后把Find面板里的Symbols勾上再去点器件。结果会打印到右下角的命令行窗口里里面会列出Place Bound Top的坐标范围以及Height数值。这个方法适合不喜欢弹窗的人因为输出直接在命令行窗口里按F11还能把窗口调大。而且它能显示的信息更细比如这个Place Bound是CuTop还是SoldermaskTop边界坐标一个不落对核对器件实际占位很有帮助。顺带提一句如果你经常用这个方法不妨给show element设个快捷键。在env文件里加一行alias F9 show element之类的后续操作会顺手很多。快捷键映射的具体写法之前有篇文章专门聊过Allegro快捷键设置思路是一样的。2.3 查库里的数据不认账怎么办有经验的老工程师都会做一件事在Placement状态下直接看器件的Body Center。具体操作是菜单Manufacture - NC - NC Legend、或者在Display菜单下切换Placement这能把所有器件的位号、方向和占位框都显示出来。配合属性查看能快速确认器件在PCB上实际摆放时的占位是否正确。不过要提醒一下查单器件高度只是“点对点”解决问题一旦板子上有几十上百个器件还一个个点效率实在太低。这时候就该上批量导出的方法了。3. 批量导出高度信息一份报表全解决项目评审的时候结构工程师要的往往不是某一颗器件的高度而是整个板子的完整清单哪个位号、什么封装、高度多少。有的公司还要你整理一份Excel发给结构组方便他们做整机装配干涉检查。这时候直接用报表导出是最快的。3.1 用Report命令生成组件报告Allegro自带的报表功能就能覆盖这个需求。菜单Tools - Reports弹出Report对话框后在左侧列表里找到Component Report或者Bill of Materials Report勾选上点Generate系统就会自动生成一份报告。Component Report会列出当前PCB上所有器件的基础信息包括位号、封装名、X/Y坐标、旋转角度、所在层、以及HEIGHT属性值。这份报告默认是.rpt格式的文本文件可以用记事本打开也可以直接把内容粘到Excel里分列处理。Bill of Materials ReportBOM报表同样会带上HEIGHT而且通常还会带上DEVICE、VALUE、TOLERANCE等器件属性做装配BOM的时候更实用。我一般会用BOM报表因为它的信息维度更全结构工程师拿过去能直接用。3.2 自定义报告把需要的字段单独列出来如果你觉得自带的Report输出格式不合口味比如字段太多看着乱、或者想把HEIGHT单独放一列可以用Allegro的自定义报告功能。在Report对话框里点右上角的Setup按钮进入表单编辑器选一个模板把需要的属性字段拖进去生成自己的报告模板。其实这里有个更简单的思路生成Component Report之后把文本导入Excel用“分列”功能按Tab或空格把数据拆开再删掉不用的列。操作熟练的话一分钟就能整理出一份干净的清单不用在Allegro里折腾太多配置。3.3 报表导出前后的两个注意点第一报表里的HEIGHT数值单位跟随PCB设计文件的单位设置。如果你的板子是mil单位画的导出的高度就是mil。结构工程师那边一般都用mm所以导出后记得统一换算或者导出前在Setup - Design Parameter Editor - Design里把单位临时改成mm再导。改完记得改回来不然后面画板子一堆尺寸标注都会变容易出大事。第二如果报表里HEIGHT列是空的不用怀疑是操作问题就是前面讲的——封装里压根没存高度。这时候不能靠报表硬编必须回到封装库里补数据。具体怎么补我放到第4节讲。4. 用Skill脚本批量提取高度效率直接起飞如果说报表导出是“半自动”那Skill脚本就是“全自动”。尤其当你有一块上千器件的板子要输出带高度的清单、要按高度排序、要把超高超限的器件单独标出来报表功能就有点力不从心了。这时候自己写个十几行的Skill脚本跑一次全搞定还能重复用。4.1 Skill脚本的实现思路Skill是Allegro内置的脚本语言能直接操作当前打开的设计数据库。实现批量提取高度的思路其实不复杂先遍历当前PCB上所有Symbol然后读取每个Symbol关联的Place Bound信息再从中提取HEIGHT属性值。最后把结果写到文本文件里。简单说就是三步遍历器件、读属性、写文件。难点在于第一步遍历的API要选对第二步要同时处理“存在HEIGHT”和“不存在HEIGHT”两种情况。4.2 一个可直接用的Skill示例下面是我自己常用的一个提取脚本代码不长也没有用到什么高深语法适合有一定Skill基础的朋友直接拿过去改。; get_height.il ; 批量导出Allegro当前PCB上所有器件的高度到文本文件 ; 使用方法在Allegro命令框输入 get_height procedure(get_height() let(dbfid symbols fid outfile hval refdes (if(axlCurrentDesign() then dbfid axlCurrentDesign() symbols axlDBGetDesignSymbols(dbfid) outfile outfile(./height_report.txt w) fprintf(outfile RefDes\tPlaceBoundTopHeight\n) foreach(sym symbols refdes sym-name hval nil ; 读取Place Bound Top层上的属性 when(sym-place_bound foreach(pb sym-place_bound hval pb-height when(hval fprintf(outfile %s\t%L\n refdes hval) ) when(!hval fprintf(outfile %s\tNoHeightData\n refdes) ) ) ) when(!sym-place_bound fprintf(outfile %s\tNoPlaceBound\n refdes) ) ) close(outfile) printf(Height report generated: ./height_report.txt\n) ) ) ) )在Allegro命令框里输入get_height跑完会在当前工作目录下生成一个height_report.txt文件里面每行一个位号加一个高度值。有数据的填数值没数据的会标注NoHeightData或者NoPlaceBound一眼就能看出哪些器件需要回库补数据。4.3 这个脚本为什么这样写关键点拆解axlDBGetDesignSymbols是Allegro SKILL里很常用的一个函数作用是抓出当前设计里所有Symbol对象。不管你是贴片电阻、电容还是BGA、连接器只要被放到了板子上都会作为Symbol存在设计数据库中。sym-place_bound返回的是一个列表里面是该Symbol所有Place Bound层的图形对象。正常情况下一个器件只有一个Place Bound Top但有些器件可能同时有Top和Bottom的Place Bound所以用foreach去遍历是一种保险做法确保不漏数据。pb-height读取的就是Place Bound图形的HEIGHT属性值。这里有一个细节如果Place Bound是多个多边形拼出来的比如某些封装为了避开中央焊盘画了左右两个Bound那pb-height可能是列表。脚本里直接把它写进文件可能会显示成类似(1.2 1.2)的形式这时候可以加个判断取列表第一个值或者最大值按需处理。4.4 使用Skill环境的落地设置Skill脚本要跑起来得先把文件放到Allegro能搜索到的目录下。一般做法是放到你自己的skill文件夹里然后在env文件中加一行setSkillPath(buildString(append1(getSkillPath() D:/cadence/skill)))再把脚本文件名写进allegro.ilinit文件里内容格式是load(get_height.il)。如果你不懂env和ilinit文件怎么配还有一个更简单的方法直接把脚本文件放到Allegro安装目录的share/local/pcb/skill下然后重启Allegro。这个目录是软件自动扫描的Skill路径之一省去改配置的麻烦。说实话用Skill脚本查高度属于“一劳永逸”的路子第一次写的时候花点时间后面每次刷板都能用。而且学会了读属性、写文件的套路你还能扩展出很多其他功能比如批量导出器件坐标、检查封装高度是否超限等等。5. 3D模块与EMN/EMP导出让结构工程师直接用前面讲的都是从数据层面获取高度但结构工程师那边最终要的往往是能直接导入机械软件的模型。Allegro本身也支持把PCB板卡转成3D格式这对于核对器件高度、做整机装配干涉检查特别有用。5.1 直接用3D Canvas查看高度Allegro 17.x及更高版本内置了3D引擎可以在PCB设计环境中直接打开3D视图。操作路径是菜单View - 3D Canvas或者直接在工具栏点那个带立方体样子的图标。进入3D视图后板卡和器件会以三维形式显示出来旋转、缩放、平移都跟常规3D软件类似。在3D视图里点选任意器件右侧的选项面板会列出它对应的Step模型信息、放置坐标、旋转角度以及模型的实际尺寸。用测量工具能直接量出器件顶面到板面的距离这对确认某颗器件是否超高非常直观。不过要提醒的是3D视图里的模型精度完全取决于你的封装库有没有链接Step模型。如果封装只有Place Bound、没有分配Step模型3D视图里显示的只是一个简易的拉伸体高度可能来自HEIGHT属性。说白了3D视图是对“库数据”的可视化库数据错了3D里看到的也是错的。5.2 导出EMN/EMP给机械软件做干涉检查如果你的公司流程是“结构工程师用SolidWorks、ProE或者Creo做整机设计”那更常见的交接方式是导出EMN/EMP文件。EMN文件是板卡结构描述文件包含板子外形、孔径、器件位号、器件高度等信息EMP文件是器件封装描述文件包含每个器件的三维模型参数。导出操作很简单菜单File - Export - EMC或者File - Export - IDF不同版本菜单叫法略有差异17.2以上一般叫EMC弹出对话框后选择输出目录点Export就生成了EMN/EMP两个文件。结构工程师拿到这两个文件在机械软件里导入就能看到整板带器件高度的三维模型直接做干涉检查。这里有个经验之谈导出EMN/EMP之前一定要先在Allegro里检查一下每个器件的封装有没有给它正确的高度数据。因为EMN里的高度数据就是从HEIGHT属性读出来的HEIGHT是空的器件导出去就是0高度结构那边导入后那颗器件是贴地的检查结果完全失真。5.3 导出DXF时能不能带高度很多工程师也会问那我导出DXF是不是也能带高度答案是不能直接在DXF里带高度属性。DXF是二维格式导出的是平面图形。你可以导出不同层的平面图给结构参考但高度数值不会跟着走。真正要传递高度信息给机械软件还是得走EMN/EMP或者3D PDF这类格式。所以建议把EMN/EMP的导出流程写进你自己团队的“投板检查清单”里每次投板前例行检查一遍哪怕结构工程师没主动来要也提前准备好。省得人家来问的时候临时导一忙起来又容易漏器件。6. 常见问题与排查技巧实录实际操作中获取高度这件事看着简单坑却不少。我把这几年见过的高频问题整理了一下按“症状-原因-解决办法”列出来大家以后遇到直接对照着查。症状可能原因解决办法Show Element查不到HEIGHT封装的Place Bound上没有填高度属性进封装库给Place Bound图形添加HEIGHT属性更新封装Report导出的高度是空白的库中所有或部分器件缺少HEIGHT属性用Skill脚本找出所有缺高度的器件批量回库补数导出的高度数值明显不对单位不一致可能库用mil画的但属性值填的是mm确认识别单位统一换算建议封装库统一用公制器件有多个Place Bound高度值变成列表封装画了多个Boundary且各自带高度在Skill脚本里取最大值或首值按需处理3D视图里器件是方块没有真实造型封装库没关联Step模型给封装Link对应的Step模型库更新后再看同一个封装在不同板卡上高度不一样有人在板级手动改过器件高度检查器件属性确认使用的是封装默认值还是覆盖值EMN导入机械软件后器件是贴地的器件HEIGHT属性缺失导出时高度为0回库补齐高度数据再重新导出EMN/EMP器件高度是“负值”的Place Bound画在了底层且方向反了在封装编辑器中检查Place Bound的层属性和法线方向6.1 高度值为0或找不到HEIGHT先查封装库这个问题发生频率极高。很多工程师做法是直接在PCB上手动改器件属性临时填一个高度值。这个方法能应付当天检查但板子一旦重新导网表、重新Placement手动改的属性很容易被覆盖掉下次又变回原样。正确做法是回到封装库.dra文件里打开封装画好Place Bound之后用Setup - Areas - Package Height填高度。保存并更新库以后再在PCB文件里用Tools - Update Symbols刷新一遍这样所有引用该封装的器件都会带上正确高度。虽然初期改库麻烦但一劳永逸。6.2 同一封装不同高度注意器件级覆盖还有一种情况是个别器件因为特殊设计要求高度和封装库默认值不同。比如某电容常规10mm高但项目里这颗定制料实际只有8mm结构要求按8mm算。这时候可以在PCB界面选中器件用Edit - Properties直接加一个HEIGHT8mm的属性覆盖库值。要注意的是Allegro的器件属性优先级是“器件级属性覆盖封装级属性”。所以如果你在器件上手动填了HEIGHT它的值会优先于封装库里的值参与DRC、3D模型、EMN导出。这既是优点也是坑——下次换料更新封装时器件的覆盖属性不会被自动清掉容易留下旧数据。建议在属性里加个备注写清楚“为什么这个器件高度被覆盖”。6.3 高度单位错了数据差一大截这类问题最隐蔽。比如有人用mil画封装填HEIGHT属性时习惯性填了mm数字比如填了1.2其实想表达1.2mm结果在mil单位的图纸里1.2就是1.2mil差了将近40倍。等结构工程师拿到EMN文件一导入满板都是几百mil高的巨型器件当场懵了。一个可行的防范习惯是在PCB设计文件里始终用公制单位做结构相关操作。投板前临时把单位切到mm导出EMN/EMP再到结构软件里验证一遍。或者在封装命名规范里直接约定统一使用mm做封装单位。这个习惯要从建库第一天就养成后来才不会被单位坑到。结尾一点个人体会做了这么多年板子我最大的感受是元器件高度看起来是个特别小的数据但它恰恰是电子设计和结构设计之间最重要的桥梁之一。很多项目延期、改版起因往往就是一颗小小的器件超高没人发现最后装机阶段卡壳。所以我特别建议大家把“查高度”这件事放到整个设计流程里去考虑而不是抱着“结构来问了再去查”的心态。布局阶段就要定期跑一遍高度报告看看有没有明显超高的器件投板之前导出EMN/EMP自己先在机械软件里过一遍封装库的量产维护阶段更是要把HEIGHT属性当成和焊盘尺寸一样重要的数据来管理。最后再分享一个小技巧如果你是团队的管理者或者流程负责人可以在Allegro的DRC规则里把封装的HEIGHT属性和房间高度约束Room Constraint结合起来。比如某些限高区域设置成固定高度任何超过这个高度的器件放到区域里立刻报DRC错误。这样高度检查就能落到日常设计过程中而不是等结构工程师来催才发现问题。工具这东西你用好了就是效率用不好就是折腾。上面的几种获取高度的方法建议大家都亲手试一遍找到最适合自己工作习惯的组合。等哪天真被结构工程师追着要器件高度的时候你就能气定神闲地甩出一份完整的报告不用手忙脚乱。