24小时热门版块排行榜    

查看: 2294  |  回复: 0

ww_plasma

铁虫 (初入文坛)

[求助] simulink里S函数的封装问题

我要用simulink做一个读写器的系统级仿真,其中有一个PIE编码模块需要用S函数编写然后封装。S函数的程序是书上的,应该没什么大问题,但是一仿真就出现‘X0 returned by M-File S-function 'PIEcoder' in 'fmoma/S-Function1' must be a vector of length 0.’和‘Error evaluating parameter 'p' in 'fmoma/S-Function': Undefined function or variable 'p'.’的错误,这是怎么回事啊?下面是S函数程序

function[sys,x0,str,ts]=PIEcoder(t,x,u,flag)        
switch flag,                                                 %判断仿真状态
    case 0,[sys,x0,str,ts]=mdlInitializeSizes;         %初始化
    case 3,sys=mdlOutputs(t,x,u);                         %计算输出
    case 1,sys=[];                                       %导数计算
    case 2,sys=mdlUpdate(t,x,u);                          %更新离散状态
    case 4,sys=mdlGetTimeOfNextVarHit(t,x,u);             %计算下一个采样时刻
    case 9,sys=[];                                            %仿真结束
    otherwise error(['Unhandlede flag=',num2str(flag)]);  %错误处理
end
function[sys,x0,str,ts]=mdlInitializeSizes()              %定义基本属性
sizes=simsizes;                                                     %返回空的SIZE结构
size.NumContStates =0;                                      %连续状态数目
size.NumDiscStates =1000;                                 %离散状态数目
size.NumOutputs    =-1;                                      %输出端口数目
size.NumInputs     =-1;                                        %输入端口数目
size.DirFeedthrough=1;                                       %是否直通
size.NumSampleTimes=1;                                    %采样周期数目
sys=simsizes(sizes);
str=[];
x0=zeros(1,1000);
x0(1)=0;
x0(2)=0;
x0(3)=5;
x0(4)=5;
ts=[0.00001 0];
function sys=mdlOutputs(t,x,u)                       %计算连续状态变量的导数
switch x(1),
    case 0   %SOF
         switch x(2),
            case 0, sys=-1;
            case 1, sys=+1;     
            case 2, sys=-1;
            case 3, sys=+1;
            case 4, sys=+1;
            case 5, sys=+1;
            case 6, sys=+1;
            case 7, sys=+1;
             otherwise
                 error(['初始化输出错误'])
         end
        
case 1
     switch x(2),
         case 0, sys=-1;
         case 1, sys=+1;
         otherwise
              error(['符号0输出错误']);
     end
case 2
     switch x(2),
         case 0, sys=-1;
         case 1, sys=+1;     
         case 2, sys=+1;
         case 3, sys=+1;
         otherwise
              error(['符号1输出错误']);
     end
case 3   
     switch x(2),
         case 0, sys=-1;
         case 1, sys=+1;     
         case 2, sys=+1;
         case 3, sys=+1;
         case 4, sys=+1;
         case 5, sys=+1;
         case 6, sys=+1;
         case 7, sys=+1;
         otherwise
           error(['结束输出错误']);
     end
otherwise
     error(['状态判定错误']);
end
function sys=mdlUpdate(t,x,u)            %更新离散状态变量、采样时间和最大步长
if t>0.00031
     n=x(3);
sys(3)=x(3);
sys(4)=x(4);
sys(1)=x(1);
m=5:1:1000;
   sys(m)=x(m);
   if rem(t*10,0.0002)==0
       sys(3)=x(3)+1;
       sys(n)=u;
   end
switch x(1),
    case 0, sys(2)=mod(x(2)+1,8);
    case 1, sys(2)=mod(x(2)+1,2);
    case 2, sys(2)=mod(x(2)+1,4);
    case 3, sys(2)=mod(x(2)+1,8);
    otherwise
         error(['状态更新错误']);
end
end
if sys(2)==0;
     if t<0.19988
          switch x(x(4)),
              case 0, sys(1)=1;
              case 1, sys(1)=2;
          end
         x(x(4));
         sys(4)=x(4)+1;
     else
         sys(1)=3;
     end
     else
         m=1:1000;
         sys(m)=x(m);
end

系统模型在附件里
回复此楼

» 本帖附件资源列表

  • 欢迎监督和反馈:小木虫仅提供交流平台,不对该内容负责。
    本内容由用户自主发布,如果其内容涉及到知识产权问题,其责任在于用户本人,如对版权有异议,请联系邮箱:xiaomuchong@tal.com
  • 附件 1 : fmoma.mdl.autosave
  • 2012-10-09 23:28:13, 30.89 K

» 猜你喜欢

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 ww_plasma 的主题更新
信息提示
请填处理意见