• 学前教育
  • 小学学习
  • 初中学习
  • 高中学习
  • 语文学习
  • 数学学习
  • 英语学习
  • 作文范文
  • 文科资料
  • 理科资料
  • 文档大全
  • 当前位置: 雅意学习网 > 小学学习 > 正文

    [MATLAB中基于S-FUNCTION的SIMULINK自定义模块实现] lm2596S模块

    时间:2020-07-14 07:19:25 来源:雅意学习网 本文已影响 雅意学习网手机站

      收稿日期:2006-09-22�   作者简介:刘佑祥(1946-),男,湖北武汉人,武汉科技大学中南分校信息工程学院副教授。�   (武汉科技大学中南分校 信息工程学院,湖北 武汉 430223 )�
      摘 要: 本文分析了在MATLAB中实现SIMULINK自定义函数的重要意义,系统地阐述了通过S-FUNCTION实现SIMULINK自定义模块的两种途径,以及基于这两种途径的详细实现方案,并针对实际应用给出了详细设计实例。 �
       关键词:MATLAB;SIMULINK;自定义模块;S-FUNCTION ��
      
      1 MATLAB及SIMULINK简介 �
      
      1.1 功能强大的科学计算软件MATLAB �
      MATLAB是Matrix Laboratory的缩写,顾名思义,其基本数据单位是矩阵。所以,它的指令表达式与数学、工程中常用的形式十分相似,用来求解计算问题要比用C,FORTRAN等语言完成相同的事情简捷得多,因此早期主要用于现代控制中复杂的矩阵、向量的各种运算。由于 MATLAB提供了强大的矩阵处理和绘图功能,很多专家因此在自己擅长的领域里用它编写了许多专门的MATLAB工具包,如控制系统工具包、系统辨识工具包、信号处理工具包、鲁棒控制工具包、最优化工具包等等几十种工具包。由于MATLAB功能的不断扩展,现在的MATLAB软件除具备卓越的数值计算能力外,还提供了专业水平的符号计算,文字处理,可视化建模仿真和实时控制等功能。所以今天的MATLAB已不仅仅局限与现代控制系统分析和综合应用,它已是一种包罗众多学科的功能强大的“技术计算语言”。 �
      
      1.2 使用MATLAB进行程序设计的突出优点 �
      和传统的科学计算软件语言相比,MATLAB语言具有以下的突出优点: �
      语言简洁紧凑,使用方便灵活,库函数极其丰富。MATLAB程序书写形式自由,能够利用丰富的库函数避开繁杂的子程序编程,压缩了一切不必要的编程工作。由于库函数都由本领域的专家编写,用户不必担心函数的可靠性。 �
      运算符丰富。由于MATLAB是用C语言编写的,MATLAB提供了和C语言几乎一样多的运算符,灵活使用MATLAB的运算符将使程序变得极为简短。 �
      流程控制功能强大。MATLAB既具有结构化的控制语句(如for循环,while循环,break语句和if语句),又有面向对象编程的特性。 �
      程序限制不严格,程序设计自由度大。例如,在MATLAB里,用户无需对矩阵预先定义就可使用。 �
      程序的可移植性很好。写好的MATLAB代码基本上不做修改就可以在各种型号的计算机和操作系统上运行。 �
      图形功能强大。在FORTRAN和C语言里,绘图都很不容易,但在MATLAB里,数据的可视化非常简单。MATLAB还具有较强的编辑图形界面的能力。 �
      源程序的开放性。开放性也许是MATLAB最受人们欢迎的特点。除内部函数以外,所有MATLAB的核心文件和工具箱文件都是可读可改的源文件,用户可通过对源文件的修改以及加入自己的文件构成新的工具箱。 �
      
      1.3 建模与仿真集成环境SIMULINK �
      SIMULINK是MATLAB最重要的组件之一,它为用户提供了一个动态系统建模、仿真和综合分析的集成环境。 在该环境中,无需大量书写程序,而只需要通过简单直观的鼠标操作,就可构造出复杂的系统。SIMULINK具有适应面广、结构和流程清晰及仿真精细、贴近实际、效率高、灵活等优点,因此 SIMULINK已被广泛应用于控制理论和数字信号处理的复杂仿真和设计。同时有大量的第三方软件和硬件可应用于或被要求应用于SIMULINK。 �
      
      2 自定义模块设计在SIMULINK�建模中的重要意义
      
      前文中已经详细介绍了MATLAB/SIMULINK具有的强大功能和广泛应用,在本节我们将讨论使用SIMULINK建模时自定义模块设计的重要性。事实上任何功能强大的软件包或者软件开发工具,在设计的时候都不可能面面俱到,考虑到所有实际应用中的需求。即使软件设计的时候已经考虑到并实现了所有已知的应用要求,随着时间的推移,在应用中也可能产生新的要求。因此,当现有的SIMULINK模块无法满足用户的仿真建模要求时,自定义模块设计就显得尤其重要。自定义模块设计的实现意味着用户可以根据其实际要求创建最适用的仿真用模块,从而大大提高建模的效率与仿真的准确性。 �
      其次,在实现一些特殊功能模块时,即使在SIMULINK本身自带模块可以满足设计要求的情况下,使用自定义模块设计也会更加高效。SIMULINK的自带模块一般具有很高的通用性和基本性,用户可以用组合的方式将多个基本模块搭建成所需的复杂模块,然而这种搭建方式可能是繁琐甚至困难的,使用自定义模块设计则会相当简捷方便。 �
      最后,使用自定义模块设计对系统修改的灵活性大有裨益。在系统建模仿真的过程中,不可避免的要对搭建的模型进行修改;如果某些常常需要改动的模块是用普通SIMULINK自带模块搭建而成的,那么每次修改模型时都需要重新搭建这些模块,这是很费时费力的一件事情。如果使用自定义模块来实现这些需要更改的部分,那么改动模型可能仅仅只需要重新写几行代码。 �
      下面我们通过一个实际例子来说明自定义模块设计的作用。比如,一个用状态方程表示的线性系统,在SIMULINK中可以简单的用一个状态空间模块来实现,如图1所示。 �
      
      图1 状态空间模块
      
      但是,如果我们需要建模的系统的状态方程具有非线性项时,如,这时SIMULINK自带的状态空间模块就不能满足要求了。所以我们就需要设计一个自定义模块,既能实现基本的状态空间模块的功能,又能具有我们要求的非线性特点。 �
      
      3 使用S-FUNCTION实现自定义系统模块 �
      
      鉴于自定义模块设计的重要性,MATLAB为用户提供了S-FUNCTION来实现自定义的功能。 S-FUNCTION即System Function的缩写,是一种自定义模块编写的规范以及相关工具。按照这种规范编写的代码能够被MATLAB识别并编译生成自定义模块文件。一旦编译完成,这个自定义模块文件和SIMULINK自带的模块在功能上完全相同,可以随意的复制,拷贝,移动和连接,并且在运行时不需要再次编译。 �
      从实现方式来说,在MATLAB中使用S-FUNCTION生成自定义模块有以下两种方式:使用S-FUNCTION Builder生成或者直接编写.m文件生成。前者胜在方便易学,需要用户输入的代码量少;而后一种方式则比较灵活,生成的代码执行效率较高。下面笔者将对两种方式分别介绍。 �
      
      3.1 使用S-FUNCTION Builder 生成自定义模块 �
      MATLAB在SIMULINK工具箱的“User-Defined Functions”库中提供了S-FUNCTION Builder模块。S-FUNCTION Builder实际上可以看作一个代码生成器,用户只需在模块中设置生成自定义模块所需的参数和代码,点击S-FUNCTION Builder中的Build按钮就可以编译生成自定义模块的代码。 �
      
      图2 S-FUNCTION Builder模块
      
      图3 S-FUNCTION Builder主设置页
      
      双击S-FUNCTION Builder图标,可以打开主设置页,如图3所示。 �
      以下是如何对S-FUNCTION Builder进行详细设置的解释: �
      在S-function name文本框中可以输入用户对自定义模块的命名。 �
      在Initialization属性页中,可以定义系统连续或者离散的状态数量和初状态,取样方式和取样间隔。 �
      在Data Property属性页中,可以定义系统的输入输出变量以及一些中间参数。这些数据可以是一维或者二维的实数或者复数。 �
      在Libraries属性页中,可以将在本模块里用到的函数库加入库列表,缺省为引用math.h库。 �
      编写状态迭代部分的代码时,如果该模块是一个连续系统,则应该使用Continuous Derivatives属性页输入描述状态迭代部分的代码。S-FUNCTION Builder中定义连续系统的状态为xC[0],xC[1],xC[2]……,相应的状态的导数为dx[0],dx[1],dx[2]等。如果该模块为离散系统,编写步骤和连续系统类似,不同的是需要使用Discrete Update选项页,而且系统状态定义为xD[0],xD[1],xD[2]等。 �
      在Outputs属性页可以定义系统的输出方程。 �
      在Build Info属性页中可以设置一些编译选项,如Show compile steps,Generate wrapper TLC,Create a debuggable MEX-file等。 �
      当所有设置项和代码都设置完成后,点击Build按钮编译生成自定义模块。 �
      
      3.2 直接编写.m文件生成自定义模块 �
      除了使用S-FUNCTION Builder生成自定义模块,我们还可以根据S-FUNCTION的标准直接编写自定义模块对应的.m文件。MATLAB提供了sfuntmpl.m模板程序供用户参考,用户可以在这一模板程序的基础上添加自己的代码,以实现设计要求。以下笔者将针对模板的源码做进一步讨论。 �
      首先是函数定义function [sys,x0,str,ts] = sfuntmpl(t,x,u,flag)。其中,函数名为sfuntmpl;t为当前时间,x为当前状态,u为当前输入,flag是用于切换执行代码的开关,不同的flag值对应不同功能的代码段;sys为返回的系统模型,x0为输出状态,str为状态排序指针,ts为取样时间。以下是使用不同flag值调用sfuntmpl函数时执行的功能: �
      flag=0,调用初始化函数mdlInitializeSizes对系统进行初始化; �
      flag=1,调用函数mdlDerivatives更新连续系统的状态; �
      flag=2,调用函数mdlUpdates更新连续系统的状态; �
      flag=3,调用函数mdlOutputs对输出变量y赋值; �
      flag=4,调用函数GetTimeOfNextVarHit,返回下一个取样时间点(仅用于变步长取样)到变量TNEXT �
      flag=5,系统保留选项,暂不使用 �
      flag=9,终止程序并删除系统 �
      接下来用户需要对这些模块执行过程中的子函数按照需求进行编码。mdlInitializeSizes函数:function [sys,x0,str,ts]=mdlInitializeSizes �
      首先需要在size结构体中分别定义连续或离散状态的个数,输入输出变量的个数,系统的输入是否影响输出,取样时间的个数,再调用内部函数simsize为生成的系统分配内存空间,并给出系统状态和取样时间的初始值。此函数无输入。 �
      mdlDerivatives函数:function sys=mdlDerivatives(t,x,u) �
      实现基于t,x,u的状态方程,定义连续系统的状态更新规则 �
      mdlUpdates函数:function sys=mdlUpdate(t,x,u) �
      实现基于t,x,u的状态方程,定义离散系统的状态更新规则 �
      mdlOutputs函数:function sys=mdlOutputs(t,x,u) �
      实现基于t,x,u的输出方程,定义输出变量 �
      mdlGetTimeOfNextVarHit函数:function sys=mdlGetTimeOfNextVarHit(t,x,u) �
      定义下一个取样时间点,缺省为当前时间加上1个取样时间 �
      mdlTerminate函数:function sys=mdlTerminate(t,x,u) �
      定义退出模块时的操作,一般用于释放分配的内存空间 �
      
      4 应用实例�
      
      在本节中,将结合前面给出的基于S-FUNCTION的方法实现一个自定义模块的设计。以前面提到的一个非线性系统为例,首先我们需要分析该系统的构成情况――这一简单系统为连续系统,其输入、输出以及状态均为一维变量。 �
      以下将讨论使用两种方法实现的具体步骤。 �
      
      4.1使用S-FUNCTION Builder�
      首先新建一个S-FUNCTION Builder模块,在S-function name文本框中输入用户对自定义模块的命名,如testsys;在Initialization属性页中,将Number of continuous states定义为1,Continuous states IC定义为系统初态,如0,Sample mode选为Continuous;Data Property属性页和Libraries属性页,使用缺省的系统设置即可(缺省输入定义为u0,缺省输出定义为y0); 在Continuous Derivatives属性页给出状态方程:dx[0]=xC[0]*xC[0]+u0[0];在Outpus属性页给出输出方程:y0[0]=xC[0]+u0[0];编译后即可产生自定义模块testsys。 �
      
      4.2 直接编写.m文件 �
      首先声明模块为function [sys,x0,str,ts] = testsys(t,x,u,flag) �
      接着编写mdlInitializeSizes函数�
      function [sys,x0,str,ts]=mdlInitializeSizes �
      sizes = simsizes; %生成一个空的size结构体�
      sizes.NumContStates=1;%定义输入、输出、状态个数�
      sizes.NumDiscStates=0; �
      sizes.NumOutputs=1; �
      sizes.Numinputs=1; �
      sizes.DirFeedthrough=1; �
      sizes.NumSampleTimes=1; �
      sys=simsizes(sizes); %分配空间�
      x0=0;%初态和取样时间�
      ts=0;�
      end mdlInitializeSizes�
      然后是mdlDerivatives函数�
      function sys=mdlDerivatives(t,x,u)�
      sys = x*x+u;�
      end mdlDerivatives�
      最后是mdlOutputs函数�
      function sys=mdlOutputs(t,x,u)�
      sys=x+u;�
      end mdlOutputs�
      至此自定义模块的代码编写完成。�
      本文在MATLAB的S-FUNCTION框架下探讨了两种实现自定义模块设计的方法以及详细的设计实例。鉴于MATLAB的主导性地位,相信随着其功能的进一步完善,MATLAB/SIMULINK将会在科学研究与工程科技各领域扮演更重要的角色,而自定义模块设计则会是用户在进行SIMULINK建模时强有力的武器。 �
      
      参考文献 �
      [1] The Matheworks. Using Simulink. Version 4. Natick: The Matheworks, 2000. �
      [2] The Matheworks. Writing S-Functions. Version 4. Natick: The Matheworks, 2000.

    推荐访问:自定义 模块 MATLAB MATLAB中基于S-FUNCTION的SIMULINK自定义模块实现 matlab中simulink模块 simulink仿真实例详解

    • 文档大全
    • 故事大全
    • 优美句子
    • 范文
    • 美文
    • 散文
    • 小说文章