当前位置:首页 > 嵌入式 > 嵌入式分享
[导读]PCB设计完成后,走线宽度是否符合工艺规则是制板前的硬门槛——电源线要求20mil以上、信号线8mil、差分对5mil,任何一个违规都可能导致短路或断路。人工肉眼检查几十上百条走线既费时又容易漏,而Python配合Altium文件解析库可以一键扫描整个板子,把违规项列成表格。下面以开源库py-altium为例,展示如何批量识别Altium Designer的.PcbDoc文件中的走线宽度违规。


PCB设计完成后,走线宽度是否符合工艺规则是制板前的硬门槛——电源线要求20mil以上、信号线8mil、差分对5mil,任何一个违规都可能导致短路或断路。人工肉眼检查几十上百条走线既费时又容易漏,而Python配合Altium文件解析库可以一键扫描整个板子,把违规项列成表格。下面以开源库py-altium为例,展示如何批量识别Altium Designer的.PcbDoc文件中的走线宽度违规。

一、环境准备

首先安装py-altium库(支持读取Altium二进制格式):

pip install py-altium

该库能解析走线、过孔、焊盘等元素,并提供几何信息和属性。

二、单文件检查脚本

以下脚本加载一个Altium PCB文件,遍历所有走线(Track),与预设的最小/最大宽度对比,输出违规项。

import altium

from pathlib import Path


# 规则定义:不同网络的宽度要求(单位:mil)

WIDTH_RULES = {

   "POWER": {"min": 20, "max": 50},

   "SIGNAL": {"min": 8, "max": 15},

   "GND": {"min": 20, "max": 100},

   "DIFF_PAIR": {"min": 5, "max": 8},

}


def check_width(file_path):

   board = altium.load(str(file_path))

   violations = []

   for track in board.tracks:

       net_name = track.net.name if track.net else "UNKNOWN"

       rule = None

       # 根据网络名前缀匹配规则

       for key, limits in WIDTH_RULES.items():

           if key in net_name.upper():

               rule = limits

               break

       if rule is None:

           continue  # 未匹配规则的网络不检查

       width_mil = track.width * 1000  # 假设库返回的单位是inch

       if width_mil < rule["min"] or width_mil > rule["max"]:

           violations.append({

               "net": net_name,

               "width_mil": round(width_mil, 2),

               "layer": track.layer.name,

               "location": f"({track.x:.2f}, {track.y:.2f})",

               "rule": f"{rule['min']}-{rule['max']}mil"

           })

   return violations


# 使用示例

violations = check_width("demo.PcbDoc")

print(f"发现 {len(violations)} 处违规:")

for v in violations:

   print(f"  网络 {v['net']} 宽度 {v['width_mil']}mil (规则 {v['rule']}) "

         f"位于 {v['layer']} {v['location']}")

三、批量处理与报告生成

实际项目中往往有多个PCB文件需要检查,可以遍历文件夹,将所有违规汇总到一个CSV报告中。

import csv, os


def batch_check(folder, output_csv):

   all_violations = []

   for f in Path(folder).glob("*.PcbDoc"):

       try:

           viol = check_width(f)

           for v in viol:

               v["file"] = f.name

           all_violations.extend(viol)

       except Exception as e:

           print(f"处理 {f.name} 失败: {e}")

   with open(output_csv, "w", newline="") as csvfile:

       fieldnames = ["file", "net", "width_mil", "layer", "location", "rule"]

       writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

       writer.writeheader()

       writer.writerows(all_violations)

   print(f"违规报告已保存至 {output_csv}")


batch_check("./pcb_files", "width_violations.csv")

四、注意事项

库的兼容性:py-altium目前支持Altium 20–23版本,较旧的格式可能解析失败。建议先将Altium文件另存为最新格式。

规则定义:实际生产中应根据工艺能力和设计要求设定宽度范围,本例仅为演示。

备份文件:脚本只读不写,不会修改原始PCB文件,但建议在副本上运行以防意外。

性能:大型PCB(数千条走线)解析耗时约几秒,批量处理时建议加进度提示。

五、扩展思路

除了走线宽度,还可以检查过孔孔径、间距、铜皮间隙等规则。py-altium还支持读取过孔、焊盘、敷铜等元素,只需扩展相应的检查函数即可。结合Jenkins或GitLab CI,可以将该脚本嵌入到设计流程中,每次提交PCB文件后自动检查并邮件通知违规项。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