6.3 光伏最大功率点跟踪

1、实验环境

该程序可在以下环境运行:

1.Matlab R2019a + Simulink v9.3及以上版本;

2.Matlab APP:Instrument Control Toolbox;

3.低代码控制器。

2、低代码控制器的功能实现目标

利用低代码控制器实现本模型中的最大功率点跟踪(MPPT)技术,根据光伏电池的功率变化调整工作点的电压以获得最大功率。

3、仿真实验模型

3.1、实验模型图

光伏发电仿真模型

图中的mpptCtrl就是本实验模型中的控制器模块,实验模型中可以看出,控制器的功能主要是控制PWM模块调整PWM的波形。

仿真模型中的受控电流源

上图所示的部分是将光伏模型中产生的信号转化成电流。

控制器输出与PWM生成

上图所示部分是由控制器所控制的,需要根据光伏电压和电流的变化获得功率的变化,再根据功率的变化情况调整工作点的电压以获得理想条件下的最大功率。

负载

上图所示的是实验中模拟的负载,负载两端工作电压的变化会对光伏信号产生影响从而影响光伏输出功率。

3.2、实验模型中的通信文件

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

sizes.NumContStates  = 0;
sizes.NumDiscStates  = 0;
sizes.NumOutputs     = 1;
sizes.NumInputs      = 2;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;

上面的初始化过程表示的是输入和输出值的个数的设置,本实验中的输入有两个,包括输入的电压值和电流值。输出有一个,就是控制器的输出,控制的是电压控制的设定值。

ts  = [0.01,0];

上面表示的是模块的采样时间为0.01s。

global m;
m = modbus('tcpip', '127.0.0.1', 502);  % 建立modbus通信

上面表示初始化过程中建立与控制器的通信。

