1
0
mirror of https://github.com/metrostroi-repo/MetrostroiAddon.git synced 2026-05-02 00:42:29 +00:00

Trying to make a system for km334

This commit is contained in:
Moon Horse
2025-03-20 21:19:53 +03:00
parent c5c7f91f42
commit d4aabb6561
9 changed files with 283 additions and 204 deletions

View File

@@ -407,90 +407,16 @@ function TRAIN_SYSTEM:Think(dT)
if self.ValveType == 1 then
self.BLDisconnect = Train.DriverValveBLDisconnect.Value > 0
self.TLDisconnect = Train.DriverValveTLDisconnect.Value > 0 and self.RealDriverValvePosition ~= 3
pr_speed = 1*6--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.TLDisconnectPressure or self.ReservoirPressure ~= self.BLDisconnectPressure then
if self.BLDisconnect then
if self.TLDisconnect then
self:equalizePressure(dT,"ReservoirPressure", self.TLDisconnectPressure, 0, 1.0,nil,2)
self:equalizePressure(dT,"BrakeLinePressure", self.TLDisconnectPressure, 0, 6.0,nil,0.2)
end
if not self.TLDisconnect then
self:equalizePressure(dT,"TLDisconnectPressure", self.BrakeLinePressure, 16, 0,nil,2)
self:equalizePressure(dT,"ReservoirPressure", self.BrakeLinePressure, 0.4, 0.06,nil,2)
self:equalizePressure(dT,"BrakeLinePressure", self.ReservoirPressure, 6.5, 0,nil,0.2)
end
else
self:equalizePressure(dT,"ReservoirPressure", self.TLDisconnectPressure, 0, self.TLDisconnect and 3.55 or 2.0,nil,2)
self:equalizePressure(dT,"TLDisconnectPressure", self.ReservoirPressure, 16, 0,nil,2)
end
end
end
-- 334: 2 Brake line, reservoir replenished from brake line reductor
if (self.RealDriverValvePosition == 2) then
if self.TLDisconnect then
local a = 1
if self.EmergencyValve or Train.EmergencyBrakeValve.Value > 0.5 then a = 4 end
if self.BLDisconnect then
--self.ReservoirPressure = self.BrakeLinePressure
self:equalizePressure(dT,"ReservoirPressure", self.BrakeLinePressure,6,0.8,nil,2)
self:equalizePressure(dT,"BrakeLinePressure", self.TrainToBrakeReducedPressure, pr_speed*0, pr_speed*0.3*a, nil, 1.6)
self.ReservoirPressure_dPdT = self.BrakeLinePressure_dPdT*0.8
else
self:equalizePressure(dT,"ReservoirPressure", self.TrainToBrakeReducedPressure,0,1.55,nil,2)
end
end
end
-- 334: 3 Close all valves
if (self.RealDriverValvePosition == 3) then
-- Typical leak
self:equalizePressure(dT,"ReservoirPressure", 0.00, 0.001)
end
local res_dischrg_rate4 = 0.28
local res_dischrg_rate5 = self.BLDisconnect and 1.12 or 8
-- 334: 4 Reservoir open to atmosphere, brake line equalizes with reservoir
if (self.RealDriverValvePosition == 4) then
self:equalizePressure(dT,"ReservoirPressure", 0.0, res_dischrg_rate4, nil,nil,1)--0.35)-0.55
end
-- 334: 5 Reservoir and brake line open to atmosphere
if (self.RealDriverValvePosition == 5) then
self:equalizePressure(dT,"ReservoirPressure", 0.0, res_dischrg_rate5)--,nil,nil,2)--1.70
local pr_speed = 1.25*6--wagc
if self.Leak or self.BrakeLineOpen then pr_speed = pr_speed*0.3 end
if self.BLDisconnect then
if self.Leak then pr_speed = pr_speed*6.2 end
self:equalizePressure(dT,"BrakeLinePressure", 0.0, pr_speed,nil,nil,2)
end
end
-- утечка через неплотность уравнительного поршня
if self.BLDisconnect then self:equalizePressure(dT, "ReservoirPressure", self.BrakeLinePressure, 0.06, 0) end
if (self.RealDriverValvePosition > 1) and (self.RealDriverValvePosition < 5) then
local pr_speed = 1.25*6--wagc
if self.Leak or self.BrakeLineOpen then pr_speed = pr_speed*0.3 end
local _a = 0
for k,v in ipairs(Train.WagonList) do
if v.Pneumatic.TLDisconnect and v.Pneumatic.BLDisconnect and (v.Pneumatic.RealDriverValvePosition == 2 or v.Pneumatic.RealDriverValvePosition == 1) then
_a = _a + 1
end
if _a > 1 then break end
end
if _a > 1 then pr_speed = pr_speed*0.1 end
if self.BLDisconnect and self.BrakeLinePressure - self.ReservoirPressure > (self.RealDriverValvePosition == 3 and 0 or 0.2) then --0.2 bar is a piston sensitivity
self:equalizePressure(dT, "BrakeLinePressure", 0, pr_speed*math.abs(self.BrakeLinePressure - self.ReservoirPressure), nil, nil, 6)
end
end
self.ReservoirPressure_dPdT = self.ReservoirPressure_dPdT + self.BrakeLinePressure_dPdT*0.2
Train:SetPackedRatio("ReservoirPressure_dPdT",self.ReservoirPressure_dPdT/wagc*2)
Train.KM334:TriggerInput("InputPres",self.TrainLinePressure)
Train.KM334:TriggerInput("HandlePosition",self.RealDriverValvePosition)
Train.KM334:TriggerInput("ReduSetpoint",self.KM013offset)
Train.KM334:TriggerInput("TLineVol",420*Train:GetTLConnectedWagonCount())
Train.KM334:TriggerInput("BLineVol",29*wagc)
--Train.KM334:TriggerInput("EqResVol",self.ResevoirVolume)
Train.KM334:TriggerInput("ValvT",self.TLDisconnect and 1 or 0)
Train.KM334:TriggerInput("ValvB",self.BLDisconnect and 1 or 0)
self.BrakeLinePressure = self.BLDisconnect and Train.KM334.OutPres or self.BrakeLinePressure
--[[
---------------debug---------------------
self.dlreadtimer = self.dlreadtimer or CurTime()

View File

@@ -451,94 +451,16 @@ function TRAIN_SYSTEM:Think(dT)
if self.ValveType == 1 then
self.BLDisconnect = Train.DriverValveBLDisconnect.Value > 0
self.TLDisconnect = Train.DriverValveTLDisconnect.Value > 0 and self.RealDriverValvePosition ~= 3
pr_speed = 1*6--wagc--*((self.BrakeLinePressure-self.ReservoirPressure)/0.6)
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.TLDisconnectPressure or self.ReservoirPressure ~= self.BLDisconnectPressure then
if self.BLDisconnect then
if self.TLDisconnect then
self:equalizePressure(dT,"ReservoirPressure", self.TLDisconnectPressure, 0, 1.0,nil,2)
self:equalizePressure(dT,"BrakeLinePressure", self.TLDisconnectPressure, 0, 6.0,nil,0.2)
end
if not self.TLDisconnect then
self:equalizePressure(dT,"TLDisconnectPressure", self.BrakeLinePressure, 16, 0,nil,2)
self:equalizePressure(dT,"ReservoirPressure", self.BrakeLinePressure, 0.4, 0.06,nil,2)
self:equalizePressure(dT,"BrakeLinePressure", self.ReservoirPressure, 6.5, 0,nil,0.2)
end
--self:equalizePressure(dT,"BrakeLinePressure", self.TLDisconnectPressure, pr_speed*(pr_speed < wagc and 1 or 1.35),nil,nil,2)
else
self:equalizePressure(dT,"ReservoirPressure", self.TLDisconnectPressure, 0, self.TLDisconnect and 3.55 or 2.0,nil,2)
self:equalizePressure(dT,"TLDisconnectPressure", self.ReservoirPressure, 16, 0,nil,2)
end
end
end
-- 334: 2 Brake line, reservoir replenished from brake line reductor
if (self.RealDriverValvePosition == 2) then
if self.TLDisconnect then
local a = 1
if self.EmergencyValve or Train.EmergencyBrakeValve.Value > 0.5 then a = 4 end
if self.BLDisconnect then
--self.ReservoirPressure = self.BrakeLinePressure
self:equalizePressure(dT,"ReservoirPressure", self.BrakeLinePressure,6,0.8,nil,2)
self:equalizePressure(dT,"BrakeLinePressure", self.TrainToBrakeReducedPressure, pr_speed*0, pr_speed*0.3*a, nil, 1.6)
self.ReservoirPressure_dPdT = self.BrakeLinePressure_dPdT*0.8
else
self:equalizePressure(dT,"ReservoirPressure", self.TrainToBrakeReducedPressure,0,1.55,nil,2)
end
end
end
-- 334: 3 Close all valves
if (self.RealDriverValvePosition == 3) then
-- Typical leak
self:equalizePressure(dT,"ReservoirPressure", 0.00, 0.001)
end
local res_dischrg_rate4 = 0.28--self.BLDisconnect and 0.55 or 1
local res_dischrg_rate5 = self.BLDisconnect and 1.12 or 8
-- 334: 4 Reservoir open to atmosphere, brake line equalizes with reservoir
if (self.RealDriverValvePosition == 4) then
self:equalizePressure(dT,"ReservoirPressure", 0.0, res_dischrg_rate4, nil,nil,1)--0.35)-0.55
end
-- 334: 5 Reservoir and brake line open to atmosphere
if (self.RealDriverValvePosition == 5) then
self:equalizePressure(dT,"ReservoirPressure", 0.0, res_dischrg_rate5)--,nil,nil,2)--1.70
local pr_speed = 1.25*6--wagc
if self.Leak or self.BrakeLineOpen then pr_speed = pr_speed*0.3 end
if self.BLDisconnect then
if self.Leak then pr_speed = pr_speed*6.2 end
self:equalizePressure(dT,"BrakeLinePressure", 0.0, pr_speed,nil,nil,2)
end
end
-- утечка через неплотность уравнительного поршня
if self.BLDisconnect then self:equalizePressure(dT, "ReservoirPressure", self.BrakeLinePressure, 0.06, 0) end
if (self.RealDriverValvePosition > 1) and (self.RealDriverValvePosition < 5) then
local pr_speed = 1.25*6--wagc
if self.Leak or self.BrakeLineOpen then pr_speed = pr_speed*0.3 end
local _a = 0
for k,v in ipairs(Train.WagonList) do
if v.Pneumatic.TLDisconnect and v.Pneumatic.BLDisconnect and (v.Pneumatic.RealDriverValvePosition == 2 or v.Pneumatic.RealDriverValvePosition == 1) then
_a = _a + 1
end
if _a > 1 then break end
end
if _a > 1 then pr_speed = pr_speed*0.1 end
if self.BLDisconnect and self.BrakeLinePressure - self.ReservoirPressure > (self.RealDriverValvePosition == 3 and 0 or 0.2) then --0.2 bar is a piston sensitivity
self:equalizePressure(dT, "BrakeLinePressure", 0, pr_speed*math.abs(self.BrakeLinePressure - self.ReservoirPressure), nil, nil, 6)
end
end
--[[if not self.TLDisconnect then
self.TLDisconnectPressure = math.max(0,self.TLDisconnectPressure - math.abs(self.ReservoirPressure_dPdT)*0.8)
end]]
self.ReservoirPressure_dPdT = self.ReservoirPressure_dPdT + self.BrakeLinePressure_dPdT*0.2
Train:SetPackedRatio("ReservoirPressure_dPdT",self.ReservoirPressure_dPdT/wagc*2)
Train.KM334:TriggerInput("InputPres",self.TrainLinePressure)
Train.KM334:TriggerInput("HandlePosition",self.RealDriverValvePosition)
Train.KM334:TriggerInput("ReduSetpoint",self.KM013offset)
Train.KM334:TriggerInput("TLineVol",420*Train:GetTLConnectedWagonCount())
Train.KM334:TriggerInput("BLineVol",29*wagc)
--Train.KM334:TriggerInput("EqResVol",self.ResevoirVolume)
Train.KM334:TriggerInput("ValvT",self.TLDisconnect and 1 or 0)
Train.KM334:TriggerInput("ValvB",self.BLDisconnect and 1 or 0)
self.BrakeLinePressure = self.BLDisconnect and Train.KM334.OutPres or self.BrakeLinePressure
--[[
---------------debug---------------------
self.dlreadtimer = self.dlreadtimer or CurTime()
@@ -987,6 +909,12 @@ function TRAIN_SYSTEM:Think(dT)
Train.SQ3:TriggerInput("Set", Train.PassengerDoor and 0 or 1)
----------------------------------------------------------------------------
if self.DriverValveTLDisconnectPrevious ~= Train.DriverValveTLDisconnect.Value then
self.DriverValveTLDisconnectPrevious = Train.DriverValveTLDisconnect.Value
if self.DriverValveTLDisconnectPrevious == 1 and self.TrainLinePressure > 0.5 then
Train:PlayOnce("pneumo_TL_open","cabin",math.min(0.9,self.TrainLinePressure/5), math.min(1,self.TrainLinePressure/4.5))
end
end
if self.DriverValveDisconnectPrevious ~= Train.DriverValveDisconnect.Value then
self.DriverValveDisconnectPrevious = Train.DriverValveDisconnect.Value
if self.DriverValveDisconnectPrevious == 0 then

View File

@@ -0,0 +1,218 @@
--------------------------------------------------------------------------------
-- KM 334 (Author: Blue Snooty)
--------------------------------------------------------------------------------
-- Copyright (C) 2013-2018 Metrostroi Team & FoxWorks Aerospace s.r.o.
-- Contains proprietary code. See license.txt for additional information.
--------------------------------------------------------------------------------
Metrostroi.DefineSystem("KM334")
TRAIN_SYSTEM.DontAccelerateSimulation = true
function TRAIN_SYSTEM:Initialize()
self.PistonSens = 0.2 -- bar
self.PistonState = 0 -- 0 - down (shut); 1 - up (opened)
self.HandlePosition = 1
self.InputPres = 0.0
self.ReduOutPres = 0.0
self.OutPres = 0.0
self.ReduInpPres = 0.0
self.ResvPres = 0.0
self.ValvT = 0 -- TLDisconnect repeater
self.ValvB = 0 -- BLDisconnect repeater
self.TLineVol = 420 -- volume in litres
self.BLineVol = 29 -- 81-717(714) — 29 l, E type — 38 l
self.EqResVol = 9.5
self.ReduSetpoint = 5.0
self.Cham_H = {
pressure = 0.0,
volume = 0.1,
mass = 0,
dP = 0.0,
}
self.Cham_T = {
pressure = 0.0,
volume = 0.1,
mass = 0,
dP = 0.0,
}
self.Cham_UR = {
pressure = 0.0,
volume = 9.5,
mass = 0,
dP = 0.0,
}
self.Cham_3K = {
pressure = 0.0,
volume = 0.2,
mass = 0,
dP = 0.0,
}
self.Cham_Ex = {
pressure = 0.0,
volume = 1e12,
mass = 0,
dP = 0.0,
}
self.OldHandlePosition = self.HandlePosition
end
-- slide valve matrix
TRAIN_SYSTEM.SlideValve = {
[1] = {"Cham_H Cham_T 0.002", "Cham_H Cham_UR 0.0005"--[["Cham_H Cham_3K 0.01"]]},
[2] = {--[["Cham_H Cham_3K 0.05",]] "Cham_T Cham_UR 0.08"},
[3] = {},
[4] = {"Cham_UR Cham_Ex 0.05"},
[5] = {"Cham_T Cham_Ex 0.2","Cham_UR Cham_Ex 0.25","Cham_3K Cham_Ex 0.2"},
}
function TRAIN_SYSTEM:Outputs()
return {"OutPres", "ReduInpPres", "MainRelease", "SideRelease", "ResvPres", "PistonState"}
end
function TRAIN_SYSTEM:Inputs()
return {"InputPres", "HandlePosition", "ReduSetpoint", "ReduOutPres", "TLineVol", "BLineVol", "EqResVol", "ValvT", "ValvB"}
end
function TRAIN_SYSTEM:TriggerInput(name,value)
if self[name] then
self[name] = value
end
end
function TRAIN_SYSTEM:Think(dT)
local Train = self.Train
if Train.Pneumatic.ValveType ~= 1 then
if not self.KMSndOff then
SetSoundState("crane334_brake_eq_high",0,1)
SetSoundState("crane334_brake_eq_low",0,1)
SetSoundState("crane334_release",0,1)
SetSoundState("crane334_release_2",0,1)
self.KMSndOff = true
end
return
end
self.KMSndOff = false
self.Cham_H.dP = 0.0
self.Cham_T.dP = 0.0
self.Cham_UR.dP = 0.0
self.Cham_3K.dP = 0.0
self.Cham_H.dP = 0.0
if self.HandlePosition ~= self.OldHandlePosition then
-- reset working chambers pointers tables
self.ch1 = {}
self.ch2 = {}
self.ch3 = {}
for k,v in ipairs(self.SlideValve[self.HandlePosition]) do
local cp, p = v:match("(%g+)()")
self.ch1[k] = self[cp]
cp, p = v:match("(%g+)()", p)
self.ch2[k] = self[cp]
self.ch3[k] = tonumber(v:match("%d+%.%d+",p))
end
self.OldHandlePosition = self.HandlePosition
end
-- main chambers process (through sliding valve)
self.Cham_H.pressure = self.ValvT > 0 and self.InputPres or self.Cham_H.pressure
self.Cham_H.volume = self.ValvT > 0 and self.TLineVol or 0.1
self.Cham_T.pressure = self.ValvB > 0 and self.OutPres or self.Cham_T.pressure
self.Cham_T.volume = self.ValvB > 0 and self.BLineVol or 0.1
self.Cham_UR.volume = self.EqResVol
self.Cham_Ex.pressure = 0
for i = 1,#self.ch1 do
local dP = self.ch1[i].pressure - self.ch2[i].pressure
self.ch1[i].dP = dP
if dP > 0.1 then
self.ch1[i].mass = self.ch1[i].pressure*self.ch1[i].volume
local dPV = self.ch1[i].mass*dT*dP*self.ch3[i]
self.ch1[i].mass = math.max(0,self.ch1[i].mass - dPV)
self.ch2[i].mass = math.max(0,self.ch2[i].mass + dPV)
elseif dP < -0.1 then
self.ch2[i].mass = self.ch2[i].pressure*self.ch2[i].volume
local dPV = self.ch2[i].mass*dT*dP*self.ch3[i]
self.ch2[i].mass = math.max(0,self.ch2[i].mass + dPV)
self.ch1[i].mass = math.max(0,self.ch1[i].mass - dPV)
end
self.ch1[i].pressure = math.min(self.InputPres,self.ch1[i].mass/self.ch1[i].volume)
self.ch2[i].pressure = math.min(self.InputPres,self.ch2[i].mass/self.ch2[i].volume)
end
--[[
---------------debug---------------------
self.dlreadtimer = self.dlreadtimer or CurTime()
if CurTime() - self.dlreadtimer > 0.5 then
self.dlreadtimer = CurTime()
if Train:GetDriver() then
for i = 1,#self.ch1 do
PrintMessage(HUD_PRINTTALK, Format("Cham_3K.mass = %.2f; Cham_T.mass = %.2f; Cham_UR.mass = %.2f",self.Cham_3K.mass,self.Cham_T.mass,self.Cham_UR.mass))
PrintMessage(HUD_PRINTTALK, Format("Cham_3K.pressure = %.2f; Cham_T.pressure = %.2f; Cham_UR.pressure = %.2f",self.Cham_3K.pressure,self.Cham_T.pressure,self.Cham_UR.pressure))
end
PrintMessage(HUD_PRINTTALK, "-------------------------------------------------------------------------------")
end
end
---------------debug---------------------]]
local dPiston = self.Cham_T.pressure - self.Cham_UR.pressure
if dPiston >= 0.2 then
self.PistonState = 1
elseif dPiston < 0.08 then
self.PistonState = 0
end
-- braking chamber discharge through side release valve
if self.PistonState == 1 and self.Cham_T.pressure > 0 then
local dP = 15*self.Cham_T.pressure*dT/self.Cham_T.volume
self.Cham_T.pressure = math.max(0,self.Cham_T.pressure - dP)
self.Cham_T.dP = self.Cham_T.dP + dP
end
-- pneumatic reducer 348 work
if self.HandlePosition == 2 then
if self.Cham_T.pressure - self.ReduSetpoint < 0 then
local dP = self.Cham_H.pressure - self.Cham_T.pressure
if dP > 0 then
--self.ch1[i].mass = self.ch1[i].pressure*self.ch1[i].volume
local dPV = self.Cham_H.mass*dT*dP*0.001
self.Cham_H.mass = math.max(0,self.Cham_H.mass - dPV)
self.Cham_T.mass = math.max(0,self.Cham_T.mass + dPV)
end
self.Cham_H.pressure = math.min(self.InputPres,self.Cham_H.mass/self.Cham_H.volume)
self.Cham_T.pressure = math.min(self.InputPres,self.Cham_T.mass/self.Cham_T.volume)
end
end
---[[
---------------debug---------------------
self.dlreadtimer = self.dlreadtimer or CurTime()
if CurTime() - self.dlreadtimer > 0.5 then
self.dlreadtimer = CurTime()
if Train:GetDriver() then
PrintMessage(HUD_PRINTTALK, Format("Cham_UR.pressure = %.2f; Cham_T.pressure = %.2f; OutPres = %.2f; Piston: %u",self.Cham_UR.pressure,self.Cham_T.pressure,self.OutPres,self.PistonState))
end
end
---------------debug---------------------]]
--[[
---------------debug---------------------
self.dlreadtimer2 = self.dlreadtimer2 or CurTime()
PrintMessage(HUD_PRINTTALK, Format("Вагон %u; BLineVol = %.2f;",Train:GetWagonNumber(),self.BLineVol))
end
end
---------------debug---------------------]]
-- Piston leak
local dP = self.Cham_UR.pressure - self.Cham_T.pressure
local Pavg = (self.Cham_UR.pressure + self.Cham_T.pressure)/2
if dP > 0 and self.Cham_UR.pressure > Pavg or dP < 0 and self.Cham_T.pressure < Pavg then
self.Cham_UR.pressure = self.Cham_UR.pressure - 0.003*dP*dT/self.Cham_UR.volume
self.Cham_T.pressure = self.Cham_T.pressure + 0.003*dP*dT/self.Cham_T.volume
end
self.OutPres = self.Cham_T.pressure
self.ResvPres = self.Cham_UR.pressure
Train:SetSoundState("crane334_brake_eq_high",self.Cham_UR.dP,1)
Train:SetSoundState("crane334_brake_eq_low",self.Cham_H.dP,1)
Train:SetSoundState("crane334_release",self.Cham_T.dP,1)
Train:SetSoundState("crane334_release_2",self.Cham_3K.dP,1)
end