model SM_PermanentMagnet "Permanent magnet synchronous induction machine"
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));
Modelica.Blocks.Interfaces.RealOutput ir[2](start = zeros(2), each final quantity = "ElectricCurrent", each final unit = "A") if useDamperCage "Damper cage currents"
annotation (
Placement(visible = false),
Dialog(showStartAttribute = true));
Modelica.Blocks.Interfaces.RealOutput idq_dr[2](each stateSelect = StateSelect.prefer, each final quantity = "ElectricCurrent", each final unit = "A") if useDamperCage "Damper space phasor current / rotor fixed frame"
annotation (Placement(visible = false));
Machines.BasicMachines.Components.AirGapR airGapR(final p = p, final Lmd = Lmd, final Lmq = Lmq, final m = m) annotation (Placement(transformation(
extent = {
{-10, -10},
{10, 10}},
rotation = 270)));
final parameter Modelica.SIunits.Temperature TpmOperational = 293.15 "Operational temperature of permanent magnet"
annotation (Dialog(group = "Operational temperatures"));
parameter Modelica.SIunits.Temperature TrOperational(start = 293.15) "Operational temperature of (optional) damper cage"
annotation (Dialog(
group = "Operational temperatures",
enable = not useThermalPort and useDamperCage));
parameter Modelica.SIunits.Voltage VsOpenCircuit(start = 112.3) "Open circuit RMS voltage per phase @ fsNominal";
parameter Modelica.SIunits.Inductance Lmd(start = 0.3 / (2 * pi * fsNominal)) "Stator main field inductance per phase in d-axis"
annotation (Dialog(tab = "Nominal resistances and inductances"));
parameter Modelica.SIunits.Inductance Lmq(start = 0.3 / (2 * pi * fsNominal)) "Stator main field inductance per phase in q-axis"
annotation (Dialog(tab = "Nominal resistances and inductances"));
parameter Boolean useDamperCage(start = true) "Enable / disable damper cage"
annotation (
Evaluate = true,
Dialog(
tab = "Nominal resistances and inductances",
group = "DamperCage"));
parameter Modelica.SIunits.Inductance Lrsigmad(start = 0.05 / (2 * pi * fsNominal)) "Damper stray inductance in d-axis"
annotation (Dialog(
tab = "Nominal resistances and inductances",
group = "DamperCage",
enable = useDamperCage));
parameter Modelica.SIunits.Inductance Lrsigmaq = Lrsigmad "Damper stray inductance in q-axis"
annotation (Dialog(
tab = "Nominal resistances and inductances",
group = "DamperCage",
enable = useDamperCage));
parameter Modelica.SIunits.Resistance Rrd(start = 0.04) "Damper resistance in d-axis at TRef"
annotation (Dialog(
tab = "Nominal resistances and inductances",
group = "DamperCage",
enable = useDamperCage));
parameter Modelica.SIunits.Resistance Rrq = Rrd "Damper resistance in q-axis at TRef"
annotation (Dialog(
tab = "Nominal resistances and inductances",
group = "DamperCage",
enable = useDamperCage));
parameter Modelica.SIunits.Temperature TrRef(start = 293.15) "Reference temperature of damper resistances in d- and q-axis"
annotation (Dialog(
tab = "Nominal resistances and inductances",
group = "DamperCage",
enable = useDamperCage));
parameter Machines.Thermal.LinearTemperatureCoefficient20 alpha20r(start = 0) "Temperature coefficient of damper resistances in d- and q-axis"
annotation (Dialog(
tab = "Nominal resistances and inductances",
group = "DamperCage",
enable = useDamperCage));
parameter Machines.Losses.PermanentMagnetLossParameters permanentMagnetLossParameters(IRef(start = 100), wRef(start = 2 * pi * fsNominal / p)) "Permanent magnet loss parameter record"
annotation (Dialog(tab = "Losses"));
Components.PermanentMagnetWithLosses permanentMagnet(final Ie = Ie, final useHeatPort = true, final m = m, final permanentMagnetLossParameters = permanentMagnetLossParameters, final is = is) annotation (Placement(transformation(
origin = {30, -30},
extent = {
{10, 10},
{-10, -10}},
rotation = 180)));
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 useHeatPort = true) if useDamperCage annotation (Placement(transformation(
origin = {0, -40},
extent = {
{-10, -10},
{10, 10}},
rotation = 270)));
protected
final parameter Modelica.SIunits.Current Ie = sqrt(2) * VsOpenCircuit / (Lmd * 2 * pi * fsNominal) "Equivalent excitation current";
Modelica.Blocks.Interfaces.RealOutput damperCageLossPower(final quantity = "Power", final unit = "W") "Damper losses";
equation
connect(idq_dr,damperCage.i);
connect(ir,damperCage.i);
connect(damperCageLossPower,damperCage.lossPower);
if not useDamperCage then
damperCageLossPower = 0;
end if;
connect(internalSupport,permanentMagnet.support) annotation (Line(points = {
{60, -100},
{60, -100},
{60, -90},
{30, -90},
{30, -40},
{30, -40}}));
connect(airGapR.flange,inertiaRotor.flange_a) annotation (Line(points = {
{10, 0},
{70, 0}}));
connect(airGapR.support,internalSupport) annotation (Line(points = {
{-10, 0},
{-40, 0},
{-40, -90},
{60, -90},
{60, -100}}));
connect(airGapR.spacePhasor_r,damperCage.spacePhasor_r) annotation (Line(
points = {
{10, -10},
{10, -30}},
color = {0, 0, 255}));
connect(airGapR.spacePhasor_r,permanentMagnet.spacePhasor_r) annotation (Line(
points = {
{10, -10},
{10, -20},
{20, -20}},
color = {0, 0, 255}));
connect(lssigma.spacePhasor_b,airGapR.spacePhasor_s) annotation (Line(
points = {
{20, 10},
{10, 10}},
color = {0, 0, 255}));
connect(damperCage.heatPort,internalThermalPort.heatPortRotorWinding) annotation (Line(
points = {
{-10, -40},
{-10, -80},
{0, -80},
{0, -80}},
color = {191, 0, 0}));
connect(permanentMagnet.flange,inertiaRotor.flange_b) annotation (Line(points = {
{30, -20},
{90, -20},
{90, 0}}));
connect(permanentMagnet.heatPort,internalThermalPort.heatPortPermanentMagnet) annotation (Line(
points = {
{20, -40},
{20, -80},
{0, -80}},
color = {191, 0, 0}));
annotation (
defaultComponentName = "smpm",
Icon(
coordinateSystem(
preserveAspectRatio = true,
extent = {
{-100, -100},
{100, 100}}),
graphics = {
Rectangle(
extent = {
{-130, 10},
{-100, -10}},
fillColor = {0, 255, 0},
fillPattern = FillPattern.Solid),
Rectangle(
extent = {
{-100, 10},
{-70, -10}},
fillColor = {255, 0, 0},
fillPattern = FillPattern.Solid),
Ellipse(
extent = {
{-134, 34},
{-66, -34}},
lineColor = {0, 0, 255})}),
Documentation(info = "<html>\n<p><strong>Model of a three phase permanent magnet synchronous induction machine.</strong><br>\nResistance and stray inductance of stator is modeled directly in stator phases, then using space phasor transformation and a rotor-fixed <em>AirGap</em> model. Resistance and stray inductance of rotor's squirrel cage is modeled in two axis of the rotor-fixed coordinate system. Permanent magnet excitation is modelled by a constant equivalent excitation current feeding the d-axis. The machine models take the following loss effects into account:\n</p>\n\n<ul>\n<li>heat losses in the temperature dependent stator winding resistances</li>\n<li>optional, when enabled: heat losses in the temperature dependent damper cage resistances</li>\n<li>friction losses</li>\n<li>core losses (only eddy current losses, no hysteresis losses)</li>\n<li>stray load losses</li>\n<li>permanent magnet losses</li>\n</ul>\n\n<p>Whether a damper cage is present or not, can be selected with Boolean parameter useDamperCage (default = true).\n<br><strong>Default values for machine's parameters (a realistic example) are:</strong><br></p>\n<table>\n<tr>\n<td>number of pole pairs p</td>\n<td>2</td><td> </td>\n</tr>\n<tr>\n<td>stator's moment of inertia</td>\n<td>0.29</td><td>kg.m2</td>\n</tr>\n<tr>\n<td>rotor's moment of inertia</td>\n<td>0.29</td><td>kg.m2</td>\n</tr>\n<tr>\n<td>nominal frequency fNominal</td>\n<td>50</td><td>Hz</td>\n</tr>\n<tr>\n<td>nominal voltage per phase</td>\n<td>100</td><td>V RMS</td>\n</tr>\n<tr>\n<td>no-load voltage per phase</td>\n<td>112.3</td><td>V RMS @ nominal speed</td>\n</tr>\n<tr>\n<td>nominal current per phase</td>\n<td>100</td><td>A RMS</td>\n</tr>\n<tr>\n<td>nominal torque</td>\n<td>181.4</td><td>Nm</td>\n</tr>\n<tr>\n<td>nominal speed</td>\n<td>1500</td><td>rpm</td>\n</tr>\n<tr>\n<td>nominal mechanical output</td>\n<td>28.5</td><td>kW</td>\n</tr>\n<tr>\n<td>nominal rotor angle</td>\n<td>20.75</td><td>degree</td>\n</tr>\n<tr>\n<td>efficiency</td>\n<td>95.0</td><td>%</td>\n</tr>\n<tr>\n<td>power factor</td>\n<td>0.98</td><td> </td>\n</tr>\n<tr>\n<td>stator resistance</td>\n<td>0.03</td><td>Ohm per phase at reference temperature</td>\n</tr>\n<tr>\n<td>reference temperature TsRef</td>\n<td>20</td><td>°C</td>\n</tr>\n<tr>\n<td>temperature coefficient alpha20s </td>\n<td>0</td><td>1/K</td>\n</tr>\n<tr>\n<td>stator reactance Xd</td>\n<td>0.4</td><td>Ohm per phase in d-axis</td>\n</tr>\n<tr>\n<td>stator reactance Xq</td>\n<td>0.4</td><td>Ohm per phase in q-axis</td>\n</tr>\n<tr>\n<td>stator stray reactance Xss</td>\n<td>0.1</td><td>Ohm per phase</td>\n</tr>\n<tr>\n<td>damper resistance in d-axis</td>\n<td>0.04</td><td>Ohm at reference temperature</td>\n</tr>\n<tr>\n<td>damper resistance in q-axis</td>\n<td>same as d-axis</td><td> </td>\n</tr>\n<tr>\n<td>reference temperature TrRef</td>\n<td>20</td><td>°C</td>\n</tr>\n<tr>\n<td>temperature coefficient alpha20r </td>\n<td>0</td><td>1/K</td>\n</tr>\n<tr>\n<td>damper stray reactance in d-axis XDds</td>\n<td>0.05</td><td>Ohm</td>\n</tr>\n<tr>\n<td>damper stray reactance in q-axis XDqs</td>\n<td>same as d-axis</td><td> </td>\n</tr>\n<tr>\n<td>stator operational temperature TsOperational</td>\n<td>20</td><td>°C</td>\n</tr>\n<tr>\n<td>damper operational temperature TrOperational</td>\n<td>20</td><td>°C</td>\n</tr>\n<tr>\n<td>These values give the following inductances:</td>\n<td> </td><td> </td>\n</tr>\n<tr>\n<td>main field inductance in d-axis</td>\n<td>(Xd - Xss)/(2*pi*fNominal)</td><td> </td>\n</tr>\n<tr>\n<td>main field inductance in q-axis</td>\n<td>(Xq - Xss)/(2*pi*fNominal)</td><td> </td>\n</tr>\n<tr>\n<td>stator stray inductance per phase</td>\n<td>Xss/(2*pi*fNominal)</td><td> </td>\n</tr>\n<tr>\n<td>damper stray inductance in d-axis</td>\n<td>XDds/(2*pi*fNominal)</td><td> </td>\n</tr>\n<tr>\n<td>damper stray inductance in q-axis</td>\n<td>XDqs/(2*pi*fNominal)</td><td> </td>\n</tr>\n</table>\n</html>"));
end SM_PermanentMagnet;