1
0
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:
Moon Horse
2022-06-16 15:16:39 +03:00
parent a3013808d1
commit 83747c8138

View File

@@ -36,6 +36,8 @@ function TRAIN_SYSTEM:Initialize(parameters)
-- Pressure in trains brake line
self.BrakeLinePressure = 0.0 -- atm
self.EPKPressure = 0.0 -- atm
-- Pressure in train's auxiliary line
self.AuxiliaryLinePressure = 8.0 -- atm
-- Pressure in brake cylinder
self.BrakeCylinderPressure = 0.0 -- atm
-- Pressure in the door line
@@ -45,6 +47,9 @@ function TRAIN_SYSTEM:Initialize(parameters)
-- Air distrubutor part
self.WorkingChamberPressure = 0.0
-- Disconnected KM 334 vessels (trainline and brakeline parts between disconnect valve and KM itself) emulation
self.TLDisconnectPressure = 0.0
self.BLDisconnectPressure = 0.0
--self.AirDistributorReady = false --заменено на локальные
--self.OverchargeReleaseValve = false --переменные
self.WCChargeValve = true
@@ -158,7 +163,7 @@ end
function TRAIN_SYSTEM:Outputs()
return { "BrakeLinePressure", "BrakeCylinderPressure", "DriverValvePosition",
"ReservoirPressure", "TrainLinePressure", "DoorLinePressure", "WeightLoadRatio", "WorkingChamberPressure" }
"ReservoirPressure", "TrainLinePressure", "DoorLinePressure", "WeightLoadRatio", "WorkingChamberPressure", "AuxiliaryLinePressure" }
end
function TRAIN_SYSTEM:TriggerInput(name,value)
@@ -305,14 +310,37 @@ function TRAIN_SYSTEM:equalizePressure(dT,pressure,target,rate,fill_rate,no_limi
-- Update pressure
self[pressure] = self[pressure] + 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.."_dPdT"] = (self[pressure.."_dPdT"] or 0) + dPdT
if no_limit ~= true then
if self[pressure] == 0.0 then self[pressure.."_dPdT"] = 0 end
if no_limit ~= true then --помудрить с лимитом. Рефакторить функцию для возможности эквализации в ноль, но до лимита
if self[pressure] == 0.0 then self[pressure.."_dPdT"] = 0 end --чтобы темп разрядки-зарядки не зависел от рампы
if self[pressure] == 16.0 then self[pressure.."_dPdT"] = 0 end
end
return dPdT
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)
local Train = self.Train
@@ -327,6 +355,7 @@ function TRAIN_SYSTEM:Think(dT)
self.BrakeCylinderPressure_dPdT = 0.0
self.ParkingBrakePressure_dPdT = 0.0
self.WorkingChamberPressure_dPdT = 0.0
self.AuxiliaryLinePressure_dPdT = 0.0
local rnd = math.random(1,10)
local offs = 0.1
@@ -350,20 +379,27 @@ function TRAIN_SYSTEM:Think(dT)
self.BLDisconnect = Train.DriverValveBLDisconnect.Value > 0
self.TLDisconnect = Train.DriverValveTLDisconnect.Value > 0 and self.RealDriverValvePosition ~= 3
pr_speed = 1*wagc--*((self.BrakeLinePressure-self.ReservoirPressure)/0.6) --2
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
-- 334: 1 Fill reservoir from train line, fill brake line from train line
if (self.RealDriverValvePosition == 1) then
if self.TLDisconnect or self.ReservoirPressure > self.TrainLinePressure then
self:equalizePressure(dT,"ReservoirPressure", self.TrainLinePressure, 1.55,nil,nil,2)
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
self:equalizePressure(dT,"BrakeLinePressure", self.TrainLinePressure, pr_speed,nil,nil,2)
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
else
self:equalizePressure(dT,"ReservoirPressure", self.TLDisconnectPressure, 3.55,nil,nil,2)
end
end
end
--возможно, надо модифицировать функцию equalizePressure() для возможности ограниченной разрядки (то есть, в закрытую емкость), либо одновременно раз-
--ряжать одну емкость и заряжать другую с разными скоростями, имитируя разные объемы
-- 334: 2 Brake line, reservoir replenished from brake line reductor
if (self.RealDriverValvePosition == 2) then
if self.TLDisconnect or self.ReservoirPressure > self.TrainToBrakeReducedPressure*1.05 then
if self.TLDisconnect then
local a = 1
if self.EmergencyValve or Train.EmergencyBrakeValve.Value > 0.5 then a = 1.85 end
if self.BLDisconnect then
@@ -410,11 +446,28 @@ function TRAIN_SYSTEM:Think(dT)
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
--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)
else
--Train:SetPackedRatio("ReservoirPressure_dPdT",0)
end
end
if not self.TLDisconnect then
self.TLDisconnectPressure = math.max(0,self.TLDisconnectPressure - math.abs(self.ReservoirPressure_dPdT)*dT)
end
self.ReservoirPressure_dPdT = self.ReservoirPressure_dPdT + self.BrakeLinePressure_dPdT*0.2
Train:SetPackedRatio("ReservoirPressure_dPdT",self.ReservoirPressure_dPdT/wagc*2)
--[[
---------------debug---------------------
self.dlreadtimer = self.dlreadtimer or CurTime()
if CurTime() - self.dlreadtimer > 1.0 then
self.dlreadtimer = CurTime()
if Train:GetDriver() then
PrintMessage(HUD_PRINTTALK, Format("Вагон %u; P ТМ: %.3f; P УР =%.3f; Утечка ТМ %.3f; TLDis = %.3f; pr_speed = %.3f",Train:GetWagonNumber(),self.BrakeLinePressure,self.ReservoirPressure,self.BrakeLinePressure_dPdT, self.TLDisconnectPressure, pr_speed))
end
end
---------------debug---------------------]]
trainLineConsumption_dPdT = trainLineConsumption_dPdT + math.max(0,self.BrakeLinePressure_dPdT)
trainLineConsumption_dPdT = trainLineConsumption_dPdT + math.max(0,self.ReservoirPressure_dPdT)*0.05
else
@@ -563,6 +616,9 @@ function TRAIN_SYSTEM:Think(dT)
elseif self.PN2 > 0.0 then
self.PN2 = self.BrakeCylinderPressure > 0.4 and 0.2 or self.PN2 - 0.5*dT
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
self.OldBrakeLinePressure = self.BrakeLinePressure
@@ -576,6 +632,19 @@ function TRAIN_SYSTEM:Think(dT)
local br334_upper_threshold = bl_diff > 0 and 3.6 or 3.08
WcBl = self.BrakeLinePressure < 3.12 and 0.45*(self.WorkingChamberPressure - 2.2) or self.BrakeLinePressure > br334_upper_threshold and self.BrakeLinePressure*1.02--1.06
end
--[[
---------------debug---------------------
self.brreadtimer = self.brreadtimer or CurTime()
if CurTime() - self.brreadtimer > 1.0 then
self.brreadtimer = CurTime()
if Train:GetDriver() then
--PrintMessage(HUD_PRINTTALK, Format("br_threshold = %.3f; WcBl = %s",br_threshold, tostring(WcBl)))
PrintMessage(HUD_PRINTTALK, Format("Это %s", isLVZ and "ЛВЗ" or "не ЛВЗ"))
end
end
---------------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
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
@@ -585,6 +654,7 @@ function TRAIN_SYSTEM:Think(dT)
self.BrakeCylinderValve = 0
end
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)
end
trainLineConsumption_dPdT = trainLineConsumption_dPdT + math.max(0,self.BrakeCylinderPressure_dPdT*0.5)
@@ -627,6 +697,10 @@ function TRAIN_SYSTEM:Think(dT)
-- Simulate cross-feed between different wagons
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
self.Compressor = Train.KK.Value * (Train.Electric.Aux750V > 550 and 1 or 0)