mirror of
https://github.com/metrostroi-repo/MetrostroiAddon.git
synced 2026-05-02 00:42:29 +00:00
282 lines
11 KiB
Lua
282 lines
11 KiB
Lua
--------------------------------------------------------------------------------
|
|
-- 81-718 wagon control unit
|
|
--------------------------------------------------------------------------------
|
|
-- Copyright (C) 2013-2018 Metrostroi Team & FoxWorks Aerospace s.r.o.
|
|
-- Contains proprietary code. See license.txt for additional information.
|
|
--------------------------------------------------------------------------------
|
|
Metrostroi.DefineSystem("81_718_BUV")
|
|
|
|
function TRAIN_SYSTEM:Initialize()
|
|
self.Power = 0
|
|
--Индикация
|
|
--Входные сигналы
|
|
self.IVP=0;self.INZ=0;self.IVR=0;self.INR=0
|
|
self.IX=0;self.IT=0;self.IU1=0;self.IU2=0;self.IM=0;self.IXP=0;self.IU1R=0
|
|
self.ITARS=0;self.ITEM=0;self.IAVR=0
|
|
self.IPROV=0;self.IPROV0=0;self.IVZ=0
|
|
self.ITP1=0; self.ITP2=0; self.ITP3=0; self.ITP4=0;self.IKX=0;self.IKT=0;self.ILT=0;self.IRV=0;self.IRN=0;self.IBV=0
|
|
--МАЛП 1,2
|
|
self.FM=0;self.U400=0;self.E1350=0;self.DIF=0;self.E13650=0;self.E130=0
|
|
--self.ARS=0;self.ITA=0;self.Tr=0;self.VN=0
|
|
self.SN=0
|
|
|
|
self.U800=0;self.U975= 0;self.E2450=0;self.E24650=0;self.E240=0
|
|
self.BV=0
|
|
--self.ITV=0
|
|
self.MSU=0;self.MZK=0
|
|
|
|
self.FreqBlock = 0
|
|
--Выходные сигналы
|
|
self.OVP=0;self.ONZ=0;self.OLK=0;self.OKX=0;self.OKT=0;self.OPV=0;self.OSN=0;self.ORP=0
|
|
self.OIZ=0
|
|
self.OV1=0;self.ORKT=0;self.ORMT=0
|
|
self.O75V=0
|
|
--МИВ
|
|
self.ZZ=0;self.V1=0;self.SMA=0;self.SMB=0;
|
|
--МВД
|
|
self.OTK=0;self.RP=0;self.PROV=0
|
|
--МЛУА
|
|
self.SS = 0
|
|
end
|
|
|
|
function TRAIN_SYSTEM:Inputs()
|
|
return { }
|
|
end
|
|
|
|
local outputs = {"OTK","RP","FM","U400","E1350","DIF","E13650","E130","SN","U800","U975","E2450","E24650","E240","BV","MSU","MZK","ZZ","V1","SMA","SMB","IVP","INZ","IVR","INR","IX","IT","IU1","IU2","IM","IXP","IU1R","ITARS","ITEM","IAVR","IPROV","IPROV0","IVZ","ITP1","ITP2","ITP3","ITP4","IKX","IKT","ILT","IRV","IRN","IBV","OVP","ONZ","OLK","OKX","OKT","OPV","OSN","OIZ","ORP","OV1","ORKT","ORMT","O75V","SS"
|
|
}
|
|
function TRAIN_SYSTEM:Outputs()
|
|
return outputs
|
|
end
|
|
|
|
function TRAIN_SYSTEM:TriggerInput(name,value)
|
|
end
|
|
|
|
function TRAIN_SYSTEM:Think()
|
|
self.CurTime = self.CurTime or CurTime()
|
|
if CurTime()-self.CurTime < 0.05 then return end
|
|
self.DeltaTime = CurTime()-self.CurTime
|
|
self.CurTime = CurTime()
|
|
|
|
local Train = self.Train
|
|
if self.Power > 0 then
|
|
local I = math.abs(Train.Electric.I13 + Train.Electric.I24)/2
|
|
--Управление
|
|
local ARSBrake = self.ITARS > 0
|
|
local Brake = self.IT > 0 or ARSBrake
|
|
local Drive = (self.IX > 0 or self.IM > 0) and not ARSBrake and not Brake
|
|
local DriveEmer = self.IXP*(1-self.ITARS) > 0 and not ARSBrake
|
|
local Combination = (Brake and 1 or 0)+(DriveEmer and 1 or 0)+(Drive and 1 or 0)
|
|
local schemeCommands = Combination > 0
|
|
|
|
local I13,I24 = math.abs(Train.Electric.I13),math.abs(Train.Electric.I24)
|
|
local UHVp = Train.Electric.Power750V
|
|
local UHV = Train.Electric.Main750V
|
|
--self.MZK = 0
|
|
if UHV > 1000 then self.FM = 1 end
|
|
self.U400 = UHVp >= 400 and 1 or 0
|
|
self.E1350 = I13 >= 40 and 1 or 0
|
|
--Дифф защита не подключена
|
|
--if math.abs(I13-I24) > 100 then self.DIF = 1 end
|
|
if I13>650 then self.E13650 = 1 end
|
|
if self.IPROV > 0 then self.E130 = 1-self.E1350 end
|
|
--self.ARS = 0
|
|
--self.ITA = 0
|
|
--self.Tr = 0
|
|
self.SN = 1-(self.IKX*self.ILT+self.IKT)*(self.IRV+self.IRN)
|
|
--self.VN = 0
|
|
|
|
--self.MSU = 0
|
|
self.U800 = 650 < UHV and UHV < 975 and 1 or 0
|
|
self.U975= UHV > 975 and 1 or 0
|
|
self.E2450 = I24 >= 40 and 1 or 0
|
|
if I24>650 then self.E24650 = 1 end
|
|
if self.IPROV > 0 then self.E240 = 1-self.E2450 end
|
|
self.BV = 1-Train.QF1.Value
|
|
--self.ITV = 0
|
|
|
|
--МВД
|
|
self.OTK = (Train.PTTI.State == 0) and 1 or 1-self.E1350*self.E2450
|
|
self.RP = self.FM+self.E13650+self.E130+self.E24650+self.E240+self.BV
|
|
if schemeCommands and self.IPROV0 > 0 and (--[[ self.RP > 0 or --]] Train.PTTI.State == 0) then self.PROV = 1 end
|
|
|
|
local disableScheme = self.RP+self.PROV+((ARSBrake and Train.PTTI.State > 0) and 1 or 0)+((Combination ~= 1 and Train.PTTI.State == 0) and 1 or 0)+self.IAVR
|
|
self.MSU = disableScheme+((Drive or DriveEmer) and 1-self.U400 or 0)
|
|
self.MZK = self.MSU
|
|
|
|
if self.IVZ > 0 then
|
|
self.PROV = 0
|
|
self.FM = 0
|
|
self.E13650 = 0
|
|
self.E130 = 0
|
|
self.E24650 = 0
|
|
self.E240 = 0
|
|
self.O75V = 0
|
|
end
|
|
if self.RP > 0 then self.O75V = 1 end
|
|
--Управление ЛК и ПТТИ
|
|
if disableScheme>0 or Train.PTTI.Zero then
|
|
self.OVP = 0
|
|
self.ONZ = 0
|
|
self.OLK = 0
|
|
self.OKX = 0
|
|
self.OKT = 0
|
|
self.Shunt = false
|
|
elseif Drive and Train.PTTI.State >= 0 then
|
|
self.OVP = self.IVP*(1-self.INZ)*(self.IX+self.IM)
|
|
self.ONZ = self.INZ*(1-self.IVP)*(self.IX+self.IM)
|
|
--self.OLK = self.OVP+self.ONZ--(self.IRV+self.IRN)
|
|
self.OLK = (self.IRV+self.IRN)
|
|
self.OKX = self.OLK--self.ILT
|
|
self.OKT = 0
|
|
self.Shunt = self.IM > 0--(self.Shunt or self.IM > 0) and self.IU1+self.IU2 == 0
|
|
elseif DriveEmer and Train.PTTI.State >= 0 then
|
|
self.OVP = self.IVR*(1-self.INR)*self.IXP
|
|
self.ONZ = self.INR*(1-self.IVR)*self.IXP
|
|
--self.OLK = self.OVP+self.ONZ--(self.IRV+self.IRN)
|
|
self.OLK = (self.IRV+self.IRN)
|
|
self.OKX = self.ILT
|
|
self.OKT = 0
|
|
elseif Brake and Train.PTTI.State <= 0 then
|
|
self.OVP = self.IVP*(1-self.INZ)
|
|
self.ONZ = self.INZ*(1-self.IVP)
|
|
self.OLK = 0
|
|
self.OKX = 0
|
|
--self.OKT = self.OVP+self.ONZ--(self.IRV+self.IRN)
|
|
self.OKT = (self.IRV+self.IRN)
|
|
elseif Train.PTTI.State ~= 0 then
|
|
self.Shunt = false
|
|
end
|
|
--Управление ПТТИ
|
|
--if Train.PTTI.Zero then print(Train.PTTI.State,self.PTTIState,Train.PTTI.Zero) end
|
|
|
|
local loadR = Train.Pneumatic.WeightLoadRatio*50
|
|
if self.MZK > 0 then
|
|
self.ISet = 0
|
|
self.PTTIState = 0
|
|
elseif self.IKX > 0 and Drive then
|
|
self.PTTIState = 1
|
|
self.FreqBlock = self.Shunt and 1 or 0--(((self.ITP1+self.ITP2+self.ITP3+self.ITP4) > 0 and not self.Shunt) and 0 or 1)
|
|
self.ISet = ((self.ITP1+self.ITP2+self.ITP3+self.ITP4) > 0 and self.IM == 0) and 150+self.IU1*(90+loadR/2)+self.IU2*(90+loadR/2) or 150
|
|
elseif self.IKX > 0 and DriveEmer then
|
|
self.PTTIState = 1
|
|
self.FreqBlock = 0
|
|
self.ISet = 150+self.IU1R*280
|
|
elseif self.IKT > 0 and Brake then
|
|
self.PTTIState = -1
|
|
if ARSBrake then
|
|
self.ISet = -300
|
|
else
|
|
self.ISet = -(150+loadR+self.IU1*(75+loadR)+self.IU2*(75-loadR))
|
|
end
|
|
elseif Train.PTTI.Zero then
|
|
self.ISet = 0
|
|
self.PTTIState = 0
|
|
elseif Train.PTTI.State == 1 and not Drive and not DriveEmer or Train.PTTI.State == -1 and not Brake then
|
|
self.ISet = 0
|
|
end
|
|
|
|
--МЛУА
|
|
self.SS = (self.IRV+self.IRN)*(Train.PTTI.State==1 and self.IKX or Train.PTTI.State==-1 and self.IKT or 0)
|
|
--МИВ
|
|
self.ZZ = math.floor(Train.PTTI.FreqState)
|
|
self.V1 = (math.floor(Train.PTTI.RNState+0.03)+self.MSU)*self.OKT*self.IU1
|
|
self.SMA = (Train.PTTI.State==-1 and Train.PTTI.RNState<=0.04 or Train.PTTI.State==1 and Train.PTTI.RNState>=0.96) and 1 or 0
|
|
--self.SMA = (self.ISet ~= 0 and I13-20 < self.ISet and self.ISet < I13+20) and 1 or 0
|
|
self.SMB = self.SMA--Train.PTTI.State==-1 and Train.PTTI.RNState<=0.04 or Train.PTTI.State==1 and Train.PTTI.RNState>=0.96
|
|
--self.SMB = (self.ISet ~= 0 and I24-20 < self.ISet and self.ISet < I24+20) and 1 or 0
|
|
--Входные сигналы
|
|
--self.IVP = 0 --505
|
|
--self.INZ = 0 --506
|
|
--self.IVR = 0 --557
|
|
--self.INR = 0 --558
|
|
|
|
--self.IX = 0 --501
|
|
--self.IT = 0 --502
|
|
--self.IU1 = 0 --503
|
|
--self.IU2 = 0 --504
|
|
--self.IM = 0 --513
|
|
--self.IXP = 0 --555
|
|
--self.IU1R = 0 --556
|
|
|
|
--self.ITARS = 0 --507
|
|
--self.ITEM = 0 --514
|
|
--self.IAVR = 0 --737
|
|
|
|
|
|
--self.IPROV = 0 --527
|
|
--self.IPROV0 = 0 --547
|
|
--self.IVZ = 0 --526
|
|
|
|
self.ITP1 = Train.TR.ContactState1
|
|
self.ITP2 = Train.TR.ContactState2
|
|
self.ITP3 = Train.TR.ContactState4
|
|
self.ITP4 = Train.TR.ContactState3
|
|
--self.IKX = 0 --738-739
|
|
--self.IKT = 0 --740-741
|
|
--self.ILT = 0 --742
|
|
--self.IRV = 0 --743
|
|
--self.IRN = 0 --744
|
|
self.IBV = Train.QF1.Value --802 провод
|
|
|
|
|
|
--Выходные сигналы
|
|
--self.OLK = 0 -- 790
|
|
--self.OKX = 0 -- 791
|
|
--self.OKT = 0 -- 792
|
|
--self.OPV = 0 -- 797
|
|
self.OSN = schemeCommands and self.SN or 0
|
|
self.OIZ = schemeCommands and self.OTK or 0
|
|
--Train.BVA.DiableScheme = self.IPROV*self.OIZ + self.IPROV0*self.OSN
|
|
self.ORP = (1-Train.QF1.Value)+self.E130+self.E240+self.PROV -- 528,725
|
|
if ARSBrake then
|
|
self.OV1 = Train.PTTI.RNState > 0.97 and 1 or 0
|
|
self.ORKT = (I > -self.ISet*0.8) and 1 or 0
|
|
self.ORMT = I>50 and 1 or 0
|
|
elseif Brake then
|
|
self.OV1 = Train.PTTI.RNState > 0.97 and self.IU1+self.IU2 or 0
|
|
self.ORKT = (I > -self.ISet*0.8) and self.IU2 or 0
|
|
self.ORMT = I>50 and 1 or 0
|
|
else
|
|
self.OV1 = 0 --795
|
|
self.ORKT = 0 --804
|
|
self.ORMT = 0 --805
|
|
end
|
|
else
|
|
--Входные сигналы
|
|
--self.IVP=0;self.INZ=0;self.IVR=0;self.INR=0
|
|
|
|
--self.IX=0;self.IT=0;self.IU1=0;self.IU2=0;self.IM=0;self.IXP=0;self.IU1R=0
|
|
|
|
--self.ITARS=0;self.ITEM=0;self.IAVR=0
|
|
|
|
--self.IPROV=0;self.IPROV0=0;self.IVZ=0
|
|
|
|
self.ITP1=0; self.ITP2=0; self.ITP3=0; self.ITP4=0;
|
|
--self.IKX=0;self.IKT=0;self.ILT=0;self.IRV=0;self.IRN=0;
|
|
self.IBV=0
|
|
|
|
--МАЛП 1,2
|
|
self.FM=0;self.U400=0;self.E1350=0;self.DIF=0;self.E13650=0;self.E130=0
|
|
--self.ARS=0;self.ITA=0;self.Tr=0;self.VN=0
|
|
self.SN=0
|
|
|
|
self.U800=0;self.U975= 0;self.E2450=0;self.E24650=0;self.E240=0
|
|
self.BV=0
|
|
--self.ITV=0
|
|
self.MSU=0;self.MZK=0
|
|
--Выходные сигналы
|
|
self.OVP=0;self.ONZ=0;self.OLK=0;self.OKX=0;self.OKT=0;self.OPV=0;self.OSN=0;self.ORP=0
|
|
|
|
self.OIZ=0
|
|
self.OV1=0;self.ORKT=0;self.ORMT=0
|
|
self.O75V=0
|
|
--МИВ
|
|
self.ZZ=0;self.V1=0;self.SMA=0;self.SMB=0;
|
|
--МВД
|
|
self.OTK=0;self.RP=0;self.PROV=0
|
|
--МЛУА
|
|
self.SS = 0
|
|
end
|
|
end
|