@@ -43,6 +43,15 @@ function TRAIN_SYSTEM:Initialize(parameters)
self.OldBrakeLinePressure = 0.0
self.BCPressure = 0
-- Air distrubutor part
self.WorkingChamberPressure = 0.0
--self.AirDistributorReady = false --заменено на локальные
--self.OverchargeReleaseValve = false --переменные
self.WCChargeValve = true
self.PN1 = 0
self.PN2 = 0
self.cranPres = 0
--DKPT
self.Train : LoadSystem ( " DKPT " , " Relay " , " R-52B " ) --
-- Valve #1
@@ -73,8 +82,11 @@ function TRAIN_SYSTEM:Initialize(parameters)
self.Train : LoadSystem ( " EmergencyBrakeValve " , " Relay " , " Switch " )
-- Воздухораспределитель
self.Train : LoadSystem ( " AirDistributorDisconnect " , " Relay " , " Switch " )
--Срывной клапан
self.Train : LoadSystem ( " AutostopValve " , " Relay " , " Switch " )
--У А В А
self.Train : LoadSystem ( " UAVA " , " Relay " , " Switch " , { bass = true } )
--self.Train:LoadSystem("UAVAContact","Relay","Switch")
self.Train : LoadSystem ( " UAVAC " , " Relay " , " " , { normally_closed = true , bass = true } )
--Стояночный тормоз
self.Train : LoadSystem ( " ParkingBrake " , " Relay " , " Switch " , { bass = true } )
@@ -143,7 +155,7 @@ end
function TRAIN_SYSTEM : Outputs ( )
return { " BrakeLinePressure " , " BrakeCylinderPressure " , " DriverValvePosition " ,
" ReservoirPressure " , " TrainLinePressure " , " DoorLinePressure " , " WeightLoadRatio " }
" ReservoirPressure " , " TrainLinePressure " , " DoorLinePressure " , " WeightLoadRatio " , " WorkingChamberPressure " }
end
function TRAIN_SYSTEM : TriggerInput ( name , value )
@@ -166,8 +178,13 @@ function TRAIN_SYSTEM:TriggerInput(name,value)
local HaveUAVA = not self.Train . SubwayTrain or not self.Train . SubwayTrain.ARS or not self.Train . SubwayTrain.ARS . NoUAVA
if HaveUAVA and self.Train . UAVA.Value == 0 then
self.EmergencyValve = true
self.Train . UAVAC : TriggerInput ( " Set " , 0 )
if value > 0 then RunConsoleCommand ( " say " , " Autostop braking " , self.Train : GetDriverName ( ) ) end
if value ~= 2 then
self.Train . UAVAC : TriggerInput ( " Set " , 0 )
if not self.Train . AutoStopNotify then
self.Train . AutoStopNotify = true
RunConsoleCommand ( " say " , " Autostop braking " , self.Train : GetDriverName ( ) )
end
end
end
end
end
@@ -297,7 +314,7 @@ end
function TRAIN_SYSTEM : Think ( dT )
local Train = self.Train
self.WeightLoadRatio = math.max ( 0 , math.min ( 1 , ( Train : GetNW2Float ( " PassengerCount " ) / 200 ) ) )
--self.WeightLoadRatio = (Train.R_ZS and Train.R_ZS.Value > 0 and 0.5 or 0) + (Train.R_G and Train.R_G.Value > 0 and 0.5 or 0)
----------------------------------------------------------------------------
-- Accumulate derivatives
self.TrainLinePressure_dPdT = 0.0
@@ -306,9 +323,14 @@ function TRAIN_SYSTEM:Think(dT)
self.ReservoirPressure_dPdT = 0.0
self.BrakeCylinderPressure_dPdT = 0.0
self.ParkingBrakePressure_dPdT = 0.0
self.WorkingChamberPressure_dPdT = 0.0
local rnd = math.random ( 1 , 10 )
local offs = 0.1
self.KM013offset = self.KM013offset or math.Clamp ( 5.1 + ( rnd >= 3 and rnd <= 7 and offs or - offs ) , 5.0 , 5.2 )
-- Reduce pressure for brake line
self.TrainToBrakeReducedPressure = math.min ( 5.1 , self.TrainLinePressure ) -- * 0.725)
self.TrainToBrakeReducedPressure = math.min ( self.KM013offset , self.TrainLinePressure ) -- * 0.725)
-- Feed pressure to door line
self.DoorLinePressure = self.TrainToBrakeReducedPressure * 0.90
local trainLineConsumption_dPdT = 0.0
@@ -316,6 +338,11 @@ function TRAIN_SYSTEM:Think(dT)
local HaveEPK = not Train.SubwayTrain or not Train.SubwayTrain . ARS or not Train.SubwayTrain . ARS.NoEPK
local BLDisconnect , pr_speed = true , 1
-- работа срывного клапана
if Train.AutostopValve . Value > 0 then
self : TriggerInput ( " Autostop " , self.BrakeLinePressure > 1.86 and 1 or 2 ) --value == 2 — просто открыть срывной клапан без размыкания контактов У А В А
end
if self.ValveType == 1 then
BLDisconnect = Train.DriverValveBLDisconnect . Value > 0
local TLDisconnect = Train.DriverValveTLDisconnect . Value > 0
@@ -368,42 +395,42 @@ function TRAIN_SYSTEM:Think(dT)
trainLineConsumption_dPdT = trainLineConsumption_dPdT + math.max ( 0 , self.ReservoirPressure_dPdT ) * 0.05
else
pr_speed = 1.25 * wagc --2
if self.Leak or self.Brai eLineOpen then pr_speed = pr_speed * 0.7 end
if self.Leak or self.Brak eLineOpen then pr_speed = pr_speed * 0.7 end
BLDisconnect = self.DisconnectType and Train.DriverValveBLDisconnect . Value > 0 or Train.DriverValveDisconnect . Value > 0
local TLDisconnect = self.DisconnectType and Train.DriverValveTLDisconnect . Value > 0 or Train.DriverValveDisconnect . Value > 0
-- 013: 1 Overcharge
if ( self.RealDriverValvePosition == 1 ) and BLDisconnect and ( TLDisconnect or self.BrakeLinePressure > self.TrainLinePressure ) then
self : equalizePressure ( dT , " BrakeLinePressure " , math.min ( 6.0 , self.TrainLinePressure ) , pr_speed )
self : equalizePressure ( dT , " BrakeLinePressure " , math.min ( 6.4 , self.TrainLinePressure ) , pr_speed , Train.EPKC . Value == 0 and Train.EPK . Value > 0 and pr_speed * 2.2 or pr_speed * 0.35 , nil , 1.0 )
end
-- 013: 2 Normal pressure
if ( self.RealDriverValvePosition == 2 ) and BLDisconnect and ( TLDisconnect or self.BrakeLinePressure > 1.01 * math.min ( 5.1 , self.TrainToBrakeReducedPressure ) ) then
self : equalizePressure ( dT , " BrakeLinePressure " , 1.01 * math.min ( 5.1 , self.TrainToBrakeReducedPressure ) , pr_speed , nil , nil , 1.0 ) -- nil, 1.0)
if ( self.RealDriverValvePosition == 2 ) and BLDisconnect and ( TLDisconnect or self.BrakeLinePressure > 1.01 * math.min ( self.KM013offset , self.TrainToBrakeReducedPressure ) ) then
self : equalizePressure ( dT , " BrakeLinePressure " , 1.01 * math.min ( self.KM013offset , self.TrainToBrakeReducedPressure ) , pr_speed , Train.EPKC . Value == 0 and Train.EPK . Value > 0 and pr_speed * 2 or pr_speed * 0.35 , nil , 1.0 ) -- nil, 1.0)
end
-- 013: 3 4.3 Atm
if ( self.RealDriverValvePosition == 3 ) and BLDisconnect and ( TLDisconnect or self.BrakeLinePressure > 1.01 * math.min ( 4.3 , self.TrainToBrakeReducedPressure ) ) then
self : equalizePressure ( dT , " BrakeLinePressure " , 1.01 * math.min ( 4.3 , self.TrainToBrakeReducedPressure ) , pr_speed , nil , nil , 1.0 )
self : equalizePressure ( dT , " BrakeLinePressure " , 1.01 * math.min ( 4.3 , self.TrainToBrakeReducedPressure ) , pr_speed , pr_speed * 0.35 , nil , 1.0 )
end
-- 013: 4 4.0 Atm
if ( self.RealDriverValvePosition == 4 ) and BLDisconnect and ( TLDisconnect or self.BrakeLinePressure > 1.01 * math.min ( 4.0 , self.TrainToBrakeReducedPressure ) ) then
self : equalizePressure ( dT , " BrakeLinePressure " , 1.01 * math.min ( 4.0 , self.TrainToBrakeReducedPressure ) , pr_speed , nil , nil , 1.0 )
self : equalizePressure ( dT , " BrakeLinePressure " , 1.01 * math.min ( 4.0 , self.TrainToBrakeReducedPressure ) , pr_speed , pr_speed * 0.35 , nil , 1.0 )
end
-- 013: 5 3.7 Atm
if ( self.RealDriverValvePosition == 5 ) and BLDisconnect and ( TLDisconnect or self.BrakeLinePressure > 1.01 * math.min ( 3.7 , self.TrainToBrakeReducedPressure ) ) then
self : equalizePressure ( dT , " BrakeLinePressure " , 1.01 * math.min ( 3.7 , self.TrainToBrakeReducedPressure ) , pr_speed , nil , nil , 1.0 )
self : equalizePressure ( dT , " BrakeLinePressure " , 1.01 * math.min ( 3.7 , self.TrainToBrakeReducedPressure ) , pr_speed , pr_speed * 0.35 , nil , 1.0 )
end
-- 013: 6 3.0 Atm
if ( self.RealDriverValvePosition == 6 ) and BLDisconnect and ( TLDisconnect or self.BrakeLinePressure > 1.01 * math.min ( 3.0 , self.TrainToBrakeReducedPressure ) ) then
self : equalizePressure ( dT , " BrakeLinePressure " , 1.01 * math.min ( 3.0 , self.TrainToBrakeReducedPressure ) , pr_speed , nil , nil , 1.0 )
self : equalizePressure ( dT , " BrakeLinePressure " , 1.01 * math.min ( 3.0 , self.TrainToBrakeReducedPressure ) , pr_speed , pr_speed * 0.35 , nil , 1.0 )
end
-- 013: 7 0.0 Atm
if ( self.RealDriverValvePosition == 7 ) and BLDisconnect then
self : equalizePressure ( dT , " BrakeLinePressure " , 0.0 , pr_speed )
if ( self.RealDriverValvePosition == 7 ) and BLDisconnect and ( TLDisconnect or self.BrakeLinePressure > 0.0 ) then
self : equalizePressure ( dT , " BrakeLinePressure " , 0.0 , 0.6 + pr_speed * math.exp ( math.min ( 0 , self.BrakeLinePressure - 2.8 ) * 1.0 ) , pr_speed * 0.35 , nil , 1.0 )
end
trainLineConsumption_dPdT = trainLineConsumption_dPdT + math.max ( 0 , self.BrakeLinePressure_dPdT )
end
@@ -415,10 +442,10 @@ function TRAIN_SYSTEM:Think(dT)
local epkDiff = math.abs ( self.EPKPressure - self.BrakeLinePressure )
if BLDisconnect and Train.EPK . Value > 0 then
if Train.EPKC . Value > 0 then
self : equalizePressure ( dT , " EPKPressure " , self.BrakeLinePressure , math.min ( 1 , epkDiff ) * 6 --[[ pr_speed*math.min(1,epkDiff)*2--]] , false , false , 4 * epkDiff * 2 )
self : equalizePressure ( dT , " EPKPressure " , self.BrakeLinePressure , math.min ( 1 , epkDiff ) * 6 --[[ pr_speed*math.min(1,epkDiff)*2--]] , math.min ( 1 , epkDiff ) * 26 , false , 4 * epkDiff * 2 )
end
if self.EPKPressure < self.BrakeLinePressure and math.abs ( self.EPKPressure - self.BrakeLinePressure ) > 0.3 then
leak = self : equalizePressure ( dT , " BrakeLinePressure " , self.EPKPressure , pr_speed * epkDiff / 2 , pr_speed * epkDiff / 2 )
leak = self : equalizePressure ( dT , " BrakeLinePressure " , self.EPKPressure , pr_speed * epkDiff / 1.28 , pr_speed * epkDiff / 1.28 )
--[[ if self.ValveType==1 then
leak = self:equalizePressure(dT,"ReservoirPressure", self.EPKPressure,epkDiff/2,epkDiff/2)
end--]]
@@ -438,22 +465,23 @@ function TRAIN_SYSTEM:Think(dT)
else
Train : SetPackedRatio ( " Crane_dPdT " , self.BrakeLinePressure_dPdT / wagc * 3 )
end
if self.EmergencyValveDisable and ( self.BrakeLinePressure- self.OldBrakeLinePressure) > 0.01 then
if self.EmergencyValveDisable then --and ( self.BrakeLinePressure- self.OldBrakeLinePressure)> 0.01 then
self.EmergencyValveDisable = false
self.EmergencyValve = false
Train.AutoStopNotify = false
end
self.OldBrakeLinePressure = self.BrakeLinePressure
local leak = 0
if self.EmergencyValve then
local leakst = 1.1 * ( Train : GetWagonCount ( ) ) * math.Clamp ( self.BrakeLinePressure / 4 , 0 , 1 )
leak = self : equalizePressure ( dT , " BrakeLinePressure " , 0.0 , leakst * 2 , false , false , 0.4 )
if ( leak >= - 0.2 * ( Train : GetWagonCount ( ) ) or Train.UAVA . Value > 0 ) then
local leakst = BLDisconnect and math.max ( 0.3 , math.log ( self.BrakeLinePressure , 1.2 ) - 2.5 ) or math.max ( 1.6 , math.log ( 0.63 * self.BrakeLinePressure , 1.15 ) )
leak = self : equalizePressure ( dT , " BrakeLinePressure " , 0.0 , leakst * wagc / 6 ) --,false,false,10 )
if Train.UAVA . Value > 0 or ( self.BrakeLinePressure < 1.8 and Train.AutostopValve . Value == 0 ) then --пока держим ЛКМ нажатой, срывной клапан открыт
self.EmergencyValveDisable = true
end
self.Leak = true
end
local UAVABlocked = ( self.BrakeLinePressure > 3.5 and Train.UAVA . Value == 0 )
local UAVABlocked = ( self.BrakeLinePressure > 1.8 and Train.UAVA . Value == 0 )
if ( Train.UAVA . Blocked > 0 ) ~= UAVABlocked then
Train.UAVA : TriggerInput ( " Block " , UAVABlocked and 1 or 0 )
end
@@ -463,48 +491,58 @@ function TRAIN_SYSTEM:Think(dT)
Train.UAVAC : TriggerInput ( " Block " , UAVACBlocked and 1 or 0 )
end
Train : SetPackedRatio ( " EmergencyValve_dPdT " , - leak / wagc )
Train : SetPackedRatio ( " EmergencyValve_dPdT " , - 1.8 * leak / wagc ) --Регулировка свиста срывного клапана
local leak = 0
if Train.EmergencyBrakeValve and Train.EmergencyBrakeValve . Value > 0.5 then
--local leakst = (1.6*(Train:GetWagonCount())*(self.BrakeLinePressure-math.min(2.5,self.TrainToBrakeReducedPressure))*0.9)
leak = self : equalizePressure ( dT , " BrakeLinePressure " , 0.0 , ( 1.1 * wagc ) * 2 , false , false , 0.4 )
leak = self : equalizePressure ( dT , " BrakeLinePressure " , 0.0 , ( 1.1 * wagc ) * 2 , false , false , 1 )
self.Leak = true
end
Train : SetPackedRatio ( " EmergencyBrakeValve_dPdT " , - leak / wagc )
----------------------------------------------------------------------------
-- Fill brake cylinders
if Train.AirDistributorDisconnect . Valu e == 0 then
if self.WCCharge Valv e == true then
self : equalizePressure ( dT , " WorkingChamberPressure " , self.BrakeLinePressure , 0.107 , nil , nil , 1.0 ) --simulate 0.8mm hole btw BL and working chambers
end
--self.AirDistributorReady = self.WorkingChamberPressure >= 2.2
local aird_ready = self.WorkingChamberPressure >= 2.2
self.WCChargeValve = not ( ( self.WorkingChamberPressure - self.BrakeLinePressure ) > 0.2 and ( self.WorkingChamberPressure - self.BrakeLinePressure ) < 2.5 )
--self.OverchargeReleaseValve = self.WorkingChamberPressure > 5.2 and not self.WCChargeValve
local KLSZ = self.WorkingChamberPressure > 5.2 and not self.WCChargeValve
if KLSZ then
self : equalizePressure ( dT , " WorkingChamberPressure " , 0.0 , 0.22 ) -- КЛСЗ
end
--trainLineConsumption_dPdT = trainLineConsumption_dPdT + math.max(0,self.WorkingChamberPressure_dPdT*0.2)
local _offset2 = self.Train . AR63 and 2.5 or 2.4
self.GN2Offset = self.GN2Offset or math.random ( 20 , 100 ) * 0.002 + _offset2
local _offset1 = self.Train . AR63 and 0.9 or 0.8
self.GN1Offset = self.GN1Offset or math.random ( 20 , 100 ) * 0.002 + _offset1
self.BcBl = ( self.GN2Offset + self.WeightLoadRatio * 1.3 ) / 1.93
if Train.AirDistributorDisconnect . Value == 0 and aird_ready then
-- Valve #1
self.BrakeCylinderRegulationError = self.BrakeCylinderRegulationError or ( math.random ( ) * 0.05 - 0.025 )
local error = self.BrakeCylinderRegulationError
if ( Train.PneumaticNo1 . Value == 1.0 ) and ( Train.PneumaticNo2 . Value == 0.0 ) then
if self.PN1 == 0 then
--1,2
self.PN1 = math.min ( self.TrainLinePressure , ( 1.1 + error + self.WeightLoadRatio * 0.6 ) )
if self.PN1 < self.GN1Offset then
self.PN1 = math.min ( self.TrainLinePressure , self.GN1Offset )
end
elseif self.PN1 ~= 0 then
self.PN1 = 0
elseif Train.PneumaticNo1 . Value == 0 and self.PN1 > 0. 0 then
self.PN1 = math.max ( 0 , self.PN1 - math.exp ( 3.6 * ( self.BrakeCylinderPressure - self.GN1Offset ) ) * 1.7 * dT )
end
-- Valve #2
if Train.PneumaticNo2 . Value == 1.0 then
if self.PN2 == 0 then
self.PN2 = math.min ( self.T rainLinePressure , ( 2.7 + error + self.WeightLoadRatio * 1.3 ) )
if self.BePN2 == false and self.BrakeCylinderPressure > 1.6 then
Train : PlayOnce ( " PN2end " , " stop " )
end
self.BePN2 = true
self.PN2 = math.min ( self.TrainLinePressure , ( self.GN2Offset + self.WeightLoadRatio * 1.3 ) )
if self.Be PN2 == false and self.B rakeCylinderPressure > 1.6 then
Train : PlayOnce ( " PN2end " , " stop " )
end
elseif self.PN2 ~ = 0 then
self.PN2 = 0
self.Be PN2 = true
elseif self.PN2 > 0.0 then
self.PN2 = self.BrakeCylinderPressure > 0.4 and 0.2 or self.PN2 - 0.5 * dT
end
local targetPres = math.max ( 0 , math.min ( 5.2 , --[[ 1.5--]] 1.35 * ( math.min ( 5.1 , self.T rainToBrakeReducedPressure ) - self.BrakeLinePressure ) ) )
if self.BCPressure < targetPres then
self.BCPressure = math.min ( targetPres , self.BCPressure + ( 0.5 + math.max ( 0 , ( targetPres - self.BCPressure ) - 0.2 ) * 0.6 ) * dT )
elseif self.BCPressure > targetPres then
self.BCPressure = math.max ( targetPres , self.BCPressure - 2 * dT )
end
local targetPressure = self.PN1 + self.PN2 + self.BCPressure
local WcBl = ( self.BrakeLinePressure < 3.55 and 0.45 * ( self.WorkingChamberPressure - 2.2 ) or self.B rakeLinePressure > 3.65 and self.BrakeLinePressure * ( self.BrakeLinePressure > 4.5 and self.BrakeLinePressure_dPdT > 0.02 and 1.06 or 1 ) )
--self.cranPres = WcBl and math.max(0,math.min(self.GN2Offset + self.WeightLoadRatio*1.3,self.BcBl*(self.WorkingChamberPressure - WcBl)*(self.BrakeLinePressure > self.KM013offset and 0.6 or 1))) or self.cranPres
self.cranPres = WcBl and math.max ( 0 , self.BcBl * ( self.WorkingChamberPressure - WcBl ) * ( self.BrakeLinePressure > self.KM013offset and ( 0.56 + self.PN1 * 0.43 ) or 1 ) ) or self.cranPres
local targetPressure = math.max ( 0 , math.min ( self.GN2Offset + self.WeightLoadRatio * 1.3 , ( self.cranPres < ( self.PN1 + self.WeightLoadRatio * 0.7 ) and ( Train.PneumaticNo1 . Value == 1.0 ) and ( self.PN1 + self.WeightLoadRatio * 0.7 ) or self.PN1 ) + self.PN2 + self.cranPres ) )
if math.abs ( self.BrakeCylinderPressure - targetPressure ) > 0.150 then
self.BrakeCylinderValve = 1
end
@@ -512,11 +550,13 @@ function TRAIN_SYSTEM:Think(dT)
self.BrakeCylinderValve = 0
end
if self.BrakeCylinderValve == 1 then
self: equalizePressure( dT , " BrakeCylinderPressure" , math.min ( 2.7 + self.WeightLoadRatio* 1.3 , targetPressure) , 1 + math.Clamp ( ( self.BrakeCylinderPressure - 0.5 ) / 2.8 , 0 , 0.7 ) , 3.50 , nil , 0.8 + math.Clamp( ( self.BrakeCylinderPressure- 0.75 ) / 0.6 , 0 , 1 ) ) --0.75, 1.25 )
-- self: equalizePressure(dT," BrakeCylinderPressure", math.min(self.GN2Offset + self.WeightLoadRatio*1.3, targetPressure), 1, 3.5, nil, (self.BrakeLinePressure_dPdT > 0.02) and (0.9+ math.Clamp((1 - self.BrakeCylinderPressure)*0.9,0,1.8)) or 1 )
self : equalizePressure ( dT , " BrakeCylinderPressure " , math.min ( self.GN2Offset + self.WeightLoadRatio * 1.3 , targetPressure ) , 1 , 3.5 , nil , 1 )
end
trainLineConsumption_dPdT = trainLineConsumption_dPdT + math.max ( 0 , self.BrakeCylinderPressure_dPdT * 0.5 )
else
elseif Train.AirDistributorDisconnect . Value ~= 0 then
self : equalizePressure ( dT , " BrakeCylinderPressure " , 0.0 , 2.00 )
self : equalizePressure ( dT , " WorkingChamberPressure " , 0.0 , 2.00 ) --имитируем потягивание за тросик отпускного клапана
end
if ( self.BrakeCylinderPressure > 0.2 and self.BrakeCylinderPressure_dPdT > 0.1 or self.BrakeCylinderPressure_dPdT > 1 ) and not self.BrakeEngaged then
self.BrakeEngaged = true
@@ -562,7 +602,7 @@ function TRAIN_SYSTEM:Think(dT)
-- Overpressure
if self.TrainLinePressure > 9.2 then self.TrainLineOverpressureValve = 1 end
if self.TrainLineOverpressureValve == 1 then
self : equalizePressure ( dT , " TrainLinePressure " , 0.0 , 0.2 )
self : equalizePressure ( dT , " TrainLinePressure " , 0.0 , ( self.TrainLinePressure - ( self.Compressor == 1 and 6.5 or 4 ) ) * 0.6 ) --was 0.2
self.TrainLineOpen = true
if self.TrainLinePressure < 5.2 then self.TrainLineOverpressureValve = 0 end
end