SM_PermanentMagnet

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>&deg;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>&deg;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>&deg;C</td>\n</tr>\n<tr>\n<td>damper operational temperature TrOperational</td>\n<td>20</td><td>&deg;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;