franny4611 发表于 2007-5-12 16:41

s函数的问题

写完S函数后编辑参数的时候为什么总是出现错误啊?

spare 发表于 2007-5-12 16:45

回复 #1 franny4611 的帖子

输出向量和设置的不对应吧,你的错误根本看不清楚

cdwxg 发表于 2007-5-12 20:58

原帖由 spare 于 2007-5-12 16:45 发表 http://forum.vibunion.com/forum/images/common/back.gif
输出向量和设置的不对应吧,你的错误根本看不清楚
呵呵,点下图片,然后打开就可以看清楚错误了
你的M文件,准确的说是你的S函数里面的错误
X0估计是输入吧,初始向量,因为你的输入是2个,你看下呢,变成一个是不是不存在这个错误
当然你会需要2个,那么就把你的X0设置下
实在不行,把你的程序传上来看下

franny4611 发表于 2007-5-12 21:21

function =area_sel(t,x,u,flag)
switch flag,
    case 0,
      = mdlInitializeSizes;
   
    case 2,
      sys=[];
      
    case 3,
      sys=mdlOutputs(t,x,u);
    case 4,
      sys=[];
      
    case 9,
      sys=[];
      
      otherwise
    error(['Unhandled flag = ',num2str(flag)]);
end

function=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates= 2;
sizes.NumDiscStates= 0;
sizes.NumOutputs   = 1;
sizes.NumInputs      = 2;
sizes.DirFeedthrough = 0;
sizes.NumSampleTimes = 1;   
sys = simsizes(sizes);
x0= [];


function sys=mdIOutputs(t,x,u)
if(u(1)>0)
    if(u(2)/u(1)<1/sqrt(3)&&u(2)/u(1)>-1/sqrt(3))
      sys=1;
    end
    if(u(2)/u(1)>1/sqrt(3))
      sys=2;
    end
    if(u(2)/u(1)<-1/sqrt(3))
      sys=6;
    end
end
if(u(1)<0)
    if(u(2)/u(1)<-1/sqrt(3))
      sys=3;
    end
    if(u(2)/u(1)<1/sqrt(3)&&u(2)/u(1)>-1/sqrt(3))
      sys=4;
    end
    if(u(2)/u(1)>1/sqrt(3))
      sys=5;
    end
end
    if(u(1)==0)
      if(u(2)>0)
            sys=3;
      else
            sys=6;
      end
    end
这是我的程序,也就是上面那个帖子里面的,问题就是单独编译M文件的时候出错,现在明白是不可能通过了,但是为什么我改不了参数呢?每次点OK就报错。

cdwxg 发表于 2007-5-12 21:34

恩,我看下,你先把你模型传上来哈,一起,我懒得搭建:lol 看下能否帮助你。

franny4611 发表于 2007-5-12 21:37

就是上面那个啊,其实这个我就是试试s 函数的用法,我的模型有些复杂,其他地方不知道有没有错,所以先试试这个,我就是随便选了两个信号,通过判断来确定输出信号

franny4611 发表于 2007-5-12 21:39

函数的功能是为了实现磁链区间的判断

cdwxg 发表于 2007-5-12 21:50

先看了一部分
上面的给你整洁了一下,下面发现个小错误
function =area_sel(t,x,u,flag)

switch flag,
    case 0,
       =mdlInitializeSizes;
    case 3,
      sys=mdlOutputs(t,x,u);
    case{2,4,9}
      sys=[];
    otherwise
      error(['Unhandled flag = ',num2str(flag)]);
end

function=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates= 2;
sizes.NumDiscStates= 0;
sizes.NumOutputs   = 1;
sizes.NumInputs      = 2;
sizes.DirFeedthrough = 0;
sizes.NumSampleTimes = 1;   
sys = simsizes(sizes);
x0= [];
str = [];               
ts = ;

function sys=mdlOutputs(t,x,u)
红笔的地方是l不是I

[ 本帖最后由 cdwxg 于 2007-5-12 21:52 编辑 ]

franny4611 发表于 2007-5-12 21:58

嗯,谢谢,是打错了,不过问题依然存在

spare 发表于 2007-5-12 22:02

回复 #9 franny4611 的帖子

你根本没有用到状态啊,怎么连续状态数是两个呢

cdwxg 发表于 2007-5-12 22:06

把你的if与end换成if else,好像没有你这样的写法吧?你把模型传给我,我来看
你的sin输入的数据都是多少啊?我知道你随便弄的
那我也要看下你的情况,否则我的搭建可能跟你不同呢?

franny4611 发表于 2007-5-12 22:09

嗯,我是没用状态,我看网上别人写的资料说这两句是说明系统是连续的还是离散的sizes.NumContStates= 2;
sizes.NumDiscStates= 0;
由于我也是初次接触这个,也不知道我是否理解错误,还望各位指教!

spare 发表于 2007-5-12 22:09

回复 #12 franny4611 的帖子

你去掉试试啊

cdwxg 发表于 2007-5-12 22:12

原帖由 franny4611 于 2007-5-12 22:09 发表 http://forum.vibunion.com/forum/images/common/back.gif
嗯,我是没用状态,我看网上别人写的资料说这两句是说明系统是连续的还是离散的sizes.NumContStates= 2;
sizes.NumDiscStates= 0;
由于我也是初次接触这个,也不知道我是否理解错误,还望各位指教!
不是,第一个表示连续状态变量个数,第二个表示离散变量个数,我这个地方忽略了,我认为你应该是output的错误。。。。
就一直在那找。。。汗,估计是这里错了。

franny4611 发表于 2007-5-12 22:22

改为sizes.NumContStates= 0;
sizes.NumDiscStates= 0;后可以编辑参数了,但是运行报错Error in block 'qujian/S-Function' while executing M-File S-function block 'area_sel', flag = 3 (output), at time 0. MATLAB error message:
One or more output arguments not assigned during call to 'area_sel (mdlOutputs)'
两个sin幅值我分别取的1和2
页: [1] 2 3
查看完整版本: s函数的问题