【OrCAD】【TCL】【获取连接器引脚信息】
2026/6/12 5:07:56 网站建设 项目流程

做硬件的都知道,评审原理图时最头疼的事之一——数引脚

40pin 的连接器,一个个点开属性看,半小时没了。抄到 Excel 里给 FPGA 工程师,还容易漏、容易错。

今天用一段 TCL 脚本,3 秒搞定


目录

    • 一、先看效果
    • 二、OrCAD TCL 是什么?为什么值得学?
    • 三、脚本设计思路
    • 四、核心代码
      • 4.1 获取会话
      • 4.2 按位号查找器件
      • 4.3 提取引脚信息
      • 4.4 主函数和 CSV 导出
    • 五、使用方法
    • 六、还能做什么?
    • 总结

一、先看效果

在 OrCAD Capture 的 TCL 控制台输入一行命令:

getConnectorPins "J57"

立刻输出:

======================================== Searching connector: J57 ======================================== Part Info: RefDes : J57 Name : INS66096 Library: D:\MY_SHARE\ZC706_2_0_LIB#0.OLB Pin List: Pin# Pin Name Net -------------------------------------------------------------- 1 P1 IIC_PMOD_0 2 P2 IIC_PMOD_4 3 P3 IIC_PMOD_1 4 P4 IIC_PMOD_5 5 P5 IIC_PMOD_2 6 P6 IIC_PMOD_6 7 P7 IIC_PMOD_3 8 P8 IIC_PMOD_7 9 P9 GND 10 P10 GND 11 P11 VCC3V3_PS 12 P12 VCC3V3_PS Total 12 pins found ========================================

还能直接导出 CSV:

exportConnectorPinsToCSV "J57" "J57_pins.csv"

批量查多个连接器?一行搞定:

getMultipleConnectors {J1 J2 J3 J4}

二、OrCAD TCL 是什么?为什么值得学?

OrCAD Capture 内置了 TCL 脚本引擎,可以直接访问原理图数据库。这意味着你能用代码自动化几乎所有手动操作:

  • 遍历器件、引脚、网络
  • 批量检查设计规则
  • 自动生成报告

Cadence 的 DBO(Database Object)对象模型层级如下:

DboSession (会话) └── DboDesign (设计) └── DboSchematic (原理图) └── DboPage (页面) └── DboPartInst (元器件实例) └── DboPin (引脚) └── DboNet (网络)

每一层都有迭代器(Iterator),可以遍历所有子对象。


三、脚本设计思路

整个脚本拆成 6 个函数,各司其职:

函数功能说明
getSession获取当前 OrCAD 会话句柄
findPartByRefDes按位号遍历整个设计,定位目标器件
getPartPinInfo遍历器件的所有引脚,提取引脚信息
getConnectorPins主函数,格式化打印引脚信息
exportConnectorPinsToCSV导出引脚信息到 CSV 文件
getMultipleConnectors批量查询多个连接器

四、核心代码

4.1 获取会话

proc getSession {} { set lSession $::DboSession_s_pDboSession DboSession -this $lSession return $lSession }

⚠️DboSession -this这行是关键,它将 TCL 对象句柄与底层 C++ 对象绑定,缺少这一步后续调用会报错。


4.2 按位号查找器件

这是最核心的部分——四层嵌套遍历:Design → Schematic → Page → PartInst

