☰
Simulink光伏组件遮阳仿真:从单二极管模型到MPPT失配分析
2026/9/29 20:40:11 网站建设 项目流程

做光伏项目的朋友应该都有体会:组件上只要出现阴影,发电量掉得就特别不讲道理。屋顶分布式项目的早晚遮挡、山地电站邻近山体投下的影子、阵列间距不足导致的前后排互遮,甚至一片落叶、一摊鸟粪,都可能让整串组件的输出功率大幅缩水。想搞清楚阴影到底损耗了多少、组件内部发生了什么事、后续选优化器还是改接线,最可靠的办法不是靠经验拍脑袋,而是建一个能真实复现光照变化的仿真模型。在MATLAB/Simulink里做光伏组件遮阳仿真,恰好是兼顾精度、效率和可扩展性的成熟方案。

这篇文章会从光伏组件遮阳问题的本质讲起,逐步拆解单二极管等效电路模型、遮阳工况的数学化描述、Simulink建模的三种思路,然后再给出一套可落地的分区遮阳模型搭建方法,最后补充批量仿真、结果分析、常见坑位排查,以及基于仿真数据做高斯过程回归代理模型的进阶玩法。内容适合正在做光伏系统电气设计、组件级电子设备评估、储能运维,或者在学校搞新能源方向的本科生和研究生。哪怕你Simulink用得不算熟,按着步骤一步步来,也能把模型跑起来。

1. 遮阳仿真的使用价值与场景拆解

1.1 一片叶子就能让整块组件“躺平”:遮阳为什么不是按面积算的

很多人刚接触光伏时有个直觉:组件被遮住10%的面积,功率大概也就损失10%。这个直觉在辐照度整体下降时基本成立,但在局部遮阳时完全不成立。光伏组件内部是电池片串联结构,串联回路里电流处处相等。当某一片电池被遮挡,它的光生电流大幅下降,整串电流就会被这片“弱势电池”拖住,其他正常发电的电池明明能输出更高的电流,却被限制在一个很低的水平上。

举个极端例子:一块60片电池的组件,假设每片电池短路电流都是9A,其中一片被完全遮挡后光生电流掉到6A,如果没有旁路二极管,整串电流最大也只能到6A。想想看,59片电池都在正常工作,整体输出却被一片电池锁死,功率损失早就不是1/60了,可能直接掉一半以上。更麻烦的是被遮挡的那片电池在回路里会变成负载,被其他电池反向偏置,电流流过它的内阻产生焦耳热,这就是所谓的热斑效应。时间长了封装材料老化、焊点脱焊,极端情况下还会起火烧坏组件。

所以做遮阳仿真,核心目的不是算“少发了多少电”,而是理解串联电路中电流失配带来的非线性连锁反应。Simulink这种面向物理系统的建模工具,天生适合把这种耦合关系描述清楚。

1.2 哪些实际场景最需要遮阳仿真

遮阳仿真的需求远不止“看个曲线”这么简单,实际工程里至少有三个层面的问题要靠它回答。

第一类场景是屋顶分布式光伏的前期排布评估。女儿墙、烟囱、电梯机房、线缆桥架,甚至隔壁楼的影子,都会在特定时段扫过组件阵列。很多设计人员只用PVsyst这类辐照分析软件估算年发电量损失,但这类软件对组件内部的局部失配、MPPT工作点迁移过程描述比较粗糙。想知道“到底要不要上优化器”“组件串接成几块一排更合理”,就需要在电气层面做更细的仿真。

第二类场景是组件级电力电子设备(MLPE)的选型与策略验证。直流优化器、关断器、微型逆变器,这些设备的核心价值就是在遮阳工况下找回失配损失的功率。但它们的控制算法能不能在复杂遮挡组合下快速收敛到全局最大功率点,不能光看厂商宣传,最好自己在Simulink里搭一个连续可调的光照模型,把MPPT算法放上去实测。

第三类场景是跟踪支架电站的事故复盘和清洁运维规划。跟踪支架在特定角度下会产生前排支架遮挡后排组件的问题,早晚时段尤其严重。另外研究积灰、积雪这类慢变化遮阳时,也需要一个能定量描述“等效辐照度随时间变化”的仿真平台。顺便说一句,如果后面要联动机器人做光伏板清洁路径规划,Simulink模型还能作为工况数据生成器向外输出场景参数,扩展性很好。

