Files
Uni-Lab-OS/unilabos/devices/workstation/coin_cell_assembly/电池资源冲突修复说明.md
2026-01-07 11:59:32 +08:00

2.8 KiB
Raw Blame History

电池组装资源冲突问题修复说明

问题描述

在运行 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)

原因分析

  1. 资源名称冲突

    • 每次创建电池资源使用固定格式 battery_{coin_num_N}
    • 如果程序重启或断点恢复,coin_num_N 可能重置为 0
    • Deck 上可能已存在 battery_0 等同名资源
  2. 缺少冲突处理

    • 在分配资源前没有检查目标位置是否已有资源
    • 没有清理机制来移除旧资源

解决方案

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 相同,资源名称也不会冲突

自动清理旧资源

  • 在分配新资源前检查目标位置
  • 自动卸载已存在的旧资源

增强日志记录

  • 记录资源卸载操作
  • 记录资源分配成功/失败
  • 便于调试和问题追踪

测试建议

  1. 正常运行测试

    workstation.func_allpack_cmd(
        elec_num=1, 
        elec_use_num=1, 
        elec_vol=20, 
        file_path="..."
    )
    
  2. 断点恢复测试

    • 运行一次后中断
    • 再次运行相同参数
    • 验证不会出现资源冲突错误
  3. 连续运行测试

    • 连续多次运行
    • 验证每次都能正常分配资源

相关文件

  • coin_cell_assembly.py - 第 838-875 行(func_pack_get_msg_cmd 函数)