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_720_buv.lua
g_brzhezinskiy 1d05caf866 init
2021-01-02 12:51:45 +03:00

283 lines
12 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
--------------------------------------------------------------------------------
-- 81-720 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_720_BUV")
TRAIN_SYSTEM.DontAccelerateSimulation = true
function TRAIN_SYSTEM:Initialize()
if not TURBOSTROI then
self.TrainIndex = self.Train:GetWagonNumber()
end
self.Battery = false
self.Power = 0
self.States = {}
self.Commands = {}
self.Slope = false
self.BBE = 0
self.MK = 0
self.Reverser = 0
self.PN2 = 0
self.Brake = 0
self.Drive = 0
self.DriveStrength = 0
self.Disassembly = 0
self.Vent1 = 0
self.Vent2 = 0
self.CurTime = CurTime()
self.FirstHalf = false
end
function TRAIN_SYSTEM:Outputs()
return {"Brake", "Drive", "DriveStrength", "Disassembly" ,"BBE","MK","Vent1","Vent2"}
end
function TRAIN_SYSTEM:Inputs()
return {}
end
function TRAIN_SYSTEM:CState(name,value)
if self.CurrentBUP and (self.Reset or self.States[name] ~= value) then
self.States[name] = value
self.Train:CANWrite("BUV",self.Train:GetWagonNumber(),"BUKP",self.CurrentBUP,name,value)
end
end
-- Door8Closed t/f
-- Door7Closed t/f
-- Door6Closed t/f
-- Door5Closed t/f
-- Door4Closed t/f
-- Door3Closed t/f
-- Door2Closed t/f
-- Door1Closed t/f
-- NoAssembly t/f
-- ParkingBrakeEnabled t/f
-- BEPPBroken t/f
-- EmergencyBrake t/f
-- ReserveChannelBraking t/f
-- PTEnabled t/f
-- PTBad t/f
-- PTReady t/f
-- PTReplace t/f
-- TLPressure 0-10
-- BLPressure 0-10
-- BCPressure 0-6
-- HPPressure 0-6
-- WeightLoad 0-1
-- PantDisabled t/f
-- EnginesBroken t/f
-- BBEEnabled t/f
-- BBEBroken t/f
-- HVBad t/f
-- LVBad t/f
-- EnginesDone t/f
-- EnginesBrakeBroke t/f
-- PassLightEnabled t/f
-- BVEnabled t/f
-- DriveStrength ~
-- BrakeStrength ~
-- VagEqConsumption 0-60A
-- HVVoltage 0-1500A
-- LVVoltage 0-100A
-- MKVoltage 0-50A
-- VentEnabled t/f
-- HeatEnabled t/f
-- MKWork --Исправность МК
-- BUVWork --Исправность БУВ
-- WagNOrientated t/f
-- Orientation t/f
function TRAIN_SYSTEM:CANReceive(source,sourceid,target,targetid,textdata,numdata)
if textdata == "BUPWork" and not numdata then
self.Commands[sourceid] = {}
elseif textdata == "Orientate" then
self.OrientateBUP = sourceid
self.FirstHalf = numdata
self.Reset = CurTime()
elseif self.CurrentBUP then
if not self.Commands[sourceid] then self.Commands[sourceid] = {} end
self.Commands[sourceid][textdata] = numdata
end
end
function TRAIN_SYSTEM:Get(id)
local Commands = self.Commands[self.CurrentBUP]
if Commands then
return Commands[id]
end
end
function TRAIN_SYSTEM:TriggerInput(name,value)
end
function TRAIN_SYSTEM:Think()
if CurTime()-self.CurTime < 0.1 then return end
self.DeltaTime = CurTime()-self.CurTime
self.CurTime = CurTime()
local Train = self.Train
local wagcount = #Train.WagonList
self.Power = Train.Electric.Battery80V > 62 and 1 or 0
self.State = self.Power > 0 and Train.SFV2.Value > 0.5
if self.State then
if not self.States.BUVWork then
self.Train:CANWrite("BUV",Train:GetWagonNumber(),"BUKP",nil,"Get",1)
end
for i=1,4 do
self:CState("Door"..i.."Closed", Train.Pneumatic.LeftDoorState[i] == 0)
self:CState("Door"..(i+4).."Closed", Train.Pneumatic.RightDoorState[i] == 0)
end
self:CState("DoorTorec", Train.RearDoor or Train.FrontDoor)
self:CState("DoorBack", Train.PassengerDoor or Train.CabinDoorLeft or Train.CabinDoorRight)
self:CState("EmPT",Train:ReadTrainWire(28) > 0)
self:CState("NoAssembly", Train.KMR1.Value == 0 and Train.KMR2.Value == 0 or Train.K2.Value == 0 and Train.K3.Value==0)
self:CState("ParkingBrakeEnabled", Train.Pneumatic.ParkingBrakePressure < 3)
self:CState("BEPPBroken", false)
self:CState("EmergencyBrakeGood", Train.Pneumatic.BrakeCylinderPressure >= (2.6+Train.Pneumatic.WeightLoadRatio*0.6)-0.1)
self:CState("EmergencyBrake", self.States.EmergencyBrakeGood--[[ and Train:ReadTrainWire(27) == 0--]] )
self:CState("ReserveChannelBraking", Train:ReadTrainWire(28)>0)
self:CState("PTEnabled", Train.Pneumatic.BrakeCylinderPressure > 0.2)
self:CState("PTBad", false)
self:CState("PTReady", Train.Pneumatic.AirDistributorPressure >= (2.6+Train.Pneumatic.WeightLoadRatio*0.6)-0.1)
self:CState("PTReplace", self.PTReplace and CurTime()-self.PTReplace > 1.5)
self:CState("BTBReady", Train.Pneumatic.BTBReady)
self:CState("TLPressure", math.Round(Train.Pneumatic.TrainLinePressure,1))
self:CState("BLPressure", math.Round(Train.Pneumatic.BrakeLinePressure,1))
self:CState("BCPressure", math.Round(Train.Pneumatic.BrakeCylinderPressure,1))
self:CState("HPPressure", math.Round(Train.Pneumatic.AirDistributorPressure,1))
self:CState("WeightLoad", math.Round(Train.Pneumatic.WeightLoadRatio,2))
self:CState("PantDisabled", self.Pant)
self:CState("EnginesBroken", false)
self:CState("BBEEnabled", self.BBE)
self:CState("BBEBroken", false)
self:CState("HVBad", Train.Electric.Power750V < 550)
self:CState("LVBad", Train.Electric.Battery80V < 62)
self:CState("EnginesDone", self.EnginesDone)-- and math.abs(Train.Speed) < 7.5)
--self:CState("EnginesBrakeBroke", (self:Get("Brake") or 0) > 0 and Train.BV.Value == 0 or Train.Electric.IT > 0 and Train.K3.Value == 0)
self:CState("EnginesBrakeBroke", (self:Get("Brake") or 0) > 0 and (Train.BV.Value == 0 or Train.K3.Value == 0))
self:CState("PassLightEnabled", self.MainLights)
self:CState("BVEnabled", Train.BV.Value > 0)
self:CState("DriveStrength", math.min(0,Train.Engines.BogeyMoment*2))
self:CState("BrakeStrength", math.max(0,Train.Engines.BogeyMoment*2))
self:CState("VagEqConsumption", 15)--15-25
self:CState("I13", math.Round(Train.Electric.I13,1))
self:CState("I24", math.Round(Train.Electric.I24,1))
self:CState("HVVoltage", math.floor(Train.Electric.Main750V))
self:CState("LVVoltage", math.floor(Train.Electric.Battery80V))
self:CState("MKVoltage", math.Round(Train.Electric.BVKA_KM1*math.Rand(9,13),1))
self:CState("Vent1Enabled", Train.Electric.Vent1>0)
self:CState("Vent2Enabled", Train.Electric.Vent2>0)
self:CState("HeatEnabled", false)
self:CState("MKWork", Train.Pneumatic.Compressor)
self:CState("BUVWork", true)
self:CState("WagNOrientated", self.Orientation == self.RevOrientation)
self:CState("Orientation", self.Orientation)
self:CState("BadCombination", (Train:ReadTrainWire(3)*Train:ReadTrainWire(4)) > 0)
else
self:CState("BUVWork", false)
for k,v in pairs(self.Commands) do
self.Commands[k] = false
end
end
if self.Reset and self.Reset ~= CurTime() then
self.Reset = nil
end
local NoHV = Train.Electric.Main750V < 650 or Train.Electric.Main750V > 975
self.BBE = ((not self:Get("PVU8") and self:Get("BBE")) and 1 or (Train.BBER and Train.BBER.Value or 0))*Train.SFV7.Value
if NoHV then self.BBE = 0 end
if self.BBE == 0 and self.MainLights and not self.MainLightsTimer then self.MainLightsTimer = CurTime() end
if self.BBE > 0 or not self.MainLights or self.MainLightsTimer and CurTime()-self.MainLightsTimer > 27 then self.MainLightsTimer = nil end
if (self:Get("BVOn") or Train:ReadTrainWire(2) > 0) then
Train.BV:TriggerInput("Close",Train.SFV8.Value*Train.SFV9.Value)
end
if self:Get("BVOff") and Train.SFV8.Value > 0 or self:Get("PVU1") then
Train.BV:TriggerInput("Open",1)
end
self.MainLights = not self:Get("PVU5") and (self.BBE > 0 or self.MainLightsTimer) and Train.SFV19.Value > 0.5 and self:Get("PassLight")
if self:Get("Slope") then self.Slope = CurTime() end
if not self:Get("Slope") and self.Slope and Train.Pneumatic.BrakeCylinderPressure < 0.5 then self.Slope = false end
--self.Reverser = Train:ReadTrainWire(12)
local brake = self:Get("Brake") or 0
local strength = not self:Get("PVU9") and (self.Slope or brake>0 and Train.Pneumatic.BrakeCylinderPressure < 1.5 or brake==0 and Train.Pneumatic.BrakeCylinderPressure < 0.5) and self:Get("DriveStrength") or 0
local drive = math.min(1,(1-brake)*strength)
if strength == 0 then
brake=0
drive=0
end
if brake>0 and Train.BPTI.State~=-1 and math.abs(Train.Speed) < 10 then
self.Brake = 0
else
self.Brake = brake
end
self.Drive = drive
self.BlockTorec = not self:Get("PVU6") and self:Get("DoorTorec") and Train.SFV15.Value > 0
self.DriveStrength = strength
if brake == 0 then
self.EnginesDone = false
elseif Train.BPTI.State == -1 and (Train.BPTI.RNState == 1 and Train.Electric.I13>math.min(-130,-Train.Electric.ISet*0.75)) or Train.BPTI.State~=-1 and math.abs(Train.Speed) < 10 then
self.EnginesDone = true
end
local PTReplace = self.States.EnginesBrakeBroke
if PTReplace and not self.PTReplace then
self.PTReplace = CurTime()
if Train.K3.Value*Train.BV.Value ~= 0 then
self.PTReplace = self.PTReplace + 1.3
end
if Train.BV.Value == 0 or self:Get("PVU9") then
self.PTReplace = self.PTReplace - 1.2
end
end
if not PTReplace and self.PTReplace then self.PTReplace = nil end
local PN = self.PTReplace and CurTime()-self.PTReplace > 1.2 or self.States.EnginesDone
self.PN1 = (self:Get("PN1") and self:Get("PN1") > 0) or PN and (self:Get("DriveStrength") and self:Get("DriveStrength") > 0)
self.PN2 = (self:Get("PN2") and self:Get("PN2") > 0) or PN and (self:Get("DriveStrength") and self:Get("DriveStrength") > 2)
self.MK = not self:Get("PVU3") and self:Get("Compressor") and 1 or 0
self.OpenLeft = not self:Get("PVU2") and self:Get("OpenLeft") and self.Orientation or self:Get("OpenRight") and not self.Orientation
self.OpenRight = not self:Get("PVU2") and self:Get("OpenRight") and self.Orientation or self:Get("OpenLeft") and not self.Orientation
self.CloseDoors = self:Get("PVU2") or self:Get("CloseDoors")
self.Vent1 = not self:Get("PVU7") and self:Get("Vent1") and 1 or 0
self.Vent2 = not self:Get("PVU7") and self:Get("Vent1") and self:Get("Vent2") and not NoHV and 1 or 0
self.Orientation = Train:ReadTrainWire(3) > 0
self.RevOrientation = Train:ReadTrainWire(4) > 0
local BadOrientation = self.Orientation and self.Orientation == self.RevOrientation
if self.State and self.Orientation ~= self.RevOrientation then
if not self.BadOrientation and self.OrientateBUP and (not self.Commands[self.OrientateBUP] or self.Orientation and self.Commands.Forward ~= self.OrientateBUP or self.RevOrientation and self.Commands.Back ~= self.OrientateBUP) then
if self.Orientation then self.Commands.Forward = self.OrientateBUP else self.Commands.Back = self.OrientateBUP end
self.OrientateBUP = nil
end
end
local ReOrientation = self.State and (self.Orientation or self.RevOrientation) and (self.Orientation ~= self.PrevOrientation or self.RevOrientation ~= self.PrevRevOrientation or self.CurrentBUP ~= (self.Orientation and self.Commands.Forward or self.Commands.Back))
if ReOrientation then
self.CurrentBUP = self.Orientation and self.Commands.Forward or self.Commands.Back
self.Reset = CurTime()
if self.CurrentBUP then
self.Commands[self.CurrentBUP] = {}
Train:CANWrite("BUV",Train:GetWagonNumber(),"BUKP",self.CurrentBUP,"Get")
end
end
self.BadOrientation = BadOrientation
self.PrevOrientation = self.Train:ReadTrainWire(3) > 0
self.PrevRevOrientation = self.Train:ReadTrainWire(4) > 0
if Train.SFV29.Value > 0 then
if self:Get("PVU4") or --[[ Train.Electric.Main750V < 20 and --]] (self:Get("TP1") and self.FirstHalf or self:Get("TP2") and not self.FirstHalf) then
self.Pant = true
else
self.Pant = false
end
end
end