From bb43f559e8ede590142d5383e4686e8d3d563f6c Mon Sep 17 00:00:00 2001
From: pwarszawski
Date: Mon, 2 Nov 2026 17:01:21 +0100
Subject: [PATCH] ESt3: spring preload, minimum stage, releaser time and AL2
timing
Corrections to the TNESt3 distributor, checked against the ESt3 data
and acceptance requirements (orange book tables 3-5, 3-7 and 3-9) and
discussed with youBy:
- The main control device settles at (control reservoir - pipe - 0.21)
times the ratio instead of using a 0.05 bar offset. The 0.21 bar is the
spring preload; without it the first stage came 0.2 bar of pipe drop
too early. BVM is derived from the same offset, so a full service drop
still gives MaxBP.
- When the valve brakes it gives at least the minimum stage of 0.28 bar
(acceptance tests 12 and 22 require 0.25-0.30 bar); when the target
drops to zero the cylinder vents completely.
- The automatic releaser vents the 15 l control reservoir from 5.0 to
0.4 bar in about 23 s (test 27: 23 +/- 3 s) instead of 5.6 s.
- 12" cylinder fill nozzle dTN is 1.62, not 1.65 (typo).
- With the AL2 relay the impulse chamber is 1 l and the cylinder nozzles
are scaled so that the fill and release times meet table 3-9; before,
the AL2 timings had been set by eye.
On a valve test bench running the acceptance procedures, the number of
results out of tolerance drops from 77 to 40. The remaining ones need
parts that are not modelled yet (accelerator venting, ZP/ZS filling,
intermediate chamber).
---
McZapkie/Oerlikon_ESt.cpp | 44 +++++++++++++++++++++++++++++----------
McZapkie/Oerlikon_ESt.h | 1 +
2 files changed, 34 insertions(+), 11 deletions(-)
diff --git a/McZapkie/Oerlikon_ESt.cpp b/McZapkie/Oerlikon_ESt.cpp
index eb3a9ad4b..f37dc69f9 100644
--- a/McZapkie/Oerlikon_ESt.cpp
+++ b/McZapkie/Oerlikon_ESt.cpp
@@ -16,6 +16,11 @@ Copyright (C) 2007-2014 Maciej Cierniak
#include "Oerlikon_ESt.h"
#include "utilities/utilities.h"
+// wstepny nacisk sprezyn na glowny przyrzad rozrzadczy, wyrazony jako roznica cisnien ZS - PG [bar]
+static double const dPSprezyny = 0.21;
+// najmniejszy stopien hamowania w cylindrze [bar] (tablica 3-9, proby 12 i 22: 0,25-0,30)
+static double const pStopnia = 0.28;
+
double d2A( double const d )
{
return d * d * 0.7854 / 1000.0;
@@ -218,10 +223,11 @@ double TNESt3::GetPF( double const PP, double const dt, double const Vel ) // pr
CheckReleaser(dt);
// luzowanie
+ double const cel{ CelBCP( CVP, VVP ) };
if ((BrakeStatus & b_hld) == b_off)
dV =
PF(0.0, BCP, Nozzles[dTO] * nastG + (1.0 - nastG) * Nozzles[dOO])
- * dt * (0.1 + 4.9 * std::min(0.2, BCP - ((CVP - 0.05 - VVP) * BVM + 0.1)));
+ * dt * (0.1 + 4.9 * std::min(0.2, BCP - (cel > 0.0 ? cel + 0.1 : 0.0))); // bez stopnia luzuje do zera
else
dV = 0.0;
// BrakeCyl.Flow(-dV);
@@ -229,7 +235,7 @@ double TNESt3::GetPF( double const PP, double const dt, double const Vel ) // pr
if ( (BrakeStatus & b_on) == b_on && Przekladniki[1]->P() * HBG300 < MaxBP )
dV =
PF( BVP, BCP, Nozzles[dTN] * (nastG + 2.0 * (BCP < Podskok ? 1.0 : 0.0)) + Nozzles[dON] * (1.0 - nastG) )
- * dt * (0.1 + 4.9 * std::min( 0.2, (CVP - 0.05 - VVP) * BVM - BCP ) );
+ * dt * (0.1 + 4.9 * std::min( 0.2, cel - BCP ) );
else
dV = 0;
// BrakeCyl.Flow(-dV);
@@ -313,7 +319,7 @@ void TNESt3::Init( double const PP, double const HPP, double const LPP, double c
Miedzypoj->CreateCap(5.0);
Miedzypoj->CreatePress(PP);
- BVM = 1.0 / (HPP - 0.05 - LPP) * MaxBP;
+ BVM = 1.0 / (HPP - dPSprezyny - LPP) * MaxBP;
BrakeDelayFlag = BDF;
@@ -345,6 +351,13 @@ double TNESt3::GetCRP()
// return Miedzypoj.P;
}
+double TNESt3::CelBCP( double const CVP, double const VVP ) const // docelowe cisnienie w cylindrze
+{
+ double const cel{ ( CVP - dPSprezyny - VVP ) * BVM };
+ // gdy zawor hamuje, nie daje mniej niz najmniejszy stopien
+ return ( cel > 0.0 ? std::max( cel, pStopnia ) : cel );
+}
+
void TNESt3::CheckState(double const BCP, double & /*dV1*/) // glowny przyrzad rozrzadczy
{
double const VVP{ ValveRes->P() };
@@ -355,14 +368,14 @@ void TNESt3::CheckState(double const BCP, double & /*dV1*/) // glowny przyrzad r
Przys_blok = false;
// sprawdzanie stanu
- // if ((BrakeStatus and 1)=1)and(BCP>0.25)then
- if (VVP + 0.01 + BCP / BVM < CVP - 0.05 && Przys_blok)
+ double const cel{ CelBCP( CVP, VVP ) };
+ if (BCP < cel - 0.01 * BVM && Przys_blok)
BrakeStatus |= b_on | b_hld; // hamowanie stopniowe;
- else if (VVP - 0.01 + (BCP - 0.1) / BVM > CVP - 0.05)
+ else if (BCP - 0.1 > cel + 0.01 * BVM)
BrakeStatus &= ~( b_on | b_hld ); // luzowanie;
- else if (VVP + BCP / BVM > CVP - 0.05)
+ else if (BCP > cel)
BrakeStatus &= ~b_on; // zatrzymanie napelaniania;
- else if (VVP + (BCP - 0.1) / BVM < CVP - 0.05 && BCP > 0.25) // zatrzymanie luzowania
+ else if (BCP - 0.1 < cel && BCP > 0.25) // zatrzymanie luzowania
BrakeStatus |= b_hld;
if( ( BrakeStatus & b_hld ) == 0 )
@@ -391,7 +404,7 @@ void TNESt3::CheckReleaser(double const dt) // odluzniacz
// odluzniacz automatyczny
if ((BrakeStatus & b_rls) == b_rls)
{
- CntrlRes->Flow(PF(CVP, 0, 0.02) * dt);
+ CntrlRes->Flow(PF(CVP, 0, 0.0049) * dt); // ZS 15 l z 5,0 do 0,4 bar w 23 s (proba odbioru nr 27)
if (CVP < VVP + 0.3 || false == autom)
BrakeStatus &= ~b_rls;
}
@@ -560,7 +573,7 @@ void TNESt3::SetSize( int const size, std::string const ¶ms ) // ustawianie
{ // dON,dOO,dTN,dTO,dP,dS
Nozzles[dON] = 3.7;
Nozzles[dOO] = 2.50;
- Nozzles[dTN] = 1.65;
+ Nozzles[dTN] = 1.62;
Nozzles[dTO] = 1.39;
Nozzles[dP] = 2.65;
Nozzles[dPd] = 1.80;
@@ -649,6 +662,14 @@ void TNESt3::SetSize( int const size, std::string const ¶ms ) // ustawianie
Nozzles[dSd] = 1.1;
Nozzles[dSm] = 0.9;
+ if( PrzekCiagly != nullptr ) {
+ // dysze cylindra skalibrowane na komore impulsowa przekladnika AL2 (1 l) wg czasow z tablicy 3-9
+ Nozzles[dON] *= 0.914;
+ Nozzles[dTN] *= 0.885;
+ Nozzles[dOO] *= 0.82;
+ Nozzles[dTO] *= 0.8;
+ }
+
// przeliczanie z mm^2 na l/m
for (auto &nozzle : Nozzles)
{
@@ -657,7 +678,8 @@ void TNESt3::SetSize( int const size, std::string const ¶ms ) // ustawianie
for (int i = 1; i < 4; ++i)
{
Przekladniki[i]->BrakeRes = BrakeRes;
- Przekladniki[i]->CreateCap(i);
+ // komora impulsowa przekladnika AL2 ma 1 l
+ Przekladniki[i]->CreateCap( ( Przekladniki[i] == PrzekCiagly ) ? 1.0 : i );
Przekladniki[i]->CreatePress(BrakeCyl->P());
if (i < 3)
Przekladniki[i]->Next = Przekladniki[i + 1];
diff --git a/McZapkie/Oerlikon_ESt.h b/McZapkie/Oerlikon_ESt.h
index 9cdffe7bc..01aefb7f2 100644
--- a/McZapkie/Oerlikon_ESt.h
+++ b/McZapkie/Oerlikon_ESt.h
@@ -196,6 +196,7 @@ class TNESt3 : public TBrake {
void EStParams(double i_crc) const; // parametry charakterystyczne dla ESt
double GetCRP() override;
double GetRapidRatio(double const Vel) const override;
+ double CelBCP(double const CVP, double const VVP) const; // docelowe cisnienie w cylindrze
void CheckState(double const BCP, double &dV1); // glowny przyrzad rozrzadczy
void CheckReleaser(double const dt); // odluzniacz
double CVs(double const BP) const; // napelniacz sterujacego