响应式网站与自适应,网站维护中 源码,wordpress 3.9 模板,会做网站开发 但是不会二次开发文章目录
前言
S-Fuction模块
电路方程模型
编写S函数
仿真验证
Tips
分析和应用
总结 前言 见《开箱报告#xff0c;Simulink Toolbox库模块使用指南#xff08;一#xff09;——powergui模块》 见《开箱报告#xff0c;Simulink Toolbox库模块使用指南#xff…文章目录
前言
S-Fuction模块
电路方程模型
编写S函数
仿真验证
Tips
分析和应用
总结 前言 见《开箱报告Simulink Toolbox库模块使用指南一——powergui模块》 见《开箱报告Simulink Toolbox库模块使用指南二——MATLAB Fuction模块》 见《开箱报告Simulink Toolbox库模块使用指南三——Simscape 电路仿真模块》
S-Fuction模块 S-Fuction模块是用户使用MATLAB、C、C语言等编写的Simulink模块是扩展Simulink模块库的一种机制。S-Fuction使用一种特殊的语法使用户能够与Simulink引擎进行交互非常接近自带库摸块与Simulink引擎之间发生的交互。 用户使用S-Fuction开发的Simulink模块可以是一种控制算法也可以是一种状态模型可以容纳连续系统、离散系统或者混合系统。如果要将S-Fuction用于代码生成用户还可以通过编写目标语言编译器TLC文件来自定义为S-Fuction生成的代码。其在Simulink Toolbox库中的位置如下图所示。 Mathworks官方Help对该模块的说明如下所示。 本文以电路建模仿真为例介绍如何利用S-Fuction搭建电路模型。
电路方程模型 这里沿用前一篇文章中的12V蓄电池给两个负载供电的电路见 《开箱报告Simulink Toolbox库模块使用指南三——Simscape 电路仿真模块》 根据欧姆定律写出该电路系统的状态方程如下 状态方程(1) t 0 12V I*(2Ω1Ω*5Ω/(1Ω5Ω)) U I*1Ω*5Ω/(1Ω5Ω) 求解得 I(A) 72/17 4.235 U(A) 60/17 3.529 状态方程(2) t pi/2 12V I*(2Ω1Ω*6Ω/(1Ω6Ω)) U I*1Ω*6Ω/(1Ω6Ω) 求解得 I(A) 21/5 4.2 U(A) 18/5 3.6 动态方程 根据前面两个稳态方程的解可以列出如下动态方程 t(S) (0 : 1000)*0.001 I(A) 72/17 |4.235-4.2|*sin(2pi * 50t pi) U(A) 60/17 |3.529-3.6|*sin(2pi * 50t) 在Matlab的命令窗口中运行该动态方程得到的电流和电压曲线与前一篇文章一致如下所示 至此可以证明该电路系统的方程模型是正确的。
编写S函数 根据官方的S-Fuction模板写出的S函数完整代码如下
function [sys,x0,str,ts,simStateCompliance] CircuitPlant(t,x,u,flag)switch flag,case 0,[sys,x0,str,ts,simStateCompliance]mdlInitializeSizes;case 1,sysmdlDerivatives(t,x,u);case 2,sysmdlUpdate(t,x,u);case 3,sysmdlOutputs(t,x,u);case 4,sysmdlGetTimeOfNextVarHit(t,x,u);case 9,sysmdlTerminate(t,x,u);otherwiseDAStudio.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,simStateCompliance]mdlInitializeSizessizes simsizes;
sizes.NumContStates 0;
sizes.NumDiscStates 3; %Number of discrete states.
sizes.NumOutputs 3; %Number of outputs.
sizes.NumInputs 0; %Number of inputs.
sizes.DirFeedthrough 0;
sizes.NumSampleTimes 1; % at least one sample time is needed
sys simsizes(sizes);x0 [0;72/17;60/17]; Initial state conditions
str [];
ts [0.001 0]; %Discrete sample time where, [PERIOD OFFSET],PERIOD 0 OFFSET PERIOD.
simStateCompliance UnknownSimState;function sysmdlDerivatives(t,x,u)sys [];%
%
% mdlUpdate
% Handle discrete state updates, sample time hits, and major time step
% requirements.
%
%
function sysmdlUpdate(t,x,u)I 72/17 abs(4.235-4.2)*sin(2*pi * 50*t pi);
U 60/17 abs(3.529-3.6)*sin(2*pi * 50*t);
sys [t,I,U];%
%
% mdlOutputs
% Return the block outputs.
%
%
function sysmdlOutputs(t,x,u)% sys [x(1);x(2);x(2)];
sys x;function sysmdlGetTimeOfNextVarHit(t,x,u)sampleTime 1;
sys t sampleTime;function sysmdlTerminate(t,x,u)sys [];仿真验证 将上述编写好的S-Fuction模块放入Simulink模型中进行验证如下所示 运行上述模型得到的电流和电压曲线也与前一篇文章一致如下所示 至此可以证明该S-Fuction模块可以较好地模拟前一篇文章中使用物理模块搭建的电路模型。
Tips S-Fuction模块的完整运行机制如下图所示。本文所举的例子是用的离散模型所以只涉及其中的主仿真步。这里需要注意的是模型初始化函数只在模型仿真开始时执行一次后面的计算输出和更新离散状态是每个仿真步都要执行一次的比如本文是0.001s执行一次。每次执行的顺序是先执行计算输出函数后执行离散状态更新函数所以当看到输出结果比输入信号延迟一个周期就是这个机制的原因。 分析和应用 S-Fuction模块在Simulink模型仿真和自动生成代码方面的应用功能非常强大主要得益于MATLAB为开发人员留出了一个扩展Simulink模块库的机制开发人员能基于该模块开发自己的模块库。项目中使用S-Fuction模块后将会给开发人员更大的发挥空间去开发特殊的模块库能够真正与自己的需求高度匹配。一方面弥补特定需求模块的空白另一方面也能对一些模块进行充分地裁剪。另外S-Fuction模块还能将一些已开发的功能固化下来便于后期的移植复用这样能使很多项目开发的代码量大大减少同时也意味着软件开发全流程的人力和时间投入大幅缩减。主要适用于有架构支撑、模块化开发的大型软件项目可以合理协调团队成员的分工合作提高代码可控性增加代码的复用率减少代码移植障碍。
总结 以上就是本人在使用S-Fuction模块时一些个人理解和分析的总结首先介绍了该模块的背景知识然后展示它的使用方法最后分析了该模块的特点和适用场景。 后续还会分享另外几个最近总结的Simulink Toolbox库模块欢迎评论区留言、点赞、收藏和关注这些鼓励和支持都将成文本人持续分享的动力。 另外上述例程使用的Demo工程可以到笔者的主页查找和下载。 版权声明原创文章转载和引用请注明出处和链接侵权必究