function sys=mdlOutputs(t,x,u)
global m;
write(m,'holdingregs',2,u','double');   % 将电流、电压测量值写入控制器
write(m,'holdingregs',14,1);   % 将发起通信信号写入控制器
pause(0.02);    % 等待20ms(实际时间),使得通过modbus通信之后读到最新控制值
sys = read(m,'holdingregs',10,1,'double');  % 读取控制信号

如上面的输出函数所示,需要将输入写入控制器,再从控制器中读取控制信号。图中的pause(0.02)用于设置等待时间,当控制器和计算机的性能较好时,可以适当修改这个参数,可以加快仿真通信的速度,使动画跟随的动作加快。

4、低代码控制器的文件配置

4.1、测点配置

序号点号名称别名是否离散是否计算点默认值备注
1100001测点1I_POINTFALSEFALSE0电流
2100002测点2U_POINTFALSEFALSE0电压
3100003测点3Uset_POINTFALSEFALSE0电压设定值
4100004测点4DoCal_POINTTRUEFALSE0根据测点状态判断控制器是否需要进行计算

控制器模块的输入端和输出端

本程序需要三个测点,分别为输入电流值、输入电压值以及控制器输出给PWM的电压设定值。其中的别名对应的就是AOE文件之中设置节点事件的表达式的参量。表示在MATLAB的simulink模型中是如图所示的几个参数。

第四个测点DoCal_POINT不是实际物理测点,并不是用于获取控制信号的,每通信一次,这个测点将被设成1让控制器进行计算,控制器开始执行AOE控制策略的时候这个测点会被置0。

4.2、通信通道配置

通道名称server测试通道连接名称测试通道
连接个数1测点个数4
服务端口502客户端IP127.0.0.1
客户端端口9999
slave id1
通信协议XA
一次读寄存器数上限125
一次读开关数上限2000

服务端口设定为502,测点个数为4,客户端ip是本机的ip地址,可以在网络属性界面查询得到,客户端端口设置为9999.

序号寄存器类型起始地址数据类型新请求标志轮询周期点号
1HOLDING1EightByteFloatFALSE2000100001
2HOLDING5EightByteFloatFALSE2000100002
3HOLDING9EightByteFloatFALSE2000100003
4HOLDING13TwoByteIntUnsignedFALSE2000100004

本实验中需要用四个寄存器存储数据,前三个存储的是三个有测量数据的测点的监测结果,数据类型为八位浮点数,最后一个寄存器存储的是不进行监测的测点的值,这个测点只有0和1两个结果,所以数据类型设置为无符号整数。

4.3、AOE配置

基本原理:

下图所示为光伏阵列的输出功率特性P-V曲线,由图可知当光伏阵列的工作电压小于最大功率点电压时,光伏阵列的输出功率随阵列端电压的上升而增加;当阵列的工作电压大于最大功率点电压时,阵列的输出功率随阵列端电压的上升而减小。

光伏发电系统的P-U特性曲线

最大功率点跟踪(maximum power point tracking, MPPT)实质上是一个自寻优过程,即通过控制端电压,使光伏阵列能在各种不同的日照和温度环境下智能化地输出最大功率。

基本的最大功率点跟踪算法有恒定电压法扰动观测法增量电导法等,本次仿真模型的控制通过增量电导法来实现。

增量电导法的思路是通过调整工作点的电压,使它逐渐接近最大功率点的电压。光伏阵列的电压功率曲线是一个单峰的曲线,在输出功率最大点处,功率对电压的导数为零,要寻找最大功率点,仅需在功率对电压的导数大于零的部分增加电压,在功率对电压的导数小于零的部分减小电压,在导数等于零或很接近零时保持电压不变即可。

对功率表达式 ,等式两边对U求导:

\[ \frac{\text d P}{\text d U}=\frac{\text d \left(UI\right)}{\text d U}=I+U\frac{\text d I}{\text d U} \]

当dP/dU>0时,U小于最大功率点电压Um;当dP/dU<0时,U大于最大功率点电压Um;dP/dU=0时,U等于最大功率点电压Um。

根据基本原理,本实验中的AOE网络图如图所示:

MPPT算法的AOE网络图

  1. AOE网络声明

将名称定为光伏MPPT控制,触发条件设置为事件触发(Event_Drive)。

AOE ID是否启用名称触发条件触发条件参数变量初始值
70001TRUE光伏MPPT控制Event_DrivedU:0; dI:0; In1:0; Un1:0; Uc:0.005; Uuplim:0.5; Udownlim:-0.5; dPdU:0; e:1e-10

上表可见本实验中需要定义的变量初始值,其具体含义为:

变量名称含义
dU表示电压的微分,初始值为0
dI表示电流的微分,初始值为0
In1表示上一次网络运行时测得的电流值,初始值为0
Un1表示上一次网络运行时测得的电压值,初始值为0
Uc控制量变化的步长,初始值为0.03
Ucb控制量变化的最大步长,设定值为0.03
Ucs控制量变化的最小步长,设定值为0.001
UuplimPWM波占空比控制量的最大值,设定值为0.5
UdownlimPWM波占空比控制量的最小值,设定值为-0.5
dPdU计算所得的dP/dU,初始值为0
dPdUcdP/dU的步长调整设定值,设定值为5
e无限趋近于0的常数,设定值为1e-10
  1. 变量声明

本实验中不需要此模块的填写,在此不多赘述。

  1. AOE节点声明
AOE ID节点ID名称节点类型超时时间(ms)表达式
700011simulink通信事件Condition10DoCal_POINT>0.5
700012判断dU是否为0Switch10abs(dU)<e
700013判断dI是否为0Switch10abs(dI)<e
700014判断dI是否大于0Switch10dI>e
700015判断dP/dU是否为0Switch10abs(dPdU)<=e
700016判断dP/dU是否小于步长调整设定值Switch10abs(dPdU)<=dPdUc
700017判断dP/dU是否大于0Condition10dPdU>e
700018进入限幅操作中间节点1Condition101
700019进入限幅操作中间节点2Condition101
7000110结束节点Condition100DoCal_POINT==0

本实验中一共有10个节点,第一个节点是simulink通信事件节点,为事件触发类型,当DoCal_POINT>0.5时,也就是测点4输出1,表示允许控制器计算时,该节点被触发,进入运算流程。

中间6个节点(第2—7个节点)都是逻辑判断节点,对于设定值进行大小比较,完成逻辑判断后根据结果进入两条不同动作的边:判断结果为真执行第1条边,否则执行第2条边,边的顺序是就是文件里面定义的顺序。

第8和9两个节点是事件触发类型,是中间节点,起连接的作用,节点被触发后,将通过下一条边进入结束节点。

最后一个节点是结束节点,是事件触发类型,当所有的计算步骤都完成,信号传输后,进入结束节点,计算结束,并将DoCal_POINT的数值改为0,等待下一次通信之后,开始计算。超时时间定为100ms,因为需要DoCal_POINT置0再让AOE执行过程结束,防止AOE被反复触发。

  1. AOE边声明
AOE ID首尾节点动作名称失败模式动作类型动作参数
700011;2aoe触发测点复位,计算dU和dIDefaultSet_PointsDoCal_POINT: 0;dU: U_POINT - Un1; dI: I_POINT - In1;
700012;3存储电压和电流值,进入判断dI是否为0的节点DefaultSet_PointsUn1: U_POINT; In1: I_POINT;
700013;10进入结束节点DefaultNONE
700013;4进入判断dI是否大于0的节点DefaultNONE
700014;8增大电压DefaultSet_PointsUset_POINT: Uset_POINT + Uc;
700018;10电压限幅DefaultSet_PointsUset_POINT: (Uset_POINT <= Uuplim && Uset_POINT >= Udownlim) * Uset_POINT + (Uset_POINT > Uuplim) * Uuplim + (Uset_POINT < Udownlim) * Udownlim;
700014;9减小电压DefaultSet_PointsUset_POINT: Uset_POINT - Uc;
700019;10电压限幅DefaultSet_PointsUset_POINT: (Uset_POINT <= Uuplim && Uset_POINT >= Udownlim) * Uset_POINT + (Uset_POINT > Uuplim) * Uuplim + (Uset_POINT < Udownlim) * Udownlim;
700012;5存储电压和电流值,计算dP/dUDefaultSet_PointsUn1:U_POINT; In1:I_POINT; dPdU:I_POINT+U_POINT*dI/dU;
700015;10进入结束节点DefaultNONE
700015;6进入判断dP/dU是否小于步长调整设定值的节点DefaultNONE
700016;7减小电压增量DefaultSet_PointsUc:Ucs
700016;7增大电压增量DefaultSet_PointsUc:Ucb
700017;8增大电压DefaultSet_PointsUset_POINT:Uset_POINT+Uc
700017;9减小电压DefaultSet_PointsUset_POINT:Uset_POINT-Uc

本实验中的边声明包括了SetPoints和None两种动作类型,SetPoints连接节点的同时还需要进行动作,None只需要进行连接。

接下来简单介绍一下每条边的动作:

连接第1和第2节点的边:动作名称:AOE触发测点复位,计算dU和dI,动作类型为SetPoints,需要在这个边的动作上将DoCal_POINT置0,防止循环结束时还未置0导致网络再触发;

dU: U_POINT - Un1;计算电压的微分。

dI: I_POINT - In1;计算电流的微分。

1)连接第2和第3节点的边:动作名称:存储电压和电流值,进入判断dI是否为0的节点,动作类型为SetPoints,

