Simulink中的自定义模块
Simulink自定义模块的建立

自定义模型的建立1,搭建直流电机模型2,选定要包含到子模块中的所有模块:单击Edit菜单下Creat Subsystem项,选定的模块即便为子系统:3,封装子系统将子系统命名为DC_motor_Subsystem,右击子系统模块,在弹出的菜单中选择Mask Subsystem,打开封装编辑器:Icon&Ports选项卡可对模块的外框,透明度,图表等进行设置。
在Icon Drawing Command 区域中可用命令改变端口名称,添加图片,修改颜色等。
以下命令用于修改端口名称及颜色:color('red');port_label('input',1,'Control Signal');color('red');port_label('output',1,'Torque');color('red');port_label('output',2,'Angle');color('red');port_label('output',3,'Speed');输入命令后单击OK,则则子模块变为:若要添加图片,需将图片放在模型所在目录下,命名为‘DC_motor’,在Icon Drawing Command区域内输入命令:image(imread('DC_motor.jpg'))则子模块变为:4,添加模块到库浏览器在Simulink库浏览器窗口,选择File菜单下New—Library,打开库编辑窗口,将封装后的DC_motor_subsystem拖入库编辑器并保存为DC_motor_subsystem_lib.mdl。
编写M函数代码:并保存在DC_motor_subsystem_lib.mdl所在目录下,重新打开模块库,则自定义模块添加成功:注意事项:在建模过程中,应注意模型名称是否拼写正确等细节问题。
SimMechanics简介(模块)

SimMechanicsSimMechanics模块组提供了建模的必要模块,可以直接在Simulink中使用。
SimMechanics支持用户自定义的构件模块,可以设定质量和转动惯量。
通过节点联接各个构件来表示可能的相对运动,还可以在适当的地方添加运动约束、驱动力。
运行matlab,点击进入simulink界面,在simulink库中点击simscape前点加号,在点击SimMechanics前的加号,就可以进入SimMechanics的模块库了,如图1所示。
模块组包含刚体子模块组(Bodies)、约束与驱动模块组(Constraints&Drivers)、力单元模块组(Force Elements)、接口单元模块组(Interface Elements)、运动铰模块组(Joints)及传感器和激励器模块组(Sensors&Actuators)和辅助工具模块组(Utilities)。
图1刚体子模块(Bodies)双击此模块,弹出模块组,此模块组包括四个模块:刚体(Body)、机架(Ground)机械环境(Machine Enviroment)和共享机械环境(Shared Enviroment)。
如图2图2所示。
机械环境(Machine Environment)是为仿真定义环境变量。
双击此模块,打开模块参数设计窗口,如图3所示,可以设定重力、维数、分析模式、约束求解器、误差、线性化和可视化等。
共享环境联接两个刚体模块使他们享有相同的机械环境。
机架只有一个连接端,另外一个固定。
一个机械系统一般都要设定他的机械环境。
图3刚体(body)有两个连接端,其中一个为主动端,另一端为从动端。
双击此模块,弹出模块参数设计窗口,如图4所示,可以在此窗口中定义质量、惯性矩、坐标原点、刚体的初始位置和角度等参数。
图4其它两个模块的参数同样可以这样设定。
约束与驱动模块组(Constraints&Drivers)双击此模块,在右边窗口中可以看到此模块组包含有以下模块:Angle Driver:设定两个刚体坐标间的角度。
自定义Simulink模块方法

