低代码控制器仿真实验教程(三):储能辅助调频控制

基于Simulink的储能功率分配优化控制仿真案例实验教程发布。

1. 实验介绍

许多地区以火电机组做为主要调频资源,而储能的AGC调频效果远好于火电机组,引入相对少量的储能系统,将能够迅速并有效地解决区域电网调频资源不足的问题。本案例中低代码控制器接收主控系统下发的调遥指令,根据八个储能的SOC、充放电总里程等条件,通过优化求解下发出力指令,控制八个储能的出力,从而达到储能辅助调频的目的。

2. 实验目标

  1. 根据储能实际情况,搭建Simulink仿真模型;
  2. 实现Simulink模型与低代码控制器的硬件在环通信;
  3. 编写低代码控制器配置表格并成功实现控制。

3. 实验模型

本实验模型需要自行搭建。根据储能电池模型,可搭建模型如下:

其中,输入信号1“下发给PMS的遥控”代表储能的启停情况,“1”代表该储能开启,“0”代表储能关闭,经过“AND”元件后输入到选择元件中。

若信号1为“0”,储能关闭,则选择元件经过选择输出信号同样为“0”,该储能的输出1“充放电总里程”与输出2“SOC”都不会变化,输出3“实际功率”为0,相当于储能处于关闭状态。

若信号1为“1”,储能运行,则选择元件经过选择会输出信号2“下发给BMS的遥调”,此信号代表控制器下发给储能的出力指令,正号代表充电,负号代表放电。

充放电总里程计算:出力指令取绝对值,经过积分,可以得到充放电总里程,但此时的单位为kWs,需经过单位转换“1/3600”,转为常见的kWh。

储能SOC计算:出力指令直接进行积分,可以得到目前充放电的电量。与充放电总里程的计算类似,同样需要经过单位转换,后续再除蓄电池总容量,得到实际SOC变化量。但由于SOC通常由百分比表示,故乘以100,加上初始SOC的值(目前设为55,可根据实际情况设定),得到当前时刻的SOC值。

完成储能电池模型搭建后,对其进行封装。由于共有8个电池,将其复制8个,并引入S-函数,在S-函数中实现与低代码控制器通信功能,接收主控系统下发的调遥,完成储能功率分配并下发,如下图所示。

4. 实验原理

本实验案例求解优化问题实现储能功率的分配。考虑到方差优化的复杂性,尽量避免将二次式作为优化目标,以SOC相对平均值的总偏差的绝对值和功率相对平均值的偏差绝对值作为目标函数:

$$
\min {w_1} \sum \limits_{i = 1}^8 {\left| {SO{C_i} - SO{C_{mean}}} \right|\left| {SOC_i^0 - SO{C_{mean}}} \right|} + {w_2}\sum\limits_{i = 1}^8 e^{- \left| SOC_i - SOC_{mean} \right|}\left| {P_i} - P_{mean} \right|
$$

式中,$w_1$表示$SOC$均衡的影响权重,$w_2$表示功率变动带来的代价权重;$SOC_{mean}$为各$SOC$均值;$SOC_i^0$为当前电池的SOC值;$P_i$表示当前电池的功率值;$P_{mean}$表示当前电池功率的平均值;$SOC_i$表示在功率分发策略所计算出的功率工作下,下一时刻第$i$个电池的$SOC$值,具体计算式如下:

$$
SOC_i = SOC_i^0 + \frac{x_i \Delta t}{E_{act,i}}
$$

其中$E_{act,i}$表示电池i的实际容量。

5. 实验步骤

低代码控制器的特点在于不需要对控制器进行代码的编写,只要在excel文件之中进行测点配置、通信通道和AOE配置就可以实现相应的控制。

5.1. 编写低代码控制器配置文件

低代码控制器文件配置分为三个部分:测点配置、通信通道配置和AOE配置。测点配置用于配置控制器输入和输出信号点的参数,本案例中需要的信号是八个储能的启停指令、充放电总里程、SOC、输出功率、工作状态、输出功率指令、额定里程、额定容量、最大充电功率、最大放电功率,以及系统收到的遥控指令与遥调指令。通信通道的配置是为了将控制器与simulink仿真模型建立modbus通信,实现仿真模型与控制器的信息交互,而AOE配置是建立AOE模型网络来实现所需的控制逻辑和功能。

5.1.1. 测点配置

测点配置表格的内容包含了测点的点号、名称、别名、是否离散、是否是计算点以及默认值等。点号是程序里给这个测点的编号,可以自己定义,使用时,测点与通信通道的点号一一对应完成对接。别名是英文字母与下划线组合使用,可以当做变量名用于AOE表格里表达式的书写,使之可以不用点号来表达,使得表达式的意思表达得更加清楚。测点配置如下图所示:

(由于测点数量过多,具体测点文件在文末可下载)

本程序共需要82个测点,具体包括八个储能的启停指令、充放电总里程、SOC、输出功率、工作状态、输出功率指令、额定里程、额定容量、最大充电功率、最大放电功率,以及系统收到的遥控指令与遥调指令。

5.1.2. 通信通道配置

