通过 S-Function 集成 C 代码进行仿真
by:吴少风
1. 概述
S-Function 是 Simulink 提供的一个模块。利用 S-Function 可以整合用户代码,在 Simulink
下进行仿真以及生成代码。用户代码可以用 MATLAB、C/C++、Fortran 编写,但嵌入式软
件几乎都用 C 语言编写,因此本文仅介绍用 C 语言实现 S-Function 模块。
Simulink 为 S-Function 模块实现了主干骨架和分配数据结构,通过回调方式(Callback
Method)留下用户编程接口(API)。S-Function 的使用,就是按自己的需要填写指定的回调
函数。然后通过 mex 命令编译成动态链接文件,在 S-Function 模块中填入名称和参数,就
可进行仿真了。
用户可以用 S-Function 实现如下应用:
创建一个全新的通用模块;
添加硬件设备的驱动模块;
集成已有 C 代码进行仿真;
实现用数学公式描述的系统;
使用图形动画(MATLAB 提供一个单摆示例 penddemo)。
2. S-Function 模块的实现机理
S-Function 模块作为一个对象,具有自己的属性和动作,也就是定义了自己的数据和实
现了自己的处理流程,但是具体细节由用户按需要指定。S-Function 就像出租车,用户就像
乘客,乘客告诉出租车需要去哪里,出租车就会载你到目的地。
2.1. 数据结构
每个 S-Function 模块都有一个自己的 SimStruct 数据结构,该数据结构存储输入输出端
口、状态变量、参数等,通过传入该结构指针参数,供回调函数使用。头文件 simstruc.h 中
定义了 SimStruct 数据结构,以及访问该结构的宏函数。
2.2. 处理流程
处理流程如图 1、图 2 所示。图中显示了所有回调函数的调用顺序,以及函数名称。
必须实现有:mdlInitializeSizes、mdlInitializeSampleTimes、mdlOutputs、mdlTerminate 四个
回调函数。