matlab/simulink中自定义m-s函数作为simulink模块使用实例
2018-03-09 22:00
1736 查看
一般而言matlab/simulink能满足多数使用要求,但是往往在研究中会使用User-difinition s-function或者调用c,c++的库函数,这时候就需要matlab能进行c,c++以及fortran语言的编译。
本文是我第一次参考资料,利用m语言编写s函数的实例。User-Definition的s-fun可以作为一个simulink模块使用,这样在工程和科研中就可以自己开发需要的模块,并入simulink仿真之中,不必受制于simulink自带的有限模块。使用m语言写s-fun不需要mingw编译器。
题目:编写User-Definition的s-fun,使得正弦函数的波形加倍20倍,然后输出到scope。
实现步骤:
1. 新建simulink模型,拖入User-Definition的s-fun,然后双击s-fun,点击edit,进入编辑模块;
2. 编写m-sfun代码,并另存为time20.m,可以参照m-sfun的格式,具体代码如下:function [sys,x0,str,ts]=timestwo(t,x,u,flag)
% t是采样时间
% x是状态变量
% u是该simulink模块的输入
% flag是仿真过程的状态标志,用来判断当前状态是初始化、执行、输出等
% sys是flag的函数,不同的标志执行不同的sys
% x0是状态变量的初始值
% str是保留参数,一般在初始化置空
% ts是一个1*2的向量,其中ts(1)是采样周期,ts(2)是偏移量
% 本s-fun主要就是调用initialize和output函数
switch flag,
%Initialization,flag=0时,具体初始化函数参照35行
case 0
[sys,x0,str,ts] = mdlInitializeSizes;
%Calculate outputs
case 3
sys = mdlOutputs(t,x,u);
%Unused flags
case {1,4,2,9}
sys = []; % do nothing
otherwise
error('Simulink:blocks:unhandledFlag', num2str(flag));
end
%
%=============================================================================
% mdlInitializeSizes
% Return the sizes, initial conditions, and sample times for the S-function.
%=============================================================================
%初始化函数是必不可少的,其中的结构体形式是固定不变的
function [sys,x0,str,ts] = mdlInitializeSizes
sizes = simsizes;
%用于设置模块参数的结构体用simsizes生成
sizes.NumContStates = 0;
%模块连续状态变量的个数
sizes.NumDiscStates = 0;
%模块离散状态变量的个数
sizes.NumOutputs = 1;
%模块输出变量的个数
sizes.NumInputs = 1;
%模块输入变量的个数
sizes.DirFeedthrough = 1;
%模块是否存在直通反馈,存在为1。直通的意思是输入能直接控制输出
sizes.NumSampleTimes = 1;
%模块的采样时间个数,至少是一个
sys = simsizes(sizes); %设置完后赋给sys输出
str = []; % str是保留参数,一般在初始化置空
x0 = []; % x0是状态变量的初始值,显然初始值置空
ts = [-1 0]; % sample time: [period, offset]
%start mdlOutputs
%当运行到mdlOutputs,就会输出20*u。
function sys = mdlOutputs(t,x,u)
sys=20*u;
% end mdlOutputs
3. 代码完成之后,将matlab工作目录更改为time20.m所在的文件夹,然后双击simulink模块,将time20填入s-function name,由于本例不需要输入参数,故其他不需要填写。
4. 运行。
本文是我第一次参考资料,利用m语言编写s函数的实例。User-Definition的s-fun可以作为一个simulink模块使用,这样在工程和科研中就可以自己开发需要的模块,并入simulink仿真之中,不必受制于simulink自带的有限模块。使用m语言写s-fun不需要mingw编译器。
题目:编写User-Definition的s-fun,使得正弦函数的波形加倍20倍,然后输出到scope。
实现步骤:
1. 新建simulink模型,拖入User-Definition的s-fun,然后双击s-fun,点击edit,进入编辑模块;
2. 编写m-sfun代码,并另存为time20.m,可以参照m-sfun的格式,具体代码如下:function [sys,x0,str,ts]=timestwo(t,x,u,flag)
% t是采样时间
% x是状态变量
% u是该simulink模块的输入
% flag是仿真过程的状态标志,用来判断当前状态是初始化、执行、输出等
% sys是flag的函数,不同的标志执行不同的sys
% x0是状态变量的初始值
% str是保留参数,一般在初始化置空
% ts是一个1*2的向量,其中ts(1)是采样周期,ts(2)是偏移量
% 本s-fun主要就是调用initialize和output函数
switch flag,
%Initialization,flag=0时,具体初始化函数参照35行
case 0
[sys,x0,str,ts] = mdlInitializeSizes;
%Calculate outputs
case 3
sys = mdlOutputs(t,x,u);
%Unused flags
case {1,4,2,9}
sys = []; % do nothing
otherwise
error('Simulink:blocks:unhandledFlag', num2str(flag));
end
%
%=============================================================================
% mdlInitializeSizes
% Return the sizes, initial conditions, and sample times for the S-function.
%=============================================================================
%初始化函数是必不可少的,其中的结构体形式是固定不变的
function [sys,x0,str,ts] = mdlInitializeSizes
sizes = simsizes;
%用于设置模块参数的结构体用simsizes生成
sizes.NumContStates = 0;
%模块连续状态变量的个数
sizes.NumDiscStates = 0;
%模块离散状态变量的个数
sizes.NumOutputs = 1;
%模块输出变量的个数
sizes.NumInputs = 1;
%模块输入变量的个数
sizes.DirFeedthrough = 1;
%模块是否存在直通反馈,存在为1。直通的意思是输入能直接控制输出
sizes.NumSampleTimes = 1;
%模块的采样时间个数,至少是一个
sys = simsizes(sizes); %设置完后赋给sys输出
str = []; % str是保留参数,一般在初始化置空
x0 = []; % x0是状态变量的初始值,显然初始值置空
ts = [-1 0]; % sample time: [period, offset]
%start mdlOutputs
%当运行到mdlOutputs,就会输出20*u。
function sys = mdlOutputs(t,x,u)
sys=20*u;
% end mdlOutputs
3. 代码完成之后,将matlab工作目录更改为time20.m所在的文件夹,然后双击simulink模块,将time20填入s-function name,由于本例不需要输入参数,故其他不需要填写。
4. 运行。
相关文章推荐
- matlab/simulink中自定义c-s函数作为simulink模块使用实例
- Matlab中如何将(自定义)函数作为参数传递给另一个函数
- 数据拟合---使用自定义函数进行非线性拟合 -在Origin。matlab拟合工具箱cftool
- Matlab中如何将(自定义)函数作为参数传递给另一个函数
- 数据拟合---使用自定义函数进行非线性拟合 -在Origin。matlab拟合工具箱cftool
- ansible作为python模块库使用的方法实例
- MySQL中文汉字转拼音的自定义函数和使用实例(首字的首字母)
- svm理论与实验之22: 自定义核函数在Matlab平台上的使用
- 推荐:一个Flask常用函数/模块使用实例网址
- matlab调用自定义函数出现“尝试将 SCRIPT filter_low 作为函数执行:”的错误
- 使用decorator在本模块中向系统函数插入自定义代码
- mysql中文汉字转拼音的自定义函数和使用实例(首字的首字母)
- matlab中关于函数文件和脚本文件使用实例
- 关于matlab使用函数作为参数的方法
- Python过滤函数filter()使用自定义函数过滤序列实例
- MySQL中文汉字转拼音的自定义函数和使用实例(首字的首字母)
- svm理论与实验之22: 自定义核函数在Matlab平台上的使用
- Matlab时频分析工具箱小波尺度图函数的使用说明与实例
- 数据拟合---使用自定义函数进行非线性拟合 -在Origin。matlab拟合工具箱cftool
- Matlab中如何将(自定义)函数作为参数传递给另一个函数