Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- include "spairscheme.gs"
- class TEP70AirScheme isclass SPAirScheme
- {
- public int TB395State = 6;
- public float LB254State = 4.0;
- public bool B367State = false;
- public int B367CombinedValveState = 0; // -1 - connects bp with atm, 1 - normal, 0 - bp off
- public float BPAdditionalFlow = 0.0;
- // Values for sounds
- public float TB395MRtoBPFlowRate = 0.0;
- public float TB395ERReductorFlowRate = 0.0;
- public float TB395ERStabilizerFlowRate = 0.0;
- public float TB395ERtoAtmFlowRate = 0.0;
- public float TB395BPtoAtmFlowRate = 0.0;
- public float LB254FlowRate = 0.0;
- public float TB395ChargePressure = 500.0; // reductor setting
- public float TB395EqualizingChargeRate = 12.0;
- public float TB395EqualizingReductionRate = 13.0;
- public float TB395EqualizingThreshold = 4.0;
- public float TB395AdditChargeRateI = 4.0;
- public float TB395AdditReductionRateVI = 6.53;
- public float TB395ReleaseIIEqualizingPressureK = -3.375;
- public float TB395ReleaseIIEqualizingPressureB = 2187.5;
- public float TB395ChargeRate = Math.Rand(0.25, 0.334);
- public float TB395OverchargeReductionRate = Math.Rand(0.0034, 0.005); // stabilizer setting
- public float TB395ERDumpRateIII = 0.7;
- public float TB395ReductionRateVA = Math.Rand(0.05, 0.067);
- public float TB395ReductionRateV = Math.Rand(0.4, 0.417);
- public float TB395ReductionRateVI = 1.4;
- public SPAirNode ERNode = SPAirNodeStatic.New(500.0, 0.02);
- public float ERLeakPressureRate = Math.Rand(0.011, 0.044);
- public SPAirNode MRNode = SPAirNodeStatic.New(850.0, 1.04);
- public float MRLeakPressureRate = Math.Rand(0.125, 0.25);
- public bool CompressorState = false;
- public float CompressorFlowRate = 5.0;
- public SPAirNode BPNode;
- public SPAirNode FBCNode = SPAirNodeStatic.New(0.0, 0.020);
- public SPAirNode[] BCNodes;
- public bool LB254Repeater = true;
- public float LB254BufferPressure = 0.0;
- public bool LB254BufferRelease = false;
- public float LB254BufferPressureThreshold = 10.0;
- public float LB254BufferReleasePressureRate = Math.Rand(25.0, 35.0);
- public float LB254MinPressure = Math.Rand(30.0, 40.0);
- public float LB254PressureThreshold = 12.0;
- public float LB254PressureInitial = Math.Rand(100.0, 130.0);
- public float LB254PressureFull = Math.Rand(380.0, 400.0);
- public float LB254FeedRate = 0.04 * 350.0 / Math.Rand(3.0, 4.0);
- public float LB254ReleaseRate = 0.04 * 300.0 / Math.Rand(11.0, 13.0);
- public SPAirDistributor292_305 AD;
- public SPStandardAirBrakePipe BP;
- public SPStandardAirBrakePipe FP; // Feed Pipe -- питательная магистраль
- public SPStandardAirBrakeCylinder BC1;
- public SPStandardAirBrakeCylinder BC2;
- public SPWireState EPT;
- int bcUpdateFirstIndex = 0;
- public float B367CombinedValveReductionRate = 16.0;
- final float flowKBrakePipeEqualization(float dP)
- {
- if (dP > TB395EqualizingThreshold)
- return SPAirHelper.FlowSoft(dP - TB395EqualizingThreshold);
- else if (dP < -TB395EqualizingThreshold)
- return SPAirHelper.FlowSoft(dP + TB395EqualizingThreshold);
- return 0.0;
- }
- public void Update(float dt)
- {
- AD.Update(dt);
- BP.Update(dt);
- FP.Update(dt);
- BC1.Update(dt);
- BC2.Update(dt);
- BrakeForce = BC1.BrakeForce + BC2.BrakeForce;
- TB395MRtoBPFlowRate = 0.0;
- TB395ERReductorFlowRate = 0.0;
- TB395ERStabilizerFlowRate = 0.0;
- TB395ERtoAtmFlowRate = 0.0;
- TB395BPtoAtmFlowRate = 0.0;
- LB254FlowRate = 0.0;
- if (CompressorState)
- MRNode.Flow = MRNode.Flow + CompressorFlowRate * dt;
- // Train brake lever N 395
- if (B367State) {
- bool tbI = TB395State == 1;
- bool tbII = TB395State == 2;
- bool tbIII = TB395State == 3;
- bool tbIV = TB395State == 4;
- bool tbVA = TB395State == 51;
- bool tbV = TB395State == 5;
- bool tbVI = TB395State == 6;
- // tb er
- if (tbI) {
- TB395ERReductorFlowRate = TB395ChargeRate * SPAirHelper.FlowHard(MRNode.Pressure - ERNode.Pressure);
- float flow = TB395ERReductorFlowRate * dt;
- flow = SPAirHelper.FlowLimit(flow, MRNode.Pressure, MRNode.Volume, ERNode.Pressure, ERNode.Volume);
- ERNode.Flow = ERNode.Flow + flow;
- MRNode.Flow = MRNode.Flow - flow;
- }
- else if (tbII) {
- if (ERNode.Pressure < TB395ChargePressure) {
- TB395ERReductorFlowRate = TB395ChargeRate * SPAirHelper.FlowHard(MRNode.Pressure - ERNode.Pressure);
- float flow = TB395ERReductorFlowRate * dt;
- flow = SPAirHelper.FlowLimit(flow, MRNode.Pressure, MRNode.Volume, ERNode.Pressure, ERNode.Volume);
- ERNode.Flow = ERNode.Flow + flow;
- MRNode.Flow = MRNode.Flow - flow;
- }
- TB395ERStabilizerFlowRate = TB395OverchargeReductionRate * SPAirHelper.FlowHard(ERNode.Pressure);
- float flow = TB395ERStabilizerFlowRate * dt;
- flow = SPAirHelper.FlowLimit(flow, ERNode.Pressure, ERNode.Volume, 0.0);
- ERNode.Flow = ERNode.Flow - flow;
- }
- else if (tbIII) {
- if (ERNode.Pressure > BPNode.Pressure and B367CombinedValveState == 1) {
- float flow = TB395ERDumpRateIII * SPAirHelper.FlowHard(ERNode.Pressure - BPNode.Pressure) * dt;
- flow = SPAirHelper.FlowLimit(flow, ERNode.Pressure, ERNode.Volume, BPNode.Pressure, BPNode.Volume);
- BPNode.Flow = BPNode.Flow + flow;
- ERNode.Flow = ERNode.Flow - flow;
- }
- }
- else if (tbIV) {
- }
- else {
- if (tbVA)
- TB395ERtoAtmFlowRate = TB395ReductionRateVA * SPAirHelper.FlowHard(ERNode.Pressure);
- else if (tbV)
- TB395ERtoAtmFlowRate = TB395ReductionRateV * SPAirHelper.FlowHard(ERNode.Pressure);
- else if (tbVI)
- TB395ERtoAtmFlowRate = TB395ReductionRateVI * SPAirHelper.FlowHard(ERNode.Pressure);
- float flow = TB395ERtoAtmFlowRate * dt;
- flow = SPAirHelper.FlowLimit(flow, ERNode.Pressure, ERNode.Volume, 0.0);
- ERNode.Flow = ERNode.Flow - flow;
- }
- // equalizing relay
- if (B367CombinedValveState == 1) {
- float flowMrBp = 0.0;
- float flowBpAtm = 0.0;
- float equalizingPressure;
- if (tbI)
- equalizingPressure = MRNode.Pressure;
- else if (tbII) {
- float eqP = TB395ReleaseIIEqualizingPressureK * ERNode.Pressure + TB395ReleaseIIEqualizingPressureB;
- equalizingPressure = Math.Fmax(ERNode.Pressure, Math.Fmin(MRNode.Pressure, eqP));
- }
- else if (tbVI)
- equalizingPressure = 0.0;
- else
- equalizingPressure = Math.Fmin(ERNode.Pressure, MRNode.Pressure);
- float deltaEq = equalizingPressure - BPNode.Pressure;
- float flowK = flowKBrakePipeEqualization(deltaEq);
- float flowRateMrBp = TB395EqualizingChargeRate;
- if (tbI)
- flowRateMrBp = flowRateMrBp + TB395AdditChargeRateI;
- float flowRateBpAtm = TB395EqualizingReductionRate;
- if (tbVI)
- flowRateBpAtm = flowRateBpAtm + TB395AdditReductionRateVI;
- if (deltaEq > 0.0) {
- TB395MRtoBPFlowRate = flowRateMrBp * flowK;
- flowMrBp = TB395MRtoBPFlowRate * dt;
- }
- else if (deltaEq < 0.0) {
- TB395BPtoAtmFlowRate = flowRateBpAtm * (-flowK);
- flowBpAtm = TB395BPtoAtmFlowRate * dt;
- }
- //flowMrBp = SPAirHelper.FlowLimit(flowMrBp, BPNode.Pressure, BPNode.Volume, equalizingPressure);
- flowMrBp = SPAirHelper.FlowLimit(flowMrBp, MRNode.Pressure, MRNode.Volume, BPNode.Pressure, BPNode.Volume);
- //flowBpAtm = SPAirHelper.FlowLimit(flowBpAtm, BPNode.Pressure, BPNode.Volume, equalizingPressure);
- flowBpAtm = SPAirHelper.FlowLimit(flowBpAtm, BPNode.Pressure, BPNode.Volume, 0.0);
- BPNode.Flow = BPNode.Flow + flowMrBp - flowBpAtm;
- MRNode.Flow = MRNode.Flow - flowMrBp;
- }
- }
- if (B367CombinedValveState == -1) {
- TB395BPtoAtmFlowRate = B367CombinedValveReductionRate * SPAirHelper.FlowSoft(BPNode.Pressure);
- float flow = TB395BPtoAtmFlowRate * dt;
- flow = SPAirHelper.FlowLimit(flow, BPNode.Pressure, BPNode.Volume, 0.0);
- BPNode.Flow = BPNode.Flow - flow;
- }
- // Locomotive brake lever
- if (B367State) {
- if (!LB254BufferRelease)
- LB254BufferPressure = FBCNode.Pressure;
- float independentPressure = 0.0;
- if (LB254State > 1.0)
- independentPressure = (LB254PressureFull - LB254PressureInitial) / 3.0 * (LB254State - 1.0) + LB254PressureInitial;
- else if (LB254State > 0.0)
- independentPressure = LB254PressureInitial * LB254State;
- if (independentPressure < LB254MinPressure)
- independentPressure = 0.0;
- float bcTargetPressure = Math.Fmin(MRNode.Pressure, Math.Fmax(independentPressure, LB254BufferPressure));
- LB254FlowRate = 0.0;
- int bcIndex = bcUpdateFirstIndex;
- int bcCount = BCNodes.size();
- int i;
- for (i = 0; i < bcCount; ++i, bcIndex = (bcIndex + 1) % bcCount) {
- SPAirNode bc = BCNodes[bcIndex];
- float pressureDelta = bcTargetPressure - bc.Pressure;
- if (pressureDelta > LB254PressureThreshold) {
- LB254FlowRate = LB254FeedRate * SPAirHelper.FlowSoft(pressureDelta);
- float flow = LB254FlowRate * dt;
- //flow = SPAirHelper.FlowLimit(flow, MRNode.Pressure, MRNode.Volume, bc.Pressure, bc.Volume);
- bc.Flow = bc.Flow + flow;
- MRNode.Flow = MRNode.Flow - flow;
- }
- else if (pressureDelta < -LB254PressureThreshold) {
- LB254FlowRate = LB254ReleaseRate * SPAirHelper.FlowSoft(pressureDelta);
- float flow = LB254FlowRate * dt;
- //flow = SPAirHelper.FlowLimit(flow, bc.Pressure, bc.Volume, 0.0);
- bc.Flow = bc.Flow + flow;
- }
- else if (bcTargetPressure < LB254PressureThreshold) {
- LB254FlowRate = -LB254ReleaseRate * SPAirHelper.FlowSoft(bc.Pressure);
- float flow = LB254FlowRate * dt;
- //flow = SPAirHelper.FlowLimit(flow, bc.Pressure, bc.Volume, 0.0);
- bc.Flow = bc.Flow + flow;
- }
- }
- bcUpdateFirstIndex = bcIndex;
- }
- if (LB254Repeater) {
- if (LB254State == -1.0) {
- LB254BufferRelease = true;
- LB254BufferPressure = LB254BufferPressure - LB254BufferReleasePressureRate * SPAirHelper.FlowSoft(LB254BufferPressure) * dt;
- if (LB254BufferPressure < 0.0f)
- LB254BufferPressure = 0.0f;
- }
- else if (FBCNode.Pressure <= LB254BufferPressure + LB254BufferPressureThreshold)
- LB254BufferRelease = false;
- }
- ERNode.Flow = ERNode.Flow - ERLeakPressureRate * ERNode.Volume * SPAirHelper.FlowSoft(ERNode.Pressure) * dt;
- MRNode.Flow = MRNode.Flow - MRLeakPressureRate * MRNode.Volume * SPAirHelper.FlowSoft(MRNode.Pressure) * dt;
- BPNode.Flow = BPNode.Flow + BPAdditionalFlow;
- BPAdditionalFlow = 0.0;
- }
- public void UpdateFinalize()
- {
- inherited();
- BP.UpdateFinalize();
- FP.UpdateFinalize();
- AD.UpdateFinalize();
- BC1.UpdateFinalize();
- BC2.UpdateFinalize();
- ERNode.Update();
- MRNode.Update();
- FBCNode.Update();
- }
- public void Init(SPVehicle owner)
- {
- inherited(owner);
- BC1.Init(owner);
- BC2.Init(owner);
- BP.Init(owner);
- FP.Init(owner);
- AD.BCNode = FBCNode;
- AD.BPNode = BPNode = BP.Node;
- AD.Init(owner);
- BCNodes = new SPAirNode[2];
- BCNodes[0] = BC1.Node;
- BCNodes[1] = BC2.Node;
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement