文档库 最新最全的文档下载
当前位置:文档库 › SL03_03_CMEX_CH

SL03_03_CMEX_CH

Simulink?S-Functions

C MEX S-Functions

本章概述

C MEX S-functions概念

语法结构

C MEX S-functions 宏

在模型中集成C MEX S-functions

无状态C MEX S-functions

带参数的C MEX S-functions

连续状态C MEX S-functions

离散状态C MEX S-functions

集成外部源代码的C MEX S-functions

C MEX S-Functions

C MEX S-functions 使用C语言开发的S-functions

C MEX S-function响应求解器的一系列指令,并执行相应

任务,例如

f初始化系统尺寸,输入输出,状态个数以及采样时间

f更新系统输出

f更新系统离散状态

f求出系统连续状态导数

求解器通过调用相应子函数程序响应向C MEX S-function 发出指令

C MEX S-function源程序必须编译成MEX文件形式,作

为MATLAB可执行程序

C MEX S-Functions优势

加快仿真速度

集成外部C 代码

和操作系统接口

硬件驱动程序

隐藏设计算法

创建用户化模块

Simulink 数据结构

Simulink 数据结构(SimStruct) –S-function模型实例f存储S-function属性

f包含S-function入口

f模型–模型SimStruct(Root)

f S-function 模块–模块SimStruct(Child)

simstruc.h–包含数据结构和访问SimStruct的方法声明

头文件所在路径

f\simulink\include\

C MEX S-Functions 流程

积分阶段

终止仿真mdlTerminate 计算输出mdlOutputs

计算离散状态更新mdlUpdate

计算连续状态导数mdlDerivatives

计算输出mdlOutputs

设置初始状态

mdlInitializeConditions

设置采样时间

mdlInitializeSampleTimes

设置尺寸和特性

mdlInitializeSizes

C MEX S-Function 仿真子程序

C MEX S-function子程序:

f mdlInitializeSizes(必要) –声明系统尺寸(连续状态,离散状态,

输出,输入,参数以及采样时间个数)并确定系统特性

f mdlInitializeSampleTimes(必要) –设置系统采样时间

f mdlInitializeConditions/mdlStart–设置连续和/或离散状态初始条

f mdlOutputs(必要) –计算输出

f mdlUpdate–计算离散装状态更新

f mdlDerivatives–计算连续状态导数

f mdlTerminate(必要) –结束任务

C MEX S-Function 模板

Simulink 提供两个C MEX S-function 模板:

f sfuntmpl_basic.c

f sfuntmpl_doc.c

模板文件所处路径

f\simulink\src\

使用模板文件构建C MEX S-function

模板sfuntmpl_basic.c仅包含必要和经常会使用的函数

模板sfuntmpl_doc.c包含可用函数的所有帮助信息

C MEX S-function源文件一般由系统初始化和运行时函数

组成

使用C MEX S-Function 模板(续)

S-function 开头:

#define S_FUNCTION_NAME s_function_name

#define S_FUNCTION_LEVEL 2

#include "simstruc.h"

S-function 结尾:

#ifdef MATLAB_MEX_FILE

#include "simulink.c"

#else

#include "cg_sfun.h"

#endif

C MEX S-Function 宏:mdlInitializeSizes

ssSetNumInputPorts–声明输入端口个数

ssSetInputPortWidth–声明输入信号宽度

ssSetInputPortRequiredContiguous–声明输入信号是否连续

ssSetInputPortDirectFeedThrough–声明输出计算中是否包含输入信号

ssSetNumOutputPorts–声明输出端口个数

ssSetOutputPortWidth–声明输出信号宽度

使用C MEX S-Function 宏: 采样时间

ssSetSampleTime–设置采样时间周期 ssSetOffsetTime–设置采样时间延迟 ssIsSampleHit–确定是否为采样时间点

使用C MEX S-Function 宏: 仿真时间

ssGetT–返回当前仿真时间(仅用于S-function按照模型的基本采样速率更新的情况)

ssGetTaskTime–返回当前的仿真时间

ssGetTStart–返回仿真起始时间

ssGetTFinal–返回仿真停止时间

使用C MEX S-Function 宏: 输入和输出

ssGetInputPortWidth–返回输入信号宽度

ssGetInputPortSignal–返回连续输入信号存储地址 ssGetInputPortSignalPtrs–返回非连续信号存储地址 ssGetOutputPortWidth–返回输出信号宽度

ssGetOutputPortSignal–返回输出信号存储地址

使用C MEX S-Function 宏: 状态

ssGetNumContStates–返回连续状态个数 ssGetContStates–返回连续状态存储地址 ssGetdX–返回连续状态导数存储地址

ssGetNumDiscStates–返回离散状态个数 ssGetDiscStates–返回离散状态存储地址

使用C MEX S-Function 宏: 参数

ssGetNumSFcnParams–返回参数个数

ssGetSFcnParamsCount–返回可接收参数个数 ssSetSFcnParamTunable–声明参数是否可调 ssGetSFcnParam–返回一个参数存储地址

mxGetM–返回数据行个数

mxGetN–返回数据列个数

mxGetPr–返回数据实部数据存储地址

使用C MEX S-Function 宏: 工作向量

ssGetNumWork –返回double/integer/pointer工作向量个数

ssGetWork –返回double/integer/pointer工作向量元素存储地址

ssGetWorkValue–返回double/integer/pointer工作向量元素值

ssSetWorkValue–设置double/integer/pointer工作元素值

使用状态方程式描述系统.

f mdlOutputs.

f mdlUpdate.

f mdlDerivatives.处理C MEX S-Function 系统方程

)

),(),(()()),(),(()()

),(),(()1(t t u t x g t y t t u t x f t x

k k u k x f k x c c d d ===+&)1(+k x d )(t x

c &)(t y

编译S-function 源文件(*.c)为MATLAB 可执行程序语法:mex sfun_source.c.

在编译前必须运行mex –setup 配置编译器

使用User-Defined Functions library 中S-Function 模块,输入函数名称以及函数的参数值

集成C MEX S-Functions

无状态C MEX S-Functions

系统方程式

其中g 为系统输出, P m 和P a 为系统输入.

()()???

????≥?≤≤??≤≤?≤=a m a m a m a m a a m a a m a m a m P P P P P P P P P P P P P P P P P P g 2if 12if 22if 22if 122>> stateless_csfun

>> edit g_sfun.c

无状态C MEX S-Functions (续)

使用sfuntmpl_basic.c重新命名函数名

在mdlInitializeSizes中:

f使用ssSetNumInputPorts(S,)设置输入端口个数

f使用ssSetInputPortWidth(S,,)设置每个端口输入信号宽度

f设置每个端口directfeedthrough和inputportrequiredcontiguous属性f使用ssSetNumOutputPorts(S,) 设置输出端口个数

f使用ssSetOutputPortWidth(S,,)设置每个输出端口信号宽度 在mdlInitializeSampleTimes中:

f使用ssSetSampleTime(S,,)设置采样时间周期

f使用ssSetOffsetTime(S,,)设置采样偏移量

在mdlOutputs中:

f编写输入输出方程式

f使用ssGetInputPortSignal(S,) 访问端口为i的输入信号

f使用ssGetOutputPortSignal(S,) 访问端口为i的输出信号

相关文档