




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、ma t l ab 中 s -f unc t i on 的 编 写s 函数是 system Function 的简称,用它来写自己的 simulink 模块。(够简 单吧, _,详细的概念介绍大伙看帮助吧)可以用 matlab 、C、C+、 Fortran 、Ada 等语言来写,这儿我只介绍怎样用 matlab 语言来写吧(主要是 它比较简单) 先讲讲为什么要用 s函数,我觉得用 s函数可以利用 matlab 的 丰富资源,而不仅仅局限于 simulink 提供的模块,而用 c 或 c+ 等语言写的 s 函数还可以实现对硬件端口的操作,还可以操作 windows API 等的先介绍一下 sim
2、ulink 的仿真过程(以便理解 s 函数), simulink 的仿真有 两个阶段:1.初始化:这个阶段主要是设置一些参数,像系统的输入输出个数、状态初 值、采样时间等;2.运行阶段:这个阶段里要进行计算输出、更新离散状态、计算连续状态等 等。这个阶段需要反复运行,直至结束。在 matlab 的 workspace 里打 edit sfuntmpl( 这是 matlab 自己提供的 s 函数 模板),我们看它来具体分析 s 函数的结构。它的第一行是这样的: function sys,x0,str,ts=sfuntmpl(t,x,u,flag) 先讲输 入与输出变量的含义: t是采样时间, x
3、是状态变量, u是输入(是做成 simulink 模块的输入) ,flag 是仿真过程中的状态标志(以它来判断当前是初始 化还是运行等); sys 输出根据 flag 的不同而不同(下面将结合 flag 来讲 sys 的含义), x0 是状态变量的初始值, str 是保留参数( mathworks 公司还没想 好该怎么用它,嘻嘻,一般在初始化中将它置空就可以了 ,str=) ,ts 是一个 12 的向量, ts(1) 是采样周期, ts(2)是偏移量。面结合 sfuntmpl.m 中的代码来讲具体的结构:switch flag, % 判断 flag ,看当前处于哪个状态case 0, sys,
4、x0,str,ts=mdlInitializeSizes;flag=0 表示处于初始化状态,此时用函数 mdlInitializeSizes 进行初始化,此函数在 sfuntmpl.m 的 149 行我们找到他,在初始化状态下, sys 是一个结构体,用它来设置模块的一些参数,各个参数详细说明如下:size = simsizes;% 用于设置模块参数的结构体用 simsizes 来生成sizes.NumContStates = 0;% 模块连续状态变量的个数sizes.NumDiscStates = 0;% 模块离散状态变量的个数sizes.NumOutputs = 0;% 模块输出变量的个数
5、sizes.NumInputs = 0;% 模块输入变量的个数sizes.DirFeedthrough = 1;% 模块是否存在直接贯通(直接贯通我的理解是输入能 % 直接控制输出)sizes.NumSampleTimes = 1;% 模块的采样时间个数,至少是一个sys = simsizes(sizes); % 设置完后赋给 sys 输出举个例子,考虑如下模型: dx/dt=fc(t,x,u) 也可以用连续状态方程描述: dx/dt=A*x+B*u x(k+1)=fd(t,x,u) 也可以用离散状态方程描述:x(k+1)=H*x(k)+G*u(k) y=fo(t,x,u) 也可以用输出状态方
6、程描述: y=C*x+D*u 设上述模型连续状态变量、离散状态变量、输入变量、输出变量均为 1个,我们就只需改上面那一段代码为:(一般连续状态与离散状态不会一块用,我这儿是为了方便说明)sizes.NumContStates=1;sizes.NumDiscStates=1;sizes.NumOutputs=1;sizes.NumInpu ts=1; 其他的可以不变。继续在 mdlInitializeSizes 函数中往下看:x0 = ; % 状态变量设置为空,表示没有状态变量,以我们上面的假设,可改 % 为 x0=0,0( 离散和连续的状态变量我们都设它初值为 0) str = ; % 这个就
7、 不用说了,保留参数嘛,置 就可以了,反正没什么用,可能 7.0 会给它一些意 义ts = 0 0; % 采样周期设为 0 表示是连续系统,如果是离散系统在下面的 mdlGet %TimeOfNextVarHit 函数中具体介绍嘻嘻,总算讲完了初始化,后面 的应该快了。在 sfuntmpl 的 106 行继续往下看:case 1, sys=mdlDerivatives(t,x,u); flag=1 表示此时要计算连续状态的微 分,即上面提到的 dx/dt=fc(t,x,u) 中的 dx/dt, 找到 mdlDerivatives 函数(在 193 行)如果设置连续状态变量个数为 0,此处只需
8、sys=; 就可以了(如 sfuntmpl 中一样),按我们上述讨论的那个模型,此处改成 sys=fc(t,x(1),u) 或 sys=A*x(1)+B*u % 我们这儿 x(1) 是连续状态变量,而 x(2)是离散的,这儿只用 到连续的,此时的输出 sys 就是微分继续,在 sfuntmpl 的 112 行:case 2, sys=mdlUpdate(t,x,u); flag=2 表示此时要计算下一个离散状态,即 上面提到的 x(k+1)=fd(t,x,u) ,找到 mdlUpdate 函数(在 206 行)它这儿 sys=; 表示没有离散状态,我们这而可以改成 sys=fd(t,x(2),
9、u) 或 sys=H*x(2)+G*u;%sys 即为 x(k+1) 看来后面几个一两句话就可了,呵呵,在 sfuntmpl 的 118 行:case 3, sys=mdlOutputs(t,x,u); flag=3 表示此时要计算输出,即 y=fo(t,x,u), 找到 mdlOutputs 函数(在 218 行),如上,如果 sys= 表示没有输出,我们 改成 sys=fo(t,x,u) 或 sys=C*x+D*u %sys 此时为输出 y 好像快完了,嘻嘻,在 sfuntmpl 的 124 行case 4, sys=mdlGetTimeOfNextVarHit(t,x,u); flag=
10、4 表示此时要计算下一 次采样的时间,只在离散采样系统中有用 (即上文的 mdlInit ializeSizes 中提到 的 ts 设置 ts(1) 不为 0) 连续系统中只需在 mdlGetTimeOfNextVarHit 函数中写 上 sys=; 这个函数主要用于变步长的设置,具体实现大家可以用 edit vsfunc 看 vsfunc.m 这个例子最后一个,在 sfuntmpl 的 130 行case 9, sys=mdlTerminate(t,x,u); flag=9 表示此时系统要结束,一般来说写 上在 mdlTerminate 函数中写上 sys= 就可,如果你在结束时还要设置什么
11、,就 在此函数中写关于 sfuntmpl 这个 s 函数的模板讲完了。 s 函数还可以带用户参 数,下面给个例子,和 simulink 下的 gain 模块功能一样,大伙自己看吧,我睡 觉去了,累了function sys,x0,str,ts = sfungain(t,x,u,flag,gain)switch flag,case 0,sizes = simsizes;sizes.NumContStates = 0;sizes.NumDiscStates = 0;sizes.NumOutputs = 1;sizes.NumInputs = 1;sizes.DirFeedthrough = 1;s
12、izes.NumSampleTimes = 1;sys = simsizes(sizes);x0=; str=; ts=0,0;case 3, sys=gain*u;case 1,2,4,9, sys = ;endSIMULINK s-function 的设计 Simulink 为用户提供了许多内置的基本库模 块,通过这些模块进行连接而构成系统的模型。对于那些经常使用的模块进行 组合并封装可以构建出重复使用的新模块,但它依然是基于 Simulink 原来提供 的内置模块。而 Simulink s-function 是一种强大的对模块库进行扩展的新工 具。(一)、s-function 的概念s-
13、function 是一个动态系统的计算机语言描述,在 MATLAB 里,用户可以 选择用 m 文件编写,也可以用 c 或 mex 文件编写,在这里只给大家介绍如何 用 m 文件编写 s-function 。S-function 提供了扩展 Simulink 模块库的有力工具,它采用一种特定的调 用语法,使函数和 Simulink 解法器进行交互。 S-function 最广泛的用途是定制 用户自己的 Simulink 模块。它的形式十分通用,能够支持连续系统、离散系统 和混合系统。(二)、建立 m 文件 s-function1、使用模板文件: sfuntmp1. m 格式: sys,x0=fu
14、nction(t,x,u,flag) 该模板 文件位于 MATLAB 根目录下 toolbox/simulink/blocks 目录下。模板文件里 s- function 的结构十分简单,它只为不同的 flag 的值指定要相应调用的 m 文件子 函数。比如当 flag=3 时,即模块处于计算输出这个仿真阶段时,相应调用的子函 数为 sys=mdloutputs(t,x,u) 。模板文件使用 switch 语句来完成这种指定,当然 这种结构并不唯一,用户也可以使用 if 语句来完成同样的功能而且在实际运用时,可以根据实际需要来去掉某些值,因为并不是每个模 块都需要经过所有的子函数调用。模板文件只
15、是 Simulink 为方便用户而提供的 一种参考格式,并不是编写 s-function 的语法要求,用户完全可以改变子函数 的名称,或者直接把代码写在主函数里,但使用模板文件的好处是,比较方 便,而且条理清晰。使用模板编写 s-function ,用户只需把 s-函数名换成期望的函数名称,如果 需要额外的输入参量,还需在输入参数列表的后面增加这些参数,因为前面的 4 个参数是 simulink 调用 s-function 时自动传入的。对于输出参数,最好不做 修改。接下去的工作就是根据所编 s-function 要完成的任务,用相应的代码去 替代模板里各个子函数的代码即可。 Simulink
16、 在每个仿真阶段都会对 s- function 进行调用,在调用时, Simulink 会根据所处的仿真阶段为 flag 传入不 同的值,而且还会为 sys 这个返回参数指定不同的角色,也就是说尽管是相同 的 sys 变量,但在不同的仿真阶段其意义却不相同,这种变化由 simulink 自动 完成。m 文件 s-function 可用的子函数说明如下:mdlInitializeSizes(flag=0) :定义 s-function 模块的基本特性,包括采样时 间、连续或者离散状态的初始条件和 sizes 数组。mdlDerivatives(flag=1) :计算连续状态变量的微分方程。 md
17、lUpdate(flag=2) :更新离散状态、采样时间和主时间步的要求。 mdlOutputs(flag=3) :计算 s-function 的输出。mdlGetTimeOfNextVarHit(flag=4) :计算下一个采样点的绝对时间,这个方 法仅仅是在用户在 mdlInitializeSizes 里说明了一个可变的离散采样时间概括说来,建立 s-function 可以分成两个分离的任务:初始化模块特性包括 输入输出信号的宽度,离散连续状态的初始条件和采样时间。将算法放到合适 的 s-function 子函数中去。2、定义 s-function 的初始信息为了让 Simulink 识别
18、出一个 m 文件 s- function ,用户必须在 s-函数里提供有关 s-函数的说明信息,包括采样时间、 连续或者离散状态个数等初始条件。这一部分主要是在 mdlInitializeSizes 子函 数里完成。 Sizes 数组是 s-function 函数信息的载体,它内部的字段意义为: NumContStates(sys(1) :连续状态的个数(状态向量连续部分的宽度) NumDiscStates(sys(2) :离散状态的个数(状态向量离散部分的宽度) NumOutputs(sys(3) : 输出变量的个数(输出向量的宽度) NumInputs(sys(4) :输入变量的个数(输入
19、向量的宽度) DirFeedthrough(sys(5) :有不连续根的数量 NumSampleTimes(sys(6) :采样 时间的个数,有无代数循环标志如果字段代表的向量宽度为动态可变,则可以 将它们赋值为 1。注意 DirFeedthrough 是一个布尔变量,它的取值只有 0 和 1 两种, 0 表示没有直接馈入,此时用户在编写 mdlOutputs 子函数时就要确保 子函数的代码里不出现输入变量 u;1 表示有直接馈入。 NumSampleTimes 表 示采样时间的个数,也就是 ts 变量的行数,与用户对 ts 的定义有关。需要指出 的是,由于 s-function 会忽略端口,所以当有多个输入变量或多个输出变量 时,必须用 mux 模块或 demux 模块将多个单一输入合成一个复合输入向量或 将一个复合输出向量分解为多个单一输出。 3、输
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 大学生职业规划大赛《汽车服务工程专业》生涯发展展示
- 新质生产力知识
- 孤立性直肠溃疡综合征的临床护理
- 手术室医用气体管理
- 长征胜利八十周年主题发言稿模版
- 语文教师考试试题及答案
- 银行在线面试题目及答案
- 水系灭火剂生产工艺流程图
- 学校消防广播测试题及答案
- 宣传消防面试题及答案
- 农产品供应链应急保障措施
- 2024年中国农业银行安徽蚌埠支行春季校招笔试题带答案
- 食品原料报废管理制度
- 2025年高级政工师理论考试题库(浓缩500题)
- 乡村振兴学习课件
- 2025年施工现场质量员继续教育考试题库(继续教育)含答案
- 饲料企业安全生产工作计划
- 临时用地方案
- 山东大学《军事理论》考试试卷及答案解析
- 2025年重庆市合川区事业单位招考聘用乡村振兴人才高频重点模拟试卷提升(共500题附带答案详解)
- 2025年陕能榆林清洁能源开发有限公司招聘笔试参考题库含答案解析
评论
0/150
提交评论