You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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. 拆分类属性:把数值型的充电功率单独存为类实例属性,充电桩资源单独初始化,单桩的并发容量设为1即可
  2. 修正SoC计算逻辑:当前存储的电能 = 电池容量 * 当前SoC / 100,每分钟充入电能 = 每小时充电功率 / 60,充入后新的电能值不能超过电池总容量,最后再换算回百分比SoC
  3. 给充电过程增加时间步进逻辑,仿真每分钟的充电过程,直到电池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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 23:24:14