使用Python SimPy仿真电池充电触发TypeError如何修复
问题描述
我正在使用simpy开发电池充电仿真程序,仿真涉及的核心参数包括:
- 电池容量:单位为W
- 电池荷电状态(SoC):以百分比形式表示
- 充电桩充电功率:单位为W/h
初始实现代码如下:
import simpy import random battery_percentage = [] class ChargingCycle(object): def __init__(self, env, battery_capacity, SoC, charging_power): self.env = env self.battery_capacity = battery_capacity self.SoC = SoC self.charging_power = simpy.Resource(env,charging_power) def charge(self, battery): print(self.charging_power) power_per_minute = self.charging_power/60 charge_in_kw = (self.SoC/100)/self.battery_capacity charge_in_kw += power_per_minute self.SoC = charge_in_kw/self.battery_capacity*100 def start_charging(env, battery, charging): with charging.charging_power.request() as request: yield request yield env.process(charging.charge(battery)) def run_charging(env, battery_capacity, SoC, charging_power): charging = ChargingCycle(env, battery_capacity, SoC, charging_power) battery = 0 while True: yield env.timeout(1) battery += 1 env.process(start_charging(env, battery, charging)) def main(): env = simpy.Environment() env.process(run_charging(env,45000, 10, 7630)) env.run(until=360) if __name__ == "__main__": main()
原本的实现逻辑是按分钟粒度仿真,每分钟累加充电桩输出的充电量到charge_in_kw变量,同步更新电池的SoC数值。
报错信息
运行代码时触发如下类型错误:
File "c:\Users\sc57978\Desktop\OCPP\sim_charge.py", line 17, in charge power_per_minute = self.charging_power/60 TypeError: unsupported operand type(s) for /: 'Resource' and 'int'
错误提示不支持Resource类型和整数类型做除法运算。
问题修复
根因分析
报错的直接原因是ChargingCycle类的__init__方法中,错误将数值型的充电功率参数传入simpy.Resource构造函数,再把生成的Resource实例赋值给self.charging_power。后续执行除法运算时,操作数是SimPy资源对象而非功率数值,类型不匹配触发报错。
除此之外代码还有两处逻辑问题:
simpy.Resource的第二个入参是资源并发容量,即同时可服务的对象数量,传入7630相当于设置充电桩可同时给7630个电池充电,不符合实际场景- SoC计算逻辑颠倒,原始公式换算出来的电量数值完全错误,且充电方法没有设置仿真时间流逝,不符合离散事件仿真的运行规则
修复方案
- 拆分类属性:把数值型的充电功率单独存为类实例属性,充电桩资源单独初始化,单桩的并发容量设为1即可
- 修正SoC计算逻辑:当前存储的电能 = 电池容量 * 当前SoC / 100,每分钟充入电能 = 每小时充电功率 / 60,充入后新的电能值不能超过电池总容量,最后再换算回百分比SoC
- 给充电过程增加时间步进逻辑,仿真每分钟的充电过程,直到电池SoC达到100%
修复后的核心代码(ChargingCycle类部分):
class ChargingCycle(object): def __init__(self, env, battery_capacity, init_SoC, charging_power_per_hour): self.env = env self.battery_capacity = battery_capacity self.SoC = init_SoC # 单独保存功率数值,充电桩资源单独初始化,单桩同时服务1个电池 self.charging_power_per_hour = charging_power_per_hour self.charger = simpy.Resource(env, capacity=1) def charge(self, battery): power_per_minute = self.charging_power_per_hour / 60 # 循环充电直到SoC满电 while self.SoC < 100: # 仿真1分钟时间流逝 yield self.env.timeout(1) # 计算当前已存储电量 current_energy = self.battery_capacity * (self.SoC / 100) # 累加充入电量,不能超过电池总容量 current_energy = min(current_energy + power_per_minute, self.battery_capacity) # 同步更新SoC self.SoC = current_energy / self.battery_capacity * 100 print(f"仿真时间{self.env.now}分钟,电池{battery}当前SoC:{round(self.SoC,2)}%")
对应调整start_charging方法中的资源请求逻辑,将charging.charging_power.request()改为charging.charger.request()即可正常运行。
内容的提问来源于stack exchange,提问作者Geo30
相关产品推荐
相关产品推荐