1.3 仿真输出到底是什么:曲线、指标与决策依据

做遮阳仿真最直接的输出物就是I-V曲线和P-V曲线。没有遮阳时,P-V曲线是单峰;发生局部遮阳且旁路二极管动作后,P-V曲线会出现多个局部峰值。这个“多峰”特征直接决定了MPPT算法的工作难度,也是判断系统是否需要组件级优化器的重要依据。

比曲线更进一步的是量化指标。常用包括功率损失率、失配度(Mismatch Factor)、反向偏置电压最大值、MPPT动态响应时间等。通过这些指标,能够回答几个非常实际的工程问题:哪种遮阳组合对发电量最致命?现有旁路二极管配置能否把反向偏置电压控制在安全范围内?换用更复杂的MPPT算法后,在动态遮阳场景下能多找回多少功率?这些数据在项目可研、设备选型、故障诊断阶段都有直接参考价值。

我个人的体会是,遮阳仿真的价值不在于一次性建一个“万能模型”,而在于把问题场景化。每建一次模型,就是对一种具体工况的标准化复盘。

2. 看懂光伏组件电路模型,再去搭Simulink

2.1 单二极管模型:遮阳仿真绕不开的底层公式

Simulink里光伏组件模型的底层几乎都是单二极管五参数模型,这条公式是整个仿真的地基:

I = Iph - I0 * (exp((V + I * Rs) / (a * Vt)) - 1) - (V + I * Rs) / Rsh

其中Iph是光生电流,与辐照度近似成正比;I0是二极管反向饱和电流,受温度影响很大;a是二极管理想因子;Vt是热电压,等于NskT/q,Ns是串联电池片数;Rs是串联电阻,主要来自电池片体电阻、栅线和焊带;Rsh是并联电阻,代表漏电流路径。遮阳对模型最直接的影响体现在Iph上:局部遮阳时,不同电池片的Iph不一致,这就是失配的根源。

实际建模时完全没必要自己手推五参数。Simulink自带的PV Array模块提供两种参数输入方式:一是直接填组件规格书上的STC参数(Voc、Isc、Vmp、Imp),模块内部会自动反推五参数;二是用厂商给出的单二极管模型参数直接录入。对绝大多数人来说,填规格书参数就够了,又快又不容易错。

有一点需要提醒:单二极管模型是电学模型,不直接包含温度场分布。遮阳场景中,被遮挡电池温度通常偏低,而反向偏置电池温度会升高,这是热斑的温升来源。如果只做电学仿真,可以先把温度场设为均匀值,重点关注电压电流异常;如果项目对热风险特别敏感,后续再叠加热网络模型。

2.2 Simulink建模方式怎么选:模块库、公式还是混合方案

在Simulink里做光伏组件模型,大体有三条路线,我分别说优缺点。

第一条路线是直接用Simscape Electrical里的PV Array模块。优点非常明显:模型自带参数工程向导、内部I-V方程、支持串联并联组串配置,拖出来填参数就能跑。遮阳工况可以通过外部信号控制Irr输入端口实现,动态云遮挡、阶梯遮挡都能模拟。缺点是颗粒度不够细:PV Array的Irr输入最小只能控制到“模块”级别,如果想精确模拟同一块组件内部不同电池片局部被遮,它是做不到的。

第二条路线是全手写公式,用Simulink的数学运算模块或者MATLAB Function把单二极管方程搭出来。优点是自由度极大,每个电池段都能单独设置辐照度、温度,做机理研究再好不过。缺点是模型容易变成“蜘蛛网”,而且是强非线性方程,容易遇到代数环和收敛问题。

第三条路线也是我实际项目里最推荐的:混合方案。整串的宏观失配用PV Array模块搭建,辐照度输入端用分段信号控制;针对真正需要精细研究的组件,单独拆成“N段子串+旁路二极管”的结构,每一段用受控电流源加二极管实现,或者直接用Simscape的物理域元件。这样既能快速搭建大规模阵列,又能在关键组件上做局部精细化。

