mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			5282 lines
		
	
	
		
			220 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			5282 lines
		
	
	
		
			220 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| within Modelica.Mechanics;
 | |
| package Translational
 | |
|   "Library to model 1-dimensional, translational mechanical systems"
 | |
|   extends Modelica.Icons.Package;
 | |
|   import SI = Modelica.SIunits;
 | |
| 
 | |
|   package Examples "Demonstration examples of the components of this package"
 | |
| 
 | |
|     extends Modelica.Icons.ExamplesPackage;
 | |
| 
 | |
|     model SignConvention "Examples for the used sign conventions."
 | |
|       extends Modelica.Icons.Example;
 | |
|       Translational.Components.Mass mass1(L=1,
 | |
|         s(fixed=true),
 | |
|         v(fixed=true),
 | |
|         m=1)                                      annotation (Placement(
 | |
|             transformation(extent={{40,60},{60,80}}, rotation=0)));
 | |
|       Translational.Sources.Force force1
 | |
|                                  annotation (Placement(transformation(extent={{
 | |
|                 -4,60},{16,80}}, rotation=0)));
 | |
|       Modelica.Blocks.Sources.Constant constant1(k=1)
 | |
|                                  annotation (Placement(transformation(extent={{
 | |
|                 -44,60},{-24,80}}, rotation=0)));
 | |
|       Translational.Components.Mass mass2(L=1,
 | |
|         s(fixed=true),
 | |
|         v(fixed=true),
 | |
|         m=1)                                      annotation (Placement(
 | |
|             transformation(extent={{40,0},{60,20}}, rotation=0)));
 | |
|       Translational.Sources.Force force2
 | |
|                                  annotation (Placement(transformation(extent={{
 | |
|                 -4,20},{16,40}}, rotation=0)));
 | |
|       Modelica.Blocks.Sources.Constant constant2(k=1)
 | |
|                                  annotation (Placement(transformation(extent={{
 | |
|                 -44,20},{-24,40}}, rotation=0)));
 | |
|       Translational.Components.Mass mass3(L=1,
 | |
|         s(fixed=true),
 | |
|         v(fixed=true),
 | |
|         m=1)                                      annotation (Placement(
 | |
|             transformation(extent={{-40,-40},{-20,-20}}, rotation=0)));
 | |
|       Translational.Sources.Force force3(useSupport=true)
 | |
|                                  annotation (Placement(transformation(extent={{
 | |
|                 20,-40},{0,-20}}, rotation=0)));
 | |
|       Modelica.Blocks.Sources.Constant constant3(k=1)
 | |
|                                  annotation (Placement(transformation(extent={{
 | |
|                 60,-40},{40,-20}}, rotation=0)));
 | |
|       Translational.Components.Fixed fixed
 | |
|                   annotation (Placement(transformation(extent={{0,-60},{20,-40}})));
 | |
|     equation
 | |
|       connect(constant1.y,force1. f) annotation (Line(points={{-23,70},{-6,70}},
 | |
|             color={0,0,127}));
 | |
|       connect(constant2.y,force2. f) annotation (Line(points={{-23,30},{-6,30}},
 | |
|             color={0,0,127}));
 | |
|       connect(constant3.y,force3. f) annotation (Line(points={{39,-30},{22,-30}},
 | |
|             color={0,0,127}));
 | |
