文件名称:EMS 并离网切换单一功能开发文档
文档类型:功能开发标准文档
适用范围:工商业储能 EMS / 微电网控制 / 并网点断路器联锁控制
版本:V1.0
状态:开发基线1. 文档目的
本文档用于定义 EMS 中“并离网切换”这一单一功能的完整开发基线,覆盖:
- 功能目标
- 控制边界
- 术语与对象定义
- 系统架构
- 状态机
- 联锁逻辑
- I/O 与通信映射
- UI 交互
- 告警与日志
- 故障策略
- 测试要求
- 交付边界
- 伪代码与数据结构建议
本文档以现有 Notion 检索到的内部材料为主要素材来源,特别吸收以下理论与结构基础:
- Trip 必须由继电器本地执行,Close 必须由 EMS 授权执行
- 并离网切换必须具备反孤岛、反逆流、重并网联锁与同步判定
- 重合闸必须禁止继电器自主闭合
- 必须具备双路径感知、闭环反馈、日志追溯、失效闭锁
- 必须形成 UI、逻辑引擎、I/O 执行、物理断路器之间的完整闭环
2. 适用对象与边界声明
本文档适用于以下对象:
- EMS 软件开发
- HMI / Web UI 开发
- EMS 控制器逻辑开发
- I/O 映射开发
- PCS/BESS 接口开发
- 并网保护接口开发
- FAT/SAT 测试设计
本文档不涵盖以下责任:
- 最终持牌电气设计
- Utility 合规签章
- 保护定值最终设定
- 现场施工图
- 继电器厂家内部逻辑实现
- EPC 最终 wiring as-built 责任
- 断路器、继电器、PCS 的厂家认证责任
本文件仅定义 EMS 单一功能的开发标准与接口逻辑,不承担 EOR、施工或法规签章责任。
3. 功能定义
“并离网切换”是指 EMS 对以下过程进行感知、判断、联锁、授权、执行与记录的单一功能模块:
电网正常并网
↓
检测电网异常 / 失网 / 孤岛风险
↓
执行解列(Trip)
↓
判断是否允许进入离网运行
↓
维持离网状态 / 孤岛状态
↓
检测电网恢复
↓
验证重并网前提
↓
执行重并网(Close)
↓
恢复并网运行该功能不是单纯的“开关控制”,而是一个完整的闭环控制能力,必须同时具备:
- 感知
- 决策
- 联锁
- 执行
- 反馈
- 告警
- 记录
- 权限控制
- 失败闭锁
4. 设计原则
4.1 总原则
Trip 快速、硬件优先、本地优先
Close 慢速、策略优先、EMS 授权优先4.2 核心原则
- 跳闸必须不依赖 EMS 在线
- 合闸必须依赖 EMS 授权
- 合闸前必须满足完整联锁条件
- 继电器不得拥有自主重合闸权
- 所有关键动作必须可追溯
- 所有关键闭锁必须可解释
- 所有失效场景默认不允许 Close
- UI 显示必须与物理反馈一致,禁止盲显
- 并离网切换逻辑必须与 BESS/PCS 运行状态耦合
- 任何缺失数据、冲突数据、链路异常,默认转为保守闭锁
5. 功能目标
5.1 主要目标
- 在电网异常时,实现快速、可靠、可追溯的解列
- 在解列后,判断是否允许进入离网供电状态
- 在电网恢复后,实现受控、联锁、同步、可审计的重并网
- 保证断路器闭合权只属于 EMS
- 保证系统在数据缺失或控制链故障时保持 Fail-Safe
5.2 子目标
- 实现反孤岛逻辑
- 实现反逆流逻辑
- 实现并网恢复联锁
- 实现同步校验闭锁
- 实现 BESS/PV 状态约束
- 实现用户权限约束
- 实现 UI 与物理反馈闭环
- 实现日志与告警追溯
6. 术语定义
EMS Energy Management System
BESS Battery Energy Storage System
PCS Power Conversion System
POI Point of Interconnection,并网点
AIPP Anti-Islanding Protection Panel
Trip 分闸 / 跳闸 / 解列动作
Close 合闸 / 重并网动作
Grid-Tie 并网运行状态
Island 离网 / 孤岛运行状态
Zero Export 零反送 / 不向电网反送功率
ROCOF 频率变化率
52a 断路器合位反馈辅助接点
52b 断路器分位反馈辅助接点
DI Digital Input
DO Digital Output
Interposing Relay 中间继电器
Sync 同步检查7. 系统角色与控制边界
7.1 控制分层
L1 感知层
├─ 并网保护继电器
├─ 电表 / 冗余测量表
├─ 断路器 52a/52b
└─ PCS/BESS 状态反馈
L2 决策层
└─ EMS 控制器策略引擎
L3 输出层
├─ EMS DO
└─ 中间继电器
L4 执行层
├─ 主断路器 Trip Coil
├─ 主断路器 Close Coil
└─ PCS/BESS 启停与模式切换接口
L5 展示层
└─ EMS UI / HMI / Web 界面7.2 角色边界
继电器职责
├─ 电网异常检测
├─ 反孤岛主触发
└─ 本地 Trip 执行
EMS 职责
├─ 状态整合
├─ 联锁判断
├─ Close 授权
├─ UI 控制
├─ 告警日志
├─ 离网许可判断
└─ BESS/PV 协同控制
断路器职责
├─ 执行物理解列
├─ 执行物理重并网
└─ 提供位置反馈
PCS/BESS 职责
├─ 提供运行状态
├─ 接受停机/待机/并网/离网模式控制
└─ 提供输出功率与模式反馈7.3 硬边界规定
Trip 权限:继电器主导,EMS可冗余,但不得依赖 EMS 才能跳
Close 权限:仅 EMS
Auto Reclose:严格禁止
Bypass Close:严格禁止
Relay Autonomous Close:严格禁止8. 功能架构
并离网切换功能
├─ F1 电网状态检测
│ ├─ 电压检测
│ ├─ 频率检测
│ ├─ 相位检测
│ ├─ ROCOF 检测
│ └─ 电网稳定计时
├─ F2 反孤岛解列
│ ├─ 越限解列
│ ├─ 无压解列
│ ├─ ROCOF 解列
│ ├─ Trip 执行确认
│ └─ EMS 事件同步
├─ F3 离网准入控制
│ ├─ BESS 可离网能力判断
│ ├─ SOC 判断
│ ├─ PCS 模式判断
│ ├─ 关键负载支撑判断
│ └─ Island Start Permit
├─ F4 反逆流控制
│ ├─ POI 功率方向判断
│ ├─ Zero Export 策略使能
│ ├─ 输出归零验证
│ └─ 重并网前逆流闭锁
├─ F5 重并网联锁
│ ├─ Grid Stable
│ ├─ Zero Export / Inflow
│ ├─ BESS/PV Stop or Standby
│ ├─ EMS Close Authorization
│ ├─ Sync Complete
│ ├─ Breaker Open Confirm
│ └─ User Permission Check
├─ F6 动作执行
│ ├─ Open Breaker
│ ├─ Close Breaker
│ ├─ Start BESS Island
│ ├─ Start PV Island
│ ├─ Start BESS Grid-Tie
│ └─ Start PV Grid-Tie
├─ F7 UI 与告警
│ ├─ 状态显示
│ ├─ 条件显示
│ ├─ 主阻塞原因显示
│ ├─ 动作建议显示
│ └─ 权限与确认交互
└─ F8 日志与追溯
├─ 事件日志
├─ 动作日志
├─ 条件快照
├─ 用户日志
└─ 故障日志9. 外部接口定义
9.1 继电器接口
继电器至少应提供:
输入到 EMS
├─ Grid Voltage
├─ Grid Frequency
├─ ROCOF
├─ Grid Healthy / Abnormal
├─ Trip Trigger Code
└─ Relay Fault / Comm Status
输出到断路器
└─ Trip Coil 驱动说明:
- 继电器负责快速异常检测与 Trip 触发
- 继电器只允许 Trip,不允许 Close
- 若继电器存在自主重合闸逻辑,必须禁用;若无法禁用,则该设备不得用于本功能 Close 链路
9.2 电表/冗余测量接口
推荐提供:
输入到 EMS
├─ POI Active Power
├─ Reverse Power Flag
├─ Grid Voltage
├─ Grid Frequency
├─ Phase Angle / Sync Info(如有)
└─ Meter Comm Status用途:
- 作为继电器之外的冗余感知路径
- 用于 Zero Export 验证
- 用于感知冲突检测
9.3 断路器接口
输出自 EMS
├─ DO_Open_Breaker
└─ DO_Close_Breaker
输入到 EMS
├─ DI_52a_Breaker_Closed
├─ DI_52b_Breaker_Open
├─ Coil Ready / Spring Charged(如有)
└─ Breaker Fault(如有)9.4 PCS/BESS 接口
输入到 EMS
├─ BESS Running Status
├─ PCS Running Status
├─ Grid-Forming Ready
├─ Grid-Following Ready
├─ Output Power
├─ SOC
├─ Alarm / Fault
├─ Standby Status
└─ Sync Ready(如由 PCS 提供)
输出自 EMS
├─ CMD_Stop_BESS
├─ CMD_Start_BESS_Island
├─ CMD_Start_BESS_GridTie
├─ CMD_Stop_PV
├─ CMD_Start_PV_Island
└─ CMD_Start_PV_GridTie10. 运行状态定义
10.1 顶层运行状态
S0 INIT 初始化
S1 GRID_TIED 正常并网
S2 TRIP_PENDING 异常检测到,等待 Trip 结果确认
S3 ISOLATED 已解列,尚未进入离网
S4 ISLAND_READY 允许离网启动
S5 ISLAND_RUNNING 离网运行中
S6 GRID_RECOVERY_WAIT 电网恢复观察中
S7 RECLOSE_READY 满足重并网基础条件
S8 RECLOSE_BLOCKED 存在闭锁,禁止合闸
S9 RECLOSE_EXECUTING 正在执行合闸
S10 GRID_RESTORED 已恢复并网
S11 FAULT_LOCKED 故障锁定10.2 状态迁移树
S1 GRID_TIED
├─ 电网异常 → S2 TRIP_PENDING
│ ├─ Trip 成功 → S3 ISOLATED
│ │ ├─ Island Permitted → S4 ISLAND_READY
│ │ │ └─ 启动成功 → S5 ISLAND_RUNNING
│ │ └─ Island Not Permitted → 保持 S3
│ └─ Trip 失败 → S11 FAULT_LOCKED
└─ 正常保持
S3 / S5
└─ 电网恢复稳定 → S6 GRID_RECOVERY_WAIT
├─ 稳定计时完成 → 联锁检查
│ ├─ 全满足 → S7 RECLOSE_READY
│ │ └─ EMS 授权并执行 → S9 RECLOSE_EXECUTING
│ │ ├─ 合闸成功 → S10 GRID_RESTORED → S1 GRID_TIED
│ │ └─ 合闸失败 → S11 FAULT_LOCKED
│ └─ 任一不满足 → S8 RECLOSE_BLOCKED
└─ 再次异常 → 返回 S3 或 S511. 条件代码体系
为保证 UI、逻辑、日志一致,定义统一条件代码。
11.1 反孤岛自动解列条件 A 组
A1 Grid voltage/frequency exceeds limit
A2 Grid power outage (no voltage)
A3 ROCOF >= threshold
A4 Trip action completed
A5 Trip signal reported to EMS
A6 Island mode startup permitted定义:
A1:电网电压或频率越限
A2:电网无压 / 失网
A3:频率变化率超过阈值
A4:跳闸动作已确认完成
A5:跳闸事件已同步到 EMS
A6:允许启动离网模式11.2 反逆流条件 R 组
R1 Reverse power detected at POI
R2 PV/BESS output power = 0
R3 EMS enabled "Zero Export" strategy定义:
R1:POI 处检测到逆功率
R2:PV/BESS 输出功率归零
R3:EMS 已启用零反送策略11.3 重并网联锁条件 C 组
推荐统一使用 7 项条件,兼容已检索文档中的 C1-C7 体系。
C1 Grid stable >= 60s
C2 Power flow is inflow or zero export
C3 PV/BESS is stopped or in standby
C4 EMS authorized breaker close
C5 Phase/frequency sync complete
C6 Breaker is confirmed open
C7 User permission valid定义:
C1:电网电压/频率/相位稳定持续至少 60 秒
C2:POI 功率方向为流入或零反送
C3:BESS/PV 已停止或待机
C4:EMS 已授权合闸
C5:相位/频率同步完成
C6:断路器当前确认处于分位
C7:当前用户具备合闸权限12. 状态判定逻辑
12.1 Grid Abnormal 判定
Grid_Abnormal = A1 OR A2 OR A312.2 Trip 完成判定
Trip_Completed = Trip_Command_Sent AND DI_52b_Breaker_Open = TRUE若使用双反馈:
Trip_Completed = Trip_Command_Sent
AND DI_52b_Breaker_Open = TRUE
AND DI_52a_Breaker_Closed = FALSE12.3 Island Permit 判定
Island_Permit = BESS_GridForming_Ready
AND SOC >= Island_Min_SOC
AND PCS_No_Fault
AND Load_Transfer_Condition_OK
AND Breaker_Open_Confirmed如项目早期未做负载分区,可保留 Load_Transfer_Condition_OK = Configurable。
12.4 Reverse Power 判定
Reverse_Power = POI_Active_Power < ReversePowerThreshold建议阈值参数化:
ReversePowerThreshold = -X kW12.5 Zero Export 满足判定
Zero_Export_Satisfied = abs(POI_Active_Power) <= ZeroExportTolerance12.6 Sync Complete 判定
Sync_Complete =
abs(Grid_Frequency - Microgrid_Frequency) <= Sync_Freq_Delta_Max
AND abs(Grid_Voltage - Microgrid_Voltage) <= Sync_Volt_Delta_Max
AND abs(Grid_Phase_Angle - Microgrid_Phase_Angle) <= Sync_Phase_Delta_Max
AND Sync_Stable_Timer >= Sync_Stable_Time13. 动作逻辑
13.1 Open Breaker 动作逻辑
来源可能有三类:
来源1:继电器自动 Trip
来源2:EMS 冗余 Trip
来源3:用户手动 Open Breaker统一结果要求:
执行 Open Breaker
↓
等待 52b = TRUE
↓
确认 52a = FALSE
↓
记录 Trip 完成
↓
进入解列后状态13.2 Start BESS Island 动作逻辑
前提:
A6 = TRUE
Breaker_Open_Confirmed = TRUE
PCS/BESS 无故障
SOC 满足条件
动作:
发送 CMD_Start_BESS_Island
等待 PCS 反馈 Island Running
记录结果13.3 Close Breaker 动作逻辑
前提:
C1 AND C2 AND C3 AND C4 AND C5 AND C6 AND C7 = TRUE
动作:
发送 DO_Close_Breaker
等待 52a = TRUE
确认 52b = FALSE
记录 Close 成功
切换系统状态为 Grid-Tied13.4 Close 失败逻辑
若 Close_Command_Sent 后超时未收到 52a=TRUE
→ Close Failed
→ 记录错误
→ UI 红色告警
→ 进入 FAULT_LOCKED14. 完整联锁逻辑
14.1 Close 总联锁表达式
Close_Permit = C1 AND C2 AND C3 AND C4 AND C5 AND C6 AND C714.2 Close 按钮使能逻辑
UI_Close_Button_Enabled = Close_Permit
AND System_Not_Fault_Locked
AND Comm_Healthy
AND UPS_Healthy14.3 Start Island 按钮使能逻辑
UI_Start_BESS_Island_Enabled = A6
AND Breaker_Open_Confirmed
AND BESS_Not_Running_Island
AND PCS_Healthy14.4 Open Breaker 按钮使能逻辑
UI_Open_Breaker_Enabled = Breaker_Not_Open
AND User_Has_Open_Permission15. UI 开发规范
15.1 页面目标
UI 必须做到:
- 当前状态可见
- 条件状态可见
- 阻塞原因可见
- 动作可用性可见
- 风险提示可见
- 日志与事件可追溯
15.2 页面结构
Grid-Tie / Island Transition 页面
├─ 顶部系统状态栏
│ ├─ Breaker 状态
│ ├─ Grid Voltage
│ ├─ Grid Frequency
│ └─ 当前控制模式
├─ Anti-Islanding 区块
│ ├─ A1-A6 条件显示
│ └─ Open / Start Island 按钮
├─ Anti-Reverse Power 区块
│ ├─ R1-R3 条件显示
│ └─ 动作建议
├─ Grid Reconnection 区块
│ ├─ C1-C7 条件显示
│ └─ Close / Stop / Start GridTie 按钮
├─ Primary Blocking Condition 区块
├─ Action Suggestion 区块
└─ Event / Operation Log 区块15.3 状态颜色规范
绿色:Satisfied / Enabled / Healthy / Completed
橙色:Not Triggered / Waiting / Pending / Warning
红色:Not Allowed / Not Satisfied / Fault / Blocked
灰色:Unknown / Disabled / No Data / Inactive15.4 UI 显示要求
每个条件必须显示:
代码 + 描述 + 当前状态 + 可选的说明文字示例:
C3 PV/BESS is stopped or in standby
Status: Not Satisfied
Description: BESS is still running15.5 主阻塞条件显示要求
必须显式提供一个“主阻塞条件”区域,选择最关键的当前阻塞项。
示例:
PRIMARY BLOCKING CONDITION
C3 - BESS still running15.6 动作建议显示要求
必须基于当前闭锁生成顺序化建议。
示例:
Action Suggestion
1. Force Stop BESS
2. Confirm PV output = 0
3. Wait for phase/frequency sync
4. Request EMS breaker close authorization15.7 权限要求
一般用户
├─ 查看状态
├─ 查看日志
└─ 可执行 Open(按策略决定)
管理员
├─ 拥有一般用户全部权限
├─ 可执行 Close 授权
├─ 可执行强制停机
└─ 可执行模式切换Close 至少需要:
C7 = TRUE16. 事件与日志设计
16.1 日志分类
系统日志
动作日志
联锁日志
故障日志
权限日志
通信日志16.2 必须记录的事件
Grid abnormal detected
Trip command issued
Trip action completed
Trip failed
Island permit granted
Island start command issued
Island running confirmed
Grid stable timer started
Grid stable timer completed
Close blocked
Close authorized
Close command issued
Close completed
Close failed
Relay comm lost
Meter comm lost
Breaker feedback mismatch
UPS low / UPS lost
User login / user authorization / user action16.3 日志字段标准
{
"timestamp": "2026-04-07T18:00:00Z",
"event": "Close_Blocked",
"severity": "Warning",
"state": "RECLOSE_BLOCKED",
"blocking_code": "C3",
"message": "BESS is still running",
"user": "admin",
"breaker_52a": false,
"breaker_52b": true,
"grid_voltage": 479.2,
"grid_frequency": 59.98,
"poi_power_kw": -2.1
}16.4 联锁失败记录要求
任何一个 C 条件不满足时,必须记录:
- 条件代码
- 实际测量值
- 阈值
- 数据来源
- 阻塞时间戳
17. 告警与故障策略
17.1 故障分类
F01 EMS controller offline
F02 Relay failure
F03 Meter offline
F04 DO output failure
F05 UPS lost
F06 52a/52b inconsistent
F07 Trip failed
F08 Close criteria not met
F09 Sync data invalid
F10 PCS/BESS status unavailable17.2 故障响应原则
影响 Trip 的故障:优先由继电器本地保护兜底
影响 Close 的故障:一律禁止 Close
影响反馈的故障:禁止盲操作
影响同步的故障:禁止 Close
影响权限的故障:禁止 Close17.3 Fail-Safe 规则
任一关键输入缺失
任一关键通信中断
任一关键反馈冲突
任一关键 UPS 失效
任一关键执行输出失败
→ 默认 Close_Permit = FALSE17.4 反馈冲突规则
若 52a = TRUE 且 52b = TRUE
→ Feedback Error
→ Close 禁止
→ Open 状态未知
→ 记录故障
若 52a = FALSE 且 52b = FALSE 且超时
→ Breaker Position Unknown
→ Close 禁止17.5 感知冲突规则
继电器判定 Grid Healthy
但电表判定 Reverse Power 或电网异常
→ 标记 Data Conflict
→ Close 禁止
→ 记录冲突18. 参数体系
18.1 必须参数化的阈值
Grid_OverVoltage_Limit
Grid_UnderVoltage_Limit
Grid_OverFrequency_Limit
Grid_UnderFrequency_Limit
ROCOF_Threshold
Grid_Stable_Time
ZeroExportTolerance
ReversePowerThreshold
Island_Min_SOC
Sync_Freq_Delta_Max
Sync_Volt_Delta_Max
Sync_Phase_Delta_Max
Sync_Stable_Time
Trip_Timeout
Close_Timeout
Comm_Timeout18.2 推荐默认参数占位
Grid_Stable_Time = 60s
ZeroExportTolerance = ±50W 或按站点参数
Island_Min_SOC = 30%
Sync_Phase_Delta_Max = 5°说明:
- 具体数值必须参数化,不允许硬编码死写在业务逻辑中
- 最终工程阈值由项目参数表确定,不由 UI 写死
19. I/O 建议映射
19.1 DI 映射建议
DI1 Breaker_52a_Closed
DI2 Breaker_52b_Open
DI3 Breaker_Spring_Charged
DI4 Relay_Healthy
DI5 UPS_Healthy
DI6 PCS_Ready
DI7 PCS_Standby
DI8 PCS_Island_Running
DI9 PCS_GridTie_Running
DI10 Emergency_Stop_Active19.2 DO 映射建议
DO1 Open_Breaker_Command
DO2 Close_Breaker_Command
DO3 Stop_BESS_Command
DO4 Start_BESS_Island_Command
DO5 Start_BESS_GridTie_Command
DO6 Stop_PV_Command
DO7 Start_PV_Island_Command
DO8 Start_PV_GridTie_Command20. 通信点位建议
Modbus / TCP 点位
├─ Relay.GridVoltage
├─ Relay.GridFrequency
├─ Relay.ROCOF
├─ Relay.GridHealthy
├─ Relay.TripEventCode
├─ Relay.CommHealthy
├─ Meter.POI_ActivePower
├─ Meter.GridVoltage
├─ Meter.GridFrequency
├─ Meter.ReversePowerFlag
├─ Meter.CommHealthy
├─ PCS.Status
├─ PCS.Mode
├─ PCS.OutputPower
├─ PCS.SOC
├─ PCS.Fault
├─ PCS.SyncReady
└─ PCS.GridFormingReady21. 推荐数据模型
21.1 并离网功能状态对象
{
"breaker": {
"opened": true,
"closed": false,
"position_known": true
},
"grid": {
"voltage": 480.1,
"frequency": 60.00,
"healthy": true,
"stable_seconds": 61
},
"anti_islanding": {
"A1": false,
"A2": false,
"A3": false,
"A4": true,
"A5": true,
"A6": false
},
"reverse_power": {
"R1": false,
"R2": false,
"R3": true
},
"reclose": {
"C1": true,
"C2": true,
"C3": false,
"C4": false,
"C5": false,
"C6": true,
"C7": true
},
"blocking": {
"primary_code": "C3",
"message": "BESS is still running"
}
}22. 伪代码设计
22.1 主循环
def evaluate_grid_tie_island_transition(ctx):
refresh_inputs(ctx)
evaluate_A_group(ctx)
evaluate_R_group(ctx)
evaluate_C_group(ctx)
evaluate_state_machine(ctx)
evaluate_button_enablement(ctx)
update_ui_model(ctx)
write_event_logs_if_needed(ctx)22.2 A 组判定
def evaluate_A_group(ctx):
ctx.A1 = voltage_or_frequency_exceeds_limit(ctx)
ctx.A2 = grid_power_outage(ctx)
ctx.A3 = rocof_exceeds_threshold(ctx)
ctx.A4 = trip_action_completed(ctx)
ctx.A5 = trip_reported_to_ems(ctx)
ctx.A6 = island_mode_startup_permitted(ctx)22.3 R 组判定
def evaluate_R_group(ctx):
ctx.R1 = reverse_power_detected(ctx)
ctx.R2 = pv_bess_output_zero(ctx)
ctx.R3 = zero_export_strategy_enabled(ctx)22.4 C 组判定
def evaluate_C_group(ctx):
ctx.C1 = grid_stable_for_required_time(ctx)
ctx.C2 = power_flow_inflow_or_zero_export(ctx)
ctx.C3 = pv_bess_stopped_or_standby(ctx)
ctx.C4 = ems_authorized_breaker_close(ctx)
ctx.C5 = phase_frequency_sync_complete(ctx)
ctx.C6 = breaker_open_confirmed(ctx)
ctx.C7 = user_permission_valid(ctx)
ctx.close_permit = all([ctx.C1, ctx.C2, ctx.C3, ctx.C4, ctx.C5, ctx.C6, ctx.C7])22.5 主阻塞条件选择
def pick_primary_blocking_condition(ctx):
order = ["C3", "C5", "C4", "C2", "C1", "C6", "C7"]
for code in order:
if getattr(ctx, code) is False:
return code, blocking_message_for(code, ctx)
return None, None22.6 Close 执行
def execute_close_breaker(ctx):
if not ctx.close_permit:
raise BlockedError("Close permit not satisfied")
send_do_close_breaker()
start_timer("close_timeout")
while not timer_expired("close_timeout"):
refresh_breaker_feedback(ctx)
if ctx.breaker_52a and not ctx.breaker_52b:
log_event("Close_Completed")
return True
log_event("Close_Failed")
lock_fault_state(ctx)
return False23. 页面按钮行为规范
23.1 Open Breaker
点击后:
1. 校验权限
2. 发送 Open 命令或记录用户请求
3. 等待反馈
4. 更新 UI
5. 记录日志23.2 Start BESS Island
点击后:
1. 校验 A6
2. 校验 Breaker 已打开
3. 校验 BESS 可离网
4. 发送启动命令
5. 等待运行反馈
6. 记录日志23.3 Close Breaker
点击后:
1. 校验 C1-C7
2. 二次确认
3. 发送 Close 命令
4. 等待 52a / 52b 反馈
5. 成功则切换状态
6. 失败则闭锁并告警23.4 Force Stop BESS / PV
必须满足:
管理员权限
设备在线
当前无硬件联锁禁止若无权限或站点配置禁用,按钮应灰显并显示原因。
24. 页面显示文案建议
24.1 顶部状态栏
Breaker: Opened / Closed / Unknown
Grid Voltage: 实时值或 -
Grid Frequency: 实时值或 -
Set mode: Relay Control / EMS Control24.2 条件显示模板
Code
Description
Status
Optional detail message24.3 阻塞提示模板
PRIMARY BLOCKING CONDITION
{ConditionCode} - {Message}24.4 动作建议模板
ACTION SUGGESTION
1. {建议1}
2. {建议2}
3. {建议3}25. 安全约束
25.1 禁止事项
禁止继电器自主 Close
禁止定时器盲重合闸
禁止在 52a/52b 未确认下盲合
禁止在 Sync 未完成下合闸
禁止在 BESS/PV 未停稳下合闸
禁止在 Reverse Power 未消除下合闸
禁止在用户权限不满足下合闸
禁止在关键通信故障下合闸25.2 强制闭锁场景
继电器离线
电表离线且站点要求双路径
52a/52b 冲突
UPS 故障
DO 模块故障
Close 线圈故障
Sync 数据无效
PCS 状态未知
BESS 故障26. 测试要求
26.1 FAT 测试范围
T1 正常并网状态显示
T2 电压越限触发 Trip
T3 无压触发 Trip
T4 ROCOF 触发 Trip
T5 Trip 动作反馈闭环
T6 Trip 事件同步 EMS
T7 Island Permit 正常判定
T8 Island Permit 拒绝判定
T9 Reverse Power 检测
T10 Zero Export 策略使能显示
T11 Grid Stable 60s 计时
T12 C1-C7 全部满足后允许 Close
T13 任一 C 条件不满足时禁止 Close
T14 主阻塞条件正确显示
T15 Action Suggestion 正确生成
T16 52a/52b 冲突时禁止 Close
T17 Meter 离线闭锁
T18 Relay 离线闭锁
T19 UPS 故障闭锁
T20 Close 成功闭环
T21 Close 失败告警
T22 用户权限校验
T23 日志完整性
T24 UI 与物理状态一致性26.2 SAT 测试重点
现场通信稳定性
真实断路器执行时间
真实 52a/52b 反馈有效性
PCS/BESS 模式切换反馈有效性
零反送阈值适配
同步条件适配
异常断电后 Fail-Safe 行为27. 配置项建议
27.1 站点级配置
{
"grid_stable_time_sec": 60,
"zero_export_tolerance_kw": 0.05,
"reverse_power_threshold_kw": -0.05,
"island_min_soc_percent": 30,
"sync_phase_delta_deg_max": 5,
"sync_freq_delta_hz_max": 0.1,
"sync_voltage_delta_percent_max": 5,
"close_timeout_sec": 10,
"trip_timeout_sec": 5,
"require_dual_sensing_for_close": true,
"require_admin_for_close": true
}27.2 功能开关建议
feature.dual_sensing_required
feature.allow_manual_open
feature.allow_force_stop_bess
feature.allow_force_stop_pv
feature.require_sync_check
feature.require_zero_export
feature.require_user_permission_for_close
feature.enable_primary_blocking_condition
feature.enable_action_suggestion28. 推荐开发目录结构
grid_tie_island_transition/
├─ domain/
│ ├─ models.py
│ ├─ enums.py
│ ├─ conditions.py
│ └─ state_machine.py
├─ services/
│ ├─ relay_service.py
│ ├─ meter_service.py
│ ├─ breaker_service.py
│ ├─ pcs_service.py
│ └─ permission_service.py
├─ logic/
│ ├─ anti_islanding.py
│ ├─ reverse_power.py
│ ├─ reclose_interlock.py
│ ├─ sync_check.py
│ └─ action_suggestion.py
├─ ui/
│ ├─ view_model.py
│ ├─ button_rules.py
│ └─ blocking_display.py
├─ logs/
│ ├─ event_logger.py
│ └─ audit_logger.py
├─ config/
│ └─ site_params.json
└─ tests/
├─ test_A_group.py
├─ test_R_group.py
├─ test_C_group.py
├─ test_state_machine.py
├─ test_ui_rules.py
└─ test_fail_safe.py29. 开发完成判定标准
满足以下条件,方可认为“并离网切换单一功能开发完成”:
1. A/R/C 条件判定全部实现
2. 状态机实现并通过测试
3. UI 页面实现完成
4. 主阻塞条件实现完成
5. Action Suggestion 实现完成
6. Open / Close / Start Island / Start GridTie 动作链实现
7. 断路器反馈闭环实现
8. 日志与审计实现
9. 权限控制实现
10. Fail-Safe 闭锁实现
11. 参数化配置实现
12. 单元测试与联调测试通过30. 最终开发基线总结
本功能的本质不是“做一个并离网页面”,
而是“做一套以 Trip 快速解列、以 Island 准入判断、以 Reverse Power 约束、
以 Reclose 多条件联锁、以 EMS 独占 Close 权限、以日志追溯和 Fail-Safe 为底座的完整闭环控制能力”。
该能力的最低开发基线必须包括:
感知层
决策层
联锁层
执行层
反馈层
UI 层
日志层
故障闭锁层
权限层
参数层
测试层31. 建议直接固化的核心逻辑
Trip = Relay First
Close = EMS Only
No Auto Reclose
No Blind Close
No Close When Data Missing
No Close When Feedback Conflicts
No Close When BESS/PV Still Running
No Close Without Sync
No Close Without Authorization32. 后续可扩展项
Phase 2 可扩展功能
├─ 关键负载切换
├─ 多断路器拓扑
├─ 多微网母线
├─ 柴油机并联系统
├─ 黑启动流程
├─ SCADA 上位写入
├─ 云端审计追溯
├─ 策略版本控制
└─ 站点级条件模板库