储能仿真系统-介绍与使用指南

📅 2026/6/27 17:51:09
储能仿真系统-介绍与使用指南
储能仿真系统-介绍与使用指南写在前面一、它能做什么二、5 分钟上手2.1 环境要求2.2 启动2.3 默认端口2.4 读一个点2.5 闭环控制6 步走三、主电气接线图在这里插入图片描述四、故障注入测试 EMS 的异常处理能力4.1 使用方法4.2 10 个故障场景4.3 两类命令的职责五、工况引擎自动化调控测试六、接入你的 EMS6.1 Python 示例30 分钟跑通6.2 C# 示例6.3 接入步骤七、版本与授权八、写在结尾延伸阅读同系列博客写在前面如果你正在自研 EMS大概率会遇到一个问题开环测试只能看遥测验证不了调控策略对不对。搭实物测试场动辄百万级大储规模更是不可能提供完善的测试环境。本文介绍一款储能仿真模拟器EssSimulator它在一台主机上模拟整个储能电站通过 Modbus TCP 对外暴露与真机一致的接口让你的 EMS 在无需实物的情况下完成闭环调控验证。本文覆盖它能做什么、怎么装、怎么用、怎么测异常工况。全程配截图位置说明方便你对照操作。一、它能做什么一句话用一台电脑仿真整个储能电站让 EMS 像连真机一样连上来读遥测、下发控制、跑闭环。核心能力闭环控制验证EMS 下发功率 → 仿真器按物理规律响应 → EMS 看到反馈验证调控策略是否正确。大储规模仿真支持多单元 × 多 PCS × 多 BMS × 多簇拓扑规模可配置。实物测试场根本搭不起的规模这里改个配置就行。物理仿真含 AC 潮流前推回代、Q-U 反馈、黑启动 V/f、励磁涌流、SOC 积分、PCS 爬坡——寄存器背后的数值有因果链不是随机数。点表驱动BMS / EMU / 电表点位由 CSV 定义可替换适配不同方案。故障注入模拟设备掉线、通讯中断、数据异常验证 EMS 的异常处理能力。二、5 分钟上手2.1 环境要求社区版无需安装 .NET下载解压直接运行自包含单文件开发版.NET 8 SDK2.2 启动# 社区版解压后./EssSimulator# 开发版dotnet run启动后进入控制台可视化界面。2.3 默认端口以默认 2 单元社区版配置为例设备端口用途电表simEm1500读 PCC 功率/电压BMS 路 1simBms11501读 SOC/电压写并网脉冲BMS 路 2simBms21502同上EMU 单元 1simEmu11601写 PCS 启停/功率/断路器EMU 单元 2simEmu21602同上默认监听127.0.0.1仅本机访问。远程访问走 SSH 隧道。2.4 读一个点# 读 BMS1 的 SOCyc7地址 10007FC4Scale 1000mbpoll-0-t3-a1-r10007-c1-p1501127.0.0.12.5 闭环控制6 步走合单元断路器 → 启动 PCS → BMS 并网 → 读 SOC → 下发功率 → 停机# 1. 合单元断路器EMU yx0FC5mbpoll-0-t0-a1-r1000-p1601-1127.0.0.11# 2. 启动 PCS1EMU yx3FC5mbpoll-0-t0-a1-r1003-p1601-1127.0.0.11# 3. BMS 一键并网BMS yx0FC5mbpoll-0-t0-a1-r1000-p1501-1127.0.0.11# 4. 读 SOCBMS yc7FC4mbpoll-0-t3-a1-r10007-c1-p1501127.0.0.1# 5. 下发有功 500kWEMU yt0FC6Scale 10 → 写 5000mbpoll-0-t4-a1-r40000-p1601-1127.0.0.15000# 6. 停机mbpoll-0-t4-a1-r40000-p1601-1127.0.0.10mbpoll-0-t0-a1-r1003-p1601-1127.0.0.10三、主电气接线图启动后选「主电气接线」进入可视化界面展示全站拓扑220kV 纵向主回路电网 → 主断/电表/主变35kV 母线并联负载 各储能单元并列挂接每个单元单元断 → 单元变 → 690V 母线 → PCS-A/B → BMS-A/B连接线表示电气通道│纵向主干、┬┴母线分支、│DC电池耦合四、故障注入测试 EMS 的异常处理能力这是 EMS 自研团队最关心的功能。模拟器提供 10 个标准故障场景一键执行验证 EMS 对设备掉线、通讯中断、数据异常的处理能力。4.1 使用方法在控制台命令输入菜单输入dpctest list autotest_fault_injection.json执行某个场景dpctest bms_offline_reconnect autotest_fault_injection.json4.2 10 个故障场景设备掉线类真通讯断开场景模拟内容EMS 应验证bms_offline_reconnectBMS1 掉线 15s 后恢复掉线检测、告警上报、恢复后数据刷新pcs_control_lostPCS 控制通道断开 15s 后恢复指令重发机制、控制状态同步em_offline_reconnect电表掉线 15s 后恢复计量数据丢失处理、PCC 监控降级multi_bms_offlineBMS1BMS2 同时掉线 20s批量故障告警、告警风暴抑制bms_restartBMS1 短暂掉线 2s 后恢复设备重启识别、快速重连intermittent_disconnectBMS1 反复掉线/上线 3 轮通讯抖动处理、连接去抖full_station_blackout全站设备同时掉线 20s全站失联处理、恢复顺序数据异常类通讯正常但值异常场景模拟内容EMS 应验证em_frequency_drift频率从 50→49.5 逐步漂移频率越限告警、低频保护em_power_jump有功从 -500→0→1000 突变功率突变检测、防误判bms_soc_freezeSOC 强制固定 50% 持续 60s数据停滞检测、SOC 异常告警[截图位置 10EMS 侧观测到设备掉线]建议截图内容在 EMS 端或 mbpoll 读点时看到 BMS1 的数据突然不更新或连接报错。说服力证明仿真器的掉线对 EMS 端是真 TCP 断开不是数据不变。4.3 两类命令的职责命令职责示例esscmd link设备离线/上线通讯断开esscmd link bms1 offdpc改点位值数据异常注入dpc simEm.yc19 set 49.95五、工况引擎自动化调控测试除了故障注入模拟器还内置 8 个标准调控工况用于验证 EMS 的正常调控能力工况验证什么功率阶跃-充电合闸→启动→并网→下发充电功率→断言有功跟踪到位功率阶跃-放电同上但反方向充放电循环充电→搁置→放电→搁置验证 SOC 往返与能量计量离网/并网切换并网运行→主断分→离网→主断合→恢复黑启动主断分→PCS 黑启动→软启动建压→断言母线带电SOC 均衡多路 BMS 不同 SOC 下小功率运行低电压穿越电网电压跌落→PCS 保持并网→恢复AGC 跟随模拟 AGC 指令序列验证功率跟踪精度工况跑完自动导出 CSV 报告步骤结果 时间序列 关键指标。六、接入你的 EMS6.1 Python 示例30 分钟跑通 EssSimulator EMS 接入示例Python / pymodbus30分钟快速上手1. 安装依赖pipinstallpymodbus2. 启动 EssSimulatordotnet run默认127.0.0.13. 运行本脚本python quickstart.py 本脚本演示完整的闭环控制流程 合主断/单元断 → 启动 PCS → BMS 并网 → 下发功率 → 读取反馈 → 停机 默认连接本地8单元配置EMU 端口1601BMS 端口1501。importtimeimportsys from pymodbus.clientimportModbusTcpClient# ---------- 配置 ----------HOST127.0.0.1EMU_PORT1601# EMU 单元 1承载 PCS1/PCS2 控制BMS_PORT1501# BMS 路 1承载并网控制SLAVE_ID1# EMU 控制点来自 emu.csv注意 -0 偏移pymodbus 地址 CSV Address - 1EMU_UNIT_BREAKER1000# yx0 高压断路器开合FC5 线圈EMU_PCS1_START1003# yx3 PCS1 启停FC5 线圈EMU_PCS1_POWER40000# yt0 PCS1 有功功率设置值FC6 保持寄存器Scale10# BMS 控制点来自 bms_bank.csvBMS_GRID_CONNECT1000# yx0 一键并网脉冲FC5 线圈# BMS 遥测点来自 bms_bank.csvFC4 输入寄存器BMS_SOC_ADDR10007# yc7 系统SOCScale1000u16def write_coil(client, address, value):写线圈FC5。pymodbus 用0-based 地址CSV 是1-based需 -1。 rrclient.write_coil(address -1, bool(value),slaveSLAVE_ID)ifrr.isError(): raise RuntimeError(f写线圈 {address} 失败: {rr})print(f 写线圈 {address} {int(value)})def write_register(client, address, value):写保持寄存器FC6。 rrclient.write_register(address -1, int(value),slaveSLAVE_ID)ifrr.isError(): raise RuntimeError(f写寄存器 {address} 失败: {rr})print(f 写寄存器 {address} {int(value)})def read_input_register(client, address,count1):读输入寄存器FC4。 rrclient.read_input_registers(address -1, count,slaveSLAVE_ID)ifrr.isError(): raise RuntimeError(f读输入寄存器 {address} 失败: {rr})returnrr.registers[0]ifcount1elserr.registers def read_holding_register(client, address,count1):读保持寄存器FC3。 rrclient.read_holding_registers(address -1, count,slaveSLAVE_ID)ifrr.isError(): raise RuntimeError(f读保持寄存器 {address} 失败: {rr})returnrr.registers[0]ifcount1elserr.registers def main(): emuModbusTcpClient(HOST, EMU_PORT,timeout5)bmsModbusTcpClient(HOST, BMS_PORT,timeout5)ifnot emu.connect(): print(f无法连接 EMU {HOST}:{EMU_PORT}请确认 EssSimulator 已启动)sys.exit(1)ifnot bms.connect(): print(f无法连接 BMS {HOST}:{BMS_PORT})sys.exit(1)print(f已连接 EMU({EMU_PORT}) 和 BMS({BMS_PORT})\n)try:# 1. 合单元高压断路器print([1/6] 合单元高压断路器)write_coil(emu, EMU_UNIT_BREAKER,1)time.sleep(1)# 2. 启动 PCS1print([2/6] 启动 PCS1)write_coil(emu, EMU_PCS1_START,1)time.sleep(1)# 3. BMS 一键并网脉冲print([3/6] BMS 一键并网)write_coil(bms, BMS_GRID_CONNECT,1)time.sleep(2)# 4. 读取当前 SOCprint([4/6] 读取 BMS SOC)raw_socread_input_register(bms, BMS_SOC_ADDR)socraw_soc /1000.0# Scale1000print(f 当前 SOC {soc:.3f} (raw{raw_soc}))# 5. 下发有功功率 500kWScale10 → 寄存器值 5000print([5/6] 下发 PCS1 有功 500kW)target_kw500write_register(emu, EMU_PCS1_POWER, target_kw *10)time.sleep(5)# 6. 停机print([6/6] 停机)write_register(emu, EMU_PCS1_POWER,0)time.sleep(1)write_coil(emu, EMU_PCS1_START,0)print(\n闭环示例完成。)except Exception as e: print(f\n执行异常: {e},filesys.stderr)sys.exit(1)finally: emu.close()bms.close()if__name____main__:main()示例代码完成完整闭环合断 → 启动 PCS → BMS 并网 → 读 SOC → 下发功率 → 停机。6.2 C# 示例// EssSimulator EMS 接入示例C# / NModbus // // 30 分钟快速上手 // 1. 创建一个控制台项目NuGet 安装 NModbus // 2. 把本文件复制进去dotnet run // // 本示例演示完整闭环合断 → 启动 PCS → BMS 并网 → 下发功率 → 读反馈 → 停机 using System; using System.Threading.Tasks; using NModbus; namespace EmsQuickstartCSharp { class Program { const string Host 127.0.0.1; const int EmuPort 1601; const int BmsPort 1501; const byte SlaveId 1; // EMU 控制点emu.csv地址为 1-basedNModbus 需 -1 const int EmuUnitBreaker 1000; // yx0 高压断路器FC5 线圈 const int EmuPcs1Start 1003; // yx3 PCS1 启停FC5 线圈 const int EmuPcs1Power 40000; // yt0 PCS1 有功设置FC6 保持寄存器Scale10 // BMS 控制点bms_bank.csv const int BmsGridConnect 1000; // yx0 一键并网脉冲FC5 线圈 // BMS 遥测点 const int BmsSocAddr 10007; // yc7 系统SOCFC4 输入寄存器Scale1000 static async Task Main(string[] args) { var emuFactory new NModbus.ModbusFactory(); var bmsFactory new NModbus.ModbusFactory(); using var emuTcp new System.Net.Sockets.TcpClient(Host, EmuPort); using var bmsTcp new System.Net.Sockets.TcpClient(Host, BmsPort); var emuMaster emuFactory.CreateMaster(emuTcp); var bmsMaster bmsFactory.CreateMaster(bmsTcp); Console.WriteLine($已连接 EMU({EmuPort}) 和 BMS({BmsPort})\n); // 1. 合单元高压断路器 Console.WriteLine([1/6] 合单元高压断路器); await emuMaster.WriteCoilAsync(SlaveId, EmuUnitBreaker - 1, true); await Task.Delay(1000); // 2. 启动 PCS1 Console.WriteLine([2/6] 启动 PCS1); await emuMaster.WriteCoilAsync(SlaveId, EmuPcs1Start - 1, true); await Task.Delay(1000); // 3. BMS 一键并网脉冲 Console.WriteLine([3/6] BMS 一键并网); await bmsMaster.WriteCoilAsync(SlaveId, BmsGridConnect - 1, true); await Task.Delay(2000); // 4. 读取 SOC Console.WriteLine([4/6] 读取 BMS SOC); var socRaw (await bmsMaster.ReadInputRegistersAsync(SlaveId, BmsSocAddr - 1, 1))[0]; double soc socRaw / 1000.0; Console.WriteLine($ 当前 SOC {soc:F3} (raw{socRaw})); // 5. 下发有功 500kWScale10 → 5000 Console.WriteLine([5/6] 下发 PCS1 有功 500kW); await emuMaster.WriteSingleRegisterAsync(SlaveId, EmuPcs1Power - 1, 500 * 10); await Task.Delay(5000); // 6. 停机 Console.WriteLine([6/6] 停机); await emuMaster.WriteSingleRegisterAsync(SlaveId, EmuPcs1Power - 1, 0); await Task.Delay(1000); await emuMaster.WriteCoilAsync(SlaveId, EmuPcs1Start - 1, false); Console.WriteLine(\n闭环示例完成。); } } }samples/ems-csharp/Quickstart.cs用 NModbus逻辑同 Python 版。6.3 接入步骤配置你的 EMS Modbus 主站指向模拟器 IP 和端口按你的 EMS 点表映射读写点位点表不同可替换 CSV先跑开环只读遥测确认数据合理再跑闭环下发控制观察反馈跑故障注入场景验证异常处理跑工况引擎对比你的 EMS 响应与预期七、版本与授权能力社区版标准版企业版储能单元数28不限闭环控制✓✓✓故障注入套件✓✓✓工况库基础全部全部自定义点表自定义✗✓✓商业使用✗✓✓社区版无 License 时自动进入 14 天试用模式限 2 单元。如需商业授权请联系我社区版下载链接八、写在结尾开环测试只能证明接口通了闭环测试才能证明调控策略对了。这款工具的存在意义就是让自研 EMS 团队在投入真机联调前先在软件环境里把闭环跑通把异常处理验证到位——省掉的不是测试本身而是百万级实物测试场的代价和上了现场才发现策略有 bug的风险。天道酬勤与君共勉延伸阅读同系列博客《储能仿真系统-困境和思考》《储能仿真系统-需求和设计》《储能仿真系统-功能和用途》《储能仿真系统-真实和虚拟》《储能仿真系统-总结和展望》暂无