mirror of
https://github.com/metrostroi-repo/MetrostroiAddon.git
synced 2026-05-02 00:42:29 +00:00
Merge pull request #445 from metrostroi-repo/#425
Вывод на вольтметры напряжения на 10 проводе. Имитация просадки напряжения на ПП БПСН и его тепловая защита
This commit is contained in:
@@ -355,7 +355,46 @@ function ENT:Think()
|
||||
end
|
||||
self:SetPackedRatio("TLPressure", Pneumatic.TrainLinePressure/16.0)
|
||||
self:SetPackedRatio("BCPressure", Pneumatic.BrakeCylinderPressure/6.0)
|
||||
self:SetPackedRatio("BatteryVoltage",Panel["V1"]*self.Battery.Voltage/150.0)
|
||||
|
||||
----------------------------------*****************************--------------------------------
|
||||
--10th wire voltage readout imitation depending on the BPSNs and EKK state, not on the wagon battery switch state
|
||||
local hvcounter = 0
|
||||
local hvcar = nil
|
||||
local vdrop = 1.125*(#self.WagonList)
|
||||
for k,v in ipairs(self.WagonList) do
|
||||
if v.PowerSupply.X2_2 > 0 and v.A24.Value > 0 then
|
||||
hvcounter = hvcounter + 1
|
||||
hvcar = hvcar or v
|
||||
vdrop = vdrop - 1.125
|
||||
else
|
||||
vdrop = vdrop - ((v.A56.Value == 0 and 0.4 or (v.VB.Value == 0 and 0.4 or 0)) + (v.LK4.Value == 0 and 0.725 or 0))
|
||||
end
|
||||
end
|
||||
local PCV_o = hvcounter > 0 and math.Clamp(76+(hvcar.Electric.Aux750V - 600)*8/375, 76, 84) - vdrop or self.WagonList[1].Battery.Voltage
|
||||
--imitating converter overload protection only when control circuits are energized and at least one PC on the train is off; pretty useless btw (but fun)
|
||||
local pcloadratio = #self.WagonList/(hvcounter > 0 and hvcounter or 0.5)
|
||||
local _A = 25*(6 - 6/(5.01)) --assuming one PC on 6 cars can work for 25 secs while the cars' CCs are energized
|
||||
if pcloadratio > 1 and pcloadratio <= #self.WagonList and self.LK4.Value > 0 and self.PowerSupply.X2_2 > 0 and not self.pcrlxtimer then
|
||||
self.pcprotimer = self.pcprotimer or CurTime()
|
||||
--hyperbolic function of PC operating time depending on load coeff
|
||||
if CurTime() - self.pcprotimer > _A/(pcloadratio - 6/5.01) then
|
||||
self.pcrlxtimer = CurTime()
|
||||
end
|
||||
else
|
||||
if self.pcrlxtimer then
|
||||
if CurTime() - self.pcrlxtimer < 30 then --30 seconds relaxation time before PC overload protecion can be reset
|
||||
self.RZP:TriggerInput("Close",1)
|
||||
else
|
||||
self.pcrlxtimer = nil
|
||||
end
|
||||
else
|
||||
self.pcprotimer = nil
|
||||
end
|
||||
end
|
||||
self.PowerSupply:TriggerInput("3x2",self.pcrlxtimer and 1 or 0) --BPSN overheat protection in case of RZP button is being pressed constantly
|
||||
----------------------------------*****************************--------------------------------
|
||||
|
||||
self:SetPackedRatio("BatteryVoltage",Panel["V1"]*PCV_o/150.0)
|
||||
self:SetPackedRatio("BatteryCurrent",Panel["V1"]*math.Clamp((self.Battery.Voltage-75)*0.01,-0.01,1))
|
||||
self:SetPackedRatio("EnginesCurrent", 0.5 + 0.5*(self.Electric.I24/500.0))
|
||||
|
||||
|
||||
@@ -675,8 +675,48 @@ function ENT:Think()
|
||||
self:SetPackedRatio("EnginesVoltage", self.Electric.Aux750V/1000.0)
|
||||
self:SetPackedRatio("EnginesCurrent2", 0.5 + 0.5*(self.Electric.I13/500.0))
|
||||
self:SetPackedRatio("EnginesCurrent", 0.5 + 0.5*(self.Electric.I24/500.0))
|
||||
self:SetPackedRatio("BatteryVoltage",Panel["V1"]*self.Battery.Voltage/150.0)
|
||||
|
||||
----------------------------------*****************************--------------------------------
|
||||
--10th wire voltage readout imitation depending on the BPSNs and EKK state, not on the wagon battery switch state
|
||||
-- PC power converter; CC control circuits
|
||||
local hvcounter = 0
|
||||
local hvcar = nil
|
||||
local vdrop = 1.125*(#self.WagonList)
|
||||
for k,v in ipairs(self.WagonList) do
|
||||
if v.PowerSupply.X2_2 > 0 and v.A24.Value > 0 then
|
||||
hvcounter = hvcounter + 1
|
||||
hvcar = hvcar or v
|
||||
vdrop = vdrop - 1.125
|
||||
else
|
||||
vdrop = vdrop - ((v.A56.Value == 0 and 0.4 or (v.VB.Value == 0 and 0.4 or 0)) + (v.LK4.Value == 0 and 0.725 or 0))
|
||||
end
|
||||
end
|
||||
local PCV_o = hvcounter > 0 and math.Clamp(76+(hvcar.Electric.Aux750V - 600)*8/375, 76, 84) - vdrop or self.WagonList[1].Battery.Voltage
|
||||
--imitating converter overload protection only when control circuits are energized and at least one PC on the train is off; pretty useless btw (but fun)
|
||||
local pcloadratio = #self.WagonList/(hvcounter > 0 and hvcounter or 0.5)
|
||||
local _A = 25*(6 - 6/(5.01)) --assuming one PC on 6 cars can work for 25 secs while the cars' CCs are energized
|
||||
if pcloadratio > 1 and pcloadratio <= #self.WagonList and self.LK4.Value > 0 and self.PowerSupply.X2_2 > 0 and not self.pcrlxtimer then
|
||||
self.pcprotimer = self.pcprotimer or CurTime()
|
||||
--hyperbolic function of PC operating time depending on load coeff
|
||||
if CurTime() - self.pcprotimer > _A/(pcloadratio - 6/5.01) then
|
||||
self.pcrlxtimer = CurTime()
|
||||
end
|
||||
else
|
||||
if self.pcrlxtimer then
|
||||
if CurTime() - self.pcrlxtimer < 30 then --30 seconds relaxation time before PC overload protecion can be reset
|
||||
self.RZP:TriggerInput("Close",1)
|
||||
else
|
||||
self.pcrlxtimer = nil
|
||||
end
|
||||
else
|
||||
self.pcprotimer = nil
|
||||
end
|
||||
end
|
||||
self.PowerSupply:TriggerInput("3x2",self.pcrlxtimer and 1 or 0) --BPSN overheat protection in case of RZP button is being pressed constantly
|
||||
----------------------------------*****************************--------------------------------
|
||||
|
||||
self:SetPackedRatio("BatteryVoltage",Panel["V1"]*PCV_o/150.0)
|
||||
|
||||
self:SetPackedBool("Compressor",Pneumatic.Compressor > 0)
|
||||
self:SetPackedBool("Buzzer",Panel.Ring >= 1)
|
||||
self:SetPackedBool("BuzzerBZOS",Panel.Ring>0 and Panel.Ring<1)
|
||||
|
||||
@@ -66,7 +66,7 @@ function TRAIN_SYSTEM:SolveAllInternalCircuits(Train,dT,firstIter)
|
||||
local isDot2 = self.Type == 5
|
||||
|
||||
local Panel = Train.Panel
|
||||
Panel.V1 = BO
|
||||
Panel.V1 = T[10]
|
||||
|
||||
--Поездная часть
|
||||
S["33D"] = T[10]*Train.A54.Value*Train.A84.Value
|
||||
|
||||
@@ -70,7 +70,7 @@ function TRAIN_SYSTEM:SolveAllInternalCircuits(Train,dT,firstIter)
|
||||
local KV = Train.KV
|
||||
local KRU = Train.KRU
|
||||
local Panel = Train.Panel
|
||||
Panel.V1 = BO
|
||||
Panel.V1 = T[10]
|
||||
local RC1 = Train.RC1.Value
|
||||
local ARS = Train.ALS_ARS
|
||||
local RC2,AVI,AVO
|
||||
|
||||
@@ -9,7 +9,7 @@ Metrostroi.DefineSystem("BPSN")
|
||||
function TRAIN_SYSTEM:Initialize()
|
||||
self.X2 = {
|
||||
[2] = 0,
|
||||
[3] = 0,
|
||||
[3] = 0, --overheat protection simulation
|
||||
[4] = 0,
|
||||
[5] = 0, -- Out only
|
||||
[6] = 0,
|
||||
@@ -42,7 +42,7 @@ end
|
||||
function TRAIN_SYSTEM:Think()
|
||||
local Train = self.Train
|
||||
-- Get high-voltage input
|
||||
self.X2_1 = Train.KPP.Value * (1-Train.RZP.Value) -- P4
|
||||
self.X2_1 = Train.KPP.Value * (1-Train.RZP.Value) * (1-self.X2[3]) -- P4
|
||||
-- Get battery input
|
||||
local XT3_1 = self.X2[5]*self.X2_1
|
||||
if Train.Electric.Aux750V*self.X2_1 > 975 then
|
||||
@@ -50,7 +50,6 @@ function TRAIN_SYSTEM:Think()
|
||||
self.X2_1 = 0
|
||||
XT3_1 = 0
|
||||
end
|
||||
|
||||
-- Check if enable signal is present
|
||||
self.Active = XT3_1>0 and 1 or 0
|
||||
self.X2_2 = Train.Electric.Aux750V*self.Active
|
||||
|
||||
Reference in New Issue
Block a user