【完美复现】在具有灵活结构的孤岛式直流微电网中的分层控制【IEEE16节点】(Matlab代码实现)

 💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码、数据、文章


💥1 概述

文献来源:

层次结构沿着主要、次要和三级层堆叠的方式被广泛应用于孤岛式直流微电网(DCmGs)的运行和控制,该微电网由分布式发电机组(DGUs)、负载和输电线路组成。然而,对所有层次的综合分析往往缺失。在这项工作中,我们通过建立一个自顶向下的分层控制架构来弥补这一局限性。连接到DGUs的分散电压控制器构成我们的主要层。在基于MPC 的能源管理系统(EMS)的监督下,我们的三级层为DGUs生成最优电力参考和决策变量。特别是,决策变量可以控制 DGUs 的开关以及选择它们的运行模式。中间的次要层将 EMS 电力参考转换为主要层所需的适当电压信号。更具体地说,为了提供电压解决方案,次要层解决一个嵌入功率流方程的优化问题,这些方程已经被证明总是可解的。由于负载电压不是直接约束的,它们的唯一性对于 DGUs 产生 EMS 下发的参考功率是必要的。为此,我们根据仅基于本地负载参数的新颖唯一性条件进行推导。我们的控制框架不仅适用于通用的 DCmG 拓扑结构,还可以适应由 EMS 命令引起的拓扑变化。通过对修改后的 16 节点直流系统进行模拟验证其运行方式。详细文章见第4部分。

16节点图:

直流微电网的分层控制策略: 

 

📚2 运行结果

可视化部分代码:

figure
%plot((t_start:t_start+Tsim-1)/60,P_nom(5,t_start : (t_start+Tsim)-1), 'linewidth',1)
hold on
plot((t_start:t_start+Tsim-1)/60,P_real(5, t_start : (t_start+Tsim)-1),'-r', 'linewidth',1.5)
hold on
plot((t_start:15:t_start+Tsim-1)/60,PL_nom_s(5,1 : 96), '--k', 'linewidth',2)
%title('Load power, type B')
grid on 
%legend({'Real','Forecast'},'Orientation','horizontal','location','north');
set(gca,'fontsize',15, 'FontName', 'Times New Roman')
xlim([0 24])
xlabel('Time [h]')
ylim([6.5,11])
ylabel('[kW]');
set(gca,'XTick',[0:4:24]);
box on

figure
%plot((t_start:t_start+Tsim-1)/60,P_nom(10,t_start : (t_start+Tsim)-1), 'linewidth',1)
hold on
plot((t_start:t_start+Tsim-1)/60,P_real(10, t_start : (t_start+Tsim)-1), '-r', 'linewidth',1.5)
hold on
plot((t_start:15:t_start+Tsim-1)/60,PL_nom_s(10,1 : 96), '--k', 'linewidth',2)
%title('Load power, type C')
grid on 
%legend({'Real','Forecast'},'Orientation','horizontal','location','north');
set(gca,'fontsize',15, 'FontName', 'Times New Roman')
xlim([0 24])
ylim([8.3 16.3])
xlabel('Time [h]')
ylabel('[kW]');
set(gca,'XTick',[0:4:24]);
box on

%%
figure
plot((t_start:t_start+Tsim-1)/60, datalog.MPC.P_ref(end, t_start : (t_start+Tsim)-1)  , '--g', 'linewidth',2.5)
hold on
plot((t_start:t_start+Tsim-1)/60,datalog.OPF.Pg(pvnodes,1:end),'-r','linewidth',1.5)
hold on
plot((t_start:15:t_start+Tsim-1)/60,-P_nom(1,t_start :15: (t_start+Tsim)-1), ':','linewidth',1.5)
hold on
plot((t_start*MPCpar.t_s/60: MPCpar.t_s/60 :(t_start+Tsim-1)/60 ), -PL_nom_s(1, (t_start-1)*MPCpar.t_s + 1 : Tsim/MPCpar.t_s ), '--k', 'linewidth',1.5)
%legend({'Real','Nominal','Forecast'});
%title('PV system')
grid on 
set(gca,'fontsize',15, 'FontName', 'Times New Roman')
xlim([0 24])
ylabel('[kW]');
set(gca,'XTick',[0:4:24]);
xlabel('Time [h]')
box on