三条路线没有绝对的对错,取决于仿真目标。如果只是做整个电站年发电量评估,模块库路线绰绰有余;如果是研究MPPT算法在多峰曲线下的行为,那必须走精细路线。

2.3 把遮阳写进模型:辐照度折减与旁路二极管

要把遮阳“写”进Simulink模型,第一步是做数学化描述。遮阳不等于辐照度归零,真实阴影下组件仍然能接收到散射光。所以有效辐照度一般这样算:

Geff = G_global × (1 - shading_ratio × (1 - diffuse_fraction))

shading_ratio是阴影遮挡比例,范围0到1;diffuse_fraction是散射光占全局辐照度的比例,阴天可能高达0.3~0.5,晴天只有0.1左右。如果是做简化搭建,可以直接用Geff = G × (1 - shading_ratio),先不考虑散射光,等模型跑通了再细化。

第二步是理解旁路二极管的作用。光伏组件内部每18~24片电池会反并联一个旁路二极管。当某一串被遮导致电流不足时,该串两端电压反向,旁路二极管导通,把这一串短路掉,让其他正常子串的电流绕过去继续输出。这就是局部遮阳时P-V曲线出现阶梯状的原因。Simulink里模拟旁路二极管很简单,直接用Simscape Electrical里的Diode模块,或者用一个带导通条件的受控开关代替,两种方式我在实操中都用过。

值得注意的是,旁路二极管数量决定了P-V曲线出现局部峰值的数量。60片电池的组件如果只有3个旁路二极管,就意味着最多可能出现3~4个峰。这直接影响MPPT算法的工作状态。所以建模时旁路二极管的分组方式一定要和实际组件保持一致,不能随便简化。

3. Simulink遮阳仿真模型搭建实操

3.1 跑通第一个基础模型:从空模型到STC曲线

我默认你用的MATLAB版本在R2020a以上,并且安装了Simscape Electrical工具箱。第一步先在命令行输入simulink,新建一个空白模型,保存为pv_shading_demo。

打开Simscape Electrical库,拖入PV Array模块。双击打开参数设置,在Array type下拉框里选“User-defined”,然后按你手头组件规格书填数据。我常用的示例组件参数是额定功率315W,Voc 45.3V,Isc 6.15A,Vmp 36.4V,Imp 5.54A,串联电池数60。并联支路数先填1,只模拟一块组件。模型里还有一个Temperature输入端口,对应组件温度,先固定为25。

接着从Simscape Electrical的基础元件库里拖出一个可变电阻,或者用一个可控电流源加负载来扫描I-V曲线。最直观的方式是拖一个电压源串联在组件输出端,电压从0扫到Voc,记录电流。不过这种方式要处理物理域和非物理域的转换,新手容易乱。更省事的办法是直接用Simscape的“Swept DC Voltage Source”,把扫描时间和电压范围设置好,把电流传感器和电压传感器接上,再用Scope观察波形。

跑仿真前,把求解器配置一下。进入Model Settings,求解器选变步长,算法选ode23t。光伏模型带二极管这类强非线性元件,ode23t比默认的ode45稳得多,这是我试了很多次后固定下来的配置。仿真时间设为对应扫描时间,比如3秒。跑完后Scope里应该能看到一条典型的光伏I-V曲线:电流在低压段保持接近短路电流,到接近Vmp时开始下降,越过Voc附近电流迅速掉到0。

到了这一步,基础模型就跑通了。先别急着加遮阳逻辑,建议对比一下仿真出来的Isc、Voc、Vmp和规格书是否对得上。对不上就先调参数,不要往下走,不然后面出了问题根本分不清是模型问题还是遮阳设置问题。

3.2 给组件加“斑马线”:分区遮阳与旁路二极管仿真

基础模型跑通后,下一步要把组件分成几个电池段,分别接受不同的辐照度,并在段间加上旁路二极管。

最实用的做法是把组件切成3段,每段对应约20个电池片。在Simulink里我不能直接拆PV Array模块,所以这里改用另一个方案:拖3个PV Array模块,每个模块的串联电池数设为20,并联支路数设为1,然后把它们串接起来;每两个模块之间的节点跨接一个Diode,方向要注意,旁路二极管的阳极接在模块输出负端,阴极接在正端,这样才能在被遮挡时导通。

