matlab error函数_Matlab之S-Function实例解析

    S-Function是系统函数(System Function)的简称,可以十分方便地用来描述各种动态系统,尤其是复杂的动态系统,属于Simulink动态系统的核心。我们常用的Simulink工具箱都是通过S-Function实现的,如果想开发一个新的模块或工具箱,S-Function可能是最好的选择。

    今天,将分两部分内容来介绍S-Function。

    1)S-Function简介:简要介绍S-Function的关键信息,理解S-Function的工作过程。

    2)电机模型的S-Function实现:以直流电机这一物理对象作为代表,通过S-Function实现电机的动态过程设计。

    之前写过一篇文章《Simulink中4种电机建模方式》,有朋友留言比较完美但缺少S-Function,今天借着这个机会一并补上。

    1、S-Function简介

    学习S-Function的最佳方式是先熟悉Matlab自带的模板sfuntmpl.m,一般在以下路径:C:Program FilesMATLABoolboxsimulinkblocks。

    一共40多行代码,主要包括1个主函数和6个子函数,模板代码如下:

    function [sys,x0,str,ts,simStateCompliance] = sfuntmpl(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));endfunction [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizessizes = simsizes;sizes.NumContStates  = 0;sizes.NumDiscStates  = 0;sizes.NumOutputs     = 0;sizes.NumInputs      = 0;sizes.DirFeedthrough = 1;sizes.NumSampleTimes = 1;  sys = simsizes(sizes);x0  = [];str = [];ts  = [0 0];simStateCompliance = 'UnknownSimState';function sys=mdlDerivatives(t,x,u)sys = [];function sys= mdlUpdate (t,x,u)sys = [];function sys=mdlOutputs(t,x,u)sys = [];function sys=mdlGetTimeOfNextVarHit(t,x,u)sampleTime = 1;  sys = t + sampleTime;function sys=mdlTerminate(t,x,u)sys = [];

    主函数:通过flag来选择执行对应的子函数。

    mdlInitializeSizes:定义系统的初始条件、采样时间等。

    mdlDerivatives:计算连续状态的微分,即dx/dt。

    mdlUpdate:计算离散状态x(K+1)。

    mdlOutputs:计算输出y。

    mdlGetTimeOfNextVarHit:计算离散状态的下一次采样时间。

    mdlTerminate:结束函数。

    需要注意的是,对于特定的系统可能仅需要调度部分子函数即可完成系统的设计。例如,对于仅存在连续状态的系统,只需要调度mdlInitializeSizes、mdlDerivatives、mdlOutputs、mdlTerminate等4个子函数。这些都是S-Function通过flag去自动实现的。

    2、电机模型的S-Function实现

    在介绍以前,先回顾一下前面介绍的状态空间搭建电机模型的方法。

    选取电流I、转速w作为状态变量,转速w作为输出,直流电机的状态方程和输出方程可表达为:

    c1aee40a4336f4abaf5e3dea203990a0.png
    84ea41fb05930d675dbe7eba00047e85.png

    式中红色部分分别对应系统矩阵A、b、C。使用State-Space模块,完成以上的状态方程搭建,模型如下图。

    449815d7a5862d5527522e1b25abd56f.png

    使用S-Function搭建电机模型时,会借用到上面的参数A、b、C。具体搭建步骤如下:

    1)把模板sfuntmpl.m改为motor.m,并新建一个空的mdl文件,也可以命名为motor.mdl。

    c80e4adfee66a967e2c5dc046ca31787.png

    两个文件放在一起并置于当前目录下,不然m文件后面无法被mdl文件引用。

    2)在工具箱中找到S-Function模块,并拖入模型中。

    1f95a9c44a8a6bcdb3c18afb77ece516.png

    双击打开,将S-Function name设置为motor,S-Function parameter设置为A、b、C。

    4488d34abec1473c032dc53869c756f1.png

    3)点击Edit,即可打开motor.m文件,进行电机模型设计,修改部分代码,如下面注释。

    function [sys,x0,str,ts,simStateCompliance] = sfuntmpl(t,x,u,flag,A,b,C)  %%增加参变量switch flag,  case 0,    [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;  case 1,    sys=mdlDerivatives(t,x,u,A,b); %%增加参变量  case 2,    sys=mdlUpdate(t,x,u);  case 3,    sys=mdlOutputs(t,x,u,C); %%增加参变量  case 4,    sys=mdlGetTimeOfNextVarHit(t,x,u);  case 9,    sys=mdlTerminate(t,x,u);  otherwise    DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));endfunction [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizessizes = simsizes;sizes.NumContStates  = 2; %%2个状态变量sizes.NumDiscStates  = 0;sizes.NumOutputs     = 1; %%单输入sizes.NumInputs      = 1; %%单输出sizes.DirFeedthrough = 1;sizes.NumSampleTimes = 1; sys = simsizes(sizes);x0  = [0 0]; %%初始状态为0str = [];ts  = [0 0];simStateCompliance = 'UnknownSimState';function sys=mdlDerivatives(t,x,u,A,b) %%增加参变量sys = A*x + b*u; %%计算状态变量的导数function sys=mdlUpdate(t,x,u)sys = [];function sys=mdlOutputs(t,x,u,C) %%增加参变量sys = C*x; %%计算输出function sys=mdlGetTimeOfNextVarHit(t,x,u)sampleTime = 1;  sys = t + sampleTime;function sys=mdlTerminate(t,x,u)sys = [];

    4)在mdl模型中添加对应的输入,并与状态空间的建模方式对比,如下图。

    58f313728565c6c69d0a4ce87482b0a4.png

    仿真结果如下图所示,可以看出,两种方法的电机转速曲线完全一致,S-Function的电机建模正确。

    34e25cd9812036618c44fe37e2d8054d.png

    以上,以电机模型为例,介绍了利用S-Function的方式来描述系统动态过程的方法。

    登录后您可以享受以下权益:

    ×
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值

    举报

    选择你想要举报的内容(必选)
    • 内容涉黄
    • 政治相关
    • 内容抄袭
    • 涉嫌广告
    • 内容侵权
    • 侮辱谩骂
    • 样式问题
    • 其他
    点击体验
    DeepSeekR1满血版
    程序员都在用的中文IT技术交流社区

    程序员都在用的中文IT技术交流社区

    专业的中文 IT 技术社区,与千万技术人共成长

    专业的中文 IT 技术社区,与千万技术人共成长

    关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

    关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

    客服 返回顶部