|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
最近学习空间矢量控制。为什么我编写的S函数总是出错?程序如下:
function [sys,x0,str,ts] = UoutIin(t,x,u,flag)
%==========================================================================
%这是sumulink中编写S-函数必须要用到的函数引导语句。
switch flag
case 0 %初始化,调用函数:mdlInitializeSizes
[sys,x0,str,ts]=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 [sys,x0,str,ts]=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
哪位高手给看一下?不胜感激! |
|