本案例中,控制器作为主站,具体的通道配置如下:

本案例中总共用到两种数据类型,TwoByteIntUnsigned对应开关量,占据一位寄存器;EightByteFloat对应连续或者离散的数据变量,占据4位寄存器。根据数据类型完成对起始地址的分配,即可完成通道文件的配置。

5.1.3. AOE配置

AOE网络声明

AOE网络声明部分,定义了表格之中的AOE网络个数和整体信息以及一些变量的初始值。其中触发条件分为三类:SimpleRepeat(定时触发,需要自行设定定时时间)、TimeDriven(时间驱动)、EventDriven(事件驱动);变量的定义方式为:<变量名1>:<初值1>;<变量名2>:<初值2>;…。

本案例中的AOE网络声明如下所示:


本实验中需要定义多个变量初始值。具体包括:deadband:SOC死区;SOCref:SOC参考值;dt:每步步长;w:系数w2;max_power:充放电功率上下限。

AOE节点声明

节点类型分为Switch和Condition两类,其中Switch节点为二分支逻辑判断,触发逻辑为:表达式为真时,该节点序号为1的边进行动作;表达式为假时,序号为2的边进行动作。当Switch节点为AOE网入度为0的节点(首节点)时,Switch节点直接触发,若超时时间内表达式为真,则执行动作1,为假或者发生超时事件执行动作2;Condition节点的表达式为事件触发条件,超时时间内表达式为真,则节点事件发生,该节点出发的所有动作并行执行。

本案例的节点声明如下:

本案例中一共有5个节点,第一个节点是simulink通信事件节点,为事件触发类型,当EMS_MODE_AGC_POINT>0.5时,该节点被触发,进入运算流程。

第2个节点表示中间变量计算完成的事件,当考虑SOH因总充放电里程变化而减小时,计算并更新当前各储能的SOH以及储能运行寿命损耗导致的实际容量减少等,当计算动作完成后,节点2触发,开始进行优化计算。

第3个节点表示优化计算完成的事件,在控制器内置的优化求解方法里,当最优解不存在时所有优化变量的值均为0;而有最优解存在时,由于目标函数的设计,flag的值等于1,因此可以通过设置一位二进制变量flag来作为优化问题是否有解的判断条件。该节点类型位Switch,节点事件触发时,节点动作1被执行,否则发生超时之后,节点动作2被执行。

第4个节点表示优化问题已得到最优解的事件,该事件发生说明最优解被找到并下发,AOE策略结束。

第5个节点表示优化问题没有找到最优解,这种情况发生说明发生以下两种情况:1.EMS下发的AGC指令不合理;2.储能可调度容量太小。

AOE边声明
边需要声明首尾节点,格式为:<尾节点ID>;<首节点ID>。边的方向为:尾节点→首节点。边的动作类型有:None、SetPoints、Solve、Milp、SimpleMilp、Nlp。其中,SetPoints除了对测点设值之外,还可以进行变量定义和计算,动作参数分为数字量和模拟量;Solve为求解方程Ax=b;Milp为混合整数线性规划问题求解;Nlp为非线性规划问题求解。

本案例中的AOE边声明如下图所示,主要实现的为优化求解功能:

MILP的AOE动作转化具体方法如下:

在第4节中所述的含绝对值的混合整数规划问题可以通过线性化的方式转变为不含绝对值的混合整数线性规划问题(MILP),具体方法是将绝对值部分设为新的变量$\alpha _i$和$\beta _i$,并加入约束:
$$
\alpha _i \ge SOC_i^0 - \frac{u_i}{Q_R} dt + \frac{v_i}{Q_R} dt - SOC _{mean}
$$
$$
\alpha _i \ge - SOC_i^0 + \frac{u_i}{Q_R}dt - \frac{v_i}{Q_R}dt + SOC _{mean}
$$
$$
\beta _i \ge u_i - v_i - \frac{1}{n} \sum \limits _{j = 1}^n \left( {u_j} - {v_j} \right)
$$
$$
\beta _i \ge - u_i + v_i + \frac{1}{n} \sum \limits _{j = 1}^n \left( {u_j} - {v_j} \right)
$$

目标函数转化为:
$$
\min {w_1} \sum \limits_{i = 1}^8 \left| SOC_i^0 - SOC _{mean} \right| \alpha _i + {w_2} \sum \limits _{i = 1}^8 e^{ - \left| {SOC _i - SOC _{mean}} \right|}\beta _i
$$
MILP在AOE中的写法包含三部分:目标函数、约束和优化变量,目标函数、每条约束需要以分号(;)表示结尾。

1)目标函数根据求解目的,通常以min或max开头,以中缀表达式的形式输入即可,需要注意的是,输入格式上必须将优化变量按多项式的形式分开:
$$
{a_1}{x_1} + {a_2}{x_2} + …
$$
本案例中目标函数的开头和第一项可写为:
min(flag+abs(BAMS1_SOC_POINT-SOC_mean)alpha1+wexp(-abs(BAMS1_SOC_POINT-SOC_mean))*beta1+…)
其中:
$$SOC_{mean} = \frac{1}{8}\sum\limits_{i = 1}^8 {BAMSi \_ SOC \_ POINT} $$
flag为求解成功的标志,是一位二进制优化变量。

