--------------------------------------------------------------------------------
-- 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)
    --Train:WriteTrainWire(4,S["10AK"]*KV["10AK-4"]*(1-T[4]*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

        local ASNP_VV = Train.ASNP_VV
        ASNP_VV.Power = BO*Train.AS1.Value*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.CBKIPower = BO*Train.A76.Value
    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"]+T[10]*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)
        Panel.PCBKPower = T[10]
    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
        Panel.PCBKPower = BO
    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