主要内容

自定义和扩展自定义直流电机的Simscape库

使用符号数学工具箱为Simscape库创建一个基于自定义方程式的组件。

介绍

符号数学工具箱提供了一种灵活的方式,从第一工程原则在任何空间维度发展模型。你可以建立稳态或瞬态物理的数学模型。

您可以开发和解决代表组件所需物理所需的方程式;并在输入之间执行您自己的减少阶模型映射x和一定数量的利息f(x)。

在这里f是自定义分量,它可以以如下形式表示控制方程:

  • 数学公式

  • ODES和PDE的数值模拟

本示例中的步骤是

  • 使用参数化Simscape组件symreadsscvariables.

  • 为SIMSCAPE组件定义自定义方程diff

  • 用解析的方法求解稳态方程解决subs

  • 通过使用使用MATLAB的数值求解时间依赖性方程matlabfunction.ODE45.

  • 使用Symwritessc.

要运行此示例,您必须为Simscape和符号数学工具箱具有许可证。

直流电机模型

直流电动机是用于将电能转换成机械能的装置,反之亦然。DC电动机的示意图如下所示(左图)。模拟DC电机的块Simscape电™(右图),这是一个可选的产品Simscape

在该示例中,我们将使用控制常微分方程(ODES)导出DC电动机的减少的模型表示。对于直流电动机,电压和电流来自Kirchhoff的定律,并且机械扭矩的公式来自牛顿的法律。使用这些方程,我们可以实现自定义和参数SIMSCAPE组件。

J t w t ki. t - 博士 w t l t t + R t V t - KB. w t

参数化Simscape组件

导入模板组件的参数和变量

假设您有一个Simscape组件MyMotorTemplate.ssc在您当前的文件夹或默认的MATLAB路径中。该组件还没有方程。模板记录将用于开发电机的参数和变量。您可以使用类型提供该模板的预览。

类型MyMotorTemplate.ssc
组件MyMotortemplate%自定义直流电机%该块实现了自定义直流电机节点P =基础。电极;%+:左n =基础。电极;% - :左r = foundation.mcharical.rootational.lotational;%r:右c = foundation.mcharical.rootational.rootational;%c:右端参数r = {3.9,'ohm'};%电枢电阻L = {0.000012,'H'};%电枢电感j = {0.000001,'kg * m ^ 2'};%惯性r = {0.000003,'(n * m * s)/ rad'};%转子阻尼ki = {0.000072,'(n * m)/ a'};%扭矩常数kb = {0.000072,'(v * s)/ rad'}; %Back-emf constant end variables torque = {0, 'N*m'}; %Total Torque tau = {0, 'N*m'}; %Electric Torque w = {0, 'rad/s'}; %Angular Velocity I = {0, 'A'}; %Current V = {0, 'V'}; %Applied voltage Vb = {0, 'V'}; %Counter electromotive force end function setup if(R<=0) error('Winding resistance must be greater than 0.'); end end branches torque : r.t -> c.t; % Through variable tau from r to c I : p.i -> n.i; % Through variable i from p to n end equations w == r.w -c.w; % Across variable w from r to c V == p.v -n.v; % Across variable v from p to n end end

从模板组件中读取参数的名称、值和单元。

[parNames, parValues, parUnits] = symReadSSCParameters('mymotortemplate');

显示参数,值和相应的单元作为向量。

vpa ([parNames;parValues;parUnits), 10)
ans =

博士 J KB. ki. l R 0.000003 0.000001. 0.000072 0.000072 0.000012. 3.9 1 N “牛顿 - 一种力量的力量。” 米——长度的物理单位。 年代 “第二 - 一个物理单位。” rad “弧度 - 平面角度的物理单位”。 1 公斤 “千克 - 物理单位的质量。” 米——长度的物理单位。 2 1 V “伏 - 电势的物理单元。” 年代 “第二 - 一个物理单位。” rad “弧度 - 平面角度的物理单位”。 1 N “牛顿 - 一种力量的力量。” 米——长度的物理单位。 一个 “安培 - 电流的物理单元。” H “亨利 - 电感的物理单位。” Ω “欧姆 - 抵抗物理单位”。 [Dr, J, Kb, Ki, L, R;vpa(“0.000003”),vpa(“0.000001”),vpa(“0.000072”),vpa(“0.000072”),vpa(“0.000012”),vpa (3.9);1 * ((symunit(“N”)* symunit (m) * symunit (s)) / symunit (rad)), 1 * symunit(公斤)* symunit (m) ^ 2, 1 * ((symunit (V) * symunit (s)) / symunit (rad)), 1 * ((symunit(“N”)* symunit (m)) / symunit (' A ')), symunit (H)、symunit(欧姆)]

通过使用使用该参数名称将参数名称添加到MATLAB工作区Syms.功能。参数在工作区中显示为符号变量。您可以使用列出工作区中的变量。

syms(滞后)syms
您的符号变量是:J KB KI L r ANS博士

读取并显示组件变量的名称。用返回功能同时将这些变量转换为该变量的函数t

[varfuns,varvalues,amarunits] = symreadsscvariables('mymotortemplate''返回功能', 真的);VPA([varfuns; varvalues; amarkunits],10)
ans =

