|
| 1 | +module MotorControl |
| 2 | + |
| 3 | +println("\nMotorControl: Demonstrating the ability to simulate hierarchical mixed domain models") |
| 4 | + |
| 5 | +using Modia, ModiaPlot, Measurements |
| 6 | + |
| 7 | +export MotorControl2 |
| 8 | + |
| 9 | +MotorControl1 = Model( |
| 10 | + step = Modia.Step | Map(height=4.7*u"A", offset=0u"A"), |
| 11 | + feedback = Modia.Feedback, |
| 12 | + PI = Modia.PI | Map(T=0.005u"s", k=30, x = Var(init=0.0u"A")), |
| 13 | + firstOrder = Modia.FirstOrder | Map(k=1u"V/A", T=0.001u"s", x = Var(init=0.0u"V")), |
| 14 | + |
| 15 | + signalVoltage = Modia.SignalVoltage, |
| 16 | + resistor = Modia.Resistor | Map(R=13.8u"Ω"), |
| 17 | + inductor = Modia.Inductor | Map(L=0.061u"H"), |
| 18 | + emf = Modia.EMF | Map(k=1.016u"N*m/A"), |
| 19 | + ground = Modia.Ground, |
| 20 | + currentSensor = Modia.CurrentSensor, |
| 21 | + |
| 22 | + motorInertia = Modia.Inertia | Map(J=0.0025u"kg*m^2"), |
| 23 | + idealGear = Modia.IdealGear | Map(ratio=105), |
| 24 | + springDamper = Modia.SpringDamper | Map(c=5.0e5u"N*m/rad", d=500u"N*m*s/rad"), |
| 25 | + loadInertia = Modia.Inertia | Map(J=100u"kg*m^2"), |
| 26 | + tload = Modia.Torque, |
| 27 | + |
| 28 | + equations = :[ |
| 29 | + tload.tau = 0.0u"N*m", |
| 30 | + ], |
| 31 | + |
| 32 | + connect = :[ |
| 33 | + (step.y, feedback.u1) |
| 34 | + (feedback.y, PI.u) |
| 35 | + (PI.y, firstOrder.u) |
| 36 | + (firstOrder.y, signalVoltage.v) |
| 37 | + |
| 38 | + (signalVoltage.p, resistor.p) |
| 39 | + (resistor.n, inductor.p) |
| 40 | + (inductor.n, emf.p) |
| 41 | + (emf.n, ground.p, currentSensor.p) |
| 42 | + (currentSensor.n, signalVoltage.n) |
| 43 | + (currentSensor.i, feedback.u2) |
| 44 | + |
| 45 | + (emf.flange, motorInertia.flange_a) |
| 46 | + (motorInertia.flange_b, idealGear.flange_a) |
| 47 | + (idealGear.flange_b, springDamper.flange_a) |
| 48 | + (springDamper.flange_b, loadInertia.flange_a) |
| 49 | + (tload.flange, loadInertia.flange_b) ] |
| 50 | +) |
| 51 | + |
| 52 | +model = @instantiateModel(MotorControl1, log=false) |
| 53 | +println("Simulate") |
| 54 | +@time simulate!(model, stopTime=0.1, tolerance=1e-6, log=false, requiredFinalStates = |
| 55 | + [3.487844601078223, 106.82874860310305, 4.616087152802267, 2.014120727821878, 41.98048886114646, 0.018332432934516536, 0.3725930536373392]) |
| 56 | +plot(model, [("currentSensor.i", "step.y"), "loadInertia.w"], figure=1) |
| 57 | + |
| 58 | + |
| 59 | +# Hierarchical model |
| 60 | + |
| 61 | +ControlledMotor = Model( |
| 62 | + refCurrent = input, |
| 63 | + feedback = Modia.Feedback, |
| 64 | + PI = Modia.PI | Map(T=0.005u"s", k=30, x = Var(init=0.0u"A")), |
| 65 | + firstOrder = Modia.FirstOrder | Map(k=1u"V/A", T=0.001u"s", x = Var(init=0.0u"V")), |
| 66 | + |
| 67 | + signalVoltage = Modia.SignalVoltage, |
| 68 | + resistor = Modia.Resistor | Map(R=13.8u"Ω"), |
| 69 | + inductor = Modia.Inductor | Map(L=0.061u"H"), |
| 70 | + emf = Modia.EMF | Map(k=1.016u"N*m/A"), |
| 71 | + ground = Modia.Ground, |
| 72 | + currentSensor = Modia.CurrentSensor, |
| 73 | + |
| 74 | + motorInertia = Modia.Inertia | Map(J=0.0025u"kg*m^2"), |
| 75 | + flange = Modia.Flange, |
| 76 | + |
| 77 | + connect = :[ |
| 78 | + (refCurrent, feedback.u1) |
| 79 | + (feedback.y, PI.u) |
| 80 | + (PI.y, firstOrder.u) |
| 81 | + (firstOrder.y, signalVoltage.v) |
| 82 | + |
| 83 | + (signalVoltage.p, resistor.p) |
| 84 | + (resistor.n, inductor.p) |
| 85 | + (inductor.n, emf.p) |
| 86 | + (emf.n, ground.p, currentSensor.p) |
| 87 | + (currentSensor.n, signalVoltage.n) |
| 88 | + (currentSensor.i, feedback.u2) |
| 89 | + |
| 90 | + (emf.flange, motorInertia.flange_a) |
| 91 | + (motorInertia.flange_b, flange) ] |
| 92 | +) |
| 93 | + |
| 94 | +MotorControl2 = Model( |
| 95 | + step = Modia.Step | Map(height=4.7*u"A", offset=0u"A"), |
| 96 | + |
| 97 | + controlledMotor = ControlledMotor, |
| 98 | + |
| 99 | + idealGear = Modia.IdealGear | Map(ratio=105), |
| 100 | + springDamper = Modia.SpringDamper | Map(c=5.0e5u"N*m/rad", d=500u"N*m*s/rad"), |
| 101 | + loadInertia = Modia.Inertia | Map(J=100.0u"kg*m^2"), |
| 102 | + tload = Modia.Torque, |
| 103 | + |
| 104 | + equations = :[ |
| 105 | + tload.tau = 0.0u"N*m", |
| 106 | + ], |
| 107 | + |
| 108 | + connect = :[ |
| 109 | + (step.y, controlledMotor.refCurrent) |
| 110 | + |
| 111 | + (controlledMotor.flange, idealGear.flange_a) |
| 112 | + (idealGear.flange_b, springDamper.flange_a) |
| 113 | + (springDamper.flange_b, loadInertia.flange_a) |
| 114 | + (tload.flange, loadInertia.flange_b) ] |
| 115 | +) |
| 116 | + |
| 117 | +model = @instantiateModel(MotorControl2) |
| 118 | +println("Simulate") |
| 119 | +@time simulate!(model, stopTime=0.1, tolerance=1e-6, log=false, requiredFinalStates = |
| 120 | + [3.487844601078223, 106.82874860310305, 4.616087152802267, 2.014120727821878, 41.98048886114646, 0.018332432934516536, 0.3725930536373392]) |
| 121 | +plot(model, [("controlledMotor.currentSensor.i", "step.y"), "loadInertia.w"], figure=1) |
| 122 | + |
| 123 | + |
| 124 | +# Model with uncertainties |
| 125 | + |
| 126 | +MotorControlWithUncertainties = MotorControl2 | Map( loadInertia = Map(J=(100.0 ± 10)*u"kg*m^2"), controlledMotor = Map(PI = Map(k=30 ± 3) ) ) |
| 127 | + |
| 128 | +model = @instantiateModel(MotorControlWithUncertainties, FloatType = Measurement{Float64}) |
| 129 | +println("Simulate") |
| 130 | +@time simulate!(model, stopTime=0.1, tolerance=1e-6, log=false) |
| 131 | +plot(model, [("controlledMotor.currentSensor.i", "step.y"), "loadInertia.w"], figure=1) |
| 132 | + |
| 133 | +end |
| 134 | + |
| 135 | +#= |
| 136 | +module MotorControlModuleMonteCarlo |
| 137 | +
|
| 138 | +using ModiaBase.ModiaLang |
| 139 | +using Unitful |
| 140 | +using Main.MotorControlModule |
| 141 | +include("../test/SimulateAndPlot.jl") |
| 142 | +
|
| 143 | +using MonteCarloMeasurements |
| 144 | +
|
| 145 | +# Model with Monte Carlo |
| 146 | +
|
| 147 | +MotorControlWithUncertainties = MotorControl2 | Map( loadInertia = Map(J=(100.0 ∓ 10)), controlledMotor = Map(PI = Map(k=30 ∓ 3) ) ) |
| 148 | +
|
| 149 | +model = @instantiateModel(MotorControlWithUncertainties, FloatType = StaticParticles{Float64,100}, unitless=true) |
| 150 | +println("Simulate") |
| 151 | +@time simulate!(model, stopTime=0.1, tolerance=1e-6, log=false) |
| 152 | +plot(model, [("controlledMotor.currentSensor.i", "step.y"), "loadInertia.w"], figure=1) |
| 153 | +
|
| 154 | +end |
| 155 | +=# |
0 commit comments