手头这个项目,一句话概括就是把“电动汽车反哺电网”这件事,用MATLAB/Simulink搭一个24小时能跑的微电网仿真环境。听着概念挺多,其实拆开看就是三条线:光伏发电、电动车充放电、微电网负荷平衡。V2G(Vehicle-to-Grid,车到电网)在这里不是让你把车当单纯的用电器,而是让车在需要时变成电网的“移动充电宝”,电价高的时候把电池里的电卖回给电网,电价低或光伏过剩的时候再充进去。这套玩法如果只靠文字描述,谁都觉得合理,但是真放到具体场景里——白天光伏出力有多高、晚上负荷多少人、车什么时候在充电桩旁边,其实全是变量,不跑仿真根本看不准。
如果你是想验证V2G策略能不能削峰填谷,或者想看微电网在不同时段如何分配功率,这篇笔记会比较对路。我默认你已经会基础的Simulink操作,知道怎么拖模块、连信号线,但还没系统搭过一个完整的微电网模型。下面这些内容全部来自我自己踩坑和调试的心得,照着搭能少走不少弯路。
1. 项目整体设计与仿真思路拆解
1.1 为什么选Simulink搭微电网而不是其他工具
很多人在选型的时候会纠结:能不能用Python里的电力系统库直接算?当然能,但是微电网这个场景有个很特殊的地方——它既包含“功率调度”这种偏离散的、按分钟甚至小时算一层,又包含电力电子开关这种几百微秒级别的动态过程,两层耦合在一起。用Python写纯数值模型,要么舍弃开关级动态只算潮流,要么每一步积分都慢得离谱。
Simulink在这类场景的天生优势就是多速率混合仿真。电气层可以用很小的步长跑PWM逆变器、DC-DC变换器,而能量管理策略层可以用1秒甚至1分钟为步长做逻辑判断。模型同时存在多个采样速率,Simulink会自动调度,不用你自己拆成两套系统对接。
再说物理建模的部分。Simulink里的Simscape Electrical专门给电力电子准备了一系列现成模块,像三相电压源、IGBT桥、变压器、PWM发生器,拖出来就能用。你不需要自己写电压方程的求解器,也不用担心三相系统里的坐标变换写错,模块内部已经处理了。我们最关心的是外部控制信号怎么加、测量信号怎么取,剩下的电气细节由工具兜底。
最后是策略验证的便利性。你想调充放电阈值、或者改一下SOC上下限,直接在Stateflow或者MATLAB Function里改几行逻辑就行,不用动主电路。如果项目后期要做硬件在环,Simulink生成C代码也顺理成章。这个“从策略验证到快速原型”的路径,是很多团队仍然坚持Simulink做电能系统仿真的核心原因。
1.2 24小时时间尺度的选择与模型解耦策略
为什么偏偏是24小时?因为V2G的价值只能放在日周期里才能看清楚。光伏出力是跟太阳走的,负荷是跟着生活作息走的,电动车早上开到公司、晚上回来插上充电,这些都是以“天”为单位重复的规律。如果你想评估“这个调度策略到底省了多少钱”“储能够不够用”,看一个稳态时刻点没有任何意义,必须看一天里的能量累积情况。
但直接用物理级模型跑24小时,又会踩到计算量爆炸的问题,这也是很多新手动辄跑一晚上没结果的原因。电气层的PWM载波频率通常是几kHz到几十kHz,对应仿真步长要到微秒级,一秒电气动态就要算几十万步,24小时根本不可能走完。
所以必须解耦。我的做法是把模型分成两层:上层是能量管理系统,负责按15分钟或1小时间隔采样负荷、光伏、电价、SOC,然后算功率分配指令;下层是电气主电路,负责把指令执行出来。但下层不一定要每时每刻都做开关级仿真。你可以把V2G充放电功率、储能输出功率、光伏输出功率直接用受控电流源接到直流母线上,用一个等效模型替代完整变换器,这样仿真速度快很多。完整电力电子模型只在你需要验证换热器表现、电压纹波、开关损耗这类细节时才启用。
当然也有人会选择另一种思路:把24小时分成288个5分钟时段,每个时段单独跑一个稳态潮流,所有时段都跑完之后把结果拼接起来,这其实就是“准稳态仿真”。Simulink里可以通过Simulink Multiple Simulations或者一个For Iterator Subsystem来实现,不会太难。我在项目里选择了准稳态与动态混合的折中方案——电网波动大的切换瞬间用短步长,平稳时段用大步长,效率与精度都能兼顾。
2. 模型初建:微电网物理对象与参数假设
2.1 微电网拓扑结构与部件选型
开始搭模型之前,一定先把拓扑画清楚,否则后面每个模块都不知道该连到哪。我用的微电网拓扑是直流母线加交流母线混合结构,这是当前真实微电网最常用的布局之一,也是最好扩展的架构。
交流母线连接公共电网、交流负荷,还有一台双向AC/DC变换器,负责直流母线和交流母线之间的功率交换。直流母线上挂了三样东西:光伏阵列、储能电池组、V2G充电桩。充电桩不是普通的单向充电机,而是双向可控的,既能给车充电,也能把车里的电回送到直流母线,再通过AC/DC变换器卖给交流测负荷或电网。这个双向能力是整个V2G仿真里最关键的物理特征。
参数方面我建议按一个小型微电网规模设置,毕竟仿真速度和分析复杂度都要平衡。下表是我在模拟项目X里用的基准参数,你可以按实际情况缩放:
| 部件 | 关键参数 | 设定值 |
|---|---|---|
| 光伏阵列 | 额定功率 | 750 kW(峰值) |
| 光伏组件 | 单块组件 | 300 W,开路电压45V,短路电流9A |
| 储能电池 | 额定容量 | 500 kWh |
| 储能电池 | 初始SOC | 70% |
| 电动车电池 | 单台容量 | 60 kWh |
| 电动车V2G数量 | 并网数量 | 20台 |
| 直流母线电压 | 额定值 | 750 V |
| 交流母线电压 | 额定值 | 380 V / 50 Hz |
| 公共电网变压器 | 变比 | 10 kV / 380 V |
请注意,这个容量配比对一个小厂区或者小区级的微电网比较合理。光伏750kW已经不算小屋顶了,储能500kWh加上20台车的车载容量,合计储能超过1700kWh,足足可以及上微电网主力电源。功率配比要避免光伏容量远大于负荷和储能总和,否则仿真里会出现大面积弃光,策略再聪明也没用。
2.2 车辆电池与控制边界建模
做V2G仿真最怕的就是把车辆电池做成一个简单的“黑盒电压源”。电池的实际充放电特性受SOC、温度、电流倍率影响很大,如果只用固定电压源,你的能量管理策略会得到过于乐观的结果,实际调出来的策略拿到真实场合根本不成立。
在Simulink里我建议用Simscape Electrical里的Battery block,它内置了放电倍率、开路电压与SOC的关系曲线,而且可以设定温度工作点。虽然这个模块还是比真实电化学模型简化很多,但做系统级仿真是足够用的。你只需要设置几个基础量:电池额定电压、额定容量、初始SOC、内阻。我把每台车的内阻设成40毫欧左右,对于60kWh的电池包这个数量级比较常见。
真正的V2G边界条件是充放电功率限制以及SOC运行窗口。电池不适合跑到0%或者100%,长期深充深放不仅寿命衰减快,而且接近边界时内阻变化、可用的功率响应也完全不同。我在控制策略里设定了单车SOC运行区间为20%~90%,低于20%强制退出V2G放电模式,高于90%强制停止充电。同时,每台车设置最大充放电功率为7 kW,这对应普通单向交流充电桩加上双向能力功率等级,20台车合计140 kW,足够参与微电网调峰。
另一个容易被忽略的是车辆是否“在场”。白天车不在停车场,你的V2G车队再大也用不上。所以模型里必须考虑车辆的可调度状态。我给每台车增加了一个出行时间表:工作日早上7点到下午18点,车辆离网,不参与任何调度;其他时间才能作为V2G资源。这个逻辑看似常识,如果不建模,策略会在白天也把车辆功率用进去,光伏和负荷一平衡,算出来的结果比实际乐观很多倍。
2.3 通信与控制建模的合理简化
真实V2G系统里涉及车、桩、微电网能量管理系统、电网调度之间的复杂通信,协议、延时、网络安全都是很大一摊事。但是在仿真阶段,过度纠结通信协议没有任何意义,你要验证的核心是能量管理算法本身的逻辑与控制效果。所以通信层我建议直接简化为理想的“信号传输通道”,也就是Simulink信号线。
控制架构是典型的分层结构:本地控制器负责各变换器的电压、电流内环控制,外加一个中央能量管理控制器,做全局功率分配。中央控制器每个控制周期读取光伏输出、储能SOC、车辆SOC、负荷功率、当前电价,然后按优先级算法发出功率指令。该指令传输延迟我设置为100ms,这是比较现实的通信裕度,又不会大到影响控制稳定性的程度。
合理简化的边界是:保留造成主要影响的物理约束,抛弃对策略效果无关紧要的细节。比如通信丢包、报文格式这些先不考虑,等策略本身验证稳定了再往后做更深入研究;但电池SOC上下限、功率速率限制是物理世界逃不掉的东西,一定要保留。
3. 在Simulink中逐块搭建24小时运行情景
3.1 主电路搭建思路与关键模块连接
打开Simulink,新建一个模型,先拖入Simscape Electrical基础库里的模块。我建议用“Specialized Power Systems”这套模块组,这套模块的工作方式比Simscape物理建模更贴近传统的电力系统仿真习惯。你可以用万用表测量,用受控电压源/电流源作为接口,控制逻辑还是用普通Simulink信号,两边通过电压测量、电流测量模块连接。
搭建顺序从交流侧开始。交流母线用Three-Phase Source模拟10kV电网,经过一个Three-Phase Transformer把电压降到380V。变压器一次侧采用Yg接线方式,二次侧采用Delta接线,这样能给直流变换器提供一个稳定的三相电压源。变压器后面接交流母线,母线上并联一个交流负荷模块和双向AC/DC变换器。
双向AC/DC变换器用Universal Bridge模块实现,桥臂类型选IGBT/Diode。这个桥可以工作在整流模式,也就是直流750V往交流侧送;也可以工作在逆变模式,把交流电变成直流电。控制信号由PWM Generator产生。PWM的载波频率我设为10kHz,调制波来自电压电流控制器的输出,整个控制结构就是很典型的双闭环——外环直流母线电压控制,内环电流控制。
直流母线用一个大电容支撑电压,容量取10mF。母线正负极之间挂光伏阵列模块、储能电池模块、以及20台电动汽车的聚合模型。很多人在这一步会犯一个混淆:V2G车辆的对象到底用什么模块?如果你只关心总体的功率和SOC趋势,其实没必要做20套完整的双向DC-DC加电池模型,计算量大且爆炸风险高。我们可以做一个聚合车辆模型——用一台等效大容量电池加上一台双向DC-DC变换器,电池容量设为60*20=1200kWh,充放电功率上限140kW,等效内阻是单车的五分之一左右。这样模型的规模小了一个数量级,而能量管理策略看到的状态跟20辆车一模一样。
3.2 24小时光伏、负荷、用电曲线的时序信号构造
仿真要跑24小时,就必须有模拟一天24小时变化的数据源。这部分不需要手写一堆正弦函数,更关键的是把真实曲线放进去。
光伏辐照曲线我用两个手段生成:一是从某气象数据库下载典型日的逐小时辐照度数据,导入到MATLAB工作区,生成一个双列数组,第一列是时间点(小时),第二列是辐照度。用From Workspace模块把时间序列读入模型,作用到光伏模块的辐照度输入端口。光伏组件温度也一路输入,用固定常数就可以,或者按环境温度曲线稍微调一下,但影响不大。
负荷曲线用Signal Builder模块搭建比较直观。这个模块可以在图形界面里直接画出负荷功率的24小时变化,双击调出数据点,白天两个用电高峰,晚上低谷。我这里用的负荷曲线大概长这样:凌晨3点最低250kW,上午9点开始爬升到700kW,午后短暂回落到550kW,下午17点达到全天峰值850kW,夜晚逐步降到300kW左右。这些数字结合光伏和储能容量,让模型在一天中至少经历一次“光伏大于负荷”的时段和一次“负荷远大于光伏”的时段,才能看出V2G策略效果。
电动汽车的“是否在家”序列更好处理,直接做一个阶梯信号:7点到18点数值是0,其余时间是1。生成方式可以用两个Step模块叠加,或者直接用Signal Builder。
把这些时序信号做成时间序列的好处是,后续做参数分析可以直接替换整个数据源,而不用改模型。我建议把所有原始数据离线处理好,存放于data.xlsx,通过MATLAB脚本读进来,再赋值给baseline工作空间,这样不同日期的光伏负荷曲线都能复用一套模型结构。
3.3 V2G能量管理策略的Stateflow逻辑实现
能量管理策略是整个模型的灵魂。这是V2G仿真里最值得花时间仔细设计的地方。我用的策略框架是一个基于“优先级”的分时调度逻辑,整个逻辑放在Stateflow里实现。
策略目标按重要性排序:
- 优先满足交流负荷供电需求
- 尽量多利用光伏出力,避免弃光
- 利用储能和V2G电池在电价高峰时段放电
- 在低电价时段给车辆和储能充电
具体执行上,每个控制周期内中央控制器先计算净负荷,NetLoad = 负荷功率 - 光伏出力。净负荷为正表示电不够用,需要从电网或者电池、V2G补电;净负荷为负表示光伏有富余,可以用来充电或者卖给电网。
然后根据当前时刻电价处于“峰、平、谷”哪一档,切换到对应运行模式。在平时段只做净负荷平衡,在谷时段优先给储能补电、给车辆慢充,在峰时段优先让车辆放电回馈电网。这个逻辑用Stateflow状态机做非常合适,状态之间切换条件清晰,每个状态内部还能嵌套子状态。
同时要加上SOC保护条件。比如在峰时段,如果所有在线车辆的SOC都低于20%,系统直接退出V2G放电状态,宁可买电网电也不压榨最后那点电。这个逻辑如果用MATLAB Function写也行,但Stateflow的最大优势是可视化——策略评审的时候,状态是怎么切换的、什么条件下切,对方一眼就能看明白。
3.4 数据采集与结果记录配置
仿真跑24小时如果只看示波器上的信号,凭肉眼根本无法判断这24小时到底发生了几次充放电切换,也分析不了SOC曲线和电网购买电量。所以要建立一套完善的数据采集通道。
在关键测量点都连上To Workspace模块,我习惯把所有测量数据集中打包到一个结构体里。具体做法:用几个To Workspace分别保存时间数组、直流母线电压、光伏输出功率、储能功率、V2G总功率、负荷功率、电网交换功率、车辆SOC、储能SOC。
这里有个技巧:To Workspace的采样时间设置很关键。如果你用inf,它只在仿真步长上记录,开关级仿真的步长是微秒级,输出数组会爆炸。应该把To Workspace的采样时间设为60秒,这样24小时下来每个信号就只有1440个数据点,后续分析数据量刚刚好,既不会漏掉小时级别的功率变化规律,也不会让数据乱成一团。
如果还想顺便看几个关键时段的高分辨率波形,可以额外用一个Scope,采样率默认即可,比如想看某个V2G切换瞬间的直流母线电压波动,这个Scope能派上大用场。
4. 仿真参数整定与结果分析
4.1 步长、求解器、Powergui的选型细节
24小时仿真能不能顺利跑完,很大程度上取决于你仿真配置文件的参数怎么设。在地球上不存在一种求解器能同时兼顾开关级PWM和24小时时间跨度,所以一定要灵活用仿真暂停和重启。
打开模型里的Powergui模块,在“Preferences”里选择“Continuous”或“Discrete simulation mode”。我强烈建议选离散模式,仿真步长设成50微秒,那50微秒满足10kHz PWM的采样需求。但是整个模型不能全程都用50微秒步长,否则光一个功率平衡计算就巨慢无比。由于Simulink支持多速率采样,控制部分的采样时间设为1秒,能量管理部分设为60秒,Step模块和To Workspace采样率各设各的,模型会自动采用多速率调度,不会整体都被最小步长拖慢。
再说求解器。离散模式优先用ode45自动变步长和固定步长都可以,但离散仿真下更常用discrete求解器。如果你在模型里保留了完整电力电子开关,Simulink在离散模式下的信号是按时序推进的,所以discrete求解器反而是最佳选择。如果你是连续模式,ode23t通常比ode45更适合刚性电力系统模型,不容易因为微分方程刚性问题导致仿真崩掉。
要避免一个新手最常见的误操作:以为固定步长越小越精准,就把仿真步长拉到了1微秒甚至0.1微秒。这样跑24小时仿真,哪怕是在多速率调度下也要算几十亿步,跑一个都够睡好几觉了。我实测下来,PWM载波10kHz、仿真步长10微秒就够了,没有必要压到1微秒。当你要分析更高频纹波时,再单独把步长降下来跑一个短时间区间,比如几十毫秒的瞬态分析。
4.2 从仿真结果反推策略是否合理
仿真跑完,先把数据导出来画几个关键图。第一个必看的是“功率平衡图”:负荷功率、光伏功率、储能功率、V2G功率、电网交换功率全部画在同一个图里。功率平衡关系必须满足:负荷功率 = 光伏功率 + 储能功率(放电为正) + V2G功率(放电为正) + 电网输入功率。如果某一个时间点这个等式不成立,就要立刻检查模型里的测量模块或者控制指令有没有饱和、限幅设置。
第二个必看的是“SOC演化图”。储能SOC和车辆SOC在整个24小时里的走向直接反映了策略合理性。如果车辆SOC在电网峰时段放得很低,之后到夜间谷时段缓慢充满,说明策略真的在调峰;如果车辆SOC整天都没有明显变化,说明V2G根本没有有效调度起来,基本就等于是个仿真花瓶。
第三个必看的是电价型收益。把分时电价数组与电网交换功率逐时相乘,然后累加,就能得到一天的购电成本。然后在相同负荷、相同光伏条件下跑一个“无V2G”对照模型,再算一次购电成本,两者差值就是V2G策略带来的收益。这个数字往往是项目汇报里最亮眼的产出。
我跑完基准情景后,24小时仿真显示:当日总负荷约13.6MWh,光伏发电量约6.2MWh,V2G车辆在17:00~21:00晚高峰时段放电总计约0.46MWh,储能放电约0.62MWh,加上从电网买电3.0MWh。对比无V2G场景,电网购买电量下降了约12%。这个结果看着不算夸张,但已经能体现V2G削峰填谷的潜力。如果你调一下车辆并网数量或者SOC窗口,这个数往往还会变化,反复跑一版参数就能找到趋势。
5. 常见问题与故障排查记录
5.1 仿真崩溃、数值发散、代数环怎么定位
在搭Simulink微电网的过程里,最让人崩溃的就是仿真跑着跑着突然报错“Simulink cannot solve the algebraic loop”,或者干脆数值发散,Scope里波形瞬间冲到1e20。
代数环大多出在控制信号与测量信号直接相连的地方。典型场景是:控制器输出给变换器,变换器电流又反馈到控制器输入,中间没有任何延迟或滤波器,Simulink就遇到了一个“先有鸡还是先有蛋”的问题。解决办法是在反馈回路里串一个Memory模块或者一小段低通滤波器,给数值解法提供一步时延,代数环立刻消失。
数值发散的原因十有八九是模型时间常数差距过大。如果你在仿真步长10微秒、储能、电网、电力电子组合在一起,任何一个刚性大的微分方程都可能是元凶。排查方法很简单:把PWM停掉,给一个固定占空比,看模型还崩不崩。固定占空比下模型稳定,说明问题出在控制回路的动态相互作用;反之,则需要检查电池内阻、电容初始值、变压器参数是不是设置得不合理。
还有一个非常隐蔽的问题:电池模块初始SOC与模型preload时计算的初始状态不一致。你可以试着在仿真时间段前先加一个0.5秒的启动缓冲,让中央控制器和变换器都初始化,再把正式的调度逻辑投入工作。这个方法可以省掉大批莫名其妙的仿真初值错误。
5.2 V2G策略层面的调参教训与迟滞设计
V2G策略最典型的毛病是“抖动”。假设储能SOC和车辆SOC都在上限边缘,此时光伏出力稍稍波动一下,功率指令就会在充放电之间来回跳,电池时而充电时而放电,仿真图上会出现密集的毛刺。这种抖动不仅让仿真结果看着乱,还会导致后期波形分析和策略汇报没说服力。
治理办法是给切换条件加“迟滞”。迟滞的意思就是充电进入阈值和放电退出阈值不设成同一个值。比如我设置车辆放电模式在SOC>80%时才允许进入,但一旦进入放电,要等到SOC降到40%才允许切出;反过来充电模式在SOC<70%时才允许进入,等SOC充到95%才退出。两个阈值中间拉开一段距离,控制器就不会因为一个点的波动来回跳。
另一个常踩的坑是功率指令的速率限制。即便策略给出了瞬时的理想功率指令,实际变换器也不可能瞬间跳到指令值。在指令信号之后串联一个速率限制器,限制功率变化率不超过微电网承受能力,比如车辆总功率变化率不超过20kW/s。这个处理既能贴近真实物理特性,也能避免功率指令突变激发震荡。
5.3 仿真性能优化与内存管理
24小时仿真就算配置了多速率,算起来也要有点耐心。我做过的最直观优化:一是将完整的PWM开关模型在平稳时段切换成平均模型,二是尽量用离散求解器,三是把不必要的信号记录关掉。
平均模型的做法是把PWM逆变器等效成一个受控电压源,电压幅值按调制比线性输出,而不再做三角载波比较。这样在非重点关注时段,可以几十秒跨越一次,而不会在每个开关周期浪费时间。Simulink里可以用切换子系统的方式实现:一个子系统里放平均模型,另一个子系统放完整开关模型,根据仿真时刻用Switch切换。虽然背后要做两组模型,但这是很多工业级微电网仿真的标准操作,值得学一下。
内存管理方面,别在模型里挂一堆Scope模块却不关“Open Scope on simulation output”选项。仿真式打开几十个Scope,内存占用飙升,操作界面卡得你怀疑人生。我习惯把数据都进To Workspace,只在仿真结束后统一分析画图。Scope只留一个关键的,用来看当前时间窗的局部波形。
6. 从24小时到全年评估:项目后续还能怎么扩展
如果你已经顺利跑通了这个24小时V2G微电网模型,恭喜,你已经跨过了这个项目里最陡的一道坡。可实际微电网项目的评估往往不止看一个典型日,至少要看典型夏至日、冬至日、过渡季日,甚至跑一整年365天的数据。手动点一天跑一次显然不现实,但完全可以把模型包装成一个函数,用脚本循环驱动。
具体做法是:把Simulink模型的输入数据源全部改成语工作空间变量,每次仿真前用脚本给这些变量赋新的一组日期数据,调用sim函数跑一次,跑完保存结果,接着再改参数再跑。这一步在MATLAB里大概三十行脚本就能实现,不涉及模型结构大改动。
再往后还能做的工作就很多了:考虑多价格机制的V2G经济优化、车辆随机到场与离场的时间分布、储能老化对策略的影响、甚至把模型导出为FMU做联合仿真。我这个项目还有一部分没做完的是加了一个简单的热负荷模型,想看看冬天电采暖负荷上来以后V2G的削峰能力还能不能撑得住,目前看初测效果还不错,有机会单独再写一篇分享。
如果你也正在搭V2G微电网仿真,最想提醒一句的是别把精力先花在把电力电子模块做得无比精细上。先把“功率平衡”这件事跑通,把SOC和电网交换功率的趋势看准,再一步步往里加细节。仿真模型越到后面越容易陷入“加了个新模块、旧模块又不稳”的循环,保持随时记录基准结果的习惯,每改一版参数就保存一份对照,才能让这个项目真正成为你能反复迭代的实验平台。