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

724 lines
21 KiB
Lua

--------------------------------------------------------------------------------
-- Àâòîâåäåíèå
--------------------------------------------------------------------------------
Metrostroi.DefineSystem("Autodrive")
TRAIN_SYSTEM.DontAccelerateSimulation = true
function TRAIN_SYSTEM:Initialize()
self.MU = -0.25
self.Horlifts = {
[114] = true,
}
end
function TRAIN_SYSTEM:Outputs()
return {}
end
function TRAIN_SYSTEM:Inputs()
return {}
end
function TRAIN_SYSTEM:TriggerInput(name,value)
end
TRAIN_SYSTEM.Corrections = {
[0] = {
},
[1] = {
[108] = -3.23,
[109] = -2.79,
[110] = -3.09,
[111] = -3.17,
[112] = -3.17,
[113] = -3.18,
[114] = -3.21,
[115] = -3.21,
[116] = -3.22,
[117] = -3.21,
[118] = -3.02,
[119] = -3.20,
[121] = -3.17,
[122] = -4.10,
[123] = -1.98,
},
[2] = {
[123] = -1.98,
[122] = -4.10,--
[121] = -3.17,
[119] = -3.20,
[118] = -3.02,
[117] = -3.21,
[116] = -3.22,
[115] = -3.21,
[114] = -3.21,
[113] = -3.18,
[112] = -3.17,
[111] = -3.17,
[110] = -3.09,
[109] = -2.79,
[108] = -3.23,
}
}
function TRAIN_SYSTEM:GetStationRK(dX,horlift)
-- Calculate RK position based on distance and autodrive profile
local TargetBrakeRKPosition = 1
local speed = self.Train.ALS_ARS.Speed
if dX < 160 then TargetBrakeRKPosition = speed > 55 and 3 or 1 end
if dX < 86.25 then TargetBrakeRKPosition = 6 end
if dX < 53.21 + (horlift and 10 or 0) then TargetBrakeRKPosition = 10 end
if dX < 20.13 then TargetBrakeRKPosition = 15 end
if dX < 8 then
TargetBrakeRKPosition = 15
--if dX < 10 and speed > 15 then TargetBrakeRKPosition = 18
--else
--else
if dX < 6 then TargetBrakeRKPosition = 16 end
--if dX < 2.64 then TargetBrakeRKPosition = 18 end
if horlift and dX < 4 and speed > 6 then TragetBrakeRKPosition = 17 end
if dX < 3 then TargetBrakeRKPosition = 18 end
--if horlift and dX < 1.5 then TargetBrakeRKPosition = 19 end
--if VZ then TargetBrakeRKPosition = 18 end
end
--if dX < 15 then TargetBrakeRKPosition = 16 end
return TargetBrakeRKPosition
end
function TRAIN_SYSTEM:Autodrive(StationBraking)
local Train= self.Train
-- Calculate distance to station
local dX = self.Train.UPO.Distance
--local speedLimit = (Train.ALS_ARS.Signal0 or Train.ALS_ARS.RealNoFreq) and 0 or Train.ALS_ARS.Signal40 and 40 or Train.ALS_ARS.Signal60 and 60 or Train.ALS_ARS.Signal70 and 70 or Train.ALS_ARS.Signal80 and 80 or 0
local speedLimit = 0--(self.Train.ALS_ARS.Signal0 or self.Train.ALS_ARS.RealNoFreq) and 0 or self.Train.ALS_ARS.Signal40 and 40 or self.Train.ALS_ARS.Signal60 and 60 or self.Train.ALS_ARS.Signal70 and 70 or self.Train.ALS_ARS.Signal80 and 80 or 0
if self.Train.ALS_ARS.AVSpeedLimit and self.Train.ALS_ARS.AVSpeedLimit > 20 then
speedLimit = self.Train.ALS_ARS.AVSpeedLimit
end
local OnStation = dX < (160+35*self.MU - (speedLimit == 40 and 30 or 0)) and not self.StartMoving and Metrostroi.AnnouncerData[self.Train.UPO.Station]and Metrostroi.AnnouncerData[self.Train.UPO.Station][1]
if StationBraking and (dX >= (160+35*self.MU - (speedLimit == 40 and 30 or 0)) or not OnStation) then self.Train.UPO.StationAutodrive = false return end
-- Target and real RK position (0 if not braking)
local TargetBrakeRKPosition = 0
local RKPosition = math.floor(Train.RheostatController.Position+0.5)
-- Calculate next speed limit
-- Get angle
local Slope = Train:GetAngles().pitch
-- Check speed constraints
if Train.ALS_ARS.Speed > (speedLimit - 6) then self.NoAcceleration = true end
if Train.ALS_ARS.Speed < (speedLimit - 10) then self.NoAcceleration = false end
local Brake = false
local Accelerate = false
local threshold = 1.0 + (Slope > 1 and 1 or 0)
-- Slow down on slopes
if Train.ALS_ARS.Speed > speedLimit - 5 - (self.NoAcceleration and 4 or 7) then
if Slope > 1 then
if speedLimit == 40 then
TargetBrakeRKPosition = 7
elseif speedLimit > 40 then
TargetBrakeRKPosition = 1
Brake = (Train.ALS_ARS.Speed > speedLimit - 4)
end
end
end
-- Slow down if overspeeding soon
if (Train.ALS_ARS.Speed > (speedLimit - threshold)) then
TargetBrakeRKPosition = 18
end
-- How smooth braking should be (higher self.MU = more gentle braking)
-- Full stop command
if Train.ALS_ARS.SpeedLimit < 30 then TargetBrakeRKPosition = 18 Brake = true end
-- Calculate RK position based on distance and autodrive profile
if OnStation then
TargetBrakeRKPosition = self:GetStationRK(dX)
else
if dX > (160+35*self.MU - (speedLimit == 40 and 30 or 0)) then self.StartMoving = nil end
end
-- Generate commands
local ElectricBrakeActive = FullStop or TargetBrakeRKPosition > 0
local AcceleratingActive = not ElectricBrakeActive and not self.NoAcceleration and Slope < 1
-- Generate brake rheostat rotation
local RheostatBrakeRotating = Brake or RKPosition < TargetBrakeRKPosition
-- Generate accel rheostat rotation
local PP = math.floor(Train.PositionSwitch.Position + 0.5) == 2
local AmpNorm = true --Train.Electric.Itotal < (350 - (Train:GetPhysicsObject():GetMass()-30000)/24) * math.floor(Train.PositionSwitch.Position + 0.5)
local RheostatAccelRotating = AcceleratingActive
if Slope < -2 and (math.floor(Train.PositionSwitch.Position + 0.5) == 2 and RKPosition == 10 and Train.Electric.Itotal > 500) then
--if PP and (8 <= RKPosition and RKPosition <= 12) then
RheostatAccelRotating = false
--end
end
local PneumaticValve1 = ((dX < 1.55) and (Train.ALS_ARS.Speed > 0.1) and OnStation and TargetBrakeRKPosition == 18) or (Train.ALS_ARS.Speed > (Train.ALS_ARS.SpeedLimit - threshold))
--or (Train:ReadCell(6) > 0 and Train:ReadCell(18) < 1 and Slope > 1)
if dX < 2 and Train.ALS_ARS.Speed < 0.5 then self.AutodriveReset = true end
--Disable autodrive on end of station brake
--local StatID = Metrostroi.WorkingStations[self.Train.UPO.Station] or Metrostroi.WorkingStations[self.Train.UPO.Station + (self.Path == 1 and 1 or -1)] or 0
if (TargetBrakeRKPosition == 18 and Train.ALS_ARS.Speed < 0.1 and not self.StartMoving and OnStation) or (self.StartMoving and 10 < dX and dX < 160) then
if (TargetBrakeRKPosition == 18 and Train.ALS_ARS.Speed < 0.1 and not self.StartMoving and OnStation) then
self.Train.UPO.StationAutodrive = false
--
--self.VUDOverride = true
--[[
--local self.Train.UPO.Station = self.Train:ReadCell(49160) > 0 and self.Train:ReadCell(49160) or self.Train:ReadCell(49161)
if self.Train.UPO.Station == 0 then return end
local StatID = Metrostroi.WorkingStations[self.Train.UPO.Station] or Metrostroi.WorkingStations[self.Train.UPO.Station + (self.Path == 1 and 1 or -1)] or 0
if not StationBraking then--GetConVarNumber("metrostroi_paksd_autoopen",0) > 0 and not StationBraking then
local Curr = Metrostroi.AnnouncerData[self.Train.UPO.Station]
if Curr[2] then
Train:WriteCell(32,1)
else
Train:WriteCell(31,1)
end
timer.Simple(0.1,function()
if not IsValid(Train) then return end
Train:WriteCell(32,0)
Train:WriteCell(31,0)
end)
Train.ADoorDisable:TriggerInput("Set",1)
end
]]
end
self.AutodriveReset = true
return
end
-- Enter commands
--Train:WriteCell(1, AcceleratingActive and 1 or 0) --Engage engines
--Train:WriteCell(2, (RheostatAccelRotating or (ElectricBrakeActive and (RheostatBrakeRotating or RKPosition == 18 and not OnStation))) and 1 or 0) --X2/T2
--Train:WriteCell(3, (Train.ALS_ARS.Speed > 30 and RheostatAccelRotating) and 1 or 0) --X3
--Train:WriteCell(6, ElectricBrakeActive and 1 or 0) --Engage brakes
--Train:WriteCell(20,(ElectricBrakeActive or not self.NoAcceleration) and 1 or 0) -- Engage power circuits
local KVPos = 0
if ElectricBrakeActive then
if (RheostatBrakeRotating or RKPosition == 18 and not OnStation) and not Train:GetPackedBool(35) then
KVPos = -3
else
KVPos = -1
end
elseif AcceleratingActive then
if Train.ALS_ARS.Speed > 30 and RheostatAccelRotating and not Train:GetPackedBool(35) then
KVPos = 3
elseif RheostatAccelRotating and not Train:GetPackedBool(35) then
KVPos = 2
else
KVPos = 1
end
end
if (KVPos == -1) and Train:GetPackedBool(35) then
if not self.VZTimer1 then self.VZTimer1 = CurTime() + 1 end
else
self.VZTimer1 = nil
end
if self.VZTimer1 and self.VZTimer1 < CurTime() then
PneumaticValve1 = true
end
if OnStation then
self.Train.R25p:TriggerInput("Set",self.OldRheostatBrakeRotating ~= RheostatBrakeRotating)
self.OldRheostatBrakeRotating = RheostatBrakeRotating
end
Train:WriteCell(29, PneumaticValve1 and 1 or 0) -- Engage PN1
Train:TriggerInput("KVControllerAutodriveSet",KVPos)
--Train:WriteCell(25,(ElectricBrakeActive and self.TargetBrakeRKPosition > 17) and 1 or 0) -- Engage power circuits
self.Brake = ElectricBrakeActive
self.Accelerate = AcceleratingActive
self.Rotating = RheostatBrakeRotating and true or RheostatAccelRotating and false or nil
end
TRAIN_SYSTEM.Commands = {
{
[108] = {
{9999,2.5},
},
[109] = {
{9999,2.5},
{1366,0},
{1217,3},
{981,0},
{684,3},
{338,0},
{259,2.5},
{152,-6},
},
[110] = {
{9999,2.5},
{1003,0},
{1016,-1},
{820,0},
{136,-6},
},
[111] = {
{9999,2.5},
{860,0},
{335,-1},
{233,0},
{153,-6},
},
[112] = {
{9999,2.5},
{1809,3},
{1645,0},
{1446,-4},
{1402,-4},
{1286,0},
{1220,-4},
{1049,0},
{541,-5},
{403,0},
{138,-6},
},
},
{
[111] = {
{9999,2.5},
{1651,3},
{1464,0},
{1260,2.5},
{1232,2.5},
{893,0},
{847,2.5},
{712,0},
{491,-4},
{288,0},
{216,2.5},
{156,0},
{170,-6},
},
[110] = {
{9999,2.5},
{805,3},
{770,0},
{127,-6},
},
[109] = {
{9999,3},
{1043,0},
{419,2.5},
{353,3},
{224,0},
{176,-6},
},
[108] = {
{9999,2.5},
{1433,0},
{1345,-1},
{1339,-2},
{1167,-1},
{1075,0},
{817,-1},
{650,0},
{167,-6},
},
}
}
function TRAIN_SYSTEM:GetCurrentCommand()
self.Commands = {
{
[108] = {
{9999,2.5},
},
[109] = {
{9999,2.5},
{1366,0},
{1217,3},
{981,0},
{684,3},
{338,0},
{259,2.5},
{152,-6},
},
[110] = {
{9999,2.5},
{1003,0},
{1016,-1},
{850,0},
{150,-6},
},
[111] = {
{9999,2.5},
{860,0},
{335,-1},
{233,0},
{153,-6},
},
[112] = {
{9999,2.5},
{1809,3},
{1645,0},
{1446,-4},
--{1402,-4},
{1286,0},
{1220,-4},
{1018,0}, --1049
{541,-5},
{390,0},
{150,-6},
},
[113] = {
{9999,2.5},
{678,0},
{294,-1},
{130,-6},
},
[114] = {
{9999,3},
{540,0},
{150,-7},
},
[115] = {
{9999,2.5},
{1470,0},
{1400,-4},
{1288,0},
{1207,2.5},
{1101,3},
{940,0},
{896,-5},
{761,0},
{180,-6},
},
[116] = {
{9999,3},
{1190,0},
{684,-5},
{560,0},
{140,-6},
},
[117] = {
{9999,3},
{1482,0},
{974,-5},
{866,0},
{140,-6},
},
[118] = {
{9999,3},
{1780,0},
{1750,-2},
{1621,0},
{1490,-4},
{1273,0},
{844,-4},
{637,0},
{557,-4},
{416,0},
{204,2.5},
{165,0},
{90,-6},
},
[119] = {
{9999,2.5},
{1650,0},
{1148,2.5},
{894,0},
{630,-5},
{498,0},
{380,-2},
{288,0},
{222,-6},
},
[120] = {
{9999,2.5},
{1659,0},
{1489,-5},
{1405,0},
{677,-1},
{442,0},
{158,-1},
{80,-2},
{75,-1},
{65,-2},
{60,-1},
{55,-2},
{50,-1},
},
[121] = {
{9999,0},
{3040,2.5},
{2946,3},
{2703,0},
{1994,3},
{1787,0},
{1440,-5},
{1311,0},
{1074,-1},
{1008,-2},
{935,0},
{145,-6},
},
[122] = {
{9999,2.5},
{2054,3},
{1840,0},
{1567,-5},
{1370,0},
{1154,-5},
{870,0},
{634,-5},
{370,-0},
{147,-6},
},
[123] = {
{9999,3},
{2855,0},
{2684,-1},
{2532,0},
{1793,-5},
{1548,0},
{757,-1},
{652,0},
{137,-6},
}
},
{
[111] = {
{9999,2.5},
{1651,3},
{1464,0},
{1260,2.5},
{1232,2.5},
{893,0},
{847,2.5},
{712,0},
{491,-4},
{288,0},
{216,2.5},
{156,0},
{170,-6},
},
[110] = {
{9999,2.5},
{805,3},
{770,0},
{150,-6},
},
[109] = {
{9999,3},
{1043,0},
{419,2.5},
{353,3},
{224,0},
{176,-6},
},
[108] = {
{9999,2.5},
{1433,0},
{1345,-1},
{1339,-2},
{1167,-1},
{1075,0},
{817,-1},
{650,0},
{167,-6},
},
}
}
if (Metrostroi.TrainPositions[self.Train] and Metrostroi.TrainPositions[self.Train][1]) then
self.PathID = Metrostroi.TrainPositions[self.Train][1].path.id
end
if not self.Commands[self.PathID] or not self.Commands[self.PathID][self.Train.UPO.Station] then return 2 end
if self.Train:ReadCell(49165) < 20 and not self.OnStation then return 2 end
local max-- = self.Train:ReadCell(49165)
local pos = 0
for k,v in ipairs(self.Commands[self.PathID][self.Train.UPO.Station]) do
if v[1] > self.Train:ReadCell(49165) then
max = v[1]
pos = v[2]
end
end
local speedLimit = 0--(self.Train.ALS_ARS.Signal0 or self.Train.ALS_ARS.RealNoFreq) and 0 or self.Train.ALS_ARS.Signal40 and 40 or self.Train.ALS_ARS.Signal60 and 60 or self.Train.ALS_ARS.Signal70 and 70 or self.Train.ALS_ARS.Signal80 and 80 or 0
if self.Train.ALS_ARS.AVSpeedLimit and self.Train.ALS_ARS.AVSpeedLimit > 20 then
speedLimit = self.Train.ALS_ARS.AVSpeedLimit
end
--if self.Train.Speed > speedLimit-1 and pos > 0 then pos = 0 end
local RKPosition = math.floor(self.Train.RheostatController.Position+0.5)
local PP = math.floor(self.Train.PositionSwitch.Position + 0.5) == 2
if pos == 2.5 then
return (not PP or RKPosition >= 7) and 3 or 1
elseif pos > -4 then
return pos
elseif pos == -4 then
return not self.Train:GetPackedBool(35) and RKPosition < 7 and -3 or -1
elseif pos == -5 then
return self.Train.Speed > speedLimit-5 and -2 or -1
elseif pos == -6 or pos == -7 then
self.OnStation = true
local S = self.Train.UPO.Distance
local RK = self:GetStationRK(S,pos == -7)
if (RK >= 18 and self.Train.ALS_ARS.Speed < 0.1 and not self.StartMoving and self.OnStation) then
self.Train.UPO.StationAutodrive = false
--self.VUDOverride = true
--local self.Train.UPO.Station = self.Train:ReadCell(49160) > 0 and self.Train:ReadCell(49160) or self.Train:ReadCell(49161)
if self.Train.UPO.Station == 0 then self.AutodriveReset = true return end
--local StatID = Metrostroi.WorkingStations[self.Train.UPO.Station] or Metrostroi.WorkingStations[self.Train.UPO.Station + (self.Path == 1 and 1 or -1)] or 0
if not StationBraking then
local Curr = Metrostroi.AnnouncerData[self.Train.UPO.Station]
if Curr[2] then
self.Train:WriteCell(32,1)
else
self.Train:WriteCell(31,1)
end
timer.Simple(0.1,function()
if not IsValid(self.Train) then return end
self.Train:WriteCell(32,0)
self.Train:WriteCell(31,0)
end)
self.Train.ADoorDisable:TriggerInput("Set",1)
end
self.AutodriveReset = true
self.KVPos = 0
end
return (not self.Train:GetPackedBool(35) and (RK > RKPosition or RK >= 18)) and (RK == 19 and -4 or-3) or -1
end
end
function TRAIN_SYSTEM:BoardAutodrive()
local Train= self.Train
-- Calculate distance to station
local dX = self.Train.UPO.Distance
if dX > 160 then self.StartMoving = nil end
local OnStation = dX < 160 and not self.StartMoving and Metrostroi.AnnouncerData[self.Train.UPO.Station]and Metrostroi.AnnouncerData[self.Train.UPO.Station][1]
--if StationBraking and (dX >= (160+35*self.MU - (speedLimit == 40 and 30 or 0)) or not OnStation) then self.Train.UPO.StationAutodrive = false return end
-- Target and real RK position (0 if not braking)
local TargetBrakeRKPosition = 0
local Command = self:GetCurrentCommand()
local KVPos = Command
local VZP = self.Train.KSAUP and self.Train.VZP.Value > 0.5
local Vn2 = KVPos == -4
if VZP and KVPos > 0 then
KVPos = 0
elseif ElectricBrakeActive then
if (RheostatBrakeRotating or RKPosition == 18 and not OnStation) and not Train:GetPackedBool(35) then
KVPos = -3
else
KVPos = -1
end
elseif AcceleratingActive then
if Train.ALS_ARS.Speed > 30 and RheostatAccelRotating and not Train:GetPackedBool(35) then
KVPos = 3
elseif RheostatAccelRotating and not Train:GetPackedBool(35) then
KVPos = 2
else
KVPos = 1
end
end
if Vn2 then KVPos = 0 end
if OnStation then
self.Train.R25p:TriggerInput("Set",self.OldRheostatBrakeRotating ~= RheostatBrakeRotating)
self.OldRheostatBrakeRotating = RheostatBrakeRotating
end
--Train:WriteCell(29, PneumaticValve1 and 1 or 0) -- Engage PN1
Train:TriggerInput("KVControllerAutodriveSet",KVPos)
--Train:WriteCell(25,(ElectricBrakeActive and self.TargetBrakeRKPosition > 17) and 1 or 0) -- Engage power circuits
self.Brake = ElectricBrakeActive
self.Accelerate = AcceleratingActive
self.KVPos = KVPos
self.Rotating = RheostatBrakeRotating and true or RheostatAccelRotating and false or nil
end
function TRAIN_SYSTEM:Enable()
if not self.AutodriveEnabled and not self.AutodriveReset then
self.AutodriveEnabled = true
self.StartMoving = true
end
end
function TRAIN_SYSTEM:Disable()
self.AutodriveReset = true
end
function TRAIN_SYSTEM:Think()
self.TrainCorrections = {
["Em"] = 0,
["717"] = 0,
}
local S = self.Train.UPO.Distance
self.Time = self.Time or CurTime()
if (CurTime() - self.Time) > 0.1 and self.Train.A29 and self.Train.A29.Value < 0.5 then
self.Time = CurTime()
--RunConsoleCommand("say",Format("station:%.2f,%.2f\t distance:%.2f",self.Train.UPO.Station,self.Train:ReadCell(49165),S))
end
if self.Train.KSAUP then return end
if self.Train.VZP then
if self.Train.BCCD and self.Train.BCCD.Value > 0 and self.Train.ADoorDisable.Value > 0 then
self.Train.ADoorDisable:TriggerInput("Set",0)
self.OnStation = false
self.AutodriveEnabled = false
self.ReadyToStart = true
end
--[[if Train:CPPIGetOwner() and Train:CPPIGetOwner():GetName() ~= "glebqip(RUS)" and (self.AutodriveEnabled or not self.AutodriveReset) then
self.AutodriveReset = true
else]]
if self.AutodriveReset then
self.Train:TriggerInput("KVControllerAutodriveSet",0)
self.NoAcceleration = nil
self.Train:WriteCell(8,0)
self.Train:WriteCell(29,0)
self.AutodriveEnabled = false
self.OnStation = false
end
if (self.Train.VZP.Value < 0.5 or (self.Train.Blok and self.Train.Blok == 4)) and self.AutodriveReset then
self.AutodriveReset = false
end
--Disable autodrive, if KV pos is not zero, ARS or ALS not enabled, Reverser position is not forward or Driver value pos is > 2
if self.Train.Blok and self.Train.Blok ~= 1 then
if (self.Train.Pneumatic.BrakeLinePressure < 4.8 or self.Train.Pneumatic.BrakeCylinderPressure > 1.8) and not self.BCTimer then
self.BCTimer = CurTime()+3
end
if self.Train.Pneumatic.BrakeLinePressure >= 4.8 and self.Train.Pneumatic.BrakeCylinderPressure <= 1.8 then
self.BCTimer = nil
end
if self.BCTimer and CurTime() - self.BCTimer > 0 then
self:Disable()
end
if self.Train.KV.ControllerPosition ~= 0.0 or not self.Train.ALS_ARS.EnableARS or self.Train.KV.ReverserPosition ~= 1.0 or self.Train.Panel.SD < 0.5 then
self:Disable()
end
if self.Train.ALS_ARS["33G"] > 0.5 then
self:Disable()
end
end
--if self.OnStation and self.Train.UPO.StationAutodrive and self.AutodriveWorking and not self.VRD and self.Train.ALS_ARS.EnableARS and self.Train.KV.ReverserPosition == 1.0 and self.Train.Pneumatic.DriverValvePosition <= 2 and self.self.Train.Panel.SD > 0.5 then
--self:Autodrive(true)
--elseif self.Train.UPO.StationAutodrive then
--self.Train.UPO.StationAutodrive = false
--end
if self.AutodriveEnabled then
if self.Train.Blok ~= 1 and not self.KSAUP then
self:Autodrive()
else
self:BoardAutodrive()
end
end
if self.ReadyToStart and self.Train.Panel["SD"] > 0.5 then
self.ReadyToStart = nil
self.AutodriveReset = false
end
if self.Blocks == 2 and self["PA-KSD"].StationAutodrive then
self:Autodrive(true)
end
--end
end
if self.RealControllerPosition ~= self.Train.KV.RealControllerPosition and self.Train.Blok == 1 and self.Train.A5 and self.Train.A5.Value > 0.5 then
local dX = self.Train.UPO.Distance
--RunConsoleCommand("say",self.Train.KV.RealControllerPosition,dX,self.Train.UPO.Station,(Metrostroi.TrainPositions[self.Train] and Metrostroi.TrainPositions[self.Train][1]) and Metrostroi.TrainPositions[self.Train][1].path.id or "unk",math.floor(self.Train.RheostatController.Position+0.5))
--file.Append("puav.txt",Format("%d\t%s\t%d\t%s\t%d\n",self.Train.KV.RealControllerPosition,dX,self.Train.UPO.Station,(Metrostroi.TrainPositions[self.Train] and Metrostroi.TrainPositions[self.Train][1]) and Metrostroi.TrainPositions[self.Train][1].path.id or "unk",math.floor(self.Train.RheostatController.Position+0.5)))
self.RealControllerPosition = self.Train.KV.RealControllerPosition
end
--self:GetCurrentCommand()
end