%%
figure
%plot((t_start:t_start+Tsim-1)/60,100*datalog.SOC(1,1:end), ':','linewidth',2.5)
hold on
plot((t_start:t_start+Tsim-1)/60,datalog.OPFsim.p_G_sim(batt_nodes(1),1:end),'-r','linewidth',2.5)
hold on
plot((t_start:t_start+Tsim-1)/60,datalog.MPC.P_ref(batt_nodes(1),1:end), '--b','linewidth',2.5)
%title('Batt 1')
grid on 
set(gca,'fontsize',15, 'FontName', 'Times New Roman')
%legend({'Real power','Reference power'},'Orientation','horizontal','location','north');
xlim([0 24])
set(gca,'XTick',[0:4:24]);
set(gca,'fontsize',15, 'FontName', 'Times New Roman')
xlim([0 24])
ylabel('[kW]');
set(gca,'XTick',[0:4:24]);
xlabel('Time [h]')
box on


%%
figure
%plot((t_start:t_start+Tsim-1)/60,100*datalog.SOC(2,1:end), ':','linewidth',2.5)
hold on
plot((t_start:t_start+Tsim-1)/60,datalog.OPFsim.p_G_sim(batt_nodes(2),1:end),'-r','linewidth',2.5)
hold on
plot((t_start:t_start+Tsim-1)/60,datalog.MPC.P_ref(batt_nodes(2),1:end), '--b','linewidth',2.5)
%title('Batt 2')
grid on 
set(gca,'fontsize',15, 'FontName', 'Times New Roman')
%legend({'Real power','Reference power'},'Orientation','horizontal','location','north');
xlim([0 24])
set(gca,'XTick',[0:4:24]);
set(gca,'fontsize',15, 'FontName', 'Times New Roman')
xlim([0 24])
ylabel('[kW]');
set(gca,'XTick',[0:4:24]);
xlabel('Time [h]')
box on

%%
figure
%plot((t_start:t_start+Tsim-1)/60,datalog.OPFsim.p_G_sim(batt_nodes(3),1:end),'-r','linewidth',2.5)
hold on
plot((t_start:t_start+Tsim-1)/60,datalog.OPFsim.p_G_sim(batt_nodes(3),1:end),'-r','linewidth',2.5)
hold on
plot((t_start:t_start+Tsim-1)/60,datalog.MPC.P_ref(batt_nodes(3),1:end), '--b','linewidth',2.5)
%title('Batt 3')
grid on 
set(gca,'fontsize',15, 'FontName', 'Times New Roman')
%legend({'Real power','Reference power'},'Orientation','horizontal','location','north');
xlim([0 24])
set(gca,'XTick',[0:4:24]);
set(gca,'fontsize',15, 'FontName', 'Times New Roman')
xlim([0 24])
ylabel('[kW]');
xlabel('Time [h]')
box on

%%

figure
plot((t_start:t_start+Tsim-1)/60,datalog.SOC(1,1:end), ':','linewidth',2.5)
hold on
plot((t_start:t_start+Tsim-1)/60,datalog.SOC(2,1:end), '--','linewidth',2.5)
hold on
plot((t_start:t_start+Tsim-1)/60,datalog.SOC(3,1:end), '-','linewidth',2.5)
grid on 
set(gca,'fontsize',15, 'FontName', 'Times New Roman')
%legend({'Batt 1','Batt 2','Batt 3'},'Orientation','horizontal','location','south');
xlim([0 24])
set(gca,'XTick',[0:4:24]);
set(gca,'fontsize',15, 'FontName', 'Times New Roman')
xlim([0 24])
ylim([0 1])
%ylabel('[kW]');
xlabel('Time [h]')
box on

%%
figure
plot((t_start:t_start+Tsim-1)/60,datalog.OPFsim.p_G_sim(gen_nodes(1),1:end),'-r','linewidth',2.5)
hold on
plot((t_start:t_start+Tsim-1)/60,datalog.MPC.P_ref(gen_nodes(1),1:end),'--b','linewidth',2.5)
hold on
%plot((t_start:t_start+Tsim-1)/60,datalog.OPF.Pg(gen_nodes(:),1:end),'-r')
hold on
%title('Dispatchable generator 1')
grid on 
set(gca,'fontsize',15, 'FontName', 'Times New Roman')
xlim([0 24])
ylabel('[kW]');
ylim([0 60])
set(gca,'XTick',[0:4:24]);
xlabel('Time [h]')
box on

