title: 调度配置脚本化
为适应用户多变的调度需求,在EMS中实现了一套调度配置解析功能,通过云后台下发设备调度配置脚本给EMS,实现EMS的实时调度定制化功能。
sequenceDiagram
云后台-->>+EMS: 355 - 查询调度策略
EMS-->>-云后台: 356 - 响应当前调度策略
协议格式
请求
// 355 - 查询调度策略
{
opt: number, // 操作项:1-查询调度策略列表;2-查询调度策略详情
sn: string, // 设备序列号
// opt=2时,填写项
id: number // 指定调度策略ID
}
响应
// 356 - 能量调度策略查询应答
{
opt: number, // 操作项:1-查询调度策略列表;2-查询调度策略详情
result: number, // 请求结果:0-成功;1-失败
// opt=1时,返回项
current_id: number, // 当前应用的调度策略ID
list: [ // EMS存在的调度策略总表
{
id: number, // 调度策略ID
name: string, // 调度策略名
electricity_type: number, // 电价类型:1-分时电价;2-阶梯电价;3-固定电价;4-分时&阶梯电价;5-BB套餐;6-Peak Demand
reserved_soc: number, // 备电预留SOC(用户设定)
scheduling_type: number // 调度模式类型:1-TOU;2-自发自用;3-仅备电
},
...
],
// opt=2时,返回项
data: Schedule // 详细电度策略(后面章节详细介绍)
}
sequenceDiagram
云后台-->>+EMS: 357 - 增加调度策略
EMS-->>-云后台: 358 - 响应操作成功或失败
云后台-->>+EMS: 357 - 删除调度策略
EMS-->>-云后台: 358 - 响应操作成功或失败
云后台-->>+EMS: 357 - 切换当前调度策略
EMS-->>-云后台: 358 - 响应操作成功或失败
协议格式
请求
// 357 - 能量调度策略增加、删除和应用设置
{
opt: number, // 操作项:1-增加或编辑(覆盖);2-删除;3-切换当前调度策略
sn: string,
// opt=1时,填写项
data: Schedule, // 详细电度策略(后面章节详细介绍)
// opt=2时,填写项
id: number[], // 电度策略ID的数组,要删除的策略ID
// opt=3时,填写项
current_id: number // 需要切换的调度策略ID
}
响应
// 358 - 能量调度策略增加、删除和应用设置应答
{
opt: number, // 操作项:1-增加或编辑(覆盖);2-删除;3-切换当前调度策略
result: number // 操作结果:0-成功;1-失败
}
脚本数据基本格式为JSON格式
// Schedule
{
yearStra: number[], // 年策略选择表,表中数值代表策略ID,最多366个数据,每个数据代表1天,从1月1日开始。
calendar: // 日历表???
name: string, // 策略表名称
id: number, // 策略表ID
startTime: string, // 策略表生效时间,格式:“YYYY-MM-DD hh:mm:ss”,eg:”2024-03-05 13:41:00”,基于设备时区
duration: number, // 策略表生效持续时间,单位:秒,0表示生效后永久持续
intervalTime: number, // 间隔时间,单位:秒,默认0-无间隔 ???如何执行
startEvent: number, // 开始事件,被关联的事件触发后,执行本策略表。填写事件ID,默认0-无关联事件 ???理解是否正确
endEvent: number, // 结束事件,被关联的事件触发后,退出本策略表。填写事件ID,默认0-无关联事件 ???理解是否正确,退出会进入哪个策略表?
nextmode: number, // 事假退出后,运行的模式。默认2-自发自用模式(系统标准模式) ???是否可以填写策略ID,退到进入前的策略表?
electricity_type: number, // 电价类型:1-分时电价;2-阶梯电价;3-固定电价;4-分时&阶梯电价;5-BB套餐;6-Peak Demand
scheduling_type: number, // 调度模式类型:1-TOU;2-自发自用;3-仅备电
reserved_soc: number, // 备电预留SOC,默认20%,只支持整数,精度1%
loop: number, // 模式执行次数 ???如何理解这个循环
priority: number, // 模式优先级,可选,默认为 0,0 优先级最低,数字越⼤优先级越⾼ ???优先级如何应用?
env: number, // 模式使⽤条件,可选,默认为 0,⽬前包括是否安装光伏,是否允许馈⽹,是否允许电⽹充电。
// bit0~1:00,不涉及,01,未安装光伏,10,已安装光伏;
// bit2~bit3:00,不涉及,01,不允许馈⽹,10,允许馈⽹;
// bit4~bit5:00,不涉及,01,不允许电⽹充电,10,允许电⽹充电;其他预留
list: [ // 策略类型表,年策略选择表中使用的数据出自这个list,将策略设置到每一天
{
id: number, // 策略ID
season: string, // 季节名,也可以是别的名称,用于用户标识策略的范围,可自定义填写
dayType: string, // 日期类型,可自定义填写,一般为:workday、weekday、everyday等
list: [ // 时间段策略表,所有配置的时间需覆盖一整天
{
start_time: string, // 开始时间,格式:“hh:mm”
end_time: string, // 结束时间,格式:“hh:mm”,end_time需与下一个start_time重叠
flag: number, // 峰平⾕定义,可选,0:谷;1:平;2:峰;3:尖峰;4:低谷
name: string, // 时段名,可自定义,一般为:supper-off-peak、off-peak、mid-peak、on-peak、supper-on-peak等
describe: string, // 时段描述
solar_priority: [number, number, number], // 光伏供电优先级,[0]:市电, [1]:负载, [2]:FHP;优先级为0/1/2/3
// 可相同,若相同则表明需要按比例或者功率分配,0为不涉及,数字越大优先级越高
load_priority: [number, number, number], // 负载取电优先级,可选,[0]:市电, [1]:光伏, [2]:FHP;优先级为 0/1/2/3
// 可相同,若相同则表明需要按⽐例或者功率分配,0 为不涉及,数字越⼤优先级越⾼
grid_feed_max: number, // 电⽹允许最⼤馈⽹功率,0:不允许,-1:不限制,-2:未设置,可选,默认-2(aPbox 功率算在这⾥吗?不算)LoadSide也不算?
grid_max: number, // 电⽹允许最⼤取电功率,0:不允许,-1:不限制,可选,默认-1不限制 ???包括负载功率吗?
grid_discharge_max: number, // 电池最⼤允许馈⽹功率,可选,默认0不能馈⽹;0:不可馈⽹,-1:不限制;默认不使能,如果使能之后没有设置值,则为5kw*N(⽤-2标识) ???此处5kw*N是否有问题?
grid_charge_max: number, // 电⽹允许最⼤充电功率,可选,默认0不允许;0:不允许,-1:不限制;默认不使能,如果使能之后没有设置值,则为5kw*N(⽤-2标识) ???此处5kw*N是否有问题?
charge_max: number, // 电池最⼤允许充电功率,可选,按单台功率计算,-1:⽆限制,默认-1
discharge_max: number, // 电池最⼤允许放电功率,可选,按单台功率计算,-1:⽆限制,默认-1
charge_power: number, // 设置固定电池充电功率,可选,按单台功率计算,默认为-1:未设置
discharge_power: number, // 设置固定电池放电功率,可选,按单台功率计算,默认为-1:未设置
GCAO_max: number, // GCAO(grid charge after an outage),设备补电至预留SOC的单台市电取电功率
// 可选;0:不允许,-1:不限制;默认未设置(-3);如果使能之后没有设置值,则为5kw*N(⽤-2标识)
min_discharge_soc: number, // 放电截⽌SOC,预留 SOC,达到此SOC后电池不放电,可选,默认 0%,如果reserved_soc大于min_discharge_soc,则以reserved_soc为准。 ???需确认是否正确
max_charge_soc: number, // 充电截⽌SOC,可选,默认 100%
heat_enable: number, // 充电加热使能,0:未设置,1:不使能,2:使能,默认0未设置 ???生效项目?和充电是什么关系
ramp_time: number, // 爬坡时间,默认值 0,BB 套餐默认 300
poweroff_apower: number[], // 主动关闭 APower,可选,0:不控制(默认);1:关机;2:开机(预留)
off_grid: number, // 主动断开市电继电器,可选,0:不控制(默认);1:断开;2:闭合(预留)
solar_cutoff: number // 主动断开光伏继电器,可选,0:不控制(默认);1:断开;2:闭合(预留)
// 注:以上涉及到的所有功率值设置均以单台aPower为基准,计算总功率需乘以台数N。单位均为kw。
},
...
]
},
...
]
}
算法与PCS相关联,待PCS文档完成后补充相关内容
单台aPower最终充电功率限制计算: $$ P_{apower-chrg-max} = \min(\verb|gridmax| - P{Load}, \verb|grid_charge_max|, \verb|charge_max|) $$
单台固定aPower充电功率计算: $$ P_{apower-chrg} = \min(\verb|chargepower|, P{apower-chrg-max}) $$
单台aPower最终放电功率限制计算: $$ P_{apower-dsch-max} = \min(\verb|grid_feedmax| - P{PV}, \verb|grid_discharge_max|, \verb|discharge_max|) $$
单台固定aPower放电功率计算: $$ P_{apower-dsch} = \min(\verb|dischargepower|, P{apower-dsch-max}) $$
当$P_{PV} > \verb|grid_feed_max|$是,设备会切断部分或全部光伏继电器,以削减光伏输出功率。
调度配置中,包含两个调度优先级的配置,光伏供电优先级(solar_priority)和负载取电优先级(load_priority)。
光伏供电优先级
光伏供电优先级是一个三个数值组成的一个数组配置,三个值分别代表三个供电目标的优先级:[市电,负载,aPower]。数值越大优先级越高,但0为特殊值,代表不为此目标供电。
负载取电优先级
负载优先级是一个三个数值组成的一个数组配置,三个值分别代表三个供电源的优先级:[市电,光伏,aPower]。数值越大优先级越高,但0为特殊值,代表不使用此供电源。
:::info 以下优先级配置组合代表所有可配置的情景,不在此列表中的配置均不支持。 :::
光伏优先级:[1,2,0],负载优先级:[1,3,2]
aPower不会充电
---
config:
sankey:
showValues: false
---
sankey-beta
%% source,target,value
Electricity grid imports,Home loads,10
Electricity grid imports,aPower charge,0
PV,Home loads,60
PV,aPower charge,0
PV,Electricity grid exports,20
aPower discharge,Home loads,30
aPower discharge,Electricity grid exports,0
光伏优先级:[1,2,0],负载优先级:[1,2,3]
光伏优先级:[1,2,0],负载优先级:[1,2,0]
光伏优先级:[1,2,0],负载优先级:[1,2,1]
光伏优先级:[1,3,2],负载优先级:[1,2,0]
光伏优先级:[1,3,2],负载优先级:[1,3,2]
光伏优先级:[1,3,2],负载优先级:[2,3,1]
光伏优先级:[1,2,3],负载优先级:[1,2,0]
光伏优先级:[1,2,2],负载优先级:[1,2,2]
常规调度配置,只提供时间段策略的JSON配置。