1
0
mirror of https://github.com/metrostroi-repo/MetrostroiAddon.git synced 2026-05-02 00:42:29 +00:00
Files
MetrostroiAddon/lua/metrostroi/systems/sys_pkg_759b.lua
g_brzhezinskiy 1d05caf866 init
2021-01-02 12:51:45 +03:00

107 lines
3.8 KiB
Lua
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
--------------------------------------------------------------------------------
-- Reverser and relays panel (PKG-759B) for 81-702,
-- used on underground subway lines
--------------------------------------------------------------------------------
-- Copyright (C) 2013-2018 Metrostroi Team & FoxWorks Aerospace s.r.o.
-- Contains proprietary code. See license.txt for additional information.
--------------------------------------------------------------------------------
Metrostroi.DefineSystem("PKG_759B")
function TRAIN_SYSTEM:Initialize()
--Brake selector configuration
self.Configuration = self.Configuration or {
-- ## 1 2 3 4 5 6 7 8 9 10 11 12
[ 1] = { 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1},-- X
[ 2] = { 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0},-- T
}
-- Resistance value of all contactors
for k,v in ipairs(self.Configuration[1]) do self[k] = 1e15 end
--Brake selector
self.TPPosition = 0 --Position
self.TPM = 0 --Contatcts
self.TPT = 0
self.TPMS = 0 --Setters
self.TPTS = 0
self.TPSpeed = 0 --Parameter
--Reverser
self.ReverserPosition = 0 --Position
self.VP = 0 --Contacts
self.NZ = 0
self.VPS = 0 --Setters
self.NZS = 0
self.ReverserSpeed = 0 --Parameter
self.RotationRate = 2
-- Реле времени РВ
self.Train:LoadSystem("RV","Relay","",{ open_time = 0.3 })
-- Реле ускорения, торможения (РУТ)
self.Train:LoadSystem("RU","Relay","R-52B")
-- Extra coils for some relays
self.Train.RUpod = 0
self.Train.RUreg = 0
self.Train.RUavt = 1
self.Train.RVuderzh = 0
self.Train.RVpod = 0
end
function TRAIN_SYSTEM:Inputs()
return {"VP","NZ","TPM","TPT"}
end
function TRAIN_SYSTEM:Outputs()
return {"VP","NZ","TPM","TPT"}
end
function TRAIN_SYSTEM:TriggerInput(name,value)
if name == "VP" then self.VPS = value end
if name == "NZ" then self.NZS = value end
if name == "TPM" then self.TPMS = value end
if name == "TPT" then self.TPTS = value end
end
function TRAIN_SYSTEM:Think(dT)
-- Move reversor
if self.VPS == 0 and self.NZS == 0 then
self.ReverserSpeed = 0
else
self.ReverserSpeed = math.max(-1,math.min(1,self.ReverserSpeed+dT*(self.VPS-self.NZS)*0.9))
end
self.ReverserPosition = math.max(0,math.min(1,self.ReverserPosition + self.RotationRate*self.ReverserSpeed))
if self.TPMS == 0 and self.TPTS == 0 then
self.TPSpeed = 0
else
self.TPSpeed = math.max(-1,math.min(1,self.TPSpeed+dT*(self.TPTS-self.TPMS)*0.9))
end
self.TPPosition = math.max(0,math.min(1,self.TPPosition + self.RotationRate*self.TPSpeed))
self.NZ = self.ReverserPosition < 0.2 and 1 or 0
self.VP = self.ReverserPosition > 0.2 and 1 or 0
self.TPM = self.TPPosition < 0.2 and 1 or 0
self.TPT = self.TPPosition > 0.2 and 1 or 0
if self.ReverserPosition < 0.1 and self.RKRSmd or self.ReverserPosition > 0.9 and not self.RKRSmd then
self.RKRSmd = self.ReverserPosition > 0.9
self.Train:PlayOnce("RKR","bass",1,1)
end
if self.TPPosition < 0.1 and self.TPMSnd or self.TPPosition > 0.9 and not self.TPMSnd then
self.TPMSnd = self.TPPosition > 0.9
self.Train:PlayOnce("T","bass",1,1)
end
-- Lock contacts as defined in the configuration
for k,v in ipairs(self.Configuration[math.floor(self.TPPosition+1.5)]) do
self[k] = 1e-15 + 1e15 * (1-v)
end
local Train = self.Train
-- RU operation
self.RUCurrent = (math.abs(Train.Electric.I13) + math.abs(Train.Electric.I24))/2
self.RUTarget = 280 + 70*Train.RUavt*self.Train.Pneumatic.WeightLoadRatio+80*Train.RUreg--+30
if Train.RUpod > 0.5
then Train.RU:TriggerInput("Close",1.0)
else Train.RU:TriggerInput("Set",self.RUCurrent > self.RUTarget)
end
end