Un1: U_POINT;存储电压值。

In1: I_POINT;存储电流值。

2)连接第3和第10节点的边:动作名称:进入结束节点,动作类型为None,没有动作参数只起连接作用。

3)连接第3和第4节点的边:动作名称:进入判断dI是否大于0的节点,动作类型为None,没有动作参数只起连接作用。

4)连接第4和第8节点的边:动作名称:增大电压,动作类型为SetPoints,Uset_POINT: Uset_POINT + Uc;在初始电压设定值的基础上增加一个步长。

5)连接第8和第10节点的边:动作名称:电压限幅,动作类型为SetPoints,Uset_POINT: (Uset_POINT <= Uuplim && Uset_POINT >= Udownlim) * Uset_POINT + (Uset_POINT > Uuplim) * Uuplim + (Uset_POINT < Udownlim) * Udownlim;判断电压是否超出限定值,未超出输出电压值,超出则输出电压设定值。

6)连接第4和第9节点的边:动作名称:减小电压,动作类型为SetPoints,Uset_POINT: Uset_POINT - Uc;在初始电压设定值的基础上减去一个步长。

7)连接第9和第10节点的边:动作名称:电压限幅,动作类型为SetPoints,Uset_POINT: (Uset_POINT <= Uuplim && Uset_POINT >= Udownlim) * Uset_POINT + (Uset_POINT > Uuplim) * Uuplim + (Uset_POINT < Udownlim) * Udownlim;判断电压是否超出限定值,未超出输出电压值,超出则输出电压设定值。