3个PV Array模块的Irr输入分别接到3个信号源。最直观的是用Signal Editor模块,把每个分区的辐照度波形按时间设置好。举个例子:0到1秒,3个分区都是1000 W/m²;1到3秒,分区2降到200 W/m²,其他不变;3到5秒,分区1和分区2都降到300 W/m²。这就模拟了一片云先遮住中间、再遮住左边的情景。

跑完仿真后,把总输出电压和总输出电流接到Scope,同时用To Workspace模块把数据存下来,后面画图用。观察I-V曲线,你会看到非常典型的阶梯状结构:在某个电流拐点处电压跳变,这是因为对应的旁路二极管导通了。这份阶梯曲线就是遮阳工况的“指纹”,后面所有分析都围绕它展开。

有些朋友不想用3个PV Array,想在一个PV Array里通过矩阵Irr输入控制分区辐照度,也不是不行,但PV Array模块的Irr端口默认是整块组件级联的输入,分区控制做不到。这也是为什么我更推荐“多模块串联+旁路二极管”的方案,虽然模型看起来零件多一点,但每个环节的物理含义都非常清晰。

3.3 用结构体管理参数:告别反复开GUI

仿真过程中不可避免要反复调整参数。如果每次都在GUI里改数值,既慢又容易记混。我习惯的操作方式是:把所有模型参数封装成一个结构体,在MATLAB工作空间里维护。

比如新建一个脚本,定义这样一个结构体:

scenario = struct(); scenario.T_cell = 25; scenario.G1 = 1000; scenario.G2 = 1000; scenario.G3 = 1000; scenario.Rsh = 300; % 并联电阻下限,欧姆 scenario.Rs = 0.5; % 串联电阻,欧姆

然后在Simulink模型里,凡是需要外部给定的参数都改成从工作空间读取:PV Array模块的Temperature端口直接连一个Constant模块,常量的值写成scenario.T_cell;Irr输入不用信号编辑器了,改成从MATLAB Function或者From Workspace模块读取scenario.G1、scenario.G2、scenario.G3。最灵活的方式是双击MATLAB Function,在代码里直接引用结构体字段。

有一点要特别注意:Simulink里的MATLAB Function模块默认不支持结构体参数直接作为输入端口传入,除非你定义Simulink.Bus。想省事的话,我的做法是从结构体里取出具体值,再作为普通标量信号连进模型。结构体真正的用武之地是在脚本层,用来管理批量仿真的参数组合,而不是直接塞进模型端口。

3.4 批量扫描遮阳场景并保存所有结果

有了结构体管理参数的思路,批量扫描就顺理成章了。我先定义一个遮阳比例数组,比如希望模拟“分区2遮挡比例从0到100%”这一系列工况:

shadingLevels = 0:0.2:1.0; scenarios = struct('G1', cell(size(shadingLevels)), 'G2', cell(size(shadingLevels)));

循环里给每个工况设置参数,然后调用sim函数。用传统方式写是这样:

for i = 1:numel(shadingLevels) scenario.G1 = 1000; scenario.G2 = 1000 * (1 - shadingLevels(i)); scenario.G3 = 1000; out = sim('pv_shading_demo'); results(i).I = out.I_vec; results(i).V = out.V_vec; results(i).Pmax = out.Pmax; end

如果工况数量多,还可以用Simulink.SimulationInput加parsim做并行仿真,速度提升很明显。每个仿真独立设置变量,互不干扰:

for i = 1:numel(scenarios) simIn(i) = Simulink.SimulationInput('pv_shading_demo'); simIn(i) = simIn(i).setVariable('scenario', scenarios(i)); end out = parsim(simIn);

所有结果保存到results结构体里,最后统一用plot画I-V曲线族。曲线一画出来,整个遮阳趋势就非常直观:遮挡比例增大,阶梯往下掉,短路电流下降,最大功率点左移。最后再用writetable把关键指标汇总成表格导出,项目报告里的分析图表直接就有了素材。

4. 典型仿真结果解读与性能评估