S-函数
• 实验时,有时发现一些过程用普通的Simu-link模块不易搭建,或者找不到相 应的模块。我们可以使用Simulink支持的S-函数格式,用Matlab语言或者C语言 写出描述过程的程序,构成S-函数模块,直接调用。 用Matlab语言编写S-函数
引导语句为:
S-函数
• 用C语言编写S-函数 可以用Matlab6.1中提供的S-函数编辑程序来设计C语言的S-函数模板 也可以用 sfundemos 命令打开S-function demos模块组进行设计
相关S-函数的详细内容可参考《S-函数编写指导》等相关资料
自定义Simulink模块库的添加
自定义Simulink模块库的添加
• 命令 which('slbloБайду номын сангаасks.m','-all') 找到slblocks.m 文件,复制到自定义模块库所在文件夹,编辑如下
保存,刷新Simulink Library Browser,就可以看到自己的模块库
•
Function[sys,x0,str,ts] = f(t,x,u,flag,p1,p2,· · · )
其中,p1,p2,· · · 是用户自定义的参数,t,x,u,flag等是固定参数。具体细节可参考《系统仿真 技术与应用》的6.3节 Simulink中提供了一个sfuntmpl.m的模板文件,可以从这个模板出发构建自己的S-函数,命 令 which('sfuntmpl.m','-all') 可以显示模板所在位置。
s-function builder函数执行机制

S-Function Builder函数执行机制近年来,随着计算机科学与技术的发展,大规模数据处理与分析已经成为了各行业必不可少的一部分。
在这样的大背景下,MATLAB等工具成为了研究人员处理数据的利器。
在MATLAB中,S-Function Builder函数作为一种自定义函数,其执行机制备受关注。
本文将深入探讨S-Function Builder函数的执行机制,帮助读者更好地理解和应用这一功能。
一、S-Function Builder函数的概述S-Function Builder函数是MATLAB Simulink中的一种自定义模块或者函数。
它允许用户通过编写一些简单的C、C++或者Fortran代码来定义一个自定义的Simulink模块,以及该模块在Simulink中的执行逻辑。
这样一来,用户可以通过S-Function Builder函数轻松地实现一些Simulink中所不具备的功能,增强Simulink的灵活性与功能性,更好地满足自身的需求。
二、S-Function Builder函数的执行流程1. 数据准备与初始化在S-Function Builder函数被调用时,首先需要进行数据准备与初始化的工作。
这个阶段主要是为了准备输入数据与输出数据的内存空间,以及进行一些必要的初始化操作。
在这个阶段,用户可以通过编写C、C++或者Fortran的函数来对模块进行一些初始化操作,为后续的计算与处理做好准备。
2. 输入数据的接收与处理接下来,S-Function Builder函数将会接收输入的数据,并进行相应的处理。
用户可以通过编写特定的代码来定义输入数据的格式、类型以及处理逻辑,从而实现对输入数据的有效处理。
这个阶段是S-Function Builder函数执行机制中的关键步骤,也是用户根据自身需求进行自定义的重要环节。
3. 计算与逻辑处理在接收并处理了输入数据之后,S-Function Builder函数将会进行相应的计算与逻辑处理。
Simulink中的自定义模块

目录Fcn 模块 (1)MATLAB Fcn 模块 (2)S Function (System Function) (2)1. 函数的函数头 (4)2. 函数分析 (4)3.带参数的S函数 (8)4.S函数格式及说明 (9)simulink中子模块的封装 (16)Fcn 模块Fcn模块对它的输入进行指定的表达式运算。
使用的表达式可由下面的一个或多个部分组成。
u --- 模块的输入。
如果u是一个向量,u(i)表示此向量的第i个元素;u(1)或者u表示第一个元素数值常数(例如表达式5.2*u)算术运算符(+ - * / ^ 例如表达式u^2+5.2)关系运算符(== != > < >= <=) --表达式返回1,如果关系为真; 否则返回0逻辑运算符(&& || !) 表达式返回1,如果关系为真; 否则返回0括号数学函数(abs, acos, asin, atan, atan2, ceil, cos, cosh, exp, fabs, floor, hypot, ln, log, log10, pow, power, rem, sgn, sin, sinh, sqrt, tan, tanh.) Workspace中定义的变量–如果变量名字不是Matlab 保留字符(比如sin),变量名字会被传递给Matab,从而在Maltab Workspace中获取相应给定的值。
矩阵或者向量必须具体到其对应的元素。
(比如A(1,1))注意:Fcn模块中使用的表达式不支持矩阵运算,同样不支持(:) 符。
模块输入可以是标量或者向量,但输出总是标量数值。
MATLAB Fcn 模块MATLAB Fcn模块对它的输入进行指定的Matlab函数或者表达式运算。
输出尺寸必须和模块中定义的尺寸相符,否则报错。
下面是MATLAB Fcn模块中可以使用的有效表达式sin atan2(u(1),u(2)) u(1)^u(2)注意:同Fcn模块相比,在仿真中MATLAB Fcn模块速度要慢,因为它需要在每个积分步骤中调用Maltab编译器。
m函数生成simulink模块

