声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1569|回复: 1

[电力电机类] 求助:编写的SVPWM的S函数总是出错?

[复制链接]
发表于 2009-7-15 15:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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


哪位高手给看一下?不胜感激!
回复
分享到:

使用道具 举报

 楼主| 发表于 2009-7-18 08:55 | 显示全部楼层
自己已经解决了!:@)
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-14 09:57 , Processed in 0.131973 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表