diff --git a/+SimplusGT/+Class/Photovoltaic.m b/+SimplusGT/+Class/Photovoltaic.m index a441de14..d23c9eb5 100644 --- a/+SimplusGT/+Class/Photovoltaic.m +++ b/+SimplusGT/+Class/Photovoltaic.m @@ -57,29 +57,9 @@ Xov = obj.Para(6); Rov = 0; W0 = obj.Para(11); - S_air = obj.Para(12); - T_air = obj.Para(13); v_pv_ref = obj.Para(15); v_dc_ref = obj.Para(16); - % Solar para - T_ref = 25; - S_ref = 1000; - I_sc = 14.880; - I_m = 13.88; - U_m = 576; - U_oc = 708; - a = 0.0025; - b = 0.00288; - Rs = 0.5; - k = 0.03; - C2 = (U_m/U_oc - 1)/(log(1 - I_m/I_sc)); - C1 = (1 - I_m/I_sc)*exp(-U_m/(C2*U_oc)); - T = T_air + k*S_air; - dT = T - T_ref; - dI = a * S_air/S_ref * dT + I_sc*(1 - S_ref/S_air); - dU = -b * dT - Rs * dI; - % Calculate parameters Lf_ac = xwLf/W0; Cf_ac = xwCf/W0; @@ -113,7 +93,8 @@ % dc v_o = v_dc_ref; v_pv = v_pv_ref; - i_pv = (( I_sc * (1 - C1 * (exp((v_pv*800 + dU)/C2/U_oc) - 1))) + dI)/40; + i_pv = -P/v_pv; + i_l = i_pv; v_i = i_l; ed_dc = v_pv - i_l*Rf_dc; @@ -144,7 +125,7 @@ % Get input vgd = u(1); vgq = u(2); - + P = u(3); % Get state v_i = x(1); i_i = x(2); @@ -183,7 +164,7 @@ v_dc_ref = obj.Para(16); xfvdc = obj.Para(17); xfidc = obj.Para(18); - + % Solar para T_ref = 25; S_ref = 1000; @@ -202,6 +183,8 @@ dI = a * S_air/S_ref * dT + I_sc*(1 - S_ref/S_air); dU = -b * dT - Rs * dI; + i_pv_ref = -P/v_pv_ref; + A_mpp = i_pv_ref/(( I_sc * (1 - C1 * (exp((v_pv_ref*800 + dU)/C2/U_oc) - 1))) + dI); % Update paramters Lf_ac = xwLf/W0; Cf_ac = xwCf/W0; @@ -233,7 +216,7 @@ % y = g(x,u) if CallFlag == 1 % ### Call state equation: dx/dt = f(x,u) - i_pv = (( I_sc * (1 - C1 * (exp((v_pv*800 + dU)/C2/U_oc) - 1))) + dI)/40; + i_pv = (( I_sc * (1 - C1 * (exp((v_pv*800 + dU)/C2/U_oc) - 1))) + dI)*A_mpp; error_v_pv = v_pv_ref - v_pv; i_r = kp_v_dc*error_v_pv + v_i; dv_i = ki_v_dc *error_v_pv; diff --git a/+SimplusGT/+Class/PhotovoltaicGFL.m b/+SimplusGT/+Class/PhotovoltaicGFL.m new file mode 100644 index 00000000..31ac5233 --- /dev/null +++ b/+SimplusGT/+Class/PhotovoltaicGFL.m @@ -0,0 +1,284 @@ + % This class defines the model of a photovoltaic system with GFL(PLL) control. + +% Author(s): Wenjie Ning +% + + +%% Notes +% +% The model is in load convention. +% +% The model is in admittance form. +% +% dw means the derivative of w + +%% Class + +classdef PhotovoltaicGFL < SimplusGT.Class.ModelAdvance + + % For temporary use + properties(Access = protected) + i_q_r; + P0; + Q0; + end + + methods + % constructor + function obj = PhotovoltaicGFL(varargin) + % Support name-value pair arguments when constructing object + setProperties(obj,nargin,varargin{:}); + end + end + + methods(Static) + + function [State,Input,Output] = SignalList(obj) + State = {'v_pv_i','i_l_i','i_l','v_pv','v_dc_i','pll_i','i_d_i','i_q_i','i_d','i_q','v_d','v_q','i_gd','i_gq','v_dc','theta'}; + Input = {'v_d','v_q','P0'}; + Output = {'i_d','i_q','w','theta'}; + end + + % Calculate the equilibrium + function [x_e,u_e,xi] = Equilibrium(obj) + % Get the power PowerFlow values + P = obj.PowerFlow(1); + Q = obj.PowerFlow(2); + V = obj.PowerFlow(3); + xi = obj.PowerFlow(4); + w = obj.PowerFlow(5); + % Get parameter + xwLf = obj.Para(1); + Rf = obj.Para(2); + xwCf = obj.Para(3); + xwLc = obj.Para(4); + Rc = obj.Para(5); + Xov = obj.Para(6); + Rov = 0; + W0 = obj.Para(11); + v_pv_ref = obj.Para(14); + v_dc_ref = obj.Para(15); + + % Calculate parameters + Lf_ac = xwLf/W0; + Cf_ac = xwCf/W0; + Lc_ac = xwLc/W0; + Rf_dc = 0.01; + + v_gd = V; + v_gq = 0; + i_gd = P/V; + i_gq = -Q/V; + + v_gdq = v_gd + 1i*v_gq; + i_gdq = i_gd + 1i*i_gq; + v_dq = v_gdq - i_gdq*(Rc + 1i*w*Lc_ac); + i_cdq = v_dq*(1i*w*Cf_ac); + i_dq = i_gdq - i_cdq; + e_dq = v_dq - i_dq*(Rf + 1i*w*Lf_ac); + + i_d = real(i_dq); + i_q = imag(i_dq); + i_d_i = -real(e_dq); + i_q_i = -imag(e_dq); + v_d = real(v_dq); + v_q = imag(v_dq); + i_gd = real(i_gdq); + i_gq = imag(i_gdq); + + pll_i = w; + theta = xi; + + % dc + v_dc = v_dc_ref; + v_pv = v_pv_ref; + i_pv = -P/v_pv; + v_dc_i = i_d; + i_l = i_pv; + v_pv_i = i_l; + ed_dc = v_pv - i_l*Rf_dc; + i_l_i = ed_dc; + + obj.P0 = P*(-1); + obj.Q0 = Q*(-1); + obj.i_q_r = i_q; + % Get equilibrium + x_e = [v_pv_i; i_l_i; i_l; v_pv; v_dc_i; pll_i; i_d_i; i_q_i; i_d; i_q; v_d; v_q; i_gd; i_gq; v_dc; theta]; + u_e = [v_gd; v_gq; P]; + end + + % State space model + function [Output] = StateSpaceEqu(obj,x,u,CallFlag) + % Get the power PowerFlow values + V = obj.PowerFlow(3); + + % Get input + vgd = u(1); + vgq = u(2); + P = u(3); + % Get state + v_pv_i = x(1); + i_l_i = x(2); + i_l = x(3); + v_pv = x(4); + v_dc_i = x(5); + pll_i = x(6); + i_d_i = x(7); + i_q_i = x(8); + i_d = x(9); + i_q = x(10); + v_d = x(11); + v_q = x(12); + i_gd = x(13); + i_gq = x(14); + v_dc = x(15); + theta = x(16); + + % Get parameters + xwLf = obj.Para(1); + Rf = obj.Para(2); + xwCf = obj.Para(3); + xwLc = obj.Para(4); + Rc = obj.Para(5); + Xov = obj.Para(6); + Rov = 0; + xfvdc = obj.Para(7); + xfpll = obj.Para(8); + xfidq = obj.Para(9); + C_dc = obj.Para(10); + W0 = obj.Para(11); + S_air = obj.Para(12); + T_air = obj.Para(13); + v_pv_ref = obj.Para(14); + v_dc_ref = obj.Para(15); + xfvpv = obj.Para(16); + xfidc = obj.Para(17); + i_q_ref = obj.i_q_r; + + % Solar para + T_ref = 25; + S_ref = 1000; + I_sc = 14.880; + I_m = 13.88; + U_m = 576; + U_oc = 708; + a = 0.0025; + b = 0.00288; + Rs = 0.5; + k = 0.03; + C2 = (U_m/U_oc - 1)/(log(1 - I_m/I_sc)); + C1 = (1 - I_m/I_sc)*exp(-U_m/(C2*U_oc)); + T = T_air + k*S_air; + dT = T - T_ref; + dI = a * S_air/S_ref * dT + I_sc*(1 - S_ref/S_air); + dU = -b * dT - Rs * dI; + + i_pv_ref = -P/v_pv_ref; + A_mpp = i_pv_ref/(( I_sc * (1 - C1 * (exp((v_pv_ref*800 + dU)/C2/U_oc) - 1))) + dI); + % Update paramters + Lf_ac = xwLf/W0; + Cf_ac = xwCf/W0; + Lc_ac = xwLc/W0; + + Rf_dc = 0.01; + Lf_dc = 0.05/W0; + Cf_dc = 0.02/W0; + + w_v_dc = xfvdc*2*pi; + kp_v_dc = C_dc*w_v_dc; + ki_v_dc = C_dc*w_v_dc^2/4; + + w_i_dc = xfidc*2*pi; + kp_i_dc = -Lf_dc*w_i_dc; + ki_i_dc = -Lf_dc*(w_i_dc^2)/4; + + w_v_pv = xfvpv*2*pi; + kp_v_pv = -Cf_dc*w_v_pv *20; + ki_v_pv = -Cf_dc*w_v_pv^2/4* 20; + + w_pll = xfpll*2*pi; + kp_pll = w_pll; + ki_pll = w_pll^2/4; + + w_i_ac = xfidq*2*pi; % Current Controller + kp_i_ac = Lf_ac*w_i_ac; + ki_i_ac = Lf_ac*(w_i_ac^2)/4; + + + % State space equations + % dx/dt = f(x,u) + % y = g(x,u) + if CallFlag == 1 + % ### Call state equation: dx/dt = f(x,u) + i_pv = (( I_sc * (1 - C1 * (exp((v_pv*800 + dU)/C2/U_oc) - 1))) + dI)*A_mpp; + + error_v_pv = v_pv_ref - v_pv; + i_r = kp_v_pv*error_v_pv + v_pv_i; + dv_pv_i = ki_v_pv*error_v_pv; + + error_i_l = i_r - i_l; + ed_dc = kp_i_dc*error_i_l + i_l_i; + di_l_i = ki_i_dc*error_i_l; + + di_l = (v_pv - ed_dc - Rf_dc*i_l)/Lf_dc; + dv_pv = (i_pv - i_l)/Cf_dc; + + error_v_dc = v_dc_ref - v_dc; + i_d_r = kp_v_dc*error_v_dc + v_dc_i; + dv_dc_i = ki_v_dc*error_v_dc; + + i_q_r = i_q_ref; + + % AC current control + error_id = i_d_r - i_d; + error_iq = i_q_r - i_q; + e_d = -(error_id*kp_i_ac + i_d_i); + e_q = -(error_iq*kp_i_ac + i_q_i); + + di_d_i = error_id*ki_i_ac; + di_q_i = error_iq*ki_i_ac; + + error_pll = v_q - 0; + w = kp_pll*error_pll + pll_i; + dpll_i = ki_pll*error_pll; + + P_r = i_l * ed_dc; + p = (e_d*i_d + e_q*i_q)*(-1); + + % dtheta = w-W0; + dtheta = w; + dv_dc = (P_r - p)/v_dc/C_dc; + + % Lf equation + di_d = (v_d - e_d - Rf*i_d + w*Lf_ac*i_q)/Lf_ac; + di_q = (v_q - e_q - Rf*i_q - w*Lf_ac*i_d)/Lf_ac; + + % Cf equation + dv_d = (-(i_d - i_gd) + w*Cf_ac*v_q)/Cf_ac; + dv_q = (-(i_q - i_gq) - w*Cf_ac*v_d)/Cf_ac; + + % Lc equation + di_gd = (vgd - v_d - Rc*i_gd + w*Lc_ac*i_gq)/Lc_ac; + di_gq = (vgq - v_q - Rc*i_gq - w*Lc_ac*i_gd)/Lc_ac; + + % dx + f_xu = [dv_pv_i; di_l_i; di_l; dv_pv; dv_dc_i; dpll_i; di_d_i; di_q_i; di_d; di_q; dv_d; dv_q; di_gd; di_gq; dv_dc; dtheta]; + Output = f_xu; + + elseif CallFlag == 2 + error_pll = v_q - 0; + w = kp_pll*error_pll + pll_i; + + % dx + g_xu = [i_gd; i_gq; w; theta]; + Output = g_xu; + end + + end + + end +end + + + + diff --git a/+SimplusGT/+Simulink/SimAddApparatus.m b/+SimplusGT/+Simulink/SimAddApparatus.m index 332fd38c..398f194f 100644 --- a/+SimplusGT/+Simulink/SimAddApparatus.m +++ b/+SimplusGT/+Simulink/SimAddApparatus.m @@ -42,9 +42,15 @@ FullName_Apparatus{i} = [Name_Model '/' Name_Apparatus{i}]; add_block([Name_LibFile '/Battery (dq-Frame System Object)'],FullName_Apparatus{i}); case 004 - Name_Apparatus{i} = ['PV' num2str(Bus)]; - FullName_Apparatus{i} = [Name_Model '/' Name_Apparatus{i}]; - add_block([Name_LibFile '/Photovoltaic (dq-Frame System Object)'],FullName_Apparatus{i}); + if ApparatusType{i}==40 + Name_Apparatus{i} = ['PV_GFM' num2str(Bus)]; + FullName_Apparatus{i} = [Name_Model '/' Name_Apparatus{i}]; + add_block([Name_LibFile '/Photovoltaic-GFM (dq-Frame System Object)'],FullName_Apparatus{i}); + elseif ApparatusType{i}==41 + Name_Apparatus{i} = ['PV_GFL' num2str(Bus)]; + FullName_Apparatus{i} = [Name_Model '/' Name_Apparatus{i}]; + add_block([Name_LibFile '/Photovoltaic-GFL (dq-Frame System Object)'],FullName_Apparatus{i}); + end case 009 Name_Apparatus{i} = ['Inf-Bus' num2str(Bus)]; FullName_Apparatus{i} = [Name_Model '/' Name_Apparatus{i}]; diff --git a/+SimplusGT/+Toolbox/ApparatusModelCreate.m b/+SimplusGT/+Toolbox/ApparatusModelCreate.m index 47df1327..668ca288 100644 --- a/+SimplusGT/+Toolbox/ApparatusModelCreate.m +++ b/+SimplusGT/+Toolbox/ApparatusModelCreate.m @@ -102,25 +102,47 @@ Para.fvdc; Para.fibat]; case 4 % Type 40-49 - Apparatus = SimplusGT.Class.Photovoltaic('ApparatusType',Type); - Apparatus.Para = [ Para.wLf; - Para.Rf; - Para.wCf; - Para.wLc; - Para.Rc; - Para.Xov; - Para.N; - Para.R; - Para.fvdq; - Para.fidq; - Para.w0; - Para.Sair; - Para.Tair; - Para.C_dc; - Para.v_pv_ref; - Para.v_dc_ref - Para.fvdc; - Para.fidc]; + if Type ==40 + Apparatus = SimplusGT.Class.Photovoltaic('ApparatusType',Type); + Apparatus.Para = [ Para.wLf; + Para.Rf; + Para.wCf; + Para.wLc; + Para.Rc; + Para.Xov; + Para.N; + Para.R; + Para.fvdq; + Para.fidq; + Para.w0; + Para.Sair; + Para.Tair; + Para.C_dc; + Para.v_pv_ref; + Para.v_dc_ref + Para.fvdc; + Para.fidc]; + elseif Type ==41 + Apparatus = SimplusGT.Class.PhotovoltaicGFL('ApparatusType',Type); + Apparatus.Para = [ Para.wLf; + Para.Rf; + Para.wCf; + Para.wLc; + Para.Rc; + Para.Xov; + Para.fvdc; + Para.fpll; + Para.fidq; + Para.C_dc; + Para.w0; + Para.Sair; + Para.Tair; + Para.v_pv_ref; + Para.v_dc_ref + Para.fvpv; + Para.fidc]; + + end % ### Ac infinite bus case 9 Apparatus = SimplusGT.Class.InfiniteBusAc; diff --git a/+SimplusGT/+Toolbox/BusTypeVIF.m b/+SimplusGT/+Toolbox/BusTypeVIF.m index c0f2513c..ac31626e 100644 --- a/+SimplusGT/+Toolbox/BusTypeVIF.m +++ b/+SimplusGT/+Toolbox/BusTypeVIF.m @@ -19,10 +19,10 @@ ibus = []; fbus = []; for i = 1:length(ApparatusType) - if ((ApparatusType{i} >= 0) && (ApparatusType{i} <= 9)) || (ApparatusType{i} == 90) || ((ApparatusType{i} >= 20) && (ApparatusType{i} <= 49)) + if ((ApparatusType{i} >= 0) && (ApparatusType{i} <= 9)) || (ApparatusType{i} == 90) || ((ApparatusType{i} >= 20) && (ApparatusType{i} <= 40)) vbus(l) = i; l = l+1; - elseif ((ApparatusType{i} >= 10) && (ApparatusType{i} <= 19)) + elseif ((ApparatusType{i} >= 10) && (ApparatusType{i} <= 19)) || (ApparatusType{i} == 41) ibus(m) = i; m = m+1; elseif (ApparatusType{i} == 100) diff --git a/+SimplusGT/+Toolbox/RearrangeListApparatus.m b/+SimplusGT/+Toolbox/RearrangeListApparatus.m index a30a2306..7f03656d 100644 --- a/+SimplusGT/+Toolbox/RearrangeListApparatus.m +++ b/+SimplusGT/+Toolbox/RearrangeListApparatus.m @@ -201,6 +201,27 @@ Para0040.v_dc_ref =1; % dc voltage Para0040.fvdc =100; % (Hz) vdc bandwidth Para0040.fidc =500; % (Hz) ibat bandwidth + +% ====================================== +% Photovoltaic (PLL) +% ====================================== +Para0041.wLf =0.05; +Para0041.Rf =0.05/5; +Para0041.wCf =0.02; +Para0041.wLc =0.01; +Para0041.Rc =0.01/5; +Para0041.Xov =0.01; +Para0041.fvdc =250; % (Hz) vdc bandwidth +Para0041.fpll =15; % (Hz) pll bandwidth +Para0041.fidq =600; % (Hz) current control bandwidth +Para0041.C_dc =1; +Para0041.w0 =W0; +Para0041.Sair =1000; % (𝑊/𝑚2) PV illumination intensity +Para0041.Tair =25; % (°C) PV temperature +Para0041.v_pv_ref =0.8; % pv output voltage(MPPT) +Para0041.v_dc_ref =1; % dc voltage +Para0041.fvpv =100; % (Hz) vpv bandwidth +Para0041.fidc =500; % (Hz) ibat bandwidth % ====================================== @@ -275,8 +296,11 @@ case 3 ParaCell{i} = Para0030; % Battery Energy Storage System case 4 - ParaCell{i} = Para0040; % Photovoltaic - % PV + if AppType ==40 + ParaCell{i} = Para0040; % Photovoltaic (VFM-FFL) + elseif AppType ==41 + ParaCell{i} = Para0041; % Photovoltaic (PLL) + end case 9 ParaCell{i} = Para0090; % Ac inifnite bus case 10 @@ -372,26 +396,49 @@ error(['Error: parameter overflow, bus ' num2str(AppBus) 'type ' num2str(AppType) '.']); end elseif floor(AppType/10) == 4 % PV - switch SwitchFlag - case 1; ParaCell{row(i)}.wLf = UserValue; - case 2; ParaCell{row(i)}.Rf = UserValue; - case 3; ParaCell{row(i)}.wCf = UserValue; - case 4; ParaCell{row(i)}.wLc = UserValue; - case 5; ParaCell{row(i)}.Rc = UserValue; - case 6; ParaCell{row(i)}.Xov = UserValue; - case 7; ParaCell{row(i)}.N = UserValue; - case 8; ParaCell{row(i)}.R = UserValue; - case 9; ParaCell{row(i)}.fvdq = UserValue; - case 10; ParaCell{row(i)}.fidq = UserValue; - case 11; ParaCell{row(i)}.Sair = UserValue; - case 12; ParaCell{row(i)}.Tair = UserValue; - case 13; ParaCell{row(i)}.C_dc = UserValue; - case 14; ParaCell{row(i)}.v_pv_ref = UserValue; - case 15; ParaCell{row(i)}.v_dc_ref = UserValue; - case 16; ParaCell{row(i)}.fvdc = UserValue; - case 17; ParaCell{row(i)}.fidc = UserValue; - otherwise - error(['Error: parameter overflow, bus ' num2str(AppBus) 'type ' num2str(AppType) '.']); + if AppType ==40 + switch SwitchFlag + case 1; ParaCell{row(i)}.wLf = UserValue; + case 2; ParaCell{row(i)}.Rf = UserValue; + case 3; ParaCell{row(i)}.wCf = UserValue; + case 4; ParaCell{row(i)}.wLc = UserValue; + case 5; ParaCell{row(i)}.Rc = UserValue; + case 6; ParaCell{row(i)}.Xov = UserValue; + case 7; ParaCell{row(i)}.N = UserValue; + case 8; ParaCell{row(i)}.R = UserValue; + case 9; ParaCell{row(i)}.fvdq = UserValue; + case 10; ParaCell{row(i)}.fidq = UserValue; + case 11; ParaCell{row(i)}.Sair = UserValue; + case 12; ParaCell{row(i)}.Tair = UserValue; + case 13; ParaCell{row(i)}.C_dc = UserValue; + case 14; ParaCell{row(i)}.v_pv_ref = UserValue; + case 15; ParaCell{row(i)}.v_dc_ref = UserValue; + case 16; ParaCell{row(i)}.fvdc = UserValue; + case 17; ParaCell{row(i)}.fidc = UserValue; + otherwise + error(['Error: parameter overflow, bus ' num2str(AppBus) 'type ' num2str(AppType) '.']); + end + elseif AppType ==41 + switch SwitchFlag + case 1; ParaCell{row(i)}.wLf = UserValue; + case 2; ParaCell{row(i)}.Rf = UserValue; + case 3; ParaCell{row(i)}.wCf = UserValue; + case 4; ParaCell{row(i)}.wLc = UserValue; + case 5; ParaCell{row(i)}.Rc = UserValue; + case 6; ParaCell{row(i)}.Xov = UserValue; + case 7; ParaCell{row(i)}.fvdc = UserValue; + case 8; ParaCell{row(i)}.fpll = UserValue; + case 9; ParaCell{row(i)}.fidq = UserValue; + case 10; ParaCell{row(i)}.C_dc = UserValue; + case 11; ParaCell{row(i)}.Sair = UserValue; + case 12; ParaCell{row(i)}.Tair = UserValue; + case 13; ParaCell{row(i)}.v_pv_ref = UserValue; + case 14; ParaCell{row(i)}.v_dc_ref = UserValue; + case 15; ParaCell{row(i)}.fvpv = UserValue; + case 16; ParaCell{row(i)}.fidc = UserValue; + otherwise + error(['Error: parameter overflow, bus ' num2str(AppBus) 'type ' num2str(AppType) '.']); + end end elseif floor(AppType/10) == 101 % Grid-feeding buck switch SwitchFlag diff --git a/Examples/AcPowerSystem/SingleApparatusInfiniteBus/GfmInverterInfiniteBus.json b/Examples/AcPowerSystem/SingleApparatusInfiniteBus/GfmInverterInfiniteBus.json index 0c7ccd4e..77d7bb28 100644 --- a/Examples/AcPowerSystem/SingleApparatusInfiniteBus/GfmInverterInfiniteBus.json +++ b/Examples/AcPowerSystem/SingleApparatusInfiniteBus/GfmInverterInfiniteBus.json @@ -1,52 +1,134 @@ { -"Basic": + + "Basic": { -"Fs":50000,"Fbase":50,"Sbase":1,"Vbase":1 + + "Fs": 50000, + "Fbase": 50, + "Sbase": 1, + "Vbase": 1 + } -,"Advance": +, + "Advance": { -"DiscretizationMethod":2,"LinearizationTimes":1,"DiscretizationDampingFlag":1,"DirectFeedthrough":0,"PowerFlowAlgorithm":1,"EnableCreateSimulinkModel":1,"EnablePlotPole":1,"EnablePlotAdmittance":1,"EnablePrintOutput":1,"EnableParticipation":0 + + "DiscretizationMethod": 2, + "LinearizationTimes": 1, + "DiscretizationDampingFlag": 1, + "DirectFeedthrough": 0, + "PowerFlowAlgorithm": 1, + "EnableCreateSimulinkModel": 1, + "EnablePlotPole": 1, + "EnablePlotAdmittance": 1, + "EnablePrintOutput": 1 + } -,"Bus": +, + "Bus": [ + { -"BusNo":1,"BusType":1,"Voltage":1,"Theta":0,"PGi":0,"QGi":0,"PLi":0,"QLi":0,"Qmin":-1,"Qmax":1,"AreaNo":1,"AcDc":1 + + "BusNo": 1, + "BusType": 1, + "Voltage": 1, + "Theta": 0, + "PGi": 0, + "QGi": 0, + "PLi": 0, + "QLi": 0, + "Qmin": -1, + "Qmax": 1, + "AreaNo": 1, + "AcDc": 1 + } , + { -"BusNo":2,"BusType":3,"Voltage":1,"Theta":0,"PGi":0,"QGi":0.0001,"PLi":0,"QLi":0,"Qmin":-1,"Qmax":1,"AreaNo":1,"AcDc":1 + + "BusNo": 2, + "BusType": 3, + "Voltage": 1, + "Theta": 0, + "PGi": 0, + "QGi": 0.0001, + "PLi": 0, + "QLi": 0, + "Qmin": -1, + "Qmax": 1, + "AreaNo": 1, + "AcDc": 1 + } + ] -,"NetworkLine": +, + "NetworkLine": { -"FromBus":1,"ToBus":2,"R":0.02,"wL":0.1,"wC":0,"G":0,"TurnsRatio":1 + + "FromBus": 1, + "ToBus": 2, + "R": 0.02, + "wL": 0.1, + "wC": 0, + "G": 0, + "TurnsRatio": 1 + } -,"NetworkLineIEEE": +, + "NetworkLineIEEE": [ ] -,"Apparatus": +, + "Apparatus": [ + { -"BusNo":1,"Type":90,"Para": + + "BusNo": 1, + "Type": 90, + "Para": [ ] + } , + { -"BusNo":2,"Type":20,"Para": + + "BusNo": 2, + "Type": 20, + "Para": { -"wLf":0.05,"Rf":0.01,"wCf":0.02,"wLc":0.01,"Rc":0.002,"Xov":0,"Dw":0.05,"fdroop":5,"fvdq":300,"fidq":600,"w0":314.15926535897933 + + "wLf": 0.05, + "Rf": 0.01, + "wCf": 0.02, + "wLc": 0.01, + "Rc": 0.002, + "Xov": 0, + "Dw": 0.05, + "fdroop": 5, + "fvdq": 300, + "fidq": 600, + "w0": 314.15926535897933 + } + } + ] + } diff --git a/Examples/AcPowerSystem/SingleApparatusInfiniteBus/PVGFLInfiniteBus.json b/Examples/AcPowerSystem/SingleApparatusInfiniteBus/PVGFLInfiniteBus.json new file mode 100644 index 00000000..77e87d8a --- /dev/null +++ b/Examples/AcPowerSystem/SingleApparatusInfiniteBus/PVGFLInfiniteBus.json @@ -0,0 +1,140 @@ + +{ + + "Basic": +{ + + "Fs": 50000, + "Fbase": 50, + "Sbase": 1, + "Vbase": 1 + +} +, + "Advance": +{ + + "DiscretizationMethod": 2, + "LinearizationTimes": 1, + "DiscretizationDampingFlag": 1, + "DirectFeedthrough": 0, + "PowerFlowAlgorithm": 1, + "EnableCreateSimulinkModel": 1, + "EnablePlotPole": 1, + "EnablePlotAdmittance": 1, + "EnablePrintOutput": 1 + +} +, + "Bus": +[ + + +{ + + "BusNo": 1, + "BusType": 1, + "Voltage": 1, + "Theta": 0, + "PGi": 0, + "QGi": 0, + "PLi": 0, + "QLi": 0, + "Qmin": -1, + "Qmax": 1, + "AreaNo": 1, + "AcDc": 1 + +} +, + +{ + + "BusNo": 2, + "BusType": 3, + "Voltage": 1, + "Theta": 0, + "PGi": 0.5, + "QGi": 0, + "PLi": 0, + "QLi": 0, + "Qmin": -1, + "Qmax": 1, + "AreaNo": 1, + "AcDc": 1 + +} + + +] +, + "NetworkLine": +{ + + "FromBus": 1, + "ToBus": 2, + "R": 0.01, + "wL": 0.05, + "wC": 0, + "G": 0, + "TurnsRatio": 1 + +} +, + "NetworkLineIEEE": +[ + +] +, + "Apparatus": +[ + + +{ + + "BusNo": 1, + "Type": 90, + "Para": +[ + +] + + +} +, + +{ + + "BusNo": 2, + "Type": 41, + "Para": +{ + + "wLf": 0.05, + "Rf": 0.01, + "wCf": 0.02, + "wLc": 0.05, + "Rc": 0.01, + "Xov": 0, + "fvdc": 250, + "fpll": 15, + "fidq": 1000, + "C_dc": 1, + "w0": 314.15926535897933, + "Sair": 1000, + "Tair": 25, + "v_pv_ref": 0.8, + "v_dc_ref": 1, + "fvpv": 100, + "fidc": 500 + +} + + +} + + +] + + +} diff --git a/Examples/AcPowerSystem/SingleApparatusInfiniteBus/PVGflInfiniteBus.xlsx b/Examples/AcPowerSystem/SingleApparatusInfiniteBus/PVGflInfiniteBus.xlsx new file mode 100644 index 00000000..1cfb168a Binary files /dev/null and b/Examples/AcPowerSystem/SingleApparatusInfiniteBus/PVGflInfiniteBus.xlsx differ diff --git a/Examples/AcPowerSystem/SingleApparatusInfiniteBus/PVGfmInfiniteBus.json b/Examples/AcPowerSystem/SingleApparatusInfiniteBus/PVGfmInfiniteBus.json new file mode 100644 index 00000000..100b620c --- /dev/null +++ b/Examples/AcPowerSystem/SingleApparatusInfiniteBus/PVGfmInfiniteBus.json @@ -0,0 +1,141 @@ + +{ + + "Basic": +{ + + "Fs": 50000, + "Fbase": 50, + "Sbase": 1, + "Vbase": 1 + +} +, + "Advance": +{ + + "DiscretizationMethod": 2, + "LinearizationTimes": 1, + "DiscretizationDampingFlag": 1, + "DirectFeedthrough": 0, + "PowerFlowAlgorithm": 1, + "EnableCreateSimulinkModel": 1, + "EnablePlotPole": 1, + "EnablePlotAdmittance": 1, + "EnablePrintOutput": 1 + +} +, + "Bus": +[ + + +{ + + "BusNo": 1, + "BusType": 1, + "Voltage": 1, + "Theta": 0, + "PGi": 0, + "QGi": 0, + "PLi": 0, + "QLi": 0, + "Qmin": -1, + "Qmax": 1, + "AreaNo": 1, + "AcDc": 1 + +} +, + +{ + + "BusNo": 2, + "BusType": 2, + "Voltage": 1, + "Theta": 0, + "PGi": 0.2, + "QGi": 0, + "PLi": 0, + "QLi": 0, + "Qmin": -1, + "Qmax": 1, + "AreaNo": 1, + "AcDc": 1 + +} + + +] +, + "NetworkLine": +{ + + "FromBus": 1, + "ToBus": 2, + "R": 0.1, + "wL": 0.5, + "wC": 0, + "G": 0, + "TurnsRatio": 1 + +} +, + "NetworkLineIEEE": +[ + +] +, + "Apparatus": +[ + + +{ + + "BusNo": 1, + "Type": 90, + "Para": +[ + +] + + +} +, + +{ + + "BusNo": 2, + "Type": 40, + "Para": +{ + + "wLf": 0.05, + "Rf": 0.01, + "wCf": 0.02, + "wLc": 0.01, + "Rc": 0.002, + "Xov": 0, + "N": 1, + "R": 0.05, + "fvdq": 250, + "fidq": 1000, + "w0": 314.15926535897933, + "Sair": 1000, + "Tair": 25, + "C_dc": 1, + "v_pv_ref": 0.8, + "v_dc_ref": 1, + "fvdc": 100, + "fidc": 500 + +} + + +} + + +] + + +} diff --git a/Examples/AcPowerSystem/SingleApparatusInfiniteBus/PVGfmInfiniteBus.xlsx b/Examples/AcPowerSystem/SingleApparatusInfiniteBus/PVGfmInfiniteBus.xlsx new file mode 100644 index 00000000..f1ce55db Binary files /dev/null and b/Examples/AcPowerSystem/SingleApparatusInfiniteBus/PVGfmInfiniteBus.xlsx differ diff --git a/Library/SimplusGT_2020a.slx b/Library/SimplusGT_2020a.slx index 6f558ec4..b396f756 100644 Binary files a/Library/SimplusGT_2020a.slx and b/Library/SimplusGT_2020a.slx differ diff --git a/UserData.xlsm b/UserData.xlsm index 71dbcf34..7683b2a1 100644 Binary files a/UserData.xlsm and b/UserData.xlsm differ diff --git a/UserMain.m b/UserMain.m index b5a3cec0..76649203 100644 --- a/UserMain.m +++ b/UserMain.m @@ -18,7 +18,8 @@ % UserDataName = 'GflInverterInfiniteBus'; % Single grid-following inverter and infinite bus % UserDataName = 'GfmInverterInfiniteBus'; % Single grid-forming inverter and infinite bus % UserDataName = 'BessInfiniteBus'; % Single battery energy storage system and infinite bus -% UserDataName = 'PVInfiniteBus'; % Single Photovoltaic and infinite bus +% UserDataName = 'PVGfmInfiniteBus'; % Single Photovoltaic(GFM) and infinite bus +% UserDataName = 'PVGflInfiniteBus'; % Single Photovoltaic(GFL) and infinite bus % UserDataName = 'IEEE_14Bus'; % UserDataName = 'IEEE_30Bus'; % UserDataName = 'IEEE_57Bus';