From 63f322fa7bdd90d4351e21519c7c762931201861 Mon Sep 17 00:00:00 2001 From: Hirek193 Date: Thu, 10 Sep 2026 23:51:44 +0200 Subject: [PATCH] Remake engine voltage value calculation --- hardware/registry/state_registry.cpp | 4 +++ vehicle/Train.cpp | 52 +++++++++++++++++----------- vehicle/Train.h | 3 ++ 3 files changed, 38 insertions(+), 21 deletions(-) diff --git a/hardware/registry/state_registry.cpp b/hardware/registry/state_registry.cpp index 916a2af5..d4f44b0c 100644 --- a/hardware/registry/state_registry.cpp +++ b/hardware/registry/state_registry.cpp @@ -125,6 +125,10 @@ state_registry::state_registry() add( "hv_current_1", value_type::float32, "A", -5000.0, 5000.0, []( state_snapshot const &s ) { return make_value( s, value_type::float32, s.train.hv_current[ 0 ], s.electric ); } ); add( "hv_current_2", value_type::float32, "A", -5000.0, 5000.0, []( state_snapshot const &s ) { return make_value( s, value_type::float32, s.train.hv_current[ 1 ], s.electric ); } ); add( "hv_current_3", value_type::float32, "A", -5000.0, 5000.0, []( state_snapshot const &s ) { return make_value( s, value_type::float32, s.train.hv_current[ 2 ], s.electric ); } ); + // what the cab's engine voltage gauge shows: the supply voltage less the drop on the starting + // resistor, divided between the motor branches - and a current derived reading while the + // dynamic brake is applied, exactly as the needle in the cab behaves + add( "engine_voltage", value_type::float32, "V", 0.0, 40000.0, []( state_snapshot const &s ) { return make_value( s, value_type::float32, s.train.engine_voltage, s.electric ); } ); add( "lv_voltage", value_type::float32, "V", 0.0, 200.0, []( state_snapshot const &s ) { return make_value( s, value_type::float32, s.train.lv_voltage ); } ); add( "distance", value_type::float64, "m", {}, {}, []( state_snapshot const &s ) { return make_value( s, value_type::float64, s.train.distance ); } ); diff --git a/vehicle/Train.cpp b/vehicle/Train.cpp index 8d2117c4..f3c4f537 100644 --- a/vehicle/Train.cpp +++ b/vehicle/Train.cpp @@ -922,6 +922,35 @@ std::shared_ptr TTrain::GetTrainState(dictionary_source const return dict; } +// youBy - napiecie na silnikach +// liczone tutaj, a nie przy samym mierniku, zeby ten sam odczyt trafial rowniez do protokolu +// sprzetowego, takze w pojezdzie, ktorego model kabiny woltomierza silnikowego nie ma +double TTrain::get_engine_voltage() const +{ + if (mvControlled == nullptr) + { + return 0.0; + } + + if (true == mvControlled->DynamicBrakeFlag) + { + // przy hamowaniu oporowym ten sam miernik pokazuje prad silnikow, a nie napiecie + return std::abs(mvControlled->Im * 5); + } + + auto const &circuit = mvControlled->RList[mvControlled->MainCtrlActualPos]; + if ((circuit.Mn <= 0) || (std::abs(mvControlled->Im) <= 0)) + { + // bez pradu w obwodzie nie ma czego wskazywac + return 0.0; + } + + int const x = ((mvControlled->TrainType == dt_ET42) && (mvControlled->Imax == mvControlled->ImaxHi) ? 1 : 2); + + // napiecie zasilania pomniejszone o spadek na rozruszniku, rozlozone na galezie silnikow + return x * (std::abs(mvControlled->EngineVoltage) - circuit.R * std::abs(mvControlled->Im)) / circuit.Mn; +} + TTrain::state_t TTrain::get_state() const { @@ -953,6 +982,7 @@ TTrain::state_t TTrain::get_state() const static_cast(mvPantographUnit->PantPress), fHVoltage, {fHCurrent[mvControlled->TrainType & dt_EZT ? 0 : 1], fHCurrent[2], fHCurrent[3]}, + static_cast(get_engine_voltage()), ggLVoltage.GetValue(), mvOccupied->DistCounter, static_cast(RadioChannel()), @@ -8913,27 +8943,7 @@ bool TTrain::Update(double const Deltatime) // youBy - napiecie na silnikach if (ggEngineVoltage.SubModel) { - if (mvControlled->DynamicBrakeFlag) - { - ggEngineVoltage.UpdateValue(std::abs(mvControlled->Im * 5)); - } - else - { - int x; - if (mvControlled->TrainType == dt_ET42 && mvControlled->Imax == mvControlled->ImaxHi) - x = 1; - else - x = 2; - if (mvControlled->RList[mvControlled->MainCtrlActualPos].Mn > 0 && std::abs(mvControlled->Im) > 0) - { - ggEngineVoltage.UpdateValue(x * (std::abs(mvControlled->EngineVoltage) - mvControlled->RList[mvControlled->MainCtrlActualPos].R * std::abs(mvControlled->Im)) / - mvControlled->RList[mvControlled->MainCtrlActualPos].Mn); - } - else - { - ggEngineVoltage.UpdateValue(0); - } - } + ggEngineVoltage.UpdateValue(get_engine_voltage()); ggEngineVoltage.Update(); } diff --git a/vehicle/Train.h b/vehicle/Train.h index 7627bbf8..b90ff9f0 100644 --- a/vehicle/Train.h +++ b/vehicle/Train.h @@ -108,6 +108,7 @@ class TTrain { float pantograph_pressure; float hv_voltage; std::array hv_current; + float engine_voltage; float lv_voltage; double distance; std::uint8_t radio_channel; @@ -173,6 +174,8 @@ class TTrain { bool LoadMMediaFile(std::string const &asFileName); std::shared_ptr GetTrainState( dictionary_source const &Extraparameters ); state_t get_state() const; + // wskazanie woltomierza silnikowego; wspolne dla miernika w kabinie i protokolu sprzetowego + double get_engine_voltage() const; inline float get_radiovolume() const { return m_radiovolume; } // basic_table interface inline