C语言编写S函数方法C语言编写S函数方法
S 函数(system function)是模块的核心,是完成功能实现的关键。S 函数的
编写可以使用多种程序语言,其中 M 语言是最常用的,同时也是最简单的。在
运用 M 语言进行 s 函数编写的时候,可以调用 MATLAB 提供的函数,简化了开
发过程。但是如果要与其他进程通讯或驱动外部硬件接口,则要调用 API 函数,
这样就需要用 C 语言来开发 S 函数。较 M 语言的开发,C 语言开发 S 函数更具有
灵活性,但是相对复杂一些。
C 语言写 S 函数,顾名思义,运用 C 语言语法,依照 S 函数格式要求,最后
在 MATLAB 中 MEX 命令编译,编译成功既得函数。
S 函数格式可简单看成:初始化、采样时间设定、系统输出、结束四个部分。
对应的函数分别为 mdlInitializeSizes()、mdlInitializeSampleTimes()、mdlOutputs()、
mdlTerminate()。这四个函数是一个 S 函数必不可少的,缺少任何一个在编译的
时候都无法通过,输出信息会提示哪个函数没有写。
一个最基本的 C 语言 S 函数模版如下:
#define S_FUNCTION_NAME name
#define S_FUNCTION_LEVEL 2
#include “simstruc.h”
Static void mdlInitializeSizes(SimStruct *S){}
Static void mdlInitializeSampleTimes(SimStruct *S){}
Static void mdlOutputs(SimStruct *S,int_T tid){}
Static void mdlTerminate(SimStruct *S){}
#ifdef MATLAB_MEX_FILE
#include “Simulink.c”
#else
#include “cg_sfun.h”
#endif
S 函数的运行依托于 Simulink,Simulink 的运行是采用循环方式,计算各采样
时间点的系统状态得到的,由此可理解 S 函数,在初始化之后,S 函数也通过循
环完成输出状态计算。
结合上述格式,首先自定义 S 函数名称,然后定义 S 函数级别,这里写 2,1
级是老版本 Simulink 使用的,现已经不是用,之所以保留 1 级是为了兼容原有的
老程序,现在写的 S 函数都是 2 级的。接下来将需要的头文件包含进来,这里必
须包含 simstruc.h 文件,这里的 SimStruc 是 Simulink 提供的数据结构,S 函数中
的输入输出等信息都包含在这个结构体中,同时,在编写 S 函数的时候也要把使
用到的 C 语言库中的头文件包含进来,所有的 C 语言库文件在这里都可以使用。
接下来即可按照格式顺序编写代码。最后要注意,如果用于仿真则添加 Simulink.c
文件,如果用于 RTW 代码生成,则添加 cg_sfun.h 头文件。这里的 RTW 代码生
成是指非内嵌的 S 函数,如果要做一个内嵌的 S 函数则需要在 S 函数中添加
mdlRTW()函数,并额外编写 TLC 文件。其中,TLC 文件用于优化的 C 代码生成,
mdlRTW()函数则把模块参数传递到生成的代码当中。具体 TLC 文件的编写方法这
里不再赘述。
除了上述必需的函数外,系统提供了其他可选用的函数,功能各异,例如
mdlStart()等。
只要理解了 Simulink 运行方式就可以理解文件的开发过程了,其中,系统函数和
特定的变量类型都可以在 SimS