proc findPartByRefDes {pSession refDes} { set lStatus [DboState] set lNullObj NULL set lDesignsIter [$pSession NewDesignsIter $lStatus] while {1} { set lDesign [$lDesignsIter NextDesign $lStatus] if {$lDesign == $lNullObj} { break } set lSchematicsIter [$lDesign NewViewsIter $lStatus $::IterDefs_SCHEMATICS] while {1} { set lView [$lSchematicsIter NextView $lStatus] if {$lView == $lNullObj} { break } # View 必须强制转换为 Schematic 类型,否则后续方法调用失败 set lSchematic [DboViewToDboSchematic $lView] set lPagesIter [$lSchematic NewPagesIter $lStatus] while {1} { set lPage [$lPagesIter NextPage $lStatus] if {$lPage == $lNullObj} { break } set lPartInstsIter [$lPage NewPartInstsIter $lStatus] while {1} { set lInst [$lPartInstsIter NextPartInst $lStatus] if {$lInst == $lNullObj} { break } set cstrRef [DboTclHelper_sMakeCString] $lInst GetReferenceDesignator $cstrRef set lRefDes [DboTclHelper_sGetConstCharPtr $cstrRef] DboTclHelper_sReleaseAllCreatedPtrs if {$lRefDes eq $refDes} { return [list $lDesign $lSchematic $lPage $lInst] } } } } } return "" }

4.3 提取引脚信息

proc getPartPinInfo {pPartInst} { set lStatus [DboState] set lNullObj NULL set pinList {} set lPinsIter [$pPartInst NewPinsIter $lStatus] while {1} { set lPin [$lPinsIter NextPin $lStatus] if {$lPin == $lNullObj} { break } # 引脚号 set cstrPinNum [DboTclHelper_sMakeCString] $lPin GetPinNumber $cstrPinNum set pinNumber [DboTclHelper_sGetConstCharPtr $cstrPinNum] DboTclHelper_sReleaseAllCreatedPtrs # 引脚名 set cstrPinName [DboTclHelper_sMakeCString] $lPin GetPinName $cstrPinName set pinName [DboTclHelper_sGetConstCharPtr $cstrPinName] DboTclHelper_sReleaseAllCreatedPtrs # 网络名 set lNet [$lPin GetNet $lStatus] if {$lNet != $lNullObj} { set cstrNet [DboTclHelper_sMakeCString] $lNet GetNetName $cstrNet set netName [DboTclHelper_sGetConstCharPtr $cstrNet] DboTclHelper_sReleaseAllCreatedPtrs if {$netName eq ""} { set cstrNet2 [DboTclHelper_sMakeCString] $lNet GetName $cstrNet2 set netName [DboTclHelper_sGetConstCharPtr $cstrNet2] DboTclHelper_sReleaseAllCreatedPtrs } } else { set netName "NO_NET" } lappend pinList [list $pinNumber $pinName $netName] } return $pinList }

4.4 主函数和 CSV 导出

proc getConnectorPins {refDes} { set lSession [getSession] set result [findPartByRefDes $lSession $refDes] if {$result == ""} { puts "Error: Part '$refDes' not found" return } set lPartInst [lindex $result 3] set pinList [getPartPinInfo $lPartInst] puts "Pin#,Pin Name,Net" foreach pin $pinList { puts "[lindex $pin 0],[lindex $pin 1],[lindex $pin 2]" } puts "Total [llength $pinList] pins" } proc exportConnectorPinsToCSV {refDes {csvFile ""}} { if {$csvFile == ""} { set csvFile "${refDes}_pins.csv" } set lSession [getSession] set result [findPartByRefDes $lSession $refDes] set lPartInst [lindex $result 3] set pinList [getPartPinInfo $lPartInst] set fp [open $csvFile w] puts $fp "Pin#,Pin Name,Net" foreach pin $pinList { puts $fp "[lindex $pin 0],[lindex $pin 1],[lindex $pin 2]" } close $fp puts "Exported to: $csvFile" }

五、使用方法

# 第一步:加载脚本 source [file normalize {D:\scripts\get_connector_pins.tcl}] # 第二步:查询单个连接器引脚 getConnectorPins "J57" # 第三步:导出到 CSV exportConnectorPinsToCSV "J57" "J57_pins.csv" # 第四步:批量查询多个连接器 getMultipleConnectors {J1 J2 J3}

六、还能做什么?

这个脚本只是一个起点。基于同样的 DBO 遍历框架,可以继续扩展:

  • 正则批量查询:用J*一键查所有连接器
  • 引脚电气类型:获取每个引脚的输入/输出/双向属性
  • 网络追踪:从引脚出发,追踪整个网络的完整连接链路
  • 接口文档自动化:自动生成接口定义文档,直接交付给 FPGA 工程师

总结

要点说明
对象模型Session → Design → Schematic → Page → PartInst → Pin
字符串操作模式MakeCString→ 方法调用 →GetConstCharPtrReleaseAll
类型转换DboViewToDboSchematic必须调用,不能省略
迭代器管理每个NewXxxIter对应一个delete_函数,用完释放
注意事项不写中文注释、方括号命令需用花括号包裹

💬不想自己折腾?留言获取打包好的.enc加密执行文件,开箱即用。

👍觉得有用的话,点赞 + 收藏 + 关注,后续会分享更多 OrCAD 自动化脚本:电源树分析、差分对检查、时钟网络检查……

💡评论区告诉我:你最想自动化哪个 OrCAD 操作?

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询