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

创建自定义公式使用符号数学工具箱中的Simscape库基于组件。

介绍

符号数学工具箱提供了开发从第一工程原理模型中的任何空间维度的灵活方式。您可以开发用于稳态或瞬态物理数学模型。

你可以开发和求解方程来表示所需要的物理为您的组件需要;并执行输入之间你自己的降阶模型映射x以及一些有趣的东西F(X)。

在这里f是可以表示的形式控制方程定制组件:

  • 数学公式

  • 常微分方程和偏微分方程的数值模拟

在这个例子中的步骤

  • 使用Simscape组件参数化symReadSSCVariables

  • 定义自定义公式使用您的Simscape组件diff

  • 用解析法求解稳态方程解决潜艇

  • 通过使用数值求解与时间相关的等式在MATLABmatlabFunctionODE45

  • 使用以下命令创建一个Simscape组件symWriteSSC

要运行这个例子,你必须拥有的Simscape和符号数学工具箱许可证。

直流电机模型

一种直流电动机为将电能转换为机械能,并且反之亦然的装置。DC电机的示意图如下所示(左图)。在所提供的模拟直流电动机块的Simscape电气™(右图),这是一个可选产品的Simscape

在这个例子中,我们将使用管理常微分方程(常微分方程)推导出直流电动机的降阶模型表示。用于DC马达,所述电压和电流从基尔霍夫定律导出和机械转矩的公式从牛顿定律的。使用这些公式,我们可以实现自定义和参数的Simscape组件。

( J t w ( t ) = ( t ) - 博士 w ( t ) l t ( t ) + R ( t ) = V ( t ) - KB w ( t ) )

一个参数化组件的Simscape

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

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

