Создайте пользовательские компоненты на основе уравнений для библиотеки Simscape с помощью Symbolic Math Toolbox.
Symbolic Math Toolbox предоставляет гибкий способ разработки моделей из первых технических принципов в любой пространственной размерности. Можно разработать математические модели для устойчивого состояния или переходной физики.
Можно разработать и решить уравнения, необходимые для представления физики, необходимой для вашего компонента; и выполните собственное отображение модели пониженного порядка между входами x и величиной интереса f (x).
Здесь f - собственный компонент, который может представлять управляющие уравнения в виде:
Математические формулы
Численные симуляции ОДУ и PDE
Шаги в этих примерах:
Параметризация компонента Simscape с помощью symReadSSCVariables
Задайте пользовательские уравнения для компонента Simscape с помощью diff
Решите статические уравнения аналитически, используя solve
и subs
Решите зависящие от времени уравнения численно в MATLAB при помощи matlabFunction
и ode45
Создайте компонент Simscape с помощью symWriteSSC
Чтобы запустить этот пример, вы должны иметь лицензии для Simscape и Symbolic Math Toolbox.
Двигатель постоянного тока является устройством для преобразования электрической энергии в механическую энергию и наоборот. Схема двигателя постоянного тока показана ниже (левый рисунок). Блоки, которые моделируют двигатели постоянного тока, представлены в Simscape Electrical™ (правый рисунок), что является необязательным продуктом для Simscape.
В этом примере мы выведем представление модели пониженного порядка двигателя постоянного тока с помощью управляющих Обыкновенных дифференциальных уравнений (ОДУ). Для двигателя постоянного тока электрическое напряжение и ток получают из законов Кирхгофа, а формула механического крутящего момента - из законов Ньютона. Используя эти уравнения, мы можем реализовать пользовательский и параметрический компонент Simscape.
Предположим, у вас есть компонент Simscape MyMotorTemplate.ssc
в текущей папке или по пути MATLAB по умолчанию. Этот компонент еще не имеет уравнений. Шаблон записывает параметры и переменные, которые будут использоваться для разработки нашего двигателя. Можно использовать type
для предварительного просмотра этого шаблона.
type MyMotorTemplate.ssc
component MyMotorTemplate % Custom DC Motor % This block implements a custom DC motor nodes p = foundation.electrical.electrical; % +:left n = foundation.electrical.electrical; % -:left r = foundation.mechanical.rotational.rotational; % R:right c = foundation.mechanical.rotational.rotational; % C:right end parameters R = {3.9, 'Ohm'}; %Armature resistance L = {0.000012, 'H'}; %Armature inductance J = {0.000001, 'kg*m^2'}; %Inertia Dr = {0.000003, '(N*m*s)/rad'}; %Rotor damping Ki = {0.000072, '(N*m)/A'}; %Torque constant 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 при помощи syms
функция. Параметры появляются как символьные переменные в рабочей области. Можно использовать who
для перечисления переменных в рабочей области.
syms(parNames) syms
Your symbolic variables are: Dr J Kb Ki L R ans
Считывайте и отображайте имена переменных компонента. Использование ReturnFunction
для одновременного преобразования этих переменных в функции переменной t
.
[varFuns, varValues, varUnits] = symReadSSCVariables('MyMotorTemplate', 'ReturnFunction', true); vpa([varFuns; varValues; varUnits],10)
ans =
Добавьте имена переменных в Рабочее пространство MATLAB с помощью syms
функция. Переменные появляются как символьные функции в рабочей области. Проверьте, что вы объявили все необходимые символьные переменные и функции, используя syms
.
syms(varFuns) syms
Your symbolic variables are: Dr J Ki R Vb t torque I Kb L V ans tau w
Дифференциальные уравнения для механического крутящего момента заданы как eq1
и eq2
. I(t)
представляет ток и w(t)
скорости вращения.
eq1 = torque + 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 =
Мы можем перечислить их вместе. Здесь крутящий момент мотора принимается пропорциональным току.
eqs = formula([eq1; eq2; eq3; eq4])
eqs =
Извлеките левую и правую стороны уравнений.
operands = children(eqs); operList = [ operands{:} ]; lhs = operList(1:2:end)
lhs=1×4 cell array
{1x1 sym} {1x1 sym} {1x1 sym} {1x1 sym}
rhs = operList(2:2:end)
rhs=1×4 cell array
{1x1 sym} {1x1 sym} {1x1 sym} {1x1 sym}
Второе и четвертое уравнения определяют значения tau(t)
и Vb(t)
. Чтобы упростить систему четырёх уравнений к системе двух уравнений, замените эти значения в первое и третье уравнения.
equations(1) = subs(eqs(1), lhs(2), rhs(2))
equations =
equations(2) = subs(eqs(3), lhs(4), rhs(4))
equations =
equations.'
ans =
Перед решением уравнений замените параметры числовыми значениями. Кроме того, используйте V(t) = 1
.
equations = subs(equations, [parNames,V(t)], [parValues,1]); equations = subs(equations, torque, 0); vpa(equations.',10)
ans =
Для этого удалите временную зависимость для функций w(t)
и I(t)
. Для примера замените их символьными переменными ww
и ii
.
syms ww ii equations_steady = subs(equations, [w(t),I(t)], [ww,ii]); result = solve(equations_steady,ww,ii); steadyStateW = vpa(result.ww,10)
steadyStateW =
steadyStateI = vpa(result.ii,10)
steadyStateI =
matlabFunction
и ode45
.Создайте допустимый вход для ode45
из символьных уравнений. Использование odeToVectorField
чтобы создать процедуру MATLAB, которая представляет динамическую систему с начальным условием .
[vfEquations, tVals] = odeToVectorField(equations)
vfEquations =
tVals =
M = matlabFunction(vfEquations,'Vars', {'t','Y'})
M = function_handle with value:
@(t,Y)[Y(1).*(-3.25e+5)-Y(2).*6.0+8.333333333333333e+4;Y(1).*7.2e+1-Y(2).*3.0]
Решить дифференциальное уравнение используя начальные условия w(0) = 0
и я (0) = 0
.
solution = ode45(M,[0 3],[0 0])
solution = struct with fields:
solver: 'ode45'
extdata: [1x1 struct]
x: [1x293775 double]
y: [2x293775 double]
stats: [1x1 struct]
idata: [1x1 struct]
Оцените решение в следующие точки времени t = [0.5,0,75,1]. Первым значением является текущее I(t)
и второе значение является скоростью вращения w(t)
. Мы видим, что решение для скорости вращения начинает приближаться к установившемуся состоянию steadyStateW
.
deval(solution,0.5), deval(solution,.75), deval(solution,1)
ans = 2×1
0.2563
4.7795
ans = 2×1
0.2563
5.5034
ans = 2×1
0.2563
5.8453
steadyStateW
steadyStateW =
Постройте график решения.
time = linspace(0,2.5); iValues = deval(solution, time, 1); wValues = deval(solution, time, 2); steadyStateValuesI = vpa(steadyStateI*ones(1,100),10); steadyStateValuesW = vpa(steadyStateW*ones(1,100),10); figure; plot1 = subplot(2,1,1); plot2 = subplot(2,1,2); plot(plot1, time, wValues, 'blue', time, steadyStateValuesW, '--red', 'LineWidth', 1) plot(plot2, time, iValues, 'green', time, steadyStateValuesI, '--red', 'LineWidth', 1) title(plot1, 'DC Motor - angular velocity') title(plot2, 'DC Motor - current') ylabel(plot1, 'Angular velocity [rad/s]') ylabel(plot2, 'Current [A]') xlabel(plot1, 'time [s]') xlabel(plot2, 'time [s]') legend(plot1, 'w(t)', 'w(t): steady state', 'Location', 'northeastoutside') legend(plot2, 'I(t)', 'I(t): steady state', 'Location', 'northeastoutside')
Сгенерируйте код Simscape, используя исходные уравнения eqs
.
symWriteSSC('MyMotor.ssc', 'MyMotorTemplate.ssc', eqs, ... 'H1Header', '% Custom DC Motor', ... 'HelpText', {'% This block implements a custom DC motor'})
Отображение сгенерированного компонента при помощи type
команда.
type MyMotor.ssc
component MyMotor % Custom DC Motor % This block implements a custom DC motor nodes p = foundation.electrical.electrical; % +:left n = foundation.electrical.electrical; % -:left r = foundation.mechanical.rotational.rotational; % R:right c = foundation.mechanical.rotational.rotational; % C:right end parameters R = {3.9, 'Ohm'}; %Armature resistance L = {0.000012, 'H'}; %Armature inductance J = {0.000001, 'kg*m^2'}; %Inertia Dr = {0.000003, '(N*m*s)/rad'}; %Rotor damping Ki = {0.000072, '(N*m)/A'}; %Torque constant 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 из сгенерированного компонента.
if ~isdir('+MyLib') mkdir +MyLib; end copyfile MyMotor.ssc +MyLib; ssc_build MyLib;
Generating Simulink library 'MyLib_lib' in the current directory '/tmp/BR2021ad_1657350_232851/mlx_to_docbook18/tpffc34045/symbolic-ex98670381' ...