|       connect(force1.flange, mass1.flange_a)    annotation (Line(
 | |
|           points={{16,70},{40,70}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(force2.flange, mass2.flange_b)    annotation (Line(
 | |
|           points={{16,30},{70,30},{70,10},{60,10}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(mass3.flange_b, force3.flange)    annotation (Line(
 | |
|           points={{-20,-30},{0,-30}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(fixed.flange, force3.support) annotation (Line(
 | |
|           points={{10,-50},{10,-40}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       annotation (Documentation(info="<html>
 | |
| <p>
 | |
| If all arrows point in the same direction a positive force
 | |
| results in a positive acceleration a, velocity v and position s.
 | |
| </p>
 | |
| <p>
 | |
| For a force of 1 N and a mass of 1 Kg this leads to
 | |
| </p>
 | |
| <pre>
 | |
|         a = 1 m/s2
 | |
|         v = 1 m/s after 1 s (SlidingMass1.v)
 | |
|         s = 0.5 m after 1 s (SlidingMass1.s)
 | |
| </pre>
 | |
| <p>
 | |
| The acceleration is not available for plotting.
 | |
| </p>
 | |
| <p>
 | |
| System 1) and 2) are equivalent. It doesn't matter whether the
 | |
| force pushes at flange_a in system 1 or pulls at flange_b in system 2.
 | |
| </p><p>
 | |
| It is of course possible to ignore the arrows and connect the models
 | |
| in an arbitrary way. But then it is hard see in what direction the
 | |
| force acts.
 | |
| </p><p>
 | |
| In the third system the two arrows are opposed which means that the
 | |
| force acts in the opposite direction (in the same direction as in
 | |
| the two other examples).
 | |
| </p>
 | |
| </html>"), Diagram(coordinateSystem(preserveAspectRatio=true,  extent={{-100,-100},{
 | |
|                 100,100}}), graphics={
 | |
|             Text(
 | |
|               extent={{-100,80},{-82,60}},
 | |
|               textString="1)",
 | |
|               lineColor={0,0,255}),
 | |
|             Text(
 | |
|               extent={{-100,40},{-82,20}},
 | |
|               textString="2)",
 | |
|               lineColor={0,0,255}),
 | |
|             Text(
 | |
|               extent={{-100,-20},{-82,-40}},
 | |
|               textString="3)",
 | |
|               lineColor={0,0,255})}),
 | |
|         experiment(StopTime=1.0, Interval=0.001));
 | |
|     end SignConvention;
 | |
| 
 | |
|     model InitialConditions "Setting of initial conditions"
 | |
| 
 | |
|       extends Modelica.Icons.Example;
 | |
| 
 | |
|       Translational.Components.Fixed fixed2(        s0=1)
 | |
|                                        annotation (Placement(transformation(
 | |
|               extent={{-100,60},{-80,80}}, rotation=0)));
 | |
|       Translational.Components.Spring s2(        s_rel0=2, c=1e3)
 | |
|                                                annotation (Placement(
 | |
|             transformation(extent={{-60,60},{-40,80}}, rotation=0)));
 | |
|       Translational.Components.Mass m3(           L=3, s(start=4.5, fixed=true),
 | |
|         v(fixed=true),
 | |
|         m=1)                                          annotation (Placement(
 | |
|             transformation(extent={{-20,60},{0,80}}, rotation=0)));
 | |
|       Translational.Components.SpringDamper sd2(        s_rel0=4, c=111,
 | |
|         d=1)                                          annotation (Placement(
 | |
|             transformation(extent={{20,60},{40,80}}, rotation=0)));
 | |
|       Translational.Components.Mass m4(           L=5, s(start=12.5, fixed=true),
 | |
|         v(fixed=true),
 | |
|         m=1)                                           annotation (Placement(
 | |
|             transformation(extent={{60,60},{80,80}}, rotation=0)));
 | |
| 
 | |
|       Translational.Components.Fixed fixed1(        s0=-1)
 | |
|                                         annotation (Placement(transformation(
 | |
|               extent={{-100,-20},{-80,0}}, rotation=0)));
 | |
|       Translational.Components.Spring s1(
 | |
|         s_rel0=1,
 | |
|         c=1e3,
 | |
|         s_rel(start=1, fixed=true))
 | |
|                         annotation (Placement(transformation(extent={{-58,-20},
 | |
|                 {-38,0}}, rotation=0)));
 | |
|       Translational.Components.Mass m1(           L=1, v(fixed=true),
 | |
|         m=1)                            annotation (Placement(transformation(
 | |
|               extent={{-20,-20},{0,0}}, rotation=0)));
 | |
|       Translational.Components.SpringDamper sd1(
 | |
|         s_rel0=1,
 | |
|         c=111,
 | |
|         s_rel(start=1, fixed=true),
 | |
|         v_rel(fixed=true),
 | |
|         d=1)            annotation (Placement(transformation(extent={{20,-20},{
 | |
|                 40,0}}, rotation=0)));
 | |
|       Translational.Components.Mass m2(           L=2, m=1)
 | |
|                                         annotation (Placement(transformation(
 | |
|               extent={{60,-20},{80,0}}, rotation=0)));
 | |
|     equation
 | |
|       connect(s2.flange_a, fixed2.flange) annotation (Line(
 | |
|           points={{-60,70},{-90,70}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(s1.flange_a, fixed1.flange) annotation (Line(
 | |
|           points={{-58,-10},{-90,-10}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(m1.flange_a, s1.flange_b) annotation (Line(
 | |
|           points={{-20,-10},{-38,-10}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(sd1.flange_a, m1.flange_b) annotation (Line(
 | |
|           points={{20,-10},{0,-10}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(m2.flange_a, sd1.flange_b) annotation (Line(
 | |
|           points={{60,-10},{40,-10}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(m4.flange_a, sd2.flange_b) annotation (Line(
 | |
|           points={{60,70},{40,70}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(sd2.flange_a, m3.flange_b) annotation (Line(
 | |
|           points={{20,70},{0,70}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(m3.flange_a, s2.flange_b) annotation (Line(
 | |
|           points={{-20,70},{-40,70}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| There are several ways to set initial conditions.
 | |
| In the first system the position of the mass m3 was defined
 | |
| by using the modifier s(start=4.5), the position of m4 by s(start=12.5).
 | |
| These positions were chosen such that the system is a rest. To calculate
 | |
| these values start at the left (Fixed1) with a value of 1 m. The spring
 | |
| has an unstretched length of 2 m and m3 an length of 3 m, which leads to
 | |
| </p>
 | |
| 
 | |
| <pre>
 | |
|         1   m (fixed1)
 | |
|       + 2   m (spring s2)
 | |
|       + 3/2 m (half of the length of mass m3)
 | |
|       -------
 | |
|         4,5 m = s(start = 4.5) for m3
 | |
|       + 3/2 m (half of the length of mass m3)
 | |
|       + 4   m (springDamper 2)
 | |
|       + 5/2 m (half of length of mass m4)
 | |
|       -------
 | |
|        12,5 m = s(start = 12.5) for m4
 | |
| </pre>
 | |
| 
 | |
| <p>
 | |
| This selection of initial conditions has the effect that Dymola selects
 | |
| those variables (m3.s and m4.s) as state variables.
 | |
| In the second example the length of the springs are given as start values
 | |
| but they cannot be used as state for pure springs (only for the spring/damper
 | |
| combination). In this case the system is not at rest.
 | |
| </p>
 | |
| 
 | |
| <p>
 | |
| <IMG src=\"modelica://Modelica/Resources/Images/Mechanics/Translational/InitialConditions.png\">
 | |
| </p>
 | |
| 
 | |
| </html>"),
 | |
|         experiment(StopTime=5.0, Interval=0.001));
 | |
|     end InitialConditions;
 | |
| 
 | |
|     model WhyArrows "Use of arrows in Mechanics.Translational"
 | |
| 
 | |
|       extends Modelica.Icons.Example;
 | |
| 
 | |
|       Translational.Components.Fixed fixed
 | |
|                                  annotation (Placement(transformation(extent={{
 | |
|                 -20,20},{0,40}}, rotation=0)));
 | |
|       Translational.Components.Rod rod1(        L=1)
 | |
|                                   annotation (Placement(transformation(extent={
 | |
|                 {-48,20},{-28,40}}, rotation=0)));
 | |
|       Translational.Components.Rod rod2(        L=1)
 | |
|                                   annotation (Placement(transformation(extent={
 | |
|                 {20,20},{40,40}}, rotation=0)));
 | |
|       Translational.Components.Rod rod3(        L=1)
 | |
|                                   annotation (Placement(transformation(extent={
 | |
|                 {-30,58},{-50,78}}, rotation=0)));
 | |
|       Translational.Sensors.PositionSensor positionSensor2 annotation (Placement(
 | |
|             transformation(extent={{60,20},{80,40}}, rotation=0)));
 | |
|       Translational.Sensors.PositionSensor positionSensor1 annotation (Placement(
 | |
|             transformation(extent={{-60,20},{-80,40}}, rotation=0)));
 | |
|       Translational.Sensors.PositionSensor positionSensor3 annotation (Placement(
 | |
|             transformation(extent={{-60,58},{-80,78}}, rotation=0)));
 | |
|       Translational.Components.Fixed fixed1(        s0=-1.9)
 | |
|                                           annotation (Placement(transformation(
 | |
|               extent={{-100,-60},{-80,-40}}, rotation=0)));
 | |
|       Translational.Components.Spring spring1(        s_rel0=2, c=11)
 | |
|                                                    annotation (Placement(
 | |
|             transformation(extent={{-80,-60},{-60,-40}}, rotation=0)));
 | |
|       Translational.Components.Mass mass1(
 | |
|         L=2,
 | |
|         s(fixed=true),
 | |
|         v(fixed=true),
 | |
|         m=1)                                      annotation (Placement(
 | |
|             transformation(extent={{-50,-60},{-30,-40}}, rotation=0)));
 | |
|       Translational.Components.Fixed fixed2(        s0=-1.9)
 | |
|                                           annotation (Placement(transformation(
 | |
|               extent={{0,-60},{20,-40}}, rotation=0)));
 | |
|       Translational.Components.Spring spring2(        s_rel0=2, c=11)
 | |
|                                                    annotation (Placement(
 | |
|             transformation(extent={{30,-60},{50,-40}}, rotation=0)));
 | |
|       Translational.Components.Mass inertia2(           L=2,
 | |
|         m=1,
 | |
|         s(fixed=true),
 | |
|         v(fixed=true))                            annotation (Placement(
 | |
|             transformation(extent={{80,-60},{60,-40}}, rotation=0)));
 | |
|     equation
 | |
|       connect(spring1.flange_b, mass1.flange_b)        annotation (Line(points={{-60,-50},
 | |
|               {-60,-72},{-30,-72},{-30,-50}},            color={0,191,0}));
 | |
|       connect(spring2.flange_b, inertia2.flange_b)     annotation (Line(points={{50,-50},
 | |
|               {60,-50}},           color={0,191,0}));
 | |
|       connect(rod3.flange_b,positionSensor3. flange) annotation (Line(
 | |
|           points={{-50,68},{-60,68}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(rod1.flange_a,positionSensor1. flange) annotation (Line(
 | |
|           points={{-48,30},{-60,30}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(rod1.flange_b, fixed.flange)  annotation (Line(
 | |
|           points={{-28,30},{-10,30}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(rod3.flange_a, fixed.flange)  annotation (Line(
 | |
|           points={{-30,68},{-10,68},{-10,30}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(fixed.flange, rod2.flange_a)  annotation (Line(
 | |
|           points={{-10,30},{20,30}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(rod2.flange_b,positionSensor2. flange) annotation (Line(
 | |
|           points={{40,30},{60,30}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(fixed1.flange,spring1. flange_a) annotation (Line(
 | |
|           points={{-90,-50},{-80,-50}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(fixed2.flange,spring2. flange_a) annotation (Line(
 | |
|           points={{10,-50},{30,-50}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| When using the models of the translational sublibrary
 | |
| it is recommended to make sure that all arrows point in
 | |
| the same direction because then all component have the
 | |
| same reference system.
 | |
| In the example the distance from flange_a of Rod1 to flange_b
 | |
| of Rod2 is 2 m. The distance from flange_a of Rod1 to flange_b
 | |
| of Rod3 is also 2 m though it is difficult to see that. Without
 | |
| the arrows it would be almost impossible to notice.
 | |
| That all arrows point in the same direction is a sufficient
 | |
| condition for an easy use of the library. There are cases
 | |
| where horizontally flipped models can be used without
 | |
| problems.
 | |
| </p>
 | |
| </html>"),     Diagram(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={
 | |
|             Text(
 | |
|               extent={{-84,10},{88,2}},
 | |
|               lineColor={0,0,255},
 | |
|               textString="positionSensor2.s = positionSensor3.s"),
 | |
|             Text(
 | |
|               extent={{-78,-4},{86,-12}},
 | |
|               lineColor={0,0,255},
 | |
|               textString="positionSensor3.s <>positionSensor1.s"),
 | |
|             Text(
 | |
|               extent={{-82,-80},{92,-88}},
 | |
|               textString="Both systems are equivalent",
 | |
|               lineColor={0,0,255}),
 | |
|             Line(
 | |
|               points={{-90,-28},{90,-28}},
 | |
|               thickness=0.5,
 | |
|               color={0,0,255})}),
 | |
|         experiment(StopTime=1.0, Interval=0.001));
 | |
|     end WhyArrows;
 | |
| 
 | |
|     model Accelerate "Use of model accelerate."
 | |
| 
 | |
|       extends Modelica.Icons.Example;
 | |
|       Translational.Sources.Accelerate accelerate
 | |
|                                            annotation (Placement(transformation(
 | |
|               extent={{-40,20},{-20,40}}, rotation=0)));
 | |
|       Translational.Components.Mass mass(L=1, m=1)
 | |
|                                                   annotation (Placement(
 | |
|             transformation(extent={{0,20},{20,40}},  rotation=0)));
 | |
|       Modelica.Blocks.Sources.Constant constantAcc(k=1)
 | |
|                                                  annotation (Placement(transformation(extent={{-80,20},
 | |
|                 {-60,40}},          rotation=0)));
 | |
|     equation
 | |
|       connect(accelerate.flange, mass.flange_a)    annotation (Line(
 | |
|           points={{-20,30},{0,30}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(constantAcc.y, accelerate.a_ref) annotation (Line(
 | |
|           points={{-59,30},{-42,30}},
 | |
|           color={0,0,127},
 | |
|           smooth=Smooth.None));
 | |
|       annotation (Documentation(info="<html>
 | |
| <p>
 | |
| Demonstrate usage of component Sources.Accelerate by moving a massing
 | |
| with a predefined acceleration.
 | |
| </p>
 | |
| </html>"),        experiment(StopTime=1.0, Interval=0.001));
 | |
|     end Accelerate;
 | |
| 
 | |
|     model Damper "Use of damper models."
 | |
| 
 | |
|       extends Modelica.Icons.Example;
 | |
| 
 | |
|       Translational.Components.Mass mass1(
 | |
|         L=1,
 | |
|         s(start=3, fixed=true),
 | |
|         v(start=10, fixed=true),
 | |
|         m=1)        annotation (Placement(transformation(extent={{-80,60},{-60,
 | |
|                 80}}, rotation=0)));
 | |
|       Translational.Components.Damper damper1(        d=25)
 | |
|                                          annotation (Placement(transformation(
 | |
|               extent={{-20,60},{0,80}}, rotation=0)));
 | |
|       Translational.Components.Fixed fixed1(        s0=4.5)
 | |
|                                          annotation (Placement(transformation(
 | |
|               extent={{22,60},{42,80}}, rotation=0)));
 | |
|       Translational.Components.Mass mass2(
 | |
|         L=1,
 | |
|         s(start=3, fixed=true),
 | |
|         v(start=10, fixed=true),
 | |
|         m=1)        annotation (Placement(transformation(extent={{-80,0},{-60,
 | |
|                 20}}, rotation=0)));
 | |
|       Translational.Components.Damper damper2(        d=25)
 | |
|                                          annotation (Placement(transformation(
 | |
|               extent={{-20,0},{0,20}}, rotation=0)));
 | |
|       Translational.Components.Fixed fixed2(        s0=4.5)
 | |
|                                          annotation (Placement(transformation(
 | |
|               extent={{20,0},{40,20}}, rotation=0)));
 | |
|       Translational.Components.Mass mass3(
 | |
|         L=1,
 | |
|         s(start=3, fixed=true),
 | |
|         v(start=10, fixed=true),
 | |
|         m=1)        annotation (Placement(transformation(extent={{-80,-60},{-60,
 | |
|                 -40}}, rotation=0)));
 | |
|       Translational.Components.Fixed fixed3(        s0=4.5)
 | |
|                                          annotation (Placement(transformation(
 | |
|               extent={{20,-60},{40,-40}}, rotation=0)));
 | |
|       Translational.Components.Spring spring2(        s_rel0=1, c=1)
 | |
|                                              annotation (Placement(
 | |
|             transformation(extent={{-20,-20},{0,0}}, rotation=0)));
 | |
|       Translational.Components.SpringDamper springDamper3(        s_rel0=1, d=25,
 | |
|         c=1)                                                   annotation (Placement(
 | |
|             transformation(extent={{-20,-60},{0,-40}}, rotation=0)));
 | |
|     equation
 | |
|       connect(mass1.flange_b, damper1.flange_a)        annotation (Line(points=
 | |
|               {{-60,70},{-20,70}}, color={0,191,0}));
 | |
|       connect(mass2.flange_b, damper2.flange_a)        annotation (Line(points={{-60,10},
 | |
|               {-20,10}},           color={0,191,0}));
 | |
|       connect(damper2.flange_b,spring2. flange_b) annotation (Line(points={{0,
 | |
|               10},{0,-10}}, color={0,191,0}));
 | |
|       connect(damper2.flange_a,spring2. flange_a) annotation (Line(points={{-20,
 | |
|               10},{-20,-10}}, color={0,191,0}));
 | |
|       connect(mass3.flange_b, springDamper3.flange_a)        annotation (Line(
 | |
|             points={{-60,-50},{-20,-50}}, color={0,191,0}));
 | |
|       connect(damper1.flange_b, fixed1.flange) annotation (Line(
 | |
|           points={{0,70},{32,70}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(damper2.flange_b, fixed2.flange) annotation (Line(
 | |
|           points={{0,10},{30,10}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(springDamper3.flange_b, fixed3.flange) annotation (Line(
 | |
|           points={{0,-50},{30,-50}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       annotation (Documentation(info="<html>
 | |
| <p>
 | |
| Demonstrate usage of damper components in different variants.
 | |
| </p>
 | |
| </html>"),
 | |
|         experiment(StopTime=1.0, Interval=0.001));
 | |
|     end Damper;
 | |
| 
 | |
|     model Oscillator "Oscillator demonstrates the use of initial conditions."
 | |
| 
 | |
|       extends Modelica.Icons.Example;
 | |
| 
 | |
|       Translational.Components.Mass mass1(
 | |
|         L=1,
 | |
|         s(start=-0.5, fixed=true),
 | |
|         v(start=0, fixed=true),
 | |
|         m=1)          annotation (Placement(transformation(extent={{-20,40},{0,
 | |
|                 60}}, rotation=0)));
 | |
|       Translational.Components.Spring spring1(        s_rel0=1, c=10000)
 | |
|                                                       annotation (Placement(
 | |
|             transformation(extent={{20,40},{40,60}}, rotation=0)));
 | |
|       Translational.Components.Fixed fixed1(        s0=1)
 | |
|                                          annotation (Placement(transformation(
 | |
|               extent={{60,40},{80,60}}, rotation=0)));
 | |
|       Translational.Sources.Force force1
 | |
|                                  annotation (Placement(transformation(extent={{
 | |
|                 -60,40},{-40,60}}, rotation=0)));
 | |
|       Modelica.Blocks.Sources.Sine sine1(freqHz=15.9155) annotation (Placement(transformation(
 | |
|               extent={{-100,40},{-80,60}}, rotation=0)));
 | |
|       Translational.Components.Mass mass2(
 | |
|         L=1,
 | |
|         s(start=-0.5, fixed=true),
 | |
|         v(start=0, fixed=true),
 | |
|         m=1)          annotation (Placement(transformation(extent={{-20,-60},{0,
 | |
|                 -40}}, rotation=0)));
 | |
|       Translational.Components.Spring spring2(        s_rel0=1, c=10000)
 | |
|                                                       annotation (Placement(
 | |
|             transformation(extent={{20,-60},{40,-40}}, rotation=0)));
 | |
|       Translational.Components.Fixed fixed2(        s0=1)
 | |
|                                          annotation (Placement(transformation(
 | |
|               extent={{60,-60},{80,-40}}, rotation=0)));
 | |
|       Translational.Sources.Force force2
 | |
|                                  annotation (Placement(transformation(extent={{
 | |
|                 -60,-60},{-40,-40}}, rotation=0)));
 | |
|       Modelica.Blocks.Sources.Sine sine2(freqHz=15.9155) annotation (Placement(transformation(
 | |
|               extent={{-100,-60},{-80,-40}}, rotation=0)));
 | |
|       Translational.Components.Damper damper1(        d=10)
 | |
|                                          annotation (Placement(transformation(
 | |
|               extent={{20,-36},{40,-16}}, rotation=0)));
 | |
|     equation
 | |
|       connect(mass1.flange_b, spring1.flange_a)        annotation (Line(points=
 | |
|               {{0,50},{20,50}}, color={0,191,0}));
 | |
|       connect(spring2.flange_a,damper1. flange_a) annotation (Line(points={{20,
 | |
|               -50},{20,-26}}, color={0,191,0}));
 | |
|       connect(mass2.flange_b, spring2.flange_a)        annotation (Line(points=
 | |
|               {{0,-50},{20,-50}}, color={0,191,0}));
 | |
|       connect(damper1.flange_b,spring2. flange_b) annotation (Line(points={{40,
 | |
|               -26},{40,-50}}, color={0,191,0}));
 | |
|       connect(sine1.y,force1. f) annotation (Line(points={{-79,50},{-62,50}},
 | |
|             color={0,0,127}));
 | |
|       connect(sine2.y,force2. f) annotation (Line(points={{-79,-50},{-62,-50}},
 | |
|             color={0,0,127}));
 | |
|       connect(spring1.flange_b, fixed1.flange) annotation (Line(
 | |
|           points={{40,50},{70,50}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(force2.flange, mass2.flange_a)    annotation (Line(
 | |
|           points={{-40,-50},{-20,-50}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(force1.flange, mass1.flange_a)    annotation (Line(
 | |
|           points={{-40,50},{-20,50}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(spring2.flange_b, fixed2.flange) annotation (Line(
 | |
|           points={{40,-50},{70,-50}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| A spring - mass system is a mechanical oscillator. If no
 | |
| damping is included and the system is excited at resonance
 | |
| frequency infinite amplitudes will result.
 | |
| The resonant frequency is given by
 | |
| omega_res = sqrt(c / m)
 | |
| with:
 | |
| </p>
 | |
| 
 | |
| <pre>
 | |
|       c spring stiffness
 | |
|       m mass
 | |
| </pre>
 | |
| 
 | |
| <p>
 | |
| To make sure that the system is initially at rest the initial
 | |
| conditions s(start=0) and v(start=0) for the SlidingMass
 | |
| are set.
 | |
| If damping is added the amplitudes are bounded.
 | |
| </p>
 | |
| </html>"),
 | |
|         experiment(StopTime=1.0, Interval=0.001));
 | |
|     end Oscillator;
 | |
| 
 | |
|     model Sensors "Sensors for translational systems."
 | |
|       import Modelica;
 | |
| 
 | |
|       extends Modelica.Icons.Example;
 | |
| 
 | |
|       Translational.Sensors.ForceSensor forceSensor  annotation (Placement(
 | |
|             transformation(extent={{-34,40},{-14,60}},
 | |
|                                                      rotation=0)));
 | |
|       Translational.Sensors.SpeedSensor speedSensor1 annotation (Placement(
 | |
|             transformation(extent={{40,-40},{60,-20}}, rotation=0)));
 | |
|       Translational.Sensors.PositionSensor positionSensor1 annotation (Placement(
 | |
|             transformation(extent={{40,0},{60,20}}, rotation=0)));
 | |
|       Translational.Sensors.AccSensor accSensor1 annotation (Placement(
 | |
|             transformation(extent={{40,-80},{60,-60}}, rotation=0)));
 | |
|       Translational.Components.Mass mass(L=1,
 | |
|         s(fixed=true),
 | |
|         v(fixed=true),
 | |
|         m=1)                                      annotation (Placement(
 | |
|             transformation(extent={{20,40},{40,60}}, rotation=0)));
 | |
|       Translational.Sources.Force force
 | |
|                                  annotation (Placement(transformation(extent={{-64,40},
 | |
|                 {-44,60}},         rotation=0)));
 | |
|       Modelica.Blocks.Sources.Sine sineForce(amplitude=10, freqHz=4)
 | |
|                                                                  annotation (Placement(
 | |
|             transformation(extent={{-100,40},{-80,60}}, rotation=0)));
 | |
|       Translational.Sensors.PositionSensor positionSensor2 annotation (Placement(
 | |
|             transformation(extent={{60,40},{80,60}}, rotation=0)));
 | |
|       Modelica.Mechanics.Translational.Sensors.MultiSensor multiSensor
 | |
|         annotation (Placement(transformation(extent={{-8,40},{12,60}})));
 | |
|     equation
 | |
|       connect(sineForce.y, force.f)
 | |
|                                  annotation (Line(points={{-79,50},{-66,50}},
 | |
|             color={0,0,127}));
 | |
|       connect(forceSensor.flange_a, force.flange)   annotation (Line(
 | |
|           points={{-34,50},{-44,50}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(mass.flange_a, positionSensor1.flange)         annotation (Line(
 | |
|           points={{20,50},{20,10},{40,10}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(mass.flange_a, speedSensor1.flange)         annotation (Line(
 | |
|           points={{20,50},{20,-30},{40,-30}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(mass.flange_a, accSensor1.flange)         annotation (Line(
 | |
|           points={{20,50},{20,-70},{40,-70}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(mass.flange_b, positionSensor2.flange)         annotation (Line(
 | |
|           points={{40,50},{60,50}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(forceSensor.flange_b, multiSensor.flange_a) annotation (Line(
 | |
|           points={{-14,50},{-8,50}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(multiSensor.flange_b, mass.flange_a) annotation (Line(
 | |
|           points={{12,50},{20,50}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| These sensors measure
 | |
| </p>
 | |
| 
 | |
| <pre>
 | |
|    force f in N
 | |
|    position s in m
 | |
|    velocity v in m/s
 | |
|    acceleration a in m/s2
 | |
| </pre>
 | |
| 
 | |
| <p>
 | |
| The measured velocity and acceleration is independent on
 | |
| the flange the sensor is connected to. The position
 | |
| depends on the flange (flange_a or flange_b) and the
 | |
| length L of the component.
 | |
| Plot PositionSensor1.s, PositionSensor2.s and SlidingMass1.s
 | |
| to see the difference.
 | |
| </p>
 | |
| </html>"),
 | |
|         experiment(StopTime=1.0, Interval=0.001));
 | |
|     end Sensors;
 | |
| 
 | |
|     model Friction "Use of model Stop"
 | |
|       extends Modelica.Icons.Example;
 | |
|       Modelica.Mechanics.Translational.Components.MassWithStopAndFriction stop1(
 | |
|                                                L=1,
 | |
|         s(fixed=true),
 | |
|         v(fixed=true),
 | |
|         smax=25,
 | |
|         smin=-25,
 | |
|         m=1,
 | |
|         F_prop=1,
 | |
|         F_Coulomb=5,
 | |
|         F_Stribeck=10,
 | |
|         fexp=2)                     annotation (Placement(transformation(extent={{20,60},
 | |
|                 {40,80}},         rotation=0)));
 | |
|       Translational.Sources.Force force
 | |
|                                  annotation (Placement(transformation(extent={{-20,60},
 | |
|                 {0,80}},         rotation=0)));
 | |
|       Modelica.Blocks.Sources.Sine sineForce(amplitude=25, freqHz=0.25)
 | |
|                                                                     annotation (Placement(
 | |
|             transformation(extent={{-60,60},{-40,80}},
 | |
|                                                      rotation=0)));
 | |
|       Modelica.Mechanics.Translational.Components.MassWithStopAndFriction stop2(
 | |
|         L=1,
 | |
|         smax=0.9,
 | |
|         smin=-0.9,
 | |
|         F_Coulomb=3,
 | |
|         F_Stribeck=5,
 | |
|         s(start=0, fixed=true),
 | |
|         m=1,
 | |
|         F_prop=1,
 | |
|         fexp=2,
 | |
|         v(start=-5, fixed=true))
 | |
|                      annotation (Placement(transformation(extent={{42,-60},{62,
 | |
|                 -40}},
 | |
|               rotation=0)));
 | |
|       Translational.Components.Spring spring(s_rel0=1, c=500)
 | |
|                                                     annotation (Placement(
 | |
|             transformation(extent={{2,-60},{22,-40}},
 | |
|                                                     rotation=0)));
 | |
|       Translational.Components.Fixed fixed2(s0=-1.75)
 | |
|                                            annotation (Placement(transformation(
 | |
|               extent={{-40,-60},{-20,-40}},
 | |
|                                         rotation=0)));
 | |
|       Translational.Sources.Force force2
 | |
|                                  annotation (Placement(transformation(extent={{-22,0},
 | |
|                 {-2,20}},        rotation=0)));
 | |
|       Components.Mass mass(
 | |
|         m=1,
 | |
|         L=1,
 | |
|         s(fixed=true),
 | |
|         v(fixed=true))
 | |
|         annotation (Placement(transformation(extent={{10,0},{30,20}})));
 | |
|       Components.SupportFriction supportFriction(f_pos=
 | |
|             Examples.Utilities.GenerateStribeckFrictionTable(
 | |
|                 F_prop=1,
 | |
|                 F_Coulomb=5,
 | |
|                 F_Stribeck=10,
 | |
|                 fexp=2,
 | |
|                 v_max=12,
 | |
|                 nTable=50))
 | |
|         annotation (Placement(transformation(extent={{40,0},{60,20}})));
 | |
|     equation
 | |
|       connect(spring.flange_b, stop2.flange_a)  annotation (Line(points={{22,-50},
 | |
|               {42,-50}},color={0,191,0}));
 | |
|       connect(sineForce.y, force.f)
 | |
|         annotation (Line(points={{-39,70},{-22,70}},
 | |
|                                                   color={0,0,127}));
 | |
|       connect(spring.flange_a, fixed2.flange) annotation (Line(
 | |
|           points={{2,-50},{-30,-50}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(force.flange, stop1.flange_a) annotation (Line(
 | |
|           points={{0,70},{20,70}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(force2.flange, mass.flange_a) annotation (Line(
 | |
|           points={{-2,10},{10,10}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(mass.flange_b, supportFriction.flange_a) annotation (Line(
 | |
|           points={{30,10},{40,10}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(sineForce.y, force2.f) annotation (Line(
 | |
|           points={{-39,70},{-30,70},{-30,10},{-24,10}},
 | |
|           color={0,0,127},
 | |
|           smooth=Smooth.None));
 | |
|       annotation (
 | |
|         Diagram(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={
 | |
|             Text(
 | |
|               extent={{-100,80},{-80,60}},
 | |
|               textString="1)",
 | |
|               lineColor={0,0,255}),
 | |
|             Text(
 | |
|               extent={{-100,20},{-80,0}},
 | |
|               textString="2)",
 | |
|               lineColor={0,0,255}),
 | |
|             Text(
 | |
|               extent={{-100,-40},{-80,-60}},
 | |
|               lineColor={0,0,255},
 | |
|               textString="3)")}),
 | |
|         Documentation(info="<html>
 | |
| <ol>
 | |
| <li> Simulate and then plot stop1.f as a function of stop1.v
 | |
|      This gives the Stribeck curve.</li>
 | |
| <li> The same model is also available by modeling the system with a Mass and
 | |
|      a SupportFriction model. The SupportFriction model defines the friction characteristic
 | |
|      with a table. The table is constructed with function
 | |
|      Examples.Utilities.GenerateStribeckFrictionTable(..) to generate the
 | |
|      same friction characteristic as with stop1.
 | |
|      The simulation results of stop1 and of model mass are therefore identical.</li>
 | |
| <li> Model stop2 gives an example for a hard stop. However there
 | |
|      can arise some problems with the used modeling approach (use of
 | |
|      <b>reinit</b>(..), convergence problems). In this case use the ElastoGap
 | |
|      to model a stop (see example Preload).</li>
 | |
| </ol>
 | |
| </html>"),
 | |
|         experiment(StopTime=5.0, Interval=0.001));
 | |
|     end Friction;
 | |
| 
 | |
|     model PreLoad "Preload of a spool using ElastoGap models."
 | |
| 
 | |
|       extends Modelica.Icons.Example;
 | |
| 
 | |
|       Translational.Components.ElastoGap innerContactA(
 | |
|         c=1000e3,
 | |
|         d=250,
 | |
|         s_rel0=0.001)
 | |
|                annotation (Placement(transformation(extent={{-70,20},{-50,40}},
 | |
|               rotation=0)));
 | |
|       Translational.Components.ElastoGap innerContactB(
 | |
|         c=1000e3,
 | |
|         d=250,
 | |
|         s_rel0=0.001)
 | |
|                annotation (                                          Placement(
 | |
|             transformation(extent={{50,20},{70,40}}, rotation=0)));
 | |
|       Translational.Components.Mass spool(
 | |
|         L=0.19,
 | |
|         m=0.150,
 | |
|         s(start=0.01475, fixed=true),
 | |
|         v(fixed=true))     annotation (Placement(transformation(extent={{0,-40},
 | |
|                 {40,0}},  rotation=0)));
 | |
|       Translational.Components.Fixed fixedLe(        s0=-0.0955)
 | |
|                                                annotation (Placement(
 | |
|             transformation(extent={{-10,-10},{10,10}}, rotation=270,
 | |
|             origin={-80,90})));
 | |
|       Translational.Components.Mass springPlateA(
 | |
|         m=10e-3,
 | |
|         L=0.002,
 | |
|         s(start=-0.093, fixed=true),
 | |
|         v(fixed=true))   annotation (Placement(transformation(extent={{-38,60},
 | |
|                 {-18,80}}, rotation=0)));
 | |
|       Translational.Components.Mass springPlateB(
 | |
|         m=10e-3,
 | |
|         s(start=-0.06925, fixed=true),
 | |
|         L=0.002,
 | |
|         v(fixed=true))      annotation (
 | |
|           Placement(transformation(extent={{20,60},{40,80}}, rotation=0)));
 | |
|       Translational.Components.Spring spring(        c=20e3, s_rel0=0.025)
 | |
|         annotation (Placement(transformation(extent={{-10,60},{10,80}},rotation=
 | |
|                0)));
 | |
|       Translational.Components.ElastoGap outerContactA(
 | |
|         c=1000e3,
 | |
|         d=250,
 | |
|         s_rel0=0.0015)
 | |
|                annotation (Placement(transformation(extent={{-70,60},{-50,80}},
 | |
|               rotation=0)));
 | |
|       Translational.Components.ElastoGap outerContactB(
 | |
|         c=1000e3,
 | |
|         d=250,
 | |
|         s_rel0=0.0015) annotation (Placement(transformation(extent={{50,60},{70,
 | |
|                 80}}, rotation=0)));
 | |
|       Translational.Components.Rod rod1(        L=0.007)
 | |
|                                      annotation (Placement(transformation(
 | |
|               extent={{-40,30},{-20,50}}, rotation=0)));
 | |
|       Translational.Components.Damper friction(        d=2500)
 | |
|                                             annotation (Placement(
 | |
|             transformation(
 | |
|             origin={-80,50},
 | |
|             extent={{-10,-10},{10,10}},
 | |
|             rotation=270)));
 | |
|       Translational.Sources.Force force
 | |
|                                  annotation (Placement(transformation(extent={{-38,-30},
 | |
|                 {-18,-10}},          rotation=0)));
 | |
|       Translational.Components.Rod housing(        L=0.0305)
 | |
|                                            annotation (Placement(transformation(
 | |
|               extent={{-10,80},{10,100}},
 | |
|                                         rotation=0)));
 | |
|       Translational.Components.Rod rod3(        L=0.00575)
 | |
|                                         annotation (Placement(transformation(
 | |
|               extent={{-40,-2},{-20,18}}, rotation=0)));
 | |
|       Translational.Components.Rod rod4(        L=0.00575)
 | |
|                                         annotation (Placement(transformation(
 | |
|               extent={{20,-2},{40,18}}, rotation=0)));
 | |
|       Translational.Components.Rod rod2(        L=0.007)
 | |
|                                      annotation (Placement(transformation(
 | |
|               extent={{20,30},{40,50}}, rotation=0)));
 | |
|       Modelica.Blocks.Sources.Sine sineForce(amplitude=150, freqHz=0.01)
 | |
|         annotation (Placement(transformation(extent={{-78,-30},{-58,-10}},
 | |
|               rotation=0)));
 | |
|     equation
 | |
|       connect(outerContactA.flange_b,springPlateA. flange_a) annotation (Line(
 | |
|             points={{-50,70},{-38,70}}, color={0,191,0}));
 | |
|       connect(springPlateA.flange_b,spring. flange_a) annotation (Line(points={{-18,70},
 | |
|               {-18,70},{-10,70}},color={0,191,0}));
 | |
|       connect(spring.flange_b,springPlateB. flange_a) annotation (Line(points={{10,70},
 | |
|               {20,70}},         color={0,191,0}));
 | |
|       connect(springPlateB.flange_b,outerContactB. flange_a) annotation (Line(
 | |
|             points={{40,70},{40,70},{50,70}},
 | |
|                                       color={0,191,0}));
 | |
|       connect(outerContactB.flange_b,housing. flange_b) annotation (Line(points={{70,70},
 | |
|               {70,90},{10,90}},         color={0,191,0}));
 | |
|       connect(springPlateA.flange_b,rod1. flange_a) annotation (Line(points={{-18,70},
 | |
|               {-18,52},{-40,52},{-40,40}},         color={0,191,0}));
 | |
|       connect(innerContactA.flange_a,rod3. flange_a) annotation (Line(points={{-70,30},
 | |
|               {-80,30},{-80,8},{-40,8}},         color={0,191,0}));
 | |
|       connect(innerContactA.flange_b,rod1. flange_b) annotation (Line(points={{-50,30},
 | |
|               {-20,30},{-20,40}},                  color={0,191,0}));
 | |
|       connect(rod2.flange_a,innerContactB. flange_a) annotation (Line(points={{20,40},
 | |
|               {20,30},{50,30}},        color={0,191,0}));
 | |
|       connect(rod4.flange_b,innerContactB. flange_b) annotation (Line(points={{40,8},{
 | |
|               70,8},{70,30}},                color={0,191,0}));
 | |
|       connect(friction.flange_b,rod3. flange_a) annotation (Line(points={{-80,40},
 | |
|               {-80,8},{-40,8}},     color={0,191,0}));
 | |
|       connect(rod3.flange_b,rod4. flange_a) annotation (Line(points={{-20,8},{
 | |
|               20,8}}, color={0,191,0}));
 | |
|       connect(rod2.flange_b,springPlateB. flange_a) annotation (Line(points={{40,40},
 | |
|               {40,52},{20,52},{20,70}},        color={0,191,0}));
 | |
|       connect(spool.flange_a,rod4. flange_a) annotation (Line(points={{0,-20},{
 | |
|               0,8},{20,8}}, color={0,191,0}));
 | |
|       connect(sineForce.y, force.f)
 | |
|                                  annotation (Line(points={{-57,-20},{-46,-20},{
 | |
|               -40,-20}},
 | |
|             color={0,0,127}));
 | |
|       connect(force.flange, spool.flange_a) annotation (Line(
 | |
|           points={{-18,-20},{0,-20}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(outerContactA.flange_a, fixedLe.flange) annotation (Line(
 | |
|           points={{-70,70},{-80,70},{-80,90}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(housing.flange_a, fixedLe.flange) annotation (Line(
 | |
|           points={{-10,90},{-80,90}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(friction.flange_a, fixedLe.flange) annotation (Line(
 | |
|           points={{-80,60},{-80,90}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       annotation (
 | |
|         Diagram(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={
 | |
|             Text(
 | |
|               extent={{-92,-72},{90,-80}},
 | |
|               textString="positive force => spool moves in positive direction ",
 | |
|               lineColor={0,0,255}),
 | |
|             Text(
 | |
|               extent={{-48,-52},{42,-60}},
 | |
|               textString="Simulate for 100 s",
 | |
|               lineColor={0,0,255}),
 | |
|             Text(
 | |
|               extent={{-100,-62},{88,-70}},
 | |
|               lineColor={0,0,255},
 | |
|               textString="plot spool.s as a function of force.f")}),
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| When designing hydraulic valves it is often necessary to hold the spool in
 | |
| a certain position as long as an external force is below a threshold value.
 | |
| If this force exceeds the threshold value a linear relation between force
 | |
| and position is desired.
 | |
| There are designs that need only one spring to accomplish this task. Using
 | |
| the ElastoGap elements this design can be modelled easily.
 | |
| Drawing of spool.
 | |
| </p>
 | |
| 
 | |
| <p>
 | |
| <IMG src=\"modelica://Modelica/Resources/Images/Mechanics/Translational/PreLoad.png\"><br>
 | |
| <IMG src=\"modelica://Modelica/Resources/Images/Mechanics/Translational/PreLoad3.png\"><br>
 | |
| <IMG src=\"modelica://Modelica/Resources/Images/Mechanics/Translational/PreLoad4.png\"><br>
 | |
| </p>
 | |
| 
 | |
| <p>
 | |
| Spool position s as a function of working force f.
 | |
| </p>
 | |
| 
 | |
| <p>
 | |
| <IMG src=\"modelica://Modelica/Resources/Images/Mechanics/Translational/PreLoad2.png\">
 | |
| </p>
 | |
| </html>"),
 | |
|         experiment(StopTime=100, Interval=0.1));
 | |
|     end PreLoad;
 | |
| 
 | |
|     model ElastoGap "Demonstrate usage of ElastoGap"
 | |
|     extends Modelica.Icons.Example;
 | |
|       Components.Fixed fixed
 | |
|         annotation (Placement(transformation(extent={{-10,-10},{10,10}})));
 | |
|       Components.Rod rod1(L=2)
 | |
|         annotation (Placement(transformation(extent={{-40,-10},{-20,10}})));
 | |
|       Components.Rod rod2(L=2)
 | |
|         annotation (Placement(transformation(extent={{20,-10},{40,10}})));
 | |
|       Components.SpringDamper springDamper1(
 | |
|         c=10,
 | |
|         s_rel0=1,
 | |
|         s_rel(fixed=false, start=1),
 | |
|         d=1.5)
 | |
|         annotation (Placement(transformation(extent={{-40,20},{-20,40}})));
 | |
|       Components.SpringDamper springDamper2(
 | |
|         c=10,
 | |
|         s_rel0=1,
 | |
|         s_rel(fixed=false, start=1),
 | |
|         d=1.5)
 | |
|         annotation (Placement(transformation(extent={{20,20},{40,40}})));
 | |
|       Components.Mass mass1(
 | |
|         s(fixed=true, start=2),
 | |
|         L=0,
 | |
|         m=1,
 | |
|         v(fixed=true))
 | |
|              annotation (Placement(transformation(extent={{-10,20},{10,40}})));
 | |
|       Components.ElastoGap elastoGap1(
 | |
|         c=10,
 | |
|         s_rel(fixed=false, start=1.5),
 | |
|         s_rel0=1.5,
 | |
|         d=1.5)
 | |
|         annotation (Placement(transformation(extent={{-40,-40},{-20,-20}})));
 | |
|       Components.ElastoGap elastoGap2(
 | |
|         c=10,
 | |
|         s_rel(fixed=false, start=1.5),
 | |
|         s_rel0=1.5,
 | |
|         d=1.5)
 | |
|         annotation (Placement(transformation(extent={{20,-40},{40,-20}})));
 | |
|       Components.Mass mass2(
 | |
|         s(fixed=true, start=2),
 | |
|         L=0,
 | |
|         m=1,
 | |
|         v(fixed=true))
 | |
|              annotation (Placement(transformation(extent={{-10,-40},{10,-20}})));
 | |
|       parameter SI.TranslationalDampingConstant d=1.5 "Damping constant";
 | |
|     equation
 | |
| 
 | |
|       connect(rod1.flange_b, fixed.flange) annotation (Line(
 | |
|           points={{-20,0},{0,0}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(fixed.flange, rod2.flange_a) annotation (Line(
 | |
|           points={{0,0},{20,0}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(springDamper1.flange_a, rod1.flange_a) annotation (Line(
 | |
|           points={{-40,30},{-48,30},{-48,0},{-40,0}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(springDamper2.flange_b, rod2.flange_b) annotation (Line(
 | |
|           points={{40,30},{50,30},{50,0},{40,0}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(springDamper1.flange_b, mass1.flange_a) annotation (Line(
 | |
|           points={{-20,30},{-10,30}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(mass1.flange_b, springDamper2.flange_a) annotation (Line(
 | |
|           points={{10,30},{20,30}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(rod1.flange_a, elastoGap1.flange_a) annotation (Line(
 | |
|           points={{-40,0},{-48,0},{-48,-30},{-40,-30}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(rod2.flange_b, elastoGap2.flange_b) annotation (Line(
 | |
|           points={{40,0},{50,0},{50,-30},{40,-30}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(elastoGap1.flange_b, mass2.flange_a) annotation (Line(
 | |
|           points={{-20,-30},{-10,-30}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(mass2.flange_b, elastoGap2.flange_a) annotation (Line(
 | |
|           points={{10,-30},{20,-30}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| This model demonstrates the effect of ElastoGaps on eigenfrequency:<br>
 | |
| Plot mass1.s and mass2.s as well as mass1.v and mass2.v<br><br>
 | |
| mass1 is moved by both spring forces all the time.<br>
 | |
| Since elastoGap1 lifts off at s > -0.5 m and elastoGap2 lifts off s < +0.5 m,
 | |
| mass2 moves freely as long as -0.5 m < s < +0.5 m.
 | |
| </p>
 | |
| </html>"),
 | |
|         experiment(StopTime=1.0, Interval=0.01));
 | |
|     end ElastoGap;
 | |
| 
 | |
|     model Brake "Demonstrate braking of a translational moving mass"
 | |
|       extends Modelica.Icons.Example;
 | |
| 
 | |
|       Modelica.Mechanics.Translational.Components.Brake brake(fn_max=1, useSupport=
 | |
|             false)
 | |
|         annotation (Placement(transformation(extent={{6,40},{26,20}})));
 | |
|       Modelica.Mechanics.Translational.Components.Mass mass1(m=1,
 | |
|         s(fixed=true),
 | |
|         v(start=1, fixed=true))
 | |
|         annotation (Placement(transformation(extent={{-34,20},{-14,40}})));
 | |
|       Modelica.Blocks.Sources.Step step(startTime=0.1, height=2)
 | |
|         annotation (Placement(transformation(extent={{-10,-10},{10,10}},
 | |
|             rotation=0,
 | |
|             origin={-24,-10})));
 | |
|       Modelica.Mechanics.Translational.Components.Brake brake1(
 | |
|                                                               fn_max=1, useSupport=
 | |
|             true)
 | |
|         annotation (Placement(transformation(extent={{6,-60},{26,-40}})));
 | |
|       Modelica.Mechanics.Translational.Components.Mass mass2(m=1,
 | |
|         s(fixed=true),
 | |
|         v(start=1, fixed=true))
 | |
|         annotation (Placement(transformation(extent={{-34,-60},{-14,-40}})));
 | |
|       Modelica.Mechanics.Translational.Components.Fixed fixed
 | |
|         annotation (Placement(transformation(extent={{6,-80},{26,-60}})));
 | |
|     equation
 | |
|       connect(mass1.flange_b, brake.flange_a)
 | |
|                                              annotation (Line(
 | |
|           points={{-14,30},{6,30}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(step.y, brake.f_normalized) annotation (Line(
 | |
|           points={{-13,-10},{16,-10},{16,19}},
 | |
|           color={0,0,127},
 | |
|           smooth=Smooth.None));
 | |
|       connect(mass2.flange_b, brake1.flange_a)
 | |
|                                              annotation (Line(
 | |
|           points={{-14,-50},{6,-50}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(step.y, brake1.f_normalized) annotation (Line(
 | |
|           points={{-13,-10},{16,-10},{16,-39}},
 | |
|           color={0,0,127},
 | |
|           smooth=Smooth.None));
 | |
|       connect(fixed.flange, brake1.support) annotation (Line(
 | |
|           points={{16,-70},{16,-60}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       annotation (        Documentation(info="<html>
 | |
| <p>
 | |
| This model consists of a mass with an initial velocity of 1 m/s.
 | |
| After 0.1 s, a brake is activated and it is shown that the mass decelerates until
 | |
| it arrives at rest and remains at rest. Two versions of this system are present,
 | |
| one where the brake is implicitly grounded and one where it is explicitly grounded.
 | |
| </p>
 | |
| </html>"),
 | |
|         experiment(StopTime=2.0, Interval=0.001));
 | |
|     end Brake;
 | |
| 
 | |
|     model HeatLosses "Demonstrate the modeling of heat losses"
 | |
|      extends Modelica.Icons.Example;
 | |
|       Components.Mass mass1(
 | |
|         m=1,
 | |
|         s(fixed=true),
 | |
|         L=0.1,
 | |
|         v(fixed=true))
 | |
|         annotation (Placement(transformation(extent={{-60,20},{-40,40}})));
 | |
|       Components.SpringDamper springDamper(
 | |
|         s_rel(fixed=true),
 | |
|         v_rel(fixed=true),
 | |
|         c=100,
 | |
|         d=10,
 | |
|         useHeatPort=true)
 | |
|               annotation (Placement(transformation(extent={{-30,20},{-10,40}})));
 | |
|       Components.Damper damper(d=10, useHeatPort=true)
 | |
|         annotation (Placement(transformation(extent={{-10,10},{10,-10}},
 | |
|             rotation=-90,
 | |
|             origin={-60,-10})));
 | |
|       Components.ElastoGap elastoGap(
 | |
|         c=100,
 | |
|         d=20,
 | |
|         s_rel0=-0.02,
 | |
|         useHeatPort=true)
 | |
|         annotation (Placement(transformation(extent={{-90,-10},{-70,10}})));
 | |
|       Components.Fixed fixed1
 | |
|         annotation (Placement(transformation(extent={{-70,-40},{-50,-20}})));
 | |
|       Sources.Force force
 | |
|         annotation (Placement(transformation(extent={{-90,20},{-70,40}})));
 | |
|       Blocks.Sources.Sine sine1(freqHz=1, amplitude=20)
 | |
|         annotation (Placement(transformation(extent={{-120,20},{-100,40}})));
 | |
|       Components.Mass mass2(
 | |
|         m=1,
 | |
|         L=0.1,
 | |
|         s(fixed=false),
 | |
|         v(fixed=false))
 | |
|         annotation (Placement(transformation(extent={{0,20},{20,40}})));
 | |
|       Components.SupportFriction supportFriction(useHeatPort=true)
 | |
|         annotation (Placement(transformation(extent={{30,20},{50,40}})));
 | |
|       Components.Spring spring(c=100, s_rel(fixed=true))
 | |
|         annotation (Placement(transformation(extent={{60,20},{80,40}})));
 | |
|       Components.Mass mass3(
 | |
|         m=1,
 | |
|         L=0.1,
 | |
|         s(fixed=false),
 | |
|         v(fixed=true))
 | |
|         annotation (Placement(transformation(extent={{90,20},{110,40}})));
 | |
|       Components.Brake brake(fn_max=10, useHeatPort=true)
 | |
|         annotation (Placement(transformation(extent={{120,20},{140,40}})));
 | |
|       Blocks.Sources.Sine sine2(amplitude=10, freqHz=2)
 | |
|         annotation (Placement(transformation(extent={{100,50},{120,70}})));
 | |
|       Components.MassWithStopAndFriction massWithStopAndFriction(
 | |
|         L=0.1,
 | |
|         m=1,
 | |
|         F_prop=0.5,
 | |
|         F_Coulomb=1,
 | |
|         F_Stribeck=2,
 | |
|         fexp=2,
 | |
|         smin=0,
 | |
|         smax=0.4,
 | |
|         v(fixed=true),
 | |
|         useHeatPort=true)
 | |
|         annotation (Placement(transformation(extent={{180,20},{200,40}})));
 | |
|       Thermal.HeatTransfer.Components.Convection convection
 | |
|         annotation (Placement(transformation(extent={{-10,-40},{10,-60}})));
 | |
|       Blocks.Sources.Constant const(k=20)
 | |
|         annotation (Placement(transformation(extent={{-30,-90},{-10,-70}})));
 | |
|       Thermal.HeatTransfer.Celsius.FixedTemperature TAmbient(T=25)
 | |
|         "Ambient temperature"
 | |
|         annotation (Placement(transformation(extent={{40,-60},{20,-40}})));
 | |
|       Components.Fixed fixed2
 | |
|         annotation (Placement(transformation(extent={{-120,-10},{-100,10}})));
 | |
|       Components.SpringDamper springDamper1(
 | |
|         c=10000,
 | |
|         d=1000,
 | |
|         useHeatPort=true,
 | |
|         s_rel(fixed=true))
 | |
|         annotation (Placement(transformation(extent={{150,20},{170,40}})));
 | |
|     equation
 | |
| 
 | |
|       connect(mass1.flange_b, springDamper.flange_a)
 | |
|                                                     annotation (Line(
 | |
|           points={{-40,30},{-30,30}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(sine1.y, force.f) annotation (Line(
 | |
|           points={{-99,30},{-92,30}},
 | |
|           color={0,0,127},
 | |
|           smooth=Smooth.None));
 | |
|       connect(force.flange, mass1.flange_a) annotation (Line(
 | |
|           points={{-70,30},{-60,30}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(mass1.flange_a, damper.flange_a) annotation (Line(
 | |
|           points={{-60,30},{-60,0}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(damper.flange_b, fixed1.flange) annotation (Line(
 | |
|           points={{-60,-20},{-60,-30}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(springDamper.flange_b, mass2.flange_a) annotation (Line(
 | |
|           points={{-10,30},{0,30}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(mass2.flange_b, supportFriction.flange_a) annotation (Line(
 | |
|           points={{20,30},{30,30}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(supportFriction.flange_b, spring.flange_a) annotation (Line(
 | |
|           points={{50,30},{60,30}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(spring.flange_b, mass3.flange_a) annotation (Line(
 | |
|           points={{80,30},{90,30}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(mass3.flange_b, brake.flange_a) annotation (Line(
 | |
|           points={{110,30},{120,30}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(sine2.y, brake.f_normalized) annotation (Line(
 | |
|           points={{121,60},{130,60},{130,41}},
 | |
|           color={0,0,127},
 | |
|           smooth=Smooth.None));
 | |
|       connect(elastoGap.flange_b, mass1.flange_a) annotation (Line(
 | |
|           points={{-70,0},{-60,0},{-60,30}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(const.y,convection. Gc) annotation (Line(
 | |
|           points={{-9,-80},{0,-80},{0,-60}},
 | |
|           color={0,0,127},
 | |
|           smooth=Smooth.None));
 | |
|       connect(TAmbient.port,convection. fluid) annotation (Line(
 | |
|           points={{20,-50},{10,-50}},
 | |
|           color={191,0,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(elastoGap.flange_a, fixed2.flange) annotation (Line(
 | |
|           points={{-90,0},{-110,0}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(elastoGap.heatPort, convection.solid) annotation (Line(
 | |
|           points={{-90,-10},{-90,-50},{-10,-50}},
 | |
|           color={191,0,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(damper.heatPort, convection.solid) annotation (Line(
 | |
|           points={{-50,0},{-50,-50},{-10,-50}},
 | |
|           color={191,0,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(springDamper.heatPort, convection.solid) annotation (Line(
 | |
|           points={{-30,20},{-30,-50},{-10,-50}},
 | |
|           color={191,0,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(supportFriction.heatPort, convection.solid) annotation (Line(
 | |
|           points={{30,20},{30,0},{-30,0},{-30,-50},{-10,-50}},
 | |
|           color={191,0,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(brake.heatPort, convection.solid) annotation (Line(
 | |
|           points={{120,20},{120,0},{-30,0},{-30,-50},{-10,-50}},
 | |
|           color={191,0,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(massWithStopAndFriction.heatPort, convection.solid) annotation (
 | |
|           Line(
 | |
|           points={{180,20},{180,0},{-30,0},{-30,-50},{-10,-50}},
 | |
|           color={191,0,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(brake.flange_b, springDamper1.flange_a) annotation (Line(
 | |
|           points={{140,30},{150,30}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(springDamper1.flange_b, massWithStopAndFriction.flange_a)
 | |
|         annotation (Line(
 | |
|           points={{170,30},{180,30}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(springDamper1.heatPort, convection.solid) annotation (Line(
 | |
|           points={{150,20},{150,0},{-30,0},{-30,-50},{-10,-50}},
 | |
|           color={191,0,0},
 | |
|           smooth=Smooth.None));
 | |
|       annotation (        Documentation(info="<html>
 | |
| <p>
 | |
| This model demonstrates how to model the dissipated power of a Translational model,
 | |
| by enabling the heatPort of all components and connecting these heatPorts via
 | |
| a convection element to the environment. The total heat flow generated by the
 | |
| elements and transported to the environment
 | |
| is present in variable convection.fluid.
 | |
| </p>
 | |
| </html>"),
 | |
|         experiment(StopTime=2.0, Interval=0.001),
 | |
|         Diagram(coordinateSystem(extent={{-120,-100},{200,100}},
 | |
|               preserveAspectRatio=false)));
 | |
|     end HeatLosses;
 | |
| 
 | |
|     package Utilities "Utility classes used by the Example models"
 | |
|       extends Modelica.Icons.UtilitiesPackage;
 | |
|       function GenerateStribeckFrictionTable
 | |
|         "Generate Stribeck friction table for example Friction for the SupportFriction"
 | |
|          extends Modelica.Icons.Function;
 | |
|          input Real F_prop(final unit="N.s/m", final min=0)
 | |
|           "Velocity dependent friction coefficient";
 | |
|          input Modelica.SIunits.Force F_Coulomb
 | |
|           "Constant friction: Coulomb force";
 | |
|          input Modelica.SIunits.Force F_Stribeck "Stribeck effect";
 | |
|          input Real fexp(final unit="s/m", final min=0) "Exponential decay";
 | |
|          input Real v_max "Generate table from v=0 ... v_max";
 | |
|          input Integer nTable(min=2)=100 "Number of table points";
 | |
|          output Real table[nTable,2] "Friction table";
 | |
|       algorithm
 | |
|          for i in 1:nTable loop
 | |
|             table[i,1] :=v_max*(i - 1)/(nTable - 1);
 | |
|             table[i,2] :=F_Coulomb + F_prop*table[i, 1] +
 | |
|                          F_Stribeck*exp(-fexp*table[i, 1]);
 | |
|          end for;
 | |
|         annotation (Documentation(info="<html>
 | |
| <p>
 | |
| Returns a table with the friction characteristic table[nTable,2] = [0, f1; ....; v_max, fn], where the first
 | |
| column is the velocity v in the range 0..v_max and the second column is the friction force
 | |
| according to the Stribeck curve:
 | |
| </p>
 | |
| <pre>
 | |
|   F_Coulomb + F_prop*v + F_Stribeck*exp(-fexp*v);
 | |
| </pre>
 | |
| 
 | |
| </html>"));
 | |
|       end GenerateStribeckFrictionTable;
 | |
|       annotation (Documentation(info="<html>
 | |
| <p>Utility models and functions used in the Examples</p>
 | |
| </html>"));
 | |
|     end Utilities;
 | |
|     annotation (
 | |
|       Documentation(info="<html>
 | |
| <p>
 | |
| This package contains example models to demonstrate the usage of the
 | |
| Translational package. Open the models and
 | |
| simulate them according to the provided description in the models.
 | |
| </p>
 | |
| 
 | |
| </html>"));
 | |
|   end Examples;
 | |
| 
 | |
|   package Components "Components for 1D translational mechanical drive trains"
 | |
|     extends Modelica.Icons.Package;
 | |
| 
 | |
|     model Fixed "Fixed flange"
 | |
|       parameter SI.Position s0=0 "Fixed offset position of housing";
 | |
| 
 | |
|       Interfaces.Flange_b flange   annotation (Placement(transformation(
 | |
|             origin={0,0},
 | |
|             extent={{-10,10},{10,-10}},
 | |
|             rotation=180)));
 | |
|     equation
 | |
|       flange.s = s0;
 | |
|       annotation (
 | |
|         Icon(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={
 | |
|             Line(points={{-80,-40},{80,-40}}, color={0,0,0}),
 | |
|             Line(points={{80,-40},{40,-80}}, color={0,0,0}),
 | |
|             Line(points={{40,-40},{0,-80}}, color={0,0,0}),
 | |
|             Line(points={{0,-40},{-40,-80}}, color={0,0,0}),
 | |
|             Line(points={{-40,-40},{-80,-80}}, color={0,0,0}),
 | |
|             Line(points={{0,-40},{0,-10}}, color={0,0,0}),
 | |
|             Text(
 | |
|               extent={{-150,-90},{150,-130}},
 | |
|               textString="%name",
 | |
|               lineColor={0,0,255})}),
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| The <i>flange</i> of a 1D translational mechanical system <i>fixed</i>
 | |
| at an position s0 in the <i>housing</i>. May be used:
 | |
| </p>
 | |
| <ul>
 | |
| <li> to connect a compliant element, such as a spring or a damper,
 | |
|      between a sliding mass and the housing.
 | |
| <li> to fix a rigid element, such as a sliding mass, at a specific
 | |
|      position.
 | |
| </ul>
 | |
| 
 | |
| </html>"));
 | |
|     end Fixed;
 | |
| 
 | |
|     model Mass "Sliding mass with inertia"
 | |
|       parameter SI.Mass m(min=0, start=1) "Mass of the sliding mass";
 | |
|       parameter StateSelect stateSelect=StateSelect.default
 | |
|         "Priority to use s and v as states" annotation(Dialog(tab="Advanced"));
 | |
|       extends Translational.Interfaces.PartialRigid(L=0,s(start=0, stateSelect=stateSelect));
 | |
|       SI.Velocity v(start=0, stateSelect=stateSelect)
 | |
|         "Absolute velocity of component";
 | |
|       SI.Acceleration a(start=0) "Absolute acceleration of component";
 | |
| 
 | |
|     equation
 | |
|       v = der(s);
 | |
|       a = der(v);
 | |
|       m*a = flange_a.f + flange_b.f;
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| Sliding mass with <i>inertia, without friction</i> and two rigidly connected flanges.
 | |
| </p>
 | |
| <p>
 | |
| The sliding mass has the length L, the position coordinate s is in the middle.
 | |
| Sign convention: A positive force at flange flange_a moves the sliding mass in the positive direction.
 | |
| A negative force at flange flange_a moves the sliding mass to the negative direction.
 | |
| </p>
 | |
| 
 | |
| </html>"),     Icon(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={
 | |
|             Line(points={{-100,0},{-55,0}}, color={0,127,0}),
 | |
|             Line(points={{55,0},{100,0}}, color={0,127,0}),
 | |
|             Rectangle(
 | |
|               extent={{-55,-30},{56,30}},
 | |
|               lineColor={0,0,0},
 | |
|               fillPattern=FillPattern.Sphere,
 | |
|               fillColor={255,255,255}),
 | |
|             Polygon(
 | |
|               points={{50,-90},{20,-80},{20,-100},{50,-90}},
 | |
|               lineColor={128,128,128},
 | |
|               fillColor={128,128,128},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Line(points={{-60,-90},{20,-90}}, color={0,0,0}),
 | |
|             Text(
 | |
|               extent={{-150,85},{150,45}},
 | |
|               textString="%name",
 | |
|               lineColor={0,0,255}),
 | |
|             Text(
 | |
|               extent={{-150,-45},{150,-75}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="m=%m")}),
 | |
|         Diagram(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={
 | |
|             Line(points={{-100,0},{-55,0}}, color={0,127,0}),
 | |
|             Line(points={{55,0},{100,0}}, color={0,127,0}),
 | |
|             Rectangle(
 | |
|               extent={{-55,-30},{55,30}},
 | |
|               lineColor={0,0,0},
 | |
|               fillPattern=FillPattern.Sphere,
 | |
|               fillColor={255,255,255}),
 | |
|             Polygon(
 | |
|               points={{50,-90},{20,-80},{20,-100},{50,-90}},
 | |
|               lineColor={128,128,128},
 | |
|               fillColor={128,128,128},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Line(points={{-60,-90},{20,-90}}, color={0,0,0}),
 | |
|             Line(points={{-100,-29},{-100,-61}}, color={0,0,0}),
 | |
|             Line(points={{100,-61},{100,-28}}, color={0,0,0}),
 | |
|             Line(points={{-98,-60},{98,-60}}, color={0,0,0}),
 | |
|             Polygon(
 | |
|               points={{-101,-60},{-96,-59},{-96,-61},{-101,-60}},
 | |
|               lineColor={0,0,0},
 | |
|               fillColor={0,0,0},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Polygon(
 | |
|               points={{100,-60},{95,-61},{95,-59},{100,-60}},
 | |
|               lineColor={0,0,0},
 | |
|               fillColor={0,0,0},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Text(
 | |
|               extent={{-44,-41},{51,-57}},
 | |
|               textString="Length L",
 | |
|               lineColor={0,0,255}),
 | |
|             Line(points={{0,30},{0,53}}, color={0,0,0}),
 | |
|             Line(points={{-72,40},{1,40}}, color={0,0,0}),
 | |
|             Polygon(
 | |
|               points={{-7,42},{-7,38},{-1,40},{-7,42}},
 | |
|               lineColor={0,0,0},
 | |
|               fillColor={0,0,0},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Text(
 | |
|               extent={{-61,53},{-9,42}},
 | |
|               textString="Position s",
 | |
|               lineColor={0,0,255})}));
 | |
|     end Mass;
 | |
| 
 | |
|     model Rod "Rod without inertia"
 | |
|       extends Translational.Interfaces.PartialRigid;
 | |
| 
 | |
|     equation
 | |
|       0 = flange_a.f + flange_b.f;
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| Rod <i>without inertia</i> and two rigidly connected flanges.
 | |
| </p>
 | |
| 
 | |
| </html>"),     Icon(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={
 | |
|             Line(points={{-100,0},{-55,0}}, color={0,127,0}),
 | |
|             Line(points={{53,0},{99,0}}, color={0,127,0}),
 | |
|             Polygon(
 | |
|               points={{50,-90},{20,-80},{20,-100},{50,-90}},
 | |
|               lineColor={128,128,128},
 | |
|               fillColor={128,128,128},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Line(points={{-60,-90},{20,-90}}, color={0,0,0}),
 | |
|             Rectangle(
 | |
|               extent={{-55,10},{53,-10}},
 | |
|               lineColor={160,160,164},
 | |
|               fillColor={192,192,192},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Text(
 | |
|               extent={{-150,80},{150,40}},
 | |
|               textString="%name",
 | |
|               lineColor={0,0,255}),
 | |
|             Text(
 | |
|               extent={{-150,-30},{150,-60}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="L=%L")}),
 | |
|         Diagram(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={
 | |
|             Line(points={{-100,0},{-55,0}}, color={0,127,0}),
 | |
|             Line(points={{54,0},{100,0}}, color={0,127,0}),
 | |
|             Polygon(
 | |
|               points={{50,-90},{20,-80},{20,-100},{50,-90}},
 | |
|               lineColor={128,128,128},
 | |
|               fillColor={128,128,128},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Line(points={{-60,-90},{20,-90}}, color={0,0,0}),
 | |
|             Rectangle(
 | |
|               extent={{-55,3},{53,-4}},
 | |
|               lineColor={160,160,164},
 | |
|               fillColor={192,192,192},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Line(points={{-100,-29},{-100,-61}}, color={0,0,0}),
 | |
|             Line(points={{100,-61},{100,-28}}, color={0,0,0}),
 | |
|             Line(points={{-98,-60},{98,-60}}, color={0,0,0}),
 | |
|             Polygon(
 | |
|               points={{-101,-60},{-96,-59},{-96,-61},{-101,-60}},
 | |
|               lineColor={0,0,0},
 | |
|               fillColor={0,0,0},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Polygon(
 | |
|               points={{100,-60},{95,-61},{95,-59},{100,-60}},
 | |
|               lineColor={0,0,0},
 | |
|               fillColor={0,0,0},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Text(
 | |
|               extent={{-44,-41},{51,-57}},
 | |
|               textString="Length L",
 | |
|               lineColor={0,0,255})}));
 | |
|     end Rod;
 | |
| 
 | |
|     model Spring "Linear 1D translational spring"
 | |
|       extends Translational.Interfaces.PartialCompliant;
 | |
|       parameter SI.TranslationalSpringConstant c(final min=0, start = 1)
 | |
|         "Spring constant";
 | |
|       parameter SI.Distance s_rel0=0 "Unstretched spring length";
 | |
| 
 | |
|     equation
 | |
|       f = c*(s_rel - s_rel0);
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| A <i>linear 1D translational spring</i>. The component can be connected either
 | |
| between two sliding masses, or between
 | |
| a sliding mass and the housing (model Fixed), to describe
 | |
| a coupling of the sliding mass with the housing via a spring.
 | |
| </p>
 | |
| 
 | |
| </html>"),     Icon(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={
 | |
|             Line(points={{-60,-90},{20,-90}}, color={0,0,0}),
 | |
|             Polygon(
 | |
|               points={{50,-90},{20,-80},{20,-100},{50,-90}},
 | |
|               lineColor={128,128,128},
 | |
|               fillColor={128,128,128},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Text(
 | |
|               extent={{-150,90},{150,50}},
 | |
|               textString="%name",
 | |
|               lineColor={0,0,255}),
 | |
|             Line(points={{-98,0},{-60,0},{-44,-30},{-16,30},{14,-30},{44,30},{
 | |
|                   60,0},{100,0}},color={0,0,0}),
 | |
|             Text(
 | |
|               extent={{-150,-45},{150,-75}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="c=%c")}),
 | |
|         Diagram(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={
 | |
|             Line(points={{-100,0},{-100,65}}, color={128,128,128}),
 | |
|             Line(points={{100,0},{100,65}}, color={128,128,128}),
 | |
|             Line(points={{-100,60},{100,60}}, color={128,128,128}),
 | |
|             Polygon(
 | |
|               points={{90,63},{100,60},{90,57},{90,63}},
 | |
|               lineColor={128,128,128},
 | |
|               fillColor={128,128,128},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Text(
 | |
|               extent={{-56,66},{36,81}},
 | |
|               lineColor={0,0,255},
 | |
|               textString="s_rel"),
 | |
|             Line(points={{-86,0},{-60,0},{-44,-30},{-16,30},{14,-30},{44,30},{
 | |
|                   60,0},{84,0}}, color={0,0,0})}));
 | |
|     end Spring;
 | |
| 
 | |
|     model Damper "Linear 1D translational damper"
 | |
|       extends Translational.Interfaces.PartialCompliantWithRelativeStates;
 | |
|       parameter SI.TranslationalDampingConstant d(final min=0, start = 0)
 | |
|         "Damping constant";
 | |
|       extends
 | |
|         Modelica.Thermal.HeatTransfer.Interfaces.PartialElementaryConditionalHeatPortWithoutT;
 | |
|     equation
 | |
|       f = d*v_rel;
 | |
|       lossPower = f*v_rel;
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| <i>Linear, velocity dependent damper</i> element. It can be either connected
 | |
| between a sliding mass and the housing (model Fixed), or
 | |
| between two sliding masses.
 | |
| </p>
 | |
| 
 | |
| </html>"),     Icon(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={
 | |
|             Line(points={{-90,0},{-60,0}}, color={0,0,0}),
 | |
|             Line(points={{-60,-30},{-60,30}}, color={0,0,0}),
 | |
|             Line(points={{-60,-30},{60,-30}}, color={0,0,0}),
 | |
|             Line(points={{-60,30},{60,30}}, color={0,0,0}),
 | |
|             Rectangle(
 | |
|               extent={{-60,30},{30,-30}},
 | |
|               lineColor={0,0,0},
 | |
|               fillColor={192,192,192},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Line(points={{30,0},{90,0}}, color={0,0,0}),
 | |
|             Polygon(
 | |
|               points={{50,-90},{20,-80},{20,-100},{50,-90}},
 | |
|               lineColor={128,128,128},
 | |
|               fillColor={128,128,128},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Line(points={{-60,-90},{20,-90}}, color={0,0,0}),
 | |
|             Text(
 | |
|               extent={{-150,90},{150,50}},
 | |
|               textString="%name",
 | |
|               lineColor={0,0,255}),
 | |
|             Text(
 | |
|               extent={{-150,-45},{150,-75}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="d=%d"),
 | |
|             Line(visible=useHeatPort,
 | |
|               points={{-100,-100},{-100,-20},{-14,-20}},
 | |
|               color={191,0,0},
 | |
|               pattern=LinePattern.Dot,
 | |
|               smooth=Smooth.None)}),
 | |
|         Diagram(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={
 | |
|             Line(points={{-90,0},{-60,0}}, color={0,0,0}),
 | |
|             Line(points={{-60,-30},{-60,30}}, color={0,0,0}),
 | |
|             Line(points={{-60,-30},{60,-30}}, color={0,0,0}),
 | |
|             Line(points={{-60,30},{60,30}}, color={0,0,0}),
 | |
|             Rectangle(
 | |
|               extent={{-60,30},{30,-30}},
 | |
|               lineColor={0,0,0},
 | |
|               fillColor={192,192,192},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Line(points={{30,0},{90,0}}, color={0,0,0}),
 | |
|             Line(points={{-50,60},{50,60}}, color={128,128,128}),
 | |
|             Polygon(
 | |
|               points={{50,63},{60,60},{50,57},{50,63}},
 | |
|               lineColor={128,128,128},
 | |
|               fillColor={128,128,128},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Text(
 | |
|               extent={{-58,68},{42,78}},
 | |
|               lineColor={128,128,128},
 | |
|               textString="der(s_rel)")}));
 | |
|     end Damper;
 | |
| 
 | |
|     model SpringDamper "Linear 1D translational spring and damper in parallel"
 | |
|       extends Translational.Interfaces.PartialCompliantWithRelativeStates;
 | |
|       parameter SI.TranslationalSpringConstant c(final min=0, start = 1)
 | |
|         "Spring constant";
 | |
|       parameter SI.TranslationalDampingConstant d(final min=0, start = 1)
 | |
|         "Damping constant";
 | |
|       parameter SI.Position s_rel0=0 "Unstretched spring length";
 | |
|       extends
 | |
|         Modelica.Thermal.HeatTransfer.Interfaces.PartialElementaryConditionalHeatPortWithoutT;
 | |
|     protected
 | |
|       Modelica.SIunits.Force f_c "Spring force";
 | |
|       Modelica.SIunits.Force f_d "Damping force";
 | |
|     equation
 | |
|       f_c = c*(s_rel - s_rel0);
 | |
|       f_d = d*v_rel;
 | |
|       f = f_c + f_d;
 | |
|       lossPower = f_d*v_rel;
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| A <i>spring and damper element connected in parallel</i>.
 | |
| The component can be
 | |
| connected either between two sliding masses to describe the elasticity
 | |
| and damping, or between a sliding mass and the housing (model Fixed),
 | |
| to describe a coupling of the sliding mass with the housing via a spring/damper.
 | |
| </p>
 | |
| </html>"),     Icon(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={
 | |
|             Line(points={{-80,40},{-60,40},{-45,10},{-15,70},{15,10},{45,70},{
 | |
|                   60,40},{80,40}}, color={0,0,0}),
 | |
|             Line(points={{-80,40},{-80,-70}}, color={0,0,0}),
 | |
|             Line(points={{-80,-70},{-52,-70}}, color={0,0,0}),
 | |
|             Rectangle(
 | |
|               extent={{-52,-49},{38,-91}},
 | |
|               lineColor={0,0,0},
 | |
|               fillColor={192,192,192},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Line(points={{-52,-49},{68,-49}}, color={0,0,0}),
 | |
|             Line(points={{-51,-91},{69,-91}}, color={0,0,0}),
 | |
|             Line(points={{38,-70},{80,-70}}, color={0,0,0}),
 | |
|             Line(points={{80,40},{80,-70}}, color={0,0,0}),
 | |
|             Line(points={{-90,0},{-80,0}}, color={0,0,0}),
 | |
|             Line(points={{80,0},{90,0}}, color={0,0,0}),
 | |
|             Polygon(
 | |
|               points={{53,-18},{23,-8},{23,-28},{53,-18}},
 | |
|               lineColor={128,128,128},
 | |
|               fillColor={128,128,128},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Line(points={{-57,-18},{23,-18}}, color={0,0,0}),
 | |
|             Text(
 | |
|               extent={{-150,120},{150,80}},
 | |
|               textString="%name",
 | |
|               lineColor={0,0,255}),
 | |
|             Text(
 | |
|               extent={{-150,-135},{150,-165}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="d=%d"),
 | |
|             Text(
 | |
|               extent={{-150,-100},{150,-130}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="c=%c"),
 | |
|             Line(visible=useHeatPort,
 | |
|               points={{-100,-100},{-100,-80},{-5,-80}},
 | |
|               color={191,0,0},
 | |
|               pattern=LinePattern.Dot,
 | |
|               smooth=Smooth.None)}),
 | |
|         Diagram(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={
 | |
|             Line(
 | |
|               points={{-80,32},{-58,32},{-43,2},{-13,62},{17,2},{47,62},{62,32},
 | |
|                   {80,32}},
 | |
|               color={0,0,0},
 | |
|               thickness=0.5),
 | |
|             Line(points={{-100,31},{-100,96}}, color={128,128,128}),
 | |
|             Line(points={{100,29},{100,94}}, color={128,128,128}),
 | |
|             Line(points={{-98,82},{100,82}}, color={128,128,128}),
 | |
|             Polygon(
 | |
|               points={{90,85},{100,82},{90,79},{90,85}},
 | |
|               lineColor={128,128,128},
 | |
|               fillColor={128,128,128},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Text(
 | |
|               extent={{-63,83},{46,103}},
 | |
|               lineColor={0,0,255},
 | |
|               textString="s_rel"),
 | |
|             Rectangle(
 | |
|               extent={{-52,-28},{38,-72}},
 | |
|               lineColor={0,0,0},
 | |
|               fillColor={192,192,192},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Line(points={{-51,-72},{69,-72}}, color={0,0,0}),
 | |
|             Line(points={{-52,-28},{68,-28}}, color={0,0,0}),
 | |
|             Line(points={{38,-50},{80,-50}}, color={0,0,0}),
 | |
|             Line(points={{-80,-50},{-52,-50}}, color={0,0,0}),
 | |
|             Line(points={{-80,32},{-80,-50}}, color={0,0,0}),
 | |
|             Line(points={{80,32},{80,-50}}, color={0,0,0}),
 | |
|             Line(points={{-90,0},{-80,0}}, color={0,0,0}),
 | |
|             Line(points={{90,0},{80,0}}, color={0,0,0})}));
 | |
|     end SpringDamper;
 | |
| 
 | |
|     model ElastoGap "1D translational spring damper combination with gap"
 | |
|       extends
 | |
|         Modelica.Mechanics.Translational.Interfaces.PartialCompliantWithRelativeStates;
 | |
|       parameter SI.TranslationalSpringConstant c(final min=0, start=1)
 | |
|         "Spring constant";
 | |
|       parameter SI.TranslationalDampingConstant d(final min=0, start=1)
 | |
|         "Damping constant";
 | |
|       parameter SI.Position s_rel0=0 "Unstretched spring length";
 | |
|       parameter Real n(final min=1) = 1
 | |
|         "Exponent of spring force ( f_c = -c*|s_rel-s_rel0|^n )";
 | |
|       extends
 | |
|         Modelica.Thermal.HeatTransfer.Interfaces.PartialElementaryConditionalHeatPortWithoutT;
 | |
| 
 | |
|     /*
 | |
| Please note that initialization might fail due to the nonlinear spring characteristic
 | |
| (spring force is zero for s_rel > s_rel0)
 | |
| if a positive force is acting on the element and no other force balances this force
 | |
| (e.g., when setting both initial velocity and acceleration to 0)
 | |
| */
 | |
|       Boolean contact "=true, if contact, otherwise no contact";
 | |
|     protected
 | |
|       Modelica.SIunits.Force f_c "Spring force";
 | |
|       Modelica.SIunits.Force f_d2 "Linear damping force";
 | |
|       Modelica.SIunits.Force f_d
 | |
|         "Linear damping force which is limited by spring force (|f_d| <= |f_c|)";
 | |
|     equation
 | |
|       // Modify contact force, so that it is only "pushing" and not
 | |
|       // "pulling/sticking" and that it is continuous
 | |
|       contact = s_rel < s_rel0;
 | |
|       f_c  = smooth(1, noEvent( if contact then -c*abs(s_rel - s_rel0)^n else 0));
 | |
|       f_d2 = if contact then d*v_rel else 0;
 | |
|       f_d  = smooth(0, noEvent( if contact then (if f_d2 <  f_c then  f_c else
 | |
|                                                  if f_d2 > -f_c then -f_c else f_d2) else 0));
 | |
|       f = f_c + f_d;
 | |
|       lossPower = f_d*v_rel;
 | |
|       annotation (
 | |
|          Documentation(info="<html>
 | |
| <p>
 | |
| This component models a spring damper combination that can lift off.
 | |
| It can be connected between a sliding mass and the housing (model
 | |
| <a href=\"modelica://Modelica.Mechanics.Translational.Components.Fixed\">Fixed</a>),
 | |
| to describe the contact of a sliding mass with the housing.
 | |
| </p>
 | |
| 
 | |
| <p>
 | |
| As long as s_rel > s_rel0, no force is exerted (s_rel = flange_b.s - flange_a.s).
 | |
| If s_rel ≤ s_rel0, the contact force is basically computed with a linear
 | |
| spring/damper characteristic. With parameter n≥1 (exponent of spring force),
 | |
| a nonlinear spring force can be modeled:
 | |
| </p>
 | |
| 
 | |
| <pre>
 | |
|    desiredContactForce = c*|s_rel - s_rel0|^n + d*<b>der</b>(s_rel)
 | |
| </pre>
 | |
| 
 | |
| <p>
 | |
| Note, Hertzian contact is described by:
 | |
| </p>
 | |
| <ul>
 | |
| <li> Contact between two metallic spheres: n=1.5</li>
 | |
| <li> Contact between two metallic plates: n=1</li>
 | |
| </ul>
 | |
| 
 | |
| <p>
 | |
| The above force law leads to the following difficulties:
 | |
| </p>
 | |
| 
 | |
| <ol>
 | |
| <li> If the damper force becomes larger as the spring force and with opposite sign,
 | |
|      the contact force would be \"pulling/sticking\" which is unphysical, since during
 | |
|      contact only pushing forces can occur.</li>
 | |
| 
 | |
| <li> When contact occurs with a non-zero relative speed (which is the usual
 | |
|      situation), the damping force has a non-zero value and therefore the contact
 | |
|      force changes discontinuously at s_rel = s_rel0. Again, this is not physical
 | |
|      because the force can only change continuously. (Note, this component is not an
 | |
|      idealized model where a steep characteristic is approximated by a discontinuity,
 | |
|      but it shall model the steep characteristic.)</li>
 | |
| </ol>
 | |
| 
 | |
| <p>
 | |
| In the literature there are several proposals to fix problem (2). Especially, often
 | |
| the following model is used (see, e.g.,
 | |
| Lankarani, Nikravesh: Continuous Contact Force Models for Impact
 | |
| Analysis in Multibody Systems, Nonlinear Dynamics 5, pp. 193-207, 1994,
 | |
| <a href=\"http://www.springerlink.com/content/h50x61270q06p65n/fulltext.pdf\">pdf-download</a>):
 | |
| </p>
 | |
| 
 | |
| <pre>
 | |
|    f = c*s_rel^n + (d*s_rel^n)*<b>der</b>(s_rel)
 | |
| </pre>
 | |
| 
 | |
| <p>
 | |
| However, this and other models proposed in literature violate
 | |
| issue (1), i.e., unphysical pulling forces can occur (if d*<b>der</b>(s_rel)
 | |
| becomes large enough). Note, if the force law is of the form \"f = f_c + f_d\", then a
 | |
| necessary condition is that |f_d| ≤ |f_c|, otherwise (1) and (2) are violated.
 | |
| For this reason, the most simplest approach is used in the ElastoGap model
 | |
| to fix both problems by using this necessary condition in the force law directly.
 | |
| If s_rel0 = 0, the equations are:
 | |
| </p>
 | |
| 
 | |
| <pre>
 | |
|     <b>if</b> s_rel ≥ 0 <b>then</b>
 | |
|        f = 0;    // contact force
 | |
|     <b>else</b>
 | |
|        f_c  = -c*|s_rel|^n;          // contact spring force (Hertzian contact force)
 | |
|        f_d2 = d*<b>der</b>(s_rel);         // linear contact damper force
 | |
|        f_d  = <b>if</b> f_d2 <  f_c <b>then</b>  f_c <b>else</b>
 | |
|               <b>if</b> f_d2 > -f_c <b>then</b> -f_c <b>else</b> f_d2;  // bounded damper force
 | |
|        f    = f_c + f_d;            // contact force
 | |
|     <b>end if</b>;
 | |
| </pre>
 | |
| 
 | |
| <p>
 | |
| Note, since |f_d| ≤ |f_c|, pulling forces cannot occur and the contact force
 | |
| is always continuous, especially around the start of the penetration at s_rel = s_rel0.
 | |
| </p>
 | |
| 
 | |
| <p>
 | |
| In the next figure, a typical simulation with the ElastoGap model is shown
 | |
| (<a href=\"modelica://Modelica.Mechanics.Translational.Examples.ElastoGap\">Examples.ElastoGap</a>)
 | |
| where the different effects are visualized:
 | |
| </p>
 | |
| 
 | |
| <ol>
 | |
| <li> Curve 1 (elastoGap1.f) is the unmodified contact force, i.e., the linear spring/damper
 | |
|      characteristic. A pulling/sticking force is present at the end of the contact.</li>
 | |
| <li> Curve 2 (elastoGap2.f) is the contact force, where the force is explicitly set to
 | |
|      zero when pulling/sticking occurs. The contact force is discontinuous when contact starts.</li>
 | |
| <li> Curve 3 (elastoGap3.f) is the ElastoGap model of this library. No discontinuity and no
 | |
|      pulling/sticking occurs.</li>
 | |
| </ol>
 | |
| 
 | |
| <p>
 | |
| <img src=\"modelica://Modelica/Resources/Images/Mechanics/Translational/ElastoGap1.png\">
 | |
| </p>
 | |
| </html>"),        Diagram(coordinateSystem(
 | |
|           preserveAspectRatio=false,
 | |
|           extent={{-100,-100},{100,100}}), graphics={
 | |
|             Line(points={{-100,0},{-50,0}}, color={0,127,0}),
 | |
|             Line(
 | |
|               points={{-48,34},{-48,-46}},
 | |
|               color={0,0,0},
 | |
|               thickness=1),
 | |
|             Line(points={{8,40},{8,2}}, color={0,0,0}),
 | |
|             Line(points={{-2,0},{38,0},{38,44},{-2,44}}, color={0,0,0}),
 | |
|             Line(points={{38,22},{72,22}}, color={0,0,0}),
 | |
|             Line(
 | |
|               points={{-12,-38},{-12,20}},
 | |
|               color={0,0,0},
 | |
|               thickness=1),
 | |
|             Line(points={{-12,22},{8,22}}, color={0,0,0}),
 | |
|             Line(points={{-12,-38},{-2,-38}}, color={0,0,0}),
 | |
|             Line(points={{72,0},{100,0}}, color={0,127,0}),
 | |
|             Line(points={{72,22},{72,-42}}, color={0,0,0}),
 | |
|             Line(points={{-2,-38},{10,-28},{22,-48},{38,-28},{50,-48},{64,-28},
 | |
|                   {72,-40}}, color={0,0,0}),
 | |
|             Rectangle(
 | |
|               extent={{8,44},{38,0}},
 | |
|               lineColor={0,0,0},
 | |
|               fillColor={192,192,192},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Text(
 | |
|               extent={{-64,-80},{64,-64}},
 | |
|               lineColor={0,0,255},
 | |
|               textString="s_rel"),
 | |
|             Line(points={{-100,-29},{-100,-61}}, color={0,0,0}),
 | |
|             Line(points={{100,-61},{100,-28}}, color={0,0,0}),
 | |
|             Line(points={{-98,-60},{98,-60}}, color={0,0,0}),
 | |
|             Polygon(
 | |
|               points={{-101,-60},{-96,-59},{-96,-61},{-101,-60}},
 | |
|               lineColor={0,0,0},
 | |
|               fillColor={0,0,0},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Polygon(
 | |
|               points={{100,-60},{95,-61},{95,-59},{100,-60}},
 | |
|               lineColor={0,0,0},
 | |
|               fillColor={0,0,0},
 | |
|               fillPattern=FillPattern.Solid)}),
 | |
|         Icon(coordinateSystem(
 | |
|           preserveAspectRatio=true,
 | |
|           extent={{-100,-100},{100,100}}), graphics={
 | |
|             Line(points={{-98,0},{-48,0}}, color={0,127,0}),
 | |
|             Line(
 | |
|               points={{-48,38},{-48,-38}},
 | |
|               color={0,0,0},
 | |
|               thickness=1),
 | |
|             Line(points={{8,-10},{8,-48}},
 | |
|                                         color={0,0,0}),
 | |
|             Line(points={{-2,-50},{38,-50},{38,-6},{-2,-6}},
 | |
|                                                          color={0,0,0}),
 | |
|             Line(points={{38,-28},{72,-28}},
 | |
|                                            color={0,0,0}),
 | |
|             Line(
 | |
|               points={{-12,-38},{-12,36}},
 | |
|               color={0,0,0},
 | |
|               thickness=1),
 | |
|             Line(points={{-12,-28},{8,-28}},
 | |
|                                            color={0,0,0}),
 | |
|             Line(points={{-12,24},{-6,24}},   color={0,0,0}),
 | |
|             Line(points={{72,0},{98,0}}, color={0,127,0}),
 | |
|             Line(points={{72,22},{72,-42}}, color={0,0,0}),
 | |
|             Line(points={{-6,24},{6,34},{18,14},{34,34},{46,14},{60,34},{68,22}},
 | |
|                              color={0,0,0}),
 | |
|             Rectangle(
 | |
|               extent={{8,-6},{38,-50}},
 | |
|               lineColor={0,0,0},
 | |
|               fillColor={192,192,192},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Line(points={{-52,-70},{28,-70}}, color={0,0,0}),
 | |
|             Polygon(
 | |
|               points={{58,-70},{28,-60},{28,-80},{58,-70}},
 | |
|               lineColor={128,128,128},
 | |
|               fillColor={128,128,128},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Text(
 | |
|               extent={{-150,100},{150,60}},
 | |
|               textString="%name",
 | |
|               lineColor={0,0,255},
 | |
|               pattern=LinePattern.Dot),
 | |
|             Text(
 | |
|               extent={{-150,-125},{150,-95}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="c=%c"),
 | |
|             Text(
 | |
|               extent={{-150,-160},{150,-130}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="d=%d"),
 | |
|             Line(points={{68,22},{72,22}},    color={0,0,0}),
 | |
|             Line(visible=useHeatPort,
 | |
|               points={{-100,-100},{-100,-44},{22,-44},{22,-28}},
 | |
|               color={191,0,0},
 | |
|               pattern=LinePattern.Dot,
 | |
|               smooth=Smooth.None)}));
 | |
|     end ElastoGap;
 | |
| 
 | |
|     model SupportFriction "Coulomb friction in support"
 | |
| 
 | |
|       extends
 | |
|         Modelica.Mechanics.Translational.Interfaces.PartialElementaryTwoFlangesAndSupport2;
 | |
|       extends
 | |
|         Modelica.Thermal.HeatTransfer.Interfaces.PartialElementaryConditionalHeatPortWithoutT;
 | |
| 
 | |
|       parameter Real f_pos[:, 2]=[0, 1]
 | |
|         "[v, f] Positive sliding friction characteristic (v>=0)";
 | |
|       parameter Real peak(final min=1) = 1
 | |
|         "peak*f_pos[1,2] = Maximum friction force for v==0";
 | |
|       extends Translational.Interfaces.PartialFriction;
 | |
| 
 | |
|       SI.Position s;
 | |
|       SI.Force f "Friction force";
 | |
|       SI.Velocity v "Absolute velocity of flange_a and flange_b";
 | |
|       SI.Acceleration a "Absolute acceleration of flange_a and flange_b";
 | |
|     equation
 | |
|       // Constant auxiliary variables
 | |
|       f0 = Modelica.Math.tempInterpol1(0, f_pos, 2);
 | |
|       f0_max = peak*f0;
 | |
|       free = false;
 | |
| 
 | |
|       s = flange_a.s - s_support;
 | |
|       flange_a.s = flange_b.s;
 | |
| 
 | |
|     // velocity and acceleration of flanges
 | |
|       v = der(s);
 | |
|       a = der(v);
 | |
|       v_relfric = v;
 | |
|       a_relfric = a;
 | |
| 
 | |
|     // Friction force
 | |
|       flange_a.f + flange_b.f - f = 0;
 | |
| 
 | |
|     // Friction force
 | |
|       f = if locked then sa*unitForce else
 | |
|          (if startForward then          Modelica.Math.tempInterpol1( v, f_pos, 2) else
 | |
|           if startBackward then        -Modelica.Math.tempInterpol1(-v, f_pos, 2) else
 | |
|           if pre(mode) == Forward then  Modelica.Math.tempInterpol1( v, f_pos, 2) else
 | |
|                                        -Modelica.Math.tempInterpol1(-v, f_pos, 2));
 | |
| 
 | |
|       lossPower = f*v_relfric;
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| This element describes <b>Coulomb friction</b> in <b>support</b>,
 | |
| i.e., a frictional force acting between a flange and the housing.
 | |
| The positive sliding friction force \"f\" has to be defined
 | |
| by table \"f_pos\" as function of the absolute velocity \"v\".
 | |
| E.g.
 | |
| </p>
 | |
| <pre>
 | |
|        v |   f
 | |
|       ---+-----
 | |
|        0 |   0
 | |
|        1 |   2
 | |
|        2 |   5
 | |
|        3 |   8
 | |
| </pre>
 | |
| <p>
 | |
| gives the following table:
 | |
| </p>
 | |
| <pre>
 | |
|    f_pos = [0, 0; 1, 2; 2, 5; 3, 8];
 | |
| </pre>
 | |
| <p>
 | |
| Currently, only linear interpolation in the table is supported.
 | |
| Outside of the table, extrapolation through the last
 | |
| two table entries is used. It is assumed that the negative
 | |
| sliding friction force has the same characteristic with negative
 | |
| values. Friction is modelled in the following way:
 | |
| </p>
 | |
| <p>
 | |
| When the absolute velocity \"v\" is not zero, the friction force
 | |
| is a function of v and of a constant normal force. This dependency
 | |
| is defined via table f_pos and can be determined by measurements,
 | |
| e.g., by driving the gear with constant velocity and measuring the
 | |
| needed driving force (= friction force).
 | |
| </p>
 | |
| <p>
 | |
| When the absolute velocity becomes zero, the elements
 | |
| connected by the friction element become stuck, i.e., the absolute
 | |
| position remains constant. In this phase the friction force is
 | |
| calculated from a force balance due to the requirement, that
 | |
| the absolute acceleration shall be zero.  The elements begin
 | |
| to slide when the friction force exceeds a threshold value,
 | |
| called the maximum static friction force, computed via:
 | |
| </p>
 | |
| <pre>
 | |
|    maximum_static_friction = <b>peak</b> * sliding_friction(v=0)  (<b>peak</b> >= 1)
 | |
| </pre>
 | |
| <p>
 | |
| This procedure is implemented in a \"clean\" way by state events and
 | |
| leads to continuous/discrete systems of equations if friction elements
 | |
| are dynamically coupled which have to be solved by appropriate
 | |
| numerical methods. The method is described in:
 | |
| </p>
 | |
| <dl>
 | |
| <dt>Otter M., Elmqvist H., and Mattsson S.E. (1999):
 | |
| <dd><b>Hybrid Modeling in Modelica based on the Synchronous
 | |
|     Data Flow Principle</b>. CACSD'99, Aug. 22.-26, Hawaii.
 | |
| </dl>
 | |
| <p>
 | |
| More precise friction models take into account the elasticity of the
 | |
| material when the two elements are \"stuck\", as well as other effects,
 | |
| like hysteresis. This has the advantage that the friction element can
 | |
| be completely described by a differential equation without events. The
 | |
| drawback is that the system becomes stiff (about 10-20 times slower
 | |
| simulation) and that more material constants have to be supplied which
 | |
| requires more sophisticated identification. For more details, see the
 | |
| following references, especially (Armstrong and Canudas de Witt 1996):
 | |
| </p>
 | |
| <dl>
 | |
| <dt>Armstrong B. (1991):
 | |
| <dd><b>Control of Machines with Friction</b>. Kluwer Academic
 | |
|     Press, Boston MA.<br><br>
 | |
| <dt>Armstrong B., and Canudas de Wit C. (1996):
 | |
| <dd><b>Friction Modeling and Compensation.</b>
 | |
|     The Control Handbook, edited by W.S.Levine, CRC Press,
 | |
|     pp. 1369-1382.<br><br>
 | |
| <dt>Canudas de Wit C., Olsson H., Astroem K.J., and Lischinsky P. (1995):
 | |
| <dd><b>A new model for control of systems with friction.</b>
 | |
|     IEEE Transactions on Automatic Control, Vol. 40, No. 3, pp. 419-425.<br><br>
 | |
| </dl>
 | |
| 
 | |
| </html>"), Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}),
 | |
|                         graphics={
 | |
|             Rectangle(
 | |
|               extent={{-90,10},{90,-10}},
 | |
|               lineColor={0,127,0},
 | |
|               fillColor={215,215,215},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Ellipse(
 | |
|               extent={{-48,-10},{-28,-30}},
 | |
|               lineColor={95,95,95},
 | |
|               fillPattern=FillPattern.Sphere,
 | |
|               fillColor={175,175,175}),
 | |
|             Ellipse(
 | |
|               extent={{-10,-10},{10,-30}},
 | |
|               lineColor={95,95,95},
 | |
|               fillPattern=FillPattern.Sphere,
 | |
|               fillColor={175,175,175}),
 | |
|             Ellipse(
 | |
|               extent={{30,-10},{50,-30}},
 | |
|               lineColor={95,95,95},
 | |
|               fillPattern=FillPattern.Sphere,
 | |
|               fillColor={175,175,175}),
 | |
|             Polygon(
 | |
|               points={{-60,-30},{60,-30},{60,-12},{80,-12},{80,-50},{-80,-50},{
 | |
|                   -80,-12},{-60,-12},{-60,-30}},
 | |
|               lineColor={95,95,95},
 | |
|               fillPattern=FillPattern.Solid,
 | |
|               smooth=Smooth.None,
 | |
|               fillColor={175,175,175}),
 | |
|             Text(
 | |
|               extent={{-150,100},{150,60}},
 | |
|               textString="%name",
 | |
|               lineColor={0,0,255}),
 | |
|             Line(points={{-10,-85},{-5,-80}}, color={0,0,0}),
 | |
|             Line(points={{-5,-90},{5,-80}}, color={0,0,0}),
 | |
|             Line(points={{-10,-90},{0,-80}}, color={0,0,0}),
 | |
|             Line(points={{0,-90},{10,-80}}, color={0,0,0}),
 | |
|             Polygon(
 | |
|               points={{-60,-50},{-20,-80},{20,-80},{60,-50},{-60,-50}},
 | |
|               lineColor={95,95,95},
 | |
|               smooth=Smooth.None,
 | |
|               fillColor={175,175,175},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Ellipse(
 | |
|               extent={{-50,30},{-30,10}},
 | |
|               lineColor={95,95,95},
 | |
|               fillPattern=FillPattern.Sphere,
 | |
|               fillColor={175,175,175}),
 | |
|             Ellipse(
 | |
|               extent={{-10,30},{10,10}},
 | |
|               lineColor={95,95,95},
 | |
|               fillPattern=FillPattern.Sphere,
 | |
|               fillColor={175,175,175}),
 | |
|             Ellipse(
 | |
|               extent={{30,30},{50,10}},
 | |
|               lineColor={95,95,95},
 | |
|               fillPattern=FillPattern.Sphere,
 | |
|               fillColor={175,175,175}),
 | |
|             Polygon(
 | |
|               points={{-60,30},{60,30},{60,12},{80,12},{80,50},{-80,50},{-80,12},
 | |
|                   {-60,12},{-60,30}},
 | |
|               lineColor={95,95,95},
 | |
|               fillPattern=FillPattern.Solid,
 | |
|               smooth=Smooth.None,
 | |
|               fillColor={175,175,175}),
 | |
|             Line(visible=useHeatPort,
 | |
|               points={{-100,-100},{-100,-20},{0,-20}},
 | |
|               color={191,0,0},
 | |
|               pattern=LinePattern.Dot,
 | |
|               smooth=Smooth.None)}));
 | |
|     end SupportFriction;
 | |
| 
 | |
|     model Brake "Brake based on Coulomb friction"
 | |
| 
 | |
|       extends
 | |
|         Modelica.Mechanics.Translational.Interfaces.PartialElementaryTwoFlangesAndSupport2;
 | |
|       extends
 | |
|         Modelica.Thermal.HeatTransfer.Interfaces.PartialElementaryConditionalHeatPortWithoutT;
 | |
|       parameter Real mue_pos[:, 2]=[0, 0.5]
 | |
|         "[v, f] Positive sliding friction characteristic (v>=0)";
 | |
|       parameter Real peak(final min=1) = 1
 | |
|         "peak*mue_pos[1,2] = Maximum friction force for v==0";
 | |
|       parameter Real cgeo(final min=0) = 1
 | |
|         "Geometry constant containing friction distribution assumption";
 | |
|       parameter SI.Force fn_max(final min=0, start=1) "Maximum normal force";
 | |
|       extends Translational.Interfaces.PartialFriction;
 | |
| 
 | |
|       SI.Position s;
 | |
|       SI.Force f "Brake friction force";
 | |
|       SI.Velocity v "Absolute velocity of flange_a and flange_b";
 | |
|       SI.Acceleration a "Absolute acceleration of flange_a and flange_b";
 | |
| 
 | |
|       Real mue0 "Friction coefficient for v=0 and forward sliding";
 | |
|       SI.Force fn "Normal force (=fn_max*f_normalized)";
 | |
| 
 | |
|       // Constant auxiliary variable
 | |
|       Modelica.Blocks.Interfaces.RealInput f_normalized
 | |
|         "Normalized force signal 0..1 (normal force = fn_max*f_normalized; brake is active if > 0)"
 | |
|         annotation (Placement(transformation(
 | |
|             origin={0,110},
 | |
|             extent={{20,-20},{-20,20}},
 | |
|             rotation=90)));
 | |
|     equation
 | |
|       mue0 = Modelica.Math.tempInterpol1(0, mue_pos, 2);
 | |
| 
 | |
|       s = s_a;
 | |
|       s = s_b;
 | |
| 
 | |
|       // velocity and acceleration of flanges flange_a and flange_b
 | |
|       v = der(s);
 | |
|       a = der(v);
 | |
|       v_relfric = v;
 | |
|       a_relfric = a;
 | |
| 
 | |
|       // Friction force, normal force and friction force for v_rel=0
 | |
|       flange_a.f + flange_b.f - f = 0;
 | |
|       fn = fn_max*f_normalized;
 | |
|       f0 = mue0*cgeo*fn;
 | |
|       f0_max = peak*f0;
 | |
|       free = fn <= 0;
 | |
| 
 | |
|       // Friction force
 | |
|       f = if locked then sa*unitForce else
 | |
|           if free then   0 else
 | |
|           cgeo*fn*(if startForward then          Modelica.Math.tempInterpol1( v, mue_pos, 2) else
 | |
|                    if startBackward then        -Modelica.Math.tempInterpol1(-v, mue_pos, 2) else
 | |
|                    if pre(mode) == Forward then  Modelica.Math.tempInterpol1( v, mue_pos, 2) else
 | |
|                                                 -Modelica.Math.tempInterpol1(-v, mue_pos, 2));
 | |
| 
 | |
|       lossPower = f*v_relfric;
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| This component models a <b>brake</b>, i.e., a component where a frictional
 | |
| force is acting between the housing and a flange and a controlled normal
 | |
| force presses the flange to the housing in order to increase friction.
 | |
| The normal force fn has to be provided as input signal f_normalized in a normalized form
 | |
| (0 ≤ f_normalized ≤ 1),
 | |
| fn = fn_max*f_normalized, where fn_max has to be provided as parameter.
 | |
| Friction in the brake is modelled in the following way:
 | |
| </p>
 | |
| <p>
 | |
| When the absolute velocity \"v\" is not zero, the friction force
 | |
| is a function of the velocity dependent friction coefficient  mue(v) , of
 | |
| the normal force \"fn\", and of a geometry constant \"cgeo\" which takes into
 | |
| account the geometry of the device and the assumptions on the friction
 | |
| distributions:
 | |
| </p>
 | |
| <pre>
 | |
|         frictional_force = <b>cgeo</b> * <b>mue</b>(v) * <b>fn</b>
 | |
| </pre>
 | |
| <p>
 | |
|    Typical values of coefficients of friction:
 | |
| </p>
 | |
| <pre>
 | |
|       dry operation   :  <b>mue</b> = 0.2 .. 0.4
 | |
|       operating in oil:  <b>mue</b> = 0.05 .. 0.1
 | |
| </pre>
 | |
| <p>
 | |
|     The positive part of the friction characteristic <b>mue</b>(v),
 | |
|     v >= 0, is defined via table mue_pos (first column = v,
 | |
|     second column = mue). Currently, only linear interpolation in
 | |
|     the table is supported.
 | |
| </p>
 | |
| <p>
 | |
|    When the absolute velocity becomes zero, the elements
 | |
|    connected by the friction element become stuck, i.e., the absolute
 | |
|    position remains constant. In this phase the friction force is
 | |
|    calculated from a force balance due to the requirement, that
 | |
|    the absolute acceleration shall be zero.  The elements begin
 | |
|    to slide when the friction force exceeds a threshold value,
 | |
|    called the  maximum static friction force, computed via:
 | |
| </p>
 | |
| <pre>
 | |
|        frictional_force = <b>peak</b> * <b>cgeo</b> * <b>mue</b>(w=0) * <b>fn</b>   (<b>peak</b> >= 1)
 | |
| </pre>
 | |
| <p>
 | |
| This procedure is implemented in a \"clean\" way by state events and
 | |
| leads to continuous/discrete systems of equations if friction elements
 | |
| are dynamically coupled. The method is described in:
 | |
| </p>
 | |
| <dl>
 | |
| <dt>Otter M., Elmqvist H., and Mattsson S.E. (1999):
 | |
| <dd><b>Hybrid Modeling in Modelica based on the Synchronous
 | |
|     Data Flow Principle</b>. CACSD'99, Aug. 22.-26, Hawaii.
 | |
| </dl>
 | |
| <p>
 | |
| More precise friction models take into account the elasticity of the
 | |
| material when the two elements are \"stuck\", as well as other effects,
 | |
| like hysteresis. This has the advantage that the friction element can
 | |
| be completely described by a differential equation without events. The
 | |
| drawback is that the system becomes stiff (about 10-20 times slower
 | |
| simulation) and that more material constants have to be supplied which
 | |
| requires more sophisticated identification. For more details, see the
 | |
| following references, especially (Armstrong and Canudas de Witt 1996):
 | |
| </p>
 | |
| <dl>
 | |
| <dt>Armstrong B. (1991):
 | |
| <dd><b>Control of Machines with Friction</b>. Kluwer Academic
 | |
|     Press, Boston MA.<br><br>
 | |
| <dt>Armstrong B., and Canudas de Wit C. (1996):
 | |
| <dd><b>Friction Modeling and Compensation.</b>
 | |
|     The Control Handbook, edited by W.S.Levine, CRC Press,
 | |
|     pp. 1369-1382.<br><br>
 | |
| <dt>Canudas de Wit C., Olsson H., Astroem K.J., and Lischinsky P. (1995):
 | |
| <dd><b>A new model for control of systems with friction.</b>
 | |
|     IEEE Transactions on Automatic Control, Vol. 40, No. 3, pp. 419-425.<br><br>
 | |
| </dl>
 | |
| </html>"), Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}),
 | |
|                         graphics={
 | |
|             Rectangle(
 | |
|               extent={{-90,10},{90,-10}},
 | |
|               lineColor={0,127,0},
 | |
|               fillColor={215,215,215},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Rectangle(
 | |
|               extent={{-20,30},{20,20}},
 | |
|               lineColor={0,0,0},
 | |
|               fillColor={0,0,0},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Rectangle(
 | |
|               extent={{-20,-20},{20,-30}},
 | |
|               lineColor={0,0,0},
 | |
|               fillColor={0,0,0},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Polygon(
 | |
|               points={{0,-30},{10,-50},{-10,-50},{0,-30}},
 | |
|               lineColor={0,0,127},
 | |
|               fillColor={0,0,127},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Polygon(
 | |
|               points={{10,50},{-10,50},{0,30},{10,50}},
 | |
|               lineColor={0,0,127},
 | |
|               fillColor={0,0,127},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Line(
 | |
|               points={{0,90},{0,50}},
 | |
|               color={0,0,0},
 | |
|               smooth=Smooth.None),
 | |
|             Rectangle(
 | |
|               extent={{20,28},{30,22}},
 | |
|               lineColor={175,175,175},
 | |
|               fillColor={175,175,175},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Rectangle(
 | |
|               extent={{20,-22},{30,-28}},
 | |
|               lineColor={175,175,175},
 | |
|               fillColor={175,175,175},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Rectangle(
 | |
|               extent={{30,28},{36,-102}},
 | |
|               lineColor={175,175,175},
 | |
|               fillColor={175,175,175},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Rectangle(
 | |
|               extent={{14,-96},{30,-102}},
 | |
|               lineColor={175,175,175},
 | |
|               fillColor={175,175,175},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Line(
 | |
|               points={{0,-50},{0,-60},{-40,-50},{-40,48},{0,60},{0,90}},
 | |
|               color={0,0,0},
 | |
|               smooth=Smooth.None),
 | |
|             Text(
 | |
|               extent={{-150,-120},{150,-160}},
 | |
|               textString="%name",
 | |
|               lineColor={0,0,255}),
 | |
|             Line(visible=useHeatPort,
 | |
|               points={{-100,-102},{-100,-16},{0,-16}},
 | |
|               color={191,0,0},
 | |
|               pattern=LinePattern.Dot,
 | |
|               smooth=Smooth.None)}));
 | |
|     end Brake;
 | |
| 
 | |
|     model IdealGearR2T
 | |
|       "Gearbox transforming rotational into translational motion"
 | |
|       extends Modelica.Mechanics.Rotational.Components.IdealGearR2T;
 | |
|       annotation (Documentation(info="<html>
 | |
| <p>Couples rotational and translational motion, like a toothed wheel with a toothed rack, specifying the ratio of rotational / translational motion.</p>
 | |
| </html>"));
 | |
|     end IdealGearR2T;
 | |
| 
 | |
|     model IdealRollingWheel
 | |
|       "Simple 1-dim. model of an ideal rolling wheel without inertia"
 | |
|       extends Modelica.Mechanics.Rotational.Components.IdealRollingWheel;
 | |
|       annotation (Documentation(info="<html>
 | |
| <p>Couples rotational and translational motion, like an ideal rolling wheel, specifying the wheel radius.</p>
 | |
| </html>"));
 | |
|     end IdealRollingWheel;
 | |
| 
 | |
|     model InitializeFlange
 | |
|       "Initializes a flange with pre-defined position, speed and acceleration (usually, this is reference data from a control bus)"
 | |
|       extends Modelica.Blocks.Icons.Block;
 | |
|       parameter Boolean use_s_start = true
 | |
|         "= true, if initial position is defined by input s_start, otherwise not initialized";
 | |
|       parameter Boolean use_v_start = true
 | |
|         "= true, if initial speed is defined by input v_start, otherwise not initialized";
 | |
|       parameter Boolean use_a_start = true
 | |
|         "= true, if initial acceleration is defined by input a_start, otherwise not initialized";
 | |
| 
 | |
|       parameter StateSelect stateSelect=StateSelect.default
 | |
|         "Priority to use flange angle and speed as states";
 | |
| 
 | |
|       Modelica.Blocks.Interfaces.RealInput s_start(unit="m") if use_s_start
 | |
|         "Initial position of flange"
 | |
|         annotation (Placement(transformation(extent={{-140,40},{-100,80}},
 | |
|               rotation=0)));
 | |
|       Modelica.Blocks.Interfaces.RealInput v_start(unit="m/s") if use_v_start
 | |
|         "Initial speed of flange"
 | |
|         annotation (Placement(transformation(extent={{-140,-20},{-100,20}},
 | |
|               rotation=0)));
 | |
|       Modelica.Blocks.Interfaces.RealInput a_start(unit="m/s2") if use_a_start
 | |
|         "Initial angular acceleration of flange"
 | |
|         annotation (Placement(transformation(extent={{-140,-80},{-100,-40}},
 | |
|               rotation=0)));
 | |
|       Interfaces.Flange_b flange "Flange that is initialized" annotation (Placement(
 | |
|             transformation(extent={{90,-10},{110,10}}, rotation=0)));
 | |
| 
 | |
|       Modelica.SIunits.Position s_flange(stateSelect=stateSelect)=flange.s
 | |
|         "Flange position";
 | |
|       Modelica.SIunits.Velocity v_flange(stateSelect=stateSelect)= der(s_flange)
 | |
|         "= der(s_flange)";
 | |
| 
 | |
|     protected
 | |
|       encapsulated model Set_s_start "Set s_start"
 | |
|         import Modelica;
 | |
|         extends Modelica.Blocks.Icons.Block;
 | |
|         Modelica.Blocks.Interfaces.RealInput s_start(unit="m") "Start position"
 | |
|         annotation (HideResult=true, Placement(transformation(extent={{-140,-20},{
 | |
|                 -100,20}}, rotation=0)));
 | |
| 
 | |
|         Modelica.Mechanics.Translational.Interfaces.Flange_b flange
 | |
|                                                                annotation (Placement(
 | |
|             transformation(extent={{90,-10},{110,10}}, rotation=0)));
 | |
|       initial equation
 | |
|         flange.s = s_start;
 | |
|       equation
 | |
|         flange.f = 0;
 | |
| 
 | |
|       end Set_s_start;
 | |
| 
 | |
|       encapsulated model Set_v_start "Set v_start"
 | |
|         import Modelica;
 | |
|         extends Modelica.Blocks.Icons.Block;
 | |
|         Modelica.Blocks.Interfaces.RealInput v_start(unit="m/s") "Start velocity"
 | |
|         annotation (HideResult=true, Placement(transformation(extent={{-140,-20},{
 | |
|                 -100,20}}, rotation=0)));
 | |
| 
 | |
|         Modelica.Mechanics.Translational.Interfaces.Flange_b flange
 | |
|                                                                annotation (Placement(
 | |
|             transformation(extent={{90,-10},{110,10}}, rotation=0)));
 | |
|       initial equation
 | |
|         der(flange.s) = v_start;
 | |
|       equation
 | |
|         flange.f = 0;
 | |
| 
 | |
|       end Set_v_start;
 | |
| 
 | |
|       encapsulated model Set_a_start "Set a_start"
 | |
|         import Modelica;
 | |
|         extends Modelica.Blocks.Icons.Block;
 | |
|         Modelica.Blocks.Interfaces.RealInput a_start(unit="m/s2") "Start acceleration"
 | |
|         annotation (HideResult=true, Placement(transformation(extent={{-140,-20},{
 | |
|                 -100,20}}, rotation=0)));
 | |
| 
 | |
|         Modelica.Mechanics.Translational.Interfaces.Flange_b flange(s(stateSelect=StateSelect.avoid))
 | |
|             annotation (Placement(
 | |
|             transformation(extent={{90,-10},{110,10}}, rotation=0)));
 | |
|         Modelica.SIunits.Velocity v = der(flange.s)        annotation(HideResult=true);
 | |
|       initial equation
 | |
|         der(v) = a_start;
 | |
|       equation
 | |
|         flange.f = 0;
 | |
| 
 | |
|       end Set_a_start;
 | |
| 
 | |
|       encapsulated model Set_flange_f "Set flange_f to zero"
 | |
|         import Modelica;
 | |
|         extends Modelica.Blocks.Icons.Block;
 | |
|         Modelica.Mechanics.Translational.Interfaces.Flange_b flange
 | |
|             annotation (Placement(
 | |
|             transformation(extent={{90,-10},{110,10}}, rotation=0)));
 | |
|       equation
 | |
|         flange.f = 0;
 | |
|       end Set_flange_f;
 | |
|     protected
 | |
|       Set_s_start set_s_start if use_s_start annotation (Placement(
 | |
|             transformation(extent={{-20,50},{0,70}}, rotation=0)));
 | |
|       Set_v_start set_v_start if use_v_start
 | |
|                               annotation (Placement(transformation(extent={{-20,
 | |
|                 -10},{0,10}}, rotation=0)));
 | |
|       Set_a_start set_a_start if use_a_start
 | |
|                               annotation (Placement(transformation(extent={{-20,
 | |
|                 -70},{0,-50}}, rotation=0)));
 | |
|       Set_flange_f set_flange_f annotation (Placement(transformation(extent={
 | |
|                 {20,-100},{40,-80}}, rotation=0)));
 | |
|     equation
 | |
|       connect(set_s_start.flange, flange) annotation (Line(
 | |
|           points={{0,60},{60,60},{60,0},{100,0}},
 | |
|           color={0,0,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(set_v_start.flange, flange) annotation (Line(
 | |
|           points={{0,0},{100,0}},
 | |
|           color={0,0,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(set_a_start.flange, flange) annotation (Line(
 | |
|           points={{0,-60},{60,-60},{60,0},{100,0}},
 | |
|           color={0,0,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(set_flange_f.flange, flange) annotation (Line(
 | |
|           points={{40,-90},{60,-90},{60,0},{100,0}},
 | |
|           color={0,0,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(s_start, set_s_start.s_start) annotation (Line(
 | |
|           points={{-120,60},{-22,60}},
 | |
|           color={0,0,127},
 | |
|           smooth=Smooth.None));
 | |
|       connect(v_start, set_v_start.v_start) annotation (Line(
 | |
|           points={{-120,0},{-22,0}},
 | |
|           color={0,0,127},
 | |
|           smooth=Smooth.None));
 | |
|       connect(a_start, set_a_start.a_start) annotation (Line(
 | |
|           points={{-120,-60},{-22,-60}},
 | |
|           color={0,0,127},
 | |
|           smooth=Smooth.None));
 | |
|       annotation (Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,
 | |
|                 -100},{100,100}}), graphics={
 | |
|             Text(
 | |
|               extent={{-94,74},{68,46}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="s_start"),
 | |
|             Text(
 | |
|               extent={{-94,16},{70,-14}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="v_start"),
 | |
|             Text(
 | |
|               extent={{-94,-46},{66,-74}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="a_start")}),
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| This component is used to optionally initialize the position, speed,
 | |
| and/or acceleration of the flange to which this component
 | |
| is connected. Via parameters use_s_start, use_v_start, use_a_start
 | |
| the corresponding input signals s_start, v_start, a_start are conditionally
 | |
| activated. If an input is activated, the corresponding flange property
 | |
| is initialized with the input value at start time.
 | |
| </p>
 | |
| 
 | |
| <p>
 | |
| For example, if \"use_s_start = true\", then flange.s is initialized
 | |
| with the value of the input signal \"s_start\" at the start time.
 | |
| </p>
 | |
| 
 | |
| <p>
 | |
| Additionally, it is optionally possible to define the \"StateSelect\"
 | |
| attribute of the flange position and the flange speed via parameter
 | |
| \"stateSelection\".
 | |
| </p>
 | |
| 
 | |
| <p>
 | |
| This component is especially useful when the initial values of a flange
 | |
| shall be set according to reference signals of a controller that are
 | |
| provided via a signal bus.
 | |
| </p>
 | |
| 
 | |
| </html>"));
 | |
|     end InitializeFlange;
 | |
| 
 | |
|     model MassWithStopAndFriction
 | |
|       "Sliding mass with hard stop and Stribeck friction"
 | |
|       extends PartialFrictionWithStop;
 | |
|       SI.Velocity v(start=0, stateSelect = StateSelect.always)
 | |
|         "Absolute velocity of flange_a and flange_b";
 | |
|       SI.Acceleration a(start=0)
 | |
|         "Absolute acceleration of flange_a and flange_b";
 | |
|       parameter Modelica.SIunits.Mass m(start=1) "Mass";
 | |
|       parameter Real F_prop(final unit="N.s/m", final min=0, start = 1)
 | |
|         "Velocity dependent friction";
 | |
|       parameter Modelica.SIunits.Force F_Coulomb(start=5)
 | |
|         "Constant friction: Coulomb force";
 | |
|       parameter Modelica.SIunits.Force F_Stribeck(start=10) "Stribeck effect";
 | |
|       parameter Real fexp(final unit="s/m", final min=0, start = 2)
 | |
|         "Exponential decay";
 | |
|     extends
 | |
|         Modelica.Thermal.HeatTransfer.Interfaces.PartialElementaryConditionalHeatPortWithoutT;
 | |
|       Integer stopped;
 | |
|     encapsulated partial model PartialFrictionWithStop
 | |
|         "Base model of Coulomb friction elements with stop"
 | |
| 
 | |
|         import SI = Modelica.SIunits;
 | |
|         import Modelica.Mechanics.Translational.Interfaces.PartialRigid;
 | |
|       parameter SI.Position smax(start= 25)
 | |
|           "Right stop for (right end of) sliding mass";
 | |
|       parameter SI.Position smin(start=-25)
 | |
|           "Left stop for (left end of) sliding mass";
 | |
|       parameter SI.Velocity v_small=1e-3
 | |
|           "Relative velocity near to zero (see model info text)"
 | |
|          annotation(Dialog(tab="Advanced"));
 | |
|     // Equations to define the following variables have to be defined in subclasses
 | |
|       SI.Velocity v_relfric "Relative velocity between frictional surfaces";
 | |
|       SI.Acceleration a_relfric
 | |
|           "Relative acceleration between frictional surfaces";
 | |
|       SI.Force f
 | |
|           "Friction force (positive, if directed in opposite direction of v_rel)";
 | |
|       SI.Force f0 "Friction force for v=0 and forward sliding";
 | |
|       SI.Force f0_max "Maximum friction force for v=0 and locked";
 | |
|       Boolean free "true, if frictional element is not active";
 | |
|     // Equations to define the following variables are given in this class
 | |
|       Real sa(unit="1")
 | |
|           "Path parameter of friction characteristic f = f(a_relfric)";
 | |
|       Boolean startForward(start=false, fixed=true)
 | |
|           "= true, if v_rel=0 and start of forward sliding or v_rel > v_small";
 | |
|       Boolean startBackward(start=false, fixed=true)
 | |
|           "= true, if v_rel=0 and start of backward sliding or v_rel < -v_small";
 | |
|       Boolean locked(start=false) "true, if v_rel=0 and not sliding";
 | |
|       extends PartialRigid(s(start=0, stateSelect = StateSelect.always));
 | |
|       constant Integer Unknown=3 "Value of mode is not known";
 | |
|       constant Integer Free=2 "Element is not active";
 | |
|       constant Integer Forward=1 "v_rel > 0 (forward sliding)";
 | |
|       constant Integer Stuck=0
 | |
|           "v_rel = 0 (forward sliding, locked or backward sliding)";
 | |
|       constant Integer Backward=-1 "v_rel < 0 (backward sliding)";
 | |
|       Integer mode(
 | |
|         final min=Backward,
 | |
|         final max=Unknown,
 | |
|         start=Unknown, fixed=true);
 | |
|       protected
 | |
|       constant SI.Acceleration unitAcceleration = 1 annotation(HideResult=true);
 | |
|       constant SI.Force unitForce = 1 annotation(HideResult=true);
 | |
|     equation
 | |
|     /* Friction characteristic
 | |
|    (locked is introduced to help the Modelica translator determining
 | |
|    the different structural configurations,
 | |
|    if for each configuration special code shall be generated)
 | |
| */
 | |
|       startForward = pre(mode) == Stuck and (sa > f0_max/unitForce and s < (smax - L/2) or
 | |
|             pre(startForward) and sa > f0/unitForce and s < (smax - L/2)) or pre(mode)
 | |
|          == Backward and v_relfric > v_small or initial() and (v_relfric > 0);
 | |
|       startBackward = pre(mode) == Stuck and (sa < -f0_max/unitForce and s > (smin + L/2) or
 | |
|             pre(startBackward) and sa < -f0/unitForce and s > (smin + L/2)) or pre(mode)
 | |
|          == Forward and v_relfric < -v_small or initial() and (v_relfric < 0);
 | |
|       locked = not free and
 | |
|         not (pre(mode) == Forward or startForward or pre(mode) == Backward or startBackward);
 | |
| 
 | |
|       a_relfric/unitAcceleration = if locked then               0 else
 | |
|                                    if free then                 sa else
 | |
|                                    if startForward then         sa - f0_max/unitForce else
 | |
|                                    if startBackward then        sa + f0_max/unitForce else
 | |
|                                    if pre(mode) == Forward then sa - f0_max/unitForce else
 | |
|                                                                 sa + f0_max/unitForce;
 | |
| 
 | |
|     /* Friction torque has to be defined in a subclass. Example for a clutch:
 | |
|    f = if locked then sa else
 | |
|        if free then   0 else
 | |
|        cgeo*fn*(if startForward then          Math.tempInterpol1( v_relfric, mue_pos, 2) else
 | |
|                 if startBackward then        -Math.tempInterpol1(-v_relfric, mue_pos, 2) else
 | |
|                 if pre(mode) == Forward then  Math.tempInterpol1( v_relfric, mue_pos, 2) else
 | |
|                                              -Math.tempInterpol1(-v_relfric, mue_pos, 2));
 | |
| */
 | |
|     // finite state machine to determine configuration
 | |
|       mode = if free then Free else
 | |
|         (if (pre(mode) == Forward  or pre(mode) == Free or startForward)  and v_relfric > 0 and s < (smax - L/2) then
 | |
|            Forward else
 | |
|          if (pre(mode) == Backward or pre(mode) == Free or startBackward) and v_relfric < 0 and s > (smin + L/2) then
 | |
|            Backward else
 | |
|            Stuck);
 | |
|       annotation (Documentation(info="<html>
 | |
| <p>
 | |
| Basic model for Coulomb friction that models the stuck phase in a reliable way.<br>
 | |
| Additionally, a left and right stop are handled.
 | |
| </p>
 | |
| </html>"));
 | |
|     end PartialFrictionWithStop;
 | |
|     equation
 | |
|       // Constant auxiliary variables
 | |
|       f0 = (F_Coulomb + F_Stribeck);
 | |
|       f0_max = f0*1.001;
 | |
|       free = f0 <= 0 and F_prop <= 0 and s > smin + L/2 and s < smax - L/2;
 | |
|       // Velocity and acceleration of flanges
 | |
|       v = der(s);
 | |
|       a = der(v);
 | |
|       v_relfric = v;
 | |
|       a_relfric = a;
 | |
|     // Equilibrium of forces
 | |
|       0 = flange_a.f + flange_b.f - f - m*der(v);
 | |
|     // Friction force
 | |
|       f = if locked then sa*unitForce else
 | |
|           if free then   0 else
 | |
|                         (if startForward then         F_prop*v + F_Coulomb + F_Stribeck else
 | |
|                          if startBackward then        F_prop*v - F_Coulomb - F_Stribeck else
 | |
|                          if pre(mode) == Forward then F_prop*v + F_Coulomb + F_Stribeck*exp(-fexp*abs(v)) else
 | |
|                                                       F_prop*v - F_Coulomb - F_Stribeck*exp(-fexp*abs(v)));
 | |
|       lossPower = f*v_relfric;
 | |
|     equation
 | |
|       when (initial()) then
 | |
|         assert(s > smin + L/2 or s >= smin + L/2 and v >= 0,
 | |
|           "Error in initialization of hard stop. (s - L/2) must be >= smin\n"+
 | |
|           "(s=" + String(s) + ", L=" + String(L) + ", smin=" + String(smin) + ")");
 | |
|         assert(s < smax - L/2 or s <= smax - L/2 and v <= 0,
 | |
|           "Error in initialization of hard stop. (s + L/2) must be <= smax\n"+
 | |
|           "(s=" + String(s) + ", L=" + String(L) + ", smax=" + String(smax) + ")");
 | |
|       end when;
 | |
| 
 | |
|       // Define events for hard stops and reinitialize the state variables velocity v and position s
 | |
|       stopped = if s <= smin + L/2 then -1 else if s >= smax - L/2 then +1 else 0;
 | |
|       when stopped <> 0 then
 | |
|         reinit(s, if stopped < 0 then smin + L/2 else smax - L/2);
 | |
|         reinit(v, 0);
 | |
|       end when;
 | |
|     /*
 | |
| Version 1:
 | |
| 
 | |
|   when not (s < smax - L/2) then
 | |
|     reinit(s, smax - L/2);
 | |
|     if (not initial() or v>0) then
 | |
|       reinit(v, 0);
 | |
|     end if;
 | |
|   end when;
 | |
| 
 | |
|   when not (s > smin + L/2) then
 | |
|     reinit(s, smin + L/2);
 | |
|     if (not initial() or v<0) then
 | |
|       reinit(v, 0);
 | |
|     end if;
 | |
|   end when;
 | |
| 
 | |
| Version 2:
 | |
|         stopped := if s <= smin + L/2 then -1 else if s >= smax - L/2 then +1 else 0;
 | |
|       when (initial()) then
 | |
|         assert(s > smin + L/2 or s >= smin + L/2 and v >= 0,
 | |
|           "Error in initialization of hard stop. (s - L/2) must be >= smin\n"+
 | |
|           "(s=" + String(s) + ", L=" + String(L) + ", smin=" + String(smin) + ")");
 | |
|         assert(s < smax - L/2 or s <= smax - L/2 and v <= 0,
 | |
|           "Error in initialization of hard stop. (s + L/2) must be <= smax\n"+
 | |
|           "(s=" + String(s) + ", L=" + String(L) + ", smax=" + String(smax) + ")");
 | |
|       end when;
 | |
|       when stopped <> 0 then
 | |
|         reinit(s, if stopped < 0 then smin + L/2 else smax - L/2);
 | |
|         if (not initial() or stopped*v>0) then
 | |
|            reinit(v, 0);
 | |
|         end if;
 | |
|       end when;
 | |
| */
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>This element describes the <i>Stribeck friction characteristics</i> of a sliding mass,
 | |
| i. e. the frictional force acting between the sliding mass and the support. Included is a
 | |
| <i>hard stop</i> for the position. </p>
 | |
| <p>
 | |
| The surface is fixed and there is friction between sliding mass and surface.
 | |
| The frictional force f is given for positive velocity v by:
 | |
| </p>
 | |
| <blockquote><pre>
 | |
| f = F_Coulomb + F_prop * v + F_Stribeck * exp (-fexp * v)
 | |
| </pre></blockquote>
 | |
| 
 | |
| <p>
 | |
| <IMG src=\"modelica://Modelica/Resources/Images/Mechanics/Translational/Stribeck.png\">
 | |
| </p>
 | |
| 
 | |
| <p>
 | |
| The distance between the left and the right connector is given by parameter L.
 | |
| The position of the center of gravity, coordinate s, is in the middle between
 | |
| the two flanges.</p>
 | |
| <p>
 | |
| There are hard stops at smax and smin, i. e. if
 | |
| <i><code>flange_a.s >= smin</code></i> and <i><code>flange_b.s <= xmax </code></i> the sliding mass can move freely.</p>
 | |
| <p>When the absolute velocity becomes zero, the sliding mass becomes stuck, i.e., the absolute position remains constant. In this phase the
 | |
| friction force is calculated from a force balance due to the requirement that the
 | |
| absolute acceleration shall be zero. The elements begin to slide when the friction
 | |
| force exceeds a threshold value, called the maximum static friction force, computed via:</p>
 | |
| <blockquote><pre>
 | |
|    maximum_static_friction =  F_Coulomb + F_Stribeck
 | |
| </pre></blockquote>
 | |
| <p>
 | |
| <font color=\"#ff0000\"> <b>This requires the states Stop.s and Stop.v</b> </font>. If these states are eliminated during the index reduction
 | |
| the model will not work. To avoid this any inertias should be connected via springs
 | |
| to the Stop element, other sliding masses, dampers or hydraulic chambers must be avoided.</p>
 | |
| <p>For more details of the used friction model see the following reference: </p>
 | |
| 
 | |
| <dl>
 | |
| <dt>Beater P. (1999):</dt>
 | |
| <dd><a href=\"http://www.springer.de/cgi-bin/search_book.pl?isbn=3-540-65444-5\">
 | |
| Entwurf hydraulischer Maschinen</a>. Springer Verlag Berlin Heidelberg New York.</dd>
 | |
| </dl>
 | |
| 
 | |
| <P>The friction model is implemented in a \"clean\" way by state events and leads to
 | |
| continuous/discrete systems of equations which have to be solved by appropriate
 | |
| numerical methods. The method is described in: </P>
 | |
| 
 | |
| <dl>
 | |
| <dt>Otter M., Elmqvist H., and Mattsson S.E. (1999):</dt>
 | |
| <dd><i>Hybrid Modeling in Modelica based on the Synchronous Data Flow Principle</i>.
 | |
|     CACSD'99, Aug. 22.-26, Hawaii. </dd>
 | |
| </dl>
 | |
| 
 | |
| <P>More precise friction models take into account the elasticity of the material when
 | |
| the two elements are \"stuck\", as well as other effects, like hysteresis. This has
 | |
| the advantage that the friction element can be completely described by a differential
 | |
| equation without events. The drawback is that the system becomes stiff (about 10-20 times
 | |
| slower simulation) and that more material constants have to be supplied which requires more
 | |
| sophisticated identification. For more details, see the following references, especially
 | |
| (Armstrong and Canudas de Witt 1996): </P>
 | |
| <dl>
 | |
| <dt>
 | |
| Armstrong B. (1991):</dt>
 | |
| <DD><i>Control of Machines with Friction</i>. Kluwer Academic Press, Boston MA.<BR>
 | |
| </DD>
 | |
| <DT>Armstrong B., and Canudas de Wit C. (1996): </DT>
 | |
| <DD><i>Friction Modeling and Compensation.</i> The Control Handbook, edited by W.S.Levine, CRC Press, pp. 1369-1382.<BR>
 | |
| </DD>
 | |
| <DT>Canudas de Wit C., Olsson H., Astroem K.J., and Lischinsky P. (1995): </DT>
 | |
| <DD>A<i> new model for control of systems with friction.</i> IEEE Transactions on Automatic Control, Vol. 40, No. 3, pp. 419-425.<BR>
 | |
| </DD>
 | |
| </DL>
 | |
| 
 | |
| <h4>Optional heatPort</h4>
 | |
| <p>
 | |
| The dissipated energy is transported in form of heat to the optional heatPort connector
 | |
| that can be enabled via parameter \"useHeatPort\". Independently whether the heatPort is
 | |
| or is not enabled, the dissipated power is defined with variable \"lossPower\".
 | |
| If contact occurs at the hard stops, the lossPower is not correctly modelled
 | |
| at this time instant, because the hard stop would introduce a Dirac impulse
 | |
| in the lossPower due to the discontinuously changing kinetic energy of the mass
 | |
| (lossPower is the derivative of the kinetic energy at the time instant of the impact).
 | |
| </p>
 | |
| 
 | |
| </html>",   revisions="<html>
 | |
| <h4>Release Notes:</h4>
 | |
| <ul>
 | |
| <li><i>First Version from December 7, 1999 by P. Beater (based on Rotational.BearingFriction)</i> </li>
 | |
| <li><i>July 14, 2001 by P. Beater, assert on initialization added, diagram modified </i> </li>
 | |
| <li><i>October 11, 2001, by Hans Olsson, Dassault Systèmes AB, modified assert to handle start at stops,
 | |
| modified event logic such if you have friction parameters equal to zero you do not get events
 | |
| between the stops.</i> </li>
 | |
| <li><i>June 10, 2002 by P. Beater, StateSelect.always for variables s and v (instead of fixed=true). </i> </li>
 | |
| </ul>
 | |
| </html>"),
 | |
|         Icon(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={
 | |
|             Polygon(
 | |
|               points={{80,-100},{50,-90},{50,-110},{80,-100}},
 | |
|               lineColor={128,128,128},
 | |
|               fillColor={128,128,128},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Line(points={{-30,-100},{50,-100}}, color={0,0,0}),
 | |
|             Rectangle(
 | |
|               extent={{-30,30},{35,-35}},
 | |
|               lineColor={0,0,0},
 | |
|               fillPattern=FillPattern.Sphere,
 | |
|               fillColor={255,255,255}),
 | |
|             Line(points={{-90,0},{-30,0}}, color={0,127,0}),
 | |
|             Rectangle(
 | |
|               extent={{-70,-45},{74,-60}},
 | |
|               lineColor={0,0,0},
 | |
|               fillColor={192,192,192},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Rectangle(
 | |
|               extent={{-63,-15},{-55,-45}},
 | |
|               lineColor={0,0,0},
 | |
|               fillColor={0,0,0},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Rectangle(
 | |
|               extent={{60,-16},{69,-45}},
 | |
|               lineColor={0,0,0},
 | |
|               fillColor={0,0,0},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Line(points={{35,0},{90,0}}, color={0,127,0}),
 | |
|             Text(
 | |
|               extent={{-150,80},{150,40}},
 | |
|               textString="%name",
 | |
|               lineColor={0,0,255}),
 | |
|             Line(points={{-50,-90},{-30,-70}}, color={0,0,0}),
 | |
|             Line(points={{-30,-70},{30,-70}}, color={0,0,0}),
 | |
|             Line(points={{-30,-90},{-10,-70}}, color={0,0,0}),
 | |
|             Line(points={{-10,-90},{10,-70}}, color={0,0,0}),
 | |
|             Line(points={{10,-90},{30,-70}}, color={0,0,0}),
 | |
|             Text(
 | |
|               extent={{-150,-110},{150,-140}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="m=%m"),
 | |
|             Line(visible=useHeatPort,
 | |
|               points={{-100,-100},{-100,-40},{3,-40}},
 | |
|               color={191,0,0},
 | |
|               pattern=LinePattern.Dot,
 | |
|               smooth=Smooth.None)}),
 | |
|         Diagram(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={
 | |
|             Polygon(
 | |
|               points={{50,-75},{20,-65},{20,-85},{50,-75}},
 | |
|               lineColor={128,128,128},
 | |
|               fillColor={128,128,128},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Line(points={{-60,-75},{20,-75}}, color={0,0,0}),
 | |
|             Rectangle(
 | |
|               extent={{-30,26},{35,-9}},
 | |
|               lineColor={0,0,0},
 | |
|               fillPattern=FillPattern.Sphere,
 | |
|               fillColor={255,255,255}),
 | |
|             Line(points={{-90,0},{-30,0}}, color={0,127,0}),
 | |
|             Line(points={{35,0},{90,0}}, color={0,127,0}),
 | |
|             Rectangle(
 | |
|               extent={{-68,-14},{76,-29}},
 | |
|               lineColor={0,0,0},
 | |
|               fillColor={192,192,192},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Rectangle(
 | |
|               extent={{-119,43},{-111,17}},
 | |
|               lineColor={0,0,0},
 | |
|               fillColor={0,0,0},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Line(
 | |
|               points={{-111,43},{-111,50}},
 | |
|               color={0,0,0},
 | |
|               pattern=LinePattern.Solid,
 | |
|               thickness=0.25,
 | |
|               arrow={Arrow.None,Arrow.None}),
 | |
|             Line(
 | |
|               points={{-151,49},{-113,49}},
 | |
|               color={0,0,0},
 | |
|               pattern=LinePattern.Solid,
 | |
|               thickness=0.25,
 | |
|               arrow={Arrow.None,Arrow.None}),
 | |
|             Text(
 | |
|               extent={{-149,51},{-126,60}},
 | |
|               textString="s min",
 | |
|               lineColor={0,0,255}),
 | |
|             Polygon(
 | |
|               points={{-121,52},{-111,49},{-121,46},{-121,52}},
 | |
|               lineColor={0,0,0},
 | |
|               fillColor={0,0,0},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Rectangle(
 | |
|               extent={{124,42},{132,17}},
 | |
|               lineColor={0,0,0},
 | |
|               fillColor={0,0,0},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Line(
 | |
|               points={{124,39},{124,87}},
 | |
|               color={0,0,0},
 | |
|               pattern=LinePattern.Solid,
 | |
|               thickness=0.25,
 | |
|               arrow={Arrow.None,Arrow.None}),
 | |
|             Line(
 | |
|               points={{-19,78},{121,78}},
 | |
|               color={0,0,0},
 | |
|               pattern=LinePattern.Solid,
 | |
|               thickness=0.25,
 | |
|               arrow={Arrow.None,Arrow.None}),
 | |
|             Text(
 | |
|               extent={{-17,83},{6,92}},
 | |
|               textString="s max",
 | |
|               lineColor={0,0,255}),
 | |
|             Polygon(
 | |
|               points={{114,81},{124,78},{114,75},{114,81}},
 | |
|               lineColor={0,0,0},
 | |
|               fillColor={0,0,0},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Line(
 | |
|               points={{5,26},{5,63}},
 | |
|               color={0,0,0},
 | |
|               pattern=LinePattern.Solid,
 | |
|               thickness=0.25,
 | |
|               arrow={Arrow.None,Arrow.None}),
 | |
|             Line(
 | |
|               points={{-77,58},{-1,58}},
 | |
|               color={0,0,0},
 | |
|               pattern=LinePattern.Solid,
 | |
|               thickness=0.25,
 | |
|               arrow={Arrow.None,Arrow.None}),
 | |
|             Text(
 | |
|               extent={{-75,60},{-38,71}},
 | |
|               textString="Position s",
 | |
|               lineColor={0,0,255}),
 | |
|             Polygon(
 | |
|               points={{-5,61},{5,58},{-5,55},{-5,61}},
 | |
|               lineColor={0,0,0},
 | |
|               fillColor={0,0,0},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Line(points={{-100,-10},{-100,-60}}, color={0,0,0}),
 | |
|             Line(points={{100,-10},{100,-60}}, color={0,0,0}),
 | |
|             Polygon(
 | |
|               points={{90,-47},{100,-50},{90,-53},{90,-47}},
 | |
|               lineColor={0,0,0},
 | |
|               fillColor={0,0,0},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Polygon(
 | |
|               points={{-90,-47},{-90,-53},{-100,-50},{-90,-47}},
 | |
|               lineColor={0,0,0},
 | |
|               fillColor={0,0,0},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Line(points={{-90,-50},{92,-50}}, color={0,0,0}),
 | |
|             Text(
 | |
|               extent={{-11,-46},{26,-36}},
 | |
|               textString="Length L",
 | |
|               lineColor={0,0,255})}));
 | |
|     end MassWithStopAndFriction;
 | |
| 
 | |
|     model RelativeStates "Definition of relative state variables"
 | |
|       extends Translational.Interfaces.PartialTwoFlanges;
 | |
|       parameter StateSelect stateSelect=StateSelect.prefer
 | |
|         "Priority to use the relative angle and relative speed as states";
 | |
|       SI.Position s_rel(start=0, stateSelect=StateSelect.prefer)
 | |
|         "Relative position used as state variable";
 | |
|       SI.Velocity v_rel(start=0, stateSelect=StateSelect.prefer)
 | |
|         "Relative velocity used as state variable";
 | |
|       SI.Acceleration a_rel(start=0) "Relative angular acceleration";
 | |
| 
 | |
|     equation
 | |
|       s_rel = flange_b.s - flange_a.s;
 | |
|       v_rel = der(s_rel);
 | |
|       a_rel = der(v_rel);
 | |
|       flange_a.f = 0;
 | |
|       flange_b.f = 0;
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| Usually, the absolute position and the absolute velocity of
 | |
| Modelica.Mechanics.Translational.Inertia models are used as state variables.
 | |
| In some circumstances, relative quantities are better suited, e.g.,
 | |
| because it may be easier to supply initial values.
 | |
| In such cases, model <b>RelativeStates</b> allows the definition of state variables
 | |
| in the following way:
 | |
| </p>
 | |
| <ul>
 | |
| <li> Connect an instance of this model between two flange connectors.</li>
 | |
| <li> The <b>relative position</b> and the <b>relative velocity</b>
 | |
|      between the two connectors are used as <b>state variables</b>.
 | |
| </ul>
 | |
| <p>
 | |
| An example is given in the next figure
 | |
| </p>
 | |
| 
 | |
| <p>
 | |
| <IMG src=\"modelica://Modelica/Resources/Images/Mechanics/Translational/relativeStates2.png\" ALT=\"relativeStates2\">
 | |
| </p>
 | |
| 
 | |
| <p>
 | |
| Here, the relative position and the relative velocity between
 | |
| the two masses are used as state variables. Additionally, the
 | |
| simulator selects either the absolute position and absolute
 | |
| velocity of model mass1 or of model mass2 as state variables.
 | |
| </p>
 | |
| 
 | |
| </html>"),     Icon(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={
 | |
|             Ellipse(
 | |
|               extent={{-40,40},{40,-40}},
 | |
|               lineColor={0,255,255},
 | |
|               fillColor={0,255,255},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Text(
 | |
|               extent={{-40,40},{40,-40}},
 | |
|               textString="S",
 | |
|               lineColor={0,0,255}),
 | |
|             Line(
 | |
|               points={{-92,0},{-42,0}},
 | |
|               color={0,0,0},
 | |
|               pattern=LinePattern.Dot),
 | |
|             Line(
 | |
|               points={{40,0},{90,0}},
 | |
|               color={0,0,0},
 | |
|               pattern=LinePattern.Dot),
 | |
|             Text(
 | |
|               extent={{-150,90},{150,50}},
 | |
|               textString="%name",
 | |
|               lineColor={0,0,255})}),
 | |
|         Diagram(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={
 | |
|             Ellipse(
 | |
|               extent={{-40,40},{40,-40}},
 | |
|               lineColor={0,255,255},
 | |
|               fillColor={0,255,255},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Text(
 | |
|               extent={{-40,40},{40,-40}},
 | |
|               textString="S",
 | |
|               lineColor={0,0,255}),
 | |
|             Line(
 | |
|               points={{40,0},{90,0}},
 | |
|               color={0,0,0},
 | |
|               pattern=LinePattern.Dash),
 | |
|             Line(points={{-100,-10},{-100,-80}}, color={160,160,164}),
 | |
|             Line(points={{100,-10},{100,-80}}, color={160,160,164}),
 | |
|             Polygon(
 | |
|               points={{80,-65},{80,-55},{100,-60},{80,-65}},
 | |
|               lineColor={160,160,164},
 | |
|               fillColor={160,160,164},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Line(points={{-100,-60},{80,-60}}, color={160,160,164}),
 | |
|             Text(
 | |
|               extent={{-30,-70},{30,-90}},
 | |
|               textString="w_rel",
 | |
|               lineColor={0,0,255}),
 | |
|             Line(points={{-76,80},{-5,80}}, color={128,128,128}),
 | |
|             Polygon(
 | |
|               points={{14,80},{-6,85},{-6,75},{14,80}},
 | |
|               lineColor={128,128,128},
 | |
|               fillColor={128,128,128},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Text(
 | |
|               extent={{18,87},{86,74}},
 | |
|               lineColor={128,128,128},
 | |
|               textString="moving direction"),
 | |
|             Line(
 | |
|               points={{-90,0},{-40,0}},
 | |
|               color={0,0,0},
 | |
|               pattern=LinePattern.Dash)}));
 | |
|     end RelativeStates;
 | |
|     annotation (Icon(coordinateSystem(preserveAspectRatio = true, extent = {{-100,-100},{100,100}}), graphics = {
 | |
|         Rectangle(
 | |
|           origin = {11.5,31.183},
 | |
|           lineColor = {64,64,64},
 | |
|           fillColor = {255,255,255},
 | |
|           fillPattern = FillPattern.Sphere,
 | |
|           extent = {{-67,-66},{44,-6}})}),                     Documentation(info="<html>
 | |
| <p>
 | |
| This package contains basic components 1D mechanical translational drive trains.
 | |
| </p>
 | |
| </html>"));
 | |
|   end Components;
 | |
| 
 | |
|   package Sensors "Sensors for 1-dim. translational mechanical quantities"
 | |
| 
 | |
|     extends Modelica.Icons.SensorsPackage;
 | |
| 
 | |
|     model PositionSensor "Ideal sensor to measure the absolute position"
 | |
|       extends Translational.Interfaces.PartialAbsoluteSensor;
 | |
|       Modelica.Blocks.Interfaces.RealOutput s(unit="m")
 | |
|         "Absolute position of flange as output signal"
 | |
|                                     annotation (Placement(transformation(extent={{100,-11},
 | |
|                 {120,9}},            rotation=0), iconTransformation(extent={{100,
 | |
|                 -10},{120,10}})));
 | |
| 
 | |
|     equation
 | |
|       s = flange.s;
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| Measures the <i>absolute position s</i> of a flange in an ideal way and provides the result as
 | |
| output signals (to be further processed with blocks of the
 | |
| Modelica.Blocks library).
 | |
| </p>
 | |
| 
 | |
| </html>"),     Icon(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={Line(points={{-70,0},{-90,0}}, color={0,0,0}),
 | |
|               Text(
 | |
|               extent={{80,-28},{114,-62}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="s")}));
 | |
|     end PositionSensor;
 | |
| 
 | |
|     model SpeedSensor "Ideal sensor to measure the absolute velocity"
 | |
|       extends Translational.Interfaces.PartialAbsoluteSensor;
 | |
|       Modelica.Blocks.Interfaces.RealOutput v(unit="m/s")
 | |
|         "Absolute velocity of flange as output signal"
 | |
|            annotation (Placement(transformation(extent={{100,-10},{120,10}},
 | |
|               rotation=0)));
 | |
| 
 | |
|     equation
 | |
|       v = der(flange.s);
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| Measures the <i>absolute velocity v</i> of a flange in an ideal way and provides the result as
 | |
| output signals (to be further processed with blocks of the
 | |
| Modelica.Blocks library).
 | |
| </p>
 | |
| 
 | |
| </html>"),     Icon(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={Line(points={{-70,0},{-90,0}}, color={0,0,0}),
 | |
|               Text(
 | |
|               extent={{80,-28},{111,-61}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="v")}));
 | |
|     end SpeedSensor;
 | |
| 
 | |
|     model AccSensor "Ideal sensor to measure the absolute acceleration"
 | |
|       extends Translational.Interfaces.PartialAbsoluteSensor;
 | |
|       SI.Velocity v "Absolute velocity of flange";
 | |
|       Modelica.Blocks.Interfaces.RealOutput a(unit="m/s2")
 | |
|         "Absolute acceleration of flange as output signal"
 | |
|            annotation (Placement(transformation(extent={{100,-10},{120,10}},
 | |
|               rotation=0)));
 | |
| 
 | |
|     equation
 | |
|       v = der(flange.s);
 | |
|       a = der(v);
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| Measures the <i>absolute acceleration a</i>
 | |
| of a flange in an ideal way and provides the result as
 | |
| output signals (to be further processed with blocks of the
 | |
| Modelica.Blocks library).
 | |
| </p>
 | |
| 
 | |
| </html>"),     Icon(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={Line(points={{-70,0},{-90,0}}, color={0,0,0}),
 | |
|               Text(
 | |
|               extent={{80,-28},{115,-60}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="a")}));
 | |
|     end AccSensor;
 | |
| 
 | |
|     model RelPositionSensor "Ideal sensor to measure the relative position"
 | |
|       extends Translational.Interfaces.PartialRelativeSensor;
 | |
|       Modelica.Blocks.Interfaces.RealOutput s_rel(unit="m")
 | |
|         "Distance between two flanges (= flange_b.s - flange_a.s) as output signal"
 | |
|                                     annotation (Placement(transformation(extent={{-10,-10},
 | |
|                 {10,10}},            rotation=270,
 | |
|             origin={0,-110})));
 | |
| 
 | |
|     equation
 | |
|       s_rel = flange_b.s - flange_a.s;
 | |
|       0 = flange_a.f;
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| Measures the <i>relative position s</i> of a flange in an ideal way and provides the result as
 | |
| output signals (to be further processed with blocks of the
 | |
| Modelica.Blocks library).
 | |
| </p>
 | |
| 
 | |
| </html>"),     Icon(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={
 | |
|             Line(points={{-70,0},{-90,0}}, color={0,0,0}),
 | |
|             Line(points={{70.4,0},{100,0}}, color={0,0,127}),
 | |
|             Text(
 | |
|               extent={{8,-68},{42,-102}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="s"),
 | |
|             Line(points={{0,-99},{0,-60}}, color={0,0,127})}));
 | |
|     end RelPositionSensor;
 | |
| 
 | |
|     model RelSpeedSensor "Ideal sensor to measure the relative speed"
 | |
|       extends Translational.Interfaces.PartialRelativeSensor;
 | |
|       SI.Position s_rel
 | |
|         "Distance between the two flanges (flange_b.s - flange_a.s)";
 | |
|       Modelica.Blocks.Interfaces.RealOutput v_rel(unit="m/s")
 | |
|         "Relative velocity between two flanges (= der(flange_b.s) - der(flange_a.s)) as output signal"
 | |
|                                     annotation (Placement(transformation(extent={{-10,-10},
 | |
|                 {10,10}},            rotation=270,
 | |
|             origin={0,-110})));
 | |
| 
 | |
|     equation
 | |
|       s_rel = flange_b.s - flange_a.s;
 | |
|       v_rel = der(s_rel);
 | |
|       0 = flange_a.f;
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| Measures the <i>relative speed v</i> of a flange in an ideal way and provides the result as
 | |
| output signals (to be further processed with blocks of the
 | |
| Modelica.Blocks library).
 | |
| </p>
 | |
| 
 | |
| </html>",     revisions=
 | |
|              "<html>
 | |
| <p><b>Release Notes:</b></p>
 | |
| <ul>
 | |
| <li><i>First Version from August 26, 1999 by P. Beater</i> </li>
 | |
| </ul>
 | |
| </html>"),
 | |
|         Icon(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={
 | |
|             Line(points={{-70,0},{-90,0}}, color={0,0,0}),
 | |
|             Line(points={{70.4,0},{100,0}}, color={0,0,127}),
 | |
|             Text(
 | |
|               extent={{8,-68},{42,-102}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="v"),
 | |
|             Line(points={{0,-100},{0,-61}}, color={0,0,127})}));
 | |
|     end RelSpeedSensor;
 | |
| 
 | |
|     model RelAccSensor "Ideal sensor to measure the relative acceleration"
 | |
|       extends Translational.Interfaces.PartialRelativeSensor;
 | |
|       SI.Position s_rel
 | |
|         "Distance between the two flanges (flange_b.s - flange_a.s)";
 | |
|       SI.Velocity v_rel
 | |
|         "Relative velocity between the two flanges (der(flange_b.s) - der(flange_a.s))";
 | |
|       Modelica.Blocks.Interfaces.RealOutput a_rel(unit="m/s2")
 | |
|         "Relative acceleration between two flanges (= der(v_rel)) as output signal"
 | |
|                                     annotation (Placement(transformation(extent={{-10,-10},
 | |
|                 {10,10}},            rotation=270,
 | |
|             origin={0,-110})));
 | |
| 
 | |
|     equation
 | |
|       s_rel = flange_b.s - flange_a.s;
 | |
|       v_rel = der(s_rel);
 | |
|       a_rel = der(v_rel);
 | |
|       0 = flange_a.f;
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| Measures the <i>relative acceleration a</i> of a flange in an ideal way and provides the result as
 | |
| output signals (to be further processed with blocks of the
 | |
| Modelica.Blocks library).
 | |
| </p>
 | |
| 
 | |
| </html>"),     Icon(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={
 | |
|             Line(points={{-70,0},{-90,0}}, color={0,0,0}),
 | |
|             Line(points={{70.4,0},{100,0}}, color={0,0,127}),
 | |
|             Text(
 | |
|               extent={{7,-68},{41,-102}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="a"),
 | |
|             Line(points={{0,-99},{0,-60}}, color={0,0,127})}));
 | |
|     end RelAccSensor;
 | |
| 
 | |
|     model ForceSensor "Ideal sensor to measure the force between two flanges"
 | |
|       extends Translational.Interfaces.PartialRelativeSensor;
 | |
|       Modelica.Blocks.Interfaces.RealOutput f(unit="N")
 | |
|         "Force in flange_a and flange_b (f = flange_a.f = -flange_b.f) as output signal"
 | |
|          annotation (Placement(transformation(
 | |
|             origin={-80,-110},
 | |
|             extent={{10,-10},{-10,10}},
 | |
|             rotation=90)));
 | |
|     equation
 | |
|       flange_a.s = flange_b.s;
 | |
|       flange_a.f = f;
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| Measures the <i>cut-force between two flanges</i> in an ideal way
 | |
| and provides the result as output signal (to be further processed
 | |
| with blocks of the Modelica.Blocks library).
 | |
| </p>
 | |
| 
 | |
| </html>"),     Icon(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={
 | |
|             Text(
 | |
|               extent={{-40,-70},{40,-120}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="f"),
 | |
|             Line(points={{-70,0},{-90,0}}, color={0,0,0}),
 | |
|             Line(points={{70,0},{90,0}}, color={0,0,0}),
 | |
|             Line(points={{-80,-100},{-80,0}}, color={0,0,127})}));
 | |
|     end ForceSensor;
 | |
| 
 | |
|     model PowerSensor
 | |
|       "Ideal sensor to measure the power between two flanges (= flange_a.f*der(flange_a.s))"
 | |
|       extends Translational.Interfaces.PartialRelativeSensor;
 | |
|       Modelica.Blocks.Interfaces.RealOutput power(unit="W")
 | |
|         "Power in flange flange_a as output signal"
 | |
|          annotation (Placement(transformation(
 | |
|             origin={-80,-110},
 | |
|             extent={{10,-10},{-10,10}},
 | |
|             rotation=90)));
 | |
|     equation
 | |
|       flange_a.s = flange_b.s;
 | |
|       power = flange_a.f*der(flange_a.s);
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| Measures the <b>power between two flanges</b> in an ideal way
 | |
| and provides the result as output signal <b>power</b>
 | |
| (to be further processed with blocks of the Modelica.Blocks library).
 | |
| </p>
 | |
| </html>"),     Icon(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={
 | |
|             Text(
 | |
|               extent={{-75,-79},{67,-119}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="power"),
 | |
|             Line(points={{-70,0},{-90,0}}, color={0,0,0}),
 | |
|             Line(points={{70,0},{90,0}}, color={0,0,0}),
 | |
|             Line(points={{-80,-100},{-80,0}}, color={0,0,127})}));
 | |
|     end PowerSensor;
 | |
| 
 | |
|     model MultiSensor
 | |
|       "Ideal sensor to measure the absolute velocity, force and power between two flanges"
 | |
|       extends Translational.Interfaces.PartialRelativeSensor;
 | |
|       Modelica.Blocks.Interfaces.RealOutput power(unit="W")
 | |
|         "Power in flange flange_a as output signal"
 | |
|          annotation (Placement(transformation(
 | |
|             origin={-60,-110},
 | |
|             extent={{10,-10},{-10,10}},
 | |
|             rotation=90)));
 | |
|       Modelica.Blocks.Interfaces.RealOutput f(unit="N")
 | |
|         "Force in flange_a and flange_b (f = flange_a.f = -flange_b.f) as output signal"
 | |
|          annotation (Placement(transformation(
 | |
|             extent={{10,-10},{-10,10}},
 | |
|             rotation=90,
 | |
|             origin={0,-110})));
 | |
|      Modelica.Blocks.Interfaces.RealOutput v(unit="m/s")
 | |
|         "Absolute velocity of flange as output signal as output signal"
 | |
|            annotation (Placement(transformation(
 | |
|             extent={{-10,-10},{10,10}},
 | |
|             rotation=-90,
 | |
|             origin={60,-110})));
 | |
|     equation
 | |
|       flange_a.s = flange_b.s;
 | |
|       f = flange_a.f;
 | |
|       v = der(flange_a.s);
 | |
|       power = f*v;
 | |
| 
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| Measures the <b>absolute velocity</b> of a flange_a, the <b>cut-force</b> and <b>power</b> between two flanges in an
 | |
| ideal way and provides the results as output signals <b>v</b>, <b>f</b> and <b>power</b>, respectively. </p>
 | |
| </html>"),     Icon(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={
 | |
|             Text(
 | |
|               extent={{-146,-70},{-56,-100}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="power"),
 | |
|             Line(points={{-70,0},{-90,0}}, color={0,0,0}),
 | |
|             Line(points={{70,0},{90,0}}, color={0,0,0}),
 | |
|             Line(points={{-60,-100},{-60,-60}},
 | |
|                                               color={0,0,127}),
 | |
|             Text(
 | |
|               extent={{-28,-71},{52,-101}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="f"),
 | |
|             Line(points={{0,-100},{0,-60}},   color={0,0,127}),
 | |
|             Line(points={{60,-100},{60,-60}}, color={0,0,127}),
 | |
|             Text(
 | |
|               extent={{60,-70},{114,-101}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="v")}));
 | |
|     end MultiSensor;
 | |
|     annotation (
 | |
|       Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,
 | |
|               100}}), graphics={
 | |
|           Line(points={{-56,-61},{-56,-81}}, color={0,0,0}),
 | |
|           Line(points={{-36,-61},{-36,-81}}, color={0,0,0}),
 | |
|           Line(points={{-16,-61},{-16,-81}}, color={0,0,0}),
 | |
|           Line(points={{4,-61},{4,-81}}, color={0,0,0}),
 | |
|           Line(points={{24,-61},{24,-81}}, color={0,0,0}),
 | |
|           Line(points={{44,-61},{44,-81}}, color={0,0,0})}),
 | |
|       Documentation(info="<html>
 | |
| <p>
 | |
| This package contains ideal sensor components that provide
 | |
| the connector variables as signals for further processing with the
 | |
| Modelica.Blocks library.
 | |
| </p>
 | |
| </html>"));
 | |
|   end Sensors;
 | |
| 
 | |
|   package Sources "Sources to drive 1D translational mechanical components"
 | |
|     extends Modelica.Icons.SourcesPackage;
 | |
| 
 | |
|     model Position
 | |
|       "Forced movement of a flange according to a reference position"
 | |
|       extends
 | |
|         Modelica.Mechanics.Translational.Interfaces.PartialElementaryOneFlangeAndSupport2
 | |
|         ( s(stateSelect=if exact then StateSelect.default else StateSelect.prefer));
 | |
|       parameter Boolean exact=false
 | |
|         "true/false exact treatment/filtering the input signal";
 | |
|       parameter SI.Frequency f_crit=50
 | |
|         "if exact=false, critical frequency of filter to filter input signal" annotation(Dialog(enable=not exact));
 | |
|       SI.Velocity v(start=0, stateSelect=if exact then StateSelect.default else StateSelect.prefer)
 | |
|         "If exact=false, absolute velocity of flange_b else dummy";
 | |
|       SI.Acceleration a(start=0)
 | |
|         "If exact=false, absolute acceleration of flange_b else dummy";
 | |
|       Modelica.Blocks.Interfaces.RealInput s_ref(unit="m")
 | |
|         "Reference position of flange as input signal" annotation (Placement(
 | |
|             transformation(extent={{-140,-20},{-100,20}}, rotation=0)));
 | |
|     protected
 | |
|       parameter Modelica.SIunits.AngularFrequency w_crit=2*Modelica.Constants.pi*f_crit
 | |
|         "Critical frequency";
 | |
|       constant Real af=1.3617 "s coefficient of Bessel filter";
 | |
|       constant Real bf=0.6180 "s*s coefficient of Bessel filter";
 | |
| 
 | |
|     initial equation
 | |
|       if not exact then
 | |
|         s = s_ref;
 | |
|       end if;
 | |
|     equation
 | |
|       if exact then
 | |
|         s = s_ref;
 | |
|         v = 0;
 | |
|         a = 0;
 | |
|       else
 | |
|         // Filter: a = s_ref*S^2/(1 + (af/w_crit)*S + (bf/w_crit^2)*S^2)
 | |
|         v = der(s);
 | |
|         a = der(v);
 | |
|         a = ((s_ref - s)*w_crit - af*v)*(w_crit/bf);
 | |
|       end if;
 | |
|       annotation (
 | |
|         Documentation(info="<HTML>
 | |
| <p>
 | |
| The input signal <b>s_ref</b> defines the <b>reference
 | |
| position</b> in [m]. Flange <b>flange_b</b> is <b>forced</b>
 | |
| to move relative to the support connector according to this reference motion. According to parameter
 | |
| <b>exact</b> (default = <b>false</b>), this is done in the following way:
 | |
| <ol>
 | |
| <li><b>exact=true</b><br>
 | |
|     The reference position is treated <b>exactly</b>. This is only possible, if
 | |
|     the input signal is defined by an analytical function which can be
 | |
|     differentiated at least twice. If this prerequisite is fulfilled,
 | |
|     the Modelica translator will differentiate the input signal twice
 | |
|     in order to compute the reference acceleration of the flange.</li>
 | |
| <li><b>exact=false</b><br>
 | |
|     The reference position is <b>filtered</b> and the second derivative
 | |
|     of the filtered curve is used to compute the reference acceleration
 | |
|     of the flange. This second derivative is <b>not</b> computed by
 | |
|     numerical differentiation but by an appropriate realization of the
 | |
|     filter. For filtering, a second order Bessel filter is used.
 | |
|     The critical frequency (also called cut-off frequency) of the
 | |
|     filter is defined via parameter <b>f_crit</b> in [Hz]. This value
 | |
|     should be selected in such a way that it is higher as the essential
 | |
|     low frequencies in the signal.</li>
 | |
| </ol>
 | |
| <p>
 | |
| The input signal can be provided from one of the signal generator
 | |
| blocks of the block library Modelica.Blocks.Sources.
 | |
| </p>
 | |
| 
 | |
| </html>"),     Icon(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={
 | |
|             Text(
 | |
|               extent={{-56,-36},{-178,-66}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="s_ref"),
 | |
|             Rectangle(
 | |
|               extent={{-100,20},{100,-20}},
 | |
|               lineColor={0,127,0},
 | |
|               fillColor={215,215,215},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Text(
 | |
|               extent={{150,60},{-150,100}},
 | |
|               textString="%name",
 | |
|               lineColor={0,0,255}),
 | |
|             Line(points={{0,52},{0,32}}, color={0,0,0}),
 | |
|             Line(points={{-29,32},{30,32}}, color={0,0,0}),
 | |
|             Line(points={{-30,-32},{30,-32}}, color={0,0,0}),
 | |
|             Line(points={{0,-32},{0,-100}}, color={0,0,0}),
 | |
|             Line(points={{30,-42},{20,-52}}, color={0,0,0}),
 | |
|             Line(points={{30,-32},{10,-52}}, color={0,0,0}),
 | |
|             Line(points={{20,-32},{0,-52}}, color={0,0,0}),
 | |
|             Line(points={{10,-32},{-10,-52}}, color={0,0,0}),
 | |
|             Line(points={{0,-32},{-20,-52}}, color={0,0,0}),
 | |
|             Line(points={{-10,-32},{-30,-52}}, color={0,0,0}),
 | |
|             Line(points={{-20,-32},{-30,-42}}, color={0,0,0}),
 | |
|             Text(
 | |
|               extent={{144,-30},{30,-60}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="exact="),
 | |
|             Text(
 | |
|               extent={{134,-68},{22,-96}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="%exact")}));
 | |
|     end Position;
 | |
| 
 | |
|     model Speed "Forced movement of a flange according to a reference speed"
 | |
|       extends
 | |
|         Modelica.Mechanics.Translational.Interfaces.PartialElementaryOneFlangeAndSupport2
 | |
|         (       s(start=0, fixed=true, stateSelect=StateSelect.prefer));
 | |
|       parameter Boolean exact=false
 | |
|         "true/false exact treatment/filtering the input signal";
 | |
|       parameter SI.Frequency f_crit=50
 | |
|         "if exact=false, critical frequency of filter to filter input signal" annotation(Dialog(enable=not exact));
 | |
|       SI.Velocity v(stateSelect=if exact then StateSelect.default else StateSelect.prefer)
 | |
|         "Absolute velocity of flange_b";
 | |
|       SI.Acceleration a
 | |
|         "If exact=false, absolute acceleration of flange_b else dummy";
 | |
|       Modelica.Blocks.Interfaces.RealInput v_ref(unit="m/s")
 | |
|         "Reference speed of flange as input signal" annotation (Placement(
 | |
|             transformation(extent={{-140,-20},{-100,20}}, rotation=0)));
 | |
| 
 | |
|     protected
 | |
|       parameter Modelica.SIunits.AngularFrequency w_crit=2*Modelica.Constants.pi*f_crit
 | |
|         "Critical frequency";
 | |
|     initial equation
 | |
|       if not exact then
 | |
|         v = v_ref;
 | |
|       end if;
 | |
|     equation
 | |
|       v = der(s);
 | |
|       if exact then
 | |
|         v = v_ref;
 | |
|         a = 0;
 | |
|       else
 | |
|         // Filter: a = v_ref/(1 + (1/w_crit)*s)
 | |
|         a = der(v);
 | |
|         a = (v_ref - v)*w_crit;
 | |
|       end if;
 | |
|       annotation (
 | |
|         Documentation(info="<HTML>
 | |
| <p>
 | |
| The input signal <b>v_ref</b> defines the <b>reference
 | |
| speed</b> in [m/s]. Flange <b>flange_b</b> is <b>forced</b>
 | |
| to move relative to the support connector  according to this reference motion. According to parameter
 | |
| <b>exact</b> (default = <b>false</b>), this is done in the following way:
 | |
| <ol>
 | |
| <li><b>exact=true</b><br>
 | |
|     The reference speed is treated <b>exactly</b>. This is only possible, if
 | |
|     the input signal is defined by an analytical function which can be
 | |
|     differentiated at least once. If this prerequisite is fulfilled,
 | |
|     the Modelica translator will differentiate the input signal once
 | |
|     in order to compute the reference acceleration of the flange.</li>
 | |
| <li><b>exact=false</b><br>
 | |
|     The reference speed is <b>filtered</b> and the first derivative
 | |
|     of the filtered curve is used to compute the reference acceleration
 | |
|     of the flange. This first derivative is <b>not</b> computed by
 | |
|     numerical differentiation but by an appropriate realization of the
 | |
|     filter. For filtering, a first order filter is used.
 | |
|     The critical frequency (also called cut-off frequency) of the
 | |
|     filter is defined via parameter <b>f_crit</b> in [Hz]. This value
 | |
|     should be selected in such a way that it is higher as the essential
 | |
|     low frequencies in the signal.</li>
 | |
| </ol>
 | |
| <p>
 | |
| The input signal can be provided from one of the signal generator
 | |
| blocks of the block library Modelica.Blocks.Sources.
 | |
| </p>
 | |
| 
 | |
| </html>"),     Icon(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={
 | |
|             Text(
 | |
|               extent={{-54,-36},{-174,-68}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="v_ref"),
 | |
|             Line(points={{-30,-32},{30,-32}}, color={0,0,0}),
 | |
|             Line(points={{0,-32},{0,-100}}, color={0,0,0}),
 | |
|             Line(points={{30,-42},{20,-52}}, color={0,0,0}),
 | |
|             Line(points={{30,-32},{10,-52}}, color={0,0,0}),
 | |
|             Line(points={{20,-32},{0,-52}}, color={0,0,0}),
 | |
|             Line(points={{10,-32},{-10,-52}}, color={0,0,0}),
 | |
|             Line(points={{0,-32},{-20,-52}}, color={0,0,0}),
 | |
|             Line(points={{-10,-32},{-30,-52}}, color={0,0,0}),
 | |
|             Line(points={{-20,-32},{-30,-42}}, color={0,0,0}),
 | |
|             Rectangle(
 | |
|               extent={{-100,20},{100,-20}},
 | |
|               lineColor={0,127,0},
 | |
|               fillColor={215,215,215},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Line(points={{-29,32},{30,32}}, color={0,0,0}),
 | |
|             Line(points={{0,52},{0,32}}, color={0,0,0}),
 | |
|             Text(
 | |
|               extent={{150,60},{-150,100}},
 | |
|               textString="%name",
 | |
|               lineColor={0,0,255}),
 | |
|             Text(
 | |
|               extent={{146,-38},{32,-64}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="exact="),
 | |
|             Text(
 | |
|               extent={{140,-76},{22,-102}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="%exact")}));
 | |
|     end Speed;
 | |
| 
 | |
|     model Accelerate
 | |
|       "Forced movement of a flange according to an acceleration signal"
 | |
|        extends
 | |
|         Modelica.Mechanics.Translational.Interfaces.PartialElementaryOneFlangeAndSupport2
 | |
|         (s(start=0, fixed=true, stateSelect=StateSelect.prefer));
 | |
|       SI.Velocity v(start=0, fixed=true, stateSelect=StateSelect.prefer)
 | |
|         "Absolute velocity of flange_b";
 | |
|       SI.Acceleration a "Absolute acceleration of flange_b";
 | |
| 
 | |
|       Modelica.Blocks.Interfaces.RealInput a_ref(unit="m/s2")
 | |
|         "Absolute acceleration of flange as input signal"
 | |
|          annotation (Placement(transformation(extent={{-140,-20},{-100,20}},
 | |
|               rotation=0)));
 | |
| 
 | |
|     equation
 | |
|       v = der(s);
 | |
|       a = der(v);
 | |
|       a = a_ref;
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| The input signal <b>a</b> in [m/s2] moves the 1D translational flange
 | |
| connector flange_b with a predefined <i>acceleration</i>, i.e., the flange
 | |
| is <i>forced</i> to move relative to the support connector  with this acceleration. The velocity and the
 | |
| position of the flange are also predefined and are determined by
 | |
| integration of the acceleration.
 | |
| </p>
 | |
| <p>
 | |
| The acceleration \"a(t)\" can be provided from one of the signal generator
 | |
| blocks of the block library Modelica.Blocks.Source.
 | |
| </p>
 | |
| 
 | |
| </html>"),     Icon(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={
 | |
|             Text(
 | |
|               extent={{-56,-40},{-166,-68}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="a_ref"),
 | |
|             Line(points={{-30,-32},{30,-32}}, color={0,0,0}),
 | |
|             Line(points={{0,-32},{0,-100}}, color={0,0,0}),
 | |
|             Line(points={{30,-42},{20,-52}}, color={0,0,0}),
 | |
|             Line(points={{30,-32},{10,-52}}, color={0,0,0}),
 | |
|             Line(points={{20,-32},{0,-52}}, color={0,0,0}),
 | |
|             Line(points={{10,-32},{-10,-52}}, color={0,0,0}),
 | |
|             Line(points={{0,-32},{-20,-52}}, color={0,0,0}),
 | |
|             Line(points={{-10,-32},{-30,-52}}, color={0,0,0}),
 | |
|             Line(points={{-20,-32},{-30,-42}}, color={0,0,0}),
 | |
|             Rectangle(
 | |
|               extent={{-100,20},{100,-20}},
 | |
|               lineColor={0,127,0},
 | |
|               fillColor={215,215,215},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Line(points={{-29,32},{30,32}}, color={0,0,0}),
 | |
|             Line(points={{0,52},{0,32}}, color={0,0,0}),
 | |
|             Text(
 | |
|               extent={{150,60},{-150,100}},
 | |
|               textString="%name",
 | |
|               lineColor={0,0,255})}));
 | |
|     end Accelerate;
 | |
| 
 | |
|     model Move
 | |
|       "Forced movement of a flange according to a position, velocity and acceleration signal"
 | |
|        extends
 | |
|         Modelica.Mechanics.Translational.Interfaces.PartialElementaryOneFlangeAndSupport2;
 | |
|       Modelica.Blocks.Interfaces.RealInput u[3]
 | |
|         "Position, velocity and acceleration of flange as input signals"
 | |
|         annotation (Placement(transformation(extent={{-140,-20},{-100,20}},
 | |
|               rotation=0)));
 | |
|     protected
 | |
|       function position
 | |
|          extends Modelica.Icons.Function;
 | |
|          input Real q_qd_qdd[3]
 | |
|           "Required values for position, speed, acceleration";
 | |
|          input Real dummy
 | |
|           "Just to have one input signal that should be differentiated to avoid possible problems in the Modelica tool (is not used)";
 | |
|          output Real q;
 | |
|       algorithm
 | |
|         q :=q_qd_qdd[1];
 | |
|         annotation (derivative(noDerivative=q_qd_qdd) = position_der,
 | |
|             InlineAfterIndexReduction=true);
 | |
|       end position;
 | |
| 
 | |
|       function position_der
 | |
|          extends Modelica.Icons.Function;
 | |
|          input Real q_qd_qdd[3]
 | |
|           "Required values for position, speed, acceleration";
 | |
|          input Real dummy
 | |
|           "Just to have one input signal that should be differentiated to avoid possible problems in the Modelica tool (is not used)";
 | |
|          input Real dummy_der;
 | |
|          output Real qd;
 | |
|       algorithm
 | |
|         qd :=q_qd_qdd[2];
 | |
|         annotation (derivative(noDerivative=q_qd_qdd, order=2) = position_der2,
 | |
|             InlineAfterIndexReduction=true);
 | |
|       end position_der;
 | |
| 
 | |
|       function position_der2
 | |
|          extends Modelica.Icons.Function;
 | |
|          input Real q_qd_qdd[3]
 | |
|           "Required values for position, speed, acceleration";
 | |
|          input Real dummy
 | |
|           "Just to have one input signal that should be differentiated to avoid possible problems in the Modelica tool (is not used)";
 | |
|          input Real dummy_der;
 | |
|          input Real dummy_der2;
 | |
|          output Real qdd;
 | |
|       algorithm
 | |
|         qdd :=q_qd_qdd[3];
 | |
|       end position_der2;
 | |
|     equation
 | |
|       s = position(u,time);
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| Flange <b>flange_b</b> is <b>forced</b> to move relative to the support connector  with a predefined motion
 | |
| according to the input signals:
 | |
| </p>
 | |
| <pre>
 | |
|     u[1]: position of flange
 | |
|     u[2]: velocity of flange
 | |
|     u[3]: acceleration of flange
 | |
| </pre>
 | |
| <p>
 | |
| The user has to guarantee that the input signals are consistent to each other,
 | |
| i.e., that u[2] is the derivative of u[1] and that
 | |
| u[3] is the derivative of u. There are, however,
 | |
| also applications where by purpose these conditions do not hold. For example,
 | |
| if only the position dependent terms of a mechanical system shall be
 | |
| calculated, one may provide position = position(t) and set the velocity
 | |
| and the acceleration to zero.
 | |
| </p>
 | |
| <p>
 | |
| The input signals can be provided from one of the signal generator
 | |
| blocks of the block library Modelica.Blocks.Sources.
 | |
| </p>
 | |
| 
 | |
| </html>"),        Icon(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={
 | |
|             Text(
 | |
|               extent={{-192,-38},{-32,-70}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="s,v,a"),
 | |
|             Line(points={{-30,-32},{30,-32}}, color={0,0,0}),
 | |
|             Line(points={{0,-32},{0,-100}}, color={0,0,0}),
 | |
|             Line(points={{30,-42},{20,-52}}, color={0,0,0}),
 | |
|             Line(points={{30,-32},{10,-52}}, color={0,0,0}),
 | |
|             Line(points={{20,-32},{0,-52}}, color={0,0,0}),
 | |
|             Line(points={{10,-32},{-10,-52}}, color={0,0,0}),
 | |
|             Line(points={{0,-32},{-20,-52}}, color={0,0,0}),
 | |
|             Line(points={{-10,-32},{-30,-52}}, color={0,0,0}),
 | |
|             Line(points={{-20,-32},{-30,-42}}, color={0,0,0}),
 | |
|             Rectangle(
 | |
|               extent={{-100,20},{100,-20}},
 | |
|               lineColor={0,127,0},
 | |
|               fillColor={215,215,215},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Line(points={{0,52},{0,32}}, color={0,0,0}),
 | |
|             Line(points={{-29,32},{30,32}}, color={0,0,0}),
 | |
|             Text(
 | |
|               extent={{150,60},{-150,100}},
 | |
|               textString="%name",
 | |
|               lineColor={0,0,255})}));
 | |
|     end Move;
 | |
| 
 | |
|     model Force
 | |
|       "External force acting on a drive train element as input signal"
 | |
|       extends
 | |
|         Modelica.Mechanics.Translational.Interfaces.PartialElementaryOneFlangeAndSupport2;
 | |
|       Modelica.Blocks.Interfaces.RealInput f(unit="N") "Driving force as input signal"
 | |
|                                         annotation (Placement(transformation(
 | |
|               extent={{-140,-20},{-100,20}}, rotation=0)));
 | |
| 
 | |
|     equation
 | |
|       flange.f = -f;
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| The input signal \"f\" in [N] characterizes an <i>external
 | |
| force</i> which acts (with positive sign) at a flange,
 | |
| i.e., the component connected to the flange is driven by force f.
 | |
| </p>
 | |
| <p>
 | |
| Input signal f can be provided from one of the signal generator
 | |
| blocks of Modelica.Blocks.Source.
 | |
| </p>
 | |
| 
 | |
| </html>"),     Icon(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={
 | |
|             Polygon(
 | |
|               points={{-100,10},{20,10},{20,41},{90,0},{20,-41},{20,-10},{-100,
 | |
|                   -10},{-100,10}},
 | |
|               lineColor={0,127,0},
 | |
|               fillColor={215,215,215},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Text(
 | |
|               extent={{-150,-32},{-80,-62}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="f"),
 | |
|             Text(
 | |
|               extent={{-150,90},{150,50}},
 | |
|               textString="%name",
 | |
|               lineColor={0,0,255}),
 | |
|             Line(points={{-30,-60},{30,-60}}, color={0,0,0}),
 | |
|             Line(points={{0,-60},{0,-101}}, color={0,0,0}),
 | |
|             Line(points={{-30,-80},{-10,-60}}, color={0,0,0}),
 | |
|             Line(points={{-10,-80},{10,-60}}, color={0,0,0}),
 | |
|             Line(points={{10,-80},{30,-60}}, color={0,0,0}),
 | |
|             Polygon(
 | |
|               points={{-61,-50},{-30,-40},{-30,-60},{-61,-50}},
 | |
|               lineColor={0,0,0},
 | |
|               fillColor={128,128,128},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Line(points={{-31,-50},{50,-50}}, color={0,0,0}),
 | |
|             Line(points={{-50,-80},{-30,-60}}, color={0,0,0})}));
 | |
|     end Force;
 | |
| 
 | |
|     model Force2 "Input signal acting as torque on two flanges"
 | |
|       extends Translational.Interfaces.PartialTwoFlanges;
 | |
|       Modelica.Blocks.Interfaces.RealInput f(unit="N") "Driving force as input signal"
 | |
|                                         annotation (Placement(transformation(
 | |
|               extent={{-20,-20},{20,20}},    rotation=270,
 | |
|             origin={0,60}), iconTransformation(
 | |
|             extent={{-20,-20},{20,20}},
 | |
|             rotation=270,
 | |
|             origin={0,40})));
 | |
| 
 | |
|     equation
 | |
|       flange_a.f =  f;
 | |
|       flange_b.f = -f;
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| The input signal \"f\" in [N] characterizes an <i>external
 | |
| force</i> which acts (with positive sign) at both flanges,
 | |
| i.e., the components connected to these flanges are driven by force f.
 | |
| </p>
 | |
| <p>
 | |
| Input signal s can be provided from one of the signal generator
 | |
| blocks of Modelica.Blocks.Source.
 | |
| </p>
 | |
| 
 | |
| </html>"),     Icon(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={
 | |
|             Text(
 | |
|               extent={{-150,-40},{150,-80}},
 | |
|               textString="%name",
 | |
|               lineColor={0,0,255}),
 | |
|             Polygon(
 | |
|               points={{90,0},{60,-30},{60,-10},{10,-10},{10,10},{60,10},{60,31},
 | |
|                   {90,0}},
 | |
|               lineColor={0,127,0},
 | |
|               smooth=Smooth.None,
 | |
|               fillColor={215,215,215},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Polygon(
 | |
|               points={{-90,0},{-60,30},{-60,10},{-10,10},{-10,-10},{-60,-10},{-60,
 | |
|                   -30},{-90,0}},
 | |
|               lineColor={0,127,0},
 | |
|               smooth=Smooth.None,
 | |
|               fillColor={215,215,215},
 | |
|               fillPattern=FillPattern.Solid)}));
 | |
|     end Force2;
 | |
| 
 | |
|     model LinearSpeedDependentForce "Linear dependency of force versus speed"
 | |
|       extends Modelica.Mechanics.Translational.Interfaces.PartialForce;
 | |
|       parameter Modelica.SIunits.Force f_nominal
 | |
|         "Nominal force (if negative, force is acting as load)";
 | |
|       parameter Boolean ForceDirection=true
 | |
|         "Same direction of force in both directions of movement";
 | |
|       parameter Modelica.SIunits.Velocity v_nominal(min=Modelica.Constants.eps)
 | |
|         "Nominal speed";
 | |
|       Modelica.SIunits.Velocity v
 | |
|         "Velocity of flange with respect to support (= der(s))";
 | |
| 
 | |
|     equation
 | |
|       v = der(s);
 | |
|       if ForceDirection then
 | |
|         f = -f_nominal*abs(v/v_nominal);
 | |
|       else
 | |
|         f = -f_nominal*(v/v_nominal);
 | |
|       end if;
 | |
|       annotation (Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,
 | |
|                 -100},{100,100}}), graphics={Line(points={{-100,-100},{100,100}},
 | |
|                 color={0,0,255})}), Documentation(info="<HTML>
 | |
| <p>
 | |
| Model of force, linearly dependent on velocity of flange.<br>
 | |
| Parameter ForceDirection chooses whether direction of force is the same in both directions of movement or not.
 | |
| </p>
 | |
| </HTML>"));
 | |
|     end LinearSpeedDependentForce;
 | |
| 
 | |
|     model QuadraticSpeedDependentForce
 | |
|       "Quadratic dependency of force versus speed"
 | |
|       extends Modelica.Mechanics.Translational.Interfaces.PartialForce;
 | |
|       parameter Modelica.SIunits.Force f_nominal
 | |
|         "Nominal force (if negative, force is acting as load)";
 | |
|       parameter Boolean ForceDirection=true
 | |
|         "Same direction of force in both directions of movement";
 | |
|       parameter Modelica.SIunits.Velocity v_nominal(min=Modelica.Constants.eps)
 | |
|         "Nominal speed";
 | |
|       Modelica.SIunits.Velocity v
 | |
|         "Velocity of flange with respect to support (= der(s))";
 | |
|     equation
 | |
|       v = der(s);
 | |
|       if ForceDirection then
 | |
|         f = -f_nominal*(v/v_nominal)^2;
 | |
|       else
 | |
|         f = -f_nominal*smooth(1, if v >= 0 then (v/v_nominal)^2 else -(v/v_nominal)^2);
 | |
|       end if;
 | |
|       annotation (Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}), graphics={
 | |
|               Line(points={{-100,-100},{-80,-98},{-60,-92},{-40,-82},{-20,-68},{0,-50},{20,-28},{40,-2},{60,28},{80,62},{100,100}},
 | |
|                    color={0,0,127},
 | |
|                    smooth=Smooth.Bezier)}),Documentation(info="<HTML>
 | |
| <p>
 | |
| Model of force, quadratic dependent on velocity of flange.<br>
 | |
| Parameter ForceDirection chooses whether direction of force is the same in both directions of movement or not.
 | |
| </p>
 | |
| </HTML>"));
 | |
|     end QuadraticSpeedDependentForce;
 | |
| 
 | |
|     model ConstantForce "Constant force, not dependent on speed"
 | |
|       extends Modelica.Mechanics.Translational.Interfaces.PartialForce;
 | |
|       parameter Modelica.SIunits.Force f_constant
 | |
|         "Nominal force (if negative, force is acting as load)";
 | |
|     equation
 | |
|       f = -f_constant;
 | |
|       annotation (Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,
 | |
|                 -100},{100,100}}), graphics={Line(points={{-100,0},{98,0}},
 | |
|                 color={0,0,255}), Text(
 | |
|               extent={{-118,58},{126,34}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="%f_constant")}),
 | |
|                                Documentation(info="<HTML>
 | |
| <p>
 | |
| Model of constant force, not dependent on velocity of flange.<br>
 | |
| Positive force acts accelerating.
 | |
| </p>
 | |
| </HTML>"));
 | |
|     end ConstantForce;
 | |
| 
 | |
|     model ConstantSpeed "Constant speed, not dependent on force"
 | |
|       extends Modelica.Mechanics.Translational.Interfaces.PartialForce;
 | |
|       parameter Modelica.SIunits.Velocity v_fixed
 | |
|         "Fixed speed (if negative, force is acting as load)";
 | |
|       Modelica.SIunits.Velocity v
 | |
|         "Velocity of flange with respect to support (= der(s))";
 | |
|     equation
 | |
|       v = der(s);
 | |
|       v = v_fixed;
 | |
|       annotation (Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,
 | |
|                 -100},{100,100}}), graphics={Line(points={{0,-100},{0,100}},
 | |
|                 color={0,0,255}), Text(
 | |
|               extent={{-120,60},{124,36}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="%v_fixed")}),
 | |
|                                     Documentation(info="<HTML>
 | |
| <p>
 | |
| Model of <b>fixed</b> velocity of flange, not dependent on force.
 | |
| </p>
 | |
| </HTML>"));
 | |
|     end ConstantSpeed;
 | |
| 
 | |
|     model ForceStep "Constant force, not dependent on speed"
 | |
|       extends Modelica.Mechanics.Translational.Interfaces.PartialForce;
 | |
|       parameter Modelica.SIunits.Force stepForce(start=1)
 | |
|         "Height of force step (if negative, force is acting as load)";
 | |
|       parameter Modelica.SIunits.Force offsetForce(start=0) "Offset of force";
 | |
|       parameter Modelica.SIunits.Time startTime=0
 | |
|         "Force = offset for time < startTime";
 | |
|     equation
 | |
|       f = -offsetForce - (if time < startTime then 0 else stepForce);
 | |
|       annotation (Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,
 | |
|                 -100},{100,100}}), graphics={Line(points={{-80,-60},{0,-60},{0,
 | |
|                   60},{80,60}}, color={0,0,255}), Text(
 | |
|               extent={{0,-40},{100,-60}},
 | |
|               lineColor={0,0,0},
 | |
|               textString="time")}), Documentation(info="<HTML>
 | |
| <p>
 | |
| Model of a force step at time .<br>
 | |
| Positive force acts accelerating.
 | |
| </p>
 | |
| </HTML>"));
 | |
|     end ForceStep;
 | |
| 
 | |
|     annotation (                 Documentation(info="<html>
 | |
| <p>
 | |
| This package contains ideal sources to drive 1D mechanical translational drive trains.
 | |
| </p>
 | |
| </html>"));
 | |
|   end Sources;
 | |
| 
 | |
|   package Interfaces
 | |
|     "Interfaces for 1-dim. translational mechanical components"
 | |
|       extends Modelica.Icons.InterfacesPackage;
 | |
| 
 | |
|     connector Flange_a
 | |
|       "(left) 1D translational flange (flange axis directed INTO cut plane, e. g. from left to right)"
 | |
| 
 | |
|       SI.Position s "Absolute position of flange";
 | |
|       flow SI.Force f "Cut force directed into flange";
 | |
|       annotation(defaultComponentName = "flange_a",
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| This is a flange for 1D translational mechanical systems. In the cut plane of
 | |
| the flange a unit vector n, called flange axis, is defined which is directed
 | |
| INTO the cut plane, i. e. from left to right. All vectors in the cut plane are
 | |
| resolved with respect to
 | |
| this unit vector. E.g. force f characterizes a vector which is directed in
 | |
| the direction of n with value equal to f. When this flange is connected to
 | |
| other 1D translational flanges, this means that the axes vectors of the connected
 | |
| flanges are identical.
 | |
| </p>
 | |
| <p>
 | |
| The following variables are transported through this connector:
 | |
| </p>
 | |
| <pre>
 | |
|   s: Absolute position of the flange in [m]. A positive translation
 | |
|      means that the flange is translated along the flange axis.
 | |
|   f: Cut-force in direction of the flange axis in [N].
 | |
| </pre>
 | |
| </html>"),     Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{
 | |
|                 100,100}}), graphics={Rectangle(
 | |
|               extent={{-100,-100},{100,100}},
 | |
|               lineColor={0,127,0},
 | |
|               fillColor={0,127,0},
 | |
|               fillPattern=FillPattern.Solid)}),
 | |
|         Diagram(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},
 | |
|                 {100,100}}), graphics={Rectangle(
 | |
|               extent={{-40,-40},{40,40}},
 | |
|               lineColor={0,127,0},
 | |
|               fillColor={0,127,0},
 | |
|               fillPattern=FillPattern.Solid), Text(
 | |
|               extent={{-160,110},{40,50}},
 | |
|               lineColor={0,127,0},
 | |
|               textString="%name")}));
 | |
|     end Flange_a;
 | |
| 
 | |
|     connector Flange_b
 | |
|       "(right) 1D translational flange (flange axis directed OUT OF cut plane)"
 | |
| 
 | |
|       SI.Position s "Absolute position of flange";
 | |
|       flow SI.Force f "Cut force directed into flange";
 | |
|       annotation(defaultComponentName = "flange_b",
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| This is a flange for 1D translational mechanical systems. In the cut plane of
 | |
| the flange a unit vector n, called flange axis, is defined which is directed
 | |
| OUT OF the cut plane. All vectors in the cut plane are resolved with respect to
 | |
| this unit vector. E.g. force f characterizes a vector which is directed in
 | |
| the direction of n with value equal to f. When this flange is connected to
 | |
| other 1D translational flanges, this means that the axes vectors of the connected
 | |
| flanges are identical.
 | |
| </p>
 | |
| <p>
 | |
| The following variables are transported through this connector:
 | |
| <pre>
 | |
|   s: Absolute position of the flange in [m]. A positive translation
 | |
|      means that the flange is translated along the flange axis.
 | |
|   f: Cut-force in direction of the flange axis in [N].
 | |
| </pre>
 | |
| </html>"),     Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}), graphics={
 | |
|           Rectangle(
 | |
|             extent={{-100,-100},{100,100}},
 | |
|             lineColor={0,127,0},
 | |
|             fillColor={255,255,255},
 | |
|             fillPattern=FillPattern.Solid)}),
 | |
|         Diagram(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={Rectangle(
 | |
|               extent={{-40,-40},{40,40}},
 | |
|               lineColor={0,127,0},
 | |
|               fillColor={255,255,255},
 | |
|               fillPattern=FillPattern.Solid), Text(
 | |
|               extent={{-40,110},{160,50}},
 | |
|               lineColor={0,127,0},
 | |
|               textString="%name")}));
 | |
|     end Flange_b;
 | |
| 
 | |
|     connector Support "Support/housing 1D translational flange"
 | |
| 
 | |
|       SI.Position s "Absolute position of flange";
 | |
|       flow SI.Force f "Cut force directed into flange";
 | |
|       annotation (Diagram(coordinateSystem(preserveAspectRatio=true, extent={{-100,
 | |
|                 -100},{100,100}}), graphics={
 | |
|             Rectangle(
 | |
|               extent={{-60,60},{60,-60}},
 | |
|               fillColor={175,175,175},
 | |
|               fillPattern=FillPattern.Solid,
 | |
|               pattern=LinePattern.None),
 | |
|             Text(
 | |
|               extent={{-160,110},{40,50}},
 | |
|               lineColor={0,127,0},
 | |
|               textString="%name"),
 | |
|             Rectangle(
 | |
|               extent={{-40,-40},{40,40}},
 | |
|               lineColor={0,127,0},
 | |
|               fillColor={0,127,0},
 | |
|               fillPattern=FillPattern.Solid)}), Icon(coordinateSystem(
 | |
|               preserveAspectRatio=true, extent={{-100,-100},{100,100}}),
 | |
|             graphics={Rectangle(
 | |
|               extent={{-150,150},{150,-150}},
 | |
|               fillColor={175,175,175},
 | |
|               fillPattern=FillPattern.Solid,
 | |
|               pattern=LinePattern.None), Rectangle(
 | |
|               extent={{-90,-90},{90,90}},
 | |
|               lineColor={0,127,0},
 | |
|               fillColor={0,127,0},
 | |
|               fillPattern=FillPattern.Solid)}),
 | |
|         Documentation(info="<html>
 | |
| <p>This is a connector for 1-dim. rotational mechanical systems and models the support or housing of a shaft. The following variables are defined in this connector:</p>
 | |
| <table cellspacing=\"0\" cellpadding=\"2\" border=\"1\"><tr>
 | |
| <td valign=\"top\"><h4>s</h4></td>
 | |
| <td valign=\"top\"><p>Absolute position of the support/housing in [m]</p></td>
 | |
| </tr>
 | |
| <tr>
 | |
| <td valign=\"top\"><h4>f</h4></td>
 | |
| <td valign=\"top\"><p>Reaction force in the support/housing in [N]</p></td>
 | |
| </tr>
 | |
| </table>
 | |
| <p><br/>The support connector is usually defined as conditional connector. It is most convenient to utilize it</p>
 | |
| <ul>
 | |
| <li>For models to be build graphically (i.e., the model is build up by drag-and-drop from elementary components):<br/><a href=\"modelica://Modelica.Mechanics.Translational.Interfaces.PartialOneFlangeAndSupport\">PartialOneFlangeAndSupport</a>,<br/><a href=\"modelica://Modelica.Mechanics.Translational.Interfaces.PartialTwoFlangesAndSupport\">PartialTwoFlangesAndSupport</a>, <br/>  </li>
 | |
| <li>For models to be build textually (i.e., elementary models):<br/><a href=\"modelica://Modelica.Mechanics.Translational.Interfaces.PartialElementaryOneFlangeAndSupport\">PartialElementaryOneFlangeAndSupport</a>,<br/><a href=\"modelica://Modelica.Mechanics.Translational.Interfaces.PartialElementaryTwoFlangesAndSupport\">PartialElementaryTwoFlangesAndSupport</a>,<br/><a href=\"modelica://Modelica.Mechanics.Translational.Interfaces.PartialElementaryRotationalToTranslational\">PartialElementaryRotationalToTranslational</a>. </li>
 | |
| </ul>
 | |
| </html>"));
 | |
|     end Support;
 | |
| 
 | |
|     model InternalSupport
 | |
|       "Adapter model to utilize conditional support connector"
 | |
|       input SI.Force f
 | |
|         "External support force (must be computed via force balance in model where InternalSupport is used; = flange.f)";
 | |
|       SI.Position s "External support position (= flange.s)";
 | |
|       Flange_a flange
 | |
|         "Internal support flange (must be connected to the conditional support connector for useSupport=true and to conditional fixed model for useSupport=false)"
 | |
|         annotation (Placement(transformation(extent={{-10,-10},{10,10}})));
 | |
|     equation
 | |
|       flange.f = f;
 | |
|       flange.s = s;
 | |
|       annotation ( Icon(coordinateSystem(
 | |
|               preserveAspectRatio=true, extent={{-100,-100},{100,100}}),
 | |
|             graphics={Text(
 | |
|               extent={{-200,80},{200,40}},
 | |
|               lineColor={0,0,255},
 | |
|               textString="%name"), Rectangle(
 | |
|               extent={{-20,20},{20,-20}},
 | |
|               lineColor={0,127,0},
 | |
|               fillColor={175,175,175},
 | |
|               fillPattern=FillPattern.Solid)}),
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| This is an adapter model to utilize a conditional support connector
 | |
| in an elementary component, i.e., where the component equations are
 | |
| defined textually:
 | |
| </p>
 | |
| 
 | |
| <ul>
 | |
| <li> If <i>useSupport = true</i>, the flange has to be connected to the conditional
 | |
|      support connector.</li>
 | |
| <li> If <i>useSupport = false</i>, the flange has to be connected to the conditional
 | |
|      fixed model.</li>
 | |
| </ul>
 | |
| 
 | |
| <p>
 | |
| Variable <b>f</b> is defined as <b>input</b> and must be provided when using
 | |
| this component as a modifier (computed via a force balance in
 | |
| the model where InternalSupport is used). Usually, model InternalSupport is
 | |
| utilized via the partial models:
 | |
| </p>
 | |
| 
 | |
| <blockquote>
 | |
| <a href=\"modelica://Modelica.Mechanics.Translational.Interfaces.PartialElementaryOneFlangeAndSupport\">
 | |
| PartialElementaryOneFlangeAndSupport</a>,<br>
 | |
| <a href=\"modelica://Modelica.Mechanics.Translational.Interfaces.PartialElementaryTwoFlangesAndSupport\">
 | |
| PartialElementaryTwoFlangesAndSupport</a>,<br>
 | |
| <a href=\"modelica://Modelica.Mechanics.Translational.Interfaces.PartialElementaryRotationalToTranslational\">
 | |
| PartialElementaryRotationalToTranslational</a>.
 | |
| </blockquote>
 | |
| 
 | |
| <p>
 | |
| Note, the support position can always be accessed as internalSupport.s, and
 | |
| the support force can always be accessed as internalSupport.f.
 | |
| </p>
 | |
| </html>"));
 | |
|     end InternalSupport;
 | |
| 
 | |
|     partial model PartialTwoFlanges
 | |
|       "Component with two translational 1D flanges"
 | |
| 
 | |
|       Flange_a flange_a
 | |
|         "(left) driving flange (flange axis directed in to cut plane, e. g. from left to right)"
 | |
|          annotation (Placement(transformation(extent={{-110,-10},{-90,10}},
 | |
|               rotation=0)));
 | |
|       Flange_b flange_b
 | |
|         "(right) driven flange (flange axis directed out of cut plane)"
 | |
|         annotation (Placement(transformation(extent={{90,-10},{110,10}},
 | |
|               rotation=0)));
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| This is a 1D translational component with two flanges.
 | |
| It is used e.g., to built up parts of a drive train consisting
 | |
| of several base components.
 | |
| </p>
 | |
| </html>"));
 | |
|     end PartialTwoFlanges;
 | |
| 
 | |
|     partial model PartialOneFlangeAndSupport
 | |
|       "Partial model for a component with one translational 1-dim. shaft flange and a support used for graphical modeling, i.e., the model is build up by drag-and-drop from elementary components"
 | |
|       parameter Boolean useSupport=false
 | |
|         "= true, if support flange enabled, otherwise implicitly grounded"
 | |
|           annotation(Evaluate=true, HideResult=true, choices(checkBox=true));
 | |
|       Flange_b flange "Flange of component"
 | |
|         annotation (Placement(transformation(extent={{90,-10},{110,10}}, rotation=0)));
 | |
|       Support support if useSupport "Support/housing of component"
 | |
|         annotation (Placement(transformation(extent={{-10,-110},{10,-90}})));
 | |
|     protected
 | |
|       Support internalSupport
 | |
|         "Internal support/housing of component (either connected to support, if useSupport=true, or connected to fixed, if useSupport=false)"
 | |
|         annotation (Placement(transformation(extent={{-3,-83},{3,-77}})));
 | |
|       Components.Fixed fixed if not useSupport
 | |
|         "Fixed support/housing, if not useSupport"
 | |
|         annotation (Placement(transformation(extent={{10,-94},{30,-74}})));
 | |
|     equation
 | |
|       connect(fixed.flange, internalSupport) annotation (Line(
 | |
|           points={{20,-84},{20,-80},{0,-80}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(internalSupport, support) annotation (Line(
 | |
|           points={{0,-80},{0,-100}},
 | |
|           pattern=LinePattern.None,
 | |
|           smooth=Smooth.None));
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| This is a 1-dim. translational component with one flange and a support/housing.
 | |
| It is used e.g., to build up parts of a drive train graphically consisting
 | |
| of several components.
 | |
| </p>
 | |
| 
 | |
| <p>
 | |
| If <i>useSupport=true</i>, the support connector is conditionally enabled
 | |
| and needs to be connected.<br>
 | |
| If <i>useSupport=false</i>, the support connector is conditionally disabled
 | |
| and instead the component is internally fixed to ground.
 | |
| </p>
 | |
| 
 | |
| </html>"),     Diagram(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={Text(
 | |
|               extent={{-38,-98},{-6,-96}},
 | |
|               lineColor={95,95,95},
 | |
|               textString="(if useSupport)"), Text(
 | |
|               extent={{21,-95},{61,-96}},
 | |
|               lineColor={95,95,95},
 | |
|               textString="(if not useSupport)")}),
 | |
|         Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{
 | |
|                 100,100}}), graphics={
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{-50,-120},{-30,-100}},
 | |
|               color={0,0,0}),
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{-30,-120},{-10,-100}},
 | |
|               color={0,0,0}),
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{-10,-120},{10,-100}},
 | |
|               color={0,0,0}),
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{10,-120},{30,-100}},
 | |
|               color={0,0,0}),
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{-30,-100},{30,-100}},
 | |
|               color={0,0,0})}));
 | |
|     end PartialOneFlangeAndSupport;
 | |
| 
 | |
|     partial model PartialTwoFlangesAndSupport
 | |
|       "Partial model for a component with two translational 1-dim. shaft flanges and a support used for graphical modeling, i.e., the model is build up by drag-and-drop from elementary components"
 | |
|       parameter Boolean useSupport=false
 | |
|         "= true, if support flange enabled, otherwise implicitly grounded"
 | |
|           annotation(Evaluate=true, HideResult=true, choices(checkBox=true));
 | |
|       Flange_a flange_a "Flange of left end"
 | |
|         annotation (Placement(transformation(extent={{-110,-10}, {-90,10}}, rotation=0)));
 | |
|       Flange_b flange_b "Flange of right end"
 | |
|         annotation (Placement(transformation(extent={{90,-10},{110,10}}, rotation=0)));
 | |
|       Support support if useSupport "Support/housing of component"
 | |
|         annotation (Placement(transformation(extent={{-10,-110},{10,-90}})));
 | |
|     protected
 | |
|       Support internalSupport
 | |
|         "Internal support/housing of component (either connected to support, if useSupport=true, or connected to fixed, if useSupport=false)"
 | |
|         annotation (Placement(transformation(extent={{-3,-83},{3,-77}})));
 | |
|       Components.Fixed fixed if not useSupport
 | |
|         "Fixed support/housing, if not useSupport"
 | |
|         annotation (Placement(transformation(extent={{10,-97},{30,-77}})));
 | |
|     equation
 | |
|       connect(fixed.flange, internalSupport) annotation (Line(
 | |
|           points={{20,-87},{20,-80},{0,-80}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(internalSupport, support) annotation (Line(
 | |
|           points={{0,-80},{0,-100}},
 | |
|           pattern=LinePattern.None,
 | |
|           smooth=Smooth.None));
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| This is a 1-dim. translational component with two flanges and a support/housing.
 | |
| It is used e.g., to build up parts of a drive train graphically consisting
 | |
| of several components.
 | |
| </p>
 | |
| 
 | |
| <p>
 | |
| If <i>useSupport=true</i>, the support connector is conditionally enabled
 | |
| and needs to be connected.<br>
 | |
| If <i>useSupport=false</i>, the support connector is conditionally disabled
 | |
| and instead the component is internally fixed to ground.
 | |
| </p>
 | |
| 
 | |
| </html>"),     Diagram(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={Text(
 | |
|               extent={{-38,-98},{-6,-96}},
 | |
|               lineColor={95,95,95},
 | |
|               textString="(if useSupport)"), Text(
 | |
|               extent={{24,-97},{64,-98}},
 | |
|               lineColor={95,95,95},
 | |
|               textString="(if not useSupport)")}),
 | |
|         Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{
 | |
|                 100,100}}), graphics={
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{-50,-120},{-30,-100}},
 | |
|               color={0,0,0}),
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{-30,-120},{-10,-100}},
 | |
|               color={0,0,0}),
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{-10,-120},{10,-100}},
 | |
|               color={0,0,0}),
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{10,-120},{30,-100}},
 | |
|               color={0,0,0}),
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{-30,-100},{30,-100}},
 | |
|               color={0,0,0})}));
 | |
|     end PartialTwoFlangesAndSupport;
 | |
| 
 | |
|     partial model PartialRigid
 | |
|       "Rigid connection of two translational 1D flanges"
 | |
|       SI.Position s
 | |
|         "Absolute position of center of component (s = flange_a.s + L/2 = flange_b.s - L/2)";
 | |
|       parameter SI.Length L(start=0)
 | |
|         "Length of component, from left flange to right flange (= flange_b.s - flange_a.s)";
 | |
|       Flange_a flange_a "Left flange of translational component"
 | |
|          annotation (Placement(transformation(extent={{-110,-10},{-90,10}},
 | |
|               rotation=0)));
 | |
|       Flange_b flange_b "Right flange of translational component"
 | |
|          annotation (Placement(transformation(extent={{90,-10},{110,10}},
 | |
|               rotation=0)));
 | |
|     equation
 | |
|       flange_a.s = s - L/2;
 | |
|       flange_b.s = s + L/2;
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| This is a 1-dim. translational component with two <i>rigidly</i> connected flanges.
 | |
| The fixed distance between the left and the right flange is defined by parameter \"L\".
 | |
| The forces at the right and left flange can be different.
 | |
| It is used e.g., to built up sliding masses.
 | |
| </p>
 | |
| </html>"));
 | |
|     end PartialRigid;
 | |
| 
 | |
|     partial model PartialCompliant
 | |
|       "Compliant connection of two translational 1D flanges"
 | |
| 
 | |
|       Flange_a flange_a
 | |
|         "Left flange of compliant 1-dim. translational component"
 | |
|          annotation (Placement(transformation(extent={{-110,-10},{-90,10}},
 | |
|               rotation=0)));
 | |
|       Flange_b flange_b
 | |
|         "Right flange of compliant 1-dim. translational component"
 | |
|         annotation (Placement(transformation(extent={{90,-10},{110,10}},
 | |
|               rotation=0)));
 | |
|       SI.Position s_rel(start=0)
 | |
|         "Relative distance (= flange_b.s - flange_a.s)";
 | |
|       SI.Force f
 | |
|         "Force between flanges (positive in direction of flange axis R)";
 | |
| 
 | |
|     equation
 | |
|       s_rel = flange_b.s - flange_a.s;
 | |
|       flange_b.f = f;
 | |
|       flange_a.f = -f;
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| This is a 1D translational component with a <i>compliant </i>connection of two
 | |
| translational 1D flanges where inertial effects between the two
 | |
| flanges are not included. The absolute value of the force at the left and the right
 | |
| flange is the same. It is used to built up springs, dampers etc.
 | |
| </p>
 | |
| 
 | |
| </html>"),     Diagram(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={Polygon(
 | |
|               points={{50,-90},{20,-80},{20,-100},{50,-90}},
 | |
|               lineColor={128,128,128},
 | |
|               fillColor={128,128,128},
 | |
|               fillPattern=FillPattern.Solid), Line(points={{-60,-90},{20,-90}},
 | |
|                 color={0,0,0})}));
 | |
|     end PartialCompliant;
 | |
| 
 | |
|     partial model PartialCompliantWithRelativeStates
 | |
|       "Base model for the compliant connection of two translational 1-dim. shaft flanges where the relative position and relative velocities are used as states"
 | |
| 
 | |
|       parameter StateSelect stateSelect=StateSelect.prefer
 | |
|         "Priority to use phi_rel and w_rel as states"
 | |
|       annotation(HideResult=true, Dialog(tab="Advanced"));
 | |
|       parameter SI.Distance s_nominal=1e-4
 | |
|         "Nominal value of s_rel (used for scaling)"   annotation(Dialog(tab="Advanced"));
 | |
| 
 | |
|       SI.Position s_rel(start=0, stateSelect=stateSelect, nominal=s_nominal)
 | |
|         "Relative distance (= flange_b.s - flange_a.s)";
 | |
|       SI.Velocity v_rel(start=0, stateSelect=stateSelect)
 | |
|         "Relative velocity (= der(s_rel))";
 | |
| 
 | |
|       SI.Force f "Forces between flanges (= flange_b.f)";
 | |
|       Translational.Interfaces.Flange_a flange_a
 | |
|         "Left flange of compliant 1-dim. translational component"
 | |
|         annotation (Placement(transformation(extent={{-110,-10},{-90,10}},
 | |
|               rotation=0)));
 | |
|       Translational.Interfaces.Flange_b flange_b
 | |
|         "Right flange of compliant 1-dim. translational component"
 | |
|         annotation (Placement(transformation(extent={{90,-10},{110,10}},
 | |
|               rotation=0)));
 | |
| 
 | |
|     equation
 | |
|       s_rel = flange_b.s - flange_a.s;
 | |
|       v_rel = der(s_rel);
 | |
|       flange_b.f =  f;
 | |
|       flange_a.f = -f;
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| This is a 1-dim. translational component with a compliant connection of two
 | |
| translational 1-dim. flanges where inertial effects between the two
 | |
| flanges are neglected. The basic assumption is that the cut-forces
 | |
| of the two flanges sum-up to zero, i.e., they have the same absolute value
 | |
| but opposite sign: flange_a.f + flange_b.f = 0. This base class
 | |
| is used to built up force elements such as springs, dampers, friction.
 | |
| </p>
 | |
| 
 | |
| <p>
 | |
| The difference to base class \"PartialCompliant\" is that the relative
 | |
| distance and the relative velocity are defined as preferred states.
 | |
| The reason is that for a large class of drive trains,
 | |
| the absolute position is quickly increasing during operation.
 | |
| Numerically, it is better to use relative distances between drive train components
 | |
| because they remain in a limited size. For this reason, StateSelect.prefer
 | |
| is set for the relative distance of this component.
 | |
| </p>
 | |
| 
 | |
| <p>
 | |
| In order to improve the numerics, a nominal value for the relative distance
 | |
| should be set, since drive train distances are in a small order and
 | |
| then step size control of the integrator is practically switched off for
 | |
| such a variable. A default nominal value of s_nominal = 1e-4 is defined.
 | |
| This nominal value might also be computed from other values, such
 | |
| as \"s_nominal = f_nominal / c\" for a spring, if f_nominal
 | |
| and c have more meaningful values for the user.
 | |
| </p>
 | |
| 
 | |
| </html>"));
 | |
|     end PartialCompliantWithRelativeStates;
 | |
| 
 | |
|     partial model PartialElementaryOneFlangeAndSupport
 | |
|       "Obsolete partial model. Use PartialElementaryOneFlangeAndSupport2."
 | |
|       extends Modelica.Icons.ObsoleteModel;
 | |
| 
 | |
|       parameter Boolean useSupport=false
 | |
|         "= true, if support flange enabled, otherwise implicitly grounded"
 | |
|           annotation(Evaluate=true, HideResult=true, choices(checkBox=true));
 | |
|       Modelica.SIunits.Length s
 | |
|         "Distance between flange and support (= flange.s - support.s)";
 | |
|       Flange_b flange "Flange of component"
 | |
|         annotation (Placement(transformation(extent={{90,-10},{110,10}},
 | |
|               rotation=0)));
 | |
| 
 | |
|     protected
 | |
|       InternalSupport internalSupport(f=-flange.f)
 | |
|         "Internal support/housing of component as a model with connector flange (flange is either connected to support, if useSupport=true, or connected to fixed, if useSupport=false)"
 | |
|         annotation (Placement(transformation(extent={{-10,-90},{10,-70}})));
 | |
|       Components.Fixed fixed if not useSupport
 | |
|         "Fixed support/housing, if not useSupport"
 | |
|         annotation (Placement(transformation(extent={{10,-97},{30,-77}})));
 | |
|     public
 | |
|       Support support if useSupport "Support/housing of component"
 | |
|         annotation (Placement(transformation(extent={{-10,-110},{10,-90}})));
 | |
|     equation
 | |
|       s = flange.s - internalSupport.s;
 | |
|       connect(internalSupport.flange, support) annotation (Line(
 | |
|           points={{0,-80},{0,-100}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(fixed.flange, internalSupport.flange) annotation (Line(
 | |
|           points={{20,-87},{20,-80},{0,-80}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| This is a 1-dim. translational component with one flange and a support/housing.
 | |
| It is used to build up elementary components of a drive train with
 | |
| equations in the text layer.
 | |
| </p>
 | |
| 
 | |
| <p>
 | |
| If <i>useSupport=true</i>, the support connector is conditionally enabled
 | |
| and needs to be connected.<br>
 | |
| If <i>useSupport=false</i>, the support connector is conditionally disabled
 | |
| and instead the component is internally fixed to ground.
 | |
| </p>
 | |
| 
 | |
| </html>"),     Diagram(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={Text(
 | |
|               extent={{-38,-98},{-6,-96}},
 | |
|               lineColor={95,95,95},
 | |
|               textString="(if useSupport)"), Text(
 | |
|               extent={{24,-97},{64,-98}},
 | |
|               lineColor={95,95,95},
 | |
|               textString="(if not useSupport)")}),
 | |
|         Icon(coordinateSystem(preserveAspectRatio=true,  extent={{-100,-100},{
 | |
|                 100,100}}), graphics={
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{-50,-120},{-30,-100}},
 | |
|               color={0,0,0}),
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{-30,-120},{-10,-100}},
 | |
|               color={0,0,0}),
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{-10,-120},{10,-100}},
 | |
|               color={0,0,0}),
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{10,-120},{30,-100}},
 | |
|               color={0,0,0}),
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{-30,-100},{30,-100}},
 | |
|               color={0,0,0})}));
 | |
|     end PartialElementaryOneFlangeAndSupport;
 | |
| 
 | |
|     partial model PartialElementaryOneFlangeAndSupport2
 | |
|       "Partial model for a component with one translational 1-dim. shaft flange and a support used for textual modeling, i.e., for elementary models"
 | |
|       parameter Boolean useSupport=false
 | |
|         "= true, if support flange enabled, otherwise implicitly grounded"
 | |
|           annotation(Evaluate=true, HideResult=true, choices(checkBox=true));
 | |
|       Modelica.SIunits.Length s
 | |
|         "Distance between flange and support (= flange.s - support.s)";
 | |
|       Flange_b flange "Flange of component"
 | |
|         annotation (Placement(transformation(extent={{90,-10},{110,10}},
 | |
|               rotation=0)));
 | |
|       Support support(s=s_support, f=-flange.f) if useSupport
 | |
|         "Support/housing of component"
 | |
|         annotation (Placement(transformation(extent={{-10,-110},{10,-90}})));
 | |
|     protected
 | |
|       Modelica.SIunits.Length s_support "Absolute position of support flange";
 | |
|     equation
 | |
|       s = flange.s - s_support;
 | |
|       if not useSupport then
 | |
|         s_support = 0;
 | |
|       end if;
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| This is a 1-dim. translational component with one flange and a support/housing.
 | |
| It is used to build up elementary components of a drive train with
 | |
| equations in the text layer.
 | |
| </p>
 | |
| 
 | |
| <p>
 | |
| If <i>useSupport=true</i>, the support connector is conditionally enabled
 | |
| and needs to be connected.<br>
 | |
| If <i>useSupport=false</i>, the support connector is conditionally disabled
 | |
| and instead the component is internally fixed to ground.
 | |
| </p>
 | |
| 
 | |
| </html>"),        Icon(coordinateSystem(preserveAspectRatio=true,  extent={{-100,-100},{
 | |
|                 100,100}}), graphics={
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{-50,-120},{-30,-100}},
 | |
|               color={0,0,0}),
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{-30,-120},{-10,-100}},
 | |
|               color={0,0,0}),
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{-10,-120},{10,-100}},
 | |
|               color={0,0,0}),
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{10,-120},{30,-100}},
 | |
|               color={0,0,0}),
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{-30,-100},{30,-100}},
 | |
|               color={0,0,0})}));
 | |
|     end PartialElementaryOneFlangeAndSupport2;
 | |
| 
 | |
|     partial model PartialElementaryTwoFlangesAndSupport
 | |
|       "Obsolete partial model. Use PartialElementaryTwoFlangesAndSupport2."
 | |
|       extends Modelica.Icons.ObsoleteModel;
 | |
|       parameter Boolean useSupport=false
 | |
|         "= true, if support flange enabled, otherwise implicitly grounded"
 | |
|           annotation(Evaluate=true, HideResult=true, choices(checkBox=true));
 | |
|       Flange_a flange_a "Flange of left shaft"
 | |
|         annotation (Placement(transformation(extent={{-110,-10},{-90,10}}, rotation=0)));
 | |
|       Flange_b flange_b "Flange of right shaft"
 | |
|         annotation (Placement(transformation(extent={{90,-10},{110,10}}, rotation=0)));
 | |
|       Modelica.SIunits.Length s_a "Distance between left flange and support";
 | |
|       Modelica.SIunits.Length s_b "Distance between right flange and support";
 | |
|     protected
 | |
|       InternalSupport internalSupport(f=-flange_a.f - flange_b.f)
 | |
|         "Internal support/housing of component as a model with connector flange (flange is either connected to support, if useSupport=true, or connected to fixed, if useSupport=false)"
 | |
|         annotation (Placement(transformation(extent={{-10,-90},{10,-70}})));
 | |
|       Components.Fixed fixed if not useSupport
 | |
|         "Fixed support/housing, if not useSupport"
 | |
|         annotation (Placement(transformation(extent={{10,-97},{30,-77}})));
 | |
|     public
 | |
|       Support support if useSupport "Support/housing of component"
 | |
|         annotation (Placement(transformation(extent={{-10,-110},{10,-90}})));
 | |
|     equation
 | |
|       s_a = flange_a.s - internalSupport.s;
 | |
|       s_b = flange_b.s - internalSupport.s;
 | |
|       connect(internalSupport.flange, support) annotation (Line(
 | |
|           points={{0,-80},{0,-100}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       connect(fixed.flange, internalSupport.flange) annotation (Line(
 | |
|           points={{20,-87},{20,-80},{0,-80}},
 | |
|           color={0,127,0},
 | |
|           smooth=Smooth.None));
 | |
|       annotation (Documentation(info="<html>
 | |
| <p>
 | |
| This is a 1-dim. translational component with two flanges and an additional support.
 | |
| It is used e.g., to build up elementary ideal gear components. The component
 | |
| contains the force balance, i.e., the sum of the forces of the connectors
 | |
| is zero (therefore, components that are based on PartialGear cannot have
 | |
| a mass). The support connector needs to be connected
 | |
| to avoid the unphysical behavior that the
 | |
| support force is required to be zero (= the default value, if the
 | |
| connector is not connected).
 | |
| </p>
 | |
| 
 | |
| </html>"),     Diagram(coordinateSystem(preserveAspectRatio=true,  extent={{-100,-100},
 | |
|                 {100,100}}), graphics={Text(
 | |
|               extent={{-38,-98},{-6,-96}},
 | |
|               lineColor={95,95,95},
 | |
|               textString="(if useSupport)"), Text(
 | |
|               extent={{24,-97},{64,-98}},
 | |
|               lineColor={95,95,95},
 | |
|               textString="(if not useSupport)")}),
 | |
|         Icon(coordinateSystem(preserveAspectRatio=true,  extent={{-100,-100},{
 | |
|                 100,100}}), graphics={
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{-50,-120},{-30,-100}},
 | |
|               color={0,0,0}),
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{-30,-120},{-10,-100}},
 | |
|               color={0,0,0}),
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{-10,-120},{10,-100}},
 | |
|               color={0,0,0}),
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{10,-120},{30,-100}},
 | |
|               color={0,0,0}),
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{-30,-100},{30,-100}},
 | |
|               color={0,0,0})}));
 | |
|     end PartialElementaryTwoFlangesAndSupport;
 | |
| 
 | |
|     partial model PartialElementaryTwoFlangesAndSupport2
 | |
|       "Partial model for a component with one translational 1-dim. shaft flange and a support used for textual modeling, i.e., for elementary models"
 | |
|       parameter Boolean useSupport=false
 | |
|         "= true, if support flange enabled, otherwise implicitly grounded"
 | |
|           annotation(Evaluate=true, HideResult=true, choices(checkBox=true));
 | |
|       Flange_a flange_a "Flange of left shaft"
 | |
|         annotation (Placement(transformation(extent={{-110,-10},{-90,10}}, rotation=0)));
 | |
|       Flange_b flange_b "Flange of right shaft"
 | |
|         annotation (Placement(transformation(extent={{90,-10},{110,10}}, rotation=0)));
 | |
|       Support support(s=s_support, f = -flange_a.f - flange_b.f) if useSupport
 | |
|         "Support/housing of component"
 | |
|         annotation (Placement(transformation(extent={{-10,-110},{10,-90}})));
 | |
|       Modelica.SIunits.Length s_a "Distance between left flange and support";
 | |
|       Modelica.SIunits.Length s_b "Distance between right flange and support";
 | |
|     protected
 | |
|       Modelica.SIunits.Length s_support "Absolute position of support flange";
 | |
|     equation
 | |
|       s_a = flange_a.s - s_support;
 | |
|       s_b = flange_b.s - s_support;
 | |
|       if not useSupport then
 | |
|          s_support = 0;
 | |
|       end if;
 | |
| 
 | |
|       annotation (Documentation(info="<html>
 | |
| <p>
 | |
| This is a 1-dim. translational component with two flanges and an additional support.
 | |
| It is used e.g., to build up elementary ideal gear components. The component
 | |
| contains the force balance, i.e., the sum of the forces of the connectors
 | |
| is zero (therefore, components that are based on PartialGear cannot have
 | |
| a mass). The support connector needs to be connected
 | |
| to avoid the unphysical behavior that the
 | |
| support force is required to be zero (= the default value, if the
 | |
| connector is not connected).
 | |
| </p>
 | |
| 
 | |
| </html>"),        Icon(coordinateSystem(preserveAspectRatio=true,  extent={{-100,-100},{
 | |
|                 100,100}}), graphics={
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{-50,-120},{-30,-100}},
 | |
|               color={0,0,0}),
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{-30,-120},{-10,-100}},
 | |
|               color={0,0,0}),
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{-10,-120},{10,-100}},
 | |
|               color={0,0,0}),
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{10,-120},{30,-100}},
 | |
|               color={0,0,0}),
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{-30,-100},{30,-100}},
 | |
|               color={0,0,0})}));
 | |
|     end PartialElementaryTwoFlangesAndSupport2;
 | |
| 
 | |
|     partial model PartialElementaryRotationalToTranslational
 | |
|       "Partial model to transform rotational into translational motion"
 | |
|       extends
 | |
|         Modelica.Mechanics.Rotational.Interfaces.PartialElementaryRotationalToTranslational;
 | |
|       annotation (Documentation(info="<html>
 | |
| <p>This is a 1-dim. rotational component with</p>
 | |
| <ul>
 | |
| <li>one rotational flange, </li>
 | |
| <li>one rotational support/housing, </li>
 | |
| <li>one translational flange, and </li>
 | |
| <li>one translational support/housing </li>
 | |
| </ul>
 | |
| <p>This model is used to build up elementary components of a drive train transforming rotational into translational motion with equations in the text layer.</p>
 | |
| <p>If <i>useSupportR=true</i>, the rotational support connector is conditionally enabled and needs to be connected.</p>
 | |
| <p>If <i>useSupportR=false</i>, the rotational support connector is conditionally disabled and instead the rotational part is internally fixed to ground.</p>
 | |
| <p>If <i>useSupportT=true</i>, the translational support connector is conditionally enabled and needs to be connected.</p>
 | |
| <p>If <i>useSupportT=false</i>, the translational support connector is conditionally disabled and instead the translational part is internally fixed to ground.</p>
 | |
| </html>"));
 | |
|     end PartialElementaryRotationalToTranslational;
 | |
| 
 | |
|   partial model PartialForce
 | |
|       "Partial model of a force acting at the flange (accelerates the flange)"
 | |
|     extends PartialElementaryOneFlangeAndSupport2;
 | |
|     Modelica.SIunits.Force f "Accelerating force acting at flange (= flange.f)";
 | |
|   equation
 | |
|     f = flange.f;
 | |
|     annotation (
 | |
|       Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,
 | |
|                 100}}), graphics={
 | |
|             Rectangle(
 | |
|               extent={{-96,96},{96,-96}},
 | |
|               lineColor={255,255,255},
 | |
|               fillColor={255,255,255},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Line(points={{0,-60},{0,-100}}, color={0,0,0}),
 | |
|             Text(
 | |
|               extent={{-150,140},{150,100}},
 | |
|               lineColor={0,0,255},
 | |
|               textString="%name"),
 | |
|             Line(points={{-78,80},{51,80}}, color={0,0,0}),
 | |
|             Polygon(
 | |
|               points={{81,80},{51,90},{51,70},{81,80}},
 | |
|               lineColor={0,0,0},
 | |
|               fillColor={128,128,128},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Line(points={{-52,-60},{77,-60}}, color={0,0,0}),
 | |
|             Polygon(
 | |
|               points={{-82,-60},{-51,-50},{-51,-70},{-82,-60}},
 | |
|               lineColor={0,0,0},
 | |
|               fillColor={128,128,128},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{-50,-120},{-30,-100}},
 | |
|               color={0,0,0}),
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{-30,-120},{-10,-100}},
 | |
|               color={0,0,0}),
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{-10,-120},{10,-100}},
 | |
|               color={0,0,0}),
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{10,-120},{30,-100}},
 | |
|               color={0,0,0}),
 | |
|             Line(
 | |
|               visible=not useSupport,
 | |
|               points={{-30,-100},{30,-100}},
 | |
|               color={0,0,0})}),
 | |
|       Documentation(info="<HTML>
 | |
| <p>
 | |
| Partial model of force that accelerates the flange.
 | |
| </p>
 | |
| 
 | |
| <p>
 | |
| If <i>useSupport=true</i>, the support connector is conditionally enabled
 | |
| and needs to be connected.<br>
 | |
| If <i>useSupport=false</i>, the support connector is conditionally disabled
 | |
| and instead the component is internally fixed to ground.
 | |
| </p>
 | |
| </HTML>"));
 | |
|   end PartialForce;
 | |
| 
 | |
|     partial model PartialAbsoluteSensor
 | |
|       "Device to measure a single absolute flange variable"
 | |
| 
 | |
|       extends Modelica.Icons.TranslationalSensor;
 | |
| 
 | |
|       Interfaces.Flange_a flange
 | |
|         "Flange to be measured (flange axis directed in to cut plane, e. g. from left to right)"
 | |
|          annotation (Placement(transformation(extent={{-110,-10},{-90,10}},
 | |
|               rotation=0)));
 | |
| 
 | |
|     equation
 | |
|       0 = flange.f;
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| This is the superclass of a 1D translational component with one flange and one
 | |
| output signal in order to measure an absolute kinematic quantity in the flange
 | |
| and to provide the measured signal as output signal for further processing
 | |
| with the Modelica.Blocks blocks.
 | |
| </p>
 | |
| </html>"),     Icon(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={
 | |
|             Line(points={{-100,-90},{-20,-90}}, color={0,0,0}),
 | |
|             Polygon(
 | |
|               points={{10,-90},{-20,-80},{-20,-100},{10,-90}},
 | |
|               lineColor={128,128,128},
 | |
|               fillColor={128,128,128},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Line(points={{-70,0},{-90,0}}, color={0,0,0}),
 | |
|             Line(points={{70,0},{100,0}}, color={0,0,127}),
 | |
|             Text(
 | |
|               extent={{-150,80},{150,40}},
 | |
|               textString="%name",
 | |
|               lineColor={0,0,255})}));
 | |
|     end PartialAbsoluteSensor;
 | |
| 
 | |
|     partial model PartialRelativeSensor
 | |
|       "Device to measure a single relative variable between two flanges"
 | |
| 
 | |
|       extends Modelica.Icons.TranslationalSensor;
 | |
| 
 | |
|       Interfaces.Flange_a flange_a
 | |
|         "(left) driving flange (flange axis directed in to cut plane, e. g. from left to right)"
 | |
|          annotation (Placement(transformation(extent={{-110,-10},{-90,10}},
 | |
|               rotation=0)));
 | |
|       Interfaces.Flange_b flange_b
 | |
|         "(right) driven flange (flange axis directed out of cut plane)"
 | |
|         annotation (Placement(transformation(extent={{90,-10},{110,10}},
 | |
|               rotation=0)));
 | |
| 
 | |
|     equation
 | |
|       0 = flange_a.f + flange_b.f;
 | |
|       annotation (
 | |
|         Documentation(info="<html>
 | |
| <p>
 | |
| This is a superclass for 1D translational components with two rigidly connected
 | |
| flanges and one output signal in order to measure relative kinematic quantities
 | |
| between the two flanges or the cut-force in the flange and
 | |
| to provide the measured signal as output signal for further processing
 | |
| with the Modelica.Blocks blocks.
 | |
| </p>
 | |
| </html>"),     Icon(coordinateSystem(
 | |
|             preserveAspectRatio=true,
 | |
|             extent={{-100,-100},{100,100}}), graphics={
 | |
|             Line(points={{-51,34},{29,34}}, color={0,0,0}),
 | |
|             Polygon(
 | |
|               points={{59,34},{29,44},{29,24},{59,34}},
 | |
|               lineColor={0,0,0},
 | |
|               fillColor={128,128,128},
 | |
|               fillPattern=FillPattern.Solid),
 | |
|             Line(points={{-70,0},{-90,0}}, color={0,0,0}),
 | |
|             Line(points={{70,0},{90,0}}, color={0,0,0}),
 | |
|             Text(
 | |
|               extent={{-150,100},{150,60}},
 | |
|               textString="%name",
 | |
|               lineColor={0,0,255})}));
 | |
|     end PartialRelativeSensor;
 | |
| 
 | |
|     partial model PartialFriction "Base model of Coulomb friction elements"
 | |
| 
 | |
|     //extends Translational.Interfaces.PartialRigid;
 | |
|       parameter SI.Velocity v_small=1e-3
 | |
|         "Relative velocity near to zero (see model info text)"
 | |
|          annotation(Dialog(tab="Advanced"));
 | |
|     // Equations to define the following variables have to be defined in subclasses
 | |
|       SI.Velocity v_relfric "Relative velocity between frictional surfaces";
 | |
|       SI.Acceleration a_relfric
 | |
|         "Relative acceleration between frictional surfaces";
 | |
|     //SI.Force f "Friction force (positive, if directed in opposite direction of v_rel)";
 | |
|       SI.Force f0 "Friction force for v=0 and forward sliding";
 | |
|       SI.Force f0_max "Maximum friction force for v=0 and locked";
 | |
|       Boolean free "true, if frictional element is not active";
 | |
|     // Equations to define the following variables are given in this class
 | |
|       Real sa(unit="1")
 | |
|         "Path parameter of friction characteristic f = f(a_relfric)";
 | |
|       Boolean startForward(start=false, fixed=true)
 | |
|         "true, if v_rel=0 and start of forward sliding";
 | |
|       Boolean startBackward(start=false, fixed=true)
 | |
|         "true, if v_rel=0 and start of backward sliding";
 | |
|       Boolean locked(start=false) "true, if v_rel=0 and not sliding";
 | |
|       constant Integer Unknown=3 "Value of mode is not known";
 | |
|       constant Integer Free=2 "Element is not active";
 | |
|       constant Integer Forward=1 "v_rel > 0 (forward sliding)";
 | |
|       constant Integer Stuck=0
 | |
|         "v_rel = 0 (forward sliding, locked or backward sliding)";
 | |
|       constant Integer Backward=-1 "v_rel < 0 (backward sliding)";
 | |
|       Integer mode(
 | |
|         final min=Backward,
 | |
|         final max=Unknown,
 | |
|         start=Unknown, fixed=true);
 | |
|     protected
 | |
|       constant SI.Acceleration unitAcceleration = 1 annotation(HideResult=true);
 | |
|       constant SI.Force unitForce = 1 annotation(HideResult=true);
 | |
|     equation
 | |
|     /* Friction characteristic
 | |
|    (locked is introduced to help the Modelica translator determining
 | |
|    the different structural configurations,
 | |
|    if for each configuration special code shall be generated)
 | |
| */
 | |
|       startForward = pre(mode) == Stuck and (sa > f0_max/unitForce or pre(startForward)
 | |
|          and sa > f0/unitForce) or pre(mode) == Backward and v_relfric > v_small or
 | |
|         initial() and (v_relfric > 0);
 | |
|       startBackward = pre(mode) == Stuck and (sa < -f0_max/unitForce or pre(
 | |
|         startBackward) and sa < -f0/unitForce) or pre(mode) == Forward and v_relfric <
 | |
|         -v_small or initial() and (v_relfric < 0);
 | |
|       locked = not free and not (pre(mode) == Forward or startForward or pre(
 | |
|         mode) == Backward or startBackward);
 | |
| 
 | |
|       a_relfric/unitAcceleration = if locked then               0 else
 | |
|                                    if free then                 sa else
 | |
|                                    if startForward then         sa - f0_max/unitForce else
 | |
|                                    if startBackward then        sa + f0_max/unitForce else
 | |
|                                    if pre(mode) == Forward then sa - f0_max/unitForce else
 | |
|                                                                 sa + f0_max/unitForce;
 | |
| 
 | |
|     /* Friction torque has to be defined in a subclass. Example for a clutch:
 | |
|    f = if locked then sa else
 | |
|        if free then   0 else
 | |
|        cgeo*fn*(if startForward then          Math.tempInterpol1( v_relfric, mue_pos, 2) else
 | |
|                 if startBackward then        -Math.tempInterpol1(-v_relfric, mue_pos, 2) else
 | |
|                 if pre(mode) == Forward then  Math.tempInterpol1( v_relfric, mue_pos, 2) else
 | |
|                                              -Math.tempInterpol1(-v_relfric, mue_pos, 2));
 | |
| */
 | |
|     // finite state machine to determine configuration
 | |
|       mode = if free then Free else
 | |
|         (if (pre(mode) == Forward  or pre(mode) == Free or startForward)  and v_relfric > 0 then
 | |
|            Forward else
 | |
|          if (pre(mode) == Backward or pre(mode) == Free or startBackward) and v_relfric < 0 then
 | |
|            Backward else
 | |
|            Stuck);
 | |
|       annotation (Documentation(info="<html>
 | |
| <p>
 | |
| Basic model for Coulomb friction that models the stuck phase in a reliable way.
 | |
| </p>
 | |
| </html>"));
 | |
|     end PartialFriction;
 | |
| 
 | |
|     annotation (Documentation(info="<html>
 | |
| <p>
 | |
| This package contains connectors and partial models for 1-dim.
 | |
| translational mechanical components. The components of this package can
 | |
| only be used as basic building elements for models.
 | |
| </p>
 | |
| 
 | |
| </html>"));
 | |
|   end Interfaces;
 | |
| 
 | |
|   annotation (
 | |
|     Icon(coordinateSystem(preserveAspectRatio = true, extent = {{-100,-100},{100,100}}), graphics = {
 | |
|       Line(
 | |
|         origin = {14,53},
 | |
|         points = {{-84,-73},{66,-73}}),
 | |
|       Rectangle(
 | |
|         origin = {14,53},
 | |
|         lineColor = {64,64,64},
 | |
|         fillColor = {192,192,192},
 | |
|         fillPattern = FillPattern.Sphere,
 | |
|         extent = {{-81,-65},{-8,-22}}),Line(visible = true,
 | |
|         origin = {14,53},
 | |
|         points = {{-8,-43},{-1,-43},{6,-64},{17,-23},{29,-65},{40,-23},{50,-44},{61,-44}}),
 | |
|       Line(
 | |
|         origin = {14,53},
 | |
|         points = {{-59,-73},{-84,-93}}),
 | |
|       Line(
 | |
|         origin = {14,53},
 | |
|         points = {{-11,-73},{-36,-93}}),
 | |
|       Line(
 | |
|         origin = {14,53},
 | |
|         points = {{-34,-73},{-59,-93}}),
 | |
|       Line(
 | |
|         origin = {14,53},
 | |
|         points = {{14,-73},{-11,-93}}),
 | |
|       Line(
 | |
|         origin = {14,53},
 | |
|         points = {{39,-73},{14,-93}}),
 | |
|       Line(
 | |
|         origin = {14,53},
 | |
|         points = {{63,-73},{38,-93}})}),
 | |
|                                                         Documentation(info="<html>
 | |
| <p>
 | |
| This package contains components to model <i>1-dimensional translational
 | |
| mechanical</i> systems.
 | |
| </p>
 | |
| <p>
 | |
| The <i>filled</i> and <i>non-filled green squares</i> at the left and
 | |
| right side of a component represent <i>mechanical flanges</i>.
 | |
| Drawing a line between such squares means that the corresponding
 | |
| flanges are <i>rigidly attached</i> to each other. The components of this
 | |
| library can be usually connected together in an arbitrary way. E.g. it is
 | |
| possible to connect two springs or two sliding masses with inertia directly
 | |
| together.
 | |
| <p> The only <i>connection restriction</i> is that the Coulomb friction
 | |
| elements (e.g., MassWithStopAndFriction) should be only connected
 | |
| together provided a compliant element, such as a spring, is in between.
 | |
| The reason is that otherwise the frictional force is not uniquely
 | |
| defined if the elements are stuck at the same time instant (i.e., there
 | |
| does not exist a unique solution) and some simulation systems may not be
 | |
| able to handle this situation, since this leads to a singularity during
 | |
| simulation. It can only be resolved in a \"clean way\" by combining the
 | |
| two connected friction elements into
 | |
| one component and resolving the ambiguity of the frictional force in the
 | |
| stuck mode.
 | |
| </p>
 | |
| <p> Another restriction arises if the hard stops in model MassWithStopAndFriction are used, i. e.
 | |
| the movement of the mass is limited by a stop at smax or smin.
 | |
| <font color=\"#ff0000\"> <b>This requires the states Stop.s and Stop.v</b> </font>. If these states are eliminated during the index reduction
 | |
| the model will not work. To avoid this any inertias should be connected via springs
 | |
| to the Stop element, other sliding masses, dampers or hydraulic chambers must be avoided.</p>
 | |
| <p>
 | |
| In the <i>icon</i> of every component an <i>arrow</i> is displayed in grey
 | |
| color. This arrow characterizes the coordinate system in which the vectors
 | |
| of the component are resolved. It is directed into the positive
 | |
| translational direction (in the mathematical sense).
 | |
| In the flanges of a component, a coordinate system is rigidly attached
 | |
| to the flange. It is called <i>flange frame</i> and is directed in parallel
 | |
| to the component coordinate system. As a result, e.g., the positive
 | |
| cut-force of a \"left\" flange (flange_a) is directed into the flange, whereas
 | |
| the positive cut-force of a \"right\" flange (flange_b) is directed out of the
 | |
| flange. A flange is described by a Modelica connector containing
 | |
| the following variables:
 | |
| </p>
 | |
| <pre>
 | |
|    Modelica.SIunits.Position s    \"Absolute position of flange\";
 | |
|    <b>flow</b> Modelica.SIunits.Force f  \"Cut-force in the flange\";
 | |
| </pre>
 | |
| 
 | |
| <p>
 | |
| This library is designed in a fully object oriented way in order that
 | |
| components can be connected together in every meaningful combination
 | |
| (e.g., direct connection of two springs or two shafts with inertia).
 | |
| As a consequence, most models lead to a system of
 | |
| differential-algebraic equations of <i>index 3</i> (= constraint
 | |
| equations have to be differentiated twice in order to arrive at
 | |
| a state space representation) and the Modelica translator or
 | |
| the simulator has to cope with this system representation.
 | |
| According to our present knowledge, this requires that the
 | |
| Modelica translator is able to symbolically differentiate equations
 | |
| (otherwise it is e.g., not possible to provide consistent initial
 | |
| conditions; even if consistent initial conditions are present, most
 | |
| numerical DAE integrators can cope at most with index 2 DAEs).
 | |
| </p>
 | |
| 
 | |
| <p>
 | |
| In version 3.2 of the Modelica Standard Library, all <b>dissipative</b> components
 | |
| of the Translational library got an optional <b>heatPort</b> connector to which the
 | |
| dissipated energy is transported in form of heat. This connector is enabled
 | |
| via parameter \"useHeatPort\". If the heatPort connector is enabled,
 | |
| it must be connected, and if it is not enabled, it must not be connected.
 | |
| Independently, whether the heatPort is enabled or not,
 | |
| the dissipated power is available from the new variable \"<b>lossPower</b>\" (which is
 | |
| positive if heat is flowing out of the heatPort). For an example, see
 | |
| <a href=\"modelica://Modelica.Mechanics.Translational.Examples.HeatLosses\">Examples.HeatLosses</a>.
 | |
| </p>
 | |
| 
 | |
| <dl>
 | |
| <dt><b>Library Officer</b>
 | |
| <dd><a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a> <br>
 | |
|     Deutsches Zentrum für Luft und Raumfahrt e.V. (DLR)<br>
 | |
|     Institut für Robotik und Mechatronik (DLR-RM)<br>
 | |
|     Abteilung Systemdynamik und Regelungstechnik<br>
 | |
|     Postfach 1116<br>
 | |
|     D-82230 Wessling<br>
 | |
|     Germany<br>
 | |
|     email: <A HREF=\"mailto:Martin.Otter@dlr.de\">Martin.Otter@dlr.de</A><br><br>
 | |
| </dl>
 | |
| 
 | |
| <p>
 | |
| <b>Contributors to this library:</b>
 | |
| </p>
 | |
| 
 | |
| <ul>
 | |
| <li> Main author until 2006:<br>
 | |
|      Peter Beater <br>
 | |
|      Universität Paderborn, Abteilung Soest<br>
 | |
|      Fachbereich Maschinenbau/Automatisierungstechnik<br>
 | |
|      Lübecker Ring 2 <br>
 | |
|      D 59494 Soest <br>
 | |
|      Germany <br>
 | |
|      email: <A HREF=\"mailto:info@beater.de\">info@beater.de</A><br><br>
 | |
|      </li>
 | |
| 
 | |
| <li> <a href=\"http://www.haumer.at/\">Anton Haumer</a><br>
 | |
|      Technical Consulting & Electrical Engineering<br>
 | |
|      A-3423 St.Andrae-Woerdern, Austria<br>
 | |
|      email: <a href=\"mailto:a.haumer@haumer.at\">a.haumer@haumer.at</a><br><br></li>
 | |
| 
 | |
| <li> <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a> (DLR-RM)</li>
 | |
| </ul>
 | |
| 
 | |
| <p>
 | |
| Copyright © 1998-2013, Modelica Association, Anton Haumer and Universität Paderborn, FB 12.
 | |
| </p>
 | |
| <p>
 | |
| <i>This Modelica package is <u>free</u> software and the use is completely at <u>your own risk</u>; it can be redistributed and/or modified under the terms of the Modelica License 2. For license conditions (including the disclaimer of warranty) see <a href=\"modelica://Modelica.UsersGuide.ModelicaLicense2\">Modelica.UsersGuide.ModelicaLicense2</a> or visit <a href=\"https://www.modelica.org/licenses/ModelicaLicense2\"> https://www.modelica.org/licenses/ModelicaLicense2</a>.</i>
 | |
| </p>
 | |
| </html>", revisions="<html>
 | |
| <ul>
 | |
| <li><i>Version 1.2.0 2010-07-22</i>
 | |
|        by Anton Haumer and Martin Otter<br>
 | |
|        heatPort introduced for all dissipative elements, and
 | |
|        text in icons improved.
 | |
|        <br></li>
 | |
| 
 | |
| <li><i>Version 1.1.0 2007-11-16</i>
 | |
|        by Anton Haumer<br>
 | |
|        Redesign for Modelica 3.0-compliance<br>
 | |
|        Added new components according to Mechanics.Rotational library
 | |
|        <br></li>
 | |
| 
 | |
| <li><i>Version 1.01 (July 18, 2001)</i>
 | |
|        by Peter Beater <br>
 | |
|        Assert statement added to \"Stop\", small bug fixes in examples.
 | |
|        <br></li>
 | |
| 
 | |
| <li><i>Version 1.0 (January 5, 2000)</i>
 | |
|        by Peter Beater <br>
 | |
|        Realized a first version based on Modelica library Mechanics.Rotational
 | |
|        by Martin Otter and an existing Dymola library onedof.lib by Peter Beater.</li>
 | |
| </ul>
 | |
| </html>"));
 | |
| end Translational;
 |