
电力系统的MATLABSIMULINK仿真与应用第8章.ppt
89页第8章 定 制 模 块 第8章 定 制 模 块 8.1 定制非线性模块定制非线性模块 8.2 S函数的编写及应用函数的编写及应用 第8章 定 制 模 块 8.1 定制非线性模块定制非线性模块8.1.1 非线性电感模块非线性电感模块 【【例例8.1】】定制一个非线性电感元件,当电压在0~120 V时,电感恒定为2 H;当电压超过120 V时,电感元件饱和,电感降低到0.5 H图8-1所示为该非线性电感对应的磁通—电流特性曲线,单位为p.u.其中VB = 120/sqrt(2) V,fB = 50 Hz第8章 定 制 模 块 图8-1 例8.1的磁通—电流特性曲线第8章 定 制 模 块 解:解:(1) 理论分析显然电感元件上电压v和电流i具有如下关系:其中,Ψ为电感元件上的自感磁链 由式(8-1)可以得到磁链Ψ为 因此电感上的电流i为(8-3) (8-2) (8-1) 第8章 定 制 模 块 可见,可以用受控电流源表示该非线性电感元件,该电流源受控于电流源两端的电压 (2) 按图8-2搭建非线性电感模型该模型包括一个电压表模块、一个可控电流源模块(电流源的电流方向为箭头所示方向)、一个积分模块和一个用于描述磁通—电流饱和特性的查表模块。
选用的各模块的名称及提取路径见表8-1图中有一个信号输出口m,输出非线性电感模块上的磁通和该模块两端的电压值第8章 定 制 模 块 图8-2 非线性电感模型第8章 定 制 模 块 表表8-1 例例8.1非线性电感模型中包含的模块非线性电感模型中包含的模块第8章 定 制 模 块 图8-3 例8.1的查表模块参数设置 打开查表模块参数对话框,按图8-3设置参数该图中的参数实际上就是图8-1的磁通—电流特性其余模块的参数采用默认设置第8章 定 制 模 块 (3) 将搭建好的非线性电感模型组合为一个子系统并命名为Nonlinear Inductance后,按图8-4所示搭建仿真系统选用的各模块的名称及提取路径见表8-2第8章 定 制 模 块 图8-4 例8.1的仿真系统图第8章 定 制 模 块 表表8-2 例例8.1仿真电路模块的名称及提取路径仿真电路模块的名称及提取路径第8章 定 制 模 块 该系统中含有两个电压源,一个峰值为120 V、50 Hz、相角为90°的交流电压源Vs和一个幅值为0的直流电压源VDC串联RLC支路为纯电阻电路,其中电阻元件R = 5 W。
在仿真参数对话框中设置变步长ode23tb算法,仿真结束时间为1.5 s (4) 开始仿真设置直流电压源幅值为0,开始仿真图8-5所示为仿真最后5个周期的波形,图中波形从上到下依次为非线性电感元件上的磁通、电流和电压此时,电压未超过极限值120 V,电感为2 H对应的电流幅值Im为(8-4) 第8章 定 制 模 块 磁链Ψ为与观测到的波形一致8-5) 第8章 定 制 模 块 图8-5 仿真波形图(VDC = 0 V)第8章 定 制 模 块 将直流电压源的幅值改为1 V,再次仿真按理论分析,直流电压源单独作用时,电路中的电感相当于短路,因此观测的仿真电流中应该含有一个直流电流,该电流值为1 V/5 Ω = 0.2 A 观察仿真最后5个周期的波形如图8-6所示,图中波形从上到下依次为非线性电感元件上的磁通、电流和电压由于对1 V直流电压源分量进行了积分运算,导致磁通饱和,因此电流波形发生畸变由图可见,此时电流增大到0.575 A第8章 定 制 模 块 图8-6 仿真波形图(VDC = 1 V)第8章 定 制 模 块 通过FFT模块提取电流信号中的基频和直流分量,如图8-7所示,图中波形为非线性电感元件电流的基频分量和直流分量。
可见,基频电流增大到0.27 A,直流电流分量为0.2 A,与理论分析值一致第8章 定 制 模 块 图8-7 基频和直流电流分量第8章 定 制 模 块 尽管在例8.1中已经建立了一个非线性电感模块,但是该模块外观并不完美下面将对该非线性电感模块进行封装,创建对话框、图标和说明文档,并通过对话框来设定非线性电感的磁通—电流特性,使它看起来和SIMULINK库提供的其它模块一样完整 单击图8-4中“非线性电感元件”图标,打开菜单[Edit> Mask subsystem],弹出封装子系统编辑窗口如图8-8所示选择“文档”(Documentation)标签页,在“封装类型” (Mask type)文本框中输入文字“非线性电感”,在“封装说明” (Mask description)多行文本框中输入该模块的简单说明和注意事项,在“封装帮助”(Mask help)多行文本框中输入该模块的帮助文件第8章 定 制 模 块 图8-8 封装子系统编辑窗口(文档标签页)第8章 定 制 模 块 选择“参数”(Parameters)标签页如图8-9所示,通过点击 按键添加、删除、移动项目。
按图8-9分别添加额定电压、额定频率、线性电感和饱和特性其中,在“变量说明” (Prompt)列中输入各变量的简单说明,在“变量名”(Variable)列中输入各变量的名称注意这些变量是可以被封装的子系统作为已知参数调用的,因此,这些变量名应该是容易记忆的,同时SIMULINK不区分大小写在“类型”(Type)列中选择参数的类型,可选的类型有“文本框”(edit)、“列表框” (checkbox)和“下拉框”(popup)可计算”(Evaluate)和“可调用”(Tunable)列为可选项第8章 定 制 模 块 选中“可计算”(Evaluate)列后,SIMULINK首先对用户输入的表达式进行计算,然后再将计算结果赋值给变量,否则SIMULINK直接把用户输入的表达式作为一个字符串赋值给变量选中“可调用”(Tunable)列将允许该参数在仿真过程中被修改第8章 定 制 模 块 图8-9 封装子系统编辑窗口(参数标签页)第8章 定 制 模 块 选择“初始化”(Initialization)标签如图8-10所示,在“初始化命令”(Initialization commands)窗口中输入如下命令并提取电流变量Current_vect和磁通变量Flux_vect。
第8章 定 制 模 块 图8-10 封装子系统编辑窗口(初始化标签页)第8章 定 制 模 块 第8章 定 制 模 块 第8章 定 制 模 块 单击“确定”(OK)按键,关闭封装子系统编辑窗口接下来,将定义的电流变量Current_vect和磁通变量Flux_vect传递到非线性电感元件的查表模块中通过菜单 [Edit>look under Mask]进入图8-2所示的“非线性电感元件”窗口,打开查表模块对话框,设置输入、输出参数如图8-11所示 确认后退出“非线性电感元件”子系统,回到主窗口中,双击“非线性电感元件”图标,出现图8-12所示的参数对话框,输入额定电压、额定频率、线性电感值和磁通—电流饱和特性 现在可以开始仿真了,仿真波形和图8-6完全相同第8章 定 制 模 块 图8-11 查表模块中参数的设置第8章 定 制 模 块 图8-12 非线性电感元件参数的设置第8章 定 制 模 块 回到仿真主窗口,继续为该模块定制一个图标,使得该模块像SIMULINK的任何一个模块一样漂亮 选中非线性电感模块,通过菜单[Edit>Edit Mask]打开封装子系统编辑窗口,选择“图标”(Icon)标签如图8-13所示。
第8章 定 制 模 块 图8-13 封装子系统编辑窗口(图标标签页)第8章 定 制 模 块 在“画图命令”(Drawing commands)窗口中输入命令 plot(Current_vect,Flux_vect); 在“透明度”(Transparency)下拉框中选择“透明” (Transparent)单击“确定”(OK)按键或者“应用”(Apply)按键后退出子系统编辑窗口,可以看见磁通—电流饱和特性曲线出现在非线性电感模块上,由于选择透明处理,输入、输出端口的名称也一并显示在该模块上封装后的非线性电感模块图标如图8-14所示当然,也可以选择“不透明”(Opaque),这样,输入、输出端口的名称被图形覆盖了第8章 定 制 模 块 图8-14 非线性电感模块图标第8章 定 制 模 块 8.1.2 定制非线性电阻元件定制非线性电阻元件 非线性电阻元件的建模方法和非线性电感元件的建模方法类似本节不再利用查表方式建立电压电流关系,而是直接由电压电流的数学关系建立表达式 【【例例8.2】】定制一个非线性MOV电阻元件,搭建电路,观测效果 解:解:(1) 理论分析。
金属氧化物压敏电阻MOV的电压电流具有以下关系:(8-6) 第8章 定 制 模 块 其中,v、i为瞬时电压和电流;V0为钳制电压;I0为钳制电压对应的参考电流;α 用来定义非线性特性,通常在[10,50]间取值 因此,本例可以用受控电流源来表示该非线性电阻元件,受控电流源受控于该电源两端的电压 (2) 按图8-15搭建非线性MOV电阻模型该模型包括一个电压表模块、一个可控电流源模块(电流源的电流方向为箭头所示方向)、一个传递函数模块和一个自定义的函数模块选用的各模块的名称及提取路径见表8-3图中有一个信号输出口m,输出非线性电阻模块的电压值第8章 定 制 模 块 图8-15 非线性电阻模型第8章 定 制 模 块 表表8-3 例例8.2非线性电阻模型中包含的模块的名称及提取路径非线性电阻模型中包含的模块的名称及提取路径第8章 定 制 模 块 本例利用数学函数模块直接建立非线性MOV的电压电流特性由于纯电阻模块不含状态变量,这样在SIMULINK内部运算时将产生一个代数循环,导致运算速度降低为了解开代数环,在电压测量模块输出口加入了一个1阶滞后传递函数 按图8-16封装该非线性电阻模块,设置钳位电压为2倍的额定电压,即2×120e3×sqrt(2)/sqrt(3)=195.96 kV。
参考电流为500 A,α为25第8章 定 制 模 块 图8-16 封装非线性电阻模块 第8章 定 制 模 块 继续给该非线性电阻加一个图标打开封装子系统编辑窗口,选择“初始化”标签,在“初始化命令”(Initialization commands)窗口中输入如下命令: t=0:0.0001:0.04; x=sin(100*pi*t); y=500*x.^25; 选择“图标”(Icon)标签,在“画图命令”(Drawing commands)窗口中输入命令: plot(y,x); 确定后退出该编辑窗口非线性电阻模块图标如图8-17所示第8章 定 制 模 块 图8-17 非线性电阻模块图标第8章 定 制 模 块 图8-18 例8.2的仿真系统图 (3) 将定制的非线性电阻模块用于保护线电压为120 kV的、按图8-18所示搭建的仿真系统选用的各模块的名称及提取路径见表8-4第8章 定 制 模 块 表表8-4 例例8.2仿真电路模块的名称及提取路径仿真电路模块的名称及提取路径第8章 定 制 模 块 将交流电压源峰值设为2.3×120×sqrt(2)/sqrt(3) kV、频率为50 Hz、相角为0°。
串联RLC支路RL中,电阻元件R=1.92 Ω,电感元件L = 26 mH串联RLC负荷额定电压为120/sqrt(3) kV,频率为50 Hz,有功功率为10 MW,感性和容性无功功率为0 在仿真参数对话框中设置变步长ode23tb算法,仿真结束时间为0.1 s 开始仿真图8-19所示为仿真波形图,图中波形为非线性电阻元件上的电流和电压第8章 定 制 模 块 图8-19 仿真波形图第8章 定 制 模 块 由波形图可见,在正常电压条件下,MOV相当于一个阻值极大的线性电阻当电压大于200 kV时,MOV内阻急剧下降并迅速导通,其上电流增加几个数量级,而电压被钳位在200 kV,从而有效地保护了电路中的其它元器件不至于过压而损坏对应的电压—电流特性如图8-20所示第8章 定 制 模 块 图8-20 实测的V-I特性第8章 定 制 模 块 8.1.3 定制模块库定制模块库 为了方便地对定制的模块进行管理,用户还可以像SIMULINK一样创建自己的模块库,在自己的库中可以添加、删除模块,或者在这个库中建立子库当对库中某模块进行修改时,所有模型文件中的该模块都被自动修改,这样,就不需要一个个打开模型文件去进行模块修改了。
在SIMULINK浏览器窗口中,点击菜单[File>New Library],将出现一个新的名为Library:untitled的窗口将定制的非线性电阻模块和非线性电感模块复制到新窗口中,保存新窗口,例如取名为mypsb_library新的模块库窗口如图8-21第8章 定 制 模 块 图8-21 定制的模块库第8章 定 制 模 块 8.2 S函数的编写及应用函数的编写及应用 S函数是System Function的简称,即系统函数,它是扩展SIMULINK功能的强有力的工具,在很多情况下非常有用用户可以利用MATLAB、C、C++以及FORTRAN等语言来编制程序,构成S函数模块,并像标准SIMULINK模块一样直接调用 S函数使用一种特殊的调用规则,使得用户可以与SIMULINK的内部算法进行交互这种交互和SIMULINK内部算法与内置模块之间的交互非常相似,而且可以适用于不同性质的系统第8章 定 制 模 块 图8-22 S函数模块图标 本节主要介绍利用MATLAB语言设计S函数,并通过例子介绍S函数的应用技巧8.2.1 S函数模块函数模块 S函数模块在Simulink/User-Defined Functions库中,用此模块可以创建包含S函数的SIMULINK模块。
S函数模块的图标如图8-22所示第8章 定 制 模 块 S函数模块只有一个信号输入口和一个信号输出口,分别对应输入变量和输出变量S函数模块输入端口只能接受一维的向量信号如果S函数模块含有多个输入变量和输出变量,需要使用“信号合成”(Mux)模块和“信号分离”(Demux)模块,同时需要指定sizes结构的适当区域的值注意输入变量的个数和输出变量的个数必须和S函数内部定义的输入变量和输出变量的个数相同S函数模块自动将输入列向量的第一个值和S函数内部的第一个输入变量对应,第二个值和S函数内部的第二个输入变量对应,等等输出变量也存在同样关系第8章 定 制 模 块 双击S函数模块,弹出该模块的参数对话框,如图8-23所示该对话框中包含如下参数: (1) “S函数文件名”(S-Function Name)文本框:填写S函数的文件名,确定后图标上将显示该文件名注意,不需要扩展名,但该文本框不能为空 (2) “S函数参数”(S-Function Parameters)文本框:填写S函数需要的外部参数S函数模块允许使用外部参数函数的参数可以是MATLAB表达式,也可以是变量参数并列给出,各参数间以逗号分隔,但参数列不需要用小括号括住表示。
若无外部变量,该文本框为空第8章 定 制 模 块 图8-23 S函数模块参数对话框第8章 定 制 模 块 (3) “编辑”(Edit)按键:点击该按键将打开指定文件名的S函数文件编辑窗口,在该窗口中可以进行编辑工作 【【例例8.3】】假设S函数需要的外部参数有三种,分别为2、矩阵[1,2;3,4]和字符串miles试将这三种参数输入“S函数参数”参数文本框 解:解:在“S函数参数”参数文本框中输入 2,[1,2;3,4;], 'miles'即可第8章 定 制 模 块 8.2.2 S函数的编写函数的编写 S函数模块的M文件具有一套固定的调用变量规则可以通过创建一个新的M文件并在其中按规则编写S函数,或者直接用SIMULINK提供的模板文件sfuntmpl.m,并从这个模板出发构建需要的S函数 这类M文件中第一行程序是一个函数语句: function [sys,x0,str,ts] = f (t,x,u,flag,p1,p2,…,pn)其中,f为S函数的函数名,例如S函数以函数名sfun.m保存,则f应为sfun输入变量和输出变量的说明分别见表8-5和表8-6。
第8章 定 制 模 块 表表8-5 S函数输入变量表函数输入变量表第8章 定 制 模 块 表表8-6 S函数输出变量表函数输出变量表 第8章 定 制 模 块 S函数的M文件在运行过程中不断检测输入变量flag的值,并按照表8-7所示的规则调用不同的内部函数表表8-7 S函数函数flag参数表参数表第8章 定 制 模 块 由表8-7可知,变量flag共有六种可能值,下面将分别讨论这六种值所对应的操作 1. 初始化设置初始化设置 flag=0时,调用函数mdlInitializeSizes进行初始化设置在mdlInitializeSizes函数中,需要对四种参数进行初始值的设置 1) sizes 首先通过语句 sizes = simsizes获得默认的系统参数变量sizes该变量是一个没有初始化的结构体变量,共包含有六个字段,各字段说明如表8-8所示第8章 定 制 模 块 表表8-8 结构体变量结构体变量sizes的字段的字段第8章 定 制 模 块 对sizes结构体变量中的每个元素赋值sizes中的每个元素都必须有值,即使这个值为0。
设置好后,通过语句 sys=simsizes(sizes)将变量sizes赋值给输出变量sys 【【例例8.4】】某S函数不含连续状态变量和离散状态变量,只有一个输入变量和一个输出变量,且输入变量直接控制输出变量,采样周期唯一试对该S函数的结构体变量sizes进行初始化设置 解:解:输入如下语句进行初始化设置:第8章 定 制 模 块 第8章 定 制 模 块 2) x0 设置状态变量的初始值 【【例例8.5】】某S函数含有两个连续状态变量和两个离散状态变量连续状态变量的初始值为1.0,离散状态变量的初始值为0.0试对该S函数的状态变量初始值进行设置 解:解: x0=[1.0,1.0,0.0,0.0]; 3) str 变量str总为空: str=[ ];第8章 定 制 模 块 4) ts 通过设置采样时间和采样延迟时间矩阵ts来定义SIMULINK调用函数的时间SIMULINK提供了多种设置ts的方式,如表8-9所示表表8-9 采样时间设置采样时间设置第8章 定 制 模 块 若系统含有多个采样周期,可以用同样的方法进行设置。
【【例例8.6】】某S函数含有两个离散的采样周期,第一个采样周期为0.25 s,无延迟;第二个采样周期为1.0 s,采样延迟0.1 s试对该S函数的ts进行初始化设置 解:解: ts=[0.25, 0; 1.0, 0.1]; 第8章 定 制 模 块 2. 连续状态变量微分计算连续状态变量微分计算 flag=1时,调用函数mdlDerivatives将连续状态变量的微分值赋给sys 【【例例8.7】】已知非线性系统 当flag=1时,试设置sys属性 解:解: sys(1)=x(2); sys(2)=x(1)-3*x(2)^2+u(1);第8章 定 制 模 块 3. 离散状态变量更新离散状态变量更新 flag=2时,调用函数mdlUpdates将离散状态变量更新后的值赋给sys 【【例例8.8】】已知一个一阶单变量离散子系统 当flag=2时,试设置sys属性 解:解: sys=x(1)+u(1); 4. 输出变量计算输出变量计算 flag=3时,调用函数mdlOutputs对输出变量进行计算,并把输出变量赋值给sys。
第8章 定 制 模 块 5. 下次采样时间计算下次采样时间计算 flag=4时,调用函数mdlGetTimeOfNextVarHit对下一次的采样时间进行计算,并把下一次的采样时间赋值给sys只有在初始值设置中已将采样时间设置为可变后,该函数才会被调用 6. 仿真结束仿真结束 当仿真以某种原因结束时,flag=9,调用函数mdlTerminate执行必要的任务终止仿真,不对sys赋值第8章 定 制 模 块 【【例例8.9】】按文献[14]定制一个非线性电弧炉元件以反映电弧炉的电压电流特性,搭建电路,观测效果 解:解:(1) 理论分析文献[14]所述模型的电弧电压v和电流i的关系为其中,g为电弧电导,定义为(8-8) (8-7) 第8章 定 制 模 块 r为电弧半径,定义为其中,C'对应电弧半径的初值;Im为电流幅值;k1、k2、k3是常数,分别为3000、1、12.5 考虑4~14 Hz频率范围的白噪声后,电弧半径为(8-9) (8-10) 第8章 定 制 模 块 (2) 按图8-24搭建电弧炉电气特性模型该模型中,电弧炉电气特性用一个可控电压源等效替代,可控电压源的大小主要由电弧炉的电弧半径决定,而电弧半径由电流幅值决定,同时电弧半径上还叠加了一个噪声。
该模型中选用的各模块的名称及提取路径见表8-10第8章 定 制 模 块 表表8-10 例例8.9电弧炉电气特性模型中选用的模块电弧炉电气特性模型中选用的模块的名称及提取路径的名称及提取路径第8章 定 制 模 块 图8-24 电弧炉电气特性模型第8章 定 制 模 块 设置正弦波发生器模块中电流幅值为3 A、频率为100pi、相角为0°FFT模块基频为50 Hz,提取基频分量(1次分量),滤波器为带通滤波器,截断频率为14 Hz (3) 编写s函数在MATLAB/toolbox/Simulink/Blocks目录下复制模块文件sfuntmpl.m到MATLAB/work工作目录下,打开该模板,另存为myarc_r.m和myarc_Ron.m,其中myarc_r为电弧半径计算模块,myarc_Ron为电弧炉等效电阻计算模块myarc_r的程序代码如下:第8章 定 制 模 块 第8章 定 制 模 块 第8章 定 制 模 块 第8章 定 制 模 块 第8章 定 制 模 块 第8章 定 制 模 块 第8章 定 制 模 块 (4) 封装S函数模块。
以上的模型还不能运行,因为其中的外部参数未设置因此,对图8-24所示的模型按8.1节所述方法进行封装,并设置参数对话窗口,如图8-25所示第8章 定 制 模 块 图8-25 电弧炉模型参数对话框第8章 定 制 模 块 图8-26 电弧炉模型图标封装完成后的电弧炉模型图标如图8-26所示第8章 定 制 模 块 (5) 开始仿真,仿真结果如图8-27所示图中从上到下依次为电弧炉上的电流、电弧炉端口电压和电弧炉电弧半径图8-28为实测的电弧炉电压—电流特性从电压—电流特性曲线上可以看出,仿真效果良好 从上例可以看出,通过编写S函数,并与MATLAB/ SIMULINK结合,定义、搭建新模型是一个非常简单、直观的过程,它极大地扩展了SIMULINK的功能第8章 定 制 模 块 S函数还允许采用C、C++、FORTRAN等语言进行编写但是,C语言的编写和调试过程比MATLAB语言编写S函数的过程要复杂得多,所以在纯仿真中最好使用MATLAB语言去编写当然,在有些应用中,由于MATLAB语言的S函数不能转换成C语言程序,生成独立文件,所以应该采用C语言去编写S函数关于采用C、C++、FORTRAN等语言编写S函数的方法,读者可以参考MATLAB相关帮助。
第8章 定 制 模 块 图8-27 电弧炉模型图标第8章 定 制 模 块 图8-28 电弧炉电压—电流特性。
