From 83747c8138ac14cebeaf07989fe2e56b79c73cc2 Mon Sep 17 00:00:00 2001 From: Moon Horse Date: Thu, 16 Jun 2022 15:16:39 +0300 Subject: [PATCH] hotfixed some 334 features with respect to the last comment --- .../systems/sys_81_717_pneumatic.lua | 88 +++++++++++++++++-- 1 file changed, 81 insertions(+), 7 deletions(-) diff --git a/lua/metrostroi/systems/sys_81_717_pneumatic.lua b/lua/metrostroi/systems/sys_81_717_pneumatic.lua index 0257fa9..3883ae1 100644 --- a/lua/metrostroi/systems/sys_81_717_pneumatic.lua +++ b/lua/metrostroi/systems/sys_81_717_pneumatic.lua @@ -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)