在电路原理图和PCB设计完成后,我们需要导出BOM(又称物料清单或焊接清单),用于器件采购和PCB焊接。在使用Cadence Orcad时,不同的设计方式对应不同的导出BOM的操作,本文总结了基于CIS数据库的设计方式以及普通设计方式分别如何导出BOM。
考虑到普通设计方式导出的BOM可能比较混乱,本文还分享一段Python脚本用于整理BOM。
如果不选中Export BOM report to Excel,则会导出以.bom结尾的BOM文件,需要使用Excel打开再另存为.xslx格式,相较于直接用Excel打开,多一步操作,故建议选中此项。
为方便展示,这里调整了原始的表格格式。
基于CIS数据库的方式设计原理图,导出的BOM属性均来自于数据库,每个元器件都是数据库中的一个单独元件,无需手动设置Value,PCB Footprint等属性,所以导出的BOM很规整,根据需要略作修改即可使用。
Header指的是表头,它和Combined property string(组合属性字符串)是一一对应的,参考配置如下:
Header:
Item\tQuantity\tReference\tPart\tPCB Footprint\tMPN
Combined property string:
{Item}\t{Quantity}\t{Reference}\t{Value}\t{PCB Footprint}\t{Model}
其中MPN指的是manufacturer’s part number即制造商元器件编号,在我的原理图中用Model属性表示,需要根据实际情况修改。
这里有两种操作方式:
如果原理图设计比较规范,导出的BOM比较规整,稍作整理就可以使用,则推荐使用操作1;
如果原理图设计比较混乱,同型号的元器件Value值和制造商编号可能不统一,则推荐使用操作2,后续再通过本文分享的脚本整理BOM。
因为不是基于CIS数据库的设计,所以很多参数都是手动修改的,这样就很难统一设计风格。特别是从一些老原理图中复制过来的电路,因为每个人的喜好不一致,同一个元器件的Value可能有多种不同的写法,如100nF电容有时会写做0.1uF或者0.1u,这使得原本是同一个元器件会因为Value值不一致被分开。
如下图展示了一个风格不一致的原理图中导出的BOM。
从下图中可见,0805封装0.1uF的电容因为0.1u和0.1uF的区别,以及制造商物料型号的区分被分为了三块,其实在同一个电路板中,它们应都焊接同型号的电容。如果还有人喜欢将0.1uF写成100nF,则同型号电容会被分成更多块。
使用Python脚本来整理BOM将会节约大量的手工整理时间,且不会出错,脚本效果如下图所示。
所有0.1u,0.1uf,100n等格式都会被标准化为100nF;2200pF会被标准化为2.2nF,其它容值同理,电阻的1k和1kΩ会被标准化为1K。
所有同型号的制造商元器件编号均会被保留下来,由设计人员手动确认。
Value以OPEN开头的元器件被认为不焊接,会被整理到BOM最后几行。
经过此脚本整理的BOM,设计人员只需要确认最后一列的制造商元器件编号即可。
Python脚本部分代码如下:
检查BOM格式是否正确:
# 存储错误行的序号
error_row_num = bom_components_begin_row_num
# 位号不允许重复 存储位号
reference_ls = []
# 检查BOM表是否出错,前两列应全为空或全为数字,第三列应为序号,应是字母+数字的形式且不能重复,第四列为Value和第五列PCB Footprint应不为空
is_valid_reference_pattern = r"^[A-Za-z]+\d+$"
for row in origin_sheet.iter_rows(min_row=bom_components_begin_row_num, values_only=True):
if any(row): # 判断整行是否存在非空值,为空则跳过
if ((type(row[0]) == int and type(row[1]) == int) or (row[0] == None and row[1] == None)) == False:
pyautogui.alert(f'第{error_row_num}行={row}的前两列格式错误,非空,也非数字', '提示')
sys.exit()
if (re.match(is_valid_reference_pattern, row[2]) == False):
pyautogui.alert(f'第{error_row_num}行={row}的前三列格式错误,并非位号', '提示')
sys.exit()
elif (row[2].strip() in reference_ls):
pyautogui.alert(f'第{error_row_num}行={row}的位号重复', '提示')
sys.exit()
else:
reference_ls.append(row[2].strip())
if row[3] == None:
pyautogui.alert(f'第{error_row_num}行={row}的前四列格式错误, Value缺失', '提示')
sys.exit()
if row[4] == None:
pyautogui.alert(f'第{error_row_num}行={row}的前五列格式错误, PCB Footprint缺失', '提示')
sys.exit()
error_row_num += 1
# pyautogui.alert('此BOM表格式正确!', '确认')
标准化电容值函数:
def convert_capacitance_unit(value):
cap_unit_ls = ['mF', 'uF', 'nF', 'pF', 'fF']
cap_value = 0.0
index = 0
cap_other = ''
for j in range(len(cap_unit_ls)):
for i in range(len(value)):
if value[i : i+2] == cap_unit_ls[j]:
cap_value = float(value[:i])
index = j
cap_other = value[i+2:]
break
if cap_value != 0.0:
break
if cap_value >= 1000:
cap_value = cap_value / 1000
index = index - 1
elif cap_value < 1:
cap_value = cap_value * 1000
index = index + 1
else:
pass
if cap_value.is_integer():
cap_value = int(cap_value)
value = str(cap_value) + cap_unit_ls[index] + cap_other
return value
显然,使用CIS数据库的原理图设计方式是更具优势的,但元器件数据库需要专人维护,通常只有大公司才能负担得起,小公司一般还是使用的普通原理图设计方式,通常一些电路经过多人修改后,风格会非常混乱,整理BOM会花费大量时间,这部分工作枯燥且易出错,而使用Python脚本就能一步到位,所以,这里将我编写的BOM整理脚本分享出来,供需要的同学使用。
分享的文件包含脚本源文件Cadence Orcad BOM整理.py已经需要安装的库文件列表requirements.txt,如下图所示。
对于Python小白,你需要先下载安装Python,参考:Python下载与安装教程_徐晓康的博客。
然后在命令行中运行以下命令,注意更改requirements.txt的路径,等待脚本运行需要的库安装成功。
pip install -r C:\Users\xu\Desktop\Cadence Orcad BOM整理脚本\requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/
请注意,要直接使用本脚本需要满足以下三个条件:
推荐使用Vscode查看、修改与运行Python脚本。
对改进脚本有兴趣的同学可以私信我。
欢迎大家关注我的公众号:徐晓康的博客,回复以下四位数字获取。
5101
建议复制过去不会码错字!
此脚本也分享在Gitee上:Cadence Orcad BOM处理 (gitee.com)。
徐晓康的博客持续分享高质量硬件、FPGA与嵌入式知识,软件,工具等内容,欢迎大家关注。