1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6 ------------- Copyright (C) 2000 Jon S. Berndt (jon@jsbsim.org) -------------
8 Header: FGTransmission.h
10 Date started: 02/05/12
12 ------------- Copyright (C) 2012 T. Kreitler (t.kreitler@web.de) -------------
14 This program is free software; you can redistribute it and/or modify it under
15 the terms of the GNU Lesser General Public License as published by the Free Software
16 Foundation; either version 2 of the License, or (at your option) any later
19 This program is distributed in the hope that it will be useful, but WITHOUT
20 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
21 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
24 You should have received a copy of the GNU Lesser General Public License along with
25 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
26 Place - Suite 330, Boston, MA 02111-1307, USA.
28 Further information about the GNU Lesser General Public License can also be found on
29 the world wide web at http://www.gnu.org.
32 --------------------------------------------------------------------------------
33 02/05/12 T.Kreitler Created
35 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
37 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
39 #ifndef FGTRANSMISSION_H
40 #define FGTRANSMISSION_H
42 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
44 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
46 #include "FGJSBBase.h"
47 #include "FGFDMExec.h"
48 #include "input_output/FGPropertyManager.h"
50 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
52 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
54 #define ID_TRANSMISSION "$Id: FGTransmission.h,v 1.1 2012/02/25 14:37:02 jentron Exp $"
56 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
58 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
62 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
64 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
66 /** Utility class that handles power transmission in conjunction with FGRotor.
68 This class provides brake, clutch and free-wheel-unit (FWU) functionality
69 for the rotor model. Also it is responsible for the RPM calculations.
71 When the engine is off the brake could be used to slow/hold down a spinning
72 rotor. The maximum brake power is defined in the rotors' config file.
73 (Right now there is no checking if the input is in the [0..1] range.)
75 The clutch operation is based on a heuristic approach. In the intermediate
76 state the transfer is proportional to the clutch position. But equal RPM
77 values are enforced on the thruster and rotor sides when approaching the
80 The FWU inhibits that the rotor is driving the engine. To do so, the code
81 just predicts the upcoming FWU state based on current torque conditions.
83 Some engines won't work properly when the clutch is open. To keep them
84 controllable some load must be provided on the engine side (EngineFriction,
85 aka gear-loss). See the notes under 'Engine issues' in FGRotor.
87 <h3>Property tree</h3>
89 The following properties are created (with x = your thruster number):
91 propulsion/engine[x]/brake-ctrl-norm
92 propulsion/engine[x]/free-wheel-transmission
93 propulsion/engine[x]/clutch-ctrl-norm
99 <li> EngineFriction is assumed constant, so better orientate at low RPM
100 values, because piston and turboprop engines don't 'like' high
101 load at startup.</li>
102 <li> The model doesn't support backward operation.</li>
103 <li> And even worse, the torque calculations silently assume a minimal
104 RPM value of approx. 1.</li>
110 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
112 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
114 class FGTransmission : public FGJSBBase {
117 /** Constructor for FGTransmission.
118 @param exec a pointer to the main executive object
119 @param num the number of the thruster that uses this object
120 @param dt simulation delta T */
121 FGTransmission(FGFDMExec *exec, int num, double dt);
123 /// Destructor for FGTransmission
126 void Calculate(double EnginePower, double ThrusterTorque, double dt);
128 void SetMaxBrakePower(double x) {MaxBrakePower=x;}
129 double GetMaxBrakePower() const {return MaxBrakePower;}
130 void SetEngineFriction(double x) {EngineFriction=x;}
131 double GetEngineFriction() const {return EngineFriction;}
132 void SetEngineMoment(double x) {EngineMoment=x;}
133 double GetEngineMoment() const {return EngineMoment;}
134 void SetThrusterMoment(double x) {ThrusterMoment=x;}
135 double GetThrusterMoment() const {return ThrusterMoment;}
137 double GetFreeWheelTransmission() const {return FreeWheelTransmission;}
138 void SetEngineRPM(double x) {EngineRPM=x;}
139 double GetEngineRPM() {return EngineRPM;}
140 void SetThrusterRPM(double x) {ThrusterRPM=x;}
141 double GetThrusterRPM() {return ThrusterRPM;}
143 double GetBrakeCtrlNorm() const {return BrakeCtrlNorm;}
144 void SetBrakeCtrlNorm(double x) {BrakeCtrlNorm=x;}
145 double GetClutchCtrlNorm() const {return ClutchCtrlNorm;}
146 void SetClutchCtrlNorm(double x) {ClutchCtrlNorm=x;}
149 bool BindModel(int num);
150 void Debug(int from);
152 inline double omega_to_rpm(double w) {
153 return w * 9.54929658551372014613302580235; // omega/(2.0*PI) * 60.0
155 inline double rpm_to_omega(double r) {
156 return r * 0.104719755119659774615421446109; // (rpm/60.0)*2.0*PI
160 double FreeWheelTransmission; // state, 0: free, 1:locked
162 double ThrusterMoment;
163 double EngineMoment; // estimated MOI of gear and engine, influences acceleration
164 double EngineFriction; // estimated friction in gear and possibly engine
166 double ClutchCtrlNorm;
167 double BrakeCtrlNorm;
168 double MaxBrakePower;
172 FGPropertyManager* PropertyManager;
177 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%