PMSM的MPTC控制仿真代码,报错输入参数的数目不足该怎么解决可以使程序正常运行。
function [sys,x0,str,Ts] = ctrlmptc(t,x,u,flag)
switch flag,
case 0,
[sys,x0,str,Ts]=mdlInitializeSizes;
case 1,
% sys=mdlDerivatives(t,x,u);
sys=[];
case 2,
sys=mdlUpdate(t,x,u);
case 3,
sys=mdlOutputs(t,x,u);
case 4,
% sys=mdlGetTimeOfNextVarHit(t,x,u);
sys=[];
case 9,
% sys=mdlTerminate(t,x,u);
sys=[];
otherwise
DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end
function [sys,x0,str,Ts]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 0;
sizes.NumDiscStates = 3;
sizes.NumOutputs = 3;
sizes.NumInputs = 8;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1; % at least one sample time is needed
sys = simsizes(sizes);
x0 = [0;0;0];
str = [];
Ts=1e-6;
simStateCompliance = 'UnknownSimState';
function sys=mdlDerivatives(t,x,u)
sys = [];
function sys=mdlUpdate(t,x,u)
%% initial value setting
Ts=1e-6;
Ld=8.5e-3;
Lq=8.5e-3;
Rs=0.135;
D=[Rs/Ld -u(1);u(1) Rs/Lq];
E=[1/Ld 0;0 1/Lq];
Fi_r=[0.1194;0];
Fi_s=[u(2);u(3)];
Us=[u(4);u(5)];
% the first predictive for compensating control delay
Fis_N=(eye(2)-DTs)Fi_s+TsUs+(RsTs/Ld)Fi_r;
Is_N=E(Fis_N-Fi_r);
Te_N=1.54(Fis_N(1,1)*Is_N(2,1)-Fis_N(2,1)*Is_N(1,1));%flux linkage multiplication cross current
% the second predictive for control output
% define voltage vector
u1=[0;0;0]; uabc1=u1540;
u2=[1;1;1]; uabc2=u2540;
u3=[1;0;0]; uabc3=u3540;
u4=[1;1;0]; uabc4=u4540;
u5=[0;1;1]; uabc5=u5540;
u6=[0;1;0]; uabc6=u6540;
u7=[0;0;1]; uabc7=u7540;
u8=[1;0;1]; uabc8=u8540;
% abctodq transform
T=2*[cos(u(6)) cos(u(6)-2pi/3) cos(u(6)+2pi/3);-sin(u(6)) -sin(u(6)-2pi/3) -sin(u(6)+2pi/3)]/3;
udq1=Tuabc1;
udq2=Tuabc2;
udq3=Tuabc3;
udq4=Tuabc4;
udq5=Tuabc5;
udq6=Tuabc6;
udq7=Tuabc7;
udq8=Tuabc8;
%vector1
Fis_NN1=(eye(2)-DTs)Fis_N+Tsudq1+(RsTs/Ld)Fi_r;
Is_NN1=E(Fis_NN1-Fi_r);
Te_NN1=1.54(Fis_NN1(1,1)*Is_NN1(2,1)-Fis_NN1(2,1)*Is_NN1(1,1));%flux linkage multiplication cross current
%vector2
Fis_NN2=(eye(2)-DTs)Fis_N+Tsudq2+(RsTs/Ld)Fi_r;
Is_NN2=E(Fis_NN2-Fi_r);
Te_NN2=1.54(Fis_NN2(1,1)*Is_NN2(2,1)-Fis_NN2(2,1)*Is_NN2(1,1));%flux linkage multiplication cross current
%vector3
Fis_NN3=(eye(2)-DTs)Fis_N+Tsudq3+(RsTs/Ld)Fi_r;
Is_NN3=E(Fis_NN3-Fi_r);
Te_NN3=1.54(Fis_NN3(1,1)*Is_NN3(2,1)-Fis_NN3(2,1)*Is_NN3(1,1));%flux linkage multiplication cross current
%vector4
Fis_NN4=(eye(2)-DTs)Fis_N+Tsudq4+(RsTs/Ld)Fi_r;
Is_NN4=E(Fis_NN4-Fi_r);
Te_NN4=1.54(Fis_NN4(1,1)*Is_NN4(2,1)-Fis_NN4(2,1)*Is_NN4(1,1));%flux linkage multiplication cross current
%vector5
Fis_NN5=(eye(2)-DTs)Fis_N+Tsudq5+(RsTs/Ld)Fi_r;
Is_NN5=E(Fis_NN5-Fi_r);
Te_NN5=1.54(Fis_NN5(1,1)*Is_NN5(2,1)-Fis_NN5(2,1)*Is_NN5(1,1));%flux linkage multiplication cross current
%vector6
Fis_NN6=(eye(2)-DTs)Fis_N+Tsudq6+(RsTs/Ld)Fi_r;
Is_NN6=E(Fis_NN6-Fi_r);
Te_NN6=1.54(Fis_NN6(1,1)*Is_NN6(2,1)-Fis_NN6(2,1)*Is_NN6(1,1));%flux linkage multiplication cross current
%vector7
Fis_NN7=(eye(2)-DTs)Fis_N+Tsudq7+(RsTs/Ld)Fi_r;
Is_NN7=E(Fis_NN7-Fi_r);
Te_NN7=1.54(Fis_NN7(1,1)*Is_NN7(2,1)-Fis_NN7(2,1)*Is_NN7(1,1));%flux linkage multiplication cross current
%vector8
Fis_NN8=(eye(2)-DTs)Fis_N+Tsudq8+(RsTs/Ld)Fi_r;
Is_NN8=E(Fis_NN8-Fi_r);
Te_NN8=1.54(Fis_NN8(1,1)*Is_NN8(2,1)-Fis_NN8(2,1)*Is_NN8(1,1));%flux linkage multiplication cross current
%calculate cost function
lamdaT=50;lamdaF=30;
%vector1
Fis_NN1_cf=sqrt(dot(Fis_NN1,Fis_NN1));
CF1=lamdaT*(u(7)-Te_NN1)^2+lamdaF*(u(8)-Fis_NN1_cf)^2;
%vector2
Fis_NN2_cf=sqrt(dot(Fis_NN2,Fis_NN2));
CF2=lamdaT*(u(7)-Te_NN2)^2+lamdaF*(u(8)-Fis_NN2_cf)^2;
%vector3
Fis_NN3_cf=sqrt(dot(Fis_NN3,Fis_NN3));
CF3=lamdaT*(u(7)-Te_NN3)^2+lamdaF*(u(8)-Fis_NN3_cf)^2;
%vector4
Fis_NN4_cf=sqrt(dot(Fis_NN4,Fis_NN4));
CF4=lamdaT*(u(7)-Te_NN4)^2+lamdaF*(u(8)-Fis_NN4_cf)^2;
%vector5
Fis_NN5_cf=sqrt(dot(Fis_NN5,Fis_NN5));
CF5=lamdaT*(u(7)-Te_NN5)^2+lamdaF*(u(8)-Fis_NN5_cf)^2;
%vector6
Fis_NN6_cf=sqrt(dot(Fis_NN6,Fis_NN6));
CF6=lamdaT*(u(7)-Te_NN6)^2+lamdaF*(u(8)-Fis_NN6_cf)^2;
%vector7
Fis_NN7_cf=sqrt(dot(Fis_NN7,Fis_NN7));
CF7=lamdaT*(u(7)-Te_NN7)^2+lamdaF*(u(8)-Fis_NN7_cf)^2;
%vector8
Fis_NN8_cf=sqrt(dot(Fis_NN8,Fis_NN8));
CF8=lamdaT*(u(7)-Te_NN8)^2+lamdaF*(u(8)-Fis_NN8_cf)^2;
CF = [CF1-8]; %程序是分别写的[CF1,至,CF8],因为网站的正文中不允许重复输入同样符合,故以此代替
[mincf,index]=min(CF);
switch index
case 1
a=0;b=0;c=0;
case 2
a=1;b=1;c=1;
case 3
a=1;b=0;c=0;
case 4
a=1;b=1;c=0;
case 5
a=0;b=1;c=1;
case 6
a=0;b=1;c=0;
case 7
a=0;b=0;c=1;
case 8
a=1;b=0;c=1;
end
x=[a;b;c];
sys = x;
function sys=mdlOutputs(t,x,u)
sys = x;%[];
function sys=mdlGetTimeOfNextVarHit(t,x,u)
sampleTime = 1; % Example, set the next hit to be one second later.
sys = t + sampleTime;
function sys=mdlTerminate(t,x,u)
sys = [];
% end mdlTerminate