mirror of
https://github.com/dptech-corp/Uni-Lab-OS.git
synced 2026-02-04 05:15:10 +00:00
2.8 KiB
2.8 KiB
电池组装资源冲突问题修复说明
问题描述
在运行 func_allpack_cmd 函数时,遇到以下错误:
ValueError: Resource 'battery_0' already assigned to deck
错误位置:coin_cell_assembly.py 第 849 行
liaopan3.children[self.coin_num_N].assign_child_resource(battery, location=None)
原因分析
-
资源名称冲突:
- 每次创建电池资源使用固定格式
battery_{coin_num_N} - 如果程序重启或断点恢复,
coin_num_N可能重置为 0 - Deck 上可能已存在
battery_0等同名资源
- 每次创建电池资源使用固定格式
-
缺少冲突处理:
- 在分配资源前没有检查目标位置是否已有资源
- 没有清理机制来移除旧资源
解决方案
1. 使用时间戳确保资源名称唯一
# 之前
battery = ElectrodeSheet(name=f"battery_{self.coin_num_N}", ...)
# 修复后
timestamp_suffix = datetime.now().strftime("%Y%m%d_%H%M%S_%f")
battery_name = f"battery_{self.coin_num_N}_{timestamp_suffix}"
battery = ElectrodeSheet(name=battery_name, ...)
2. 添加资源冲突检查和清理
# 检查目标位置是否已有资源
target_slot = liaopan3.children[self.coin_num_N]
if target_slot.children:
logger.warning(f"位置 {self.coin_num_N} 已有资源,将先卸载旧资源")
try:
# 卸载所有现有子资源
for child in list(target_slot.children):
target_slot.unassign_child_resource(child)
logger.info(f"已卸载旧资源: {child.name}")
except Exception as e:
logger.error(f"卸载旧资源时出错: {e}")
3. 增强错误处理
# 分配新资源到目标位置
try:
target_slot.assign_child_resource(battery, location=None)
logger.info(f"成功分配电池 {battery_name} 到位置 {self.coin_num_N}")
except Exception as e:
logger.error(f"分配电池资源失败: {e}")
raise
修复效果
✅ 不再出现重复资源名称错误
- 每个电池资源都有唯一的时间戳后缀
- 即使
coin_num_N相同,资源名称也不会冲突
✅ 自动清理旧资源
- 在分配新资源前检查目标位置
- 自动卸载已存在的旧资源
✅ 增强日志记录
- 记录资源卸载操作
- 记录资源分配成功/失败
- 便于调试和问题追踪
测试建议
-
正常运行测试:
workstation.func_allpack_cmd( elec_num=1, elec_use_num=1, elec_vol=20, file_path="..." ) -
断点恢复测试:
- 运行一次后中断
- 再次运行相同参数
- 验证不会出现资源冲突错误
-
连续运行测试:
- 连续多次运行
- 验证每次都能正常分配资源
相关文件
coin_cell_assembly.py- 第 838-875 行(func_pack_get_msg_cmd函数)