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
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
使用模板文件构建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 宏: 工作向量
ssGetNum
ssGet
ssGet
ssSet
使用状态方程式描述系统.
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,,
f使用ssSetSampleTime(S,,
f使用ssSetOffsetTime(S,,
在mdlOutputs中:
f编写输入输出方程式
f使用ssGetInputPortSignal(S,) 访问端口为i的输入信号
f使用ssGetOutputPortSignal(S,) 访问端口为i的输出信号