MATLAB——S-function模板

function [sys,x0,str,ts,simStateCompliance] = Sfunction-name(t,x,u,flag)
%保存的函数文件名
switch flag
%初始化函数
case 0
[sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;
%求导数
case 1
sys=mdlDerivatives(t,x,u);
%状态更新
case 2
sys=mdlUpdate(t,x,u);
%计算输出
case 3
sys=mdlOutputs(t,x,u);
%计算下一个采样时间
case 4
sys=mdlGetTimeOfNextVarHit(t,x,u);
%终止仿真程序
case 9
sys=mdlTerminate(t,x,u);
%错误处理
otherwise
DAStudio.error(‘Simulink:blocks:unhandledFlag’, num2str(flag));
end
% mdlInitializeSizes 模型初始化函数,返回;
% sys 是系统参数
% x0 系统初始状态,若没有,则x0=[];
% str 系统阶字串,常取 str=[];
% ts 取样时间矩阵,对于连续取样时间 ts=[0,0]
% 若使用内部取样时间,ts=[-1,0],-1表示继承输入信号的采样周期
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes%模型初始化函数
sizes = simsizes; %取系统默认设置
sizes.NumContStates = 0; %设置连续状态变量的个数
sizes.NumDiscStates = 0; %设置离散状态
sizes.NumOutputs = 0; %系统输出
sizes.NumInputs = 0; %系统输入
sizes.DirFeedthrough = 0; %系统是否直通,注:输入信号是否在输出段出现的标识。取 0 或 1
sizes.NumSampleTimes = 1; %采样周期个数,必须大于1或等于1;
sys = simsizes(sizes); %设置系统参数
x0 = []; %系统状态初始化
str = []; %系统阶字串总为空阶
ts = [0 0]; %初始化采用时间矩阵
simStateCompliance = ‘UnknownSimState’;
% mdlDerivatives 模型计算导数——连续部分的计算,返回连续状态的导数
function sys=mdlDerivatives(t,x,u)

sys = []; %根据状态方程(微分部分) 修改此处
% mdlUpdate 计算离散状态方程
function sys=mdlUpdate(t,x,u)
sys = []; %根据状态方程(差分方程部分)修改此处
% mdlOutputs 计算输出信号,返回模块输出
function sys=mdlOutputs(t,x,u)
sys = []; %根据输出方程修改此处
% mdlGetTimeOfNextVarHit 计算一步的仿真时刻,该函数仅当
% mdlInitializeSizes函数中的采样时间向量定义了一个可变离散采样时间 ts = [-2,0]时才被使用
function sys=mdlGetTimeOfNextVarHit(t,x,u)
sampleTime = 1; % Example, set the next hit to be one second later.
sys = t + sampleTime;
% mdlTerminate 终止仿真设定,完成仿真终止时的任务
function sys=mdlTerminate(t,x,u)
sys = [];
%程序end

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
函数模板是一种通用的函数定义,它可以适用于多种不同的数据类型。S函数模板是一种特殊的函数模板,它用于在Simulink中定义连续时间系统的输出函数。 S函数模板定义了三个必需的函数:一个初始化函数、一个输出函数和一个终止函数。初始化函数在模型运行之前执行,用于初始化S函数的内部变量。输出函数在每个模拟步骤中执行,用于计算连续时间系统的输出值。终止函数在模型停止运行时执行,用于清理S函数的内部变量。 下面是一个简单的S函数模板示例: ```c++ #include "simstruc.h" #define N 10 static double buffer[N]; static void mdlInitializeSizes(SimStruct *S) { ssSetNumInputs(S, 0); ssSetNumOutputs(S, 1); ssSetOutputPortWidth(S, 0, N); } static void mdlInitializeSampleTimes(SimStruct *S) { ssSetSampleTime(S, 0, 0.1); ssSetOffsetTime(S, 0, 0.0); } static void mdlStart(SimStruct *S) { int i; for (i = 0; i < N; i++) { buffer[i] = 0.0; } } static void mdlOutputs(SimStruct *S, int_T tid) { real_T *y = ssGetOutputPortRealSignal(S,0); int i; for (i = 0; i < N; i++) { y[i] = buffer[i]; } } static void mdlTerminate(SimStruct *S) { /* Nothing to do here */ } ``` 这个S函数模板定义了一个长度为10的缓冲区,用于存储连续时间系统的输出值。在初始化函数中,缓冲区被初始化为零。在输出函数中,缓冲区的值被复制到输出端口。在终止函数中,不需要进行任何操作。 注意,这只是一个简单的示例,实际上,S函数模板可以非常复杂,可以进行各种计算和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值