mirror of
https://github.com/metrostroi-repo/MetrostroiAddon.git
synced 2026-05-02 00:42:29 +00:00
hotfixed some 334 features with respect to the last comment
This commit is contained in:
@@ -36,8 +36,6 @@ function TRAIN_SYSTEM:Initialize(parameters)
|
|||||||
-- Pressure in trains brake line
|
-- Pressure in trains brake line
|
||||||
self.BrakeLinePressure = 0.0 -- atm
|
self.BrakeLinePressure = 0.0 -- atm
|
||||||
self.EPKPressure = 0.0 -- atm
|
self.EPKPressure = 0.0 -- atm
|
||||||
-- Pressure in train's auxiliary line
|
|
||||||
self.AuxiliaryLinePressure = 8.0 -- atm
|
|
||||||
-- Pressure in brake cylinder
|
-- Pressure in brake cylinder
|
||||||
self.BrakeCylinderPressure = 0.0 -- atm
|
self.BrakeCylinderPressure = 0.0 -- atm
|
||||||
-- Pressure in the door line
|
-- Pressure in the door line
|
||||||
@@ -163,7 +161,7 @@ end
|
|||||||
|
|
||||||
function TRAIN_SYSTEM:Outputs()
|
function TRAIN_SYSTEM:Outputs()
|
||||||
return { "BrakeLinePressure", "BrakeCylinderPressure", "DriverValvePosition",
|
return { "BrakeLinePressure", "BrakeCylinderPressure", "DriverValvePosition",
|
||||||
"ReservoirPressure", "TrainLinePressure", "DoorLinePressure", "WeightLoadRatio", "WorkingChamberPressure", "AuxiliaryLinePressure" }
|
"ReservoirPressure", "TrainLinePressure", "DoorLinePressure", "WeightLoadRatio", "WorkingChamberPressure" }
|
||||||
end
|
end
|
||||||
|
|
||||||
function TRAIN_SYSTEM:TriggerInput(name,value)
|
function TRAIN_SYSTEM:TriggerInput(name,value)
|
||||||
@@ -313,34 +311,13 @@ function TRAIN_SYSTEM:equalizePressure(dT,pressure,target,rate,fill_rate,no_limi
|
|||||||
--self[pressure] = math.Approach(self[pressure], target, dT * dPdT)
|
--self[pressure] = math.Approach(self[pressure], target, dT * dPdT)
|
||||||
self[pressure] = math.max(0.0,math.min(16.0,self[pressure]))
|
self[pressure] = math.max(0.0,math.min(16.0,self[pressure]))
|
||||||
self[pressure.."_dPdT"] = (self[pressure.."_dPdT"] or 0) + dPdT
|
self[pressure.."_dPdT"] = (self[pressure.."_dPdT"] or 0) + dPdT
|
||||||
if no_limit ~= true then --помудрить с лимитом. Рефакторить функцию для возможности эквализации в ноль, но до лимита
|
if no_limit ~= true then
|
||||||
if self[pressure] == 0.0 then self[pressure.."_dPdT"] = 0 end --чтобы темп разрядки-зарядки не зависел от рампы
|
if self[pressure] == 0.0 then self[pressure.."_dPdT"] = 0 end
|
||||||
if self[pressure] == 16.0 then self[pressure.."_dPdT"] = 0 end
|
if self[pressure] == 16.0 then self[pressure.."_dPdT"] = 0 end
|
||||||
end
|
end
|
||||||
return dPdT
|
return dPdT
|
||||||
end
|
end
|
||||||
|
|
||||||
--[[function TRAIN_SYSTEM:equalizePressure(dT,pressure,target,rate,fill_rate,lo_limit,smooth,hi_limit)
|
|
||||||
if fill_rate and (target > self[pressure]) then rate = fill_rate end
|
|
||||||
|
|
||||||
-- Calculate derivative
|
|
||||||
local dPdT = rate
|
|
||||||
if target < self[pressure] then dPdT = -dPdT end
|
|
||||||
--if (hi_limit and self[pressure] >= hi_limit - 0.2) or (lo_limit and self[pressure] <= lo_limit + 0.2) then target = self[pressure] end
|
|
||||||
if hi_limit and self[pressure] >= hi_limit - 0.2 and target > self[pressure] then taret = hi_limit end
|
|
||||||
if lo_limit and self[pressure] <= lo_limit + 0.2 and target < self[pressure] then taret = lo_limit end
|
|
||||||
local dPdTramp = math.min(1.0,math.abs(target - self[pressure])*(smooth or 0.5))
|
|
||||||
dPdT = dPdT*dPdTramp
|
|
||||||
|
|
||||||
-- Update pressure
|
|
||||||
self[pressure] = self[pressure] + dT * dPdT
|
|
||||||
self[pressure] = math.max(tonumber(lo_limit) and lo_limit or 0.0, math.min(tonumber(hi_limit) and hi_limit or 16.0,self[pressure]))
|
|
||||||
self[pressure.."_dPdT"] = (self[pressure.."_dPdT"] or 0) + dPdT
|
|
||||||
if self[pressure] == 0.0 then self[pressure.."_dPdT"] = 0 end
|
|
||||||
if self[pressure] == 16.0 then self[pressure.."_dPdT"] = 0 end
|
|
||||||
return dPdT
|
|
||||||
end]]
|
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
function TRAIN_SYSTEM:Think(dT)
|
function TRAIN_SYSTEM:Think(dT)
|
||||||
local Train = self.Train
|
local Train = self.Train
|
||||||
@@ -355,7 +332,6 @@ function TRAIN_SYSTEM:Think(dT)
|
|||||||
self.BrakeCylinderPressure_dPdT = 0.0
|
self.BrakeCylinderPressure_dPdT = 0.0
|
||||||
self.ParkingBrakePressure_dPdT = 0.0
|
self.ParkingBrakePressure_dPdT = 0.0
|
||||||
self.WorkingChamberPressure_dPdT = 0.0
|
self.WorkingChamberPressure_dPdT = 0.0
|
||||||
self.AuxiliaryLinePressure_dPdT = 0.0
|
|
||||||
|
|
||||||
local rnd = math.random(1,10)
|
local rnd = math.random(1,10)
|
||||||
local offs = 0.1
|
local offs = 0.1
|
||||||
@@ -378,14 +354,12 @@ function TRAIN_SYSTEM:Think(dT)
|
|||||||
if self.ValveType == 1 then
|
if self.ValveType == 1 then
|
||||||
self.BLDisconnect = Train.DriverValveBLDisconnect.Value > 0
|
self.BLDisconnect = Train.DriverValveBLDisconnect.Value > 0
|
||||||
self.TLDisconnect = Train.DriverValveTLDisconnect.Value > 0 and self.RealDriverValvePosition ~= 3
|
self.TLDisconnect = Train.DriverValveTLDisconnect.Value > 0 and self.RealDriverValvePosition ~= 3
|
||||||
pr_speed = 1*wagc--*((self.BrakeLinePressure-self.ReservoirPressure)/0.6) --2
|
pr_speed = 1*wagc
|
||||||
if self.TLDisconnect then self.TLDisconnectPressure = self.TrainLinePressure end
|
if self.TLDisconnect then self.TLDisconnectPressure = self.TrainLinePressure end
|
||||||
--if self.BLDisconnect then self.BLDisconnectPressure = self.BrakeLinePressure end
|
|
||||||
if self.Leak or self.BrakeLineOpen then pr_speed = pr_speed*0.3 end
|
if self.Leak or self.BrakeLineOpen then pr_speed = pr_speed*0.3 end
|
||||||
-- 334: 1 Fill reservoir from train line, fill brake line from train line
|
-- 334: 1 Fill reservoir from train line, fill brake line from train line
|
||||||
if (self.RealDriverValvePosition == 1) then
|
if (self.RealDriverValvePosition == 1) then
|
||||||
if self.TLDisconnect or self.ReservoirPressure ~= self.TLDisconnectPressure then
|
if self.TLDisconnect or self.ReservoirPressure ~= self.TLDisconnectPressure then
|
||||||
--self:equalizePressure(dT,"ReservoirPressure", self.TLDisconnectPressure, 1.55,nil,nil,2)--1.55
|
|
||||||
if self.BLDisconnect then
|
if self.BLDisconnect then
|
||||||
self.ReservoirPressure = self.BrakeLinePressure
|
self.ReservoirPressure = self.BrakeLinePressure
|
||||||
self:equalizePressure(dT,"BrakeLinePressure", self.TLDisconnectPressure, pr_speed*(pr_speed < wagc and 1 or 1.35),nil,nil,2)--0.7
|
self:equalizePressure(dT,"BrakeLinePressure", self.TLDisconnectPressure, pr_speed*(pr_speed < wagc and 1 or 1.35),nil,nil,2)--0.7
|
||||||
@@ -394,8 +368,6 @@ function TRAIN_SYSTEM:Think(dT)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
--возможно, надо модифицировать функцию equalizePressure() для возможности ограниченной разрядки (то есть, в закрытую емкость), либо одновременно раз-
|
|
||||||
--ряжать одну емкость и заряжать другую с разными скоростями, имитируя разные объемы
|
|
||||||
|
|
||||||
-- 334: 2 Brake line, reservoir replenished from brake line reductor
|
-- 334: 2 Brake line, reservoir replenished from brake line reductor
|
||||||
if (self.RealDriverValvePosition == 2) then
|
if (self.RealDriverValvePosition == 2) then
|
||||||
@@ -446,10 +418,8 @@ function TRAIN_SYSTEM:Think(dT)
|
|||||||
end
|
end
|
||||||
if _a > 0 then pr_speed = pr_speed*0.1 end
|
if _a > 0 then pr_speed = pr_speed*0.1 end
|
||||||
if self.BLDisconnect and self.BrakeLinePressure - self.ReservoirPressure > (self.RealDriverValvePosition == 3 and 0 or self.RealDriverValvePosition == 4 and 0.2 or 100) then --0.2 bar is a piston sensitivity
|
if self.BLDisconnect and self.BrakeLinePressure - self.ReservoirPressure > (self.RealDriverValvePosition == 3 and 0 or self.RealDriverValvePosition == 4 and 0.2 or 100) then --0.2 bar is a piston sensitivity
|
||||||
--Train:SetPackedRatio("ReservoirPressure_dPdT",self:equalizePressure(dT, "BrakeLinePressure", 0, pr_speed*math.abs(self.BrakeLinePressure - self.ReservoirPressure), nil, nil, 6)/wagc*2)
|
|
||||||
self:equalizePressure(dT, "BrakeLinePressure", 0, pr_speed*math.abs(self.BrakeLinePressure - self.ReservoirPressure), nil, nil, 6)
|
self:equalizePressure(dT, "BrakeLinePressure", 0, pr_speed*math.abs(self.BrakeLinePressure - self.ReservoirPressure), nil, nil, 6)
|
||||||
else
|
else
|
||||||
--Train:SetPackedRatio("ReservoirPressure_dPdT",0)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -572,7 +542,6 @@ function TRAIN_SYSTEM:Think(dT)
|
|||||||
|
|
||||||
local leak = 0
|
local leak = 0
|
||||||
if Train.EmergencyBrakeValve and Train.EmergencyBrakeValve.Value > 0.5 then
|
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,1)
|
leak = self:equalizePressure(dT,"BrakeLinePressure", 0.0,(1.1*wagc)*2,false,false,1)
|
||||||
self.Leak = true
|
self.Leak = true
|
||||||
end
|
end
|
||||||
@@ -582,16 +551,13 @@ function TRAIN_SYSTEM:Think(dT)
|
|||||||
if self.WCChargeValve == true then
|
if self.WCChargeValve == true then
|
||||||
self:equalizePressure(dT,"WorkingChamberPressure",self.BrakeLinePressure,0.107,nil,nil,1.0) --simulate 0.8mm hole btw BL and working chambers
|
self:equalizePressure(dT,"WorkingChamberPressure",self.BrakeLinePressure,0.107,nil,nil,1.0) --simulate 0.8mm hole btw BL and working chambers
|
||||||
end
|
end
|
||||||
--self.AirDistributorReady = self.WorkingChamberPressure >= 2.2
|
|
||||||
local aird_ready = 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.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
|
local KLSZ = self.WorkingChamberPressure > 5.2 and not self.WCChargeValve
|
||||||
if KLSZ then
|
if KLSZ then
|
||||||
self:equalizePressure(dT,"WorkingChamberPressure",0.0,0.22) -- КЛСЗ
|
self:equalizePressure(dT,"WorkingChamberPressure",0.0,0.22) -- КЛСЗ
|
||||||
end
|
end
|
||||||
|
|
||||||
--trainLineConsumption_dPdT = trainLineConsumption_dPdT + math.max(0,self.WorkingChamberPressure_dPdT*0.2)
|
|
||||||
local _offset2 = self.Train.AR63 and 2.5 or 2.4
|
local _offset2 = self.Train.AR63 and 2.5 or 2.4
|
||||||
self.GN2Offset = self.GN2Offset or math.random(20,100)*0.002 + _offset2
|
self.GN2Offset = self.GN2Offset or math.random(20,100)*0.002 + _offset2
|
||||||
local _offset1 = self.Train.AR63 and 0.9 or 0.8
|
local _offset1 = self.Train.AR63 and 0.9 or 0.8
|
||||||
@@ -617,8 +583,6 @@ function TRAIN_SYSTEM:Think(dT)
|
|||||||
self.PN2 = self.BrakeCylinderPressure > 0.4 and 0.2 or self.PN2 - 0.5*dT
|
self.PN2 = self.BrakeCylinderPressure > 0.4 and 0.2 or self.PN2 - 0.5*dT
|
||||||
end
|
end
|
||||||
--уставки зависят от типа крана машиниста
|
--уставки зависят от типа крана машиниста
|
||||||
--local br334_upper_threshold = self.BrakeLinePressure_dPdT > 0 and 3.6 or 3.08 --такой вариант работает только для вагона, из которого управляют тормозами
|
|
||||||
--local br013_upper_threshold = self.BrakeLinePressure_dPdT > 0 and 3.7 or 3.08
|
|
||||||
local bl_diff = self.BrakeLinePressure - self.OldBrakeLinePressure
|
local bl_diff = self.BrakeLinePressure - self.OldBrakeLinePressure
|
||||||
self.OldBrakeLinePressure = self.BrakeLinePressure
|
self.OldBrakeLinePressure = self.BrakeLinePressure
|
||||||
|
|
||||||
@@ -644,7 +608,6 @@ function TRAIN_SYSTEM:Think(dT)
|
|||||||
end
|
end
|
||||||
---------------debug---------------------]]
|
---------------debug---------------------]]
|
||||||
|
|
||||||
--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
|
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))
|
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
|
if math.abs(self.BrakeCylinderPressure - targetPressure) > 0.150 then
|
||||||
@@ -654,7 +617,6 @@ function TRAIN_SYSTEM:Think(dT)
|
|||||||
self.BrakeCylinderValve = 0
|
self.BrakeCylinderValve = 0
|
||||||
end
|
end
|
||||||
if self.BrakeCylinderValve == 1 then
|
if self.BrakeCylinderValve == 1 then
|
||||||
--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)
|
self:equalizePressure(dT,"BrakeCylinderPressure", math.min(self.GN2Offset + self.WeightLoadRatio*1.3,targetPressure), 1, 3.5, nil, 1)
|
||||||
end
|
end
|
||||||
trainLineConsumption_dPdT = trainLineConsumption_dPdT + math.max(0,self.BrakeCylinderPressure_dPdT*0.5)
|
trainLineConsumption_dPdT = trainLineConsumption_dPdT + math.max(0,self.BrakeCylinderPressure_dPdT*0.5)
|
||||||
@@ -697,10 +659,6 @@ function TRAIN_SYSTEM:Think(dT)
|
|||||||
-- Simulate cross-feed between different wagons
|
-- Simulate cross-feed between different wagons
|
||||||
self:UpdatePressures(Train,dT)
|
self:UpdatePressures(Train,dT)
|
||||||
|
|
||||||
-- Simulate air pressure drop while the horn is engaged
|
|
||||||
local horny = self.Train:GetNW2Bool("HornState",false)
|
|
||||||
self:equalizePressure(dT,"AuxiliaryLinePressure", horny and math.max(0,self.TrainLinePressure - 0.3) or self.TrainLinePressure, 22) --was 12
|
|
||||||
self.TrainLinePressure = self.TrainLinePressure - (horny and 0.012 or 0)
|
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
-- Simulate compressor operation and train line depletion
|
-- Simulate compressor operation and train line depletion
|
||||||
self.Compressor = Train.KK.Value * (Train.Electric.Aux750V > 550 and 1 or 0)
|
self.Compressor = Train.KK.Value * (Train.Electric.Aux750V > 550 and 1 or 0)
|
||||||
|
|||||||
Reference in New Issue
Block a user