| 1 | package ModelicaServices
|
|---|
| 2 | package Machine
|
|---|
| 3 | final constant Real eps = 1.e-15;
|
|---|
| 4 | final constant Real small = 1.e-60;
|
|---|
| 5 | final constant Real inf = 1.e+60;
|
|---|
| 6 | final constant Integer Integer_inf = OpenModelica.Internal.Architecture.integerMax();
|
|---|
| 7 | end Machine;
|
|---|
| 8 | end ModelicaServices;
|
|---|
| 9 |
|
|---|
| 10 | package Modelica
|
|---|
| 11 | package Blocks
|
|---|
| 12 | package Continuous
|
|---|
| 13 | block Derivative
|
|---|
| 14 | parameter Real k(unit = "1") = 1;
|
|---|
| 15 | parameter .Modelica.SIunits.Time T(min = Modelica.Constants.small) = 0.01;
|
|---|
| 16 | parameter Modelica.Blocks.Types.Init initType = Modelica.Blocks.Types.Init.NoInit;
|
|---|
| 17 | parameter Real x_start = 0;
|
|---|
| 18 | parameter Real y_start = 0;
|
|---|
| 19 | extends .Modelica.Blocks.Interfaces.SISO;
|
|---|
| 20 | output Real x(start = x_start);
|
|---|
| 21 | protected
|
|---|
| 22 | parameter Boolean zeroGain = abs(k) < Modelica.Constants.eps;
|
|---|
| 23 | initial equation
|
|---|
| 24 | if initType == .Modelica.Blocks.Types.Init.SteadyState then
|
|---|
| 25 | der(x) = 0;
|
|---|
| 26 | elseif initType == .Modelica.Blocks.Types.Init.InitialState then
|
|---|
| 27 | x = x_start;
|
|---|
| 28 | elseif initType == .Modelica.Blocks.Types.Init.InitialOutput then
|
|---|
| 29 | if zeroGain then
|
|---|
| 30 | x = u;
|
|---|
| 31 | else
|
|---|
| 32 | y = y_start;
|
|---|
| 33 | end if;
|
|---|
| 34 | end if;
|
|---|
| 35 | equation
|
|---|
| 36 | der(x) = if zeroGain then 0 else (u - x) / T;
|
|---|
| 37 | y = if zeroGain then 0 else k / T * (u - x);
|
|---|
| 38 | end Derivative;
|
|---|
| 39 |
|
|---|
| 40 | block FirstOrder
|
|---|
| 41 | parameter Real k(unit = "1") = 1;
|
|---|
| 42 | parameter .Modelica.SIunits.Time T(start = 1);
|
|---|
| 43 | parameter Modelica.Blocks.Types.Init initType = Modelica.Blocks.Types.Init.NoInit;
|
|---|
| 44 | parameter Real y_start = 0;
|
|---|
| 45 | extends .Modelica.Blocks.Interfaces.SISO(y(start = y_start));
|
|---|
| 46 | initial equation
|
|---|
| 47 | if initType == .Modelica.Blocks.Types.Init.SteadyState then
|
|---|
| 48 | der(y) = 0;
|
|---|
| 49 | elseif initType == .Modelica.Blocks.Types.Init.InitialState or initType == .Modelica.Blocks.Types.Init.InitialOutput then
|
|---|
| 50 | y = y_start;
|
|---|
| 51 | end if;
|
|---|
| 52 | equation
|
|---|
| 53 | der(y) = (k * u - y) / T;
|
|---|
| 54 | end FirstOrder;
|
|---|
| 55 |
|
|---|
| 56 | block PI
|
|---|
| 57 | parameter Real k(unit = "1") = 1;
|
|---|
| 58 | parameter .Modelica.SIunits.Time T(start = 1, min = Modelica.Constants.small);
|
|---|
| 59 | parameter Modelica.Blocks.Types.Init initType = Modelica.Blocks.Types.Init.NoInit;
|
|---|
| 60 | parameter Real x_start = 0;
|
|---|
| 61 | parameter Real y_start = 0;
|
|---|
| 62 | extends .Modelica.Blocks.Interfaces.SISO;
|
|---|
| 63 | output Real x(start = x_start);
|
|---|
| 64 | initial equation
|
|---|
| 65 | if initType == .Modelica.Blocks.Types.Init.SteadyState then
|
|---|
| 66 | der(x) = 0;
|
|---|
| 67 | elseif initType == .Modelica.Blocks.Types.Init.InitialState then
|
|---|
| 68 | x = x_start;
|
|---|
| 69 | elseif initType == .Modelica.Blocks.Types.Init.InitialOutput then
|
|---|
| 70 | y = y_start;
|
|---|
| 71 | end if;
|
|---|
| 72 | equation
|
|---|
| 73 | der(x) = u / T;
|
|---|
| 74 | y = k * (x + u);
|
|---|
| 75 | end PI;
|
|---|
| 76 | end Continuous;
|
|---|
| 77 |
|
|---|
| 78 | package Interfaces
|
|---|
| 79 | connector RealInput = input Real;
|
|---|
| 80 | connector RealOutput = output Real;
|
|---|
| 81 |
|
|---|
| 82 | partial block SO
|
|---|
| 83 | RealOutput y;
|
|---|
| 84 | end SO;
|
|---|
| 85 |
|
|---|
| 86 | partial block MO
|
|---|
| 87 | parameter Integer nout(min = 1) = 1;
|
|---|
| 88 | RealOutput[nout] y;
|
|---|
| 89 | end MO;
|
|---|
| 90 |
|
|---|
| 91 | partial block SISO
|
|---|
| 92 | RealInput u;
|
|---|
| 93 | RealOutput y;
|
|---|
| 94 | end SISO;
|
|---|
| 95 |
|
|---|
| 96 | partial block SI2SO
|
|---|
| 97 | RealInput u1;
|
|---|
| 98 | RealInput u2;
|
|---|
| 99 | RealOutput y;
|
|---|
| 100 | end SI2SO;
|
|---|
| 101 |
|
|---|
| 102 | partial block MIMO
|
|---|
| 103 | parameter Integer nin = 1;
|
|---|
| 104 | parameter Integer nout = 1;
|
|---|
| 105 | RealInput[nin] u;
|
|---|
| 106 | RealOutput[nout] y;
|
|---|
| 107 | end MIMO;
|
|---|
| 108 |
|
|---|
| 109 | partial block MIMOs
|
|---|
| 110 | parameter Integer n = 1;
|
|---|
| 111 | RealInput[n] u;
|
|---|
| 112 | RealOutput[n] y;
|
|---|
| 113 | end MIMOs;
|
|---|
| 114 |
|
|---|
| 115 | partial block SignalSource
|
|---|
| 116 | extends SO;
|
|---|
| 117 | parameter Real offset = 0;
|
|---|
| 118 | parameter .Modelica.SIunits.Time startTime = 0;
|
|---|
| 119 | end SignalSource;
|
|---|
| 120 | end Interfaces;
|
|---|
| 121 |
|
|---|
| 122 | package Math
|
|---|
| 123 | block Gain
|
|---|
| 124 | parameter Real k(start = 1, unit = "1");
|
|---|
| 125 | .Modelica.Blocks.Interfaces.RealInput u;
|
|---|
| 126 | .Modelica.Blocks.Interfaces.RealOutput y;
|
|---|
| 127 | equation
|
|---|
| 128 | y = k * u;
|
|---|
| 129 | end Gain;
|
|---|
| 130 |
|
|---|
| 131 | block Feedback
|
|---|
| 132 | .Modelica.Blocks.Interfaces.RealInput u1;
|
|---|
| 133 | .Modelica.Blocks.Interfaces.RealInput u2;
|
|---|
| 134 | .Modelica.Blocks.Interfaces.RealOutput y;
|
|---|
| 135 | equation
|
|---|
| 136 | y = u1 - u2;
|
|---|
| 137 | end Feedback;
|
|---|
| 138 |
|
|---|
| 139 | block Add
|
|---|
| 140 | extends .Modelica.Blocks.Interfaces.SI2SO;
|
|---|
| 141 | parameter Real k1 = +1;
|
|---|
| 142 | parameter Real k2 = +1;
|
|---|
| 143 | equation
|
|---|
| 144 | y = k1 * u1 + k2 * u2;
|
|---|
| 145 | end Add;
|
|---|
| 146 | end Math;
|
|---|
| 147 |
|
|---|
| 148 | package Nonlinear
|
|---|
| 149 | block SlewRateLimiter
|
|---|
| 150 | extends Modelica.Blocks.Interfaces.SISO;
|
|---|
| 151 | parameter Modelica.SIunits.DampingCoefficient Rising(min = .Modelica.Constants.small) = 1;
|
|---|
| 152 | parameter Modelica.SIunits.DampingCoefficient Falling(min = -.Modelica.Constants.small) = -Rising;
|
|---|
| 153 | parameter Modelica.SIunits.Time Td(min = .Modelica.Constants.small) = 0.001;
|
|---|
| 154 | parameter Boolean strict = false;
|
|---|
| 155 | initial equation
|
|---|
| 156 | y = u;
|
|---|
| 157 | equation
|
|---|
| 158 | if strict then
|
|---|
| 159 | der(y) = smooth(1, noEvent(min(max((u - y) / Td, Falling), Rising)));
|
|---|
| 160 | else
|
|---|
| 161 | der(y) = smooth(1, min(max((u - y) / Td, Falling), Rising));
|
|---|
| 162 | end if;
|
|---|
| 163 | end SlewRateLimiter;
|
|---|
| 164 | end Nonlinear;
|
|---|
| 165 |
|
|---|
| 166 | package Routing
|
|---|
| 167 | block DeMultiplex2
|
|---|
| 168 | parameter Integer n1 = 1;
|
|---|
| 169 | parameter Integer n2 = 1;
|
|---|
| 170 | Modelica.Blocks.Interfaces.RealInput[n1 + n2] u;
|
|---|
| 171 | Modelica.Blocks.Interfaces.RealOutput[n1] y1;
|
|---|
| 172 | Modelica.Blocks.Interfaces.RealOutput[n2] y2;
|
|---|
| 173 | equation
|
|---|
| 174 | [u] = [y1; y2];
|
|---|
| 175 | end DeMultiplex2;
|
|---|
| 176 | end Routing;
|
|---|
| 177 |
|
|---|
| 178 | package Sources
|
|---|
| 179 | block Constant
|
|---|
| 180 | parameter Real k(start = 1);
|
|---|
| 181 | extends .Modelica.Blocks.Interfaces.SO;
|
|---|
| 182 | equation
|
|---|
| 183 | y = k;
|
|---|
| 184 | end Constant;
|
|---|
| 185 |
|
|---|
| 186 | block Step
|
|---|
| 187 | parameter Real height = 1;
|
|---|
| 188 | extends .Modelica.Blocks.Interfaces.SignalSource;
|
|---|
| 189 | equation
|
|---|
| 190 | y = offset + (if time < startTime then 0 else height);
|
|---|
| 191 | end Step;
|
|---|
| 192 | end Sources;
|
|---|
| 193 |
|
|---|
| 194 | package Types
|
|---|
| 195 | type Init = enumeration(NoInit, SteadyState, InitialState, InitialOutput);
|
|---|
| 196 | end Types;
|
|---|
| 197 | end Blocks;
|
|---|
| 198 |
|
|---|
| 199 | package Electrical
|
|---|
| 200 | package Analog
|
|---|
| 201 | package Basic
|
|---|
| 202 | model Ground
|
|---|
| 203 | Interfaces.Pin p;
|
|---|
| 204 | equation
|
|---|
| 205 | p.v = 0;
|
|---|
| 206 | end Ground;
|
|---|
| 207 |
|
|---|
| 208 | model Resistor
|
|---|
| 209 | parameter Modelica.SIunits.Resistance R(start = 1);
|
|---|
| 210 | parameter Modelica.SIunits.Temperature T_ref = 300.15;
|
|---|
| 211 | parameter Modelica.SIunits.LinearTemperatureCoefficient alpha = 0;
|
|---|
| 212 | extends Modelica.Electrical.Analog.Interfaces.OnePort;
|
|---|
| 213 | extends Modelica.Electrical.Analog.Interfaces.ConditionalHeatPort(T = T_ref);
|
|---|
| 214 | Modelica.SIunits.Resistance R_actual;
|
|---|
| 215 | equation
|
|---|
| 216 | assert(1 + alpha * (T_heatPort - T_ref) >= Modelica.Constants.eps, "Temperature outside scope of model!");
|
|---|
| 217 | R_actual = R * (1 + alpha * (T_heatPort - T_ref));
|
|---|
| 218 | v = R_actual * i;
|
|---|
| 219 | LossPower = v * i;
|
|---|
| 220 | end Resistor;
|
|---|
| 221 |
|
|---|
| 222 | model Inductor
|
|---|
| 223 | extends Interfaces.OnePort(i(start = 0));
|
|---|
| 224 | parameter .Modelica.SIunits.Inductance L(start = 1);
|
|---|
| 225 | equation
|
|---|
| 226 | L * der(i) = v;
|
|---|
| 227 | end Inductor;
|
|---|
| 228 | end Basic;
|
|---|
| 229 |
|
|---|
| 230 | package Interfaces
|
|---|
| 231 | connector Pin
|
|---|
| 232 | Modelica.SIunits.Voltage v;
|
|---|
| 233 | flow Modelica.SIunits.Current i;
|
|---|
| 234 | end Pin;
|
|---|
| 235 |
|
|---|
| 236 | connector PositivePin
|
|---|
| 237 | Modelica.SIunits.Voltage v;
|
|---|
| 238 | flow Modelica.SIunits.Current i;
|
|---|
| 239 | end PositivePin;
|
|---|
| 240 |
|
|---|
| 241 | connector NegativePin
|
|---|
| 242 | Modelica.SIunits.Voltage v;
|
|---|
| 243 | flow Modelica.SIunits.Current i;
|
|---|
| 244 | end NegativePin;
|
|---|
| 245 |
|
|---|
| 246 | partial model OnePort
|
|---|
| 247 | .Modelica.SIunits.Voltage v;
|
|---|
| 248 | .Modelica.SIunits.Current i;
|
|---|
| 249 | PositivePin p;
|
|---|
| 250 | NegativePin n;
|
|---|
| 251 | equation
|
|---|
| 252 | v = p.v - n.v;
|
|---|
| 253 | 0 = p.i + n.i;
|
|---|
| 254 | i = p.i;
|
|---|
| 255 | end OnePort;
|
|---|
| 256 |
|
|---|
| 257 | partial model ConditionalHeatPort
|
|---|
| 258 | parameter Boolean useHeatPort = false;
|
|---|
| 259 | parameter Modelica.SIunits.Temperature T = 293.15;
|
|---|
| 260 | Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a heatPort(T(start = T) = T_heatPort, Q_flow = -LossPower) if useHeatPort;
|
|---|
| 261 | Modelica.SIunits.Power LossPower;
|
|---|
| 262 | Modelica.SIunits.Temperature T_heatPort;
|
|---|
| 263 | equation
|
|---|
| 264 | if not useHeatPort then
|
|---|
| 265 | T_heatPort = T;
|
|---|
| 266 | end if;
|
|---|
| 267 | end ConditionalHeatPort;
|
|---|
| 268 | end Interfaces;
|
|---|
| 269 |
|
|---|
| 270 | package Sensors
|
|---|
| 271 | model VoltageSensor
|
|---|
| 272 | Interfaces.PositivePin p;
|
|---|
| 273 | Interfaces.NegativePin n;
|
|---|
| 274 | Modelica.Blocks.Interfaces.RealOutput v(unit = "V");
|
|---|
| 275 | equation
|
|---|
| 276 | p.i = 0;
|
|---|
| 277 | n.i = 0;
|
|---|
| 278 | v = p.v - n.v;
|
|---|
| 279 | end VoltageSensor;
|
|---|
| 280 |
|
|---|
| 281 | model CurrentSensor
|
|---|
| 282 | Interfaces.PositivePin p;
|
|---|
| 283 | Interfaces.NegativePin n;
|
|---|
| 284 | Modelica.Blocks.Interfaces.RealOutput i(unit = "A");
|
|---|
| 285 | equation
|
|---|
| 286 | p.v = n.v;
|
|---|
| 287 | p.i = i;
|
|---|
| 288 | n.i = -i;
|
|---|
| 289 | end CurrentSensor;
|
|---|
| 290 | end Sensors;
|
|---|
| 291 |
|
|---|
| 292 | package Sources
|
|---|
| 293 |
|
|---|
| 294 | model SignalCurrent
|
|---|
| 295 | Interfaces.PositivePin p;
|
|---|
| 296 | Interfaces.NegativePin n;
|
|---|
| 297 | .Modelica.SIunits.Voltage v;
|
|---|
| 298 | Modelica.Blocks.Interfaces.RealInput i(unit = "A");
|
|---|
| 299 | equation
|
|---|
| 300 | v = p.v - n.v;
|
|---|
| 301 | 0 = p.i + n.i;
|
|---|
| 302 | i = p.i;
|
|---|
| 303 | end SignalCurrent;
|
|---|
| 304 | end Sources;
|
|---|
| 305 | end Analog;
|
|---|
| 306 |
|
|---|
| 307 | package Machines
|
|---|
| 308 | package BasicMachines
|
|---|
| 309 | package SynchronousInductionMachines
|
|---|
| 310 | model SM_PermanentMagnet
|
|---|
| 311 | extends Machines.Interfaces.PartialBasicInductionMachine(Lssigma(start = 0.1 / (2 * pi * fsNominal)), final idq_ss = airGapR.i_ss, final idq_sr = airGapR.i_sr, final idq_rs = airGapR.i_rs, final idq_rr = airGapR.i_rr, redeclare final Machines.Thermal.SynchronousInductionMachines.ThermalAmbientSMPM thermalAmbient(final useDamperCage = useDamperCage, final Tr = TrOperational, final Tpm = TpmOperational), redeclare final Machines.Interfaces.InductionMachines.ThermalPortSMPM thermalPort(final useDamperCage = useDamperCage), redeclare final Machines.Interfaces.InductionMachines.ThermalPortSMPM internalThermalPort(final useDamperCage = useDamperCage), redeclare final Machines.Interfaces.InductionMachines.PowerBalanceSMPM powerBalance(final lossPowerRotorWinding = damperCageLossPower, final lossPowerRotorCore = 0, final lossPowerPermanentMagnet = permanentMagnet.lossPower), statorCore(final w = statorCoreParameters.wRef));
|
|---|
| 312 | Modelica.Blocks.Interfaces.RealOutput[2] ir(start = zeros(2), each final quantity = "ElectricCurrent", each final unit = "A") if useDamperCage;
|
|---|
| 313 | Modelica.Blocks.Interfaces.RealOutput[2] idq_dr(each stateSelect = StateSelect.prefer, each final quantity = "ElectricCurrent", each final unit = "A") if useDamperCage;
|
|---|
| 314 | Machines.BasicMachines.Components.AirGapR airGapR(final p = p, final Lmd = Lmd, final Lmq = Lmq, final m = m);
|
|---|
| 315 | final parameter Modelica.SIunits.Temperature TpmOperational = 293.15;
|
|---|
| 316 | parameter Modelica.SIunits.Temperature TrOperational(start = 293.15);
|
|---|
| 317 | parameter Modelica.SIunits.Voltage VsOpenCircuit(start = 112.3);
|
|---|
| 318 | parameter Modelica.SIunits.Inductance Lmd(start = 0.3 / (2 * pi * fsNominal));
|
|---|
| 319 | parameter Modelica.SIunits.Inductance Lmq(start = 0.3 / (2 * pi * fsNominal));
|
|---|
| 320 | parameter Boolean useDamperCage(start = true);
|
|---|
| 321 | parameter Modelica.SIunits.Inductance Lrsigmad(start = 0.05 / (2 * pi * fsNominal));
|
|---|
| 322 | parameter Modelica.SIunits.Inductance Lrsigmaq = Lrsigmad;
|
|---|
| 323 | parameter Modelica.SIunits.Resistance Rrd(start = 0.04);
|
|---|
| 324 | parameter Modelica.SIunits.Resistance Rrq = Rrd;
|
|---|
| 325 | parameter Modelica.SIunits.Temperature TrRef(start = 293.15);
|
|---|
| 326 | parameter Machines.Thermal.LinearTemperatureCoefficient20 alpha20r(start = 0);
|
|---|
| 327 | parameter Machines.Losses.PermanentMagnetLossParameters permanentMagnetLossParameters(IRef(start = 100), wRef(start = 2 * pi * fsNominal / p));
|
|---|
| 328 | Components.PermanentMagnetWithLosses permanentMagnet(final Ie = Ie, final useHeatPort = true, final m = m, final permanentMagnetLossParameters = permanentMagnetLossParameters, final is = is);
|
|---|
| 329 | Machines.BasicMachines.Components.DamperCage damperCage(final Lrsigmad = Lrsigmad, final Lrsigmaq = Lrsigmaq, final Rrd = Rrd, final Rrq = Rrq, final T_ref = TrRef, final alpha = Machines.Thermal.convertAlpha(alpha20r, TrRef), final T = TrRef, final useHeatPort = true) if useDamperCage;
|
|---|
| 330 | protected
|
|---|
| 331 | final parameter Modelica.SIunits.Current Ie = sqrt(2) * VsOpenCircuit / (Lmd * 2 * pi * fsNominal);
|
|---|
| 332 | Modelica.Blocks.Interfaces.RealOutput damperCageLossPower(final quantity = "Power", final unit = "W");
|
|---|
| 333 | equation
|
|---|
| 334 | connect(ir, damperCage.i);
|
|---|
| 335 | connect(idq_dr, damperCage.i);
|
|---|
| 336 | connect(damperCageLossPower, damperCage.lossPower);
|
|---|
| 337 | if not useDamperCage then
|
|---|
| 338 | damperCageLossPower = 0;
|
|---|
| 339 | end if;
|
|---|
| 340 | connect(airGapR.spacePhasor_r, damperCage.spacePhasor_r);
|
|---|
| 341 | connect(airGapR.spacePhasor_r, permanentMagnet.spacePhasor_r);
|
|---|
| 342 | connect(airGapR.support, internalSupport);
|
|---|
| 343 | connect(lssigma.spacePhasor_b, airGapR.spacePhasor_s);
|
|---|
| 344 | connect(airGapR.flange, inertiaRotor.flange_a);
|
|---|
| 345 | connect(permanentMagnet.heatPort, internalThermalPort.heatPortPermanentMagnet);
|
|---|
| 346 | connect(permanentMagnet.flange, inertiaRotor.flange_b);
|
|---|
| 347 | connect(damperCage.heatPort, internalThermalPort.heatPortRotorWinding);
|
|---|
| 348 | connect(internalSupport, permanentMagnet.support);
|
|---|
| 349 | end SM_PermanentMagnet;
|
|---|
| 350 | end SynchronousInductionMachines;
|
|---|
| 351 |
|
|---|
| 352 | package Components
|
|---|
| 353 | partial model PartialAirGap
|
|---|
| 354 | parameter Integer m = 3;
|
|---|
| 355 | parameter Integer p(min = 1);
|
|---|
| 356 | output Modelica.SIunits.Torque tauElectrical;
|
|---|
| 357 | Modelica.SIunits.Angle gamma;
|
|---|
| 358 | Modelica.SIunits.Current[2] i_ss;
|
|---|
| 359 | Modelica.SIunits.Current[2] i_sr;
|
|---|
| 360 | Modelica.SIunits.Current[2] i_rs;
|
|---|
| 361 | Modelica.SIunits.Current[2] i_rr;
|
|---|
| 362 | Modelica.SIunits.MagneticFlux[2] psi_ms;
|
|---|
| 363 | Modelica.SIunits.MagneticFlux[2] psi_mr;
|
|---|
| 364 | Real[2, 2] RotationMatrix;
|
|---|
| 365 | Modelica.Mechanics.Rotational.Interfaces.Flange_a flange;
|
|---|
| 366 | Modelica.Mechanics.Rotational.Interfaces.Flange_a support;
|
|---|
| 367 | Machines.Interfaces.SpacePhasor spacePhasor_s;
|
|---|
| 368 | Machines.Interfaces.SpacePhasor spacePhasor_r;
|
|---|
| 369 | equation
|
|---|
| 370 | gamma = p * (flange.phi - support.phi);
|
|---|
| 371 | RotationMatrix = {{+cos(gamma), -sin(gamma)}, {+sin(gamma), +cos(gamma)}};
|
|---|
| 372 | i_ss = spacePhasor_s.i_;
|
|---|
| 373 | i_ss = RotationMatrix * i_sr;
|
|---|
| 374 | i_rr = spacePhasor_r.i_;
|
|---|
| 375 | i_rs = RotationMatrix * i_rr;
|
|---|
| 376 | spacePhasor_s.v_ = der(psi_ms);
|
|---|
| 377 | spacePhasor_r.v_ = der(psi_mr);
|
|---|
| 378 | tauElectrical = m / 2 * p * (spacePhasor_s.i_[2] * psi_ms[1] - spacePhasor_s.i_[1] * psi_ms[2]);
|
|---|
| 379 | flange.tau = -tauElectrical;
|
|---|
| 380 | support.tau = tauElectrical;
|
|---|
| 381 | end PartialAirGap;
|
|---|
| 382 |
|
|---|
| 383 | model AirGapR
|
|---|
| 384 | parameter Modelica.SIunits.Inductance Lmd;
|
|---|
| 385 | parameter Modelica.SIunits.Inductance Lmq;
|
|---|
| 386 | extends PartialAirGap;
|
|---|
| 387 | Modelica.SIunits.Current[2] i_mr;
|
|---|
| 388 | protected
|
|---|
| 389 | parameter Modelica.SIunits.Inductance[2, 2] L = {{Lmd, 0}, {0, Lmq}};
|
|---|
| 390 | equation
|
|---|
| 391 | i_mr = i_sr + i_rr;
|
|---|
| 392 | psi_mr = L * i_mr;
|
|---|
| 393 | psi_ms = RotationMatrix * psi_mr;
|
|---|
| 394 | end AirGapR;
|
|---|
| 395 |
|
|---|
| 396 | model Inductor
|
|---|
| 397 | parameter Modelica.SIunits.Inductance[2] L;
|
|---|
| 398 | Modelica.SIunits.Voltage[2] v_;
|
|---|
| 399 | Modelica.SIunits.Current[2] i_;
|
|---|
| 400 | Machines.Interfaces.SpacePhasor spacePhasor_a;
|
|---|
| 401 | Machines.Interfaces.SpacePhasor spacePhasor_b;
|
|---|
| 402 | equation
|
|---|
| 403 | spacePhasor_a.i_ + spacePhasor_b.i_ = zeros(2);
|
|---|
| 404 | v_ = spacePhasor_a.v_ - spacePhasor_b.v_;
|
|---|
| 405 | i_ = spacePhasor_a.i_;
|
|---|
| 406 | v_[1] = L[1] * der(i_[1]);
|
|---|
| 407 | v_[2] = L[2] * der(i_[2]);
|
|---|
| 408 | end Inductor;
|
|---|
| 409 |
|
|---|
| 410 | model DamperCage
|
|---|
| 411 | parameter Modelica.SIunits.Inductance Lrsigmad;
|
|---|
| 412 | parameter Modelica.SIunits.Inductance Lrsigmaq;
|
|---|
| 413 | parameter Modelica.SIunits.Resistance Rrd;
|
|---|
| 414 | parameter Modelica.SIunits.Resistance Rrq;
|
|---|
| 415 | parameter Modelica.SIunits.Temperature T_ref = 293.15;
|
|---|
| 416 | parameter Modelica.SIunits.LinearTemperatureCoefficient alpha = 0;
|
|---|
| 417 | extends Modelica.Electrical.Analog.Interfaces.ConditionalHeatPort(T = T_ref);
|
|---|
| 418 | Modelica.SIunits.Resistance Rrd_actual;
|
|---|
| 419 | Modelica.SIunits.Resistance Rrq_actual;
|
|---|
| 420 | Modelica.Blocks.Interfaces.RealOutput[2] i(each final quantity = "ElectricCurrent", each final unit = "A") = -spacePhasor_r.i_;
|
|---|
| 421 | Modelica.Blocks.Interfaces.RealOutput lossPower(final quantity = "Power", final unit = "W") = LossPower;
|
|---|
| 422 | Machines.Interfaces.SpacePhasor spacePhasor_r;
|
|---|
| 423 | equation
|
|---|
| 424 | assert(1 + alpha * (T_heatPort - T_ref) >= Modelica.Constants.eps, "Temperature outside scope of model!");
|
|---|
| 425 | Rrd_actual = Rrd * (1 + alpha * (T_heatPort - T_ref));
|
|---|
| 426 | Rrq_actual = Rrq * (1 + alpha * (T_heatPort - T_ref));
|
|---|
| 427 | spacePhasor_r.v_[1] = Rrd_actual * spacePhasor_r.i_[1] + Lrsigmad * der(spacePhasor_r.i_[1]);
|
|---|
| 428 | spacePhasor_r.v_[2] = Rrq_actual * spacePhasor_r.i_[2] + Lrsigmaq * der(spacePhasor_r.i_[2]);
|
|---|
| 429 | 2 / 3 * LossPower = Rrd_actual * spacePhasor_r.i_[1] * spacePhasor_r.i_[1] + Rrq_actual * spacePhasor_r.i_[2] * spacePhasor_r.i_[2];
|
|---|
| 430 | end DamperCage;
|
|---|
| 431 |
|
|---|
| 432 | model PermanentMagnet
|
|---|
| 433 | parameter Modelica.SIunits.Current Ie;
|
|---|
| 434 | Machines.Interfaces.SpacePhasor spacePhasor_r;
|
|---|
| 435 | equation
|
|---|
| 436 | spacePhasor_r.i_ = {-Ie, 0};
|
|---|
| 437 | end PermanentMagnet;
|
|---|
| 438 |
|
|---|
| 439 | model PermanentMagnetWithLosses
|
|---|
| 440 | extends Machines.BasicMachines.Components.PermanentMagnet;
|
|---|
| 441 | extends Machines.Losses.InductionMachines.PermanentMagnetLosses;
|
|---|
| 442 | end PermanentMagnetWithLosses;
|
|---|
| 443 | end Components;
|
|---|
| 444 | end BasicMachines;
|
|---|
| 445 |
|
|---|
| 446 | package Sensors
|
|---|
| 447 | model VoltageQuasiRMSSensor
|
|---|
| 448 | constant Integer m(final min = 1) = 3;
|
|---|
| 449 | Modelica.Blocks.Interfaces.RealOutput V(final quantity = "ElectricPotential", final unit = "V");
|
|---|
| 450 | Modelica.Electrical.MultiPhase.Interfaces.PositivePlug plug_p(final m = m);
|
|---|
| 451 | Modelica.Electrical.MultiPhase.Interfaces.NegativePlug plug_n(final m = m);
|
|---|
| 452 | Modelica.Electrical.MultiPhase.Sensors.VoltageSensor VoltageSensor1(final m = m);
|
|---|
| 453 | Modelica.Blocks.Math.Gain Gain1(final k = 1 / sqrt(2));
|
|---|
| 454 | Machines.SpacePhasors.Blocks.ToSpacePhasor ToSpacePhasor1;
|
|---|
| 455 | Machines.SpacePhasors.Blocks.ToPolar ToPolar1;
|
|---|
| 456 | equation
|
|---|
| 457 | connect(plug_p, VoltageSensor1.plug_p);
|
|---|
| 458 | connect(VoltageSensor1.plug_n, plug_n);
|
|---|
| 459 | connect(VoltageSensor1.v, ToSpacePhasor1.u);
|
|---|
| 460 | connect(ToSpacePhasor1.y, ToPolar1.u);
|
|---|
| 461 | connect(ToPolar1.y[1], Gain1.u);
|
|---|
| 462 | connect(Gain1.y, V);
|
|---|
| 463 | end VoltageQuasiRMSSensor;
|
|---|
| 464 |
|
|---|
| 465 | model CurrentQuasiRMSSensor
|
|---|
| 466 | constant Integer m(final min = 1) = 3;
|
|---|
| 467 | Modelica.Blocks.Interfaces.RealOutput I(final quantity = "ElectricCurrent", final unit = "A");
|
|---|
| 468 | Modelica.Electrical.MultiPhase.Interfaces.PositivePlug plug_p(final m = m);
|
|---|
| 469 | Modelica.Electrical.MultiPhase.Interfaces.NegativePlug plug_n(final m = m);
|
|---|
| 470 | Modelica.Electrical.MultiPhase.Sensors.CurrentSensor CurrentSensor1(final m = m);
|
|---|
| 471 | Modelica.Blocks.Math.Gain Gain1(final k = 1 / sqrt(2));
|
|---|
| 472 | Machines.SpacePhasors.Blocks.ToSpacePhasor ToSpacePhasor1;
|
|---|
| 473 | Machines.SpacePhasors.Blocks.ToPolar ToPolar1;
|
|---|
| 474 | equation
|
|---|
| 475 | connect(plug_p, CurrentSensor1.plug_p);
|
|---|
| 476 | connect(CurrentSensor1.plug_n, plug_n);
|
|---|
| 477 | connect(CurrentSensor1.i, ToSpacePhasor1.u);
|
|---|
| 478 | connect(ToSpacePhasor1.y, ToPolar1.u);
|
|---|
| 479 | connect(ToPolar1.y[1], Gain1.u);
|
|---|
| 480 | connect(Gain1.y, I);
|
|---|
| 481 | end CurrentQuasiRMSSensor;
|
|---|
| 482 |
|
|---|
| 483 | model RotorDisplacementAngle
|
|---|
| 484 | constant Integer m = 3;
|
|---|
| 485 | parameter Integer p(min = 1);
|
|---|
| 486 | parameter Boolean useSupport = false;
|
|---|
| 487 | Modelica.Blocks.Interfaces.RealOutput rotorDisplacementAngle(final quantity = "Angle", final unit = "rad");
|
|---|
| 488 | Modelica.Electrical.MultiPhase.Interfaces.PositivePlug plug_p(final m = m);
|
|---|
| 489 | Modelica.Electrical.MultiPhase.Interfaces.NegativePlug plug_n(final m = m);
|
|---|
| 490 | Modelica.Electrical.MultiPhase.Sensors.VoltageSensor VoltageSensor1(final m = m);
|
|---|
| 491 | Machines.SpacePhasors.Blocks.ToSpacePhasor ToSpacePhasorVS;
|
|---|
| 492 | Modelica.Mechanics.Rotational.Interfaces.Flange_a flange;
|
|---|
| 493 | Modelica.Mechanics.Rotational.Sensors.RelAngleSensor relativeAngleSensor;
|
|---|
| 494 | Modelica.Blocks.Sources.Constant constant_(final k = Modelica.Constants.pi / 2);
|
|---|
| 495 | Modelica.Blocks.Math.Add add(final k2 = 1, final k1 = p);
|
|---|
| 496 | Machines.SpacePhasors.Blocks.Rotator rotatorVS2R;
|
|---|
| 497 | Machines.SpacePhasors.Blocks.ToPolar ToPolarVSR;
|
|---|
| 498 | Modelica.Blocks.Routing.DeMultiplex2 deMultiplex2(final n1 = 1, final n2 = 1);
|
|---|
| 499 | Modelica.Mechanics.Rotational.Interfaces.Flange_a support if useSupport;
|
|---|
| 500 | Modelica.Mechanics.Rotational.Components.Fixed fixed if not useSupport;
|
|---|
| 501 | equation
|
|---|
| 502 | connect(plug_p, VoltageSensor1.plug_p);
|
|---|
| 503 | connect(plug_n, VoltageSensor1.plug_n);
|
|---|
| 504 | connect(relativeAngleSensor.flange_b, flange);
|
|---|
| 505 | connect(relativeAngleSensor.flange_a, support);
|
|---|
| 506 | connect(relativeAngleSensor.flange_a, fixed.flange);
|
|---|
| 507 | connect(relativeAngleSensor.phi_rel, add.u1);
|
|---|
| 508 | connect(constant_.y, add.u2);
|
|---|
| 509 | connect(VoltageSensor1.v, ToSpacePhasorVS.u);
|
|---|
| 510 | connect(ToSpacePhasorVS.y, rotatorVS2R.u);
|
|---|
| 511 | connect(rotatorVS2R.y, ToPolarVSR.u);
|
|---|
| 512 | connect(add.y, rotatorVS2R.angle);
|
|---|
| 513 | connect(ToPolarVSR.y, deMultiplex2.u);
|
|---|
| 514 | connect(deMultiplex2.y2[1], rotorDisplacementAngle);
|
|---|
| 515 | end RotorDisplacementAngle;
|
|---|
| 516 | end Sensors;
|
|---|
| 517 |
|
|---|
| 518 | package SpacePhasors
|
|---|
| 519 | package Components
|
|---|
| 520 | model SpacePhasor
|
|---|
| 521 | constant Integer m = 3;
|
|---|
| 522 | constant Real pi = Modelica.Constants.pi;
|
|---|
| 523 | parameter Real turnsRatio = 1;
|
|---|
| 524 | Modelica.SIunits.Voltage[m] v;
|
|---|
| 525 | Modelica.SIunits.Current[m] i;
|
|---|
| 526 | protected
|
|---|
| 527 | parameter Real[2, m] TransformationMatrix = 2 / m * {array(cos(+(k - 1) / m * 2 * pi) for k in 1:m), array(+sin(+(k - 1) / m * 2 * pi) for k in 1:m)};
|
|---|
| 528 | parameter Real[m, 2] InverseTransformation = array({cos(-(k - 1) / m * 2 * pi), -sin(-(k - 1) / m * 2 * pi)} for k in 1:m);
|
|---|
| 529 | public
|
|---|
| 530 | Modelica.Electrical.MultiPhase.Interfaces.PositivePlug plug_p(final m = m);
|
|---|
| 531 | Modelica.Electrical.MultiPhase.Interfaces.NegativePlug plug_n(final m = m);
|
|---|
| 532 | Modelica.Electrical.Analog.Interfaces.PositivePin zero;
|
|---|
| 533 | Modelica.Electrical.Analog.Interfaces.NegativePin ground;
|
|---|
| 534 | Machines.Interfaces.SpacePhasor spacePhasor;
|
|---|
| 535 | equation
|
|---|
| 536 | v / turnsRatio = plug_p.pin.v - plug_n.pin.v;
|
|---|
| 537 | i * turnsRatio = +plug_p.pin.i;
|
|---|
| 538 | i * turnsRatio = -plug_n.pin.i;
|
|---|
| 539 | m * zero.v = sum(v);
|
|---|
| 540 | spacePhasor.v_ = TransformationMatrix * v;
|
|---|
| 541 | -m * zero.i = sum(i);
|
|---|
| 542 | -spacePhasor.i_ = TransformationMatrix * i;
|
|---|
| 543 | ground.v = 0;
|
|---|
| 544 | end SpacePhasor;
|
|---|
| 545 | end Components;
|
|---|
| 546 |
|
|---|
| 547 | package Blocks
|
|---|
| 548 | block ToSpacePhasor
|
|---|
| 549 | extends Modelica.Blocks.Interfaces.MIMO(final nin = m, final nout = 2);
|
|---|
| 550 | constant Integer m = 3;
|
|---|
| 551 | constant Real pi = Modelica.Constants.pi;
|
|---|
| 552 | protected
|
|---|
| 553 | parameter Real[2, m] TransformationMatrix = 2 / m * {array(cos(+(k - 1) / m * 2 * pi) for k in 1:m), array(+sin(+(k - 1) / m * 2 * pi) for k in 1:m)};
|
|---|
| 554 | parameter Real[m, 2] InverseTransformation = array({cos(-(k - 1) / m * 2 * pi), -sin(-(k - 1) / m * 2 * pi)} for k in 1:m);
|
|---|
| 555 | public
|
|---|
| 556 | Modelica.Blocks.Interfaces.RealOutput zero;
|
|---|
| 557 | equation
|
|---|
| 558 | m * zero = sum(u);
|
|---|
| 559 | y = TransformationMatrix * u;
|
|---|
| 560 | end ToSpacePhasor;
|
|---|
| 561 |
|
|---|
| 562 | block FromSpacePhasor
|
|---|
| 563 | extends Modelica.Blocks.Interfaces.MIMO(final nin = 2, final nout = m);
|
|---|
| 564 | constant Integer m = 3;
|
|---|
| 565 | constant Real pi = Modelica.Constants.pi;
|
|---|
| 566 | protected
|
|---|
| 567 | parameter Real[2, m] TransformationMatrix = 2 / m * {array(cos(+(k - 1) / m * 2 * pi) for k in 1:m), array(+sin(+(k - 1) / m * 2 * pi) for k in 1:m)};
|
|---|
| 568 | parameter Real[m, 2] InverseTransformation = array({cos(-(k - 1) / m * 2 * pi), -sin(-(k - 1) / m * 2 * pi)} for k in 1:m);
|
|---|
| 569 | public
|
|---|
| 570 | Modelica.Blocks.Interfaces.RealInput zero;
|
|---|
| 571 | equation
|
|---|
| 572 | y = fill(zero, m) + InverseTransformation * u;
|
|---|
| 573 | end FromSpacePhasor;
|
|---|
| 574 |
|
|---|
| 575 | block Rotator
|
|---|
| 576 | extends Modelica.Blocks.Interfaces.MIMOs(final n = 2);
|
|---|
| 577 | protected
|
|---|
| 578 | Real[2, 2] RotationMatrix = {{+cos(-angle), -sin(-angle)}, {+sin(-angle), +cos(-angle)}};
|
|---|
| 579 | public
|
|---|
| 580 | Modelica.Blocks.Interfaces.RealInput angle;
|
|---|
| 581 | equation
|
|---|
| 582 | y = RotationMatrix * u;
|
|---|
| 583 | end Rotator;
|
|---|
| 584 |
|
|---|
| 585 | block ToPolar
|
|---|
| 586 | extends Modelica.Blocks.Interfaces.MIMOs(final n = 2);
|
|---|
| 587 | constant Real small = Modelica.Constants.small;
|
|---|
| 588 | equation
|
|---|
| 589 | y[1] = sqrt(u[1] ^ 2 + u[2] ^ 2);
|
|---|
| 590 | y[2] = if noEvent(y[1] <= small) then 0 else Modelica.Math.atan2(u[2], u[1]);
|
|---|
| 591 | end ToPolar;
|
|---|
| 592 | end Blocks;
|
|---|
| 593 |
|
|---|
| 594 | package Functions
|
|---|
| 595 | function activePower
|
|---|
| 596 | input Modelica.SIunits.Voltage[m] v;
|
|---|
| 597 | input Modelica.SIunits.Current[m] i;
|
|---|
| 598 | output Modelica.SIunits.Power p;
|
|---|
| 599 | protected
|
|---|
| 600 | constant Integer m = 3;
|
|---|
| 601 | constant Modelica.SIunits.Angle pi = Modelica.Constants.pi;
|
|---|
| 602 | Modelica.SIunits.Voltage[2] v_;
|
|---|
| 603 | Modelica.SIunits.Current[2] i_;
|
|---|
| 604 | algorithm
|
|---|
| 605 | v_ := zeros(2);
|
|---|
| 606 | i_ := zeros(2);
|
|---|
| 607 | for k in 1:m loop
|
|---|
| 608 | v_ := v_ + 2 / m * {+cos((k - 1) / m * 2 * pi), +sin(+(k - 1) / m * 2 * pi)} * v[k];
|
|---|
| 609 | i_ := i_ + 2 / m * {+cos((k - 1) / m * 2 * pi), +sin(+(k - 1) / m * 2 * pi)} * i[k];
|
|---|
| 610 | end for;
|
|---|
| 611 | p := m / 2 * ((+v_[1] * i_[1]) + v_[2] * i_[2]);
|
|---|
| 612 | end activePower;
|
|---|
| 613 | end Functions;
|
|---|
| 614 | end SpacePhasors;
|
|---|
| 615 |
|
|---|
| 616 | package Losses
|
|---|
| 617 | record FrictionParameters
|
|---|
| 618 | parameter Modelica.SIunits.Power PRef(min = 0) = 0;
|
|---|
| 619 | parameter Modelica.SIunits.AngularVelocity wRef(displayUnit = "1/min", min = Modelica.Constants.small);
|
|---|
| 620 | parameter Real power_w(min = Modelica.Constants.small) = 2;
|
|---|
| 621 | final parameter Modelica.SIunits.Torque tauRef = if PRef <= 0 then 0 else PRef / wRef;
|
|---|
| 622 | final parameter Real linear = 0.001;
|
|---|
| 623 | final parameter Modelica.SIunits.AngularVelocity wLinear = linear * wRef;
|
|---|
| 624 | final parameter Modelica.SIunits.Torque tauLinear = if PRef <= 0 then 0 else tauRef * (wLinear / wRef) ^ power_w;
|
|---|
| 625 | end FrictionParameters;
|
|---|
| 626 |
|
|---|
| 627 | record StrayLoadParameters
|
|---|
| 628 | parameter Modelica.SIunits.Power PRef(min = 0) = 0;
|
|---|
| 629 | parameter Modelica.SIunits.Current IRef(min = Modelica.Constants.small);
|
|---|
| 630 | parameter Modelica.SIunits.AngularVelocity wRef(displayUnit = "1/min", min = Modelica.Constants.small);
|
|---|
| 631 | parameter Real power_w(min = Modelica.Constants.small) = 1;
|
|---|
| 632 | final parameter Modelica.SIunits.Torque tauRef = if PRef <= 0 then 0 else PRef / wRef;
|
|---|
| 633 | end StrayLoadParameters;
|
|---|
| 634 |
|
|---|
| 635 | record CoreParameters
|
|---|
| 636 | parameter Integer m;
|
|---|
| 637 | parameter Modelica.SIunits.Power PRef(min = 0) = 0;
|
|---|
| 638 | parameter Modelica.SIunits.Voltage VRef(min = Modelica.Constants.small);
|
|---|
| 639 | parameter Modelica.SIunits.AngularVelocity wRef(min = Modelica.Constants.small);
|
|---|
| 640 | final parameter Real ratioHysteresis(min = 0, max = 1, start = 0.775) = 0;
|
|---|
| 641 | final parameter Modelica.SIunits.Conductance GcRef = if PRef <= 0 then 0 else PRef / VRef ^ 2 / m;
|
|---|
| 642 | final parameter Modelica.SIunits.AngularVelocity wMin = 1e-6 * wRef;
|
|---|
| 643 | end CoreParameters;
|
|---|
| 644 |
|
|---|
| 645 | record PermanentMagnetLossParameters
|
|---|
| 646 | parameter Modelica.SIunits.Power PRef(min = 0) = 0;
|
|---|
| 647 | parameter Real c(min = 0, max = 1) = 0;
|
|---|
| 648 | parameter Modelica.SIunits.Current IRef(min = Modelica.Constants.small);
|
|---|
| 649 | parameter Real power_I(min = Modelica.Constants.small) = 2;
|
|---|
| 650 | parameter Modelica.SIunits.AngularVelocity wRef(displayUnit = "1/min", min = Modelica.Constants.small);
|
|---|
| 651 | parameter Real power_w(min = Modelica.Constants.small) = 1;
|
|---|
| 652 | final parameter Modelica.SIunits.Torque tauRef = if PRef <= 0 then 0 else PRef / wRef;
|
|---|
| 653 | end PermanentMagnetLossParameters;
|
|---|
| 654 |
|
|---|
| 655 | model Friction
|
|---|
| 656 | extends Machines.Interfaces.FlangeSupport;
|
|---|
| 657 | parameter FrictionParameters frictionParameters;
|
|---|
| 658 | extends Modelica.Thermal.HeatTransfer.Interfaces.PartialElementaryConditionalHeatPortWithoutT(useHeatPort = false);
|
|---|
| 659 | equation
|
|---|
| 660 | if frictionParameters.PRef <= 0 then
|
|---|
| 661 | tau = 0;
|
|---|
| 662 | else
|
|---|
| 663 | tau = -smooth(1, if w >= (+frictionParameters.wLinear) then +frictionParameters.tauRef * (+w / frictionParameters.wRef) ^ frictionParameters.power_w else if w <= (-frictionParameters.wLinear) then -frictionParameters.tauRef * (-w / frictionParameters.wRef) ^ frictionParameters.power_w else frictionParameters.tauLinear * (w / frictionParameters.wLinear));
|
|---|
| 664 | end if;
|
|---|
| 665 | lossPower = -tau * w;
|
|---|
| 666 | end Friction;
|
|---|
| 667 |
|
|---|
| 668 | package InductionMachines
|
|---|
| 669 | model StrayLoad
|
|---|
| 670 | extends Modelica.Electrical.MultiPhase.Interfaces.OnePort;
|
|---|
| 671 | extends Machines.Interfaces.FlangeSupport;
|
|---|
| 672 | parameter Machines.Losses.StrayLoadParameters strayLoadParameters;
|
|---|
| 673 | extends Modelica.Thermal.HeatTransfer.Interfaces.PartialElementaryConditionalHeatPortWithoutT(useHeatPort = false);
|
|---|
| 674 | Modelica.SIunits.Current iRMS = .Modelica.Electrical.MultiPhase.Functions.quasiRMS(i);
|
|---|
| 675 | equation
|
|---|
| 676 | v = zeros(m);
|
|---|
| 677 | if strayLoadParameters.PRef <= 0 then
|
|---|
| 678 | tau = 0;
|
|---|
| 679 | else
|
|---|
| 680 | tau = -strayLoadParameters.tauRef * (iRMS / strayLoadParameters.IRef) ^ 2 * smooth(1, if w >= 0 then +(+w / strayLoadParameters.wRef) ^ strayLoadParameters.power_w else -(-w / strayLoadParameters.wRef) ^ strayLoadParameters.power_w);
|
|---|
| 681 | end if;
|
|---|
| 682 | lossPower = -tau * w;
|
|---|
| 683 | end StrayLoad;
|
|---|
| 684 |
|
|---|
| 685 | model PermanentMagnetLosses
|
|---|
| 686 | extends Machines.Interfaces.FlangeSupport;
|
|---|
| 687 | parameter Integer m(min = 1) = 3;
|
|---|
| 688 | parameter Machines.Losses.PermanentMagnetLossParameters permanentMagnetLossParameters;
|
|---|
| 689 | extends Modelica.Thermal.HeatTransfer.Interfaces.PartialElementaryConditionalHeatPortWithoutT(useHeatPort = false);
|
|---|
| 690 | input Modelica.SIunits.Current[m] is;
|
|---|
| 691 | Modelica.SIunits.Current iRMS = .Modelica.Electrical.MultiPhase.Functions.quasiRMS(is);
|
|---|
| 692 | equation
|
|---|
| 693 | if permanentMagnetLossParameters.PRef <= 0 then
|
|---|
| 694 | tau = 0;
|
|---|
| 695 | else
|
|---|
| 696 | tau = -permanentMagnetLossParameters.tauRef * (permanentMagnetLossParameters.c + (1 - permanentMagnetLossParameters.c) * (iRMS / permanentMagnetLossParameters.IRef) ^ permanentMagnetLossParameters.power_I) * smooth(1, if w >= 0 then +(+w / permanentMagnetLossParameters.wRef) ^ permanentMagnetLossParameters.power_w else -(-w / permanentMagnetLossParameters.wRef) ^ permanentMagnetLossParameters.power_w);
|
|---|
| 697 | end if;
|
|---|
| 698 | lossPower = -tau * w;
|
|---|
| 699 | end PermanentMagnetLosses;
|
|---|
| 700 |
|
|---|
| 701 | model Core
|
|---|
| 702 | parameter Machines.Losses.CoreParameters coreParameters(final m = m);
|
|---|
| 703 | final parameter Integer m = 3;
|
|---|
| 704 | parameter Real turnsRatio(final min = Modelica.Constants.small);
|
|---|
| 705 | extends Modelica.Thermal.HeatTransfer.Interfaces.PartialElementaryConditionalHeatPortWithoutT(useHeatPort = false);
|
|---|
| 706 | Machines.Interfaces.SpacePhasor spacePhasor;
|
|---|
| 707 | input Modelica.SIunits.AngularVelocity w;
|
|---|
| 708 | Modelica.SIunits.Conductance Gc;
|
|---|
| 709 | protected
|
|---|
| 710 | Modelica.SIunits.AngularVelocity wLimit = noEvent(max(noEvent(abs(w)), coreParameters.wMin));
|
|---|
| 711 | equation
|
|---|
| 712 | if coreParameters.PRef <= 0 then
|
|---|
| 713 | Gc = 0;
|
|---|
| 714 | spacePhasor.i_ = zeros(2);
|
|---|
| 715 | else
|
|---|
| 716 | Gc = coreParameters.GcRef;
|
|---|
| 717 | spacePhasor.i_ = Gc * spacePhasor.v_;
|
|---|
| 718 | end if;
|
|---|
| 719 | lossPower = 3 / 2 * ((+spacePhasor.v_[1] * spacePhasor.i_[1]) + spacePhasor.v_[2] * spacePhasor.i_[2]);
|
|---|
| 720 | end Core;
|
|---|
| 721 | end InductionMachines;
|
|---|
| 722 | end Losses;
|
|---|
| 723 |
|
|---|
| 724 | package Thermal
|
|---|
| 725 | type LinearTemperatureCoefficient20 = Modelica.SIunits.LinearTemperatureCoefficient;
|
|---|
| 726 |
|
|---|
| 727 | function convertAlpha
|
|---|
| 728 | input Modelica.SIunits.LinearTemperatureCoefficient alpha1;
|
|---|
| 729 | input Modelica.SIunits.Temperature T2;
|
|---|
| 730 | input Modelica.SIunits.Temperature T1 = 293.15;
|
|---|
| 731 | output Modelica.SIunits.LinearTemperatureCoefficient alpha2;
|
|---|
| 732 | algorithm
|
|---|
| 733 | alpha2 := alpha1 / (1 + alpha1 * (T2 - T1));
|
|---|
| 734 | end convertAlpha;
|
|---|
| 735 |
|
|---|
| 736 | package SynchronousInductionMachines
|
|---|
| 737 | model ThermalAmbientSMPM
|
|---|
| 738 | parameter Boolean useDamperCage(start = true);
|
|---|
| 739 | extends Machines.Interfaces.InductionMachines.PartialThermalAmbientInductionMachines(redeclare final Machines.Interfaces.InductionMachines.ThermalPortSMPM thermalPort(final useDamperCage = useDamperCage));
|
|---|
| 740 | parameter .Modelica.SIunits.Temperature Tpm(start = TDefault);
|
|---|
| 741 | parameter .Modelica.SIunits.Temperature Tr(start = TDefault);
|
|---|
| 742 | output .Modelica.SIunits.HeatFlowRate Q_flowRotorWinding = temperatureRotorWinding.port.Q_flow;
|
|---|
| 743 | output .Modelica.SIunits.HeatFlowRate Q_flowPermanentMagnet = temperaturePermanentMagnet.port.Q_flow;
|
|---|
| 744 | output .Modelica.SIunits.HeatFlowRate Q_flowTotal = Q_flowStatorWinding + Q_flowRotorWinding + Q_flowPermanentMagnet + Q_flowStatorCore + Q_flowRotorCore + Q_flowStrayLoad + Q_flowFriction;
|
|---|
| 745 | .Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature temperatureRotorWinding;
|
|---|
| 746 | .Modelica.Blocks.Interfaces.RealInput TRotorWinding if useTemperatureInputs and useDamperCage;
|
|---|
| 747 | .Modelica.Blocks.Sources.Constant constTr(final k = if useDamperCage then Tr else TDefault) if not useTemperatureInputs or not useDamperCage;
|
|---|
| 748 | .Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature temperaturePermanentMagnet;
|
|---|
| 749 | .Modelica.Blocks.Sources.Constant constTpm(final k = Tpm) if not useTemperatureInputs;
|
|---|
| 750 | .Modelica.Blocks.Interfaces.RealInput TPermanentMagnet if useTemperatureInputs;
|
|---|
| 751 | equation
|
|---|
| 752 | connect(constTr.y, temperatureRotorWinding.T);
|
|---|
| 753 | connect(temperatureRotorWinding.port, thermalPort.heatPortRotorWinding);
|
|---|
| 754 | connect(TRotorWinding, temperatureRotorWinding.T);
|
|---|
| 755 | connect(temperaturePermanentMagnet.port, thermalPort.heatPortPermanentMagnet);
|
|---|
| 756 | connect(constTpm.y, temperaturePermanentMagnet.T);
|
|---|
| 757 | connect(TPermanentMagnet, temperaturePermanentMagnet.T);
|
|---|
| 758 | end ThermalAmbientSMPM;
|
|---|
| 759 | end SynchronousInductionMachines;
|
|---|
| 760 | end Thermal;
|
|---|
| 761 |
|
|---|
| 762 | package Interfaces
|
|---|
| 763 | connector SpacePhasor
|
|---|
| 764 | Modelica.SIunits.Voltage[2] v_;
|
|---|
| 765 | flow Modelica.SIunits.Current[2] i_;
|
|---|
| 766 | end SpacePhasor;
|
|---|
| 767 |
|
|---|
| 768 | partial model PartialBasicMachine
|
|---|
| 769 | constant Modelica.SIunits.Angle pi = Modelica.Constants.pi;
|
|---|
| 770 | parameter Modelica.SIunits.Inertia Jr;
|
|---|
| 771 | parameter Boolean useSupport = false;
|
|---|
| 772 | parameter Modelica.SIunits.Inertia Js(start = Jr);
|
|---|
| 773 | parameter Boolean useThermalPort = false;
|
|---|
| 774 | parameter Machines.Losses.FrictionParameters frictionParameters;
|
|---|
| 775 | output Modelica.SIunits.Angle phiMechanical(start = 0) = flange.phi - internalSupport.phi;
|
|---|
| 776 | output Modelica.SIunits.AngularVelocity wMechanical(displayUnit = "1/min", start = 0) = der(phiMechanical);
|
|---|
| 777 | output Modelica.SIunits.Torque tauElectrical = inertiaRotor.flange_a.tau;
|
|---|
| 778 | output Modelica.SIunits.Torque tauShaft = -flange.tau;
|
|---|
| 779 | Modelica.Mechanics.Rotational.Interfaces.Flange_a flange;
|
|---|
| 780 | Modelica.Mechanics.Rotational.Components.Inertia inertiaRotor(final J = Jr);
|
|---|
| 781 | Modelica.Mechanics.Rotational.Interfaces.Flange_a support if useSupport;
|
|---|
| 782 | Modelica.Mechanics.Rotational.Components.Inertia inertiaStator(final J = Js);
|
|---|
| 783 | Modelica.Mechanics.Rotational.Components.Fixed fixed if not useSupport;
|
|---|
| 784 | Machines.Losses.Friction friction(final frictionParameters = frictionParameters);
|
|---|
| 785 | protected
|
|---|
| 786 | Modelica.Mechanics.Rotational.Interfaces.Support internalSupport;
|
|---|
| 787 | equation
|
|---|
| 788 | connect(inertiaRotor.flange_b, flange);
|
|---|
| 789 | connect(inertiaStator.flange_b, support);
|
|---|
| 790 | connect(internalSupport, fixed.flange);
|
|---|
| 791 | connect(internalSupport, inertiaStator.flange_a);
|
|---|
| 792 | connect(inertiaRotor.flange_b, friction.flange);
|
|---|
| 793 | connect(friction.support, internalSupport);
|
|---|
| 794 | end PartialBasicMachine;
|
|---|
| 795 |
|
|---|
| 796 | partial model PartialBasicInductionMachine
|
|---|
| 797 | final parameter Integer m = 3;
|
|---|
| 798 | parameter Integer p(min = 1, start = 2);
|
|---|
| 799 | parameter Modelica.SIunits.Frequency fsNominal(start = 50);
|
|---|
| 800 | parameter Modelica.SIunits.Temperature TsOperational(start = 293.15);
|
|---|
| 801 | parameter Modelica.SIunits.Resistance Rs(start = 0.03);
|
|---|
| 802 | parameter Modelica.SIunits.Temperature TsRef(start = 293.15);
|
|---|
| 803 | parameter Machines.Thermal.LinearTemperatureCoefficient20 alpha20s(start = 0);
|
|---|
| 804 | parameter Modelica.SIunits.Inductance Lszero = Lssigma;
|
|---|
| 805 | parameter Modelica.SIunits.Inductance Lssigma(start = 3 * (1 - sqrt(1 - 0.0667)) / (2 * pi * fsNominal));
|
|---|
| 806 | extends PartialBasicMachine(Jr(start = 0.29), frictionParameters(wRef = 2 * pi * fsNominal / p), friction(final useHeatPort = true));
|
|---|
| 807 | parameter Machines.Losses.CoreParameters statorCoreParameters(final m = 3, VRef(start = 100), wRef = 2 * pi * fsNominal);
|
|---|
| 808 | parameter Machines.Losses.StrayLoadParameters strayLoadParameters(IRef(start = 100), wRef = 2 * pi * fsNominal / p);
|
|---|
| 809 | replaceable output Machines.Interfaces.InductionMachines.PartialPowerBalanceInductionMachines powerBalance(final powerStator = Machines.SpacePhasors.Functions.activePower(vs, is), final powerMechanical = wMechanical * tauShaft, final powerInertiaStator = inertiaStator.J * inertiaStator.a * inertiaStator.w, final powerInertiaRotor = inertiaRotor.J * inertiaRotor.a * inertiaRotor.w, final lossPowerStatorWinding = sum(rs.resistor.LossPower), final lossPowerStatorCore = statorCore.lossPower, final lossPowerStrayLoad = strayLoad.lossPower, final lossPowerFriction = friction.lossPower);
|
|---|
| 810 | output Modelica.SIunits.Voltage[m] vs = plug_sp.pin.v - plug_sn.pin.v;
|
|---|
| 811 | output Modelica.SIunits.Current[m] is = plug_sp.pin.i;
|
|---|
| 812 | output Modelica.SIunits.Current i_0_s(stateSelect = StateSelect.prefer) = spacePhasorS.zero.i;
|
|---|
| 813 | input Modelica.SIunits.Current[2] idq_ss;
|
|---|
| 814 | input Modelica.SIunits.Current[2] idq_sr(each stateSelect = StateSelect.prefer);
|
|---|
| 815 | input Modelica.SIunits.Current[2] idq_rs;
|
|---|
| 816 | input Modelica.SIunits.Current[2] idq_rr(each stateSelect = StateSelect.prefer);
|
|---|
| 817 | Modelica.Electrical.MultiPhase.Interfaces.PositivePlug plug_sp(final m = m);
|
|---|
| 818 | Modelica.Electrical.MultiPhase.Interfaces.NegativePlug plug_sn(final m = m);
|
|---|
| 819 | Modelica.Electrical.MultiPhase.Basic.Resistor rs(final m = m, final R = fill(Rs, m), final T_ref = fill(TsRef, m), final alpha = fill(Machines.Thermal.convertAlpha(alpha20s, TsRef), m), final useHeatPort = true, final T = fill(TsRef, m));
|
|---|
| 820 | Machines.BasicMachines.Components.Inductor lssigma(final L = fill(Lssigma, 2));
|
|---|
| 821 | Modelica.Electrical.Analog.Basic.Inductor lszero(final L = Lszero);
|
|---|
| 822 | Machines.Losses.InductionMachines.Core statorCore(final coreParameters = statorCoreParameters, final useHeatPort = true, final turnsRatio = 1);
|
|---|
| 823 | Machines.SpacePhasors.Components.SpacePhasor spacePhasorS(final turnsRatio = 1);
|
|---|
| 824 | Machines.Losses.InductionMachines.StrayLoad strayLoad(final strayLoadParameters = strayLoadParameters, final useHeatPort = true, final m = m);
|
|---|
| 825 | replaceable Machines.Interfaces.InductionMachines.PartialThermalPortInductionMachines thermalPort(final m = m) if useThermalPort;
|
|---|
| 826 | replaceable Machines.Interfaces.InductionMachines.PartialThermalAmbientInductionMachines thermalAmbient(final useTemperatureInputs = false, final Ts = TsOperational, final m = m) if not useThermalPort;
|
|---|
| 827 | protected
|
|---|
| 828 | replaceable Machines.Interfaces.InductionMachines.PartialThermalPortInductionMachines internalThermalPort(final m = m);
|
|---|
| 829 | equation
|
|---|
| 830 | connect(spacePhasorS.plug_n, plug_sn);
|
|---|
| 831 | connect(thermalPort, internalThermalPort);
|
|---|
| 832 | connect(thermalAmbient.thermalPort, internalThermalPort);
|
|---|
| 833 | connect(strayLoad.plug_n, rs.plug_p);
|
|---|
| 834 | connect(strayLoad.plug_p, plug_sp);
|
|---|
| 835 | connect(strayLoad.support, internalSupport);
|
|---|
| 836 | connect(spacePhasorS.plug_p, rs.plug_n);
|
|---|
| 837 | connect(spacePhasorS.zero, lszero.p);
|
|---|
| 838 | connect(lszero.n, spacePhasorS.ground);
|
|---|
| 839 | connect(spacePhasorS.spacePhasor, lssigma.spacePhasor_a);
|
|---|
| 840 | connect(statorCore.spacePhasor, lssigma.spacePhasor_a);
|
|---|
| 841 | connect(statorCore.heatPort, internalThermalPort.heatPortStatorCore);
|
|---|
| 842 | connect(strayLoad.heatPort, internalThermalPort.heatPortStrayLoad);
|
|---|
| 843 | connect(rs.heatPort, internalThermalPort.heatPortStatorWinding);
|
|---|
| 844 | connect(friction.heatPort, internalThermalPort.heatPortFriction);
|
|---|
| 845 | connect(strayLoad.flange, inertiaRotor.flange_b);
|
|---|
| 846 | end PartialBasicInductionMachine;
|
|---|
| 847 |
|
|---|
| 848 | package InductionMachines
|
|---|
| 849 | connector PartialThermalPortInductionMachines
|
|---|
| 850 | parameter Integer m = 3;
|
|---|
| 851 | Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a[m] heatPortStatorWinding;
|
|---|
| 852 | Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a heatPortStatorCore;
|
|---|
| 853 | Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a heatPortRotorCore;
|
|---|
| 854 | Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a heatPortStrayLoad;
|
|---|
| 855 | Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a heatPortFriction;
|
|---|
| 856 | end PartialThermalPortInductionMachines;
|
|---|
| 857 |
|
|---|
| 858 | model PartialThermalAmbientInductionMachines
|
|---|
| 859 | parameter Integer m = 3;
|
|---|
| 860 | parameter Boolean useTemperatureInputs = false;
|
|---|
| 861 | constant Modelica.SIunits.Temperature TDefault = 293.15;
|
|---|
| 862 | parameter Modelica.SIunits.Temperature Ts(start = TDefault);
|
|---|
| 863 | output Modelica.SIunits.HeatFlowRate Q_flowStatorWinding = temperatureStatorWinding.port.Q_flow;
|
|---|
| 864 | output Modelica.SIunits.HeatFlowRate Q_flowStatorCore = temperatureStatorCore.port.Q_flow;
|
|---|
| 865 | output Modelica.SIunits.HeatFlowRate Q_flowRotorCore = temperatureRotorCore.port.Q_flow;
|
|---|
| 866 | output Modelica.SIunits.HeatFlowRate Q_flowStrayLoad = temperatureStrayLoad.port.Q_flow;
|
|---|
| 867 | output Modelica.SIunits.HeatFlowRate Q_flowFriction = temperatureFriction.port.Q_flow;
|
|---|
| 868 | replaceable Machines.Interfaces.InductionMachines.PartialThermalPortInductionMachines thermalPort(final m = m);
|
|---|
| 869 | Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature temperatureStatorWinding;
|
|---|
| 870 | Modelica.Thermal.HeatTransfer.Sources.FixedTemperature temperatureStatorCore(final T = TDefault);
|
|---|
| 871 | Modelica.Thermal.HeatTransfer.Sources.FixedTemperature temperatureRotorCore(final T = TDefault);
|
|---|
| 872 | Modelica.Thermal.HeatTransfer.Sources.FixedTemperature temperatureStrayLoad(final T = TDefault);
|
|---|
| 873 | Modelica.Thermal.HeatTransfer.Sources.FixedTemperature temperatureFriction(final T = TDefault);
|
|---|
| 874 | Modelica.Blocks.Interfaces.RealInput TStatorWinding if useTemperatureInputs;
|
|---|
| 875 | Modelica.Blocks.Sources.Constant constTs(final k = Ts) if not useTemperatureInputs;
|
|---|
| 876 | Modelica.Thermal.HeatTransfer.Components.ThermalCollector thermalCollectorStator(final m = m);
|
|---|
| 877 | equation
|
|---|
| 878 | connect(constTs.y, temperatureStatorWinding.T);
|
|---|
| 879 | connect(TStatorWinding, temperatureStatorWinding.T);
|
|---|
| 880 | connect(temperatureStrayLoad.port, thermalPort.heatPortStrayLoad);
|
|---|
| 881 | connect(temperatureFriction.port, thermalPort.heatPortFriction);
|
|---|
| 882 | connect(thermalCollectorStator.port_b, temperatureStatorWinding.port);
|
|---|
| 883 | connect(thermalCollectorStator.port_a, thermalPort.heatPortStatorWinding);
|
|---|
| 884 | connect(temperatureStatorCore.port, thermalPort.heatPortStatorCore);
|
|---|
| 885 | connect(temperatureRotorCore.port, thermalPort.heatPortRotorCore);
|
|---|
| 886 | end PartialThermalAmbientInductionMachines;
|
|---|
| 887 |
|
|---|
| 888 | record PartialPowerBalanceInductionMachines
|
|---|
| 889 | Modelica.SIunits.Power powerStator = 0;
|
|---|
| 890 | Modelica.SIunits.Power powerMechanical = 0;
|
|---|
| 891 | Modelica.SIunits.Power powerInertiaStator = 0;
|
|---|
| 892 | Modelica.SIunits.Power powerInertiaRotor = 0;
|
|---|
| 893 | Modelica.SIunits.Power lossPowerTotal = 0;
|
|---|
| 894 | Modelica.SIunits.Power lossPowerStatorWinding = 0;
|
|---|
| 895 | Modelica.SIunits.Power lossPowerStatorCore = 0;
|
|---|
| 896 | Modelica.SIunits.Power lossPowerRotorCore = 0;
|
|---|
| 897 | Modelica.SIunits.Power lossPowerStrayLoad = 0;
|
|---|
| 898 | Modelica.SIunits.Power lossPowerFriction = 0;
|
|---|
| 899 | end PartialPowerBalanceInductionMachines;
|
|---|
| 900 |
|
|---|
| 901 | connector ThermalPortSMPM
|
|---|
| 902 | extends Machines.Interfaces.InductionMachines.PartialThermalPortInductionMachines;
|
|---|
| 903 | parameter Boolean useDamperCage(start = true);
|
|---|
| 904 | Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a heatPortRotorWinding if useDamperCage;
|
|---|
| 905 | Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a heatPortPermanentMagnet;
|
|---|
| 906 | end ThermalPortSMPM;
|
|---|
| 907 |
|
|---|
| 908 | record PowerBalanceSMPM
|
|---|
| 909 | extends Machines.Interfaces.InductionMachines.PartialPowerBalanceInductionMachines(final lossPowerTotal = lossPowerStatorWinding + lossPowerStatorCore + lossPowerRotorCore + lossPowerStrayLoad + lossPowerFriction + lossPowerRotorWinding + lossPowerPermanentMagnet);
|
|---|
| 910 | Modelica.SIunits.Power lossPowerRotorWinding;
|
|---|
| 911 | Modelica.SIunits.Power lossPowerPermanentMagnet;
|
|---|
| 912 | end PowerBalanceSMPM;
|
|---|
| 913 | end InductionMachines;
|
|---|
| 914 |
|
|---|
| 915 | partial model FlangeSupport
|
|---|
| 916 | Modelica.Mechanics.Rotational.Interfaces.Flange_a flange;
|
|---|
| 917 | Modelica.Mechanics.Rotational.Interfaces.Flange_a support;
|
|---|
| 918 | Modelica.SIunits.Angle phi;
|
|---|
| 919 | Modelica.SIunits.Torque tau;
|
|---|
| 920 | Modelica.SIunits.AngularVelocity w;
|
|---|
| 921 | equation
|
|---|
| 922 | phi = flange.phi - support.phi;
|
|---|
| 923 | w = der(phi);
|
|---|
| 924 | tau = -flange.tau;
|
|---|
| 925 | tau = support.tau;
|
|---|
| 926 | end FlangeSupport;
|
|---|
| 927 | end Interfaces;
|
|---|
| 928 |
|
|---|
| 929 | package Utilities
|
|---|
| 930 | package ParameterRecords
|
|---|
| 931 | record InductionMachineData
|
|---|
| 932 | final parameter Integer m = 3;
|
|---|
| 933 | parameter Modelica.SIunits.Inertia Jr = 0.29;
|
|---|
| 934 | parameter Modelica.SIunits.Inertia Js = Jr;
|
|---|
| 935 | parameter Integer p(min = 1) = 2;
|
|---|
| 936 | parameter Modelica.SIunits.Frequency fsNominal = 50;
|
|---|
| 937 | parameter Modelica.SIunits.Resistance Rs = 0.03;
|
|---|
| 938 | parameter Modelica.SIunits.Temperature TsRef = 293.15;
|
|---|
| 939 | parameter Machines.Thermal.LinearTemperatureCoefficient20 alpha20s = 0;
|
|---|
| 940 | parameter Modelica.SIunits.Inductance Lszero = Lssigma;
|
|---|
| 941 | parameter Modelica.SIunits.Inductance Lssigma = 3 * (1 - sqrt(1 - 0.0667)) / (2 * .Modelica.Constants.pi * fsNominal);
|
|---|
| 942 | parameter Machines.Losses.FrictionParameters frictionParameters(PRef = 0, wRef = 2 * .Modelica.Constants.pi * fsNominal / p);
|
|---|
| 943 | parameter Machines.Losses.CoreParameters statorCoreParameters(final m = m, PRef = 0, VRef = 100, wRef = 2 * .Modelica.Constants.pi * fsNominal);
|
|---|
| 944 | parameter Machines.Losses.StrayLoadParameters strayLoadParameters(PRef = 0, IRef = 100, wRef = 2 * .Modelica.Constants.pi * fsNominal / p);
|
|---|
| 945 | end InductionMachineData;
|
|---|
| 946 |
|
|---|
| 947 | record SM_PermanentMagnetData
|
|---|
| 948 | extends SM_ReluctanceRotorData(Lmd = 0.3 / (2 * .Modelica.Constants.pi * fsNominal), Lmq = 0.3 / (2 * .Modelica.Constants.pi * fsNominal));
|
|---|
| 949 | parameter Modelica.SIunits.Voltage VsOpenCircuit = 112.3;
|
|---|
| 950 | parameter Machines.Losses.PermanentMagnetLossParameters permanentMagnetLossParameters(PRef = 0, IRef = 100, wRef = 2 * .Modelica.Constants.pi * fsNominal / p);
|
|---|
| 951 | end SM_PermanentMagnetData;
|
|---|
| 952 |
|
|---|
| 953 | record SM_ReluctanceRotorData
|
|---|
| 954 | extends InductionMachineData(Lssigma = 0.1 / (2 * .Modelica.Constants.pi * fsNominal));
|
|---|
| 955 | parameter Modelica.SIunits.Inductance Lmd = 2.9 / (2 * .Modelica.Constants.pi * fsNominal);
|
|---|
| 956 | parameter Modelica.SIunits.Inductance Lmq = 0.9 / (2 * .Modelica.Constants.pi * fsNominal);
|
|---|
| 957 | parameter Boolean useDamperCage = true;
|
|---|
| 958 | parameter Modelica.SIunits.Inductance Lrsigmad = 0.05 / (2 * .Modelica.Constants.pi * fsNominal);
|
|---|
| 959 | parameter Modelica.SIunits.Inductance Lrsigmaq = Lrsigmad;
|
|---|
| 960 | parameter Modelica.SIunits.Resistance Rrd = 0.04;
|
|---|
| 961 | parameter Modelica.SIunits.Resistance Rrq = Rrd;
|
|---|
| 962 | parameter Modelica.SIunits.Temperature TrRef = 293.15;
|
|---|
| 963 | parameter Machines.Thermal.LinearTemperatureCoefficient20 alpha20r = 0;
|
|---|
| 964 | end SM_ReluctanceRotorData;
|
|---|
| 965 | end ParameterRecords;
|
|---|
| 966 |
|
|---|
| 967 | model CurrentController
|
|---|
| 968 | constant Integer m = 3;
|
|---|
| 969 | parameter Integer p;
|
|---|
| 970 | extends Modelica.Blocks.Interfaces.MO(final nout = m);
|
|---|
| 971 | Modelica.Blocks.Interfaces.RealInput id_rms;
|
|---|
| 972 | Modelica.Blocks.Interfaces.RealInput iq_rms;
|
|---|
| 973 | Modelica.Blocks.Interfaces.RealInput phi;
|
|---|
| 974 | Modelica.Blocks.Math.Gain toPeak_d(k = sqrt(2));
|
|---|
| 975 | Modelica.Blocks.Math.Gain toPeak_q(k = sqrt(2));
|
|---|
| 976 | Modelica.Blocks.Math.Gain toGamma(k = -p);
|
|---|
| 977 | Machines.SpacePhasors.Blocks.Rotator rotator;
|
|---|
| 978 | Modelica.Blocks.Sources.Constant i0(k = 0);
|
|---|
| 979 | Machines.SpacePhasors.Blocks.FromSpacePhasor fromSpacePhasor;
|
|---|
| 980 | equation
|
|---|
| 981 | connect(iq_rms, toPeak_q.u);
|
|---|
| 982 | connect(phi, toGamma.u);
|
|---|
| 983 | connect(rotator.angle, toGamma.y);
|
|---|
| 984 | connect(rotator.y, fromSpacePhasor.u);
|
|---|
| 985 | connect(toPeak_d.u, id_rms);
|
|---|
| 986 | connect(toPeak_d.y, rotator.u[1]);
|
|---|
| 987 | connect(toPeak_q.y, rotator.u[2]);
|
|---|
| 988 | connect(i0.y, fromSpacePhasor.zero);
|
|---|
| 989 | connect(fromSpacePhasor.y, y);
|
|---|
| 990 | end CurrentController;
|
|---|
| 991 |
|
|---|
| 992 | model TerminalBox
|
|---|
| 993 | parameter Integer m = 3;
|
|---|
| 994 | parameter String terminalConnection(start = "Y");
|
|---|
| 995 | Modelica.Electrical.MultiPhase.Interfaces.PositivePlug plug_sp(final m = m);
|
|---|
| 996 | Modelica.Electrical.MultiPhase.Interfaces.NegativePlug plug_sn(final m = m);
|
|---|
| 997 | Modelica.Electrical.MultiPhase.Basic.Star star(final m = m) if terminalConnection <> "D";
|
|---|
| 998 | Modelica.Electrical.MultiPhase.Basic.Delta delta(final m = m) if terminalConnection == "D";
|
|---|
| 999 | Modelica.Electrical.MultiPhase.Interfaces.PositivePlug plugSupply(final m = m);
|
|---|
| 1000 | Modelica.Electrical.Analog.Interfaces.NegativePin starpoint if terminalConnection <> "D";
|
|---|
| 1001 | equation
|
|---|
| 1002 | connect(plug_sn, star.plug_p);
|
|---|
| 1003 | connect(plug_sn, delta.plug_n);
|
|---|
| 1004 | connect(delta.plug_p, plug_sp);
|
|---|
| 1005 | connect(plug_sp, plugSupply);
|
|---|
| 1006 | connect(star.pin_n, starpoint);
|
|---|
| 1007 | end TerminalBox;
|
|---|
| 1008 | end Utilities;
|
|---|
| 1009 | end Machines;
|
|---|
| 1010 |
|
|---|
| 1011 | package MultiPhase
|
|---|
| 1012 | package Basic
|
|---|
| 1013 | model Star
|
|---|
| 1014 | parameter Integer m(final min = 1) = 3;
|
|---|
| 1015 | Interfaces.PositivePlug plug_p(final m = m);
|
|---|
| 1016 | Modelica.Electrical.Analog.Interfaces.NegativePin pin_n;
|
|---|
| 1017 | equation
|
|---|
| 1018 | for j in 1:m loop
|
|---|
| 1019 | plug_p.pin[j].v = pin_n.v;
|
|---|
| 1020 | end for;
|
|---|
| 1021 | sum(plug_p.pin.i) + pin_n.i = 0;
|
|---|
| 1022 | end Star;
|
|---|
| 1023 |
|
|---|
| 1024 | model Delta
|
|---|
| 1025 | parameter Integer m(final min = 2) = 3;
|
|---|
| 1026 | Interfaces.PositivePlug plug_p(final m = m);
|
|---|
| 1027 | Interfaces.NegativePlug plug_n(final m = m);
|
|---|
| 1028 | equation
|
|---|
| 1029 | for j in 1:m loop
|
|---|
| 1030 | if j < m then
|
|---|
| 1031 | plug_n.pin[j].v = plug_p.pin[j + 1].v;
|
|---|
| 1032 | plug_n.pin[j].i + plug_p.pin[j + 1].i = 0;
|
|---|
| 1033 | else
|
|---|
| 1034 | plug_n.pin[j].v = plug_p.pin[1].v;
|
|---|
| 1035 | plug_n.pin[j].i + plug_p.pin[1].i = 0;
|
|---|
| 1036 | end if;
|
|---|
| 1037 | end for;
|
|---|
| 1038 | end Delta;
|
|---|
| 1039 |
|
|---|
| 1040 | model Resistor
|
|---|
| 1041 | extends Interfaces.TwoPlug;
|
|---|
| 1042 | parameter Modelica.SIunits.Resistance[m] R(start = fill(1, m));
|
|---|
| 1043 | parameter Modelica.SIunits.Temperature[m] T_ref = fill(300.15, m);
|
|---|
| 1044 | parameter Modelica.SIunits.LinearTemperatureCoefficient[m] alpha = zeros(m);
|
|---|
| 1045 | extends Modelica.Electrical.MultiPhase.Interfaces.ConditionalHeatPort(final mh = m, T = T_ref);
|
|---|
| 1046 | Modelica.Electrical.Analog.Basic.Resistor[m] resistor(final R = R, final T_ref = T_ref, final alpha = alpha, each final useHeatPort = useHeatPort, final T = T);
|
|---|
| 1047 | equation
|
|---|
| 1048 | connect(resistor.p, plug_p.pin);
|
|---|
| 1049 | connect(resistor.n, plug_n.pin);
|
|---|
| 1050 | connect(resistor.heatPort, heatPort);
|
|---|
| 1051 | end Resistor;
|
|---|
| 1052 | end Basic;
|
|---|
| 1053 |
|
|---|
| 1054 | package Functions
|
|---|
| 1055 | function quasiRMS
|
|---|
| 1056 | input Real[:] x;
|
|---|
| 1057 | output Real y;
|
|---|
| 1058 | algorithm
|
|---|
| 1059 | y := sqrt(sum(x .^ 2 / size(x, 1)));
|
|---|
| 1060 | end quasiRMS;
|
|---|
| 1061 | end Functions;
|
|---|
| 1062 |
|
|---|
| 1063 | package Sensors
|
|---|
| 1064 | model VoltageSensor
|
|---|
| 1065 | parameter Integer m(final min = 1) = 3;
|
|---|
| 1066 | Interfaces.PositivePlug plug_p(final m = m);
|
|---|
| 1067 | Interfaces.NegativePlug plug_n(final m = m);
|
|---|
| 1068 | Modelica.Blocks.Interfaces.RealOutput[m] v;
|
|---|
| 1069 | Modelica.Electrical.Analog.Sensors.VoltageSensor[m] voltageSensor;
|
|---|
| 1070 | equation
|
|---|
| 1071 | connect(voltageSensor.n, plug_n.pin);
|
|---|
| 1072 | connect(voltageSensor.p, plug_p.pin);
|
|---|
| 1073 | connect(voltageSensor.v, v);
|
|---|
| 1074 | end VoltageSensor;
|
|---|
| 1075 |
|
|---|
| 1076 | model CurrentSensor
|
|---|
| 1077 | parameter Integer m(final min = 1) = 3;
|
|---|
| 1078 | Interfaces.PositivePlug plug_p(final m = m);
|
|---|
| 1079 | Interfaces.NegativePlug plug_n(final m = m);
|
|---|
| 1080 | Modelica.Blocks.Interfaces.RealOutput[m] i;
|
|---|
| 1081 | Modelica.Electrical.Analog.Sensors.CurrentSensor[m] currentSensor;
|
|---|
| 1082 | equation
|
|---|
| 1083 | connect(plug_p.pin, currentSensor.p);
|
|---|
| 1084 | connect(currentSensor.n, plug_n.pin);
|
|---|
| 1085 | connect(currentSensor.i, i);
|
|---|
| 1086 | end CurrentSensor;
|
|---|
| 1087 | end Sensors;
|
|---|
| 1088 |
|
|---|
| 1089 | package Sources
|
|---|
| 1090 | model SignalCurrent
|
|---|
| 1091 | parameter Integer m(min = 1) = 3;
|
|---|
| 1092 | Modelica.SIunits.Voltage[m] v = plug_p.pin.v - plug_n.pin.v;
|
|---|
| 1093 | Interfaces.PositivePlug plug_p(final m = m);
|
|---|
| 1094 | Interfaces.NegativePlug plug_n(final m = m);
|
|---|
| 1095 | Modelica.Blocks.Interfaces.RealInput[m] i(each unit = "A");
|
|---|
| 1096 | Modelica.Electrical.Analog.Sources.SignalCurrent[m] signalCurrent;
|
|---|
| 1097 | equation
|
|---|
| 1098 | connect(signalCurrent.p, plug_p.pin);
|
|---|
| 1099 | connect(signalCurrent.n, plug_n.pin);
|
|---|
| 1100 | connect(i, signalCurrent.i);
|
|---|
| 1101 | end SignalCurrent;
|
|---|
| 1102 | end Sources;
|
|---|
| 1103 |
|
|---|
| 1104 | package Interfaces
|
|---|
| 1105 | connector Plug
|
|---|
| 1106 | parameter Integer m(final min = 1) = 3;
|
|---|
| 1107 | Modelica.Electrical.Analog.Interfaces.Pin[m] pin;
|
|---|
| 1108 | end Plug;
|
|---|
| 1109 |
|
|---|
| 1110 | connector PositivePlug
|
|---|
| 1111 | extends Plug;
|
|---|
| 1112 | end PositivePlug;
|
|---|
| 1113 |
|
|---|
| 1114 | connector NegativePlug
|
|---|
| 1115 | extends Plug;
|
|---|
| 1116 | end NegativePlug;
|
|---|
| 1117 |
|
|---|
| 1118 | partial model ConditionalHeatPort
|
|---|
| 1119 | parameter Integer mh(min = 1) = 3;
|
|---|
| 1120 | parameter Boolean useHeatPort = false;
|
|---|
| 1121 | parameter Modelica.SIunits.Temperature[mh] T = fill(293.15, mh);
|
|---|
| 1122 | Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a[mh] heatPort if useHeatPort;
|
|---|
| 1123 | end ConditionalHeatPort;
|
|---|
| 1124 |
|
|---|
| 1125 | partial model TwoPlug
|
|---|
| 1126 | parameter Integer m(min = 1) = 3;
|
|---|
| 1127 | Modelica.SIunits.Voltage[m] v;
|
|---|
| 1128 | Modelica.SIunits.Current[m] i;
|
|---|
| 1129 | PositivePlug plug_p(final m = m);
|
|---|
| 1130 | NegativePlug plug_n(final m = m);
|
|---|
| 1131 | equation
|
|---|
| 1132 | v = plug_p.pin.v - plug_n.pin.v;
|
|---|
| 1133 | i = plug_p.pin.i;
|
|---|
| 1134 | end TwoPlug;
|
|---|
| 1135 |
|
|---|
| 1136 | partial model OnePort
|
|---|
| 1137 | extends TwoPlug;
|
|---|
| 1138 | equation
|
|---|
| 1139 | plug_p.pin.i + plug_n.pin.i = zeros(m);
|
|---|
| 1140 | end OnePort;
|
|---|
| 1141 | end Interfaces;
|
|---|
| 1142 | end MultiPhase;
|
|---|
| 1143 | end Electrical;
|
|---|
| 1144 |
|
|---|
| 1145 | package Mechanics
|
|---|
| 1146 | package Rotational
|
|---|
| 1147 | package Components
|
|---|
| 1148 | model Fixed
|
|---|
| 1149 | parameter .Modelica.SIunits.Angle phi0 = 0;
|
|---|
| 1150 | Interfaces.Flange_b flange;
|
|---|
| 1151 | equation
|
|---|
| 1152 | flange.phi = phi0;
|
|---|
| 1153 | end Fixed;
|
|---|
| 1154 |
|
|---|
| 1155 | model Inertia
|
|---|
| 1156 | Rotational.Interfaces.Flange_a flange_a;
|
|---|
| 1157 | Rotational.Interfaces.Flange_b flange_b;
|
|---|
| 1158 | parameter .Modelica.SIunits.Inertia J(min = 0, start = 1);
|
|---|
| 1159 | parameter StateSelect stateSelect = StateSelect.default;
|
|---|
| 1160 | .Modelica.SIunits.Angle phi(stateSelect = stateSelect);
|
|---|
| 1161 | .Modelica.SIunits.AngularVelocity w(stateSelect = stateSelect);
|
|---|
| 1162 | .Modelica.SIunits.AngularAcceleration a;
|
|---|
| 1163 | equation
|
|---|
| 1164 | phi = flange_a.phi;
|
|---|
| 1165 | phi = flange_b.phi;
|
|---|
| 1166 | w = der(phi);
|
|---|
| 1167 | a = der(w);
|
|---|
| 1168 | J * a = flange_a.tau + flange_b.tau;
|
|---|
| 1169 | end Inertia;
|
|---|
| 1170 |
|
|---|
| 1171 | model ElastoBacklash
|
|---|
| 1172 | parameter .Modelica.SIunits.RotationalSpringConstant c(final min = Modelica.Constants.small, start = 1.0e5);
|
|---|
| 1173 | parameter .Modelica.SIunits.RotationalDampingConstant d(final min = 0, start = 0);
|
|---|
| 1174 | parameter .Modelica.SIunits.Angle b(final min = 0) = 0;
|
|---|
| 1175 | parameter .Modelica.SIunits.Angle phi_rel0 = 0;
|
|---|
| 1176 | extends Modelica.Mechanics.Rotational.Interfaces.PartialCompliantWithRelativeStates;
|
|---|
| 1177 | extends Modelica.Thermal.HeatTransfer.Interfaces.PartialElementaryConditionalHeatPortWithoutT;
|
|---|
| 1178 | protected
|
|---|
| 1179 | final parameter .Modelica.SIunits.Angle bMax = b / 2;
|
|---|
| 1180 | final parameter .Modelica.SIunits.Angle bMin = -bMax;
|
|---|
| 1181 | .Modelica.SIunits.Torque tau_c;
|
|---|
| 1182 | .Modelica.SIunits.Torque tau_d;
|
|---|
| 1183 | .Modelica.SIunits.Angle phi_diff = phi_rel - phi_rel0;
|
|---|
| 1184 | constant .Modelica.SIunits.Angle bEps = 1e-10;
|
|---|
| 1185 | equation
|
|---|
| 1186 | if initial() then
|
|---|
| 1187 | tau_c = if phi_diff > 1.5 * bMax then c * (phi_diff - bMax) else if phi_diff < 1.5 * bMin then c * (phi_diff - bMin) else c / 3 * phi_diff;
|
|---|
| 1188 | tau_d = d * w_rel;
|
|---|
| 1189 | tau = tau_c + tau_d;
|
|---|
| 1190 | lossPower = tau_d * w_rel;
|
|---|
| 1191 | else
|
|---|
| 1192 | tau_c = if abs(b) <= bEps then c * phi_diff else if phi_diff > bMax then c * (phi_diff - bMax) else if phi_diff < bMin then c * (phi_diff - bMin) else 0;
|
|---|
| 1193 | tau_d = d * w_rel;
|
|---|
| 1194 | tau = if abs(b) <= bEps then tau_c + tau_d else if phi_diff > bMax then smooth(0, noEvent(if tau_c + tau_d <= 0 then 0 else tau_c + min(tau_c, tau_d))) else if phi_diff < bMin then smooth(0, noEvent(if tau_c + tau_d >= 0 then 0 else tau_c + max(tau_c, tau_d))) else 0;
|
|---|
| 1195 | lossPower = if abs(b) <= bEps then tau_d * w_rel else if phi_diff > bMax then smooth(0, noEvent(if tau_c + tau_d <= 0 then 0 else min(tau_c, tau_d) * w_rel)) else if phi_diff < bMin then smooth(0, noEvent(if tau_c + tau_d >= 0 then 0 else max(tau_c, tau_d) * w_rel)) else 0;
|
|---|
| 1196 | end if;
|
|---|
| 1197 | end ElastoBacklash;
|
|---|
| 1198 |
|
|---|
| 1199 | model LossyGear
|
|---|
| 1200 | extends Modelica.Mechanics.Rotational.Interfaces.PartialElementaryTwoFlangesAndSupport2;
|
|---|
| 1201 | parameter Real ratio(start = 1);
|
|---|
| 1202 | parameter Real[:, 5] lossTable = [0, 1, 1, 0, 0];
|
|---|
| 1203 | extends Modelica.Thermal.HeatTransfer.Interfaces.PartialElementaryConditionalHeatPortWithoutT;
|
|---|
| 1204 | Modelica.SIunits.Angle phi_a;
|
|---|
| 1205 | Modelica.SIunits.Angle phi_b;
|
|---|
| 1206 | Real sa(final unit = "1");
|
|---|
| 1207 | .Modelica.SIunits.AngularVelocity w_a;
|
|---|
| 1208 | .Modelica.SIunits.AngularAcceleration a_a;
|
|---|
| 1209 | Real[1, size(lossTable, 2) - 1] interpolation_result;
|
|---|
| 1210 | Real eta_mf1;
|
|---|
| 1211 | Real eta_mf2;
|
|---|
| 1212 | Real tau_bf_a;
|
|---|
| 1213 | Real tau_eta;
|
|---|
| 1214 | Real tau_bf1;
|
|---|
| 1215 | Real tau_bf2;
|
|---|
| 1216 | Real quadrant1;
|
|---|
| 1217 | Real quadrant2;
|
|---|
| 1218 | Real quadrant3;
|
|---|
| 1219 | Real quadrant4;
|
|---|
| 1220 | Real quadrant1_p;
|
|---|
| 1221 | Real quadrant2_p;
|
|---|
| 1222 | Real quadrant3_m;
|
|---|
| 1223 | Real quadrant4_m;
|
|---|
| 1224 | .Modelica.SIunits.Torque tauLoss;
|
|---|
| 1225 | .Modelica.SIunits.Torque tauLossMax;
|
|---|
| 1226 | .Modelica.SIunits.Torque tauLossMin;
|
|---|
| 1227 | .Modelica.SIunits.Torque tauLossMax_p;
|
|---|
| 1228 | .Modelica.SIunits.Torque tauLossMin_m;
|
|---|
| 1229 | Boolean tau_aPos(start = true);
|
|---|
| 1230 | Boolean tau_etaPos(start = true);
|
|---|
| 1231 | Boolean startForward(start = false);
|
|---|
| 1232 | Boolean startBackward(start = false);
|
|---|
| 1233 | Boolean locked(start = false);
|
|---|
| 1234 | Boolean ideal;
|
|---|
| 1235 | constant Integer Unknown = 3;
|
|---|
| 1236 | constant Integer Free = 2;
|
|---|
| 1237 | constant Integer Forward = 1;
|
|---|
| 1238 | constant Integer Stuck = 0;
|
|---|
| 1239 | constant Integer Backward = -1;
|
|---|
| 1240 | Integer mode(final min = Backward, final max = Unknown, start = Free, fixed = true);
|
|---|
| 1241 | .Modelica.SIunits.Torque tau_eta_p;
|
|---|
| 1242 | .Modelica.SIunits.Torque tau_eta_m;
|
|---|
| 1243 | protected
|
|---|
| 1244 | constant .Modelica.SIunits.AngularAcceleration unitAngularAcceleration = 1;
|
|---|
| 1245 | constant .Modelica.SIunits.Torque unitTorque = 1;
|
|---|
| 1246 | parameter Real[1, size(lossTable, 2) - 1] interpolation_result_0 = Modelica.Math.tempInterpol2(0, lossTable, {2, 3, 4, 5});
|
|---|
| 1247 | parameter Real eta_mf1_0 = interpolation_result_0[1, 1];
|
|---|
| 1248 | parameter Real eta_mf2_0 = interpolation_result_0[1, 2];
|
|---|
| 1249 | parameter Real tau_bf1_0 = abs(interpolation_result_0[1, 3]);
|
|---|
| 1250 | parameter Real tau_bf2_0 = abs(interpolation_result_0[1, 4]);
|
|---|
| 1251 | parameter Real tau_bf_a_0 = if Modelica.Math.isEqual(eta_mf1_0, 1.0, Modelica.Constants.eps) and Modelica.Math.isEqual(eta_mf2_0, 1.0, Modelica.Constants.eps) then tau_bf1_0 / 2 else (tau_bf1_0 - tau_bf2_0) / (eta_mf1_0 - 1.0 / eta_mf2_0);
|
|---|
| 1252 | equation
|
|---|
| 1253 | assert(abs(ratio) > 0, "Error in initialization of LossyGear: ratio may not be zero");
|
|---|
| 1254 | ideal = Modelica.Math.Matrices.isEqual(lossTable, [0, 1, 1, 0, 0], Modelica.Constants.eps);
|
|---|
| 1255 | interpolation_result = if ideal then [1, 1, 0, 0] else Modelica.Math.tempInterpol2(noEvent(abs(w_a)), lossTable, {2, 3, 4, 5});
|
|---|
| 1256 | eta_mf1 = interpolation_result[1, 1];
|
|---|
| 1257 | eta_mf2 = interpolation_result[1, 2];
|
|---|
| 1258 | tau_bf1 = noEvent(abs(interpolation_result[1, 3]));
|
|---|
| 1259 | tau_bf2 = noEvent(abs(interpolation_result[1, 4]));
|
|---|
| 1260 | if Modelica.Math.isEqual(eta_mf1, 1.0, Modelica.Constants.eps) and Modelica.Math.isEqual(eta_mf2, 1.0, Modelica.Constants.eps) then
|
|---|
| 1261 | tau_bf_a = tau_bf1 / 2;
|
|---|
| 1262 | else
|
|---|
| 1263 | tau_bf_a = (tau_bf1 - tau_bf2) / (eta_mf1 - 1.0 / eta_mf2);
|
|---|
| 1264 | end if;
|
|---|
| 1265 | phi_a = flange_a.phi - phi_support;
|
|---|
| 1266 | phi_b = flange_b.phi - phi_support;
|
|---|
| 1267 | phi_a = ratio * phi_b;
|
|---|
| 1268 | 0 = flange_b.tau + ratio * (flange_a.tau - tauLoss);
|
|---|
| 1269 | w_a = der(phi_a);
|
|---|
| 1270 | a_a = der(w_a);
|
|---|
| 1271 | tau_eta_p = flange_a.tau - tau_bf_a_0;
|
|---|
| 1272 | tau_eta_m = flange_a.tau + tau_bf_a_0;
|
|---|
| 1273 | quadrant1_p = (1 - eta_mf1_0) * flange_a.tau + tau_bf1_0;
|
|---|
| 1274 | quadrant2_p = (1 - 1 / eta_mf2_0) * flange_a.tau + tau_bf2_0;
|
|---|
| 1275 | tauLossMax_p = if noEvent(tau_eta_p > 0) then quadrant1_p else quadrant2_p;
|
|---|
| 1276 | quadrant4_m = (1 - 1 / eta_mf2_0) * flange_a.tau - tau_bf2_0;
|
|---|
| 1277 | quadrant3_m = (1 - eta_mf1_0) * flange_a.tau - tau_bf1_0;
|
|---|
| 1278 | tauLossMin_m = if noEvent(tau_eta_m > 0) then quadrant4_m else quadrant3_m;
|
|---|
| 1279 | quadrant1 = (1 - eta_mf1) * flange_a.tau + tau_bf1;
|
|---|
| 1280 | quadrant2 = (1 - 1 / eta_mf2) * flange_a.tau + tau_bf2;
|
|---|
| 1281 | quadrant4 = (1 - 1 / eta_mf2) * flange_a.tau - tau_bf2;
|
|---|
| 1282 | quadrant3 = (1 - eta_mf1) * flange_a.tau - tau_bf1;
|
|---|
| 1283 | tau_eta = if ideal then flange_a.tau else if locked then flange_a.tau else if startForward or pre(mode) == Forward then flange_a.tau - tau_bf_a else flange_a.tau + tau_bf_a;
|
|---|
| 1284 | tau_etaPos = tau_eta >= 0;
|
|---|
| 1285 | tau_aPos = tau_etaPos;
|
|---|
| 1286 | tauLossMax = if tau_etaPos then quadrant1 else quadrant2;
|
|---|
| 1287 | tauLossMin = if tau_etaPos then quadrant4 else quadrant3;
|
|---|
| 1288 | startForward = pre(mode) == Stuck and sa > tauLossMax_p / unitTorque or initial() and w_a > 0;
|
|---|
| 1289 | startBackward = pre(mode) == Stuck and sa < tauLossMin_m / unitTorque or initial() and w_a < 0;
|
|---|
| 1290 | locked = not (ideal or pre(mode) == Forward or startForward or pre(mode) == Backward or startBackward);
|
|---|
| 1291 | tauLoss = if ideal then 0 else if locked then sa * unitTorque else if startForward or pre(mode) == Forward then tauLossMax else tauLossMin;
|
|---|
| 1292 | a_a = unitAngularAcceleration * (if locked then 0 else sa - tauLoss / unitTorque);
|
|---|
| 1293 | mode = if ideal then Free else if (pre(mode) == Forward or startForward) and w_a > 0 then Forward else if (pre(mode) == Backward or startBackward) and w_a < 0 then Backward else Stuck;
|
|---|
| 1294 | lossPower = tauLoss * w_a;
|
|---|
| 1295 | end LossyGear;
|
|---|
| 1296 |
|
|---|
| 1297 | model Gearbox
|
|---|
| 1298 | extends Modelica.Mechanics.Rotational.Interfaces.PartialTwoFlangesAndSupport;
|
|---|
| 1299 | parameter Real ratio(start = 1);
|
|---|
| 1300 | parameter Real[:, 5] lossTable = [0, 1, 1, 0, 0];
|
|---|
| 1301 | parameter .Modelica.SIunits.RotationalSpringConstant c(final min = Modelica.Constants.small, start = 1.0e5);
|
|---|
| 1302 | parameter .Modelica.SIunits.RotationalDampingConstant d(final min = 0, start = 0);
|
|---|
| 1303 | parameter .Modelica.SIunits.Angle b(final min = 0) = 0;
|
|---|
| 1304 | parameter StateSelect stateSelect = StateSelect.prefer;
|
|---|
| 1305 | extends Modelica.Thermal.HeatTransfer.Interfaces.PartialConditionalHeatPort(final T = 293.15);
|
|---|
| 1306 | Modelica.SIunits.Angle phi_rel(start = 0, stateSelect = stateSelect, nominal = 1e-4) = flange_b.phi - lossyGear.flange_b.phi;
|
|---|
| 1307 | Modelica.SIunits.AngularVelocity w_rel(start = 0, stateSelect = stateSelect) = der(phi_rel);
|
|---|
| 1308 | Modelica.SIunits.AngularAcceleration a_rel(start = 0) = der(w_rel);
|
|---|
| 1309 | Rotational.Components.LossyGear lossyGear(final ratio = ratio, final lossTable = lossTable, final useSupport = true, final useHeatPort = true);
|
|---|
| 1310 | Rotational.Components.ElastoBacklash elastoBacklash(final b = b, final c = c, final phi_rel0 = 0, final d = d, final useHeatPort = true);
|
|---|
| 1311 | equation
|
|---|
| 1312 | connect(flange_a, lossyGear.flange_a);
|
|---|
| 1313 | connect(lossyGear.flange_b, elastoBacklash.flange_a);
|
|---|
| 1314 | connect(elastoBacklash.flange_b, flange_b);
|
|---|
| 1315 | connect(elastoBacklash.heatPort, internalHeatPort);
|
|---|
| 1316 | connect(lossyGear.heatPort, internalHeatPort);
|
|---|
| 1317 | connect(lossyGear.support, internalSupport);
|
|---|
| 1318 | end Gearbox;
|
|---|
| 1319 |
|
|---|
| 1320 | model IdealGearR2T
|
|---|
| 1321 | extends Rotational.Interfaces.PartialElementaryRotationalToTranslational;
|
|---|
| 1322 | parameter Real ratio(final unit = "rad/m", start = 1);
|
|---|
| 1323 | equation
|
|---|
| 1324 | flangeR.phi - internalSupportR.phi = ratio * (flangeT.s - internalSupportT.s);
|
|---|
| 1325 | 0 = ratio * flangeR.tau + flangeT.f;
|
|---|
| 1326 | end IdealGearR2T;
|
|---|
| 1327 | end Components;
|
|---|
| 1328 |
|
|---|
| 1329 | package Sensors
|
|---|
| 1330 |
|
|---|
| 1331 | model AngleSensor
|
|---|
| 1332 | extends Rotational.Interfaces.PartialAbsoluteSensor;
|
|---|
| 1333 | Modelica.Blocks.Interfaces.RealOutput phi(unit = "rad", displayUnit = "deg");
|
|---|
| 1334 | equation
|
|---|
| 1335 | phi = flange.phi;
|
|---|
| 1336 | end AngleSensor;
|
|---|
| 1337 |
|
|---|
| 1338 | model SpeedSensor
|
|---|
| 1339 | extends Rotational.Interfaces.PartialAbsoluteSensor;
|
|---|
| 1340 | Modelica.Blocks.Interfaces.RealOutput w(unit = "rad/s");
|
|---|
| 1341 | equation
|
|---|
| 1342 | w = der(flange.phi);
|
|---|
| 1343 | end SpeedSensor;
|
|---|
| 1344 |
|
|---|
| 1345 | model RelAngleSensor
|
|---|
| 1346 | extends Rotational.Interfaces.PartialRelativeSensor;
|
|---|
| 1347 | Modelica.Blocks.Interfaces.RealOutput phi_rel(unit = "rad", displayUnit = "deg");
|
|---|
| 1348 | equation
|
|---|
| 1349 | phi_rel = flange_b.phi - flange_a.phi;
|
|---|
| 1350 | 0 = flange_a.tau;
|
|---|
| 1351 | end RelAngleSensor;
|
|---|
| 1352 |
|
|---|
| 1353 | model TorqueSensor
|
|---|
| 1354 | extends Rotational.Interfaces.PartialRelativeSensor;
|
|---|
| 1355 | Modelica.Blocks.Interfaces.RealOutput tau(unit = "N.m");
|
|---|
| 1356 | equation
|
|---|
| 1357 | flange_a.phi = flange_b.phi;
|
|---|
| 1358 | flange_a.tau = tau;
|
|---|
| 1359 | end TorqueSensor;
|
|---|
| 1360 | end Sensors;
|
|---|
| 1361 |
|
|---|
| 1362 | package Interfaces
|
|---|
| 1363 | connector Flange_a
|
|---|
| 1364 | .Modelica.SIunits.Angle phi;
|
|---|
| 1365 | flow .Modelica.SIunits.Torque tau;
|
|---|
| 1366 | end Flange_a;
|
|---|
| 1367 |
|
|---|
| 1368 | connector Flange_b
|
|---|
| 1369 | .Modelica.SIunits.Angle phi;
|
|---|
| 1370 | flow .Modelica.SIunits.Torque tau;
|
|---|
| 1371 | end Flange_b;
|
|---|
| 1372 |
|
|---|
| 1373 | connector Support
|
|---|
| 1374 | .Modelica.SIunits.Angle phi;
|
|---|
| 1375 | flow .Modelica.SIunits.Torque tau;
|
|---|
| 1376 | end Support;
|
|---|
| 1377 |
|
|---|
| 1378 | model InternalSupport
|
|---|
| 1379 | input Modelica.SIunits.Torque tau;
|
|---|
| 1380 | Modelica.SIunits.Angle phi;
|
|---|
| 1381 | Flange_a flange;
|
|---|
| 1382 | equation
|
|---|
| 1383 | flange.tau = tau;
|
|---|
| 1384 | flange.phi = phi;
|
|---|
| 1385 | end InternalSupport;
|
|---|
| 1386 |
|
|---|
| 1387 | partial model PartialTwoFlangesAndSupport
|
|---|
| 1388 | parameter Boolean useSupport = false;
|
|---|
| 1389 | Flange_a flange_a;
|
|---|
| 1390 | Flange_b flange_b;
|
|---|
| 1391 | Support support if useSupport;
|
|---|
| 1392 | protected
|
|---|
| 1393 | Support internalSupport;
|
|---|
| 1394 | Components.Fixed fixed if not useSupport;
|
|---|
| 1395 | equation
|
|---|
| 1396 | connect(support, internalSupport);
|
|---|
| 1397 | connect(internalSupport, fixed.flange);
|
|---|
| 1398 | end PartialTwoFlangesAndSupport;
|
|---|
| 1399 |
|
|---|
| 1400 | partial model PartialCompliantWithRelativeStates
|
|---|
| 1401 | Modelica.SIunits.Angle phi_rel(start = 0, stateSelect = stateSelect, nominal = if phi_nominal >= Modelica.Constants.eps then phi_nominal else 1);
|
|---|
| 1402 | Modelica.SIunits.AngularVelocity w_rel(start = 0, stateSelect = stateSelect);
|
|---|
| 1403 | Modelica.SIunits.AngularAcceleration a_rel(start = 0);
|
|---|
| 1404 | Modelica.SIunits.Torque tau;
|
|---|
| 1405 | Flange_a flange_a;
|
|---|
| 1406 | Flange_b flange_b;
|
|---|
| 1407 | parameter .Modelica.SIunits.Angle phi_nominal(displayUnit = "rad", min = 0.0) = 1e-4;
|
|---|
| 1408 | parameter StateSelect stateSelect = StateSelect.prefer;
|
|---|
| 1409 | equation
|
|---|
| 1410 | phi_rel = flange_b.phi - flange_a.phi;
|
|---|
| 1411 | w_rel = der(phi_rel);
|
|---|
| 1412 | a_rel = der(w_rel);
|
|---|
| 1413 | flange_b.tau = tau;
|
|---|
| 1414 | flange_a.tau = -tau;
|
|---|
| 1415 | end PartialCompliantWithRelativeStates;
|
|---|
| 1416 |
|
|---|
| 1417 | partial model PartialElementaryTwoFlangesAndSupport2
|
|---|
| 1418 | parameter Boolean useSupport = false;
|
|---|
| 1419 | Flange_a flange_a;
|
|---|
| 1420 | Flange_b flange_b;
|
|---|
| 1421 | Support support(phi = phi_support, tau = (-flange_a.tau) - flange_b.tau) if useSupport;
|
|---|
| 1422 | protected
|
|---|
| 1423 | Modelica.SIunits.Angle phi_support;
|
|---|
| 1424 | equation
|
|---|
| 1425 | if not useSupport then
|
|---|
| 1426 | phi_support = 0;
|
|---|
| 1427 | end if;
|
|---|
| 1428 | end PartialElementaryTwoFlangesAndSupport2;
|
|---|
| 1429 |
|
|---|
| 1430 | partial model PartialElementaryRotationalToTranslational
|
|---|
| 1431 | parameter Boolean useSupportR = false;
|
|---|
| 1432 | parameter Boolean useSupportT = false;
|
|---|
| 1433 | Rotational.Interfaces.Flange_a flangeR;
|
|---|
| 1434 | Modelica.Mechanics.Translational.Interfaces.Flange_b flangeT;
|
|---|
| 1435 | Rotational.Interfaces.Support supportR if useSupportR;
|
|---|
| 1436 | Translational.Interfaces.Support supportT if useSupportT;
|
|---|
| 1437 | protected
|
|---|
| 1438 | Rotational.Interfaces.InternalSupport internalSupportR(tau = -flangeR.tau);
|
|---|
| 1439 | Translational.Interfaces.InternalSupport internalSupportT(f = -flangeT.f);
|
|---|
| 1440 | Rotational.Components.Fixed fixedR if not useSupportR;
|
|---|
| 1441 | Translational.Components.Fixed fixedT if not useSupportT;
|
|---|
| 1442 | equation
|
|---|
| 1443 | connect(internalSupportR.flange, supportR);
|
|---|
| 1444 | connect(internalSupportR.flange, fixedR.flange);
|
|---|
| 1445 | connect(fixedT.flange, internalSupportT.flange);
|
|---|
| 1446 | connect(internalSupportT.flange, supportT);
|
|---|
| 1447 | end PartialElementaryRotationalToTranslational;
|
|---|
| 1448 |
|
|---|
| 1449 | partial model PartialAbsoluteSensor
|
|---|
| 1450 | Flange_a flange;
|
|---|
| 1451 | equation
|
|---|
| 1452 | 0 = flange.tau;
|
|---|
| 1453 | end PartialAbsoluteSensor;
|
|---|
| 1454 |
|
|---|
| 1455 | partial model PartialRelativeSensor
|
|---|
| 1456 | Flange_a flange_a;
|
|---|
| 1457 | Flange_b flange_b;
|
|---|
| 1458 | equation
|
|---|
| 1459 | 0 = flange_a.tau + flange_b.tau;
|
|---|
| 1460 | end PartialRelativeSensor;
|
|---|
| 1461 | end Interfaces;
|
|---|
| 1462 |
|
|---|
| 1463 | end Rotational;
|
|---|
| 1464 |
|
|---|
| 1465 | package Translational
|
|---|
| 1466 | package Components
|
|---|
| 1467 | model Fixed
|
|---|
| 1468 | parameter .Modelica.SIunits.Position s0 = 0;
|
|---|
| 1469 | Interfaces.Flange_b flange;
|
|---|
| 1470 | equation
|
|---|
| 1471 | flange.s = s0;
|
|---|
| 1472 | end Fixed;
|
|---|
| 1473 |
|
|---|
| 1474 | model Mass
|
|---|
| 1475 | parameter .Modelica.SIunits.Mass m(min = 0, start = 1);
|
|---|
| 1476 | parameter StateSelect stateSelect = StateSelect.default;
|
|---|
| 1477 | extends Translational.Interfaces.PartialRigid(L = 0, s(start = 0, stateSelect = stateSelect));
|
|---|
| 1478 | .Modelica.SIunits.Velocity v(start = 0, stateSelect = stateSelect);
|
|---|
| 1479 | .Modelica.SIunits.Acceleration a(start = 0);
|
|---|
| 1480 | equation
|
|---|
| 1481 | v = der(s);
|
|---|
| 1482 | a = der(v);
|
|---|
| 1483 | m * a = flange_a.f + flange_b.f;
|
|---|
| 1484 | end Mass;
|
|---|
| 1485 |
|
|---|
| 1486 | model SpringDamper
|
|---|
| 1487 | extends Translational.Interfaces.PartialCompliantWithRelativeStates;
|
|---|
| 1488 | parameter .Modelica.SIunits.TranslationalSpringConstant c(final min = 0, start = 1);
|
|---|
| 1489 | parameter .Modelica.SIunits.TranslationalDampingConstant d(final min = 0, start = 1);
|
|---|
| 1490 | parameter .Modelica.SIunits.Position s_rel0 = 0;
|
|---|
| 1491 | extends Modelica.Thermal.HeatTransfer.Interfaces.PartialElementaryConditionalHeatPortWithoutT;
|
|---|
| 1492 | protected
|
|---|
| 1493 | Modelica.SIunits.Force f_c;
|
|---|
| 1494 | Modelica.SIunits.Force f_d;
|
|---|
| 1495 | equation
|
|---|
| 1496 | f_c = c * (s_rel - s_rel0);
|
|---|
| 1497 | f_d = d * v_rel;
|
|---|
| 1498 | f = f_c + f_d;
|
|---|
| 1499 | lossPower = f_d * v_rel;
|
|---|
| 1500 | end SpringDamper;
|
|---|
| 1501 |
|
|---|
| 1502 | model IdealGearR2T
|
|---|
| 1503 | extends Modelica.Mechanics.Rotational.Components.IdealGearR2T;
|
|---|
| 1504 | end IdealGearR2T;
|
|---|
| 1505 | end Components;
|
|---|
| 1506 |
|
|---|
| 1507 | package Sources
|
|---|
| 1508 | model ConstantForce
|
|---|
| 1509 | extends Modelica.Mechanics.Translational.Interfaces.PartialForce;
|
|---|
| 1510 | parameter Modelica.SIunits.Force f_constant;
|
|---|
| 1511 | equation
|
|---|
| 1512 | f = -f_constant;
|
|---|
| 1513 | end ConstantForce;
|
|---|
| 1514 | end Sources;
|
|---|
| 1515 |
|
|---|
| 1516 | package Interfaces
|
|---|
| 1517 | connector Flange_a
|
|---|
| 1518 | .Modelica.SIunits.Position s;
|
|---|
| 1519 | flow .Modelica.SIunits.Force f;
|
|---|
| 1520 | end Flange_a;
|
|---|
| 1521 |
|
|---|
| 1522 | connector Flange_b
|
|---|
| 1523 | .Modelica.SIunits.Position s;
|
|---|
| 1524 | flow .Modelica.SIunits.Force f;
|
|---|
| 1525 | end Flange_b;
|
|---|
| 1526 |
|
|---|
| 1527 | connector Support
|
|---|
| 1528 | .Modelica.SIunits.Position s;
|
|---|
| 1529 | flow .Modelica.SIunits.Force f;
|
|---|
| 1530 | end Support;
|
|---|
| 1531 |
|
|---|
| 1532 | model InternalSupport
|
|---|
| 1533 | input .Modelica.SIunits.Force f;
|
|---|
| 1534 | .Modelica.SIunits.Position s;
|
|---|
| 1535 | Flange_a flange;
|
|---|
| 1536 | equation
|
|---|
| 1537 | flange.f = f;
|
|---|
| 1538 | flange.s = s;
|
|---|
| 1539 | end InternalSupport;
|
|---|
| 1540 |
|
|---|
| 1541 | partial model PartialRigid
|
|---|
| 1542 | .Modelica.SIunits.Position s;
|
|---|
| 1543 | parameter .Modelica.SIunits.Length L(start = 0);
|
|---|
| 1544 | Flange_a flange_a;
|
|---|
| 1545 | Flange_b flange_b;
|
|---|
| 1546 | equation
|
|---|
| 1547 | flange_a.s = s - L / 2;
|
|---|
| 1548 | flange_b.s = s + L / 2;
|
|---|
| 1549 | end PartialRigid;
|
|---|
| 1550 |
|
|---|
| 1551 | partial model PartialCompliantWithRelativeStates
|
|---|
| 1552 | parameter StateSelect stateSelect = StateSelect.prefer;
|
|---|
| 1553 | parameter .Modelica.SIunits.Distance s_nominal = 1e-4;
|
|---|
| 1554 | .Modelica.SIunits.Position s_rel(start = 0, stateSelect = stateSelect, nominal = s_nominal);
|
|---|
| 1555 | .Modelica.SIunits.Velocity v_rel(start = 0, stateSelect = stateSelect);
|
|---|
| 1556 | .Modelica.SIunits.Force f;
|
|---|
| 1557 | Translational.Interfaces.Flange_a flange_a;
|
|---|
| 1558 | Translational.Interfaces.Flange_b flange_b;
|
|---|
| 1559 | equation
|
|---|
| 1560 | s_rel = flange_b.s - flange_a.s;
|
|---|
| 1561 | v_rel = der(s_rel);
|
|---|
| 1562 | flange_b.f = f;
|
|---|
| 1563 | flange_a.f = -f;
|
|---|
| 1564 | end PartialCompliantWithRelativeStates;
|
|---|
| 1565 |
|
|---|
| 1566 | partial model PartialElementaryOneFlangeAndSupport2
|
|---|
| 1567 | parameter Boolean useSupport = false;
|
|---|
| 1568 | Modelica.SIunits.Length s;
|
|---|
| 1569 | Flange_b flange;
|
|---|
| 1570 | Support support(s = s_support, f = -flange.f) if useSupport;
|
|---|
| 1571 | protected
|
|---|
| 1572 | Modelica.SIunits.Length s_support;
|
|---|
| 1573 | equation
|
|---|
| 1574 | s = flange.s - s_support;
|
|---|
| 1575 | if not useSupport then
|
|---|
| 1576 | s_support = 0;
|
|---|
| 1577 | end if;
|
|---|
| 1578 | end PartialElementaryOneFlangeAndSupport2;
|
|---|
| 1579 |
|
|---|
| 1580 | partial model PartialForce
|
|---|
| 1581 | extends PartialElementaryOneFlangeAndSupport2;
|
|---|
| 1582 | Modelica.SIunits.Force f;
|
|---|
| 1583 | equation
|
|---|
| 1584 | f = flange.f;
|
|---|
| 1585 | end PartialForce;
|
|---|
| 1586 | end Interfaces;
|
|---|
| 1587 | end Translational;
|
|---|
| 1588 | end Mechanics;
|
|---|
| 1589 |
|
|---|
| 1590 | package Thermal
|
|---|
| 1591 | package HeatTransfer
|
|---|
| 1592 | package Components
|
|---|
| 1593 | model ThermalCollector
|
|---|
| 1594 | parameter Integer m(min = 1) = 3;
|
|---|
| 1595 | Interfaces.HeatPort_a[m] port_a;
|
|---|
| 1596 | Interfaces.HeatPort_b port_b;
|
|---|
| 1597 | equation
|
|---|
| 1598 | port_b.Q_flow + sum(port_a.Q_flow) = 0;
|
|---|
| 1599 | port_a.T = fill(port_b.T, m);
|
|---|
| 1600 | end ThermalCollector;
|
|---|
| 1601 | end Components;
|
|---|
| 1602 |
|
|---|
| 1603 | package Sources
|
|---|
| 1604 | model FixedTemperature
|
|---|
| 1605 | parameter Modelica.SIunits.Temperature T;
|
|---|
| 1606 | Interfaces.HeatPort_b port;
|
|---|
| 1607 | equation
|
|---|
| 1608 | port.T = T;
|
|---|
| 1609 | end FixedTemperature;
|
|---|
| 1610 |
|
|---|
| 1611 | model PrescribedTemperature
|
|---|
| 1612 | Interfaces.HeatPort_b port;
|
|---|
| 1613 | Modelica.Blocks.Interfaces.RealInput T(unit = "K");
|
|---|
| 1614 | equation
|
|---|
| 1615 | port.T = T;
|
|---|
| 1616 | end PrescribedTemperature;
|
|---|
| 1617 | end Sources;
|
|---|
| 1618 |
|
|---|
| 1619 | package Interfaces
|
|---|
| 1620 | partial connector HeatPort
|
|---|
| 1621 | Modelica.SIunits.Temperature T;
|
|---|
| 1622 | flow Modelica.SIunits.HeatFlowRate Q_flow;
|
|---|
| 1623 | end HeatPort;
|
|---|
| 1624 |
|
|---|
| 1625 | connector HeatPort_a
|
|---|
| 1626 | extends HeatPort;
|
|---|
| 1627 | end HeatPort_a;
|
|---|
| 1628 |
|
|---|
| 1629 | connector HeatPort_b
|
|---|
| 1630 | extends HeatPort;
|
|---|
| 1631 | end HeatPort_b;
|
|---|
| 1632 |
|
|---|
| 1633 | partial model PartialElementaryConditionalHeatPortWithoutT
|
|---|
| 1634 | parameter Boolean useHeatPort = false;
|
|---|
| 1635 | Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a heatPort(final Q_flow = -lossPower) if useHeatPort;
|
|---|
| 1636 | Modelica.SIunits.Power lossPower;
|
|---|
| 1637 | end PartialElementaryConditionalHeatPortWithoutT;
|
|---|
| 1638 |
|
|---|
| 1639 | partial model PartialConditionalHeatPort
|
|---|
| 1640 | parameter Boolean useHeatPort = false;
|
|---|
| 1641 | parameter Modelica.SIunits.Temperature T = 293.15;
|
|---|
| 1642 | Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a heatPort if useHeatPort;
|
|---|
| 1643 | Modelica.Thermal.HeatTransfer.Sources.FixedTemperature fixedTemperature(final T = T) if not useHeatPort;
|
|---|
| 1644 | protected
|
|---|
| 1645 | HeatPort_a internalHeatPort;
|
|---|
| 1646 | equation
|
|---|
| 1647 | connect(heatPort, internalHeatPort);
|
|---|
| 1648 | connect(fixedTemperature.port, internalHeatPort);
|
|---|
| 1649 | end PartialConditionalHeatPort;
|
|---|
| 1650 | end Interfaces;
|
|---|
| 1651 | end HeatTransfer;
|
|---|
| 1652 | end Thermal;
|
|---|
| 1653 |
|
|---|
| 1654 | package Math
|
|---|
| 1655 | package Matrices
|
|---|
| 1656 | function isEqual
|
|---|
| 1657 | input Real[:, :] M1;
|
|---|
| 1658 | input Real[:, :] M2;
|
|---|
| 1659 | input Real eps(min = 0) = 0;
|
|---|
| 1660 | output Boolean result;
|
|---|
| 1661 | protected
|
|---|
| 1662 | Integer nrow = size(M1, 1);
|
|---|
| 1663 | Integer ncol = size(M1, 2);
|
|---|
| 1664 | Integer i = 1;
|
|---|
| 1665 | Integer j;
|
|---|
| 1666 | algorithm
|
|---|
| 1667 | result := false;
|
|---|
| 1668 | if size(M2, 1) == nrow and size(M2, 2) == ncol then
|
|---|
| 1669 | result := true;
|
|---|
| 1670 | while i <= nrow loop
|
|---|
| 1671 | j := 1;
|
|---|
| 1672 | while j <= ncol loop
|
|---|
| 1673 | if abs(M1[i, j] - M2[i, j]) > eps then
|
|---|
| 1674 | result := false;
|
|---|
| 1675 | i := nrow;
|
|---|
| 1676 | j := ncol;
|
|---|
| 1677 | else
|
|---|
| 1678 | end if;
|
|---|
| 1679 | j := j + 1;
|
|---|
| 1680 | end while;
|
|---|
| 1681 | i := i + 1;
|
|---|
| 1682 | end while;
|
|---|
| 1683 | else
|
|---|
| 1684 | end if;
|
|---|
| 1685 | end isEqual;
|
|---|
| 1686 | end Matrices;
|
|---|
| 1687 |
|
|---|
| 1688 | function isEqual
|
|---|
| 1689 | input Real s1;
|
|---|
| 1690 | input Real s2;
|
|---|
| 1691 | input Real eps(min = 0) = 0;
|
|---|
| 1692 | output Boolean result;
|
|---|
| 1693 | algorithm
|
|---|
| 1694 | result := abs(s1 - s2) <= eps;
|
|---|
| 1695 | end isEqual;
|
|---|
| 1696 |
|
|---|
| 1697 | function asin
|
|---|
| 1698 | input Real u;
|
|---|
| 1699 | output .Modelica.SIunits.Angle y;
|
|---|
| 1700 | external "builtin" y = asin(u);
|
|---|
| 1701 | end asin;
|
|---|
| 1702 |
|
|---|
| 1703 | function atan2
|
|---|
| 1704 | input Real u1;
|
|---|
| 1705 | input Real u2;
|
|---|
| 1706 | output .Modelica.SIunits.Angle y;
|
|---|
| 1707 | external "builtin" y = atan2(u1, u2);
|
|---|
| 1708 | end atan2;
|
|---|
| 1709 |
|
|---|
| 1710 | function exp
|
|---|
| 1711 | input Real u;
|
|---|
| 1712 | output Real y;
|
|---|
| 1713 | external "builtin" y = exp(u);
|
|---|
| 1714 | end exp;
|
|---|
| 1715 |
|
|---|
| 1716 | function tempInterpol2
|
|---|
| 1717 | input Real u;
|
|---|
| 1718 | input Real[:, :] table;
|
|---|
| 1719 | input Integer[:] icol;
|
|---|
| 1720 | output Real[1, size(icol, 1)] y;
|
|---|
| 1721 | protected
|
|---|
| 1722 | Integer i;
|
|---|
| 1723 | Integer n;
|
|---|
| 1724 | Real u1;
|
|---|
| 1725 | Real u2;
|
|---|
| 1726 | Real[1, size(icol, 1)] y1;
|
|---|
| 1727 | Real[1, size(icol, 1)] y2;
|
|---|
| 1728 | algorithm
|
|---|
| 1729 | n := size(table, 1);
|
|---|
| 1730 | if n <= 1 then
|
|---|
| 1731 | y := transpose([table[1, icol]]);
|
|---|
| 1732 | else
|
|---|
| 1733 | if u <= table[1, 1] then
|
|---|
| 1734 | i := 1;
|
|---|
| 1735 | else
|
|---|
| 1736 | i := 2;
|
|---|
| 1737 | while i < n and u >= table[i, 1] loop
|
|---|
| 1738 | i := i + 1;
|
|---|
| 1739 | end while;
|
|---|
| 1740 | i := i - 1;
|
|---|
| 1741 | end if;
|
|---|
| 1742 | u1 := table[i, 1];
|
|---|
| 1743 | u2 := table[i + 1, 1];
|
|---|
| 1744 | y1 := transpose([table[i, icol]]);
|
|---|
| 1745 | y2 := transpose([table[i + 1, icol]]);
|
|---|
| 1746 | assert(u2 > u1, "Table index must be increasing");
|
|---|
| 1747 | y := y1 + (y2 - y1) * (u - u1) / (u2 - u1);
|
|---|
| 1748 | end if;
|
|---|
| 1749 | end tempInterpol2;
|
|---|
| 1750 |
|
|---|
| 1751 | function tempInterpol2_der
|
|---|
| 1752 | input Real u;
|
|---|
| 1753 | input Real[:, :] table;
|
|---|
| 1754 | input Integer[:] icol;
|
|---|
| 1755 | input Real du;
|
|---|
| 1756 | output Real[1, size(icol, 1)] dy;
|
|---|
| 1757 | protected
|
|---|
| 1758 | Integer i;
|
|---|
| 1759 | Integer n;
|
|---|
| 1760 | Real u1;
|
|---|
| 1761 | Real u2;
|
|---|
| 1762 | Real[1, size(icol, 1)] y1;
|
|---|
| 1763 | Real[1, size(icol, 1)] y2;
|
|---|
| 1764 | algorithm
|
|---|
| 1765 | n := size(table, 1);
|
|---|
| 1766 | if n <= 1 then
|
|---|
| 1767 | dy := zeros(1, size(icol, 1));
|
|---|
| 1768 | else
|
|---|
| 1769 | if u <= table[1, 1] then
|
|---|
| 1770 | i := 1;
|
|---|
| 1771 | else
|
|---|
| 1772 | i := 2;
|
|---|
| 1773 | while i < n and u >= table[i, 1] loop
|
|---|
| 1774 | i := i + 1;
|
|---|
| 1775 | end while;
|
|---|
| 1776 | i := i - 1;
|
|---|
| 1777 | end if;
|
|---|
| 1778 | u1 := table[i, 1];
|
|---|
| 1779 | u2 := table[i + 1, 1];
|
|---|
| 1780 | y1 := transpose([table[i, icol]]);
|
|---|
| 1781 | y2 := transpose([table[i + 1, icol]]);
|
|---|
| 1782 | assert(u2 > u1, "Table index must be increasing");
|
|---|
| 1783 | dy := (y2 - y1) / (u2 - u1);
|
|---|
| 1784 | end if;
|
|---|
| 1785 | end tempInterpol2_der;
|
|---|
| 1786 | end Math;
|
|---|
| 1787 |
|
|---|
| 1788 | package Utilities
|
|---|
| 1789 | package Streams
|
|---|
| 1790 | function print
|
|---|
| 1791 | input String string = "";
|
|---|
| 1792 | input String fileName = "";
|
|---|
| 1793 | external "C" ModelicaInternal_print(string, fileName);
|
|---|
| 1794 | end print;
|
|---|
| 1795 |
|
|---|
| 1796 | function error
|
|---|
| 1797 | input String string;
|
|---|
| 1798 | external "C" ModelicaError(string);
|
|---|
| 1799 | end error;
|
|---|
| 1800 | end Streams;
|
|---|
| 1801 | end Utilities;
|
|---|
| 1802 |
|
|---|
| 1803 | package Constants
|
|---|
| 1804 | final constant Real pi = 2 * Math.asin(1.0);
|
|---|
| 1805 | final constant Real eps = ModelicaServices.Machine.eps;
|
|---|
| 1806 | final constant Real small = ModelicaServices.Machine.small;
|
|---|
| 1807 | final constant .Modelica.SIunits.Velocity c = 299792458;
|
|---|
| 1808 | final constant Real mue_0(final unit = "N/A2") = 4 * pi * 1.e-7;
|
|---|
| 1809 | end Constants;
|
|---|
| 1810 |
|
|---|
| 1811 | package SIunits
|
|---|
| 1812 | package Conversions
|
|---|
| 1813 | package NonSIunits
|
|---|
| 1814 | type Temperature_degC = Real(final quantity = "ThermodynamicTemperature", final unit = "degC");
|
|---|
| 1815 | end NonSIunits;
|
|---|
| 1816 | end Conversions;
|
|---|
| 1817 |
|
|---|
| 1818 | type Angle = Real(final quantity = "Angle", final unit = "rad", displayUnit = "deg");
|
|---|
| 1819 | type Length = Real(final quantity = "Length", final unit = "m");
|
|---|
| 1820 | type Position = Length;
|
|---|
| 1821 | type Distance = Length(min = 0);
|
|---|
| 1822 | type Time = Real(final quantity = "Time", final unit = "s");
|
|---|
| 1823 | type AngularVelocity = Real(final quantity = "AngularVelocity", final unit = "rad/s");
|
|---|
| 1824 | type AngularAcceleration = Real(final quantity = "AngularAcceleration", final unit = "rad/s2");
|
|---|
| 1825 | type Velocity = Real(final quantity = "Velocity", final unit = "m/s");
|
|---|
| 1826 | type Acceleration = Real(final quantity = "Acceleration", final unit = "m/s2");
|
|---|
| 1827 | type Frequency = Real(final quantity = "Frequency", final unit = "Hz");
|
|---|
| 1828 | type DampingCoefficient = Real(final quantity = "DampingCoefficient", final unit = "s-1");
|
|---|
| 1829 | type Mass = Real(quantity = "Mass", final unit = "kg", min = 0);
|
|---|
| 1830 | type MomentOfInertia = Real(final quantity = "MomentOfInertia", final unit = "kg.m2");
|
|---|
| 1831 | type Inertia = MomentOfInertia;
|
|---|
| 1832 | type Force = Real(final quantity = "Force", final unit = "N");
|
|---|
| 1833 | type TranslationalSpringConstant = Real(final quantity = "TranslationalSpringConstant", final unit = "N/m");
|
|---|
| 1834 | type TranslationalDampingConstant = Real(final quantity = "TranslationalDampingConstant", final unit = "N.s/m");
|
|---|
| 1835 | type Torque = Real(final quantity = "Torque", final unit = "N.m");
|
|---|
| 1836 | type RotationalSpringConstant = Real(final quantity = "RotationalSpringConstant", final unit = "N.m/rad");
|
|---|
| 1837 | type RotationalDampingConstant = Real(final quantity = "RotationalDampingConstant", final unit = "N.m.s/rad");
|
|---|
| 1838 | type Power = Real(final quantity = "Power", final unit = "W");
|
|---|
| 1839 | type ThermodynamicTemperature = Real(final quantity = "ThermodynamicTemperature", final unit = "K", min = 0.0, start = 288.15, nominal = 300, displayUnit = "degC");
|
|---|
| 1840 | type Temperature = ThermodynamicTemperature;
|
|---|
| 1841 | type LinearTemperatureCoefficient = Real(final quantity = "LinearTemperatureCoefficient", final unit = "1/K");
|
|---|
| 1842 | type HeatFlowRate = Real(final quantity = "Power", final unit = "W");
|
|---|
| 1843 | type ElectricCurrent = Real(final quantity = "ElectricCurrent", final unit = "A");
|
|---|
| 1844 | type Current = ElectricCurrent;
|
|---|
| 1845 | type ElectricPotential = Real(final quantity = "ElectricPotential", final unit = "V");
|
|---|
| 1846 | type Voltage = ElectricPotential;
|
|---|
| 1847 | type MagneticFlux = Real(final quantity = "MagneticFlux", final unit = "Wb");
|
|---|
| 1848 | type Inductance = Real(final quantity = "Inductance", final unit = "H");
|
|---|
| 1849 | type Resistance = Real(final quantity = "Resistance", final unit = "Ohm");
|
|---|
| 1850 | type Conductance = Real(final quantity = "Conductance", final unit = "S");
|
|---|
| 1851 | type FaradayConstant = Real(final quantity = "FaradayConstant", final unit = "C/mol");
|
|---|
| 1852 | end SIunits;
|
|---|
| 1853 | end Modelica;
|
|---|
| 1854 |
|
|---|
| 1855 | package Noise
|
|---|
| 1856 | package Examples
|
|---|
| 1857 | package Actuator
|
|---|
| 1858 | model Actuator
|
|---|
| 1859 | Parts.MotorWithCurrentControl Motor;
|
|---|
| 1860 | Parts.Controller controller;
|
|---|
| 1861 | Modelica.Blocks.Sources.Step Speed(startTime = 0.5, height = 50);
|
|---|
| 1862 | Modelica.Mechanics.Rotational.Components.Gearbox gearbox(lossTable = [0, 0.85, 0.8, 0.1, 0.1], c = 1e6, d = 1e4, ratio = 10, b = 0.0017453292519943);
|
|---|
| 1863 | Modelica.Mechanics.Translational.Components.IdealGearR2T idealGearR2T(ratio = 300);
|
|---|
| 1864 | Modelica.Mechanics.Translational.Components.Mass mass(m = 100);
|
|---|
| 1865 | Modelica.Mechanics.Translational.Sources.ConstantForce constantForce(f_constant = 10000);
|
|---|
| 1866 | Modelica.Blocks.Nonlinear.SlewRateLimiter slewRateLimiter(Rising = 50);
|
|---|
| 1867 | Modelica.Mechanics.Translational.Components.Mass rodMass(m = 3);
|
|---|
| 1868 | Modelica.Mechanics.Translational.Components.SpringDamper elastoGap(c = 1e8, d = 1e5);
|
|---|
| 1869 | equation
|
|---|
| 1870 | connect(controller.y1, Motor.iq_rms1);
|
|---|
| 1871 | connect(Motor.phi, controller.positionMeasured);
|
|---|
| 1872 | connect(Motor.flange, gearbox.flange_a);
|
|---|
| 1873 | connect(gearbox.flange_b, idealGearR2T.flangeR);
|
|---|
| 1874 | connect(constantForce.flange, mass.flange_b);
|
|---|
| 1875 | connect(Speed.y, slewRateLimiter.u);
|
|---|
| 1876 | connect(slewRateLimiter.y, controller.positionReference);
|
|---|
| 1877 | connect(rodMass.flange_a, idealGearR2T.flangeT);
|
|---|
| 1878 | connect(rodMass.flange_b, elastoGap.flange_a);
|
|---|
| 1879 | connect(elastoGap.flange_b, mass.flange_a);
|
|---|
| 1880 | end Actuator;
|
|---|
| 1881 |
|
|---|
| 1882 | model ActuatorLinearSystemsNoise
|
|---|
| 1883 | extends Actuator(controller(redeclare Noise.Examples.Actuator.Parts.LinearSystemsNoise noiseModel));
|
|---|
| 1884 | end ActuatorLinearSystemsNoise;
|
|---|
| 1885 |
|
|---|
| 1886 | package Parts
|
|---|
| 1887 | model MotorWithCurrentControl
|
|---|
| 1888 | constant Integer m = 3;
|
|---|
| 1889 | parameter Modelica.SIunits.Voltage VNominal = 100;
|
|---|
| 1890 | parameter Modelica.SIunits.Frequency fNominal = 50;
|
|---|
| 1891 | parameter Modelica.SIunits.Frequency f = 50;
|
|---|
| 1892 | parameter Modelica.SIunits.Time tRamp = 1;
|
|---|
| 1893 | parameter Modelica.SIunits.Torque TLoad = 181.4;
|
|---|
| 1894 | parameter Modelica.SIunits.Time tStep = 1.2;
|
|---|
| 1895 | parameter Modelica.SIunits.Inertia JLoad = 0.29;
|
|---|
| 1896 | Modelica.SIunits.Angle phi_motor;
|
|---|
| 1897 | Modelica.SIunits.AngularVelocity w;
|
|---|
| 1898 | Modelica.Electrical.Machines.BasicMachines.SynchronousInductionMachines.SM_PermanentMagnet smpm(p = smpmData.p, fsNominal = smpmData.fsNominal, TsOperational = 293.15, Rs = smpmData.Rs, TsRef = smpmData.TsRef, alpha20s = smpmData.alpha20s, Lszero = smpmData.Lszero, Lssigma = smpmData.Lssigma, Jr = smpmData.Jr, Js = smpmData.Js, frictionParameters = smpmData.frictionParameters, phiMechanical(fixed = true), wMechanical(fixed = true), statorCoreParameters = smpmData.statorCoreParameters, strayLoadParameters = smpmData.strayLoadParameters, TrOperational = 293.15, VsOpenCircuit = smpmData.VsOpenCircuit, Lmd = smpmData.Lmd, Lmq = smpmData.Lmq, useDamperCage = smpmData.useDamperCage, Lrsigmad = smpmData.Lrsigmad, Lrsigmaq = smpmData.Lrsigmaq, Rrd = smpmData.Rrd, Rrq = smpmData.Rrq, TrRef = smpmData.TrRef, alpha20r = smpmData.alpha20r, permanentMagnetLossParameters = smpmData.permanentMagnetLossParameters);
|
|---|
| 1899 | Modelica.Electrical.MultiPhase.Sources.SignalCurrent signalCurrent(final m = m);
|
|---|
| 1900 | Modelica.Electrical.MultiPhase.Basic.Star star(final m = m);
|
|---|
| 1901 | Modelica.Electrical.Analog.Basic.Ground ground;
|
|---|
| 1902 | Modelica.Electrical.Machines.Utilities.CurrentController currentController(p = smpm.p);
|
|---|
| 1903 | Modelica.Electrical.Machines.Sensors.VoltageQuasiRMSSensor voltageQuasiRMSSensor;
|
|---|
| 1904 | Modelica.Electrical.MultiPhase.Basic.Star starM(final m = m);
|
|---|
| 1905 | Modelica.Electrical.Analog.Basic.Ground groundM;
|
|---|
| 1906 | Modelica.Electrical.Machines.Utilities.TerminalBox terminalBox(terminalConnection = "Y");
|
|---|
| 1907 | Modelica.Electrical.Machines.Sensors.RotorDisplacementAngle rotorDisplacementAngle(p = smpm.p);
|
|---|
| 1908 | Modelica.Mechanics.Rotational.Sensors.AngleSensor angleSensor;
|
|---|
| 1909 | Modelica.Mechanics.Rotational.Sensors.TorqueSensor torqueSensor;
|
|---|
| 1910 | Modelica.Mechanics.Rotational.Sensors.SpeedSensor speedSensor;
|
|---|
| 1911 | Modelica.Mechanics.Rotational.Components.Inertia inertiaLoad(J = 0.29);
|
|---|
| 1912 | parameter Modelica.Electrical.Machines.Utilities.ParameterRecords.SM_PermanentMagnetData smpmData(useDamperCage = false);
|
|---|
| 1913 | Modelica.Electrical.Machines.Sensors.CurrentQuasiRMSSensor currentQuasiRMSSensor;
|
|---|
| 1914 | Modelica.Blocks.Sources.Constant id(k = 0);
|
|---|
| 1915 | Modelica.Blocks.Interfaces.RealInput iq_rms1;
|
|---|
| 1916 | Modelica.Mechanics.Rotational.Interfaces.Flange_b flange;
|
|---|
| 1917 | Modelica.Blocks.Interfaces.RealOutput phi;
|
|---|
| 1918 | equation
|
|---|
| 1919 | w = speedSensor.w;
|
|---|
| 1920 | phi_motor = angleSensor.phi;
|
|---|
| 1921 | connect(star.pin_n, ground.p);
|
|---|
| 1922 | connect(rotorDisplacementAngle.plug_n, smpm.plug_sn);
|
|---|
| 1923 | connect(rotorDisplacementAngle.plug_p, smpm.plug_sp);
|
|---|
| 1924 | connect(terminalBox.plug_sn, smpm.plug_sn);
|
|---|
| 1925 | connect(terminalBox.plug_sp, smpm.plug_sp);
|
|---|
| 1926 | connect(smpm.flange, rotorDisplacementAngle.flange);
|
|---|
| 1927 | connect(signalCurrent.plug_p, star.plug_p);
|
|---|
| 1928 | connect(angleSensor.flange, rotorDisplacementAngle.flange);
|
|---|
| 1929 | connect(angleSensor.phi, currentController.phi);
|
|---|
| 1930 | connect(groundM.p, terminalBox.starpoint);
|
|---|
| 1931 | connect(smpm.flange, torqueSensor.flange_a);
|
|---|
| 1932 | connect(voltageQuasiRMSSensor.plug_p, terminalBox.plugSupply);
|
|---|
| 1933 | connect(starM.plug_p, voltageQuasiRMSSensor.plug_n);
|
|---|
| 1934 | connect(starM.pin_n, groundM.p);
|
|---|
| 1935 | connect(currentController.y, signalCurrent.i);
|
|---|
| 1936 | connect(speedSensor.flange, smpm.flange);
|
|---|
| 1937 | connect(torqueSensor.flange_b, inertiaLoad.flange_a);
|
|---|
| 1938 | connect(signalCurrent.plug_n, currentQuasiRMSSensor.plug_p);
|
|---|
| 1939 | connect(currentQuasiRMSSensor.plug_n, voltageQuasiRMSSensor.plug_p);
|
|---|
| 1940 | connect(id.y, currentController.id_rms);
|
|---|
| 1941 | connect(currentController.iq_rms, iq_rms1);
|
|---|
| 1942 | connect(inertiaLoad.flange_b, flange);
|
|---|
| 1943 | connect(angleSensor.phi, phi);
|
|---|
| 1944 | end MotorWithCurrentControl;
|
|---|
| 1945 |
|
|---|
| 1946 | model Controller
|
|---|
| 1947 | Modelica.Blocks.Continuous.PI speed_PI(k = 10, T = 5e-2);
|
|---|
| 1948 | Modelica.Blocks.Math.Feedback speedFeedback;
|
|---|
| 1949 | Modelica.Blocks.Continuous.Derivative positionToSpeed(T = 0.005);
|
|---|
| 1950 | Modelica.Blocks.Interfaces.RealInput positionMeasured;
|
|---|
| 1951 | Modelica.Blocks.Interfaces.RealInput positionReference;
|
|---|
| 1952 | Modelica.Blocks.Interfaces.RealOutput y1;
|
|---|
| 1953 | Modelica.Blocks.Continuous.PI position_PI(T = 5e-1, k = 3);
|
|---|
| 1954 | Modelica.Blocks.Math.Feedback positionFeedback;
|
|---|
| 1955 | Modelica.Blocks.Math.Add addNoise;
|
|---|
| 1956 | replaceable .Noise.Examples.Actuator.Parts.NoNoise noiseModel constrainedby Noise.Examples.Actuator.Parts.NoiseModel;
|
|---|
| 1957 | Modelica.Blocks.Continuous.FirstOrder busdelay(T = 1e-3);
|
|---|
| 1958 | equation
|
|---|
| 1959 | connect(positionToSpeed.y, speedFeedback.u2);
|
|---|
| 1960 | connect(speedFeedback.y, speed_PI.u);
|
|---|
| 1961 | connect(positionFeedback.u2, positionToSpeed.u);
|
|---|
| 1962 | connect(positionReference, positionFeedback.u1);
|
|---|
| 1963 | connect(positionFeedback.y, position_PI.u);
|
|---|
| 1964 | connect(position_PI.y, speedFeedback.u1);
|
|---|
| 1965 | connect(positionMeasured, addNoise.u2);
|
|---|
| 1966 | connect(addNoise.y, positionToSpeed.u);
|
|---|
| 1967 | connect(noiseModel.y, addNoise.u1);
|
|---|
| 1968 | connect(speed_PI.y, busdelay.u);
|
|---|
| 1969 | connect(y1, busdelay.y);
|
|---|
| 1970 | end Controller;
|
|---|
| 1971 |
|
|---|
| 1972 | model NoNoise
|
|---|
| 1973 | extends NoiseModel;
|
|---|
| 1974 | Modelica.Blocks.Sources.Constant noise(k = 0);
|
|---|
| 1975 | equation
|
|---|
| 1976 | connect(noise.y, y);
|
|---|
| 1977 | end NoNoise;
|
|---|
| 1978 |
|
|---|
| 1979 | model LinearSystemsNoise
|
|---|
| 1980 | extends NoiseModel;
|
|---|
| 1981 | .Noise.Examples.Parts.Modelica_LinearSystems2.Controller.Noise noise(y_max = 0.01, blockType = .Noise.Examples.Parts.Modelica_LinearSystems2.Controller.Types.BlockTypeWithGlobalDefault.Discrete, y_min = -0.01);
|
|---|
| 1982 | inner .Noise.Examples.Parts.Modelica_LinearSystems2.Controller.SampleClock sampleClock(blockType = .Noise.Examples.Parts.Modelica_LinearSystems2.Controller.Types.BlockType.Discrete, sampleTime = 1 / 2000);
|
|---|
| 1983 | .Noise.Examples.Parts.Modelica_LinearSystems2.Controller.FilterFIR filter1(blockType = .Noise.Examples.Parts.Modelica_LinearSystems2.Controller.Types.BlockTypeWithGlobalDefault.Discrete, L = 10);
|
|---|
| 1984 | equation
|
|---|
| 1985 | connect(noise.y, filter1.u);
|
|---|
| 1986 | connect(filter1.y, y);
|
|---|
| 1987 | end LinearSystemsNoise;
|
|---|
| 1988 |
|
|---|
| 1989 | partial model NoiseModel
|
|---|
| 1990 | extends Modelica.Blocks.Interfaces.SO;
|
|---|
| 1991 | end NoiseModel;
|
|---|
| 1992 | end Parts;
|
|---|
| 1993 | end Actuator;
|
|---|
| 1994 |
|
|---|
| 1995 | package Parts
|
|---|
| 1996 | package Modelica_LinearSystems2
|
|---|
| 1997 |
|
|---|
| 1998 | package Controller
|
|---|
| 1999 |
|
|---|
| 2000 | block SampleClock
|
|---|
| 2001 | parameter Types.BlockType blockType = Types.BlockType.Continuous;
|
|---|
| 2002 | parameter .Noise.Examples.Parts.Modelica_LinearSystems2.Types.Method methodType = .Noise.Examples.Parts.Modelica_LinearSystems2.Types.Method.Trapezoidal;
|
|---|
| 2003 | parameter Modelica.SIunits.Time sampleTime = 1;
|
|---|
| 2004 | parameter Types.Init initType = Types.Init.SteadyState;
|
|---|
| 2005 | output Boolean sampleTrigger;
|
|---|
| 2006 | equation
|
|---|
| 2007 | if blockType == Types.BlockType.Continuous then
|
|---|
| 2008 | sampleTrigger = false;
|
|---|
| 2009 | else
|
|---|
| 2010 | sampleTrigger = sample(sampleTime, sampleTime);
|
|---|
| 2011 | end if;
|
|---|
| 2012 | end SampleClock;
|
|---|
| 2013 |
|
|---|
| 2014 | block Noise
|
|---|
| 2015 | parameter Real y_min;
|
|---|
| 2016 | parameter Real y_max;
|
|---|
| 2017 | parameter Integer[3] firstSeed(each min = 0, each max = 255) = {23, 87, 187};
|
|---|
| 2018 | parameter Types.BlockTypeWithGlobalDefault blockType = Types.BlockTypeWithGlobalDefault.UseSampleClockOption;
|
|---|
| 2019 | final parameter Boolean continuous = blockType == Types.BlockTypeWithGlobalDefault.Continuous or blockType == Types.BlockTypeWithGlobalDefault.UseSampleClockOption and sampleClock.blockType == Types.BlockType.Continuous;
|
|---|
| 2020 | parameter Integer sampleFactor(min = 1) = 1;
|
|---|
| 2021 | Modelica.Blocks.Interfaces.RealOutput y;
|
|---|
| 2022 | protected
|
|---|
| 2023 | outer SampleClock sampleClock;
|
|---|
| 2024 | Internal.DiscreteNoise discretePart(y_min = y_min, y_max = y_max, firstSeed = firstSeed, sampleFactor = sampleFactor) if not continuous;
|
|---|
| 2025 | equation
|
|---|
| 2026 | if continuous then
|
|---|
| 2027 | y = 0.0;
|
|---|
| 2028 | end if;
|
|---|
| 2029 | connect(y, discretePart.y);
|
|---|
| 2030 | end Noise;
|
|---|
| 2031 |
|
|---|
| 2032 | package Types
|
|---|
| 2033 | type BlockType = enumeration(Continuous, Discrete);
|
|---|
| 2034 | type BlockTypeWithGlobalDefault = enumeration(Continuous, Discrete, UseSampleClockOption);
|
|---|
| 2035 | type Init = enumeration(NoInit, SteadyState, InitialState, InitialOutput);
|
|---|
| 2036 | type FIRspec = enumeration(MeanValue, Window, Coefficients);
|
|---|
| 2037 | type Window = enumeration(Rectangle, Bartlett, Hann, Hamming, Blackman, Kaiser);
|
|---|
| 2038 | end Types;
|
|---|
| 2039 |
|
|---|
| 2040 | package Internal
|
|---|
| 2041 | block DiscreteNoise
|
|---|
| 2042 | parameter Real y_min;
|
|---|
| 2043 | parameter Real y_max;
|
|---|
| 2044 | parameter Integer[3] firstSeed(each min = 0, each max = 255) = {23, 87, 187};
|
|---|
| 2045 | parameter Integer sampleFactor(min = 1) = 1;
|
|---|
| 2046 | final parameter Modelica.SIunits.Time Ts = sampleClock.sampleTime * sampleFactor;
|
|---|
| 2047 | Modelica.Blocks.Interfaces.RealOutput y;
|
|---|
| 2048 | protected
|
|---|
| 2049 | outer SampleClock sampleClock;
|
|---|
| 2050 | Integer ticks;
|
|---|
| 2051 | Integer[3] seedState;
|
|---|
| 2052 | Boolean sampleTrigger;
|
|---|
| 2053 | discrete Real noise;
|
|---|
| 2054 | discrete Real y_sampled;
|
|---|
| 2055 | initial equation
|
|---|
| 2056 | pre(ticks) = 0;
|
|---|
| 2057 | pre(seedState) = firstSeed;
|
|---|
| 2058 | equation
|
|---|
| 2059 | if sampleClock.blockType == Types.BlockType.Continuous then
|
|---|
| 2060 | sampleTrigger = sample(Ts, Ts);
|
|---|
| 2061 | ticks = 0;
|
|---|
| 2062 | else
|
|---|
| 2063 | when sampleClock.sampleTrigger then
|
|---|
| 2064 | ticks = if pre(ticks) < sampleFactor then pre(ticks) + 1 else 1;
|
|---|
| 2065 | end when;
|
|---|
| 2066 | sampleTrigger = sampleClock.sampleTrigger and ticks >= sampleFactor;
|
|---|
| 2067 | end if;
|
|---|
| 2068 | when {initial(), sampleTrigger} then
|
|---|
| 2069 | (noise, seedState) = random(pre(seedState));
|
|---|
| 2070 | y_sampled = y_min + (y_max - y_min) * noise;
|
|---|
| 2071 | end when;
|
|---|
| 2072 | y = y_sampled;
|
|---|
| 2073 | end DiscreteNoise;
|
|---|
| 2074 |
|
|---|
| 2075 | function random
|
|---|
| 2076 | input Integer[3] seedIn;
|
|---|
| 2077 | output Real x;
|
|---|
| 2078 | output Integer[3] seedOut;
|
|---|
| 2079 | algorithm
|
|---|
| 2080 | seedOut[1] := rem(171 * seedIn[1], 30269);
|
|---|
| 2081 | seedOut[2] := rem(172 * seedIn[2], 30307);
|
|---|
| 2082 | seedOut[3] := rem(170 * seedIn[3], 30323);
|
|---|
| 2083 | for i in 1:3 loop
|
|---|
| 2084 | if seedOut[i] == 0 then
|
|---|
| 2085 | seedOut[i] := 1;
|
|---|
| 2086 | else
|
|---|
| 2087 | end if;
|
|---|
| 2088 | end for;
|
|---|
| 2089 | x := rem(seedOut[1] / 30269.0 + seedOut[2] / 30307.0 + seedOut[3] / 30323.0, 1.0);
|
|---|
| 2090 | end random;
|
|---|
| 2091 |
|
|---|
| 2092 | function bessel0
|
|---|
| 2093 | input Real x;
|
|---|
| 2094 | output Real y;
|
|---|
| 2095 | protected
|
|---|
| 2096 | Real ax;
|
|---|
| 2097 | Real a;
|
|---|
| 2098 | algorithm
|
|---|
| 2099 | ax := abs(x);
|
|---|
| 2100 | if ax < 3.75 then
|
|---|
| 2101 | a := (x / 3.75) ^ 2;
|
|---|
| 2102 | y := 1 + a * (3.5156229 + a * (3.0899424 + a * (1.2067492 + a * (0.2659732 + a * (0.0360768 + a * 0.0045813)))));
|
|---|
| 2103 | else
|
|---|
| 2104 | a := 3.75 / ax;
|
|---|
| 2105 | y := exp(ax) / sqrt(ax) * (0.39894228 + a * (0.01328592 + a * (0.00225319 + a * ((-0.00157565) + a * (0.00916281 + a * ((-0.02057706) + a * (0.02635537 + a * ((-0.01647633) + a * 0.00392377))))))));
|
|---|
| 2106 | end if;
|
|---|
| 2107 | end bessel0;
|
|---|
| 2108 |
|
|---|
| 2109 | block DiscreteFIR
|
|---|
| 2110 | extends Interfaces.PartialDiscreteSISO_equality;
|
|---|
| 2111 | parameter Real[:] a = {1, 1};
|
|---|
| 2112 | protected
|
|---|
| 2113 | parameter Integer n = size(a, 1) - 1;
|
|---|
| 2114 | discrete Real[n] x;
|
|---|
| 2115 | discrete Real[n] sum;
|
|---|
| 2116 | discrete Real y_sampled;
|
|---|
| 2117 | initial equation
|
|---|
| 2118 | x = pre(x);
|
|---|
| 2119 | equation
|
|---|
| 2120 | when {initial(), sampleTrigger} then
|
|---|
| 2121 | u_sampled = u;
|
|---|
| 2122 | x[1] = pre(u);
|
|---|
| 2123 | sum[1] = a[2] * x[1];
|
|---|
| 2124 | x[2:n] = pre(x[1:n - 1]);
|
|---|
| 2125 | sum[2:n] = a[3:n + 1] * diagonal(x[2:n]) + sum[1:n - 1];
|
|---|
| 2126 | y_sampled = a[1] * u + sum[n];
|
|---|
| 2127 | end when;
|
|---|
| 2128 | y = y_sampled;
|
|---|
| 2129 | end DiscreteFIR;
|
|---|
| 2130 |
|
|---|
| 2131 | function FIR_coefficients
|
|---|
| 2132 | input .Noise.Examples.Parts.Modelica_LinearSystems2.Controller.Types.FIRspec specType = Modelica_LinearSystems2.Controller.Types.FIRspec.MeanValue;
|
|---|
| 2133 | input Integer L(min = 2) = 2;
|
|---|
| 2134 | input .Noise.Examples.Parts.Modelica_LinearSystems2.Types.FilterType filterType = Modelica_LinearSystems2.Types.FilterType.LowPass;
|
|---|
| 2135 | input Integer order(min = 1) = 2;
|
|---|
| 2136 | input Modelica.SIunits.Frequency f_cut = 1;
|
|---|
| 2137 | input Modelica.SIunits.Time Ts(min = 0);
|
|---|
| 2138 | input Types.Window window = Modelica_LinearSystems2.Controller.Types.Window.Rectangle;
|
|---|
| 2139 | input Real beta = 2.12;
|
|---|
| 2140 | input Real[:] a_desired = {1, 1};
|
|---|
| 2141 | output Real[if specType == .Noise.Examples.Parts.Modelica_LinearSystems2.Controller.Types.FIRspec.MeanValue then L else if specType == .Noise.Examples.Parts.Modelica_LinearSystems2.Controller.Types.FIRspec.Window then if mod(order, 2) > 0 and filterType == .Noise.Examples.Parts.Modelica_LinearSystems2.Types.FilterType.HighPass then order + 2 else order + 1 else size(a_desired, 1)] a;
|
|---|
| 2142 | protected
|
|---|
| 2143 | constant Real pi = Modelica.Constants.pi;
|
|---|
| 2144 | Boolean isEven = mod(order, 2) == 0;
|
|---|
| 2145 | Integer order2 = if not isEven and filterType == .Noise.Examples.Parts.Modelica_LinearSystems2.Types.FilterType.HighPass then order + 1 else order;
|
|---|
| 2146 | Real Wc = 2 * pi * f_cut * Ts;
|
|---|
| 2147 | Integer i;
|
|---|
| 2148 | Real[order2 + 1] w;
|
|---|
| 2149 | Real k;
|
|---|
| 2150 | algorithm
|
|---|
| 2151 | assert(f_cut <= 1 / (2 * Ts), "The cut-off frequency f_cut may not be greater than half the sample frequency (Nyquist frequency), i.e. f_cut <= " + String(1 / (2 * Ts)) + " but is " + String(f_cut));
|
|---|
| 2152 | if specType == .Noise.Examples.Parts.Modelica_LinearSystems2.Controller.Types.FIRspec.MeanValue then
|
|---|
| 2153 | a := fill(1 / L, L);
|
|---|
| 2154 | elseif specType == .Noise.Examples.Parts.Modelica_LinearSystems2.Controller.Types.FIRspec.Window then
|
|---|
| 2155 | w := Internal.FIR_window(order2 + 1, window, beta);
|
|---|
| 2156 | for i in 1:order2 + 1 loop
|
|---|
| 2157 | k := i - 1 - order2 / 2;
|
|---|
| 2158 | if i - 1 == order2 / 2 then
|
|---|
| 2159 | a[i] := if filterType == .Noise.Examples.Parts.Modelica_LinearSystems2.Types.FilterType.LowPass then Wc * w[i] / pi else w[i] - Wc * w[i] / pi;
|
|---|
| 2160 | else
|
|---|
| 2161 | a[i] := if filterType == .Noise.Examples.Parts.Modelica_LinearSystems2.Types.FilterType.LowPass then sin(k * Wc) * w[i] / (k * pi) else w[i] * (sin(k * pi) - sin(k * Wc)) / (k * pi);
|
|---|
| 2162 | end if;
|
|---|
| 2163 | end for;
|
|---|
| 2164 | else
|
|---|
| 2165 | a := a_desired;
|
|---|
| 2166 | end if;
|
|---|
| 2167 | if not isEven and filterType == .Noise.Examples.Parts.Modelica_LinearSystems2.Types.FilterType.HighPass then
|
|---|
| 2168 | Modelica.Utilities.Streams.print("The requested order of the FIR filter in FIR_coefficients is odd and has been increased by one to get an even order filter\n");
|
|---|
| 2169 | else
|
|---|
| 2170 | end if;
|
|---|
| 2171 | end FIR_coefficients;
|
|---|
| 2172 |
|
|---|
| 2173 | function FIR_window
|
|---|
| 2174 | input Integer L;
|
|---|
| 2175 | input .Noise.Examples.Parts.Modelica_LinearSystems2.Controller.Types.Window window;
|
|---|
| 2176 | input Real beta = 2.12;
|
|---|
| 2177 | output Real[L] a;
|
|---|
| 2178 | protected
|
|---|
| 2179 | Integer i = 0;
|
|---|
| 2180 | constant Real pi = Modelica.Constants.pi;
|
|---|
| 2181 | Real k;
|
|---|
| 2182 | algorithm
|
|---|
| 2183 | if window <> .Noise.Examples.Parts.Modelica_LinearSystems2.Controller.Types.Window.Rectangle then
|
|---|
| 2184 | for i in 1:L loop
|
|---|
| 2185 | k := i - 1 - (L - 1) / 2;
|
|---|
| 2186 | if window == .Noise.Examples.Parts.Modelica_LinearSystems2.Controller.Types.Window.Bartlett then
|
|---|
| 2187 | a[i] := 1 - 2 * abs(k) / (L - 1);
|
|---|
| 2188 | elseif window == .Noise.Examples.Parts.Modelica_LinearSystems2.Controller.Types.Window.Hann then
|
|---|
| 2189 | a[i] := 0.5 + 0.5 * cos(2 * pi * k / (L - 1));
|
|---|
| 2190 | elseif window == .Noise.Examples.Parts.Modelica_LinearSystems2.Controller.Types.Window.Hamming then
|
|---|
| 2191 | a[i] := 0.54 + 0.46 * cos(2 * pi * k / (L - 1));
|
|---|
| 2192 | elseif window == .Noise.Examples.Parts.Modelica_LinearSystems2.Controller.Types.Window.Blackman then
|
|---|
| 2193 | a[i] := 0.42 + 0.5 * cos(2 * pi * k / (L - 1)) + 0.08 * cos(4 * pi * k / (L - 1));
|
|---|
| 2194 | elseif window == .Noise.Examples.Parts.Modelica_LinearSystems2.Controller.Types.Window.Kaiser then
|
|---|
| 2195 | k := 2 * beta * sqrt((i - 1) * (L - i)) / (L - 1);
|
|---|
| 2196 | a[i] := Internal.bessel0(k) / Internal.bessel0(beta);
|
|---|
| 2197 | else
|
|---|
| 2198 | Modelica.Utilities.Streams.error("window = " + String(window) + " not known");
|
|---|
| 2199 | end if;
|
|---|
| 2200 | end for;
|
|---|
| 2201 | else
|
|---|
| 2202 | a := ones(L);
|
|---|
| 2203 | end if;
|
|---|
| 2204 | end FIR_window;
|
|---|
| 2205 | end Internal;
|
|---|
| 2206 |
|
|---|
| 2207 | block FilterFIR
|
|---|
| 2208 | extends Interfaces.PartialSISO_equality;
|
|---|
| 2209 | parameter Types.FIRspec specType = Modelica_LinearSystems2.Controller.Types.FIRspec.MeanValue;
|
|---|
| 2210 | parameter Integer L(min = 2) = 2;
|
|---|
| 2211 | parameter .Noise.Examples.Parts.Modelica_LinearSystems2.Types.FilterType filterType = Modelica_LinearSystems2.Types.FilterType.LowPass;
|
|---|
| 2212 | parameter Integer order(min = 1) = 2;
|
|---|
| 2213 | parameter Modelica.SIunits.Frequency f_cut = 1;
|
|---|
| 2214 | parameter Types.Window window = Modelica_LinearSystems2.Controller.Types.Window.Rectangle;
|
|---|
| 2215 | parameter Real beta = 2.12;
|
|---|
| 2216 | parameter Real[:] a = {1, 1};
|
|---|
| 2217 | protected
|
|---|
| 2218 | parameter Real[:] a2 = Internal.FIR_coefficients(specType, L, filterType, order, f_cut, sampleClock.sampleTime * sampleFactor, window, beta, a) if not continuous;
|
|---|
| 2219 | Internal.DiscreteFIR discretePart(sampleFactor = sampleFactor, a = a2) if not continuous;
|
|---|
| 2220 | equation
|
|---|
| 2221 | if continuous then
|
|---|
| 2222 | y = u;
|
|---|
| 2223 | end if;
|
|---|
| 2224 | connect(u, discretePart.u);
|
|---|
| 2225 | connect(y, discretePart.y);
|
|---|
| 2226 | end FilterFIR;
|
|---|
| 2227 |
|
|---|
| 2228 | package Interfaces
|
|---|
| 2229 | partial block PartialDiscreteSISO_equality
|
|---|
| 2230 | parameter Integer sampleFactor(min = 1) = 1;
|
|---|
| 2231 | final parameter Modelica.SIunits.Time Ts = sampleClock.sampleTime * sampleFactor;
|
|---|
| 2232 | Modelica.Blocks.Interfaces.RealInput u;
|
|---|
| 2233 | Modelica.Blocks.Interfaces.RealOutput y;
|
|---|
| 2234 | protected
|
|---|
| 2235 | outer SampleClock sampleClock;
|
|---|
| 2236 | discrete Real u_sampled;
|
|---|
| 2237 | Integer ticks;
|
|---|
| 2238 | Boolean sampleTrigger;
|
|---|
| 2239 | initial equation
|
|---|
| 2240 | pre(ticks) = 0;
|
|---|
| 2241 | equation
|
|---|
| 2242 | if sampleClock.blockType == Types.BlockType.Continuous then
|
|---|
| 2243 | sampleTrigger = sample(Ts, Ts);
|
|---|
| 2244 | ticks = 0;
|
|---|
| 2245 | else
|
|---|
| 2246 | when sampleClock.sampleTrigger then
|
|---|
| 2247 | ticks = if pre(ticks) < sampleFactor then pre(ticks) + 1 else 1;
|
|---|
| 2248 | end when;
|
|---|
| 2249 | sampleTrigger = sampleClock.sampleTrigger and ticks >= sampleFactor;
|
|---|
| 2250 | end if;
|
|---|
| 2251 | end PartialDiscreteSISO_equality;
|
|---|
| 2252 |
|
|---|
| 2253 | partial block PartialSISO_equality
|
|---|
| 2254 | parameter .Noise.Examples.Parts.Modelica_LinearSystems2.Controller.Types.BlockTypeWithGlobalDefault blockType = Modelica_LinearSystems2.Controller.Types.BlockTypeWithGlobalDefault.UseSampleClockOption;
|
|---|
| 2255 | final parameter Boolean continuous = blockType == .Noise.Examples.Parts.Modelica_LinearSystems2.Controller.Types.BlockTypeWithGlobalDefault.Continuous or blockType == .Noise.Examples.Parts.Modelica_LinearSystems2.Controller.Types.BlockTypeWithGlobalDefault.UseSampleClockOption and sampleClock.blockType == .Noise.Examples.Parts.Modelica_LinearSystems2.Controller.Types.BlockType.Continuous;
|
|---|
| 2256 | parameter Integer sampleFactor(min = 1) = 1;
|
|---|
| 2257 | Modelica.Blocks.Interfaces.RealInput u;
|
|---|
| 2258 | Modelica.Blocks.Interfaces.RealOutput y;
|
|---|
| 2259 | protected
|
|---|
| 2260 | outer SampleClock sampleClock;
|
|---|
| 2261 | end PartialSISO_equality;
|
|---|
| 2262 | end Interfaces;
|
|---|
| 2263 | end Controller;
|
|---|
| 2264 |
|
|---|
| 2265 | package Types
|
|---|
| 2266 | type Method = enumeration(ExplicitEuler, ImplicitEuler, Trapezoidal, ImpulseExact, StepExact, RampExact);
|
|---|
| 2267 | type FilterType = enumeration(LowPass, HighPass, BandPass, BandStop);
|
|---|
| 2268 | end Types;
|
|---|
| 2269 | end Modelica_LinearSystems2;
|
|---|
| 2270 | end Parts;
|
|---|
| 2271 | end Examples;
|
|---|
| 2272 | end Noise;
|
|---|
| 2273 |
|
|---|
| 2274 | model ActuatorLinearSystemsNoise
|
|---|
| 2275 | extends Noise.Examples.Actuator.ActuatorLinearSystemsNoise;
|
|---|
| 2276 | end ActuatorLinearSystemsNoise;
|
|---|