类型MyMotorTemplate.ssc
部件MyMotorTemplate%定制直流电动机%该块实现一个定制的DC马达的节点P = foundation.electrical.electrical;% +:左n = foundation.electric .electrical;% -:左r =基础。机械。旋转。转动;% R:右c =基础。机械。旋转。转动;% C:右端参数R = {3.9, 'Ohm'};电枢电阻L = {0.000012, 'H'};%电枢电感J = {0.000001, 'kg*m^2'};%惯性Dr = {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 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 “亨利 - 电感的物理单元”。 Ω “欧姆 - 电阻的物理单元”。 ) [博士,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( '弧度')),1个* symunit( '公斤')* symunit('米')^符号(2),符号(1)*((symunit(' V ')* symunit(' S '))/ symunit(' 弧度 ')),符号(1)*((symunit(' N”)* symunit( 'M'))/ symunit( 'A')),symunit( 'H'),symunit( '欧姆')]

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

SYMS(parNames)SYMS
你象征性的变量是:J-博士KB文L R ANS

读取和显示组件变量的名称。利用ReturnFunction同时把这些变量转换成变量的函数t

[varFuns,varValues,varUnits] = symReadSSCVariables('MyMotorTemplate','ReturnFunction',真正的);VPA([varFuns; varValues; varUnits],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

SYMS(varFuns)SYMS
你的符号变量是:Dr J Ki R Vb t torque I Kb lv ans tau 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) +扭矩(t) == tau(t) - Dr*w(t)

eq2 = tau(t) == Ki*I(t)
EQ2 =
                 
                  
                   
                    
                     
                      
                       τ
                     
                     
                      
                       (
                      
                       
                        
                         t
                       
                      
                      
                       )
                     
                    
                    
                     =
                    
                     
                      
                      
                      
                      
                       
                        
                       
                       
                        
                         (
                        
                         
                          
                           t
                         
                        
                        
                         )
                       
                      
                     
                    
                   
                  
                 

用于电电压和电流的方程是eq3eq4V (t)VB(t)的分别表示施加的电压和反电动势。

EQ3 = L *的diff(I(t))的+ R * I(t)的== V(吨) -  VB(t)的
EQ3 =

l t ( t ) + R ( t ) = V ( t ) - VB ( t )

EQ4 = VB(吨)== KB *值w(t)
EQ4 =
                 
                  
                   
                    
                     
                      
                       
                        VB
                      
                      
                       
                        (
                       
                        
                         
                          t
                        
                       
                       
                        )
                      
                     
                     
                      =
                     
                      
                       
                        KB
                       
                       
                       
                        
                         
                          w
                        
                        
                         
                          (
                         
                          
                           
                            t
                          
                         
                         
                          )
                        
                       
                      
                     
                    
                   
                   
                    VB(T)== KB * W(T)
                  
                 

我们可以列出他们在一起。在这里,电机的扭矩被认为是成正比的电流。

方程=式([EQ1; EQ2; EQ3; EQ4])
公式=

( J t w ( t ) + 扭矩 ( t ) = τ ( t ) - 博士 w ( t ) τ ( t ) = ( t ) l t ( t ) + R ( t ) = V ( t ) - VB ( t ) VB ( t ) = KB w ( t ) )

解方程的左右两边。

操作数=儿童(方程);operList = [操作数{:}];LHS = operList(1:2:结束)
LHS =

( J t w ( t ) + 扭矩 ( t ) τ ( t ) l t ( t ) + R ( t ) VB ( t ) )

rhs = operList(2:2:结束)
RHS =
                 
                  
                   
                    
                     (
                    
                     
                      
                       
                        
                         
                          
                           
                            
                             τ
                           
                           
                            
                             (
                            
                             
                              
                               t
                             
                            
                            
                             )
                           
                          
                          
                           -
                          
                           
                            
                             博士
                            
                            
                            
                             
                              
                               w
                             
                             
                              
                               (
                              
                               
                                
                                 t
                               
                              
                              
                               )
                             
                            
                           
                          
                         
                        
                       
                      
                      
                       
                        
                         
                          
                          
                          
                          
                           
                            
                           
                           
                            
                             (
                            
                             
                              
                               t
                             
                            
                            
                             )
                           
                          
                         
                        
                       
                      
                      
                       
                        
                         
                          
                           
                            
                             V
                           
                           
                            
                             (
                            
                             
                              
                               t
                             
                            
                            
                             )
                           
                          
                          
                           -
                          
                           
                            
                             VB
                           
                           
                            
                             (
                            
                             
                              
                               t
                             
                            
                            
                             )
                           
                          
                         
                        
                       
                      
                      
                       
                        
                         
                          
                           KB
                          
                          
                          
                           
                            
                             w
                           
                           
                            
                             (
                            
                             
                              
                               t
                             
                            
                            
                             )
                           
                          
                         
                        
                       
                      
                     
                    
                    
                     )
                   
                  
                 

第二个和第四个方程定义了这些值τ(t)VB(t)的。为了将四个方程的方程组简化为两个方程的方程组,将这些值代入第一个和第三个方程。

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

J t w ( t ) + 扭矩 ( t ) = ( t ) - 博士 w ( t )

等式(2)=潜艇(方程(3),左轴(4),右轴(4))
公式=

( J t w ( t ) + 扭矩 ( t ) = ( t ) - 博士 w ( t ) l t ( t ) + R ( t ) = V ( t ) - KB w ( t ) )

方程“。
ans =

( J t w ( t ) + 扭矩 ( t ) = ( t ) - 博士 w ( t ) l t ( t ) + R ( t ) = V ( t ) - KB w ( t ) )

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

方程=潜艇(方程,[parNames,V(T)],[parValues,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二世

SYMSWW二世方程s_steady =子式(方程,[w(t),I(t)], [ww,ii]);结果=解决(ww, equations_steady ii);steadyStateW = vpa (result.ww, 10)
steadyStateW =
                 
                  
                   
                    
                     6.151120734
                   
                   
                    VPA( '6.151120734')
                  
                 
steadyStateI = vpa (result.ii, 10)
steadyStateI =
                 
                  
                   
                    
                     0.2562966973
                   
                   
                    vpa (“0.2562966973”)
                  
                 

解决时间相关方程数值上

用MATLAB软件对该符号表达式进行了数值模拟matlabFunctionODE45

创建一个有效的输入ODE45从符号方程。利用odeToVectorField创建表示动态系统的MATLAB程序 dY dt = f ( t , Y ) 在初始条件下 Y ( t 0 ) = Y 0

[vfEquations, tVals] = odeToVectorField(方程式)
vfEquations =

( 147573952589676412928 1770887431076117 - 6 Y 2 - 2877692075498690052096 Y 1 8854437155380585 83010348331692984375 Y 1 1152921504606846976 - 27670116110564328125 Y 2 9223372036854775808 ) [符号( '1770887431076117分之147573952589676412928') - 6 * Y(2) - (符号( '2877692075498690052096')* Y(1))/符号( '8854437155380585');(符号( '83010348331692984375')* Y(1))/符号( '1152921504606846976') - (符号( '27670116110564328125')* Y(2))/符号( '9223372036854775808')]

tVals =

( w )

M = matlabFunction (vfEquations“var”{“t”,“Y”})
M =与价值function_handle:@ (t、Y) [Y (1)。* (-3.25 e + 5) - Y (2) * 6.0 + 8.333333333333333 e + 4; Y (1)。* 7.2 e + 1 Y (2) * 3.0]。

用初值条件解微分方程W(0)= 0和我(0)= 0

解= ode45(M,[0 3],[0 0])
溶液=结构体字段:求解器: 'ODE45' 扩展数据:[1x1的结构]×:[1x293775双] Y:[2x293775双]统计:[1x1的结构] IDATA:[1x1的结构]

评估解决方案在该时间点之后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
steadyStateW =
                 
                  
                   
                    
                     6.151120734
                   
                   
                    VPA( '6.151120734')
                  
                 

画出的解决方案。

时间= linspace (0, - 2.5);iValues = deval(solution, time, 1);wValues = deval(solution, time, 2);steadyStateValuesI = vpa (steadyStateI * (1100), 10);steadyStateValuesW = vpa (steadyStateW * (1100), 10);图;plot1 =次要情节(2,1,1);plot2 =次要情节(2,1,2);情节(wValues plot1,时间,'蓝色',时间,steadyStateValuesW,“——红”,'行宽'(1) plot(plot2,时间,iValues,“绿色”、时间、steadyStateValuesI“——红”,'行宽'1)标题(plot1“直流电动机 - 角速度”)标题(plot2“直流电机-电流”)ylabel(plot1,“角速度[弧度/秒]”)ylabel(plot2,'电流[A]')xlabel(plot1,'时间[s]')xlabel(plot2,'时间[s]')图例(plot1,'值w(t)','值w(t):稳定状态','位置',“northeastoutside”)图例(plot2,'它)','I(t)为稳定状态','位置',“northeastoutside”)

创建的Simscape组件

保存在的Simscape使用你的数学模型回来。

使用原来的公式产生的Simscape代码方程式

symWriteSSC ('MyMotor.ssc','MyMotorTemplate.ssc',均衡器,...'H1Header',“%定制直流电动机,...“帮助文件”{“%此块实现了定制的DC马达”})

方法来显示生成的组件类型命令。

类型MyMotor.ssc
组件MyMotor %自定义直流电机%此块实现自定义直流电机节点p = foundation.electric .electrical;% +:左n = foundation.electric .electrical;% -:左r =基础。机械。旋转。转动;% R:右c =基础。机械。旋转。转动;% C:右端参数R = {3.9, 'Ohm'};电枢电阻L = {0.000012, 'H'};%电枢电感J = {0.000001, 'kg*m^2'};%惯性Dr = {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中;
在当前目录 '的/ t金宝appmp / Bdoc20a_1326390_83879 / tp12bdb807 /符号,ex98670381' 生成的Simulink库 'MyLib_lib' ...