t V t VB. t τ t 扭矩 t w t 0 0 0 0 0 0 一个 “安培 - 电流的物理单元。” V “伏 - 电势的物理单元。” V “伏 - 电势的物理单元。” 1 N “牛顿 - 一种力量的力量。” 米——长度的物理单位。 1 N “牛顿 - 一种力量的力量。” 米——长度的物理单位。 1 rad “弧度 - 平面角度的物理单位”。 年代 “第二 - 一个物理单位。”

通过使用使用的将变量名添加到MATLAB工作区Syms.功能。变量显示为工作区中的符号函数。验证您已声明所有必需的符号变量和功能Syms.

信谊(varFuns)对称
符号变量是Dr J Ki R Vb t扭矩I Kb lv和w

为Simscape组件定义自定义方程

定义用于建模直流电机的方程式

机械转矩的微分方程定义为eq1eq2它)代表当前和w (t)角速度。

eq1 =扭矩+ j * diff(w(t))== -dr * w(t)+ tau(t)
eq1 (t) =

J t w t + 扭矩 t τ t - 博士 w t J*diff(w(t), t) + torque(t) == tau(t) - Dr*w(t)

Eq2 = tau(t)== ki * i(t)
EQ2 =
                 
                  
                   
                    
                     
                      
                       τ
                     
                     
                      
                      
                       
                        
                         t
                       
                      
                      
                     
                    
                    
                    
                     
                      
                       ki.
                      
                      
                      
                       
                        
                       
                       
                        
                        
                         
                          
                           t
                         
                        
                        
                       
                      
                     
                    
                   
                  
                 

电压和电流的方程是eq3eq4V (t)vb(t)分别代表施加的电压和反电动势。

eq3 = l * diff(i(t))+ r * i(t)== v(t) -  vb(t)
EQ3 =

l t t + R t V t - VB. t

eq4 = vb(t)== kb * w(t)
EQ4 =
                 
                  
                   
                    
                     
                      
                       
                        VB.
                      
                      
                       
                       
                        
                         
                          t
                        
                       
                       
                      
                     
                     
                     
                      
                       
                        KB.
                       
                       
                       
                        
                         
                          w
                        
                        
                         
                         
                          
                           
                            t
                          
                         
                         
                        
                       
                      
                     
                    
                   
                   
                    Vb (t) = = Kb * w (t)
                  
                 

我们可以一起列出。这里,电机的转矩与电流成正比。

EQS =公式([EQ1; EQ2; EQ3; EQ4])
eqs =

J t w t + 扭矩 t τ t - 博士 w t τ t ki. t l t t + R t V t - VB. t VB. t KB. w t

提取方程的左侧和右侧。

操作数=儿童(EQS);operlist = [操作数{:}];LHS = Operlist(1:2:结束)
lh =1×4单元阵列{1x1 sym} {1x1 sym} {1x1 sym} {1x1 sym}
RHS = Operlist(2:2:结束)
RHS =1×4单元阵列{1x1 sym} {1x1 sym} {1x1 sym} {1x1 sym}

第二个和第四个方程定义值τ(t)vb(t).为了简化四个方程的系统到两个方程的系统,将这些值替换为第一和第三等式。

式(1)= subs(eqs(1), lhs(2), rhs(2))
公式=

J t w t + 扭矩 t ki. t - 博士 w t

等式(2)=潜艇(EQS(3),LHS(4),RHS(4))
公式=

J t w t + 扭矩 t ki. t - 博士 w t l t t + R t V t - KB. w t

方程。
ans =

J t w t + 扭矩 t ki. t - 博士 w t l t t + R t V t - KB. w t

在解方程之前,用参数的数值代入参数。此外,使用V (t) = 1

等式=潜艇(方程,[滞后,v(t)],[剖视图,1]);等式=潜艇(方程,扭矩,0);VPA(方程式。,10)
ans =

0.000001. t w t 0.000072 t - 0.000003 w t 0.000012. t t + 3.9 t 1.0 - 0.000072 w t

分析解决稳态方程

解决稳定状态的方程。

为此,请删除函数的时间依赖性w (t)它).例如,用符号变量替换它们WW.II

Syms.WW.IIequations_steady = subs(equation, [w(t),I(t)], [ww,ii]);结果=解决(ww, equations_steady ii);steadyStateW = vpa (result.ww, 10)
stignedstatew =
                 
                  
                   
                    
                     6.151120734
                   
                   
                    VPA('6.151120734')
                  
                 
steadyStateI = vpa (result.ii, 10)
stiefaseStatei =
                 
                  
                   
                    
                     0.2562966973
                   
                   
                    vpa(“0.2562966973”)
                  
                 

在数字上求解时间相关方程

利用MATLAB软件对该符号表达式进行数值模拟matlabfunction.ODE45.

创建有效输入ODE45.从符号方程。用odetovectorfield.创建代表动态系统的MATLAB过程 dY dt f t Y 在初始条件下 Y t 0 Y 0

[vfequations] = odetovectorfield(方程)
vfEquations =

