第9章S函数培训课件

上传人:yuzo****123 文档编号:140352591 上传时间:2020-07-29 格式:PPT 页数:111 大小:643.50KB
返回 下载 相关 举报
第9章S函数培训课件_第1页
第1页 / 共111页
第9章S函数培训课件_第2页
第2页 / 共111页
第9章S函数培训课件_第3页
第3页 / 共111页
第9章S函数培训课件_第4页
第4页 / 共111页
第9章S函数培训课件_第5页
第5页 / 共111页
点击查看更多>>
资源描述

《第9章S函数培训课件》由会员分享,可在线阅读,更多相关《第9章S函数培训课件(111页珍藏版)》请在金锄头文库上搜索。

1、第9章 S-函 数,9.1 S-函数概述 9.2 S-函数的工作原理 9.3 编写M文件S-函数 9.4 编写C MEX S-函数,9.1 S-函数概述,9.1.1 S-函数的基本概念 S-函数是系统函数(System Function) 的简称,是指采用非图形化的方式(即计算机语言,区别于Simulink的系统模块)描述的一个功能块。用户可以采用MATLAB代码,C,C+,FORTRAM或Ada等语言编写S-函数。S-函数由一种特定的语法构成,用来描述并实现连续系统、离散系统以及复合系统等动态系统;S-函数能够接收来自Simulink求解器的相关信息,并对求解器发出的命令做出适当的响应,这种

2、交互作用非常类似于Simulink系统模块与求解器的交互作用。,S-函数作为与其他语言相结合的接口,可以使用这个语言所提供的强大能力。例如,MATLAB语言编写的S-函数可以充分利用MATLAB所提供的丰富资源,方便地调用各种工具箱函数和图形函数;使用C语言编写的S-函数则可以实现对操作系统的访问,如实现与其它进程的通信和同步等。,(7) 扩展Simulink功能。M文件S-函数可以扩展图形能力,C MEX S-函数可以提供与操作系统的接口。 (8) S-函数的语法结构是为实现一个动态系统而设计的(默认用法),其它S-函数的用法是默认用法的特例(如用于显示目的)。,9.1.2 如何使用S-函数

3、 前面简单介绍了S-函数的基本概念及其主要的功能。在动态系统设计、仿真与分析中,用户可以使用Functions sizes.NumInputs = 1;,图9.2 一个用S-函数实现的简单系统,(3) 找到函数mdlOutputs,加入以下代码: sys=2*u; (到现在为止我们的第一个S-函数写完了。下面演示一下它的作用。) (4) 在Simulink空白页中添加S-function 块,打开S-function 块对话框,参数S-function name设置为doublesfunction 。按照图9.2添加连接好其余的各个模块。 (5) 开始仿真,在Scope中观察输出结果,可以看到

4、输入正弦信号被放大为原来的2倍,如图9.2所示。,9.1.3 与S-函数相关的一些术语 理解下列与S-函数相关的一些基本术语对于用户理解S-函数的概念与编写都是非常有益的;而且这些概念在其它的仿真语言中也是会经常遇到的。 1. 仿真例程(Routines) Simulink在仿真的特定阶段调用对应的S-函数功能模块(函数),来完成不同的任务,如初始化、计算输出、更新离散状态、计算导数、结束仿真等,这些功能模块(函数)称为仿真例程或者回调函数(call back functions)。表9.1列出了S-函数例程函数和对应的仿真阶段。关于仿真例程将在S-函数工作原理一节详细介绍。,表9.1 S-函

5、数例程,2. 直接馈通(Direct feedthrough) 直接馈通意味着输出或可变采样时间与输入直接相关(详见第6章)。在如下的两种情况下需要直接馈通: (1) 某一时刻的系统输出y中包含某一时刻的系统输入u。 (2) 系统是一个变采样时间系统(variable sample time system)且采样时间计算与输入u相关。,其中n表示第n个采样点。 Simulink在每一个采样点上调用mdlOutput和mdlUpdate例程。对于连续时间系统采样时间和偏移量的值应该设置为零。采样时间还可以继承自驱动模块、目标模块或者系统最小采样时间,这种情况下采样时间值应该设置为-1,或者INH

