43#include "FGTransmission.h"
54 FreeWheelTransmission(1.0),
55 ThrusterMoment(1.0), EngineMoment(1.0), EngineFriction(0.0),
56 ClutchCtrlNorm(1.0), BrakeCtrlNorm(0.0), MaxBrakePower(0.0),
57 EngineRPM(0.0), ThrusterRPM(0.0)
60 FreeWheelLag =
Filter(200.0,dt);
61 BindModel(num, PropertyManager.get());
73void FGTransmission::Calculate(
double EnginePower,
double ThrusterTorque,
double dt) {
75 double coupling = 1.0, coupling_sq = 1.0;
78 double d_omega = 0.0, engine_d_omega = 0.0, thruster_d_omega = 0.0;
80 double engine_omega = rpm_to_omega(EngineRPM);
81 double safe_engine_omega = engine_omega < 1e-1 ? 1e-1 : engine_omega;
82 double engine_torque = EnginePower / safe_engine_omega;
84 double thruster_omega = rpm_to_omega(ThrusterRPM);
85 double safe_thruster_omega = thruster_omega < 1e-1 ? 1e-1 : thruster_omega;
87 engine_torque -= EngineFriction / safe_engine_omega;
88 ThrusterTorque +=
Constrain(0.0, BrakeCtrlNorm, 1.0) * MaxBrakePower / safe_thruster_omega;
91 engine_d_omega = engine_torque/EngineMoment * dt;
92 thruster_d_omega = - ThrusterTorque/ThrusterMoment * dt;
94 if ( thruster_omega+thruster_d_omega > engine_omega+engine_d_omega ) {
96 FreeWheelTransmission = 0.0;
98 FreeWheelTransmission = 1.0;
101 fw_mult = FreeWheelLag.execute(FreeWheelTransmission);
102 coupling = fw_mult *
Constrain(0.0, ClutchCtrlNorm, 1.0);
104 if (coupling < 0.999999) {
107 (engine_torque - ThrusterTorque*coupling)/(ThrusterMoment*coupling + EngineMoment) * dt;
109 (engine_torque*coupling - ThrusterTorque)/(ThrusterMoment + EngineMoment*coupling) * dt;
111 EngineRPM += omega_to_rpm(engine_d_omega);
112 ThrusterRPM += omega_to_rpm(thruster_d_omega);
115 coupling_sq = coupling*coupling;
116 EngineRPM = (1.0-coupling_sq) * EngineRPM + coupling_sq * 0.02 * (49.0*EngineRPM + ThrusterRPM);
117 ThrusterRPM = (1.0-coupling_sq) * ThrusterRPM + coupling_sq * 0.02 * (EngineRPM + 49.0*ThrusterRPM);
120 if ( fabs(EngineRPM-ThrusterRPM) < 1e-3 ) {
121 EngineRPM = ThrusterRPM = 0.5 * (EngineRPM+ThrusterRPM);
124 d_omega = (engine_torque - ThrusterTorque)/(ThrusterMoment + EngineMoment) * dt;
125 EngineRPM = ThrusterRPM += omega_to_rpm(d_omega);
129 if (EngineRPM < 0.0 ) EngineRPM = 0.0;
130 if (ThrusterRPM < 0.0 ) ThrusterRPM = 0.0;
136bool FGTransmission::BindModel(
int num, FGPropertyManager* PropertyManager)
138 string property_name, base_property_name;
139 base_property_name = CreateIndexedPropertyName(
"propulsion/engine", num);
141 property_name = base_property_name +
"/brake-ctrl-norm";
142 PropertyManager->Tie( property_name.c_str(),
this,
143 &FGTransmission::GetBrakeCtrlNorm, &FGTransmission::SetBrakeCtrlNorm);
145 property_name = base_property_name +
"/clutch-ctrl-norm";
146 PropertyManager->Tie( property_name.c_str(),
this,
147 &FGTransmission::GetClutchCtrlNorm, &FGTransmission::SetClutchCtrlNorm);
149 property_name = base_property_name +
"/free-wheel-transmission";
150 PropertyManager->Tie( property_name.c_str(),
this,
151 &FGTransmission::GetFreeWheelTransmission);
175void FGTransmission::Debug(
int from)
177 if (debug_lvl <= 0)
return;
183 if (debug_lvl & 2 ) {
184 FGLogging log(LogLevel::DEBUG);
185 if (from == 0) log <<
"Instantiated: FGTransmission\n";
186 if (from == 1) log <<
"Destroyed: FGTransmission\n";
188 if (debug_lvl & 4 ) {
190 if (debug_lvl & 8 ) {
192 if (debug_lvl & 16) {
194 if (debug_lvl & 64) {
Encapsulates the JSBSim simulation executive.
std::shared_ptr< FGPropertyManager > GetPropertyManager(void) const
Returns a pointer to the property manager object.
First order, (low pass / lag) filter.
static constexpr double Constrain(double min, double value, double max)
Constrain a value between a minimum and a maximum value.
FGTransmission(FGFDMExec *exec, int num, double dt)
Constructor for FGTransmission.
~FGTransmission()
Destructor for FGTransmission.
Main namespace for the JSBSim Flight Dynamics Model.