8)连接第2和第5节点的边:动作名称:存储电压和电流值,计算dP/dU,动作类型为SetPoints。

Un1: U_POINT;存储电压值。

In1: I_POINT;存储电流值。

dPdU: I_POINT + U_POINT * dI / dU;计算并存储dP/dU的值。

9)连接第5和第10节点的边:动作名称:进入结束节点,动作类型为None,没有动作参数只起连接作用。

10)连接第5和第6节点的边:动作名称:进入判断dP/dU是否小于步长调整设定值的节点,动作类型为None,没有动作参数只起连接作用。

11)连接第6和第7节点的边1:动作名称:减小电压增量,动作类型为SetPoints,Uc: Ucs;当dP/dU小于设定步长时,设定步长更改为最小步长。

12)连接第6和第7节点的边2:动作名称:增大电压增量,动作类型为SetPoints,Uc: Ucb;当dP/dU大于设定步长时,设定步长设定为最大步长。

13)连接第7和第8节点的边:动作名称:增大电压,动作类型为SetPoints,Uset_POINT: Uset_POINT + Uc;当dP/dU大于0,电压增大一个步长。

14)连接第7和第9节点的边:动作名称:减小电压,动作类型为SetPoints,Uset_POINT: Uset_POINT - Uc;当dP/dU小于0,电压减小一个步长。

5、低代码控制器

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

使用的时候,将电源线与电源相连,打开电源开关,再用网线将控制器与计算机连接,就可以使用。

6、MATLAB仿真过程

6.1、连接低代码控制器

这一步低代码控制器的连接和案例1中完全一致,将MATLAB的文件夹打开到低代码控制器替代后的simulink模型文件的文件夹。

当与实体的控制器连接时,就是将所实现的功能放入实体的控制器中,只需要将控制器与电脑通过网线连接后,修改主站和从站的ip地址。 控制器(从站ip)可以从发现工具获得。

主站ip为本机ip地址,通过网络属性配置中可以查询。

6.2、配置低代码控制器的文件

通过网页端上传的方法与案例1-房屋温度控制中介绍的步骤完全一致,此处不再赘述。

6.3、MATLAB界面操作

配置完成后,进入MATLAB的界面。然后打开控制器的源文件mpptCtrl.m文件。

打开mpptCtrl函数,修改相关参数。

以上这个程序段用于联系控制器与MATLAB,在建立modbus通信的代码中,输入从站ip(“127.0.0.1”,当连接实体的控制器时,需要填写查找得到的控制器的ip地址)和端口(502,这个端口是由通信通道配置里选择的)。

在命令行窗口中输入modbus通信,判断通信是否成功连接。

6.4、simulink模型参数设置

配置好所有文件,打开MATLAB配置好与控制器的通信后,打开simulink模型。

打开simulink里的configuration。

Simulink仿真参数设置

设置Configuration的相关参数如上图所示。

光伏输出功率曲线

运行之后可以从光伏输出功率的变化窗口观察到功率的变化情况,可以发现最终功率已经保持在一个比较高的水平了。

7、总结

本实验中,利用低代码控制器实现了光伏模型中的最大功率点跟踪(MPPT)技术,模型中的AOE网络的建立十分的直观,可以通过这个网络直接观察到运行步骤的所有过程,模型的构建简洁明了,适合通过类比推导出各种不同功能的模型。

附件:MPPT光伏最大功率点跟踪示例.rar