自定义和扩展Simscape库自定义直流电机
使用符号数学工具箱™为Simscape库创建一个基于组件的自定义方程。
简介
的符号数学工具箱提供了一种在任何空间维度上从第一工程原理开发模型的灵活方法。你可以为稳态或瞬态物理建立数学模型。
您可以开发和解决所需的方程式,以表示您的组件所必需的物理;并在输入之间执行您自己的降阶模型映射x还有一些利息f (x)。
在这里f是可表示控制方程的自定义组件,形式为:
数学公式
ode和pde的数值模拟
本例中的步骤如下
使用参数化Simscape™组件
symReadSSCVariables
为您的Simscape组件定义自定义方程式
diff
用解析法求解稳态方程
解决
而且潜艇
用MATLAB®数值求解时变方程
matlabFunction
而且数值
使用。创建Simscape组件
symWriteSSC
要运行此示例,您必须拥有Simscape和Symbolic Math Toolbox的许可证。
直流电机型号
直流电动机是一种将电能转换为机械能的装置,反之亦然。直流电机的原理图如下所示(左图)。中提供了模拟直流电机的块Simscape电™(右图),它是用于Simscape.
在本例中,我们将使用常微分方程(ode)导出直流电机的降阶模型表示。对于直流电动机,电压和电流由基尔霍夫定律导出,机械转矩公式由牛顿定律导出。使用这些方程,我们可以实现自定义的参数化Simscape组件。
参数化Simscape组件
导入模板组件的参数和变量
假设您有一个Simscape组件MyMotorTemplate.ssc
在您的当前文件夹或默认的MATLAB路径。这个分量还没有方程。该模板记录了将用于开发我们的电机的参数和变量。你可以使用类型
以提供该模板的预览。
类型MyMotorTemplate.ssc
这个块实现了一个自定义直流电机节点p = foundation.electric .electric;% +:left n = foundation.electric .electric;% -:left r = foundation.mechanical. rotate . rotate;% R:右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
从模板组件读取参数的名称、值和单位。
[parNames, parValues, parUnits] = symReadSSCParameters(“MyMotorTemplate”);
以矢量的形式显示参数、它们的值和相应的单位。
vpa ([parNames;parValues;parUnits), 10)
ans =
函数将参数名称添加到MATLAB工作区信谊
函数。参数在工作区中显示为符号变量。你可以使用谁
列出工作区中的变量。
信谊(parNames)对称
你的符号变量是:Dr J Kb Ki L R ans
读取并显示组件变量的名称。使用ReturnFunction
同时将这些变量转换为变量的函数t
.
[varfun, varValues, varUnits] = symReadSSCVariables(“MyMotorTemplate”,“ReturnFunction”,真正的);vpa ([varFuns;varValues;varUnits), 10)
ans =
函数将变量名称添加到MATLAB工作区信谊
函数。变量在工作区中以符号函数的形式出现。验证您已经使用声明了所有必需的符号变量和函数信谊
.
信谊(varFuns)对称
你的符号变量是:Dr J Ki R Vb t扭矩I Kb L V ans tau w
为您的Simscape组件定义自定义方程
定义直流电动机建模的方程组
机械力矩的微分方程定义为eq1
而且eq2
.我(t)
表示当前和w (t)
角速度。
eq1 =转矩+ J*diff(w(t)) == -Dr*w(t) + tau(t)
eq1 (t) =
eq2 = tau(t) = Ki*I(t)
eq2 =
电压和电流的方程是eq3
而且eq4
.V (t)而且Vb (t)分别表示外加电压和反电动势。
eq3 = L*diff(I(t)) + R*I(t) = V(t) - Vb(t)
eq3 =
eq4 = Vb(t) == Kb*w(t)
eq4 =
我们可以把它们列在一起。这里,电机的转矩被假定为与电流成正比。
方程式=公式([eq1;eq2;eq3;eq4])
方程式=
提取方程的左右两边。
操作数= children(eqs);operList =[操作数{:}];lhs = operList(1:2:end)
lh =1×4单元格数组{[J * diff (w (t), t…]} {[tau(t)]} {[L*diff(I(t), t…]} {(Vb (t))}
rhs = operList(2:2:end)
rhs =1×4单元格数组{(τ(t) - * w (t)博士]}{[Ki *我(t)]} {[V (t) - Vb (t)]} {(Kb * w (t))}
第二个和第四个方程定义了数值τ(t)
而且Vb (t)
.要将四个方程简化为两个方程,请将这些值代入第一个和第三个方程。
公式(1)= subs(eqs(1), lhs(2), rhs(2))
公式=
式(2)= subs(eqs(3), lhs(4), rhs(4))
公式=
方程”。
ans =
在求解方程之前,先用参数的数值代替参数。此外,使用V(t) = 1
.
方程= subs(方程,[parNames,V(t)], [parValues,1]);方程= subs(方程,扭矩,0);vpa(方程。',10)
ans =
解析求解稳态方程
解稳态方程。
为此,去掉函数的时间依赖关系w (t)
而且我(t)
.例如,用符号变量代替它们ww
而且2
.
信谊ww2equations_steady = subs(方程,[w(t),I(t)], [ww,ii]);Result = solve(equations_steady,ww,ii);steadyStateW = vpa(result.ww,10)
steadyStateW =
stabystatei = vpa(result.ii,10)
steadyStateI =
数值求解时间相关方程
在MATLAB中对符号表达式进行数值模拟matlabFunction
而且数值
.
为创建有效的输入数值
从符号方程。使用odeToVectorField
创建了表示动力系统的MATLAB程序
在初始条件下
.
[vfEquations, tVals] = odeToVectorField(方程)
vfEquations =
tVals =
M = matlabFunction“var”, {“t”,“Y”})
M =Function_handle with value:@ (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])
解决方案=带字段的结构:Solver: 'ode45' extdata: [1x1 struct] x: [0 2.4114e-09 1.4468e-08 7.4754e-08 3.7618e-07 1.8833e-06…[y: [2x293775 double] stats: [1x1 struct] idata: [1x1 struct]
在以下时间点评估解决方案t=(0.5, 0.75, 1)。第一个值是当前值我(t)
第二个值是角速度w (t)
.我们看到角速度的解开始趋于稳态steadyStateW
.
Deval(溶液,0.5),Deval(溶液,0.75),Deval(溶液,1)
ans =2×10.2563 - 4.7795
ans =2×10.2563 - 5.5034
ans =2×10.2563 - 5.8453
steadyStateW
steadyStateW =
画出解。
时间= linspace(0,2.5);iValues = deval(解,时间,1);wValues = deval(解,时间,2);stabystatevalesi = vpa(stabystatei *ones(1100),10);stabystatevaluesw = vpa(stabystatew *ones(1100),10);图;Plot1 = subplot(2,1,1);Plot2 = subplot(2,1,2);plot(plot1, time, wValues,“蓝”,时间,steadyStateValuesW“——红”,“线宽”, 1) plot(plot2,时间,iValues,“绿色”,时间,steadyStateValuesI“——红”,“线宽”, 1)标题(plot1,“直流电动机角速度”)标题(plot2“直流电机-电流”) ylabel (plot1角速度[rad/s]) ylabel (plot2“当前的(一个)”)包含(plot1“时间[s]”)包含(plot2“时间[s]”)传说(plot1“w (t)”,w(t):稳态,“位置”,“northeastoutside”)传说(plot2“我(t)”,I(t):稳态,“位置”,“northeastoutside”)
创建一个Simscape组件
保存您的数学模型以便在Simscape中使用。
使用原始方程式生成Simscape代码方程式
.
symWriteSSC (“MyMotor.ssc”,“MyMotorTemplate.ssc”方程式,...“H1Header”,%自定义直流电动机,...“HelpText”, {'%此块实现自定义直流电机'})
控件显示生成的组件类型
命令。
类型MyMotor.ssc
这个块实现了一个自定义的直流电机节点p = foundation.electric .electric;% +:left n = foundation.electric .electric;% -:left r = foundation.mechanical. rotate . rotate;% R:右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_buildMyLib;
在当前目录下/tmp/万博1manbetxBdoc22a_1891349_137947/tp78b49e9d/symbolic-ex98670381生成Simulink库MyLib_lib…