[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: closed loop simulation of A,B,C,D state-space system
From: |
Torsten |
Subject: |
Re: closed loop simulation of A,B,C,D state-space system |
Date: |
Tue, 7 Aug 2018 17:37:22 +0200 |
On 07.08.2018 12:42, Beginner1 wrote:
> Hi everyone!
>
> I need help with my code. This is a very simplified version of my real code
> but contains the specific issues to solve. The purpose of this code is to
> simulate during 3 seconds a system given by its ABCD space-state matrixes
> which have been validated and simulated previously without issues in open
> loop. Now, I want to simulate it in closed loop. Therefore I need to make a
> "for loop" by connecting the outputs idref iqref with the inputs vdc, vac by
> means of a sensing gain. (This does not have to have a physical meaning, it
> is just for solving the issue with the code). Below you have my code:
>
>
>
>
> /*%Packages call
> pkg control load
> pkg io load
> %Outer Loop parameters
> kv=15;%Constante proporcional del PI de la componente d
> Tv=0.05;%Constante de tiempo del PI de la componente d
> kq=0.4;%Constante proporcional del PI de la componente q
> Tq=0.02;%Constante de tiempo del PI de la componente q
> kdroop_AC=0;%-3;%Pendiente droop Q/U_AC
> droop_FSM=0.05;%Pendiente droop P/f
> FSM_slope=droop_FSM/0.002;%Pendiente droop P/f en p.u.
> enable=0;
> %Initial conditions
> xv_0=0.69819;
> xq_0=0;
> x0=[xv_0;xq_0];
> %Definition of ABCD matrixes
> A_ol=[0 0;0 0];
> B_ol=[-kv/Tv kv/Tv 0 0 0 0 -kv*FSM_slope*enable/Tv kv*enable/Tv
> -kv*enable/Tv kv*enable/Tv;0 0 kq/Tq -kq/Tq -(kq/Tq)*kdroop_AC
> (kq/Tq)*kdroop_AC 0 0 0 0];
> C_ol=[1 0;0 1];
> D_ol=[-kv kv 0 0 0 0 -kv*FSM_slope*enable kv*enable -kv*enable kv*enable;0
> 0 kq -kq -kq*kdroop_AC kq*kdroop_AC 0 0 0 0];
> %Definition of state-space equations x.=Ax+Bu; y=Cx+Du
> stname_ol = {'xv','xq'};
>
> inname_ol={'vdcref','vdc','qacref','qac','vacref','vac','fmeas','pdcref','paux','FSMcoordpos'};
> outname_ol={'idref','iqref'};
> sys_ol = ss
> (A_ol,B_ol,C_ol,D_ol,'stname',stname_ol,'inname',inname_ol,'outname',outname_ol);
>
> %Closed loop
> Tfinal=3;
> for t=1:0.0001:Tfinal
>
> if t==1 %first instant
> U = [vdcref(t) vdc(t) qacref(t) qac(t) vacref(t) vac(t) fmeas(t)
> pdcref(t) paux(t) FSMcoordpos(t)];
> [y(t),t(t),x(t)] = lsim(sys_ol,U,t(t),x0);
> id_ref(t)=y(t,1);
> iq_ref(t)=y(t,2);
> else %the rest of the time
> vdc(t)=50*id_ref(t-1);
> vac(t)=50*iq_ref(t-1);
> U = [vdcref(t) vdc(i) qacref(t) qac(t) vacref(t) vac(t) fmeas(t)
> pdcref(t) paux(t) FSMcoordpos(t)];
> [y(t),t(t),x(t)] = lsim(sys_ol,U,t(t),x0(t));
> id_ref(t)=y(t,1);
> iq_ref(t)=y(t,2);
> xv_0(t)=x(t,1);
> xq_0(t)=x(t,2);
> x0(t)=[xv_0(t);xq_0(t)];
> endif
> endfor
>
> %Plot of vdc input and idref,iqref responses
> figure;
> subplot(3,1,1)
> plot(t,vdc)
> ylabel("vdc(p.u)")
> subplot(3,1,2)
> plot(t,y_idref,t,id_ref)
> ylabel("id_r_e_f(p.u)")
> subplot(3,1,3)
> plot(t,y_iqref,t,iq_ref)
> ylabel("iq_r_e_f(p.u)")
> xlabel("t(s)")
> */
>
>
> However, I do obtain illogical answers in the console:
>
> /*error: lsim: input vector 'u' must have 10 columns
> error: called from
> lsim>__linear_simulation__ at line 277 column 5
> lsim at line 145 column 10
> Terminal_Master_P2P_closed_loop at line 38 column 20*/
>
> when it is clear that for each loop u has 10 columns...
>
> Any suggestion to improve the code will be very welcome.
> Thanks folks
Since your vector t is a row, the elements in U most probaly are also
rows leading. In this case, U is a row of size 1 x (10 lenght(t))
instead of a length(t) x 10 matrix.
Moreover, why do you call it a "closed loop" simulation? Aren't you just
providing predefined fuction values to the inputs of the system?
Torsten