147573952589676412928 1770887431076117 - 6 Y 2 - 2877692075498690052096 Y 1 8854437155380585 83010348331692984375 Y 1 1152921504606846976 - 27670116110564328125 Y 2 9223372036854775808 [SYM('14757395258/1770887431076117') - 6 * Y(2) - (SYM('2877692075498690052096')* Y(1))/ sym('8854437155380585');(SYM('83010348331692984375')* Y(1))/ sym(1152921504606846976') - (SYM('27670116110564328125')* Y(2))/ SEM('9223372036854775808')]

TVALS =

w

m = matlabfunction(vfequation,“var”,{“t”'是'})
m =function_handle具有值:@(t,y)[y(1)。*( -  3.25e + 5)-y(2)。* 6.0 + 8.333333333333333333333333333333332 + 4; Y(1)。* 7.2e + 1-y(2)。* 3.0]

利用初始条件求解微分方程w(0)= 0和我(0) = 0

解= ode45(M,[0 3],[0 0])
解决方案=结构与字段:求解器:'ode45'extdata:[1x1结构] x:[1x293775双] y:[2x293775双]统计:[1x1 struct] iData:[1x1 struct]

评估以下几点的解决方案t= [0.5,0.75,1]。第一个值是当前的它)第二个值是角速度w (t).我们看到角速度的解决方案开始接近稳定状态steadyStateW

德瓦尔(解决方案,0.5),德瓦尔(解决方案,综合成绩),德瓦尔(解决方案,1)
ans =2×10.2563 - 4.7795
ans =2×10.2563 - 5.5034
ans =2×10.2563 5.8453
steadyStateW
stignedstatew =
                 
                  
                   
                    
                     6.151120734
                   
                   
                    VPA('6.151120734')
                  
                 

绘制解决方案。

时间= linspace (0, - 2.5);iValues = deval(solution, time, 1);wValues = deval(解,时间,2);steadyStateValuesI = vpa (steadyStateI * (1100), 10);steadyStateValuesW = vpa (steadyStateW * (1100), 10);图;plot1 =次要情节(2,1,1);plot2 =次要情节(2,1,2);情节(wValues plot1,时间,'蓝色',时间,steedstaltevaluesw,“——红”'行宽', 1) plot(plot2, time, iValues,'绿色'、时间、steadyStateValuesI“——红”'行宽'1)标题(plot1“直流电机-角速度”)标题(plot2“直流电机-电流”)Ylabel(Plot1,'角速度[rad / s]')Ylabel(Plot2,'当前[a]')Xlabel(Plot1,“时间[s]”)Xlabel(Plot2,“时间[s]”)传奇(Plot1,'w(t)''w(t):稳态''地点'“northeastoutside”)传奇(Plot2,'它)''我(t):稳态''地点'“northeastoutside”

图中包含2个轴。轴1与标题直流电动机-角速度包含2个对象的类型线。这些物体代表w(t), w(t):稳态。轴2标题直流电机电流包含2个对象的类型线。这些物体表示I(t), I(t):稳态。

创建Simscape组件

保存您的数学模型回来用于Simscape。

使用原始方程生成Simscape码eqs.

symWriteSSC ('mymotor.ssc'“MyMotorTemplate.ssc”,eqs,......'h1header''%定制直流电机'......'helptext',{'%这个块实现了自定义直流电机'})

使用该组件显示生成的组件类型命令。

类型mymotor.ssc.
组件MyMotor%定制直流电机%该块实现了自定义直流电机节点P =基础。电极;%+:左n =基础。电极;% - :左r = foundation.mcharical.rootational.lotational;%r:右c = foundation.mcharical.rootational.rootational;%c:右端参数r = {3.9,'ohm'};%电枢电阻L = {0.000012,'H'};%电枢电感j = {0.000001,'kg * m ^ 2'};%惯性r = {0.000003,'(n * m * s)/ rad'};%转子阻尼ki = {0.000072,'(n * m)/ a'};%扭矩常数kb = {0.000072,'(v * s)/ rad'}; %Back-emf constant end variables torque = {0, 'N*m'}; %Total Torque tau = {0, 'N*m'}; %Electric Torque w = {0, 'rad/s'}; %Angular Velocity I = {0, 'A'}; %Current V = {0, 'V'}; %Applied voltage Vb = {0, 'V'}; %Counter electromotive force end function setup if(R<=0) error('Winding resistance must be greater than 0.'); end end branches torque : r.t -> c.t; % Through variable tau from r to c I : p.i -> n.i; % Through variable i from p to n end equations w == r.w -c.w; % Across variable w from r to c V == p.v -n.v; % Across variable v from p to n torque+J*w.der == tau-Dr*w; tau == Ki*I; L*I.der+R*I == V-Vb; Vb == Kb*w; end end

从生成的组件构建Simscape库。

如果~ isdir (' + MyLib ')MKDIR.+ mylib.结束拷贝文件mymotor.ssc.+ mylib.;ssc_buildMylib.
在/tmp/Bdoc2万博1manbetx1a_1606923_192608/tp4cf1fd6c/symbolic-ex98670381'目录下生成Simulink库'MyLib_lib'…