💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
📋📋📋本文目录如下:🎁🎁🎁
目录
💥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 参考文献
文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。