2)约束以Bool表达式的形式输入,仍然需要将优化变量按照多项式的形式分开,比如第一台储能的功率上下限约束可写为:

1
2
3
4
5
y1>=0;y1<=1;
deadband*(GEN_TOTAL_P_POINT>=0)*y1-u1<=0;
max_power*(GEN_TOTAL_P_POINT>=0)*y1-u1>=0;
deadband*(GEN_TOTAL_P_POINT<0)*y1-v1<=0;
max_power*(GEN_TOTAL_P_POINT<0)*y1-v1>=0;

第一台储能的SOC上下限约束可写为:

1
2
-dt/QRate*u1+dt/QRate*v1>=-BAMS1_SOC_POINT;
-dt/QRate*u1+dt/QRate*v1<=1-BAMS1_SOC_POINT;

第一台储能的新增变量的绝对值约束可写为:

1
2
3
4
alpha1+dt/QRate*u1-dt/QRate*v1>= BAMS1_SOC_POINT-SOC_mean;
alpha1-dt/QRate*u1+dt/QRate*v1>=-BAMS1_SOC_POINT+SOC_mean;
beta1-0.875*u1-0.875*v1+0.125*u2+0.125*v2+0.125*u3+0.125*v3+0.125*u4+0.125*v4+0.125*u5+0.125*v5+0.125*u6+0.125*v6+0.125*u7+0.125*v7+0.125*u8+0.125*v8>=0;
beta1+0.875*u1+0.875*v1-0.125*u2-0.125*v2-0.125*u3-0.125*v3-0.125*u4-0.125*v4-0.125*u5-0.125*v5-0.125*u6-0.125*v6-0.125*u7-0.125*v7-0.125*u8-0.125*v8>=0;

标志位约束和AGC指令功率约束可写为:

1
2
3
flag>=1;
u1-v1+u2-v2+u3-v3+u4-v4+u5-v5+u6-v6+u7-v7+u8-v8>=GEN_TOTAL_P_POINT-0.1;
u1-v1+u2-v2+u3-v3+u4-v4+u5-v5+u6-v6+u7-v7+u8-v8<=GEN_TOTAL_P_POINT+0.1;

至此,本例中所有约束都已形成控制器能够解析和识别的字符串。
3)优化变量按照变量名:变量类型的形式进行声明,本案例中优化变量的声明如下:

1
2
3
4
5
u1:3,u2:3,u3:3,u4:3,u5:3,u6:3,u7:3,u8:3,
v1:3,v2:3,v3:3,v4:3,v5:3,v6:3,v7:3,v8:3,
y1:2,y2:2,y3:2,y4:2,y5:2,y6:2,y7:2,y8:2,
alpha1:3,alpha2:3,alpha3:3,alpha4:3,alpha5:3,alpha6:3,alpha7:3,alpha8:3,
beta1:3,beta2:3,beta3:3,beta4:3,beta5:3,beta6:3,beta7:3,beta8:3,flag:2

其中变量类型表示的含义如下表所示:

变量类型 含义
1 0/1二进制型变量
2 整型变量
3 实数型变量

本例中,ui、vi、alphai、betai(i=1,2,…,8)都是实数型变量,分别表示储能i的放电功率、充电功率、αi和βi;而yi(i=1,2,…,8)为整型变量,表示储能是否处于可调度状态;flag为二进制型变量,表示求解是否成功,从上述的约束和目标函数中可以看出,求解成功时flag=1,否则flag=0。

5.1.4. 配置文件存储

在excel表格中编写完成之后,将表格另存为.csv格式(纯文本形式存储表格数据)文件供低代码控制器使用。

5.2. 编写Simulink与控制器通信程序

modbusCom.m是本实验模型控制器的源文件,建立与低代码控制器通信的作用。

下图表示的是输入和输出值的个数,本实验中的输入有66个,包括八个储能的充放电总里程、SOC、输出功率、工作状态、额定里程、额定容量、最大充电功率、最大放电功率,以及系统收到的遥控指令与遥调指令。输出有16个,为八个储能的启停指令与输出功率指令。

下图表示的是Modbus通信模块的在Simulink仿真模型中的采样时间为0.02s。

下图表示建立与控制器的通信。

6. 低代码控制器配置与运行

该部分与温度控制案例相同。

7. 低代码控制器配置与运行

先运行低代码控制器,再运行Simulink模型,进行仿真。利用低代码控制器进行优化求解,得到的控制结果如下所示:

指令功率和储能总功率曲线
各储能功率变化曲线
各储能SOC变化曲线

由该仿真实验可以看出,相较于传统控制器,低代码控制器可以实现混合整数线性规划问题的优化求解,实现储能出力对下发指令地跟踪,具有强大的功能。且无需复杂编程,更适合无编程基础人员使用。

储能功率分配优化控制AOE配置文件下载链接

SGOOL团队
2021年9月28日




版权声明:本文由SGOOL团队创作和发表,转载或引用本文内容请注明作者及出处。

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器