m函数生成simulink模块1. 引言m函数是一种在MATLAB中常用的编程语言,用于实现特定的功能和算法。
Simulink是MATLAB的一个功能强大的工具箱,用于建模、仿真和分析动态系统。
在Simulink中,可以通过使用m函数来创建自定义的模块,以便实现更复杂的系统模型。
本文将深入探讨如何使用m函数生成Simulink模块,并提供一些实例来帮助读者更好地理解。
2. m函数简介m函数是MATLAB中用于实现特定功能的自定义函数。
它由一系列的MATLAB代码组成,可以接受输入参数,并返回输出结果。
m函数的语法与MATLAB脚本文件相似,但具有更大的灵活性和复用性。
在Simulink中,m函数可以用于创建自定义的模块,以便在系统建模过程中使用。
3. Simulink模块的生成过程3.1 创建m函数文件首先,我们需要创建一个m函数文件。
在MATLAB的当前工作目录下,右键点击鼠标并选择”New”->“Function”,然后输入文件名并选择”m文件”作为文件类型。
点击”Save”按钮后,MATLAB将自动创建一个空的m函数文件,并将其打开以供编辑。
3.2 编写m函数代码在m函数文件中,我们可以根据具体需求编写自定义的MATLAB代码。
这些代码既可以是编写好的函数调用,也可以是一系列的算法和计算过程。
无论是什么样的代码,都需要满足函数的输入输出要求。
例如,我们要编写一个简单的m函数用于计算两个数的和。
代码如下:function output = add(a, b)output = a + b;end在上述代码中,我们定义了一个名为”add”的m函数,它接受两个输入参数a和b,并返回它们的和。
3.3 保存并添加到Simulink模型中在完成m函数的编写后,我们需要将其保存,并添加到Simulink模型中以供使用。
首先,点击m函数文件编辑器的”Save”按钮保存代码。
然后,在Simulink模型编辑器中,选择”Library Browser”视图,然后在浏览器窗口中找到并双击”User-Defined Functions”库。
Simulink自定义功能模块

Simulink自定义功能模块前面讲述了使用Simulink中现有的模块进行仿真,但在实际中,可能有些需要用到的模块在Simulink中没有,因此需要Simulink的模块进行扩展,以适应特殊的仿真应用。
3.7.1自定义功能模块的创建Simulink提供了自定义功能模块,用户只要按照其规定要求定义一些模块,便可在Simulink仿真中调用和加以使用。
自定义功能模块的创建有以下两种方法。
(1)一种方法是采用Signal&Systems模块库中的Subsystem功能模块,利用其编辑区设计组合新的功能模块。
基本操作:首先将Signal&Systems模块库中的Subsystem功能模块复制到打开的模型窗口中,然后双击Subsystem功能模块,进入自定义功能模块窗口,即可利用已有的基本功能模块设计出新的功能模块。
(2)另一种方法是将现有的多个功能模块组合起来,形成新的功能模块。
基本操作:在模型窗口中建立所定义功能模块的子模块。
用鼠标将这些需要组合的功能模块选中,然后选择Edit菜单下的Create Subsystem即可。
对于很大的Simulink模型,通过自定义功能模块可以简化图形,减少功能模块的个数,有利于模型的分层构建。
3.7.2自定义功能模块的封装上面提到的两种方法都只是创建一个功能模块而已,如果要命名该自定义功能模块、对功能模块进行说明、选定模块外观、设定输入数据窗口,则需要对其进行封装处理。
首先选中Subsystem功能模块,再打开Edit菜单中的Mask Subsystem进入mask的编辑窗口,可以看出有3个标签页。
1. Icon标签页它用于设定功能模块外观,最重要的部分是Drawing Commands,在该区域内可以用disp指令设定功能模块的文字名称,用plot指令画线,用dpoly指令画转换函数。
注意:尽管这些命令在名字上和以前讲的MATLAB函数相同,但它们在功能上却不完全相同,因此不能随便套用以前所讲的格式。
matlab simulink每一模块的介绍

