1
0
mirror of https://github.com/metrostroi-repo/MetrostroiAddon.git synced 2026-05-02 00:42:29 +00:00
Files
MetrostroiAddon/lua/metrostroi/systems/sys_81_718_buv.lua
2021-01-02 15:32:05 +03:00

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