6、ERITED_SAMPLE_TIME。 4. 动态输入(Dynamically sized inputs) S-函数支持动态可变维数的输入。S-函数的输入变量u的维数决定于驱动S-函数模块的输入信号的维数。,9.2 S-函数的工作原理,9.2.1 状态方程 在对动态系统建模时,总是能够采用广义的状态空间形式对无论是线性系统还是非线性系统进行描述。这个描述包含以下两个方程: 状态方程: 输出方程:,状态方程描述了状态变量的一阶导数与状态变量、输入量之间的关系。n阶系统具有n个独立的状态变量,系统状态方程则是n个联立的一阶微分方程或者差分方程。对于一个系统,由于所选择的状态变量不同,会导出不同的状

7、态方程,因此状态方程的形式不是唯一的。输出方程描述了输出与状态变量、输入量之间的关系。输出量根据任务的需要确定。一个典型的线性系统的状态方程可以用矩阵的形式描述为: 状态方程: 输出方程:,其中A、B、C、D分别是状态矩阵、输入矩阵、输出矩阵、前馈矩阵。 Simulink框图的大部分模块都具有一个输入向量u、一个输出向量y和一个状态向量x,如图9.3所示。,图9.3 Simulink模块,u,x,y和时间t之间存在如下关系: 输出方程: 连续状态方程: 离散状态方程: 其中。,S-函数同样是一个Simulink模块。它的以下几个例程函数清楚地体现了状态空间所描述的特性。 (1) S-函数中的连

8、续状态方程描述。状态向量的一阶导数是状态x、输入u和时间t的函数。在S-函数中,状态的一阶导数是在mdlDerivatives例程中计算的,并将结果返回供求解器积分。 (2) S-函数中的离散状态方程描述。下一步状态的值依赖于当前的状态输入u和时间t。这是通过mdlUpdate例程完成的,并将结果返回供求解器在下一步时使用。 (3) S-函数中的输出方程描述。输出值是状态、输入和时间的函数。,9.2.2 Simulink仿真的两个阶段 理解S-函数首先要很好地了解Simulink的仿真过程。仿真包含两个主要阶段,第一个阶段是初始化,这时块的所有参数都已确定下来。初始化阶段完成了以下工作: (1

9、) 传递参数给MATLAB进行求值。 (2) 得到的数值作为实际的参数使用。 (3) 展开模型的层次,每个子系统被它们所包含的块替代。 (4) 检查信号的宽度和连接。 (5) 确定状态初值和采样时间。,仿真运行阶段的工作可以概括为: (1) 计算输出。 (2) 更新离散状态。 (3) 计算连续状态,连续状态的计算过程: 每个块按照预先确定的顺序计算输出。 每个块使用当前时间、块的输入和状态计算它的导数。 导数返回给求解器,通过积分得到下一步状态的值。 (4) 计算输出,过零可能被激活。,图9.4 求解器与系统的交互作用关系,9.2.3 S-函数仿真流程 S-函数是Simulink的重要组成部分

10、,它的仿真过程包含在Simulink仿真过程之中,所以上一节所述同样适用于S-函数。如图9.5所示,S-函数的仿真流程也包括初始化阶段和运行阶段两个阶段。图9.5中每个功能模块都对应于一个仿真例程或者回调函数。,图9.5 S-函数仿真流程,(1) 初始化:在仿真开始前,Simulink在这个阶段初始化S-函数。 初始化结构体SimStruct,它包含了S-函数的所有信息。 设置输入输出端口数。 设置采样时间。 分配存储空间。 (2) 计算下一个采样时间点:只有在使用变步长求解器进行仿真时,才需要计算下一个采样时间点,即计算下一步的仿真步长。,(3) 计算输出:计算所有输出端口的输出值。 (4)