matlab simulink每一模块的介绍
MATLAB Simulink是一款用于建立和仿真动态系统模型的软
件工具。
它基于MATLAB编程语言,并提供了图形化界面,
用户可以使用各种模块来构建复杂的系统模型。
以下是Simulink中一些常用模块的介绍:
1. Constant(常数):用于设置系统中的常数值,如常数信号
输入、定值代码等。
2. Gain(增益):用于调整或放大输入信号的幅度,可以根据需求进行增益设置。
3. Sum(求和):用于将多个输入信号相加,可以选择不同的
输入端口进行加法运算。
4. Product(乘积):用于将多个输入信号相乘,可以选择不
同的输入端口进行乘法运算。
5. Integrator(积分器):用于对输入信号进行积分运算,可以用于模拟系统的积分环节。
6. Derivative(导数器):用于对输入信号进行求导运算,可
以用于模拟系统的微分环节。
7. Transfer Fcn(传递函数):用于建立系统的传递函数模型,可以根据系统参数设置传递函数的分子和分母。
8. Scope(作用域):用于显示系统模型中的信号变化情况,
可以在仿真过程中实时监测信号。
9. To Workspace(输出到工作区):用于将信号输出到工作区,以便后续分析或处理。
这仅是Simulink中一小部分常用模块的介绍,实际上
Simulink提供了大量的模块供用户选择和使用,可以根据具体
的系统模型需求进行选择和组合。
同时,用户还可以借助自定义模块进行更复杂系统的建模和仿真。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录Fcn 模块 (1)MATLAB Fcn 模块 (2)S Function (System Function) (2)1. 函数的函数头 (3)2. 函数分析 (3)3.带参数的S函数 (5)4.S函数格式及说明 (6)simulink中子模块的封装 (11)Fcn 模块Fcn模块对它的输入进行指定的表达式运算。
使用的表达式可由下面的一个或多个部分组成。
u --- 模块的输入。
如果u是一个向量,u(i)表示此向量的第i个元素;u(1)或者u表示第一个元素数值常数(例如表达式5.2*u)算术运算符(+ - * / ^ 例如表达式u^2+5.2)关系运算符(== != > < >= <=) --表达式返回1,如果关系为真; 否则返回0逻辑运算符(&& || !) 表达式返回1,如果关系为真; 否则返回0括号数学函数(abs, acos, asin, atan, atan2, ceil, cos, cosh, exp, fabs, floor, hypot, ln, log, log10, pow, power, rem, sgn, sin, sinh, sqrt, tan, tanh.)Workspace中定义的变量–如果变量名字不是Matlab 保留字符(比如sin),变量名字会被传递给Matab,从而在Maltab Workspace中获取相应给定的值。
矩阵或者向量必须具体到其对应的元素。
(比如A(1,1))注意:Fcn模块中使用的表达式不支持矩阵运算,同样不支持(:) 符。
模块输入可以是标量或者向量,但输出总是标量数值。
MATLAB Fcn 模块MATLAB Fcn模块对它的输入进行指定的Matlab函数或者表达式运算。
输出尺寸必须和模块中定义的尺寸相符,否则报错。
下面是MATLAB Fcn模块中可以使用的有效表达式sin atan2(u(1),u(2)) u(1)^u(2)注意:同Fcn模块相比,在仿真中MATLAB Fcn模块速度要慢,因为它需要在每个积分步骤中调用Maltab编译器。
因此建议使用Fcn模块或者Math Function 模块代替MATLAB Fcn模块,或者编写M文件或者MEX文件S 函数代替它。
S Function (System Function)S函数,即系统函数,用来扩展Simulink模块库。
一个S函数,相当于一个Simulink模块,只不过这个模块不是在Simulink Library中已经存在的,用户需要根据自己对Simulink的功能需求,使用指定的编程语言来定制自己的Simulink 模块。
S 函数支持Matlab, C, C++, Ada, or Fortran等语言,编写S函数需要按照一定的格式,具体如何编写S函数,参考Matlab自带文档。
如果能用现有的Simulink 模块库中的模块满足需求,不建议使用S函数编写。
所谓s函数是system Function的简称, 用它来写自己的simulink模块. s函数可以用matlab、C、C++、Fortran、Ada等语言来写,这儿只介绍怎样用matlab 语言来写吧(主要是它比较简单)先讲讲为什么要用s函数,我觉得用s函数可以利用matlab的丰富资源,而不仅仅局限于simulink提供的模块,而用c或c++等语言写的s函数还可以实现对硬件端口的操作,还可以操作windows API等先介绍一下simulink的仿真过程(以便理解s函数),simulink的仿真有两个阶段:一个为初始化,这个阶段主要是设置一些参数,像系统的输入输出个数、状态初值、采样时间等;第二个阶段就是运行阶段,这个阶段里要进行计算输出、更新离散状态、计算连续状态等等,这个阶段需要反复运行,直至结束.在matlab的workspace里输入edit sfuntmpl(这是matlab自己提供的s函数模板),我们看它来具体分析s函数的结构.1. 函数的函数头函数的第一行:function [sys,x0,str,ts]=sfuntmpl(t,x,u,flag) , 先讲输入与输出变量的含义:t是采样时间;x是状态变量;u是输入(是做成simulink模块的输入);flag是仿真过程中的状态标志(以它来判断当前是初始化还是运行等)sys输出根据flag的不同而不同(下面将结合flag来讲sys的含义);x0是状态变量的初始值;str是保留参数(mathworks公司还没想好该怎么用它, 一般在初始化中将它置空就可以了, str=[]);ts是一个1×2的向量, ts(1)是采样周期, ts(2)是偏移量2. 函数分析下面结合sfuntmpl.m中的代码来讲具体的结构:switch flag, %判断flag,看当前处于哪个状态case 0,[sys,x0,str,ts]=mdlInitializeSizes;// 解释说明flag=0表示当前处于初始化状态,此时调用函数mdlInitializeSizes进行初始化,此函数在该文件的第149行定义. 其中的参数sys是一个结构体,它用来设置模块的一些参数,各个参数详细说明如下size = simsizes; %用于设置模块参数的结构体用simsizes来生成sizes.NumContStates = 0; %模块连续状态变量的个数sizes.NumDiscStates = 0; %模块离散状态变量的个数sizes.NumOutputs = 0; %模块输出变量的个数sizes.NumInputs = 0; %模块输入变量的个数sizes.DirFeedthrough = 1; %模块是否存在直接贯通sizes.NumSampleTimes = 1; %模块的采样时间个数, 至少是一个sys = simsizes(sizes); %设置完后赋给sys输出举个例子,考虑如下模型:dx/dt=fc(t,x,u) 也可以用连续状态方程描述:dx/dt=A*x+B*ux(k+1)=fd(t,x,u) 也可以用离散状态方程描述:x(k+1)=H*x(k)+G*u(k)y=fo(t,x,u) 也可以用输出状态方程描述:y=C*x+D*u设上述模型连续状态变量、离散状态变量、输入变量、输出变量均为1个,我们就只需改上面那一段代码为(一般连续状态与离散状态不会一块用, 我这儿是为了方便说明):sizes.NumContStates=1;sizes.NumDiscStates=1;sizes.NumOutputs=1;sizes.NumInputs=1;其他的可以不变, 继续在mdlInitializeSizes函数中往下看:x0 = []; %状态变量设置为空,表示没有状态变量,以我们上面的假设,可改为x0=[0,0](离散和连续的状态变量我们都设它初值为0)str = []; %保留参数, 置[]就可以了, 没什么用ts = [0 0]; %采样周期设为0表示是连续系统, 如果是离散系统在下面的mdlGetTimeOfNextVarHit函数中具体介绍case 1,sys=mdlDerivatives(t,x,u);//flag=1表示此时要计算连续状态的微分, 即上面提到的dx/dt=fc(t,x,u)中的dx/dt, 找到193行的函数mdlDerivatives, 如果设置连续状态变量个数为0, 此处只需sys=[]就可以了, 按我们上述讨论的那个模型, 此处改成sys=fc(t,x(1),u)或sys=A*x(1)+B*u, 我们这儿x(1)是连续状态变量, 而x(2)是离散的, 这儿只用到连续的, 此时的输出sys就是微分case 2,sys=mdlUpdate(t,x,u);//flag=2表示此时要计算下一个离散状态, 即上面提到的x(k+1)=fd(t,x,u), 找到mdlUpdate函数, 它这儿sys=[]表示没有离散状态, 我们这儿可以改成sys=fd(t,x(2),u)或sys=H*x(2)+G*u;%sys即为x(k+1)case 3,sys=mdlOutputs(t,x,u);//flag=3表示此时要计算输出, 即y=fo(t,x,u), 找到218行的mdlOutputs函数. 如果sys=[]表示没有输出, 我们改成sys=fo(t,x,u)或sys=C*x+D*u %sys此时为输出ycase 4,sys=mdlGetTimeOfNextVarHit(t,x,u);//flag=4表示此时要计算下一次采样的时间, 只在离散采样系统中有用(即上文的mdlInitializeSizes中提到的ts设置ts(1)不为0), 连续系统中只需在mdlGetTimeOfNextVarHit函数中写上sys=[]. 这个函数主要用于变步长的设置, 具体实现大家可以用edit vsfunc看vsfunc.m这个例子case 9,sys=mdlTerminate(t,x,u);//flag=9表示此时系统要结束,一般来说写上在mdlTerminate函数中写上sys=[]就可, 如果你在结束时还要设置什么,就在此函数中写完了.3.带参数的S函数此外, s函数还可以带用户参数, 下面给个例子, 它和simulink下的gain模块功能一样function [sys,x0,str,ts] = sfungain(t,x,u,flag,gain)switch flag,case 0,sizes = simsizes;sizes.NumContStates = 0;sizes.NumDiscStates = 0;sizes.NumOutputs = 1;sizes.NumInputs = 1;sizes.DirFeedthrough = 1;sizes.NumSampleTimes = 1;sys = simsizes(sizes);x0=[];str=[];ts=[0,0];case 3,sys=gain*u;case {1,2,4,9},sys = [];end做好了s函数后, simulink --> user-defined function下拖一个S-Function 到你的模型, 就可以用了. 在simulink --> user-defined function还有个s-Function Builder, 他可以生成用c语言写的s函数. 或者在matlab的workspace下打sfundemos, 可以看到很多演示s函数的程序4.S函数格式及说明function [sys,x0,str,ts] = sfuntmpl(t,x,u,flag)% SFUNTMPL 是M-文件S函数模板% 通过剪裁,用户可以生成自己的S函数,不过一定要重新命名% 利用S函数可以生成连续、离散混合系统等,实现任何模块的功能%% M-文件S函数的语法为:% [SYS,X0,STR,TS] = SFUNC(T,X,U,FLAG,P1,...,Pn)%% 参数含义:% t是当前时间% x是S函数相应的状态向量% u是模块的输入% flag是所要执行的任务%% FLAG 结果功能% ----- ------ --------------------------------------------% 0 [SIZES,X0,STR,TS] 模块初始化% 1 DX 计算模块导数% 2 DS 更新模块离散状态% 3 Y 计算模块输出% 4 TNEXT 计算下一个采样时间点% 9 [] 结束仿真%%% 用户切勿改动输出参数的顺序、名称和数目% 输入参数的数目不能小于1,这四个参数的名称和排列顺序不能改动% 用户可以根据自己的要求添加额外的参数,位置依次为第5,6,7,8,9等。