4.1 阶梯状I-V曲线:看懂遮阳的指纹特征

批量仿真跑完,先拿一组数据出来好好看看。假设组件300W,三个分区分别对应三个旁路二极管,分区2的遮挡比例从0逐步增大到100%。

无遮阳时I-V曲线是平滑的矩形,P-V曲线是漂亮单峰。当分区2遮阳20%时,I-V曲线会在电流略低于分区2短路电流的位置出现“肘部”。对应的P-V曲线不再是单峰,而是出现一大一小两个峰:左侧高峰通常对应正常分区绕过被遮分区继续工作的状态,右侧峰对应被遮分区也跟着输出但电流被拖低的工况。遮阳比例继续增大时,右侧峰逐渐变矮、左移,最终全局最大功率点跳到左侧低压区。

这个现象特别值得说清楚:MPPT控制器搜索最大功率点时,如果初始工作点落在右侧局部峰值附近,多数扰动观察会一直停在错误的位置,丢失真正的最大功率。仿真看到哪个峰更高,取决于旁路二极管分组的耦合方式和遮挡面积。这也是为什么我强调建模时旁路二极管分组一定要还原真实组件——它直接决定了多峰形态。

4.2 功率损失与MPPT工作点迁移

把无遮阳最大功率Pmax_stc作为基准,每一组遮阳工况的最大功率Pmax_shaded算一个相对损失率:

Loss = (Pmax_stc - Pmax_shaded) / Pmax_stc × 100%

实测经验数据是这样的:单分区20%遮阳时,损失率往往已经超过10%;单分区50%遮阳时,损失率可能逼近30%;如果两个分区同时各被遮50%,损失率经常直接超过50%。这个结果远大于“遮阳面积比例”,原因还是那句话,串联支路电流被最低光生电流的分区锁定了。

把MPPT工作点随时间的变化放在同一张图上,还能看到另一个问题:固定电压法在阴影出现时会让工作点偏离新曲线的最优位置,因为它的参考电压是按无遮阳工况设置的。而扰动观察法虽然能跟踪,但多峰条件下容易陷入局部最优。用Simulink模型做这类算法对比非常方便,对搞控制器的人来说等于是一个免费的验证平台。

4.3 失配度与热斑风险早期判断

失配度是评价串联失配严重程度的常用指标,定义有很多写法,我习惯用这个:

Mismatch = (P_total_sections - P_array) / P_total_sections × 100%

分子里的P_total_sections是把各分区当作独立组件在各自辐照度下的最大功率求和,P_array是它们串接成组件后实际能输出的最大功率。失配度越大,说明串联带来的相互钳制越严重,旁路二极管动作得越多。

热斑风险则要看被遮挡区段的反向偏置电压。当某分区被遮严重时,其他正常分区通过旁路路径施加在这个分区上的反向电压可能很高,超过电池反向击穿电压就会诱发局部热点。把仿真中每个二极管两端电压都记录下来,取反向电压最大值和对应工况,可以把最危险场景确定下来。这样后面做旁路二极管数量优化、保险丝配置时就有数据支撑,而不是凭感觉。

5. 常见问题与实战排查技巧

5.1 仿真步长卡死、跑不动怎么办

加了旁路二极管后,模型明显变“硬”:二极管指数方程让系统出现极小的特征时间常数,变步长求解器不得不把步长压到微秒级,仿真速度直线下降。这是最常遇到的问题。

我处理的办法分三步。第一步,换求解器:固定用ode23t或ode15s这类隐式算法,它们在处理刚性系统时不会像ode45那样频繁减小步长。第二步,给二极管并联一个Snubber电阻(吸收电阻),Simscape里的Diode模块可以设置Snubber resistance,数值取100kΩ到1MΩ,这不会影响正常工况准确性,但能显著改善收敛。第三步,关掉不必要的电气测量模块,尤其是高频开关器件模型,不要为了多一个测点拖慢整个系统。

顺带提一句,有朋友喜欢自己用基础模块搭积分器,想通过Forward Euler这类显式离散化实现仿真,这就要格外小心稳定性。显式欧拉法对步长的要求非常苛刻,步长必须小于系统最小时间常数的两倍附近,否则数值解直接发散。在光伏遮阳这种带强非线性二极管的系统里,自己搭积分器弊大于利,强烈建议直接用Simscape物理域元件,让求解器自动处理。

