声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3013|回复: 10

[求助]在SIMULINK框图中如何引用S-函数?谢谢

[复制链接]
发表于 2006-4-4 16:42 | 显示全部楼层 |阅读模式

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

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

x
<P>我用一个S-Function来引用,并且在S-Function  parameters里面注明引用的函数名是我已经写好的S函数 sfun:<BR><BR>function [sys,x0,str,ts]=sfun(t,x,u,flag,m0,m1,m2,j1,j2,l1,l2,l,f0,f1,f2,g0,g)<BR>switch flag<BR>    case 0                      %初始化<BR>        [sys,x0,str,ts]=mdlInitializeSizes;<BR>    case 1                      %计算连续状态<BR>        sys=mdlDerivatives(t,x,u,m0,m1,m2,j1,j2,l1,l2,l,f0,f1,f2,g0,g);<BR>    case 2                      %计算离散状态<BR>        sys=mdlUpdate(t,x,u);<BR>    case 3                      %计算输出<BR>        sys=mdlOutputs(t,x,u);<BR>    case 4                      %计算采样时间<BR>        sys=mdlGetTimeOfNextVarHit(t,x,u);<BR>    case 9                      %结束时的动作<BR>        sys=mdlTerminate(t,x,u);<BR>    otherwise                   %flag错误<BR>        error(['不正确的flag=',num2str(flag)]);<BR>end</P>
<P>function [sys,x0,str,ts]=mdlInitializeSizes()<BR>    sizes=simsizes;             %创建尺寸结构<BR>    sizes.NumContStates = 6;    %连续状态的个数为6<BR>    sizes.NumDiscStates = 0;    %离散状态的个数为0<BR>    sizes.NumOutputs    = 6;    %输出个数为6<BR>    sizes.NumInputs     = 1;    %输入个数为1<BR>    sizes.DirFeedthrough= 0;    %无直接反馈输入<BR>    sizes.NumSampleTimes= 1;    %至少需一个采样时间<BR>    sys = simsizes(sizes);<BR>    x0                  = [1 0 0 0 0 0];   <BR>    str                 = [];   %系统保留<BR>    ts                  = [0 0];%初始化采样时间数组<BR>    <BR>function sys=mdlDerivatives((t,x,u,m0,m1,m2,j1,j2,l1,l2,l,f0,f1,f2,g0,g)<BR>%计算连续状态<BR>    O=zeros(3);<BR>    E=eye(3);<BR>    MATR = [m0+m1+m2,             (m1*l1+m2*l)*cos(x(2)),           m2*l2*cos(x(3));<BR>           (m1*l1+m2*l)*cos(x(2)), j1+m1*l1^2+m2*l^2,               m2*l2*l*cos(x(3)-x(2));<BR>            m2*l2*cos(x(3)),       m2*l2*l*cos(x(3)-x(2)),          j2+m2*l2^2];<BR>        <BR>    F=-[f0,       -(m1*l1+m2*l)*sin(x(2))*x(5),       -m2*l2*sin(x(2))*x(6);<BR>        0,        f1+f2,                              -m2*l2*l*sin(x(3)-x(2))*x(6)-f2;<BR>        0,        m2*l2*l*sin(x(3)-x(2))*x(6)-f2,          f2];<BR>    <BR>    N=[0;  (m1*l1+m2*l)*g*sin(x(2));    m2*l2*g*sin(x(3))];<BR>    <BR>    G=[0;  0;  0;  g0;  0;  0];<BR>    <BR>    A=[0,E;O,MATR\F];<BR>    <BR>    N1=[zeros(3,1);N];<BR>    <BR>    sys = A*x+N1+G*u;<BR>    <BR>function sys=mdlUpdate(t,x,u)<BR>%无离散状态<BR>    sys = [];</P>
<P>function sys=mdlOutputs(t,x,u)<BR>    sys = x;</P>
<P>function sys=mdlGetTimeOfNextVarHit(t,x,u)<BR>    sampleTime = [];</P>
<P>function sys=mdlTerminate(t,x,u)<BR>    sys = [];<BR><BR><BR><BR>参数是用一个subsystem赋的,<BR><BR>可是老是出错:<BR><BR>Error in S-function block 'untitled/二阶倒立摆系统/S-Function': S-Function 'sfun' does not exist<BR><BR>初学,嘿嘿,请各位高手帮帮忙!<BR></P>
回复
分享到:

使用道具 举报

发表于 2006-4-5 08:48 | 显示全部楼层

回复:(bff025)[求助]在SIMULINK框图中如何引用S-函...

只需用S-function模块,打开它并在其中设置上你编写的S-function模块的函数名 <BR><BR>和参数,就可以直接使用了 <BR>
 楼主| 发表于 2006-4-5 12:53 | 显示全部楼层
<P>谢谢哈<BR><BR>问题是我已经写了<BR><BR>仍然出现一样的问题<BR><BR>好像是我写的S函数哪里错了<BR><BR>我的执行函数<BR><BR>又出现<BR>??? Input argument 'flag' is undefined.<BR>的提示<BR><BR>怎么回事的说?!</P>
发表于 2006-4-7 10:40 | 显示全部楼层
输出个数应该是6个。应该用sys(1)、sys(2)等表达
发表于 2006-7-15 13:37 | 显示全部楼层
o wo ye bu dong
发表于 2006-8-16 03:54 | 显示全部楼层
我觉得应该错在你路径名用了中文。。。
Simulink对中文支持比 MATLAB还差,封装时中文也是没法用的。
发表于 2006-8-16 03:55 | 显示全部楼层
把中文的文件夹都改成英文试试,看看行不行
发表于 2006-8-23 11:54 | 显示全部楼层
应该是文件夹有一个是中文名的原因
发表于 2006-9-23 16:05 | 显示全部楼层
sizes.DirFeedthrough= 1; %无直接反馈输入
试试看
发表于 2006-9-23 16:06 | 显示全部楼层
正常的s函数 在m编译器里运行都会出现 Input argument 'flag' is undefined
发表于 2006-9-25 12:03 | 显示全部楼层

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-9-21 15:26 , Processed in 0.067944 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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