基于低代码控制器和Simulink的光伏最大功率点跟踪控制仿真实验教程发布。
- 熟悉光伏电池的数学模型和仿真实现方法;
- 了解DC-DC变换器;
- 了解最大功率点跟踪(MPPT)技术;
- 基于低代码控制器实现光伏最大功率点跟踪控制;
- 实现Simulink模型与低代码控制器的硬件在环仿真。
光伏阵列的输出功率特性P-V曲线如下图所示,由图可知当光伏阵列的工作电压小于最大功率点电压时,光伏阵列的输出功率随阵列端电压的上升而增加;当阵列的工作电压大于最大功率点电压时,阵列的输出功率随阵列端电压的上升而减小。最大功率点跟踪(maximum power point tracking, MPPT)实质上是一个自寻优过程,即通过控制端电压,使光伏阵列能在各种不同的日照和温度环境下智能化地输出最大功率。
光伏阵列的开路电压和短路电流在很大程度上受日照强度和温度的影响,系统工作点也会因此飘忽不定,这必然导致系统效率的降低。为此,光伏阵列必须实现最大功率点跟踪控制,以便阵列在任何当前日照下不断获得最大功率输出。基本的最大功率点跟踪算法有恒定电压法、扰动观测法和增量电导法等,本次仿真通过增量电导法来实现。
增量电导法的思路是通过调整工作点的电压,使它逐渐接近最大功率点的电压。光伏阵列的电压功率曲线是一个单峰的曲线,在输出功率最大点处,功率对电压的导数为零,要寻找最大功率点,仅需在功率对电压的导数大于零的部分增加电压,在功率对电压的导数小于零的部分减小电压,在导数等于零或很接近零时保持电压不变即可。
对功率表达式$P=UI$,等式两边对$U$求导:
$$
\frac{ ext{d}P}{ ext{d}U} = \frac{ ext{d}(UI)}{ ext{d}U} = I + U\frac{ ext{d}I}{ ext{d}U}
$$
当$ ext{d}P/ ext{d}U>0$时,$U$小于最大功率点电压$U_ ext{m}$;当$ ext{d}P/ ext{d}U<0$时,$U$大于最大功率点电压$U_ ext{m}$;$ ext{d}P/ ext{d}U=0$时,$U$等于最大功率点电压$U_ ext{m}$。
理论上这种方法可以在最大功率点处稳定运行,但是由于采样时间离散等因素的存在,工作点仍可能会有波动,实际应用中的实现对硬件条件的依赖较高。
本实验的Simulink模型搭建如下图所示:
图中的mpptCtrl是S-函数模块,实现仿真模型与控制器的通信功能,控制器采集光伏输出电流和电压数据,控制信号输出到PWM模块,通过调整PWM波形对光伏输出电压进行控制。
低代码控制器的特点在于不需要对控制器进行代码的编写,只要在excel文件之中进行测点配置、通信通道和AOE配置就可以实现相应的控制。
低代码控制器文件配置分为三个部分:测点配置、通信通道配置和AOE配置。测点配置用于配置控制器输入和输出信号点的参数,通信通道的配置是为了将控制器与Simulink仿真模型建立Modbus通信,实现仿真模型与控制器的信息交互,而AOE配置是建立AOE模型网络来实现所需的控制逻辑和功能。
测点配置表格的内容包含了测点的点号、名称、别名、是否离散、是否是计算点以及默认值等。点号是程序里给这个测点的编号,可以自己定义,使用时,测点与通信通道的点号一一对应完成对接。别名是英文字母与下划线组合使用,可以当做变量名用于AOE表格里表达式的书写,使之可以不用点号来表达,使得表达式的意思表达得更加清楚。本案例需要三个测点,分别为控制器采集的光伏输出电流、光伏输出电压以及控制器输出给PWM模块的电压设定值,测点配置如下图所示:
低代码控制器通过Modbus协议与Simulink进行通信。由于Matlab仅有Modbus客户端功能,因此需要将低代码控制器配置为Modbus服务端,如下图所示,其中通道数量为1,服务端口需设置为未占用端口。
然后对客户端信息和测点信息等进行配置,如下图所示:
利用3个测点设定的点号,将3个测点与3个寄存器的起始地址点号对应,电流、电压和输出控制信号的数据类型均为八个字节的浮点数。
本案例中AOE文件配置内容分为三个部分。
AOE网络声明
AOE网络声明部分,定义了表格之中的AOE网络个数和整体信息以及一些变量的初始值。其中触发条件分为三类:SimpleRepeat(定时触发,需要自行设定定时时间)、TimeDriven(时间驱动)、EventDriven(事件驱动);变量的定义方式为:<变量名1>:<初值1>;<变量名2>:<初值2>;…。
本案例中的AOE网络声明如下所示:
AOE控制网络名称定为光伏MPPT控制,触发条件为事件控制。变量dU表示电压的微分,初始值为0;dI表示电流的微分,初始值为0;In1表示上一次网络运行时测得的电流值,初始值为0;Un1表示上一次网络运行时测得的电压值,初始值为0;Uc表示控制量变化的步长,初始值为0.03;Ucb表示控制量变化的最大步长,设定值为0.03;Ucs表示控制量变化的最小步长,设定值为0.001;Uuplim表示PWM波占空比控制量的最大值,设定值为0.5;Udownlim表示PWM波占空比控制量的最小值,设定值为-0.5;dPdU表示计算所得的dP/dU,初始值为0;dPdUc表示dP/dU的步长调整设定值,设定值为5;e表示无限趋近于0的常数,设定为1e-10。
AOE节点声明
节点类型分为Switch和Condition两类,其中Switch节点为二分支逻辑判断,触发逻辑为:表达式为真时,该节点序号为1的边进行动作;表达式为假时,序号为2的边进行动作。当Switch节点为AOE网入度为0的节点(首节点)时,Switch节点直接触发,若超时时间内表达式为真,则执行动作1,为假或者发生超时事件执行动作2;Condition节点的表达式为事件触发条件,超时时间内表达式为真,则节点事件发生,该节点出发的所有动作并行执行。
本案例的控制逻辑可以用AOE网表示如下:
对应上图需要定义的节点有10个,节点声明如下所示:
第1个节点是Simulink通信事件节点,为事件触发类型,当DoCal_POINT>0.5时,也就是测点4输出1,表示允许控制器计算时,该节点被触发,进入运算流程。
第2—7个节点都是逻辑判断节点,对于设定值进行大小比较,完成逻辑判断后根据结果进入两条不同动作的边:判断结果为真执行第1条边,否则执行第2条边,边的顺序是就是文件里面定义的顺序。
第8和9两个节点是事件触发类型,是中间节点,起连接的作用,节点被触发后,将通过下一条边进入结束节点。
最后1个节点是结束节点,是事件触发类型,当所有的计算步骤都完成,信号传输后,进入结束节点,计算结束,并将DoCal_POINT的数值改为0,等待下一次通信之后,开始计算。超时时间定为100ms,因为需要DoCal_POINT置0再让AOE执行过程结束,防止AOE被反复触发。
AOE边声明
边需要声明首尾节点,格式为:<尾节点ID>;<首节点ID>。边的方向为:尾节点→首节点。边的动作类型有:None、SetPoints、Solve、Milp、SimpleMilp、Nlp。其中,SetPoints除了对测点设值之外,还可以进行变量定义和计算,动作参数分为数字量和模拟量;Solve为求解方程Ax=b;Milp为混合整数线性规划问题求解;Nlp为非线性规划问题求解。
本案例中的AOE边声明如下图所示:
本实验中的边声明包括了SetPoints和None两种动作类型,SetPoints连接节点的同时还需要进行动作,None只需要进行连接。接下来介绍一下每条边的动作:
1)连接第1和第2节点的边:动作名称:AOE触发测点复位,计算dU和dI,动作类型为SetPoints,需要在这个边的动作上将DoCal_POINT置0,防止循环结束时还未置0导致网络再触发;dU: U_POINT - Un1;计算电压的微分。dI: I_POINT - In1;计算电流的微分。
2)连接第2和第3节点的边:动作名称:存储电压和电流值,进入判断dI是否为0的节点,动作类型为SetPoints。Un1: U_POINT;存储电压值。In1: I_POINT;存储电流值。
3)连接第3和第10节点的边:动作名称:进入结束节点,动作类型为None,没有动作参数只起连接作用。
4)连接第3和第4节点的边:动作名称:进入判断dI是否大于0的节点,动作类型为None,没有动作参数只起连接作用。
5)连接第4和第8节点的边:动作名称:增大电压,动作类型为SetPoints,Uset_POINT: Uset_POINT + Uc;在初始电压设定值的基础上增加一个步长。
6)连接第8和第10节点的边:动作名称:电压限幅,动作类型为SetPoints,Uset_POINT: (Uset_POINT <= Uuplim && Uset_POINT >= Udownlim) * Uset_POINT + (Uset_POINT > Uuplim) * Uuplim + (Uset_POINT < Udownlim) * Udownlim;判断电压是否超出限定值,未超出输出电压值,超出则输出电压设定值。
7)连接第4和第9节点的边:动作名称:减小电压,动作类型为SetPoints,Uset_POINT: Uset_POINT - Uc;在初始电压设定值的基础上减去一个步长。
8)连接第9和第10节点的边:动作名称:电压限幅,动作类型为SetPoints,Uset_POINT: (Uset_POINT <= Uuplim && Uset_POINT >= Udownlim) * Uset_POINT + (Uset_POINT > Uuplim) * Uuplim + (Uset_POINT < Udownlim) * Udownlim;判断电压是否超出限定值,未超出输出电压值,超出则输出电压设定值。
9)连接第2和第5节点的边:动作名称:存储电压和电流值,计算dP/dU,动作类型为SetPoints。Un1: U_POINT;存储电压值。In1: I_POINT;存储电流值。dPdU: I_POINT + U_POINT * dI / dU;计算并存储dP/dU的值。
10)连接第5和第10节点的边:动作名称:进入结束节点,动作类型为None,没有动作参数只起连接作用。
11)连接第5和第6节点的边:动作名称:进入判断dP/dU是否小于步长调整设定值的节点,动作类型为None,没有动作参数只起连接作用。
12)连接第6和第7节点的边1:动作名称:减小电压增量,动作类型为SetPoints,Uc: Ucs;当dP/dU小于设定步长时,设定步长更改为最小步长。
13)连接第6和第7节点的边2:动作名称:增大电压增量,动作类型为SetPoints,Uc: Ucb;当dP/dU大于设定步长时,设定步长设定为最大步长。
14)连接第7和第8节点的边:动作名称:增大电压,动作类型为SetPoints,Uset_POINT: Uset_POINT + Uc;当dP/dU大于0,电压增大一个步长。
15)连接第7和第9节点的边:动作名称:减小电压,动作类型为SetPoints,Uset_POINT: Uset_POINT - Uc;当dP/dU小于0,电压减小一个步长。
在excel表格中编写完成之后,将表格另存为.csv格式(纯文本形式存储表格数据)文件供低代码控制器使用。
打开Simulink模型中S-函数的源文件,将S-函数的输入信号数量设置为2、输出信号数量设置为1,采样时间,采样时间设置为0.01(每仿真10ms与控制器通信一次)。添加建立Modbus通信的命令,其中需要服务端ip和端口参数:
添加电流测量值、电压测量值、读取控制指令程序:
将控制器电源线与电源相连,打开电源开关,再用网线将控制器与计算机连接,就可以使用。
利用发现工具获得控制器ip,如下图所示:
当控制器启动并接入计算机,被计算机发现后,可以得到如下界面(打开一个浏览器,并输入控制器地址也可以得到如下界面)。
点击界面中控制器id,进入控制器配置界面,选择并导入.csv已编写好的测点、通道和AOE配置文件,点击界面中的“reset”即可保存配置并运行控制器。
先运行低代码控制器,再运行Simulink模型,进行仿真,得到的光伏输出功率仿真结果如下图所示。
由上图可见,经过控制后,光伏输出功率成功调整保持在最大功率点,并可对环境参数的变化进行快速响应,调整至新的最大功率点。
本实验利用低代码控制器实现了光伏最大功率点跟踪控制,其中AOE控制网络的建立十分直观,通过这个网络可以清晰展示控制过程的所有步骤,且控制功能实现无需复杂编程,适合非编程技术背景的人员学习使用。
光伏最大功率点跟踪控制AOE配置文件下载链接
SGOOL团队
2021年10月21日
版权声明:本文由SGOOL团队创作和发表,转载或引用本文内容请注明作者及出处。