figure
plot((t_start:t_start+Tsim-1)/60,datalog.OPFsim.p_G_sim(gen_nodes(2),1:end),'-r','linewidth',2.5)
hold on
plot((t_start:t_start+Tsim-1)/60,datalog.MPC.P_ref(gen_nodes(2),1:end),'--b','linewidth',2.5)
hold on
%plot((t_start:t_start+Tsim-1)/60,datalog.OPF.Pg(gen_nodes(:),1:end),'-r')
hold on
%title('Dispatchable generator 2')
grid on 
set(gca,'fontsize',15, 'FontName', 'Times New Roman')
xlim([0 24])
ylim([0 60])
ylabel('[kW]');
set(gca,'XTick',[0:4:24]); 
xlabel('Time [h]')
box on


%%


figure
plot((t_start:t_start+Tsim-1)/60, 90*ones(size(datalog.OPFsim.v_sim(2:end,:),1),size(datalog.OPFsim.v_sim(2:end,:),2)),'--k','linewidth',1)
hold on
plot((t_start:t_start+Tsim-1)/60, datalog.OPFsim.v_sim(2:end,:),'linewidth',1)
hold on
plot((t_start:t_start+Tsim-1)/60, 110*ones(size(datalog.OPFsim.v_sim(2:end,:),1),size(datalog.OPFsim.v_sim(2:end,:),2)),'--k','linewidth',1)
grid on 
set(gca,'fontsize',15, 'FontName', 'Times New Roman')
xlim([0 24])
ylim([80 120])
ylabel('[V]')
set(gca,'XTick',[0:4:24]);
xlabel('Time [h]')
box on

%%

load data_sim_LoadMeasure
 

sim_init = 554;
sim_centr = 555;
sim_end  = 556;

sourcenodes_mod = 2:6;
figure
plot(  t_plot(:,(sim_init)*(length(tr))+1  :(sim_end)*(length(tr)))/3600 ,   y_plot(sourcenodes_mod,(sim_init-1)*(length(tr))+1 :(sim_end-1)*(length(tr)) ),'linewidth',2.5)
hold on
plot(  t_plot(:,(sim_init)*(length(tr))+1  :(sim_end)*(length(tr)))/3600 ,  kron(datalog.OPF.v_opf(sourcenodes_mod,sim_init:sim_end-1),ones(1,length(tr))),':k','linewidth',2.5)
xlim( [sim_centr/60-2/(60*60), sim_centr/60+2/(60*60)])
ylim([min(min(datalog.OPF.v_opf(sourcenodes_mod,sim_init:sim_end-1)))-0.5, max(max(datalog.OPF.v_opf(sourcenodes_mod,sim_init:sim_end-1))+0.5)])
grid on
ylabel('[V]')
set(gca,'fontsize',15, 'FontName', 'Times New Roman')
xlabel('Time [h]')
box on

figure
plot(  t_plot(:,(sim_init)*(length(tr))+1  :(sim_end)*(length(tr)))/3600 ,   y_plot(loadnodes,(sim_init-1)*(length(tr))+1 :(sim_end-1)*(length(tr)) ),'linewidth',2.5)
hold on
%plot(  t_plot(:,(569)*(length(tr))+1  :(571)*(length(tr)))/3600 ,  kron(datalog.OPF.v_opf(2,569:570),ones(1,length(tr))),'--k','linewidth',2.5)
xlim( [sim_centr/60-2/(60*60), sim_centr/60+2/(60*60)])
%ylim([min(datalog.OPF.v_opf(2,sim_init:sim_end-1))-0.5, max(datalog.OPF.v_opf(2,sim_init:sim_end-1))+0.5])
grid on
ylabel('[V]')
set(gca,'fontsize',15, 'FontName', 'Times New Roman')
xlabel('Time [h]')
box on

🎉3 参考文献

文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。

🌈4 Matlab代码、数据、文章

  • 16
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值