From 569c5253c46408343a01166715387d417821c04a Mon Sep 17 00:00:00 2001 From: Anton Haumer Date: Fri, 10 Jun 2022 13:08:58 +0200 Subject: [PATCH] Eddy current sources (#3976) --- .../Rotational/Examples/EddyCurrentBrake.mo | 9 +++++++ .../Rotational/Sources/EddyCurrentTorque.mo | 27 ++++++++++++------- .../Examples/EddyCurrentBrake.mo | 9 +++++++ .../Translational/Sources/EddyCurrentForce.mo | 24 ++++++++++++----- 4 files changed, 53 insertions(+), 16 deletions(-) diff --git a/Modelica/Mechanics/Rotational/Examples/EddyCurrentBrake.mo b/Modelica/Mechanics/Rotational/Examples/EddyCurrentBrake.mo index e96a58aeff..bdaee86dd0 100644 --- a/Modelica/Mechanics/Rotational/Examples/EddyCurrentBrake.mo +++ b/Modelica/Mechanics/Rotational/Examples/EddyCurrentBrake.mo @@ -2,6 +2,7 @@ within Modelica.Mechanics.Rotational.Examples; model EddyCurrentBrake "Demonstrate the usage of the rotational eddy current brake" extends Modelica.Icons.Example; Modelica.Mechanics.Rotational.Sources.EddyCurrentTorque eddyCurrentTorque( + useExcitationInput=true, tau_nominal=100, w_nominal=10, useSupport=false, @@ -19,11 +20,19 @@ model EddyCurrentBrake "Demonstrate the usage of the rotational eddy current bra extent={{-10,-10},{10,10}}, rotation=180, origin={-10,-30}))); + Blocks.Sources.Ramp ramp( + height=1, + duration=0.1, + offset=0, + startTime=0.1) + annotation (Placement(transformation(extent={{-50,-10},{-30,10}}))); equation connect(eddyCurrentTorque.flange, inertia.flange_a) annotation (Line(points={{10,0},{16,0},{20,0}})); connect(eddyCurrentTorque.heatPort, heatCapacitor.port) annotation (Line( points={{-10,-10},{-10,-15},{-10,-20}}, color={191,0,0})); + connect(ramp.y, eddyCurrentTorque.excitation) + annotation (Line(points={{-29,0},{-12,0}}, color={0,0,127})); annotation ( experiment(StopTime=1.0, Interval=0.001), Documentation(info=" diff --git a/Modelica/Mechanics/Rotational/Sources/EddyCurrentTorque.mo b/Modelica/Mechanics/Rotational/Sources/EddyCurrentTorque.mo index a455e36674..7496f4c535 100644 --- a/Modelica/Mechanics/Rotational/Sources/EddyCurrentTorque.mo +++ b/Modelica/Mechanics/Rotational/Sources/EddyCurrentTorque.mo @@ -1,8 +1,10 @@ within Modelica.Mechanics.Rotational.Sources; model EddyCurrentTorque "Simple model of a rotational eddy current brake" import Modelica.Electrical.Machines.Thermal.linearTemperatureDependency; - parameter SI.Torque tau_nominal - "Maximum torque (always braking)"; + parameter Boolean useExcitationInput=false "Enable signal input for excitation"; + parameter Real constantExcitation=1 "Excitation=1 to reach maximum torque" + annotation(Dialog(enable=not useExcitationInput)); + parameter SI.Torque tau_nominal "Maximum torque (always braking)"; parameter SI.AngularVelocity w_nominal(min=Modelica.Constants.eps) "Nominal speed (leads to maximum torque) at reference temperature"; parameter SI.Temperature TRef(start=293.15) @@ -11,18 +13,23 @@ model EddyCurrentTorque "Simple model of a rotational eddy current brake" Modelica.Electrical.Machines.Thermal.LinearTemperatureCoefficient20 alpha20(start=0) "Temperature coefficient of material"; extends Modelica.Mechanics.Rotational.Interfaces.PartialTorque; - extends - Modelica.Thermal.HeatTransfer.Interfaces.PartialElementaryConditionalHeatPort; - SI.Torque tau - "Accelerating torque acting at flange (= flange.tau)"; - SI.AngularVelocity w - "Angular velocity of flange with respect to support (= der(phi))"; + extends Modelica.Thermal.HeatTransfer.Interfaces.PartialElementaryConditionalHeatPort; + SI.Torque tau "Accelerating torque acting at flange (= flange.tau)"; + SI.AngularVelocity w "Angular velocity of flange with respect to support (= der(phi))"; Real w_normalized "Relative speed w/w_nominal"; + Blocks.Interfaces.RealInput excitation = excitationInternal if useExcitationInput + "Excitation" + annotation (Placement(transformation(extent={{-140,-20},{-100,20}}))); +protected + Real excitationInternal "Excitation"; equation + if not useExcitationInput then + excitationInternal = constantExcitation; + end if; tau = flange.tau; w = der(phi); w_normalized = w/(w_nominal*linearTemperatureDependency(1, TRef, alpha20, TheatPort)); - tau = 2*tau_nominal*w_normalized/(1 + w_normalized*w_normalized); + tau = 2*tau_nominal*excitationInternal^2*w_normalized/(1 + w_normalized*w_normalized); lossPower = tau*w; annotation ( Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100, @@ -33,6 +40,8 @@ equation Line(points={{0,0},{-4,-25},{-8,-41},{-12,-48},{-16,-50},{-20,-49},{-24,-46},{-28,-42},{-32,-38},{-36,-34},{-46,-25},{-56,-18},{-66,-12},{-76,-8}}, color={0,0,127}, smooth=Smooth.Bezier)}), Documentation(info="

This is a simple model of a rotational eddy current brake. The torque versus speed characteristic is defined by Kloss' equation.

+

The influence of excitation is either constant (useExcitationInput=false) or given by the optional input excitation (useExcitationInput=true). +Note that maximum torque depends on square of excitation (magnetic field).

Thermal behaviour:
The resistance of the braking disc is influenced by the actual temperature Theatport, which in turn shifts the speed w_nominal at which the (unchanged) maximum torque occurs.
If the heatPort is not used (useHeatPort = false), the operational temperature remains at the given temperature T.
diff --git a/Modelica/Mechanics/Translational/Examples/EddyCurrentBrake.mo b/Modelica/Mechanics/Translational/Examples/EddyCurrentBrake.mo index 5a81142d11..731c53329c 100644 --- a/Modelica/Mechanics/Translational/Examples/EddyCurrentBrake.mo +++ b/Modelica/Mechanics/Translational/Examples/EddyCurrentBrake.mo @@ -3,6 +3,7 @@ model EddyCurrentBrake "Demonstrate the usage of the translational eddy current extends Modelica.Icons.Example; Modelica.Mechanics.Translational.Sources.EddyCurrentForce eddyCurrentForce( + useExcitationInput=true, f_nominal=100, v_nominal=10, useHeatPort=true, @@ -19,11 +20,19 @@ model EddyCurrentBrake "Demonstrate the usage of the translational eddy current extent={{-10,-10},{10,10}}, rotation=180, origin={-10,-30}))); + Blocks.Sources.Ramp ramp( + height=1, + duration=0.1, + offset=0, + startTime=0.1) + annotation (Placement(transformation(extent={{-50,-10},{-30,10}}))); equation connect(eddyCurrentForce.flange, mass.flange_a) annotation (Line(points={{10,0},{20,0}}, color={0,127,0})); connect(eddyCurrentForce.heatPort, heatCapacitor.port) annotation (Line( points={{-10,-10},{-10,-15},{-10,-20}}, color={191,0,0})); + connect(ramp.y, eddyCurrentForce.excitation) + annotation (Line(points={{-29,0},{-12,0}}, color={0,0,127})); annotation ( experiment(StopTime=1.0, Interval=0.001), Documentation(info=" diff --git a/Modelica/Mechanics/Translational/Sources/EddyCurrentForce.mo b/Modelica/Mechanics/Translational/Sources/EddyCurrentForce.mo index 40004d538c..afd1da1a3b 100644 --- a/Modelica/Mechanics/Translational/Sources/EddyCurrentForce.mo +++ b/Modelica/Mechanics/Translational/Sources/EddyCurrentForce.mo @@ -1,24 +1,32 @@ within Modelica.Mechanics.Translational.Sources; model EddyCurrentForce "Simple model of a translational eddy current brake" import Modelica.Electrical.Machines.Thermal.linearTemperatureDependency; - parameter SI.Force f_nominal - "Maximum force (always braking)"; + parameter Boolean useExcitationInput=false "Enable signal input for excitation"; + parameter Real constantExcitation=1 "Excitation=1 to reach maximum force" + annotation(Dialog(enable=not useExcitationInput)); + parameter SI.Force f_nominal "Constant maximum force (always braking)"; parameter SI.Velocity v_nominal(min=Modelica.Constants.eps) "Nominal speed (leads to maximum force) at reference temperature"; parameter SI.Temperature TRef(start=293.15) "Reference temperature"; - parameter - Modelica.Electrical.Machines.Thermal.LinearTemperatureCoefficient20 + parameter Modelica.Electrical.Machines.Thermal.LinearTemperatureCoefficient20 alpha20(start=0) "Temperature coefficient of material"; extends Modelica.Mechanics.Translational.Interfaces.PartialForce; extends Modelica.Thermal.HeatTransfer.Interfaces.PartialElementaryConditionalHeatPort; - SI.Velocity v - "Velocity of flange with respect to support (= der(s))"; + SI.Velocity v "Velocity of flange with respect to support (= der(s))"; Real v_normalized "Relative speed v/v_nominal"; + Blocks.Interfaces.RealInput excitation = excitationInternal if useExcitationInput + "Excitation" + annotation (Placement(transformation(extent={{-140,-20},{-100,20}}))); +protected + Real excitationInternal "Excitation"; equation + if not useExcitationInput then + excitationInternal = constantExcitation; + end if; v = der(s); v_normalized = v/(v_nominal*linearTemperatureDependency(1, TRef, alpha20, TheatPort)); - f = 2*f_nominal*v_normalized/(1 + v_normalized*v_normalized); + f = 2*f_nominal*excitationInternal^2*v_normalized/(1 + v_normalized*v_normalized); lossPower = f*v; annotation ( Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100, @@ -29,6 +37,8 @@ equation Line(points={{0,0},{-4,-25},{-8,-41},{-12,-48},{-16,-50},{-20,-49},{-24,-46},{-28,-42},{-32,-38},{-36,-34},{-46,-25},{-56,-18},{-66,-12},{-76,-8}}, color={0,0,127}, smooth=Smooth.Bezier)}), Documentation(info="

This is a simple model of a translational eddy current brake. The force versus speed characteristic is defined by Kloss' equation.

+

The influence of excitation is either constant (useExcitationInput=false) or given by the optional input excitation (useExcitationInput=true). +Note that maximum force depends on square of excitation (magnetic field).

Thermal behaviour:
The resistance of the braking fin is influenced by the actual temperature Theatport, which in turn shifts the speed v_nominal at which the (unchanged) maximum torque occurs.
If the heatPort is not used (useHeatPort = false), the operational temperature remains at the given temperature T.