glorious1985 发表于 2009-7-15 15:51

求助:编写的SVPWM的S函数总是出错?

最近学习空间矢量控制。为什么我编写的S函数总是出错?程序如下:

function = UoutIin(t,x,u,flag)
%==========================================================================
%这是sumulink中编写S-函数必须要用到的函数引导语句。
switch flag
case 0                                       %初始化,调用函数:mdlInitializeSizes
    =mdlInitializeSizes;
case 1                                       %连续状态计算,这里未定义
    sys=[];
case 2                                       %离散状态计算,这里未定义
    sys=[];
case 3                                       %输出信号计算,调用函数:mdlOutputs
    sys=mdlOutputs(t,x,u);
case 4                                       %下一步仿真时刻,这里未定义
    sys=[];
case 9                                       %终止仿真设定,这里未定义
    sys=[];
   otherwise
    error(['Unhandled flag = ',num2str(flag)]); %处理错误
end
%=============================================================================
% mdlInitializeSizes
function =mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates= 0;
sizes.NumDiscStates= 0;
sizes.NumOutputs   = 3;
sizes.NumInputs      = 3;
sizes.DirFeedthrough = 0;   %输入信号是否直接在输出端出现的标识,取值可以为0,1
sizes.NumSampleTimes = 1;   % at least one sample time is needed    模块采样周期的个数,即支持多采样周期的系统
sys = simsizes(sizes);
x0= [];
str = [];
%ts= [-1 0];
ts= [-1 0];               %继承输入信号的采样周期
%=============================================================================
% mdlOutputs
function sys=mdlOutputs(t,x,u)
global Va Vb p distrib step          %多个全局变量的定义中间用空格分开,而不是逗号
global sector Ts t1 t2 t0 t7 t_past t11 t22
%==========================================================================
if u(3)~=0
    Va=u(1);                  %输入V_alpha
    Vb=u(2);                  %输入V_beta
%==========================================================================
%计算合成矢量与alpha轴的夹角
    if Va>0&Vb>0                %第一象限
      p=atan(Vb/Va);
    elseif Va<=0&Vb>0
      p=atan(Vb/Va)+pi;       %第二象限
    elseif Va<0&Vb<O
      P=atan(Vb/Va)+pi;       %第三象限
    elseif Va>0&Vb<0
      P=atan(Vb/Va)+2*pi;   %第四象限
    end
    sector=fix(3*p/pi)+1;            %判断Vr所在的扇区
    Ts=1/1000;
if sector==1
   t11=(0.866*Va-0.5*Vb)*Ts;
   t22=(0*Va+Vb)*Ts;
elseif sector== 2
   t11=(-0.866*Va+0.5*Vb)*Ts;
   t22=(0.866*Va+0.5*Vb)*Ts;
elseif sector==3
   t11=(0*Va+Vb)*Ts;
   t22=(-0.866*Va-0.5*Vb)*Ts;
elseif sector==4
   t11=(0*Va-Vb)*Ts;
   t22=(-0.866*Va+0.5*Vb)*Ts;
elseif sector==5
   t11=(-0.866*Va-0.5*Vb)*Ts;
   t22=(0.866*Va-0.5*Vb)*Ts;
elseif sector==6
   t11=(0.866*Va+0.5*Vb)*Ts;
   t22=(0*Va-Vb)*Ts;
else
if t11<0   t11=0;
end
if t22<0   t22=0;
end
end
t1=t11;
t2=t22;
    if t1+t2>Ts
      t1=t1*Ts/(t1+t2);
      t2=t2*Ts/(t1+t2);
      t0=0;
      t7=0;
    else
      t0=(Ts-t1-t2)/2;
      t7=(Ts-t1-t2)/2;
    end
end
t_past=t;
if t_past>=0&t_past<t0
      step=1;
    elseif t_past>=t0&t_past<t0+t1
      step=2;
    elseif t_past>=t0+t1&t_past<t0+t1+t2
      step=3;
    elseif t_past>=t0+t1+t2&t_past<t0+t1+t2+2*t7
      step=4;
    elseif t_past>=t0+t1+t2+2*t7&t_past<t0+t1+2*t2+2*t7
      step=3;
    elseif t_past>=t0+t1+2*t2+2*t7&t_past<t0+2*t1+2*t2+2*t7
      step=2;
    else
      step=1;
end
distrib=sector*10+step;
switch distrib,             %根据区间分配各矢量
case {11,21,31,41,51,61} % 000矢量
    sys(1)=0;
    sys(2)=0;
    sys(3)=0;
case {14,24,34,44,54,64} % 111矢量
    sys(1)=0;
    sys(2)=0;
    sys(3)=0;
case {12,62} % 100矢量,0度
    sys(1)=1;
    sys(2)=0;
    sys(3)=0;
case {13,23}%110矢量,60度
    sys(1)=1;
    sys(2)=1;
    sys(3)=0;
case {22,32}%010矢量120度
    sys(1)=0;
    sys(2)=1;
    sys(3)=0;
case {33,43}%011矢量180度
    sys(1)=0;
    sys(2)=1;
    sys(3)=1;
case {42,52}%001矢量240度
    sys(1)=0;
    sys(2)=0;
    sys(3)=1;
case {53,63}%101矢量300度
    sys(1)=1;
    sys(2)=0;
    sys(3)=1;
otherwise
end


运行时出现如下的错误:
Error in block 'inverter/S-Function' while executing M-File S-function block 'distribution', flag = 3 (output), at time 0. MATLAB error message:
SWITCH expression must be a scalar or string constant


哪位高手给看一下?不胜感激!

glorious1985 发表于 2009-7-18 08:55

自己已经解决了!:@)
页: [1]
查看完整版本: 求助:编写的SVPWM的S函数总是出错?