6.12 微网燃机平衡控制
1、实验环境
该程序可在以下环境运行:
-
TwinCAT 3;
-
Matlab/Simulink;
-
低代码控制器。
2、实验介绍
利用低代码控制器完成储能电站的黑启动、负荷(频率)平衡、顺序停机等功能。该储能电站是为钻井平台打造的小型微电网,其由8台330kW燃机、2台500kW储能电源和1台可变负荷组成。
3、实验模型
3.1、模型搭建
1)储能模型的搭建
储能电池的电路结构与控制结构如图所示,
储能电池承担着黑启动阶段建立系统所需频率和电压以及平抑负荷波动的责任,故对其采用 V-F 控制,锁相环通过获得网侧电压的相位,实现逆变器侧输出电流和网侧电压的同步;通过采样逆变器侧三相电压和电流经过 abc / dq 变换后输入电压环,得到电流控制器参考值 $i_{do}$ 和 $i_{qo}$ ,之后输入电流环经 dq / abc 变换后发出调制信号给调制模块,产生三相全桥逆变电路的驱动信号。
2)燃机模型的搭建
燃机的控制方式为给定功率指令使之输出满足负荷所需要的功率,本案例中燃机采用数值模型以进一步提高仿真速度,其建模以有功功率指令、功率因数、频率和系统电压未输入,依据的计算式为: $$ {Q_{ref}} = {P_{ref}} \cdot \tan (\theta ) $$
$$ {{i_{a_d}}{\rm{ }} = {\rm{ }}\frac{{\sqrt 2 {P_{ref}}}}{{3U}} \cdot sin\left( {wt} \right)}\ {{i_{b_d}}{\rm{ }} = {\rm{ }}\frac{{\sqrt 2 {P_{ref}}}}{{3U}} \cdot sin\left( {wt{\rm{ }} - {\rm{ }}\frac{{2\pi }}{3}} \right)}\ {{i_{c_d}}{\rm{ }} = {\rm{ }}\frac{{\sqrt 2 {P_{ref}}}}{{3U}} \cdot sin\left( {wt{\rm{ }} - {\rm{ }}\frac{{4\pi }}{3}} \right)} $$
$$ {{i_{a_q}}{\rm{ }} = {\rm{ }}\frac{{\sqrt 2 {Q_{ref}}}}{{3U}} \cdot sin\left( {wt{\rm{ }} - {\rm{ }}\frac{\pi }{2}} \right)}\ {{i_{b_q}}{\rm{ }} = {\rm{ }}\frac{{\sqrt 2 {Q_{ref}}}}{{3U}} \cdot sin\left( {wt{\rm{ }} - {\rm{ }}\frac{{2\pi }}{3}{\rm{ }} - {\rm{ }}\frac{\pi }{2}} \right)}\ {{i_{c_q}}{\rm{ }} = {\rm{ }}\frac{{\sqrt 2 {Q_{ref}}}}{{3U}} \cdot sin\left( {wt{\rm{ }} - {\rm{ }}\frac{{4\pi }}{3}{\rm{ }} - {\rm{ }}\frac{\pi }{2}} \right)} $$
$$ {{i_a} = {\rm{ }}{i_{a_d}}{\rm{ }} + {\rm{ }}{i_{a_q}}}\ {{i_b} = {\rm{ }}{i_{b_d}}{\rm{ }} + {\rm{ }}{i_{b_q}}}\ {{i_c} = {\rm{ }}{i_{c_d}}{\rm{ }} + {\rm{ }}{i_{c_q}}} $$
3)可变负荷的搭建
可变负荷被等效为反向电流源,给定有功负荷和无功负荷的值,采用与燃机相同的计算方法得到输出电流值,只是需要将电流反向。
3.2、从 MATLAB/Simulink 到 TwinCAT3
倍福公司开发出了TE1401和TE1400两款产品,在TwinCAT3中新增了Simulink Module的功能,允许用户事先在MATLAB中创建控制模型,包括控制代码和接口,然后将模块导入TwinCAT3实现直接的对硬件调试,其中TE1400,即Target for Simulink,可以将Simulink中搭建好的可视化控制模块通过Simulink Coder自动转换为C/C++代码,在转换为TwinCAT3可以识别的控制对象。如下图为使用TE1400将Simulink模型转换为TwinCAT3兼容的PLC项目时的配置界面。
4、实验原理
4.1、黑启动控制策略
本微网采用储能装置来辅助黑启动,其控制策略流程如下:
(1)系统自检查。为了避免微电网在黑启动初期储能电池容量不足、负载较大而出现故障停机等现象,需要对系统各设备进行检查。自检查包括电池剩余容量检查、切除全部负荷、燃气轮机合闸状况检查等。保证系统不出现储能功率不足等问题。
(2)启动储能装置。通过储能设备的VF控制建立微电网系统的电压和频率。要求储能装置的额定功率应能够满足微电网交流母线的空载损耗, 同时其输出能够承受系统中非黑启动电源在启动时产生的功率冲击。
(3)投入负荷。为了快速恢复重要负荷的供电, 在考虑储能装置额定容量的前提下投入部分重要负荷;在投入过程中, 应保证系统电压和频率在额定范围内波动, 以免造成整个系统发生失稳现象。
(4)接入燃气轮机等非黑启动源。此时微电网系统已经具有一定的容量,需在综合评估微电网系统中的容量匹配情况后逐步启动非黑启动源,以扩大系统的发电容量。
(5)增加负荷。随着各发电装置的接入, 系统供电容量增加, 此时可以根据负荷特性以及系统发电容量逐步增加负荷。
4.2、燃机启停判定策略
黑启动结束后,功率分配策略开始运行,当启动的燃机稳定输出分配的指令后,开始恢复系统其他负荷。逐渐投入负荷,判定是否需要启动/关闭燃机,具体的判定方法如下: $$ lack = \frac{{{P_{load}} - m{P_{m\max }} - {P_{es\max }}}}{{{P_{m\min }}}} $$ 式中, $P_{load}$ 为负荷功率; $m$ 为上一调度周期计算得到的需要开启燃机台数; $P_{es\max}$ 为当前储能最大出力; $P_{m\min}$ ,$P_{m\max}$ 分别为燃机的出力下限和上限。
需要说明的是, lack 值仅在大于0时有意义,即需要开启 lack 台燃机。
当燃机所分配的功率均不能达到 $P_{m\min}$ 时,则分闸一台燃机。
4.3、燃机功率分配策略
通过判断式判断现有合闸的燃机数,之后根据储能的 $SoC$ 计算应该分配给燃机的功率,平均分给所有合闸的燃机,如下所示,
N:((XA_EMStoRJ1_bPowerON!=0)&&(VT_RJ1_OPENCOMMAND==0))+((XA_EMStoRJ2_bPowerON!=0)&&(VT_RJ2_OPENCOMMAND==0))+((XA_EMStoRJ3_bPowerON!=0)&&(VT_RJ3_OPENCOMMAND==0))+((XA_EMStoRJ4_bPowerON!=0)&&(VT_RJ4_OPENCOMMAND==0))+((XA_EMStoRJ5_bPowerON!=0)&&(VT_RJ5_OPENCOMMAND==0))+((XA_EMStoRJ6_bPowerON!=0)&&(VT_RJ6_OPENCOMMAND==0))+((XA_EMStoRJ7_bPowerON!=0)&&(VT_RJ7_OPENCOMMAND==0))+((XA_EMStoRJ8_bPowerON!=0)&&(VT_RJ8_OPENCOMMAND==0));//判断现有合闸的燃机数
CN_middlepower:(((CN_MaxPowerProportioninLowerSOC+CN_MinPowerProportioninLowerSOC)/2)*CN_RatedPower)*(SOC<CN_LowSOCofExpect)+(((CN_MaxPowerProportioninMiddleSOC+CN_MinPowerProportioninMiddleSOC)/2)*CN_RatedPower)*((SOC>=CN_LowSOCofExpect)&&(SOC<CN_UpSOCofExpect))+(((CN_MaxPowerProportioninUpperSOC+CN_MinPowerProportioninUpperSOC)/2)*CN_RatedPower)*(SOC>=CN_UpSOCofExpect);//储能的期望出力
RJ_TotalPOWER:P600-CN_middlepower;//应该分配给燃机的功率
XA_EMStoRJ1_dActivePower:((XA_EMStoRJ1_bPowerON!=0)&&(VT_RJ1_OPENCOMMAND==0))*min(RJ_TotalPOWER/N,RJ_maxpower_proportion*RJ_ratedpower);
XA_EMStoRJ2_dActivePower:((XA_EMStoRJ2_bPowerON!=0)&&(VT_RJ2_OPENCOMMAND==0))*min(RJ_TotalPOWER/N,RJ_maxpower_proportion*RJ_ratedpower);
XA_EMStoRJ3_dActivePower:((XA_EMStoRJ3_bPowerON!=0)&&(VT_RJ3_OPENCOMMAND==0))*min(RJ_TotalPOWER/N,RJ_maxpower_proportion*RJ_ratedpower);
XA_EMStoRJ4_dActivePower:((XA_EMStoRJ4_bPowerON!=0)&&(VT_RJ4_OPENCOMMAND==0))*min(RJ_TotalPOWER/N,RJ_maxpower_proportion*RJ_ratedpower);
XA_EMStoRJ5_dActivePower:((XA_EMStoRJ5_bPowerON!=0)&&(VT_RJ5_OPENCOMMAND==0))*min(RJ_TotalPOWER/N,RJ_maxpower_proportion*RJ_ratedpower);
XA_EMStoRJ6_dActivePower:((XA_EMStoRJ6_bPowerON!=0)&&(VT_RJ6_OPENCOMMAND==0))*min(RJ_TotalPOWER/N,RJ_maxpower_proportion*RJ_ratedpower);
XA_EMStoRJ7_dActivePower:((XA_EMStoRJ7_bPowerON!=0)&&(VT_RJ7_OPENCOMMAND==0))*min(RJ_TotalPOWER/N,RJ_maxpower_proportion*RJ_ratedpower);
XA_EMStoRJ8_dActivePower:((XA_EMStoRJ8_bPowerON!=0)&&(VT_RJ8_OPENCOMMAND==0))*min(RJ_TotalPOWER/N,RJ_maxpower_proportion*RJ_ratedpower);
//平均分给所有合闸的燃机
5、实验步骤
低代码控制器的特点在于不需要对控制器进行代码的编写,只要在excel文件之中进行测点配置、通信通道和AOE配置就可以实现相应的控制。
5.1、编写低代码控制器配置文件
低代码控制器文件配置分为三个部分:测点配置、通信通道配置和AOE配置。测点配置用于配置控制器输入和输出信号点的参数。通信通道的配置是为了将控制器与simulink仿真模型建立modbus通信,实现仿真模型与控制器的信息交互,而AOE配置是建立AOE模型网络来实现所需的控制逻辑和功能。
5.1.1、测点配置
本程序共需要293个测点,包括八台燃机的启停指令、分合闸指令、燃机缺额指令、功率值、功率指令,两台储能的功率值和功率指令,可变负荷的负荷值设置指令等。部分测点配置如下图所示,具体测点文件在文末可下载:
序号 | 点号 | 名称 | 别名 | 是否离散 | 是否计算点 | 默认值 | 备注 |
---|---|---|---|---|---|---|---|
... | |||||||
76 | 103437 | 测点76 | XA_EMStoRJ1_bPowerON | FALSE | FALSE | 0 | 燃机1合闸完成信号 |
... | |||||||
84 | 103453 | 测点84 | XA_EMStoRJ1_bPowerOFF | FALSE | FALSE | 0 | 燃机1分闸完成信号 |
... | |||||||
100 | 103458 | 测点100 | XA_EMStoRJ1_dActivePower | FALSE | FALSE | 0 | 燃机1输出功率指令 |
... | |||||||
188 | 103661 | 测点188 | VT_RJ1_ERROR | TRUE | FALSE | 0 | 燃机1故障报错信号 |
... | |||||||
204 | 103693 | 测点204 | VT_RJ1_STARTCOMMAND | TRUE | FALSE | 0 | 燃机1开机信号 |
... | |||||||
223 | 103731 | 测点223 | VT_RJ1_CLOSECOMMAND | TRUE | FALSE | 0 | 燃机1合闸信号 |
... | |||||||
228 | 103731 | 测点223 | P1 | FALSE | FALSE | 0 | 燃机1输出功率值 |
... |
5.1.2、通信通道配置
本案例中,具体的通道配置和寄存器配置如下:
| 通道名称 | 测试通道1 | | :-- | :-- | | 测点个数 | 293 | | 服务端IP | 192.168.0.200 | | 服务端端口 | 502 | | slave id | 1 | | 通信协议 | XA | | 一次读寄存器数上限 | 125 | | 一次读开关数上限 | 2000 | | 一次写寄存器数上限 | 120 | | 一次写开关数上限 | 1968 | | 轮询周期(ms) | 2000 | |超时(ms)|1000|
序号 | 寄存器类型 | 起始地址 | 数据类型 | 新请求标志 | 轮询周期 | 点号 |
---|---|---|---|---|---|---|
1 | HOLDING | 13287 | FourByteIntSigned | FALSE | 2000 | 103287 |
2 | HOLDING | 13289 | FourByteIntSigned | FALSE | 2000 | 103289 |
3 | HOLDING | 13291 | FourByteIntSigned | FALSE | 2000 | 103291 |
4 | HOLDING | 13293 | FourByteIntSigned | FALSE | 2000 | 103293 |
5 | HOLDING | 13295 | FourByteIntSigned | FALSE | 2000 | 103295 |
6 | HOLDING | 13297 | FourByteIntSigned | FALSE | 2000 | 103297 |
7 | HOLDING | 13299 | FourByteIntSigned | FALSE | 2000 | 103299 |
8 | HOLDING | 13301 | FourByteIntSigned | FALSE | 2000 | 103301 |
9 | HOLDING | 13303 | FourByteIntSigned | FALSE | 2000 | 103303 |
10 | HOLDING | 13305 | FourByteIntSigned | FALSE | 2000 | 103305 |
11 | HOLDING | 13307 | FourByteIntSigned | FALSE | 2000 | 103307 |
12 | HOLDING | 13309 | FourByteIntSigned | FALSE | 2000 | 103309 |
... |
本案例中数据类型均为 FourByteIntSigned 。根据数据类型完成对起始地址的分配,即可完成通道文件的配置。
5.1.3、AOE 配置
AOE 网络声明
AOE网络声明部分,定义了表格之中的AOE网络个数和整体信息以及一些变量的初始值。其中触发条件分为三类:SimpleRepeat(定时触发,需要自行设定定时时间)、TimeDriven(时间驱动)、EventDriven(事件驱动);变量的定义方式为:<变量名1>:<初值1>;<变量名2>:<初值2>;…。
本案例中燃机启动及合闸部分的 AOE 网络声明如下所示
AOE ID | 是否启用 | 名称 | 触发条件 | 触发条件参数 | 变量初始值 |
---|---|---|---|---|---|
70011 | TRUE | 燃机1启动 | SimpleRepeat | 5000 | VT_RJ1_start_times:0 |
70012 | TRUE | 燃机2启动 | SimpleRepeat | 5000 | VT_RJ2_start_times:0 |
70013 | TRUE | 燃机3启动 | SimpleRepeat | 5000 | VT_RJ3_start_times:0 |
70014 | TRUE | 燃机4启动 | SimpleRepeat | 5000 | VT_RJ4_start_times:0 |
70015 | TRUE | 燃机5启动 | SimpleRepeat | 5000 | VT_RJ5_start_times:0 |
70016 | TRUE | 燃机6启动 | SimpleRepeat | 5000 | VT_RJ6_start_times:0 |
70017 | TRUE | 燃机7启动 | SimpleRepeat | 5000 | VT_RJ7_start_times:0 |
70018 | TRUE | 燃机8启动 | SimpleRepeat | 5000 | VT_RJ8_start_times:0 |
70021 | TRUE | 燃机1合闸 | SimpleRepeat | 5000 | VT_RJ1_close_times:0 |
70022 | TRUE | 燃机2合闸 | SimpleRepeat | 5000 | VT_RJ2_close_times:0 |
70023 | TRUE | 燃机3合闸 | SimpleRepeat | 5000 | VT_RJ3_close_times:0 |
70024 | TRUE | 燃机4合闸 | SimpleRepeat | 5000 | VT_RJ4_close_times:0 |
70025 | TRUE | 燃机5合闸 | SimpleRepeat | 5000 | VT_RJ5_close_times:0 |
70026 | TRUE | 燃机6合闸 | SimpleRepeat | 5000 | VT_RJ6_close_times:0 |
70027 | TRUE | 燃机7合闸 | SimpleRepeat | 5000 | VT_RJ7_close_times:0 |
70028 | TRUE | 燃机8合闸 | SimpleRepeat | 5000 | VT_RJ8_close_times:0 |
AOE节点声明
节点类型分为Switch和Condition两类,其中Switch节点为二分支逻辑判断,当表达式为真时,该节点序号为1的边进行动作;表达式为假时,序号为2的边进行动作。当Switch节点为AOE网入度为0的节点(首节点)时,Switch节点直接触发,若超时时间内表达式为真,则执行动作1,为假或者发生超时事件执行动作2;Condition节点的表达式为事件触发条件,超时时间内表达式为真,则节点事件发生,该节点出发的所有动作并行执行。
本案例中燃机启动及合闸部分的部分节点声明如下:
AOE ID | 节点ID | 名称 | 节点类型 | 超时时间(ms) | 表达式 |
---|---|---|---|---|---|
70011 | 1 | 虚拟首节点 | Condition | 5000 | VT_RJ1_STARTCOMMAND == 1 |
70011 | 2 | 燃机RJ1是否可用 | Switch | 0 | XA_RJ1OnlineState==1 && XA_RJ1toEMS_bPermissiRun!=0 && XA_INTERFACE_RJ1Select!=0 && VT_RJ1_ERROR == 0 |
70011 | 3 | 燃机RJ1启动完成 | Switch | 5000 | XA_RJ1toEMS_bIfOnline!=0 |
70011 | 4 | 结束节点 | Condition | 0 | VT_RJ1_STARTCOMMAND ==0 && XA_RJ1toEMS_bIfopen ==1 |
70011 | 5 | 结束节点 | Condition | 0 | 1 |
70011 | 6 | 结束节点 | Condition | 60000 | 0 |
70021 | 1 | 虚拟首节点 | Condition | 5000 | VT_RJ1_CLOSECOMMAND==1 && XA_RJ1toEMS_bSetRoll!=0 |
70021 | 2 | 燃机RJ1是否能合闸 | Switch | 2000 | XA_RJ1toEMS_bIfopen!=0 |
70021 | 3 | 结束节点 | Condition | 0 | 1 |
70021 | 4 | 结束节点 | Condition | 0 | 1 |
AOE边声明
边需要声明首尾节点,格式为:<尾节点ID>;<首节点ID>。本案例中主要使用None、SetPoints以及SETPOINTS_WITH_CHECK三类动作。
本案例中燃机启动及合闸部分的AOE边声明如下所示:
AOE ID | 首尾节点 | 动作名称 | 失败模式 | 动作类型 | 动作参数 |
---|---|---|---|---|---|
70011 | 1;2 | 事件动作 | Default | NONE | |
70011 | 2;3 | 燃机RJ1启动 | Default | Set_Points | XA_PLCTORJ_START:XA_PLCTORJ_START|1; |
70011 | 2;5 | 连接失败 | Default | Set_Points | VT_RJ1_ERROR:1;VT_RJ1_STARTCOMMAND:0; |
70011 | 3;4 | 燃机RJ1启动成功 | Default | Set_Points | XA_RJ1toEMS_bIfopen:1;XA_PLCTORJ_START:XA_PLCTORJ_START&254;VT_RJ1_STARTCOMMAND:0;RJ_OPEN:RJ_OPEN+1; |
70011 | 3;6 | 燃机RJ1启动失败记录 | Default | Set_Points | VT_RJ1_start_times:VT_RJ1_start_times+1;VT_RJ1_ERROR:VT_RJ1_start_times>3;VT_RJ1_STARTCOMMAND:VT_RJ1_ERROR==0; |
70021 | 1;2 | 事件动作 | Default | NONE | |
70021 | 2;3 | 燃机RJ1合闸 | Default | Set_Points | XA_EMStoRJ1_bPowerON:255;XA_EMStoRJ1_bPowerOFF:0;VT_RJ1_CLOSECOMMAND:0;XA_RJ1toEMS_bPermissiStop:1;RJ_OPEN:RJ_OPEN-1; |
70021 | 2;4 | 燃机RJ1合闸失败 | Default | Set_Points | VT_RJ_LACK:VT_RJ_LACK+1;VT_RJ1_ERROR:1;VT_RJ1_STARTCOMMAND:0; |
70012 | 1;2 | 事件动作 | Default | NONE | |
70012 | 2;3 | 燃机RJ2启动 | Default | Set_Points | XA_PLCTORJ_START:XA_PLCTORJ_START|2; |
70012 | 2;5 | 连接失败 | Default | Set_Points | VT_RJ2_ERROR:1;VT_RJ2_STARTCOMMAND:0; |
70012 | 3;4 | 燃机RJ2启动成功 | Default | Set_Points | XA_RJ2toEMS_bIfopen:1;XA_PLCTORJ_START:XA_PLCTORJ_START&253;VT_RJ2_STARTCOMMAND:0;RJ_OPEN:RJ_OPEN+1; |
70012 | 3;6 | 燃机RJ2启动失败记录 | Default | Set_Points | VT_RJ2_start_times:VT_RJ2_start_times+1;VT_RJ2_ERROR:VT_RJ2_start_times>3;VT_RJ2_STARTCOMMAND:VT_RJ2_ERROR==0; |
6、低代码控制器配置与运行
- 进入控制器网页端
了解测点、信道和aoe文件的上传方法,以及上传配置文件后的解析方法。 打开一个浏览器,并输入控制器地址,然后输入账号和密码打开控制器。
以测点配置文件上传为例,单击图标,选中需要上传的文件,确定即可完成上传。上传成功后界面将出现相应内容,可对其进行查看与编辑。操作界面如图所示。
所有文件上传完成后,单击“主页”活“概览”返回概览界面,点击“重置”按钮保存配置即可运行。操作界面如下图所示:
运行后可以在查询项查看测点值和AOE运行情况等信息。
在量测界面还可以观测测点的曲线和报表(历史数据)。
7、仿真运行结果
编译TwinCAT文件,运行工控机,再运行低代码控制器进行仿真。利用低代码控制器对建立在工控机中的被控对象进行控制,得到的控制结果如下所示:
8、总结
由该仿真实验可以看出,使用低代码控制器并不需要繁复的程序代码编写,只需要编写测点配置、通信通道配置和AOE配置文件就可以实现通信和控制功能,与目前常用的其他控制器相比,更方便于非编程技术背景人员的应用。
附件:微电网控制.rar