声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 8331|回复: 44

s函数的问题

[复制链接]
发表于 2007-5-12 16:41 | 显示全部楼层 |阅读模式

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

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

x
写完S函数后编辑参数的时候为什么总是出现错误啊?
mis.GIF
回复
分享到:

使用道具 举报

发表于 2007-5-12 16:45 | 显示全部楼层

回复 #1 franny4611 的帖子

输出向量和设置的不对应吧,你的错误根本看不清楚
发表于 2007-5-12 20:58 | 显示全部楼层

呵呵,点下图片,然后打开就可以看清楚错误了
你的M文件,准确的说是你的S函数里面的错误
X0估计是输入吧,初始向量,因为你的输入是2个,你看下呢,变成一个是不是不存在这个错误
当然你会需要2个,那么就把你的X0设置下
实在不行,把你的程序传上来看下
 楼主| 发表于 2007-5-12 21:21 | 显示全部楼层
function [sys,x0,str,ts]=area_sel(t,x,u,flag)
switch flag,
    case 0,
      [sys,x0,str,ts]= 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[sys,x0,str,ts]=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就报错。
发表于 2007-5-12 21:34 | 显示全部楼层
恩,我看下,你先把你模型传上来哈,一起,我懒得搭建:lol 看下能否帮助你。
 楼主| 发表于 2007-5-12 21:37 | 显示全部楼层
就是上面那个啊,其实这个我就是试试s 函数的用法,我的模型有些复杂,其他地方不知道有没有错,所以先试试这个,我就是随便选了两个信号,通过判断来确定输出信号
 楼主| 发表于 2007-5-12 21:39 | 显示全部楼层
函数的功能是为了实现磁链区间的判断
发表于 2007-5-12 21:50 | 显示全部楼层
先看了一部分
上面的给你整洁了一下,下面发现个小错误
function [sys,x0,str,ts]=area_sel(t,x,u,flag)

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

function[sys,x0,str,ts]=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 = [0 0];

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

[ 本帖最后由 cdwxg 于 2007-5-12 21:52 编辑 ]
 楼主| 发表于 2007-5-12 21:58 | 显示全部楼层
嗯,谢谢,是打错了,不过问题依然存在
发表于 2007-5-12 22:02 | 显示全部楼层

回复 #9 franny4611 的帖子

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

评分

1

查看全部评分

发表于 2007-5-12 22:06 | 显示全部楼层
把你的if与end换成if else,好像没有你这样的写法吧?你把模型传给我,我来看
你的sin输入的数据都是多少啊?我知道你随便弄的
那我也要看下你的情况,否则我的搭建可能跟你不同呢?
 楼主| 发表于 2007-5-12 22:09 | 显示全部楼层
嗯,我是没用状态,我看网上别人写的资料说这两句是说明系统是连续的还是离散的sizes.NumContStates  = 2;
sizes.NumDiscStates  = 0;
由于我也是初次接触这个,也不知道我是否理解错误,还望各位指教!
发表于 2007-5-12 22:09 | 显示全部楼层

回复 #12 franny4611 的帖子

你去掉试试啊
发表于 2007-5-12 22:12 | 显示全部楼层
原帖由 franny4611 于 2007-5-12 22:09 发表
嗯,我是没用状态,我看网上别人写的资料说这两句是说明系统是连续的还是离散的sizes.NumContStates  = 2;
sizes.NumDiscStates  = 0;
由于我也是初次接触这个,也不知道我是否理解错误,还望各位指教!

不是,第一个表示连续状态变量个数,第二个表示离散变量个数,我这个地方忽略了,我认为你应该是output的错误。。。。
就一直在那找。。。汗,估计是这里错了。
 楼主| 发表于 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
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-29 12:45 , Processed in 0.088336 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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