Simulink S-Function 编程(C语言)与模块封装技术
1.S-Function概念
S-Function(System function)是Simulink模块的计算机语言描述。可以用M、C/C++、Ada、Fortran 语言以MEX(Matlab Executable,MATLAB可执行文件,在Windows系统中就是其为DLL)文件的形式编写。
S-Function以特殊的方式与Simulink方程求解器交互。这种交互和Simulink内建模块的做法非常相似。S-Function模块可以是连续、离散或者混合系统。
通过S-Function,用户可以将自己的模块加入Simulink模型中。从而可以实现用户自定义的算法或者与硬件设备交互等。
2.S-Function工作机制
2.1 Simulink模块的数学描述
Simulink模块包括一系列输入、状态和输出。输出是采样时间、输入、模块状态的函数。
下面的方程描述了输入、输出和状态的数学关系。
2.2 仿真过程
Simulink模型的执行按下述几个步骤。首先是初始化阶段。在这一阶段Simulink将库模块集合到模型,传播宽度、数据类型和采样时间,评估模块参数,确定模块执行顺序,分配内存。然后是仿真阶段。此时Simulink进入一个仿真循环,循环的每次执行对应一个仿真步。在每个仿真步,Simulink按初始化阶段确定的顺序执行各个模块。对每个模块,Simulink计算模块在当前采样时间的状态、微分和输出。这将持续到仿真结束。图1描述了Simulink的仿真过程。
图1 Simulink执行仿真的步骤
2.3 S-function的回调(Callback)方法
S-function包括一系列的回调方法,用以执行每个仿真步骤所需的任务。在一个模型的仿真过程中,每个仿真步骤,Simulink将调用各S-function的适当方法。S-function执行的方法包括:
●初始化:在首次仿真循环中执行。Simulink初始化S-function。在这一步骤中Simulink
将:
-初始化SimStruct,这是一种Simulink结构,包含了S-function的信息。
-设置输入输出端口的个数和数据宽度。
-设置模块的采样次数。
-分配存储区域和数组长度。
●计算下一采样点:如果定义了一个可变采样步长的模块,这一步将计算下一次采样
点,也就是计算下一步长。
●计算在主要时间步中的输出:这一步结束之后,模块的输出端口在当前时间步是有
效的。
●更新主要时间步中的离散状态:所有的模块在该回调方法中,必须执行一次每次时
间步都要执行的活动,比如为下一次仿真循环更新离散状态。
●积分:这用于具有连续状态的或者(和)具有非采样过零的模型。如果用户的
S-function具有连续状态,Simulink在最小采样步长调用S-function的输出和微分部分。
这也是Simulink之所以能计算S-function的状态。如果用户S-function(仅针对C MEX)具有非采样过零,Simulink在最小采样步长调用S-function的输出和微分部分,这样可以确定过零点。
2.4 S-Function中几个主要的子函数
mdlInitializeSizes:用于获取输入端口和输出端口的数量、端口宽度、以及S-function 所需的任何其它对象(诸如状态数量)等有关信息。
mdlInitializeSampleTimes:设置S-function 的采样时间。
mdlStart:该函数在模型开始时执行且仅执行一次,像电机上电这种操作,在整个仿真过程中只需上一次电,就可以放在这里。
mdlStart:在每个采样时间步长内,Simulink计算块的输出。
使用SimStruct 的一个宏:InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs ( S,0 );来获取输入信号。该宏返回一个向量的指针,必须使用*uPtrs[ i ] 来访问它。
使用了SimStruct 的一个宏:real_T *y = ssGetOutputPortRealSignal (S,0 );
来访问输出信号。该宏返回一个包含了输出向量的指针。
S-function 使用int_T width = ssGetOutputPortWidth ( S,0 ) 来获取通过块传递的信号宽度。最后,S-function 采用循环通过输入来计算输出。
mdlTerminate:执行仿真结束时的任务。
3.编写C语言的S函数
3.1 C MEX-file S-function简介
定义了S-function模块的C MEX-file必须在仿真过程中向Simulink提供模型信息。在仿真中Simulink、ODE求解器、MEX-file协作完成指定任务。
Simulink与C MEX-file S-function模块的交互是通过S-Function的回调方法。每个回调方法执行一个预定义的,实现仿真所需功能的任务。S-function可以执行任何其实现的任务。一系列C MEX-file S-function实现的回调方法。C MEX-file可以访问并修改Simulink内部用来存储S-function信息的数据结构。
C MEX-file S-function只需实现Simulink定义的回调方法的一个小子集即可。如果不实现某个回调方法,相应的功能将被省略掉。这有利于快速开发简单的模块。
通常C MEX-file S-function的形式如下:
#define S_FUNCTION_NAME your_sfunction_name_here
#define S_FUNCTION_LEVEL 2
#include "simstruc.h"
static void mdlInitializeSizes(SimStruct *S)
{
}
<additional S-function routines/code>
static void mdlTerminate(SimStruct *S)
{
}
#ifdef MA TLAB_MEX_FILE /* Is this file being compiled as a MEX-file? */
#include "simulink.c" /* MEX-file interface mechanism */
#else
#include "cg_sfun.h" /* Code generation registration function */
#endif
mdlInitializeSizes是Simulink与S-function交互时调用的第一个方法。随后Simulink将调用其他S-function方法(都以mdl开头)。仿真结束时,Simulink调用mdlTerminate。
注意:Simulink仿真时直接在适当的时间调用每个回调方法,利用C写的S-Function仿真步骤如图2所示:
printf输出格式matlab图2 利用C写的S-Function执行步骤
3.2 利用S-Function模板创建DLL
1.新建一个文件夹,比如F:\test。
2.打开MA TLAB,选择当前目录使其指向第一步中新建文件夹,打开simulink,选择User-Defined Functions/S-Function Examples/C-files S-Function//Basic C-MEX Template,根据所定义模块的功能,将该自动生成的文件重命名,并存入你指定的文件夹中。
2
1
图3
3
图4
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论