通过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 四个
回调函数。
图 1 Model Initialization
图 2 Simulation Loop
3. 使用方法
用 C 代码完成 S-Function 模块共有三种途径:一,通过模板,手工填写回调函数源文
件,再编译生成可执行文件;二,通过S-Function Buider 模块,在图形界面上配置参数后点
Build 生成C 源代码文件和动态可执行文件;三,通过Legacy Code Tool,用命令行配置参
数和生成文件。这三种方法各有优缺点:手写方式需要对S-Function 非常熟悉,比较麻烦,
但是实现最全面,限制最少;图形界面简化了对S-Function 的实现,但限制更多;命令行方
式实现最方便,但限制最多。用图形界面和命令行实现简单的S-Function 模块比较方便。
3.1. 手工填写方式
首先介绍最全面的手工方式,这样可以对S-Function 有进一步的认识。下面给出一个例
子,将该段内容保存为timestwo.c 文件。
#define S_FUNCTION_NAME timestwo
#define S_FUNCTION_LEVEL 2
#include "simstruc.h"