mirror of
https://github.com/metrostroi-repo/MetrostroiAddon.git
synced 2026-05-02 00:42:29 +00:00
1180 lines
52 KiB
Lua
1180 lines
52 KiB
Lua
--------------------------------------------------------------------------------
|
||
-- 81-717 Moscow and SPB electric schemes
|
||
--------------------------------------------------------------------------------
|
||
-- Copyright (C) 2013-2018 Metrostroi Team & FoxWorks Aerospace s.r.o.
|
||
-- Contains proprietary code. See license.txt for additional information.
|
||
--------------------------------------------------------------------------------
|
||
Metrostroi.DefineSystem("81_717_Electric")
|
||
TRAIN_SYSTEM.MVM = 1
|
||
TRAIN_SYSTEM.LVZ_1 = 2 --BARS
|
||
TRAIN_SYSTEM.LVZ_2 = 3 --PUAV
|
||
TRAIN_SYSTEM.LVZ_3 = 4 --PAM
|
||
TRAIN_SYSTEM.LVZ_4 = 5 --PA-KSD
|
||
TRAIN_SYSTEM.DOT_2 = 6 --.2
|
||
function TRAIN_SYSTEM:Initialize(typ1,typ2)
|
||
self.TrainSolver = "81_717"
|
||
self.ThyristorController = true
|
||
self.Type = self.Type or self.MVM
|
||
|
||
-- Load all functions from base
|
||
Metrostroi.BaseSystems["Electric"].Initialize(self)
|
||
for k,v in pairs(Metrostroi.BaseSystems["Electric"]) do
|
||
if not self[k] and type(v) == "function" then
|
||
self[k] = v
|
||
end
|
||
end
|
||
end
|
||
|
||
if CLIENT then return end
|
||
function TRAIN_SYSTEM:Inputs(...)
|
||
return { "Type", "NoRT2", "HaveRO", "GreenRPRKR","X2PS", "HaveVentilation","OldFLARS" }
|
||
end
|
||
function TRAIN_SYSTEM:Outputs(...)
|
||
return Metrostroi.BaseSystems["Electric"].Outputs(self,...)
|
||
end
|
||
function TRAIN_SYSTEM:TriggerInput(name,value)
|
||
if name == "Type" then
|
||
self.Type = value
|
||
end
|
||
if name == "NoRT2" then self.NoRT2 = value > 0 end
|
||
if name == "HaveRO" then self.HaveRO = value > 0 end
|
||
if name == "GreenRPRKR" then self.GreenRPRKR = value > 0 end
|
||
if name == "X2PS" then self.X2PS = value > 0 end
|
||
if name == "HaveVentilation" then self.Vent = value > 0 end
|
||
if name == "OldFLARS" then self.OldFLARS = value > 0 end
|
||
end
|
||
|
||
-- Node values
|
||
local S = {}
|
||
-- Converts boolean expression to a number
|
||
local function C(x) return x and 1 or 0 end
|
||
|
||
local min = math.min
|
||
local max = math.max
|
||
|
||
function TRAIN_SYSTEM:SolveAllInternalCircuits(Train,dT,firstIter)
|
||
local P = Train.PositionSwitch
|
||
local RheostatController = Train.RheostatController
|
||
local RK = RheostatController.SelectedPosition
|
||
local B = (Train.Battery.Voltage > 55) and 1 or 0
|
||
local BO = B*Train.VB.Value
|
||
local T = Train.SolverTemporaryVariables
|
||
local elType = self.Type
|
||
local isMVM = elType == 1
|
||
local isDot2 = elType == 6
|
||
local isLVZ = 1 < elType and elType < 6
|
||
local isPUAV = isLVZ and elType < 4
|
||
local isPA = isLVZ and not isPUAV
|
||
local isKSD = isPA and elType==5
|
||
|
||
local KV = Train.KV
|
||
local KRU = Train.KRU
|
||
local Panel = Train.Panel
|
||
Panel.V1 = BO
|
||
local RC1 = Train.RC1.Value
|
||
local ARS = Train.ALS_ARS
|
||
local RC2,AVI,AVO
|
||
|
||
S["10AK"] = T[10]*Train.A54.Value*Train.A84.Value
|
||
S["U2"] = S["10AK"]*KV["U2-10AK"] --10AK-KV-U2
|
||
|
||
--Reverser
|
||
S["7D"] = T[10]*Train.A48.Value
|
||
S["7G"] = S["7D"]*KV["10-7G"] --10-A48-RV-7G --FIXME 34w ARS
|
||
S["B3"] = B*Train.A44.Value
|
||
S["14a"] = S["B3"]*KRU["14/1-B3"]
|
||
S["14b"] = S["14a"]*Train.A17.Value
|
||
S["F"] = T[10]*Train.A29.Value
|
||
S["F7"] = S["F"]*KV["F-F7"]+S["14b"]*KRU["11/3-FR1"]
|
||
|
||
Train:WriteTrainWire(5,S["10AK"]*KV["10AK-5"] + KRU["5/3-ZM31"]*-10)
|
||
Train:WriteTrainWire(4,S["10AK"]*KV["10AK-4"] + --[[max(0,min(1,T[4])*KV["4-0"]*-10)]]KV["4-0"]*-10)
|
||
|
||
Panel.LST = T[6]*Train.A40.Value
|
||
Panel.LhRK = (T[2]+T[-2])*Train.A57.Value
|
||
Panel.LVD = T[1]*Train.A60.Value
|
||
if isDot2 then --717.2 wo ARS
|
||
Panel.LSN = S["U2"]*T[18]
|
||
|
||
S["33Yu"] = S["7G"]*KV["7G-33Yu"] --7G-SOT/UOS-KV
|
||
S["33Yu0"] = (Train.KD.Value+Train.VAD.Value) --RVT-RPB/VAH-KD/VAD-0
|
||
Train.RV2:TriggerInput("Set",S["33Yu"]*S["33Yu0"])
|
||
Train:WriteTrainWire(1,S["10AK"]*Train.R1_5.Value + KRU["1/3-ZM31"]*-10)
|
||
Train:WriteTrainWire(2,S["U2"]*KV["U2-2"] + KRU["2/3-ZM31"]*-10) --U2-KV-2 FIXME ARS?
|
||
Train:WriteTrainWire(3,S["U2"]*KV["U2-3"])
|
||
Train:WriteTrainWire(6,S["10AK"]*Train.K6.Value)
|
||
Train:WriteTrainWire(8,BO*KV["10-8"]*Train.A41.Value)--10-KV-8 FIXME ARS
|
||
Train:WriteTrainWire(20,S["U2"]*KV["U2-20a"]+S["U2"]*KV["U2-20b"]+KRU["20/3-ZM31"]*-10)
|
||
Train:WriteTrainWire(25,S["U2"]*KV["U2-25"]*Train.A55.Value*Train.K25.Value)
|
||
|
||
S["U2a"] = S["U2"]*KV["U2-U2a"] --U2-KV-U2a
|
||
S["19B"] = S["10AK"]*KV["10AK-DA"] --DA-19B
|
||
Train:WriteTrainWire(19,S["19B"]*KV["19B-19"]*Train.A71.Value) --19B-KV/RO-A71-19
|
||
Train.R1_5:TriggerInput("Set",S["19B"]*Train.RV2.Value*Train.UAVAC.Value*(Train.AVU.Value+Train.OtklAVU.Value))
|
||
Train.RVT:TriggerInput("Set",S["U2a"])
|
||
Train.K25:TriggerInput("Set",S["U2a"])
|
||
Train.K6:TriggerInput("Set",S["10AK"]*Train.RVT.Value) --10AK-K6
|
||
--Train.Rp8:TriggerInput("Set",T[8])
|
||
|
||
|
||
S["U4"] = S["10AK"]*KV["10AK-U4"]*Train.A74.Value--10AK-KV-U4
|
||
Train:WriteTrainWire(17,S["U4"]*Train.VozvratRP.Value)
|
||
Train:WriteTrainWire(24,S["U2"]*Train.A73.Value*Train.KSN.Value)
|
||
S["V2"] = T[10]*Train.AV1.Value
|
||
if self.Vent then
|
||
Train:WriteTrainWire(59,S["V2"]*Train.V11.Value)
|
||
Train:WriteTrainWire(60,S["V2"]*Train.V12.Value)
|
||
Train:WriteTrainWire(58,BO*Train.A49.Value*(1-Train.V11.Value)*(1-Train.V12.Value)*Train.V13.Value)
|
||
Panel.L1 = T[57]
|
||
end
|
||
Panel.M8 = S["V2"]*Train.PVK.Value
|
||
|
||
local RRI_VV = Train.RRI_VV
|
||
RRI_VV.Power = BO*Train.AS1.Value--*Train.R_ASNPOn.Value
|
||
RRI_VV.AmplifierPower = RRI_VV.Power*Train.RRI.LineOut*Train.R_UNch.Value*Train.A26.Value
|
||
Train:WriteTrainWire(13,RRI_VV.AmplifierPower)
|
||
Train:WriteTrainWire(-13,RRI_VV.AmplifierPower*Train.PowerSupply.X2_2)
|
||
RRI_VV.CabinSpeakerPower = RRI_VV.Power*Train.RRI.LineOut*Train.R_G.Value
|
||
|
||
Panel.AnnouncerPlaying = T[13]
|
||
Panel.AnnouncerBuzz = T[-13]+RRI_VV.CabinSpeakerPower*Train.PowerSupply.X2_2
|
||
Train.Rp8:TriggerInput("Set",T[8]*Train.KRP.Value)
|
||
Train:WriteTrainWire(14,S["14a"]*(1-Train.Rp8.Value)*Train.KRP.Value)
|
||
elseif isLVZ then
|
||
RC2 = isKSD and RC1 or Train.RC2.Value
|
||
|
||
Panel.LSN = (math.max(0,T[20])+S["14b"])*T[18]
|
||
--[[ S["7Ga"] = S["7G"]*Train.A79.Value
|
||
ARS.FMM1 = S["14a"]*Train.A42.Value+S["7Ga"]
|
||
ARS.FMM2 = S["F7"]
|
||
ARS.GE = (ARS.FMM1*Train.ARS.Value+T[87]*(1-Train.ARS.Value))*RC1
|
||
Train:WriteTrainWire(87,S["B3"]*Train.ARSR.Value*(1-RC1))
|
||
Train:WriteTrainWire(91,(S["B3"]*Train.ARSR.Value+T[87]+ARS.FMM1*Train.ARS.Value)*Train.PB.Value+T[87]*Train.ARSR.Value*Train.KVTR.Value)
|
||
ARS.VP = ARS.FMM1*Train.VP.Value
|
||
Train:WriteTrainWire(88,ARS.FMM1*Train.ALSFreq.Value*(1-Train.VP.Value))
|
||
ARS.PD = T[88]
|
||
ARS.ALS = T[10]*Train.A43.Value*Train.ALS.Value
|
||
Train.BLPM.Power = ARS.ALS
|
||
ARS.NGPower = S["7D"]*RC1
|
||
Train.BIS200.Power = T[10]*Train.A43.Value*(Train.ALS.Value+Train.ARS.Value)
|
||
ARS.KB=T[91]*RC1+(ARS.ALS*(1-Train.BSM_GE.Value)+ARS.GE*Train.BSM_GE.Value)*Train.KVT.Value
|
||
--]]
|
||
S["14bx"] = S["14b"]*Train.KRP.Value
|
||
S["KRH"] = max(0,T[1])+S["14bx"]
|
||
ARS.KRH = S["KRH"]*RC1
|
||
ARS.KRO = S["7G"]*(1-Train.KRP.Value)*KV["7GA-RC27"]*RC1
|
||
ARS.KRT = (max(0,Panel.LST)+max(0,T[8]))*RC1
|
||
S["14G"] = S["7G"]*Train.A42.Value+S["14a"]*Train.A42.Value
|
||
ARS.ARSPower = S["14G"]*Train.ARS.Value*RC1
|
||
ARS.ALS = S["14G"]
|
||
ARS.ALSPower = ARS.ALS*Train.ALS.Value*RC1
|
||
ARS.VRD = S["14G"]*Train.VRD.Value*RC1
|
||
ARS.KB=S["14G"]*(Train.PB.Value+Train.KVT.Value)*RC1
|
||
if isPUAV then
|
||
Train:WriteTrainWire(53,S["14G"]*Train.A61.Value)
|
||
else
|
||
Train:WriteTrainWire(53,(S["10AK"]*KV["10AK-DA"]+S["14a"]*Train.A42.Value)*Train.A61.Value)
|
||
end
|
||
Train:WriteTrainWire(54,0)
|
||
--ARS.KRO = (T[87]+S["7Ga"]*KV["7GA-RC27"]+S["14a"]*Train.A42.Value*(1-Train.KRP.Value))*(1-Train.BSM_KRH.Value)
|
||
|
||
--Train.ROT1:TriggerInput("Set",ARS["33G"]*RC1+(1-RC1))
|
||
--Train.ROT2:TriggerInput("Set",ARS["33G"]*RC1+(1-RC1))
|
||
--Panel.LKVD = ARS.GE*(1-Train.BUM_RVD2.Value)+T[87]*(1-Train.ROT2.Value)
|
||
|
||
S["7Gv"] = S["14G"]*RC1*Train.ARS.Value*ARS.EPK*Train.A43.Value
|
||
|
||
if isPUAV then
|
||
AVI = Train.PUAV
|
||
AVO = Train.PUAV
|
||
|
||
--AVI.KRT = T[6]*RC2
|
||
AVI.Power = T[10]*Train.VAU.Value*Train.A58.Value
|
||
AVI.ALSPower = S["14G"]*Train.A55.Value
|
||
AVI.KRT = (max(0,Panel.LST)+max(0,T[8]))*RC2
|
||
AVI.KRH = S["KRH"]*RC2
|
||
AVI.KGR = KV["15A-15B"]
|
||
AVI.KRR1 = BO*Train.VAU.Value*Train.A59.Value*KV["10-7G"]--T[53]
|
||
AVI.KRR2 = T[54]
|
||
AVI.KRR3 = T[4]
|
||
AVI.KPRK = RheostatController.Position
|
||
AVI.KOAT = T[64]
|
||
AVI.KET = T[34]*T[-34]
|
||
AVI.KSOT = Train.SOT.Value
|
||
AVI.RK1 = C(RK==1)
|
||
AVI.KRU = KRU["14/1-B3"]
|
||
AVI.K16 = T[16]
|
||
|
||
AVI.KVARS = ARS.ARSPower
|
||
AVI.KTARS = ARS["6"]
|
||
AVI.VRD = S["14G"]*Train.VRD.Value*RC2
|
||
AVI.VAV = Train.VAV.Value
|
||
AVI.KH3 = Train.KH.Value
|
||
AVI.VZP = Train.VZP.Value
|
||
AVI.KSZD = Train.KSZD.Value
|
||
AVI.KB=S["14G"]*(Train.PB.Value+Train.KVT.Value)*RC2
|
||
Panel.BURPower = BO*Train.A66.Value
|
||
else
|
||
AVI = Train.PAM_VV
|
||
AVO = Train.PAM
|
||
|
||
S["10-58"] = T[10]*Train.A58.Value
|
||
if isKSD then
|
||
Train:WriteTrainWire(99,S["10-58"]*(Train.VPAOn.Value+Train.KSD_VAU.Value))
|
||
Train:WriteTrainWire(98,S["10-58"]*Train.VPAOff.Value)
|
||
Train.KSD_VAU:TriggerInput("Set",(T[99]+S["10-58"]*Train.KSD_VAU.Value)*max(0,1-T[98])*RC1)
|
||
AVI.Power = S["10-58"]*Train.KSD_VAU.Value*RC1
|
||
RC2 = RC1
|
||
else
|
||
AVI.Power = S["10-58"]*Train.VAU.Value*RC2
|
||
AVI.KVARS = ARS.ARSPower*RC1
|
||
AVI.KTARS = ARS["6"]*RC1
|
||
end
|
||
AVI.KGR = KV["15A-15B"]
|
||
AVI.KRR = T[53]*RC2
|
||
AVI.KRR1 = T[54]*RC2
|
||
AVI.KRR2 = T[4]*RC2
|
||
|
||
--AVI.KRT = T[6]*RC2
|
||
AVI.KRT = (max(0,Panel.LST)+max(0,T[8]))*RC2
|
||
AVI.KRH = S["KRH"]*RC2
|
||
AVI.KB=S["14G"]*(Train.PB.Value+Train.KVT.Value)*RC2
|
||
|
||
AVI.KZP = Train.VZP.Value
|
||
AVI.KET = T[34]*T[-34]
|
||
AVI.LPT = T[64]
|
||
|
||
AVI.KSOT = Train.SOT.Value*RC2
|
||
AVI.KSZD = Train.KSZD.Value*RC2
|
||
|
||
AVI.KPRK = RheostatController.Position*RC2
|
||
--AVI.RK1 = C(RK==1)
|
||
AVI.K16 = T[16]
|
||
AVI.KRU = BO*KRU["14/1-B3"]*RC2
|
||
|
||
AVI.VRD = S["14G"]*Train.VRD.Value*RC2
|
||
|
||
AVI.V1 = T[48]*RC2
|
||
AVI.V2 = T[39]*RC2
|
||
end
|
||
ARS.DA = S["10AK"]*KV["10AK-DA"]
|
||
|
||
Train:WriteTrainWire(39,S["14G"]*(1-Train.OVT.Value)*(1-Train.RPB.Value)+AVO["39"]*RC2)
|
||
|
||
if isKSD then
|
||
S["7Ga"] = AVI.Power*AVO["7GA"]*RC1
|
||
S["7Gb"] = (1-RC1)*Train.PB.Value
|
||
Train.RPB:TriggerInput("Set",S["14G"]*(S["7Ga"]+S["7Gb"]))
|
||
|
||
S["33Yu"] = S["7G"]*KV["7G-33Yu"]*(AVO["033"]*RC1+(1-RC1)) --7G-SOT/UOS-KV
|
||
S["33Yu0"] = (Train.RPB.Value+Train.VAH.Value)*(Train.KD.Value+Train.VAD.Value) --RVT-RPB/VAH-KD/VAD-0
|
||
Train.RV2:TriggerInput("Set",S["33Yu"]*S["33Yu0"])
|
||
|
||
Train:WriteTrainWire(1,S["10AK"]*Train.R1_5.Value+KRU["1/3-ZM31"]*-10)
|
||
Train:WriteTrainWire(2,S["U2"]*KV["U2-2"]+AVO["2"]*RC1+KRU["2/3-ZM31"]*-10) --U2-KV-2 FIXME ARS?
|
||
Train:WriteTrainWire(3,S["U2"]*KV["U2-3"]+AVO["3"]*RC1+T[2]*KRU["2/3-ZM31"])
|
||
Train:WriteTrainWire(6,S["10AK"]*Train.K6.Value)
|
||
Train:WriteTrainWire(8,BO*(KV["10-8"]+AVO["8"]*RC1)*Train.A41.Value)--10-KV-8 FIXME ARS
|
||
--Train:WriteTrainWire(14,S["14bx"]*(AVO["033"]*RC1))
|
||
Train:WriteTrainWire(14,S["14bx"]*(1-Train.Rp8.Value))
|
||
Train:WriteTrainWire(20,S["U2"]*KV["U2-20a"]*(AVO["20X"]*RC1+(1-RC1))+(AVO["20"]*RC1+S["U2"]*KV["U2-20b"])+KRU["20/3-ZM31"]*-10)
|
||
Train:WriteTrainWire(25,(S["U2"]*KV["U2-25"]*Train.A55.Value+AVO["25"]*RC1)*Train.K25.Value)
|
||
Train.Rp8:TriggerInput("Set",T[8])
|
||
|
||
S["U2a"] = AVO["33G"]*RC1+S["U2"]*KV["U2-U2a"] --U2-KV-U2a
|
||
S["19B"] = S["10AK"]*KV["10AK-DA"]*(AVO["033"]*RC1+(1-RC1)) --DA-19B
|
||
Train:WriteTrainWire(19,(S["19B"]*(KV["19B-19"]+Train.RO.Value)*(AVO["19"]*RC1+(1-RC1))+S["10AK"]*KV["10AK-DA"]*KV["U2-25"]*Train.RO.Value)*Train.A71.Value) --19B-KV/RO-A71-19
|
||
|
||
S["33"] = (S["19B"]*Train.RV2.Value+AVO["33"]*RC1)*Train.UAVAC.Value*(Train.AVU.Value+Train.OtklAVU.Value)
|
||
Train.R1_5:TriggerInput("Set",S["33"])
|
||
Train.RVT:TriggerInput("Set",S["U2a"])
|
||
Train.K25:TriggerInput("Set",S["U2a"]*(AVO["025"]*RC1+(1-RC1)))
|
||
Train.K6:TriggerInput("Set",S["10AK"]*Train.RVT.Value) --10AK-K6
|
||
|
||
AVI["I2"] = S["U2"]*KV["U2-2"]*RC1
|
||
AVI["I3"] = S["U2"]*KV["U2-3"]*RC1
|
||
AVI["I25"] = S["U2"]*KV["U2-25"]*Train.A55.Value*RC1
|
||
AVI["I33G"] = S["U2"]*KV["U2-U2a"]*RC1
|
||
AVI["I33"] = min(1,S["33Yu"]*S["33Yu0"]*RC1)
|
||
Train.EPKC:TriggerInput("Set",AVO["EPK"]*Train.A43.Value)
|
||
Panel.LKVD = 0
|
||
else
|
||
S["7Ga"] = Train.A42.Value*Train.ARS.Value*RC1
|
||
S["7Gb"] = ((1-RC2) + AVI.Power)*(1-RC1)*Train.PB.Value
|
||
Train.RPB:TriggerInput("Set",S["14G"]*(S["7Ga"]+S["7Gb"]))
|
||
|
||
if isPUAV then
|
||
Train.EPKC:TriggerInput("Set",S["7Gv"])
|
||
else
|
||
Train.EPKC:TriggerInput("Set",ARS.ARSPower*S["7Gv"]+(1-ARS.ARSPower)*AVO["EPK"]*Train.A43.Value)
|
||
end
|
||
|
||
S["33Yu"] = S["7G"]*(Train.SOT.Value*RC1+(1-RC1))*KV["7G-33Yu"]*(AVO["033"]*RC2+(1-RC2)) --7G-SOT/UOS-KV
|
||
S["33Yu0"] = (Train.RPB.Value+Train.VAH.Value)*(Train.KD.Value+Train.VAD.Value) --RVT-RPB/VAH-KD/VAD-0
|
||
Train.RV2:TriggerInput("Set",S["33Yu"]*S["33Yu0"])
|
||
|
||
Train:WriteTrainWire(1,S["10AK"]*Train.R1_5.Value+KRU["1/3-ZM31"]*-10)
|
||
Train:WriteTrainWire(2,S["U2"]*KV["U2-2"]+ARS["6"]*RC1+AVO["2"]*RC2+KRU["2/3-ZM31"]*-10) --U2-KV-2 FIXME ARS?
|
||
Train:WriteTrainWire(3,S["U2"]*KV["U2-3"]+AVO["3"]*RC2+T[2]*KRU["2/3-ZM31"])
|
||
Train:WriteTrainWire(6,S["10AK"]*Train.K6.Value)
|
||
Train:WriteTrainWire(8,BO*(KV["10-8"]+--[[ math.max(0,--]] ARS["8"]*RC1--[[ )--]] +AVO["8"]*RC2)*Train.A41.Value)--10-KV-8 FIXME ARS
|
||
Train:WriteTrainWire(14,S["14bx"]*(1-Train.Rp8.Value))
|
||
Train:WriteTrainWire(20,S["U2"]*KV["U2-20a"]*(ARS["33G"]*RC1+(1-RC1))*(AVO["20X"]*RC2+(1-RC2))+(ARS["6"]*RC1+AVO["20"]*RC2+S["U2"]*KV["U2-20b"])+KRU["20/3-ZM31"]*-10)
|
||
Train:WriteTrainWire(25,(S["U2"]*KV["U2-25"]*Train.A55.Value+AVO["25"]*RC2)*Train.K25.Value)
|
||
Train.Rp8:TriggerInput("Set",T[8])
|
||
|
||
ARS.K25 = S["U2"]*KV["U2-25"]*Train.A55.Value
|
||
S["U2a"] = ARS["6"]*RC1+AVO["33G"]*RC2+S["U2"]*KV["U2-U2a"] --U2-KV-U2a
|
||
S["19B"] = S["10AK"]*KV["10AK-DA"]*(ARS["33G"]*RC1+(1-RC1))*(AVO["033"]*RC2+(1-RC2)) --DA-19B
|
||
Train:WriteTrainWire(19,(S["19B"]*(KV["19B-19"]+Train.RO.Value)*(AVO["19"]*RC2+(1-RC2))+S["10AK"]*KV["10AK-DA"]*KV["U2-25"]*Train.RO.Value)*Train.A71.Value) --19B-KV/RO-A71-19
|
||
|
||
S["33"] = (S["19B"]*Train.RV2.Value+AVO["33"]*RC2)*Train.UAVAC.Value*(Train.AVU.Value+Train.OtklAVU.Value)
|
||
Train.R1_5:TriggerInput("Set",S["33"])
|
||
Train.RVT:TriggerInput("Set",S["U2a"])
|
||
Train.K25:TriggerInput("Set",S["U2a"]*(ARS["33Zh"]*RC1+(1-RC1))*(AVO["025"]*RC2+(1-RC2)))
|
||
Train.K6:TriggerInput("Set",S["10AK"]*Train.RVT.Value) --10AK-K6
|
||
|
||
AVI["I2"] = S["U2"]*KV["U2-2"]*RC2
|
||
AVI["I3"] = S["U2"]*KV["U2-3"]*RC2
|
||
AVI["I25"] = S["U2"]*KV["U2-25"]*Train.A55.Value*RC2
|
||
AVI["I33G"] = S["U2"]*KV["U2-U2a"]*RC2
|
||
AVI["I33"] = min(1,S["33Yu"]*S["33Yu0"]*RC2)
|
||
|
||
Panel.LKVD =ARS.KVD
|
||
end
|
||
|
||
|
||
S["U4"] = S["10AK"]*KV["10AK-U4"]*Train.A74.Value--10AK-KV-U4
|
||
Train:WriteTrainWire(17,S["U4"]*Train.VozvratRP.Value*(AVO["17"]*RC2+(1-RC2)))
|
||
Train:WriteTrainWire(71,S["U4"]*Train.OtklBV.Value)
|
||
Train:WriteTrainWire(24,Panel.LSN*Train.KSN.Value)
|
||
Panel.M8 = T[10]*Train.AV1.Value*Train.PVK.Value
|
||
|
||
Train:WriteTrainWire(66,S["F"]*(1-Train.VSOSD.Value))
|
||
Train:WriteTrainWire(67,T[66]*Train.VSOSD.Value)
|
||
Panel.SOSD = T[67]*(1-Train.KD.Value)
|
||
|
||
local ASNP_VV = Train.ASNP_VV
|
||
Panel.UPOPower = BO*(KV["10AK-DA"]+S["14a"])
|
||
ASNP_VV.AmplifierPower = Panel.UPOPower*Train.R_UPO.Value*(max(0,min(1,1-T[1]))+S["14a"])*Train.UPO.LineOut
|
||
Train:WriteTrainWire(13,ASNP_VV.AmplifierPower)
|
||
Train:WriteTrainWire(-13,ASNP_VV.AmplifierPower*Train.PowerSupply.X2_2)
|
||
ASNP_VV.CabinSpeakerPower = ASNP_VV.AmplifierPower*Train.R_G.Value
|
||
|
||
Train:WriteTrainWire(13,ASNP_VV.AmplifierPower)
|
||
|
||
Panel.AnnouncerPlaying = T[13]
|
||
Panel.AnnouncerBuzz = T[-13]
|
||
|
||
Panel.NMLow = BO*C(Train.Pneumatic.TrainLinePressure < 5.8 or Train.Pneumatic.TrainLinePressure > 8.3)
|
||
Panel.UAVATriggered = BO*(1-Train.UAVAC.Value+Train.PneumaticNo1.Value*C(Train.Pneumatic.BrakeCylinderPressure < 0.6))
|
||
else
|
||
Panel.LSN = S["U2"]*T[18]
|
||
--ARSD
|
||
S["7Ga"] = S["7G"]*Train.A79.Value
|
||
ARS.FMM1 = S["14a"]*Train.A42.Value+S["7Ga"]
|
||
ARS.FMM2 = S["F7"]
|
||
ARS.GE = (ARS.FMM1*Train.ARS.Value+T[87]*(1-Train.ARS.Value))*RC1
|
||
Train:WriteTrainWire(87,S["B3"]*Train.ARSR.Value*(1-RC1))
|
||
Train:WriteTrainWire(91,(S["B3"]*Train.ARSR.Value+T[87]+ARS.FMM1*Train.ARS.Value)*Train.PB.Value+T[87]*Train.ARSR.Value*Train.KVTR.Value)
|
||
ARS.VP = ARS.FMM1*Train.VP.Value
|
||
Train:WriteTrainWire(88,ARS.FMM1*Train.ALSFreq.Value*(1-Train.VP.Value))
|
||
ARS.PD = T[88]
|
||
ARS.ALS = T[10]*Train.A43.Value*Train.ALS.Value
|
||
Train.BLPM.Power = ARS.ALS
|
||
ARS.NGPower = S["7D"]*RC1
|
||
Train.BIS200.Power = T[10]*Train.A43.Value*(Train.ALS.Value+Train.ARS.Value)*Train.AIS.Value
|
||
ARS.KB=T[91]*RC1+(ARS.ALS*(1-Train.BSM_GE.Value)+ARS.GE*Train.BSM_GE.Value)*Train.KVT.Value
|
||
|
||
Train.BSM_KRT:TriggerInput("Set",(max(0,Panel.LST)+max(0,T[8]*Train.A41.Value)+ARS["8"])*RC1)
|
||
ARS.KRH = (max(0,T[1])+T[14])*RC1
|
||
ARS.R11 = T[15]
|
||
ARS.R12 = (T[87]+S["7Ga"]*KV["7GA-RC27"]+S["14a"]*Train.A42.Value*(1-Train.KRP.Value))
|
||
Train.BSM_KRO:TriggerInput("Set",ARS.R12*(1-Train.BSM_KRH.Value))
|
||
|
||
Panel.LKVD = ARS.GE*(1-Train.BUM_RVD2.Value)+T[87]*(1-Train.ROT2.Value)
|
||
|
||
Train.ARS_RT:TriggerInput("Set",T[4]*RC1)
|
||
ARS.DA = S["10AK"]*(KV["10AK-DA"]+Train.ARS_RT.Value)
|
||
Train.UPPS_VV.Power = S["7G"]*Train.UPPS_On.Value
|
||
Train.UPPS_VV.KB = Train.UPPS_VV.Power*(Train.KVT.Value+Train.PB.Value)
|
||
|
||
Train:WriteTrainWire(92,ARS.DA*RC1*Train.BUM_RVD1.Value+S["7D"]*(1-RC1)*Train.A58.Value*Train.KAH.Value)
|
||
Train:WriteTrainWire(93,ARS.GE*Train.BUM_RVD2.Value*RC1+S["B3"]*(1-RC1)*Train.A59.Value*Train.KAH.Value)
|
||
Train.ROT1:TriggerInput("Set",T[92])
|
||
Train.ROT2:TriggerInput("Set",T[93])
|
||
--ARSDEnd
|
||
|
||
--Old logic
|
||
--Train:WriteTrainWire(39,S["7G"]*(1-Train.OVT.Value)*(1-Train.RPB.Value))
|
||
--S["7Gb"] = S["7Ga"]*(Train.PB.Value+(Train.ARS.Value+T[91]+(T[87]+S["B3"]*Train.ARSR.Value)*(1-RC1))*(1-Train.UOS.Value))
|
||
|
||
Train:WriteTrainWire(39,(S["7G"]+S["B3"]*KRU["14/1-B3"])*(1-Train.OVT.Value)*(1-Train.RPB.Value))
|
||
|
||
S["7Gb"] = ARS.FMM1*(Train.PB.Value+(Train.ARS.Value+T[91]+(T[87]+S["B3"]*Train.ARSR.Value)*(1-RC1))*(1-Train.UOS.Value))
|
||
Train.RPB:TriggerInput("Set",S["7Gb"])
|
||
S["33Yu"] = S["7G"]*(Train.SOT.Value+Train.UOS.Value)*Train.ROT1.Value*KV["7G-33Yu"] --7G-SOT/UOS-KV
|
||
S["33Yu0"] = (Train.RPB.Value+Train.VAH.Value)*(Train.KD.Value+Train.VAD.Value) --RVT-RPB/VAH-KD/VAD-0
|
||
Train.RV2:TriggerInput("Set",S["33Yu"]*S["33Yu0"])
|
||
Train:WriteTrainWire(1,S["10AK"]*Train.R1_5.Value + KRU["1/3-ZM31"]*-10)
|
||
Train:WriteTrainWire(2,S["U2"]*KV["U2-2"]+ARS["2"]*RC1 + KRU["2/3-ZM31"]*-10) --U2-KV-2 FIXME ARS?
|
||
Train:WriteTrainWire(3,S["U2"]*KV["U2-3"])
|
||
Train:WriteTrainWire(6,S["10AK"]*Train.K6.Value)
|
||
Train:WriteTrainWire(8,BO*(KV["10-8"]+ARS["8"]*RC1)*Train.A41.Value)--10-KV-8 FIXME ARS
|
||
Train:WriteTrainWire(20,S["U2"]*KV["U2-20a"]*Train.ROT1.Value+(ARS["33G"]*RC1+S["U2"]*KV["U2-20b"])+KRU["20/3-ZM31"]*-10)
|
||
Train:WriteTrainWire(25,S["U2"]*KV["U2-25"]*Train.A55.Value*Train.K25.Value)
|
||
|
||
S["U2a"] = ARS["33G"]*RC1+S["U2"]*KV["U2-U2a"] --U2-KV-U2a
|
||
S["19B"] = S["10AK"]*KV["10AK-DA"]*Train.ROT1.Value --DA-19B
|
||
if self.HaveRO then
|
||
Train:WriteTrainWire(19,S["19B"]*(KV["19B-19"]+Train.RO.Value)*Train.A71.Value) --19B-KV/RO-A71-19
|
||
else
|
||
Train:WriteTrainWire(19,S["19B"]*KV["19B-19"]*Train.A71.Value) --19B-KV/RO-A71-19
|
||
end
|
||
Train.R1_5:TriggerInput("Set",S["19B"]*Train.RV2.Value*Train.UAVAC.Value*(Train.AVU.Value+Train.OtklAVU.Value))
|
||
Train.RVT:TriggerInput("Set",S["U2a"])
|
||
Train.K25:TriggerInput("Set",S["U2a"]*(Train.ROT1.Value+(1-RC1)))
|
||
Train.K6:TriggerInput("Set",S["10AK"]*Train.RVT.Value) --10AK-K6
|
||
--Train.Rp8:TriggerInput("Set",T[8])
|
||
|
||
|
||
S["U4"] = S["10AK"]*KV["10AK-U4"]*Train.A74.Value--10AK-KV-U4
|
||
Train:WriteTrainWire(17,S["U4"]*Train.VozvratRP.Value)
|
||
Train:WriteTrainWire(71,S["U4"]*Train.OtklBV.Value)
|
||
Train:WriteTrainWire(24,S["U2"]*Train.A73.Value*Train.KSN.Value)
|
||
S["V2"] = T[10]*Train.AV1.Value
|
||
if self.Vent then
|
||
Train:WriteTrainWire(59,S["V2"]*Train.V11.Value)
|
||
Train:WriteTrainWire(60,S["V2"]*Train.V12.Value)
|
||
Train:WriteTrainWire(58,BO*Train.A49.Value*(1-Train.V11.Value)*(1-Train.V12.Value)*Train.V13.Value)
|
||
Panel.L1 = T[57]
|
||
end
|
||
Panel.M8 = S["V2"]*Train.PVK.Value
|
||
Train.RPvozvrat.VozRpPressed = T[17]
|
||
|
||
Train.C1:TriggerInput("Set", T[1])
|
||
Panel.IST = Train.C1.Value*Train.VKST.Value*T[64]
|
||
|
||
local ASNP_VV = Train.ASNP_VV
|
||
ASNP_VV.Power = T[10]*Train.R_ASNPOn.Value
|
||
ASNP_VV.AmplifierPower = ASNP_VV.Power*Train.ASNP.LineOut*Train.R_UNch.Value*Train.A26.Value
|
||
Train:WriteTrainWire(13,ASNP_VV.AmplifierPower)
|
||
Train:WriteTrainWire(-13,ASNP_VV.AmplifierPower*Train.PowerSupply.X2_2)
|
||
ASNP_VV.CabinSpeakerPower = ASNP_VV.Power*Train.ASNP.LineOut*Train.R_G.Value
|
||
|
||
Panel.AnnouncerPlaying = T[13]
|
||
Panel.AnnouncerBuzz = T[-13]+ASNP_VV.CabinSpeakerPower*Train.PowerSupply.X2_2
|
||
Train:WriteTrainWire(14,S["14a"]*(Train.SOT.Value+Train.UOS.Value)*Train.KRP.Value*Train.ROT2.Value)
|
||
Panel.PCBKPower = BO
|
||
Panel.CBKIPower = Panel.PCBKPower
|
||
end
|
||
if self.OldFLARS then
|
||
Panel.LUDS = ARS.FMM1*Train.AIS.Value
|
||
else
|
||
Panel.LUDS = T[10]*Train.AIS.Value
|
||
end
|
||
|
||
--Вагонная часть
|
||
S["10A"] = BO*Train.A30.Value
|
||
S["ZR"] = (1-Train.RRP.Value)+(B*Train.A39.Value*(1-Train.RPvozvrat.Value)*Train.RRP.Value)*-1
|
||
|
||
if isMVM then
|
||
S["1A"] = T[1]*Train.A1.Value*Train.IGLA_PCBK.KVC
|
||
else
|
||
S["1A"] = T[1]*Train.A1.Value
|
||
end
|
||
S["6A"] = T[6]*Train.A6.Value
|
||
Train.TR1:TriggerInput("Set",S["6A"])
|
||
--1A-PMU-1T-NR/RPU-1P(6^)
|
||
|
||
S["1P"] = S["1A"]*P.PM*(Train.NR.Value+Train.RPU.Value)+S["6A"]*P.PT
|
||
|
||
--1P-RK1-18-AVT-!RP-RKR-DR1-DR2-1G
|
||
S["1G"] = S["1P"]*C(1 <= RK and RK <= 18)*Train.AVT.Value*(1-Train.RPvozvrat.Value)*Train.RKR.Value--FIXME
|
||
S["1L"] = S["1G"]*C(RK==1)*(Train.KSB1.Value+Train.KSH1.Value)*Train.LK2.Value
|
||
S["1Zh"] = (S["1L"]+S["1G"]*Train.LK3.Value)*S["ZR"]
|
||
Train.LK1:TriggerInput("Set",S["1Zh"]*P.PM)
|
||
Train.LK3:TriggerInput("Set",S["1Zh"])
|
||
Train.LK4:TriggerInput("Set",S["1Zh"]*Train.LK3.Value)
|
||
S["3A"] = T[3]*Train.A3.Value
|
||
S["6G1"] = S["6A"]*P.PT*C(RK==1)
|
||
self.ThyristorControllerWork = S["6G1"]*(Train.KSB1.Value+Train.KSB2.Value)*Train.LK2.Value
|
||
S["6G2"] = S["6G1"]*(1-Train.RSU.Value)
|
||
Train.KSB1:TriggerInput("Set",S["6G2"])
|
||
Train.KSB2:TriggerInput("Set",S["6G2"])
|
||
--20-A20-20A-Rp-20B
|
||
if isMVM then
|
||
S["20A"] = T[20]*Train.A20.Value*Train.IGLA_PCBK.KVC
|
||
else
|
||
S["20A"] = T[20]*Train.A20.Value
|
||
end
|
||
--Train.RPL:TriggerInput("Set",--[[ S["20A"]--]] BO*(1-Train.RPvozvrat.Value)*(Train.DR1.Value+Train.DR2.Value+(1-Train.BV.State)))
|
||
if not isDot2 then
|
||
Train.RPL:TriggerInput("Set",S["20A"]*(1-Train.RPvozvrat.Value)*(Train.DR1.Value+Train.DR2.Value+(1-Train.BV.State)))
|
||
end
|
||
S["20B"] = S["20A"]*(1-Train.RPvozvrat.Value)
|
||
S["20K"] = S["20B"]*P.PS
|
||
Train.LK2:TriggerInput("Set",S["20K"]*S["ZR"])
|
||
Train.LK5:TriggerInput("Set",S["20B"]*Train.LK1.Value*S["ZR"])
|
||
|
||
if self.X2PS then
|
||
S["1M"] = C(1<=RK and RK<=5)*S["3A"]+S["20A"]*Train.KSH2.Value
|
||
S["1R"] = (S["1A"]*C(RK==1)+S["1M"]*P.PP)*S["ZR"]
|
||
Train.KSH1:TriggerInput("Set",S["1R"])
|
||
Train.KSH2:TriggerInput("Set",S["1R"])
|
||
P:TriggerInput("PP",S["3A"]*Train.LK5.Value*C(RK==18)*S["ZR"])--1A-1D
|
||
else
|
||
S["1M"] = C(1<=RK and RK<=5)*S["3A"]+S["10A"]*Train.KSH2.Value
|
||
S["1R"] = (S["1A"]*C(RK==1)*P.PS + S["1M"]*P.PP)*S["ZR"]
|
||
Train.KSH1:TriggerInput("Set",S["1R"])
|
||
Train.KSH2:TriggerInput("Set",S["1R"])
|
||
P:TriggerInput("PP",S["1A"]*C(RK==18)*S["ZR"])--1A-1D
|
||
end
|
||
|
||
|
||
local Reverser = Train.Reverser
|
||
S["4A"] = T[4]*Train.A4.Value
|
||
Reverser:TriggerInput("NZ",S["4A"]*Reverser.VP*(1-Train.LK1.Value)*S["ZR"])
|
||
S["5A"] = T[5]*Train.A5.Value
|
||
Reverser:TriggerInput("VP",S["5A"]*Reverser.NZ*(1-Train.LK1.Value)*S["ZR"])
|
||
--Train.RKR:TriggerInput("Set",(S["4A"]*Reverser.NZ+S["5A"]*Reverser.VP)) --81-717.5(м) МСК
|
||
if isDot2 then
|
||
Train.RKR:TriggerInput("Set",(S["4A"]*Reverser.NZ+S["5A"]*Reverser.VP)*S["ZR"]) --81-717.2
|
||
else
|
||
Train.RKR:TriggerInput("Set",(S["4A"]*Reverser.NZ+S["5A"]*Reverser.VP)*Train.BV.State*S["ZR"]) --81-717.5 Харьков*S["ZR"]
|
||
end
|
||
--+B
|
||
S["1N"] = C(11<=RK and RK<=18)*(1-Train.LK4.Value)
|
||
Train.RR:TriggerInput("Set",S["10A"]*S["1N"] + P.PS*Train.LK4.Value)
|
||
|
||
S["5Zh"] = S["10A"]*(1-Train.LK3.Value)
|
||
P:TriggerInput("PS",S["5Zh"]*(P.PP))
|
||
P:TriggerInput("PM",S["5Zh"]*(1-Train.TR1.Value)*Train.KSH2.Value)
|
||
P:TriggerInput("PT",S["5Zh"]*(P.PM)*(1-Train.KSH2.Value))
|
||
--P:TriggerInput("PP",S["5Zh"]*(P.PM))
|
||
S["2A"] = (T[2]+T[-2])*Train.A2.Value
|
||
S["2T"] = S["2A"]*Train.TR1.Value
|
||
Train.RSU:TriggerInput("Set",S["2T"]*Train.ThyristorBU5_6.Value)
|
||
Train.RU:TriggerInput("Set",S["2T"])
|
||
S["2B"] = S["2A"]*((1-Train.KSB1.Value)*(1-Train.KSB2.Value)+(1-Train.TR1.Value))
|
||
|
||
S["2Ca"] = P.PS*C(1<=RK and RK<=17)*Train.RR.Value --CHECK
|
||
S["2Cb"] = P.PP*(C(6<=RK and RK<=18)+C(2<=RK and RK<=5)*Train.KSH1.Value)*(1-Train.RR.Value) --CHECK
|
||
S["2C"] = S["2B"]*(S["2Ca"]+S["2Cb"])*Train.LK4.Value
|
||
S["10R"] = S["10A"]*(1-Train.LK3.Value)*C(2<=RK and RK<=18)*(1-Train.LK4.Value)
|
||
S["2U"] = S["10R"]+S["2C"]*S["ZR"]
|
||
Train.SR1:TriggerInput("Set",S["2U"])
|
||
Train.RV1:TriggerInput("Set",S["2U"])
|
||
S["2Zh"] = T[2]*Train.A2.Value*Train.TR1.Value*C(17<=RK and RK<=18)
|
||
if self.NoRT2 then
|
||
Train.PneumaticNo1:TriggerInput("Set",S["2Zh"]+T[48]*Train.A72.Value)
|
||
Train:WriteTrainWire(-2,Train.A2.Value*Train.TR1.Value*C(17<=RK and RK<=18)*T[48]*Train.A72.Value)
|
||
else
|
||
Train.PneumaticNo1:TriggerInput("Set",S["2Zh"]+T[48]*Train.A72.Value*(1-Train.RT2.Value))
|
||
Train:WriteTrainWire(-2,Train.A2.Value*Train.TR1.Value*C(17<=RK and RK<=18)*T[48]*Train.A72.Value*(1-Train.RT2.Value))
|
||
end
|
||
if isMVM then --UNREALISTIC
|
||
S["8A"] = T[8]*Train.A8.Value*(1-Train.RV1.Value)*(1-Train.RT2r.Value)*(1-Train.RV3.Value)
|
||
else
|
||
S["8A"] = T[8]*Train.A8.Value*(1-Train.RV1.Value)*(1-Train.RT2.Value)*(1-Train.RV3.Value)
|
||
end
|
||
Train.PneumaticNo2:TriggerInput("Set",S["8A"]+T[39]*Train.A52.Value)
|
||
Train.RV3:TriggerInput("Set",T[19]*Train.A19.Value)
|
||
S["25A"] = T[25]*Train.A25.Value
|
||
S["10X"] = (--[[ S["1N"]*P.PS+--]] Train.LK4.Value+C(RK==1)*Train.LK2.Value)
|
||
Train["RRTpod"] = S["10A"]*RheostatController.RKM2*S["10X"]
|
||
Train["RRTuderzh"] = S["25A"]
|
||
Train["RUTpod"] = S["10A"]*RheostatController.RKM1*S["10X"]
|
||
Train["RUTavt"] = Train.A70.Value*B
|
||
Train.RRT:TriggerInput("Close",Train.RRTuderzh*Train.RRTpod)
|
||
Train.RRT:TriggerInput("Open",(1-Train.RRTuderzh))
|
||
|
||
Train.RRP:TriggerInput("Set",T[14]*Train.A14.Value)--14A
|
||
--СДРК Б+ провод
|
||
S["10A3"] = BO*Train.A28.Value
|
||
S["10BG"] = S["10A3"]*(Train.TR1.Value + Train.RV1.Value)
|
||
RheostatController:TriggerInput("MotorCoilState",min(1,S["10A"]*(S["10BG"]*Train.RR.Value - S["10BG"]*(1-Train.RR.Value))))
|
||
Train.RVO:TriggerInput("Set",S["10A3"]*Train.NR.Value)
|
||
self.ThyristorControllerPower = S["10A3"]
|
||
--[[ S["10Ra"] = T[10]*RheostatController.RKM1
|
||
S["10Rb"] = T[10]*Train.SR1.Value
|
||
S["10RbA"] = S["10Rb"]*(1-Train.RRT.Value)*(1-Train.RUT.Value)+S["10Ra"]
|
||
S["10RbB"] = S["10Rb"]*Train.RUT.Value
|
||
S["10RB"] = S["10RbA"]+S["10RbB"]*Train.RRT.Value+S["10RbB"]*(1-Train.SR1.Value)
|
||
|
||
S["10Rc"] = T[10]*Train.LK3.Value*C(RK>=18 or RK<=1)
|
||
S["10RS"] = S["10Ra"]+S["10RB"]*(1-RheostatController.RKP)*S["10Rc"]--]]
|
||
S["10Yu"] = S["10A"]*Train.SR1.Value
|
||
S["10M"] = S["10Yu"]*(1-Train.RRT.Value)*(1-Train.RUT.Value)
|
||
S["10N"] = S["10A"]*RheostatController.RKM1+S["10M"]
|
||
S["10T"] = (Train.RUT.Value+Train.RRT.Value+(1-Train.SR1.Value))*(RheostatController.RKP)+S["10A"]*Train.LK3.Value*C(RK>=18 and RK<=1)
|
||
RheostatController:TriggerInput("MotorState",S["10N"]+S["10T"]*(-10))
|
||
|
||
Train.RZ_2:TriggerInput("Set",T[24]*(1-Train.LK4.Value))
|
||
S["17A"] = T[17]*Train.A18.Value
|
||
if not isDot2 then
|
||
Train.BV:TriggerInput("Power",BO*Train.A80.Value)
|
||
Train.BV:TriggerInput("Enable",S["17A"]*Train.A81.Value)
|
||
end
|
||
if isMVM then
|
||
Train.BV:TriggerInput("Disable",T[71]*Train.A66.Value)
|
||
end
|
||
Train.RPvozvrat:TriggerInput("Open",S["17A"]) --FIXME Mayve more right RP code
|
||
--
|
||
--Вспом цепи
|
||
Train:WriteTrainWire(10,BO*Train.A56.Value)
|
||
--B->A44->KMMK->23
|
||
Train:WriteTrainWire(23,S["B3"]*Train.RezMK.Value)
|
||
if isLVZ then
|
||
S["10AT"] = T[10]*Train.A29.Value*(1-Train.AVU.Value)
|
||
else
|
||
S["10AT"] = T[10]*Train.A11.Value*(1-Train.AVU.Value)
|
||
end
|
||
Panel.AVU = S["10AT"]
|
||
|
||
if isKSD then
|
||
S["48A"] = S["10AT"]*(1-Train.OtklAVU.Value)+BO*Train.A49.Value*Train.VZ1.Value+AVO["48"]*RC2
|
||
elseif isLVZ then
|
||
S["48A"] = S["10AT"]*(1-Train.OtklAVU.Value)+BO*Train.A49.Value*Train.VZ1.Value+ARS["48"]*RC1+AVO["48"]*RC2
|
||
elseif not isDot2 then
|
||
S["48A"] = S["10AT"]*(1-Train.OtklAVU.Value)+T[10]*Train.AV1.Value*Train.VZ1.Value+ARS["48"]*RC1
|
||
else
|
||
S["48A"] = S["10AT"]*(1-Train.OtklAVU.Value)+T[10]*Train.AV1.Value*Train.VZ1.Value
|
||
end
|
||
if self.NoRT2 then
|
||
Train:WriteTrainWire(48,S["48A"]+Train.A72.Value*S["2Zh"]) --FIXME ARS
|
||
else
|
||
Train:WriteTrainWire(48,S["48A"]+Train.A72.Value*S["2Zh"]*(1-Train.RT2.Value)) --FIXME ARS
|
||
end
|
||
if self.HaveRO then
|
||
if isKSD then
|
||
Train.RO:TriggerInput("Set",(T[48]+AVO["48"]+S["48A"])*RC1)
|
||
elseif isMVM then
|
||
Train.RO:TriggerInput("Set",(T[48]+ARS["48"]+S["48A"])*RC1)
|
||
else
|
||
Train.RO:TriggerInput("Set",(T[48]+ARS["48"]+S["48A"])*(RC1+RC2))
|
||
end
|
||
end
|
||
|
||
if isDot2 then Train:WriteTrainWire(11,B*Train.VA.Value) end
|
||
|
||
S["B9"] = B*Train.A53.Value
|
||
S["22B"] = T[10]*Train.A10.Value*Train.VMK.Value
|
||
Train:WriteTrainWire(22,(S["22B"]+T[44])*Train.AK.Value)
|
||
Train:WriteTrainWire(44,S["22B"])
|
||
S["UO"] = T[10]*Train.A27.Value
|
||
Train:WriteTrainWire(27,S["UO"]*Train.L_1.Value)
|
||
S["UO"] = S["UO"] + T[27]*Train.L_1.Value
|
||
S["F1"] = S["B9"]*KV["B9-F1"]
|
||
if isLVZ then
|
||
if isKSD then
|
||
S["TU"] = S["F1"]*Train.Ring.Value
|
||
Train:WriteTrainWire(7,S["TU"]+T[71]*Train.OhrSig.Value)
|
||
else
|
||
S["TU"] = S["F1"]*Train.A7.Value*Train.Ring.Value
|
||
Train:WriteTrainWire(7,S["TU"]+T[71]*Train.OhrSig.Value+ARS.Ring)
|
||
end
|
||
Panel.OhrSig = T[71]
|
||
Train:WriteTrainWire(71,S["UO"]*(1-Train.SQ3.Value)+S["TU"]*Train.OhrSig.Value)
|
||
else
|
||
if not isDot2 then
|
||
Train:WriteTrainWire(7,S["UO"]*Train.Ring.Value+ARS.Ring+Train.BZOS.VH2*0.4)
|
||
Train.BZOS.Power = T[10]*Train.A27.Value
|
||
Train.BZOS.Ring = T[7]
|
||
else
|
||
Train:WriteTrainWire(7,S["UO"]*Train.Ring.Value) --FIXME Ring buttons
|
||
end
|
||
Train:WriteTrainWire(72,S["F1"])
|
||
Panel.LEKK = T[72]
|
||
end
|
||
--[[if isPA then
|
||
Panel.Ring = T[7]+AVO.Ring -- FIXME ARS
|
||
else
|
||
Panel.Ring = T[7] -- FIXME ARS
|
||
end]]
|
||
Panel.Ring = T[7]
|
||
|
||
if self.GreenRPRKR then
|
||
S["10AN"] = Train.RPvozvrat.Value+(1-Train.RKR.Value) --81-717 Харьков
|
||
else
|
||
S["10AN"] = Train.RPvozvrat.Value --81-717 МСК
|
||
end
|
||
S["18A"] = (S["10AN"]*100+(1-Train.LK4.Value))*Train.A38.Value
|
||
Train:WriteTrainWire(18,S["18A"])
|
||
Panel.TW18 = S["18A"]
|
||
Panel.GreenRP = S["10AN"]*S["UO"]
|
||
|
||
S["36N"] = BO*Train.A45.Value
|
||
Train:WriteTrainWire(37,Train.ConverterProtection.Value)
|
||
Train:WriteTrainWire(69,S["36N"]*Train.BPSNon.Value)
|
||
Train:WriteTrainWire(36,T[69]*(1-Train.BPSNon.Value))
|
||
Panel.LKVP = T[36]
|
||
Panel.RZP = T[36]*T[61]
|
||
|
||
S["B9a"] = S["B9"]*Train.VB.Value
|
||
Train.KVC:TriggerInput("Set",S["B9a"])
|
||
Train.KUP:TriggerInput("Set",S["B9a"]*Train.A75.Value)
|
||
Panel.KUP = S["B9a"]*Train.KUP.Value
|
||
|
||
S["D4"] = BO*Train.A13.Value
|
||
S["D1"] = T[10]*Train.A21.Value*KV["D-D1"]+S["14b"]*KRU["11/3-D1/1"]
|
||
if isLVZ then
|
||
if isKSD then
|
||
S[16] = S["D1"]*Train.VUD1.Value
|
||
else
|
||
S[16] = S["D1"]*Train.VUD1.Value*Train.VUD2.Value
|
||
end
|
||
Train:WriteTrainWire(16,S[16]+AVO["16"]*RC2)
|
||
S[68] = S["D1"]*AVO["68"]*Train.VOPD.Value
|
||
AVI.OPD = S["D1"]*Train.VOPD.Value
|
||
Train:WriteTrainWire(68,AVI.OPD*AVO["68"])
|
||
S[31] = S["D1"]*(1-Train.DoorSelect.Value)--*(1-Train.VUD1.Value)
|
||
S[32] = S["D1"]*Train.DoorSelect.Value--*(1-Train.VUD1.Value)
|
||
AVI.KDL = S[31]*(Train.KDL.Value+Train.KDLR.Value)
|
||
AVI.KDP = S[32]*Train.KDP.Value
|
||
S[31] = S[31]*(1-Train.VUD1.Value)
|
||
S[32] = S[32]*(1-Train.VUD1.Value)
|
||
else
|
||
Train:WriteTrainWire(16,S["D1"]*(Train.VUD1.Value*Train.VUD2.Value))
|
||
S[31] = S["D1"]*(1-Train.DoorSelect.Value)
|
||
S[32] = S["D1"]*Train.DoorSelect.Value
|
||
end
|
||
Train:WriteTrainWire(12,S["D1"]*Train.KRZD.Value)
|
||
Panel.DoorsLeft = S[31]
|
||
Panel.DoorsRight = S[32]
|
||
|
||
S["12A"] = T[12]*Train.A12.Value
|
||
if isLVZ then
|
||
if isPA then AVI.ZD = S[16] end
|
||
Train:WriteTrainWire(31,S[31]*(Train.KDL.Value*(1-RC2))+S["D1"]*Train.VDL.Value+AVO["31"]*RC2 + S["12A"]*Train.A31.Value)
|
||
Train:WriteTrainWire(32,S[32]*(Train.KDP.Value)*(1-RC2)+AVO["32"]*RC2 + S["12A"]*Train.A32.Value)
|
||
elseif not isDot2 then
|
||
Train:WriteTrainWire(31,S[31]*(Train.KDL.Value+Train.KDLR.Value+Train.VDL.Value)*(Train.ASNP.K1+(1-Train.VBD.Value)) + S["12A"]*Train.A31.Value)
|
||
Train:WriteTrainWire(32,S[32]*Train.KDP.Value*(Train.ASNP.K2+(1-Train.VBD.Value)) + S["12A"]*Train.A32.Value)
|
||
else
|
||
Train:WriteTrainWire(31,S[31]*(Train.KDL.Value+Train.KDLR.Value+Train.VDL.Value) + S["12A"]*Train.A31.Value)
|
||
Train:WriteTrainWire(32,S[32]*Train.KDP.Value + S["12A"]*Train.A32.Value)
|
||
end
|
||
|
||
|
||
if isMVM then
|
||
S["15B"] = T[15]*(KV["15A-15B"]+Train.KD.Value)
|
||
else
|
||
S["15B"] = T[15]
|
||
end
|
||
if isLVZ then AVI.KD = min(1,S["15B"]) end
|
||
Train.KD:TriggerInput("Set",S["15B"])
|
||
Panel.SD = S["15B"]
|
||
--FIXME ARS FMM2
|
||
--F1->F2->BPF
|
||
S["F8"] = S["F7"]*Train.L_4.Value
|
||
Train.Panel.Headlights1 = S["F8"]*Train.A46.Value
|
||
Train.Panel.Headlights2 = S["F8"]*Train.VUS.Value*Train.A47.Value
|
||
if isKSD then
|
||
S["F1"] = min(1,S["F1"]+T[71]*Train.OhrSig.Value*Train.Ring.Value)
|
||
Train.Panel.RedLight1 = S["F1"]*Train.A7.Value
|
||
elseif isLVZ then
|
||
Train.Panel.RedLight1 = (S["F1"]+T[71]*Train.OhrSig.Value*Train.Ring.Value)*Train.A7.Value
|
||
S["F1"] = min(1,S["F1"]+Train.Panel.RedLight1*Train.A9.Value)
|
||
else
|
||
Train.Panel.RedLight1 = S["F1"]*Train.A7.Value
|
||
end
|
||
Train.Panel.RedLight2 = S["F1"]*Train.A9.Value
|
||
|
||
if isPUAV then
|
||
Train:WriteTrainWire(-34,S["F1"])
|
||
Panel.KT = (S["F1"]+T[34]*T[-34])*ARS.LKT*RC1
|
||
ARS.KT = T[34]*T[-34]
|
||
elseif isLVZ then
|
||
Train:WriteTrainWire(-34,S["F1"])
|
||
Panel.KT = S["F1"]+T[34]*T[-34]
|
||
ARS.KT = T[34]*T[-34]
|
||
elseif not isDot2 then
|
||
--S["KT"] = ARS.FMM1*(1-Train.BSM_GE.Value)
|
||
S["KT"] = S["7D"]*(1-Train.BSM_GE.Value)+S["B3"]*(1-RC1)
|
||
Train:WriteTrainWire(-34,S["KT"])
|
||
ARS.KT = T[34]*T[-34]*Train.BSM_GE.Value
|
||
Train.BUM_KPP:TriggerInput("Set",S["KT"]*(1-Train.BSM_GE.Value)+ARS.KT)
|
||
end
|
||
Train:WriteTrainWire(34,Train.RKTT.Value+Train.DKPT.Value)
|
||
|
||
--[[ if isLVZ then
|
||
S[-28] = S["D4"]*KV["D4-15"]+S["14b"]
|
||
else
|
||
S[-28] = S["D4"]*KV["D4-15"]
|
||
end
|
||
Train:WriteTrainWire(-28,S[-28])--]]
|
||
Train:WriteTrainWire(-28,S["D4"]*KV["D4-15"]+S["14b"])
|
||
Train:WriteTrainWire(28,T[-28]*Train.RD.Value)
|
||
S[15] = T[28]*KV["D8-15A"]*KRU["15/2-D8"]
|
||
Train:WriteTrainWire(15,S[15])
|
||
|
||
S[64] = S["UO"]*Train.BPT.Value
|
||
Train:WriteTrainWire(64,S[64])
|
||
Panel.BrW = S[64]
|
||
Panel.BrT = T[64]
|
||
|
||
Panel.KVC = S["UO"]*(1-Train.KVC.Value)
|
||
Panel.PanelLights = T[10]*Train.L_3.Value
|
||
|
||
|
||
--Вспом цепи приём
|
||
if isDot2 then
|
||
S["11B"] = T[11]*Train.A15.Value*(1-Train.KPP.Value)
|
||
Panel.EmergencyLights = S["11B"]
|
||
Panel.CabLights = S["UO"]*Train.L_2.Value+S["11B"]*(1-Train.L_2.Value)
|
||
else
|
||
Panel.EmergencyLights = BO*Train.A49.Value*Train.A15.Value
|
||
Panel.CabLights = S["UO"]*Train.L_2.Value
|
||
end
|
||
Panel.EqLights = T[10]*Train.A11.Value
|
||
Train.RPU:TriggerInput("Set",T[37]*Train.A37.Value)
|
||
Train.Schemes = S
|
||
|
||
S["D6"] = S["D4"]*Train.BD.Value
|
||
Train.RD:TriggerInput("Set",S["D6"])
|
||
Panel.DoorsW = S["D4"]*(1-Train.RD.Value)
|
||
Train.VDZ:TriggerInput("Set",T[16]*Train.A16.Value*(1-Train.RD.Value))
|
||
S["31A"] = T[31]*Train.A31.Value
|
||
S["32A"] = T[32]*Train.A32.Value
|
||
Train.VDOL:TriggerInput("Set",S["31A"]+S["12A"])
|
||
Train.VDOP:TriggerInput("Set",S["32A"]+S["12A"]+T[68]*Train.A68.Value)
|
||
|
||
S["36A"] = T[36]*Train.A51.Value*Train.RVO.Value--36
|
||
Train.KVP:TriggerInput("Set",S["36A"]*Train.KPP.Value)
|
||
Train.KPP:TriggerInput("Set",S["36A"]*(1-Train.RZP.Value)*Train.KVC.Value)
|
||
S["27A"] = T[27]*Train.A50.Value
|
||
Train.KO:TriggerInput("Set",S["27A"])
|
||
--S["22A"] = (T[23]*Train.A23.Value+T[22]*Train.A22.Value) --FIXME 714
|
||
S["22A"] = T[22]*Train.A22.Value
|
||
Train.KK:TriggerInput("Set",S["22A"]*(1-Train.TRK.Value))
|
||
|
||
if isLVZ then
|
||
Panel.VPR = BO*Train.AR63.Value*Train.R_VPR.Value+B*Train.AV3.Value*Train.R_VPR.Value
|
||
else
|
||
Panel.VPR = BO*Train.AR63.Value*Train.R_VPR.Value
|
||
end
|
||
|
||
--BPSN
|
||
local BPSN = Train.PowerSupply
|
||
Train.Battery:TriggerInput("Charge",BPSN.X2_2*Train.A24.Value*BO)
|
||
BPSN:TriggerInput("5x2",BO*Train.A65.Value*Train.KVP.Value)
|
||
Panel.MainLights = BPSN.X6_2*Train.KO.Value
|
||
Train.RPU:TriggerInput("Set",T[37]*Train.A37.Value)
|
||
Train.RZP:TriggerInput("Open",T[37]*Train.A37.Value*Train.RPU.Value)
|
||
Train:WriteTrainWire(61,Train.RZP.Value)
|
||
|
||
if self.Vent then
|
||
Train.KV1:TriggerInput("Set",T[59]*Train.AV4.Value*Train.RVO.Value)
|
||
Train.KV2:TriggerInput("Set",T[60]*Train.AV5.Value)
|
||
Train.KV3:TriggerInput("Set",T[58]*Train.AV6.Value)
|
||
S["AV2"] = T[10]*Train.AV2.Value
|
||
Panel.M1_3 = S["AV2"]*Train.KV1.Value
|
||
Panel.M4_7 = S["AV2"]*Train.KV2.Value+B*Train.AV3.Value*Train.KV3.Value
|
||
Train.R1:TriggerInput("Set",S["AV2"]*C(Panel.M1_3 > 0.5 and Panel.M4_7 > 0.5))
|
||
Train:WriteTrainWire(57,T[59]*(1-Train.R1.Value))
|
||
end
|
||
return S
|
||
end
|
||
function TRAIN_SYSTEM:SolveRKInternalCircuits(Train,dT,firstIter)
|
||
local P = Train.PositionSwitch
|
||
local RheostatController = Train.RheostatController
|
||
local RK = RheostatController.SelectedPosition
|
||
local B = (Train.Battery.Voltage > 55) and 1 or 0
|
||
local BO = B*Train.VB.Value
|
||
local T = Train.SolverTemporaryVariables
|
||
|
||
--Вагонная часть
|
||
S["10A"] = BO*Train.A30.Value
|
||
S["ZR"] = (1-Train.RRP.Value)+(B*Train.A39.Value*(1-Train.RPvozvrat.Value)*Train.RRP.Value)*-1
|
||
|
||
|
||
S["1N"] = C(11<=RK and RK<=18)*(1-Train.LK4.Value)
|
||
Train.RR:TriggerInput("Set",S["10A"]*S["1N"] + P.PS*Train.LK4.Value)
|
||
|
||
S["2A"] = (T[2]+T[-2])*Train.A2.Value
|
||
S["2B"] = S["2A"]*((1-Train.KSB1.Value)*(1-Train.KSB2.Value)+(1-Train.TR1.Value))
|
||
|
||
S["2Ca"] = P.PS*C(1<=RK and RK<=17)*Train.RR.Value --CHECK
|
||
S["2Cb"] = P.PP*(C(6<=RK and RK<=18)+C(2<=RK and RK<=5)*Train.KSH1.Value)*(1-Train.RR.Value) --CHECK
|
||
S["2C"] = S["2B"]*(S["2Ca"]+S["2Cb"])*Train.LK4.Value
|
||
S["10R"] = S["10A"]*(1-Train.LK3.Value)*C(2<=RK and RK<=18)*(1-Train.LK4.Value)
|
||
S["2U"] = (S["10R"]+S["2C"])*S["ZR"]
|
||
Train.SR1:TriggerInput("Set",S["2U"])
|
||
Train.RV1:TriggerInput("Set",S["2U"])
|
||
|
||
|
||
S["25A"] = T[25]*Train.A25.Value
|
||
S["10X"] = (Train.LK4.Value+C(RK==1)*Train.LK2.Value)
|
||
Train["RRTpod"] = S["10A"]*RheostatController.RKM2*S["10X"]
|
||
Train["RRTuderzh"] = S["25A"]
|
||
Train["RUTpod"] = S["10A"]*RheostatController.RKM1*S["10X"]
|
||
Train.RRT:TriggerInput("Close",Train.RRTuderzh*Train.RRTpod)
|
||
Train.RRT:TriggerInput("Open",(1-Train.RRTuderzh))
|
||
|
||
--СДРК Б+ провод
|
||
S["10A3"] = BO*Train.A28.Value
|
||
S["10BG"] = S["10A3"]*(Train.TR1.Value + Train.RV1.Value)
|
||
RheostatController:TriggerInput("MotorCoilState",min(1,S["10A"]*(S["10BG"]*Train.RR.Value - S["10BG"]*(1-Train.RR.Value))))
|
||
|
||
S["10Yu"] = S["10A"]*Train.SR1.Value
|
||
S["10M"] = S["10Yu"]*(1-Train.RRT.Value)*(1-Train.RUT.Value)
|
||
S["10N"] = S["10A"]*RheostatController.RKM1+S["10M"]
|
||
S["10T"] = (Train.RUT.Value+Train.RRT.Value+(1-Train.SR1.Value))*(RheostatController.RKP)+S["10A"]*Train.LK3.Value*C(RK>=18 and RK<=1)
|
||
RheostatController:TriggerInput("MotorState",S["10N"]+S["10T"]*(-10))
|
||
|
||
return S
|
||
end
|
||
|
||
local wires = {1,-2,2,3,4,5,6,7,8,10,11,12,14,15,16,17,18,19,20,22,23,24,27,-28,28,25,13,-13,31,32,36,37,39,44,48,53,54,57,59,60,58,57,64,34,36,-34,61,64,66,67,68,69,71,72,87,88,91,92,93,98,99}
|
||
function TRAIN_SYSTEM:SolveInternalCircuits(Train,dT,firstIter)
|
||
local T = Train.SolverTemporaryVariables
|
||
if not T then
|
||
T = {}
|
||
for i,v in ipairs(wires) do T[v] = 0 end
|
||
Train.SolverTemporaryVariables = T
|
||
end
|
||
if firstIter then
|
||
for i,v in ipairs(wires) do T[v] = min(Train:ReadTrainWire(v),1) end
|
||
self:SolveAllInternalCircuits(Train,dT)
|
||
else
|
||
self:SolveRKInternalCircuits(Train,dT)
|
||
end
|
||
end
|
||
|
||
|
||
|
||
--------------------------------------------------------------------------------
|
||
function TRAIN_SYSTEM:SolvePowerCircuits(Train,dT)
|
||
self.ExtraResistanceLK5 = 0--Train.KF_47A["L2-L4" ]*(1-Train.LK5.Value)
|
||
self.ExtraResistanceLK2 = Train.KF_47A["L12-L13"]*(1-Train.LK2.Value)
|
||
if Train.PositionSwitch.PT > 0 then -- PT
|
||
self.R1 = Train.ResistorBlocks.R1C1(Train)
|
||
self.R2 = Train.ResistorBlocks.R2C1(Train)
|
||
self.R3 = 0
|
||
elseif Train.PositionSwitch.PS > 0 then -- PS
|
||
self.R1 = Train.ResistorBlocks.R1C1(Train)
|
||
self.R2 = Train.ResistorBlocks.R2C1(Train)
|
||
self.R3 = 0.0
|
||
elseif Train.PositionSwitch.PP > 0 then --PP
|
||
self.R1 = Train.ResistorBlocks.R1C2(Train)
|
||
self.R2 = Train.ResistorBlocks.R2C2(Train)
|
||
self.R3 = 0.0
|
||
else
|
||
self.R1 = 1e9
|
||
self.R2 = 1e9
|
||
self.R3 = 1e9
|
||
end
|
||
-- Apply LK3, LK4 contactors
|
||
self.R1 = self.R1 + 1e9*(1 - Train.LK3.Value)
|
||
self.R2 = self.R2 + 1e9*(1 - Train.LK4.Value)
|
||
|
||
-- Shunt resistance
|
||
self.Rs1 = Train.ResistorBlocks.S1(Train) + 1e9*(1 - Train.KSH1.Value)
|
||
self.Rs2 = Train.ResistorBlocks.S2(Train) + 1e9*(1 - Train.KSH2.Value)
|
||
|
||
-- Thyristor contrller
|
||
if self.ThyristorController then
|
||
self.Rs1 = ((self.ThyristorResistance^(-1)) + (self.Rs1^(-1)))^(-1)
|
||
self.Rs2 = ((self.ThyristorResistance^(-1)) + (self.Rs2^(-1)))^(-1)
|
||
end
|
||
|
||
-- Calculate total resistance of engines winding
|
||
local RwAnchor = Train.Engines.Rwa*2 -- Double because each set includes two engines
|
||
local RwStator = Train.Engines.Rws*2
|
||
-- Total resistance of the stator + shunt
|
||
self.Rstator13 = (RwStator^(-1) + self.Rs1^(-1))^(-1)
|
||
self.Rstator24 = (RwStator^(-1) + self.Rs2^(-1))^(-1)
|
||
-- Total resistance of entire motor
|
||
self.Ranchor13 = RwAnchor
|
||
self.Ranchor24 = RwAnchor
|
||
|
||
if Train.PositionSwitch.PT> 0 then -- PS
|
||
self:SolvePT(Train)
|
||
elseif Train.PositionSwitch.PS > 0 then -- PS
|
||
self:SolvePS(Train)
|
||
elseif Train.PositionSwitch.PP > 0 then
|
||
self:SolvePP(Train,Train.RheostatController.SelectedPosition >= 17)
|
||
else
|
||
self:SolvePT(Train)
|
||
end
|
||
|
||
-- Calculate current through rheostats 1, 2
|
||
self.IR1 = self.I13
|
||
self.IR2 = self.I24
|
||
|
||
-- Calculate induction properties of the motor
|
||
self.I13SH = self.I13SH or self.I13
|
||
self.I24SH = self.I24SH or self.I24
|
||
|
||
-- Time constant
|
||
--local T13const1 = math.max(16.00,math.min(28.0,(self.R13^2) * 2.0)) -- R * L
|
||
--local T24const1 = math.max(16.00,math.min(28.0,(self.R24^2) * 2.0)) -- R * L
|
||
local T13const1 = math.max(16.00,math.min(36.0,(self.R13^2) * 2.0)) -- R * L
|
||
local T24const1 = math.max(16.00,math.min(36.0,(self.R24^2) * 2.0)) -- R * L
|
||
|
||
-- Total change
|
||
local dI13dT = T13const1 * (self.I13 - self.I13SH) * dT
|
||
local dI24dT = T24const1 * (self.I24 - self.I24SH) * dT
|
||
|
||
-- Limit change and apply it
|
||
if dI13dT > 0 then dI13dT = math.min(self.I13 - self.I13SH,dI13dT) end
|
||
if dI13dT < 0 then dI13dT = math.max(self.I13 - self.I13SH,dI13dT) end
|
||
if dI24dT > 0 then dI24dT = math.min(self.I24 - self.I24SH,dI24dT) end
|
||
if dI24dT < 0 then dI24dT = math.max(self.I24 - self.I24SH,dI24dT) end
|
||
self.I13SH = self.I13SH + dI13dT
|
||
self.I24SH = self.I24SH + dI24dT
|
||
self.I13 = self.I13SH
|
||
self.I24 = self.I24SH
|
||
|
||
-- Re-calculate total current and simulate infinite resistance in circuit
|
||
if Train.PositionSwitch.PT > 0 then
|
||
self.I13 = self.I13*Train.LK3.Value*Train.LK4.Value*Train.LK2.Value
|
||
self.I24 = self.I24*Train.LK4.Value*Train.LK3.Value*Train.LK2.Value
|
||
|
||
self.Itotal = self.I13 + self.I24
|
||
elseif Train.PositionSwitch.PS > 0 then -- PS
|
||
self.I13 = self.I13*Train.LK3.Value*Train.LK4.Value*Train.LK1.Value*Train.LK2.Value
|
||
self.I24 = self.I24*Train.LK3.Value*Train.LK4.Value*Train.LK1.Value*Train.LK2.Value
|
||
|
||
self.I24 = (self.I24 + self.I13)*0.5
|
||
self.I13 = self.I24
|
||
self.Itotal = self.I24
|
||
elseif Train.PositionSwitch.PP > 0 then -- PP
|
||
self.I13 = self.I13*Train.LK3.Value*Train.LK1.Value
|
||
self.I24 = self.I24*Train.LK4.Value*Train.LK1.Value
|
||
|
||
self.Itotal = self.I13 + self.I24
|
||
end
|
||
|
||
-- Calculate extra information
|
||
self.Uanchor13 = self.I13 * self.Ranchor13
|
||
self.Uanchor24 = self.I24 * self.Ranchor24
|
||
self.Ianchor13 = self.I13
|
||
self.Ianchor24 = self.I24
|
||
|
||
|
||
|
||
----------------------------------------------------------------------------
|
||
-- Calculate current through stator and shunt
|
||
self.Ustator13 = self.I13 * self.Rstator13
|
||
self.Ustator24 = self.I24 * self.Rstator24
|
||
|
||
self.Ishunt13 = self.Ustator13 / self.Rs1
|
||
self.Istator13 = self.Ustator13 / RwStator
|
||
self.Ishunt24 = self.Ustator24 / self.Rs2
|
||
self.Istator24 = self.Ustator24 / RwStator
|
||
|
||
if Train.PositionSwitch.PT > 0 then
|
||
local I1,I2 = self.Ishunt13,self.Ishunt24
|
||
self.Ishunt13 = -I2
|
||
self.Ishunt24 = -I1
|
||
|
||
I1,I2 = self.Istator13,self.Istator24
|
||
self.Istator13 = -I2
|
||
self.Istator24 = -I1
|
||
end
|
||
|
||
-- Calculate current through RT2 relay
|
||
self.IRT2 = math.abs(self.Itotal * Train.PositionSwitch.PT)
|
||
|
||
-- Sane checks
|
||
if self.R1 > 1e5 then self.IR1 = 0 end
|
||
if self.R2 > 1e5 then self.IR2 = 0 end
|
||
|
||
-- Calculate power and heating
|
||
local K = 12.0*1e-5
|
||
local H = (10.00+(15.00*Train.Engines.Speed/80.0))*1e-3
|
||
self.P1 = (self.IR1^2)*self.R1
|
||
self.P2 = (self.IR2^2)*self.R2
|
||
self.T1 = (self.T1 + self.P1*K*dT - (self.T1-25)*H*dT)
|
||
self.T2 = (self.T2 + self.P2*K*dT - (self.T2-25)*H*dT)
|
||
self.Overheat1 = math.min(1-1e-12,
|
||
self.Overheat1 + math.max(0,(math.max(0,self.T1-750.0)/400.0)^2)*dT )
|
||
self.Overheat2 = math.min(1-1e-12,
|
||
self.Overheat2 + math.max(0,(math.max(0,self.T2-750.0)/400.0)^2)*dT )
|
||
|
||
-- Energy consumption
|
||
self.ElectricEnergyUsed = self.ElectricEnergyUsed + math.max(0,self.EnergyChange)*dT
|
||
self.ElectricEnergyDissipated = self.ElectricEnergyDissipated + math.max(0,-self.EnergyChange)*dT
|
||
end
|
||
function TRAIN_SYSTEM:SolveThyristorController(Train, dT)
|
||
-- General state
|
||
local Active = self.ThyristorControllerPower > 0 and self.ThyristorControllerWork > 0 and Train.KSB1.Value>0
|
||
local I = (math.abs(self.I13) + math.abs(self.I24)) / 2
|
||
--local I = math.abs(Train.Electric.I13 + Train.Electric.I24)/2
|
||
--print(Train.RSU.Value,Active,Train.TR1.Value)
|
||
-- Controllers resistance
|
||
local Resistance = 0.036
|
||
-- Update RV controller signal
|
||
-- Update thyristor controller signal
|
||
local done = true
|
||
if not Active then
|
||
self.ThyristorTimeout = CurTime()
|
||
self.PrepareElectric = CurTime()
|
||
self.ThyristorState = 0.00
|
||
--[[elseif not Active then
|
||
if Train.LK2.Value == 0.0 then
|
||
self.ThyristorTimeout = CurTime()
|
||
self.PrepareElectric = CurTime()
|
||
self.ThyristorState = 0.00
|
||
end--]]
|
||
else
|
||
local T = 180.0 + (100.0 * Train.Pneumatic.WeightLoadRatio + 80.0) * Train.RU.Value
|
||
-- Generate control signal
|
||
local rnd = T / 20 --+math.random()*(10)
|
||
local dC = math.min(math.max((T - I), -20), 20)
|
||
|
||
if self.PrepareElectric then
|
||
self.ThyristorState = 0.92
|
||
if I > 162 then--I > T * 0.9 then
|
||
self.PrepareElectric = false
|
||
self.ThyristorState = (1 - math.max(0, math.min(1, ((Train.Engines.Speed - 50) / 32)) ^ 0.5)) * 0.9
|
||
end
|
||
else
|
||
self.ThyristorState = math.max(0, math.min(1, self.ThyristorState + dC / rnd * dT))
|
||
end
|
||
--print(self.ThyristorState)
|
||
|
||
--print(self.ThyristorState)
|
||
-- Generate resistance
|
||
local keypoints = {0.10, 0.008, 0.20, 0.018, 0.30, 0.030, 0.40, 0.047, 0.50, 0.070, 0.60, 0.105, 0.70, 0.165, 0.80, 0.280, 0.90, 0.650, 1.00, 15.00}
|
||
local TargetField = 0.48 + 0.52 * self.ThyristorState
|
||
local Found = false
|
||
|
||
for i = 1, #keypoints / 2 do
|
||
local X1, Y1 = keypoints[(i - 1) * 2 + 1], keypoints[(i - 1) * 2 + 2]
|
||
local X2, Y2 = keypoints[(i) * 2 + 1], keypoints[(i) * 2 + 2]
|
||
|
||
if (not Found) and (not X2) then
|
||
Resistance = Y1
|
||
Found = true
|
||
elseif (TargetField >= X1) and (TargetField < X2) then
|
||
local T = (TargetField - X1) / (X2 - X1)
|
||
Resistance = Y1 + (Y2 - Y1) * T
|
||
Found = true
|
||
end
|
||
end
|
||
|
||
done = self.PrepareElectric and (CurTime() - self.PrepareElectric) > 0.8 or not self.PrepareElectric and self.ThyristorState > 0.92
|
||
end
|
||
|
||
-- Allow or deny using manual brakes
|
||
--Train.ThyristorBU5_6:TriggerInput("Set",not self.PrepareElectric and self.ThyristorState > 0.90)
|
||
Train.ThyristorBU5_6:TriggerInput("Set", Active and done)
|
||
-- Set resistance
|
||
self.ThyristorResistance = Resistance + 1e9 * (Active and 0 or 1)
|
||
end
|
||
|
||
function TRAIN_SYSTEM:Think(dT,iter)
|
||
if not self.ResistorBlocksInit then
|
||
self.ResistorBlocksInit = true
|
||
if false and self.Type ~= 1 then
|
||
self.Train:LoadSystem("ResistorBlocks","Gen_Res_717_SPB")
|
||
else
|
||
self.Train:LoadSystem("ResistorBlocks","Gen_Res_717")
|
||
end
|
||
end
|
||
if iter == 1 then self.Train.ResistorBlocks.InitializeResistances_81_717(self.Train) end
|
||
return Metrostroi.BaseSystems["Electric"].Think(self,dT,iter)
|
||
end |