5.2 自带PV模块“不够细”时的替代路线

用PV Array模块做整串失配仿真很方便,但如果你要研究“同一块组件左半边全被遮、右半边正常”这种更精细的工况,PV Array模块确实力不从心。替代方案是放弃模块库,自建电池段模型。

我试过的一种可行方案是:用受控电流源模拟光生电流,再用一个二极管方程模块表示PN结,串联电阻和并联电阻用物理电阻元件搭。每一段代表一定数量的电池片,段间再跨接旁路二极管。这种方案虽然搭建更费劲,但每个分区的辐照度、温度都能独立设置,甚至可以模拟电池片之间遮阳过渡带的渐变效果。

自建模型时最坑的是代数环。MATLAB Function里如果直接写I和V互相依赖的隐式方程,仿真时会频繁报错。解决办法是引入一个小惯性环节打破代数环,或者干脆把方程写成显式迭代形式。如果只是为了工程评估,其实不怎么需要自建模型,PV Array加外部信号控制Irr已经覆盖了大部分场景。

5.3 结构体传参踩坑记录

前面说了结构体适合在脚本层管理参数,但如果你直接想把它当Simulink信号输到MATLAB Function里,会遇到麻烦。Simulink的MATLAB Function默认把它当作标量或者总线信号处理,普通struct类型进去会编译报错。

我的规避方式有三种,按场景选择。单参数批量仿真:在脚本里循环修改scenario,再通过sim的setVariable把字段逐个赋给模型里的Constant模块;模型内部所有需要变化的参数都定义成Constant或者From Workspace,不直接用MATLAB Function;模拟变量数量较多时,定义Simulink.Bus对象,把结构体接入总线信号。第三种方式配置起来麻烦,但用了之后模型最整洁。

5.4 小样本数据场景:用高斯过程回归做快捷代理模型

仿真跑了几百组之后,如果还想在更大的参数空间里快速评估遮阳组合对功率的影响,逐组仿真会比较耗时。这种情况下可以用高斯过程回归做一个代理模型。

GPR对小样本数据的拟合能力和不确定性估计都非常好。做法很简单:把仿真结果整理成表格,每行是一组工况,特征列可以是分区遮阳比例、温度、辐照度,输出列是最大功率或失配度。然后用MATLAB的fitrgp函数完成训练:

Tbl = table(shadingA, shadingB, T_cell, Pmax); gprMdl = fitrgp(Tbl, 'Pmax', 'KernelFunction', 'squaredexponential'); predPmax = predict(gprMdl, [newShadingA, newShadingB, newT]);

几十个样本时GPR的预测精度就已经很可观,而且它自带置信区间,能告诉你哪些区域外推不可靠。相比神经网络,GPR不需要大样本,调参也更省心。当然,代理模型只是替代品,数据源头还是Simulink仿真,先把仿真模型做准,代理模型才有意义。

5.5 这套建模思路还能迁移到哪里

光伏遮阳仿真的本质,是把一个物理对象离散成若干个单元,用等效电路描述每个单元,再用一条串联回路的约束条件把它们耦合起来。这套“单元-连接-工况”的建模习惯,在电气工程里到处都是:变压器绕组的励磁涌流仿真、局部放电等效间隙模型、蓄电池组的单体失配分析,都是同一个玩法。

我有次帮同事看一个变压器励磁涌流的仿真模型,他用了很多电力电子开关去凑波形,结果收敛性极差。我上手后直接按“每相绕组当成一个非线性电感单元、磁路耦合用受控源表达”的思路去搭,Simulink跑得又快又稳。光伏遮阳和变压器励磁涌流看似风马牛不相及,底层逻辑其实殊途同归。

所以这篇内容虽然标题是光伏组件遮阳仿真,你真正带走的应该是一套Simulink建模的方法论:物理单元怎么切、约束方程怎么建、参数怎么批量管理、结果怎么量化评估。把这些想明白了,以后遇到任何电工电子层面的仿真问题,都能按这个框架往下走。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询