主要内容

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

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

介绍

符号数学工具箱提供一种灵活的方法来开发任何空间尺寸的第一个工程原则的模型。您可以为稳态或瞬态物理学开发数学模型。

你可以开发和解决所需的方程来表示你的组件所需的物理;并在输入之间执行您自己的降阶模型映射X和一定数量的兴趣f (x)。

这里F是定制组件,其可以表示以何种形式的管理方程式:

  • 数学公式

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

本示例中的步骤是

  • 参数化SIMSCAPE组件使用symreadsscvariables.

  • 使用。为Simscape组件定义自定义方程

  • 用分析使用的稳态方程解决潜艇

  • 在MATLAB中数值求解时变方程matlabfunction.数值

  • 使用simscape组件使用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.
这个块实现了一个自定义直流电机节点p = foundation.electric .electrical;% +:左n = foundation.electric .electric;% -:左r = foundation.mechanical.rotation .rotation;c = foundation.mechanical. rotate . rotate;% C:右结束参数R ={3.9, '欧姆'};%电枢电阻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

从模板组件读取参数的名称,值和单位。

[帕扣,帕拉瓦,褶皱] = SymReadsScParameters('mymotortemplate');

将参数、它们的值和相应的单位显示为向量。

VPA([滞后;帕拉瓦斯;鹦鹉],10)
ans =.

博士 j Kb Ki L. R. 0.000003 0.000001 0.000072 0.000072 0.000012 3.9 1 N “牛顿——力的物理单位。” m “仪表 - 长度的物理单位。” S. “第二 - 一个物理单位。” Rad. “弧度 - 平面角度的物理单位”。 1 公斤 千克——质量的物理单位。 m “仪表 - 长度的物理单位。” 2 1 V. “伏 - 电势的物理单元。” S. “第二 - 一个物理单位。” Rad. “弧度 - 平面角度的物理单位”。 1 N “牛顿——力的物理单位。” m “仪表 - 长度的物理单位。” 一种 安培——电流的物理单位。 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.函数。参数在工作区中显示为符号变量。您可以使用WHO列出工作区中的变量。

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

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

[varfuns,varvalues,amarunits] = symreadsscvariables('mymotortemplate''返回功能',真正的);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 “牛顿——力的物理单位。” m “仪表 - 长度的物理单位。” 1 N “牛顿——力的物理单位。” m “仪表 - 长度的物理单位。” 1 Rad. “弧度 - 平面角度的物理单位”。 S. “第二 - 一个物理单位。”

通过使用使用的将变量名添加到MATLAB工作区Syms.函数。变量在工作区中以符号函数的形式出现。验证您已经使用声明了所有必需的符号变量和函数Syms.

Syms(varfuns)syms
您的符号变量是:J Ki R VB T扭矩I kb l v ans tau w

为Simscape组件定义自定义方程

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

机械扭矩的微分方程被定义为EQ1.EQ2.它)表示当前和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.
                       
                      
                      
                     
                    
                    
                     =
                    
                     
                      
                       Ki
                      
                      
                      
                       
                        
                         一世
                       
                       
                        
                        
                         
                          
                           T.
                         
                        
                        
                       
                      
                     
                    
                   
                  
                 

电压和电流的方程是EQ3.EQ4.v(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)
                  
                 

我们可以一起列出它们。这里,假设电动机的扭矩与电流成比例。

方程式=公式([eq1;eq2;eq3;eq4])
方程式=

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:结束)
LHS =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}

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

等式(1)=潜艇(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

equations = subs(equations, [parNames,V(t)], [parValues,1]);式= subs(式,转矩,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.IIarequations_steady = sumb(方程式,[w(t),i(t)],[ww,ii]);结果=解决(方程式,WW,II);seedionstatew = VPA(结果.ww,10)
stignedstatew =
                 
                  
                   
                    
                     6.151120734.
                   
                   
                    VPA('6.151120734')
                  
                 
stiefaedstatei = VPA(结果.II,10)
stiefaseStatei =
                 
                  
                   
                    
                     0.2562966973
                   
                   
                    VPA('0.2562966973')
                  
                 

数值求解时变方程

使用使用数值模拟MATLAB中的符号表达式matlabfunction.数值

创建一个有效的输入数值从符号方程。使用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('147573952589676412928/1770887431076117') - 6*Y(2) - (sym('2877692075498690052096')*Y(1))/sym('8854437155380585');(信谊(83010348331692984375)* Y(1)) /符号(' 1152921504606846976 ')-(信谊(27670116110564328125)* Y(2)) /信谊(9223372036854775808)]

tVals =

一世 W.

m = matlabfunction(vfequation,'vars', {'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 struct] x: [1x293775 double] y: [2x293775 double] stats: [1x1 struct] data: [1x1 struct]

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

Deval(解决方案,0.5),Deval(解决方案,.75),Deval(解决方案,1)
ans =.2×10.2563 4.7795
ans =.2×10.2563 5.5034
ans =.2×10.2563 5.8453
耳段稳定
stignedstatew =
                 
                  
                   
                    
                     6.151120734.
                   
                   
                    VPA('6.151120734')
                  
                 

策划解决方案。

时间= linspace(0,2.5);Ivalues = Deval(解决方案,时间,1);wvalues = deval(解决方案,时间,2);stiewsedstatevaluesi = VPA(稳定STESI * ONE(1,100),10);stiewsedstatevaluesw = VPA(侧稳态* vpa(1,100),10);数字;plot1 =子图(2,1,1);plot2 =子图(2,1,2);情节(Plot1,Time,Wvalues,'蓝色的',时间,steedstaltevaluesw,' - 红色的''行宽',1)绘图(Plot2,时间,Ivalues,'绿色',时间,稳定的valuesi,' - 红色的''行宽',1)标题(Plot1,'直流电动机 - 角速度')标题(Plot2,'直流电机 - 电流') ylabel (plot1“角速度(rad / s)”) ylabel (plot2'当前[a]')包含(plot1'时间[S]')包含(plot2'时间[S]')传奇(Plot1,“w (t)”“w (t):稳态”“位置”“东北朝”)传奇(Plot2,“我(t)”'我(t):稳态'“位置”“东北朝”

创建SIMSCAPE组件

将数学模型保存回来,以便在Simscape中使用。

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

Symwritessc(“MyMotor.ssc”'mymotortemplate.ssc'方程式,...'h1header'“%自定义直流电机”...“HelpText”, {这个block实现了一个自定义的直流电机})

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

类型MyMotor.ssc
组件MyMotor%定制直流电机%该块实现了自定义直流电机节点P =基础。电极;% +:左n = foundation.electric .electric;% -:左r = foundation.mechanical.rotation .rotation;c = foundation.mechanical. rotate . rotate;% C:右结束参数R ={3.9, '欧姆'};%电枢电阻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_Build.MyLib;
在当前目录'/ tmp金宝app / bdoc20b_1498024_210669 / tp0a191783 / symbolic-ex98670381'中生成Simulink Library'MyLib_lib'。