11、 更新状态:此例程在每个步长处都要执行一次,可以在这个例程中添加每一个仿真步都需要更新的内容,例如离散状态的更新。 (5) 数值积分:用于连续状态的求解和非采样过零点。如果S-函数存在连续状态,Simulink就在minor step time内调用mdlDdrivatives和mdlOutput两个S-函数例程。,9.3 编写M文件S-函数,9.3.1 M文件S-函数的工作流程 M文件S-函数和上节所介绍的S-函数仿真流程是一致的。它调用例程函数的顺序是通过标志Flag来控制的。图9.6给出了各仿真阶段的标志值、变量值及其对应仿真例程。,图9.6 M文件S-函数流程,9.3.2 M文件S-函

12、数模板 Simulink为我们编写S-函数提供了各种模板文件,其中定义了S-函数完整的框架结构,用户可以根据自己的需要加以剪裁。编写M文件S-函数时,推荐使用S-函数模板文件sfuntmpl.m。这个文件包含了一个完整的M文件S-函数,它包含1个主函数和6个子函数。在主函数内程序根据标志变量Flag,由一个开关转移结构(Switch-Case)根据标志将执行流程转移到相应的子函数,即例程函数。Flag标志量作为主函数的参数由系统(Simulink引擎)调用时给出。了解这个模板文件的最好方式莫过于直接打开看看其代码。,要打开模板文件,可在MATLAB命令行下输入: edit sfuntmpl 或

13、者双击S-function demosM-file S-functionsM-file template 块。 下面是删除了其原有注释的代码,结构反而更为清晰紧凑。 function sys,x0,str,ts = sfuntmpl(t,x,u,flag) % 主函数 % 主函数包含四个输出:sys 数组包含某个子函数返回的值,它的含义随着调用子函数的不同而不同;x0 为所有状态的初始化向量;str是保留参数,总是一个空矩阵;Ts返回系统采样时间。,% 仿真流程位置如图9.6所示;此外输入参数后面还可以接续一系列的附带参数。另外别忘了编写自己的S-函数时,应该把函数名sfuntmpl改为S-f

14、unction块中对应的函数名 function sys,x0,str,ts = sfuntmpl(t,x,u,flag) switch flag case 0 sys,x0,str,ts=mdlInitializeSizes; case 1 sys=mdlDerivatives(t,x,u); case 2 sys=mdlUpdate(t,x,u); case 3,sys=mdlOutputs(t,x,u); case 4 sys=mdlGetTimeOfNextVarHit(t,x,u); case 9 sys=mdlTerminate(t,x,u); otherwise error(Un

15、handled flag = ,num2str(flag); end % 主函数结束 % 下面是各个子函数,即各个仿真例程 % 1. 初始化例程子函数:提供状态、输入、输出、采样时间数目和初始状态的值。必须有该子函数。,% 初始化阶段,标志变量首先被置为 0,S-函数被第一次调用时,mdlInitializeSizes 子函数首先被调用。这个子函数应当为系统提供S-function块的下列信息: sizes.NumContStates = 0; % 连续状态的个数 sizes.NumDiscStates = 0; % 离散状态的个数 sizes.NumOutputs = 0; % 输出的个数

16、sizes.NumInputs = 0; % 输入的个数 sizes.DirFeedthrough = 1; % 是否直接馈通:这是一个布尔量,当输出值直接依赖于同一时刻的输入值时为 1;否则为0,sizes.NumSampleTimes = 1; % 采样时间的个数:每个系统至少有一个采样时间 % 这些信息是通过一个数据结构sizes来表示的 % 在该函数中用户还应该提供初始状态 x0,采样时间 ts。ts 是一个 m2 的矩阵,其中第 k 行包含了对应与第 k 个采样时间的采样周期值和偏移量。另外,在该子函数中str 设置为空:,str是保留变量,暂时没有任何意义 function sys,x0,str,ts=mdlInitializeSizes sizes = simsizes; % 生成sizes数据结构 sizes.NumContStates = 0; % 连续状态

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 教学课件 > 高中课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号