1. 为什么需要ActiveX脚本导出PCB数据
在PCB设计流程中,元件坐标和BOM(物料清单)的导出是生产制造的关键环节。传统手工记录方式效率低下,而PADS Layout自带的报表功能往往无法满足个性化需求。我遇到过不少工程师在无Office环境下,面对"ActiveX Automation: server could not be found"报错时手足无措的情况。
ActiveX脚本的优势在于可以直接与PCB设计数据交互,实现精确到0.01mm的坐标提取。某次为客户调试产线时,发现传统方法导出的角度值存在四舍五入误差,导致贴片机校准偏差。改用脚本直接读取原始数据后,问题迎刃而解。这种精度在高速贴装场景下尤为重要。
2. 环境准备与脚本基础
2.1 无Office环境的替代方案
当系统缺少Microsoft Office时,WPS是最常见的替代品。但要注意两者在ActiveX实现上的差异:
- WPS 2019专业版及以上版本才完整支持ActiveX
- 需要手动注册WPS的COM组件(运行
regsvr32 etapi.dll) - 建议关闭WPS的"兼容2003文档"模式
实测发现,在Windows 10系统下,按以下顺序操作最稳定:
- 卸载旧版WPS
- 安装WPS 2019专业版(注意不是个人免费版)
- 以管理员身份运行CMD执行注册命令
2.2 脚本执行基础操作
在PADS Layout VX.2.2中调用脚本的完整路径:
' 基础示例 Dim myApp Set myApp = Application Dim myDoc Set myDoc = myApp.ActiveDocument常见新手错误包括:
- 未先获取Application对象就直接操作文档
- 循环提取元件时未检查对象是否存在
- 角度单位混淆(脚本默认使用度,部分机床需要弧度制)
3. 关键数据提取技巧
3.1 精确获取元件坐标
X/Y坐标的提取要注意PCB原点的设定。这段代码可以获取绝对坐标:
For Each comp In myDoc.Components Dim posX, posY posX = comp.PositionX * 1000 '转换为毫米 posY = comp.PositionY * 1000 '写入表格操作... Next遇到过的一个典型问题:某客户导出的坐标总是偏移2.54mm,检查发现是脚本未考虑英制单位的转换。添加If myDoc.Units = "mils" Then...的条件判断后解决。
3.2 旋转角度的特殊处理
元件角度需要区分placement角度和实际封装角度:
Dim realAngle realAngle = comp.Rotation + comp.Part.Rotation If realAngle > 360 Then realAngle = realAngle - 360在LED阵列板案例中,发现部分元件角度显示为359.999°。这是由于浮点运算精度导致的,建议在输出时用Format(realAngle, "0.00")统一格式。
4. 高级应用与错误排查
4.1 生成完整BOM清单
标准BOM需要合并相同规格的元件,这个函数可以实现计数汇总:
Function GenerateBOM(doc) Dim bomDict Set bomDict = CreateObject("Scripting.Dictionary") For Each comp In doc.Components Dim key key = comp.PartName & "|" & comp.Value If bomDict.Exists(key) Then bomDict(key) = bomDict(key) + 1 Else bomDict.Add key, 1 End If Next '输出字典内容到表格... End Function4.2 常见报错解决方案
"ActiveX Automation"错误的完整排查流程:
- 检查WPS服务是否注册(任务管理器应有et.exe进程)
- 验证PADS脚本权限(需勾选信任对VB项目的访问)
- 尝试重建系统COM+ Catalog(组件服务管理控制台中操作)
最近帮客户解决的一个棘手案例:脚本在Win11上间歇性失败,最终发现是系统UAC设置过高。创建以下注册表项后稳定运行:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System] "EnableLUA"=dword:000000005. 实战案例:全自动导出系统
分享一个我在汽车电子项目中使用的完整脚本框架:
' 初始化部分 Set excelApp = CreateObject("Excel.Application") excelApp.Visible = True Set workbook = excelApp.Workbooks.Add Set sheet = workbook.ActiveSheet ' 表头设置 sheet.Cells(1, 1).Value = "Designator" sheet.Cells(1, 2).Value = "X(mm)" ' 更多表头... ' 数据填充 rowIndex = 2 For Each comp In myDoc.Components If comp.IsPlaced Then ' 仅处理已放置元件 sheet.Cells(rowIndex, 1).Value = comp.Name sheet.Cells(rowIndex, 2).Value = Format(comp.PositionX * 1000, "0.00") ' 更多数据处理... rowIndex = rowIndex + 1 End If Next ' 格式优化 sheet.Columns.AutoFit workbook.SaveAs "BOM_" & Format(Now(), "yyyymmdd") & ".xlsx"这个方案实现了三个关键改进:
- 自动过滤未放置元件
- 文件名带日期时间戳
- 自适应列宽调整
在最近的项目复盘中发现,加入元件高度检查可以预防SMT设备碰撞风险。建议在脚本中添加comp.Part.GetHeight()的判断逻辑,这对有异形元件的设计特别重要。