From b433315c1f887b5ece1e573b0de68c85747786a4 Mon Sep 17 00:00:00 2001 From: Moon Horse Date: Mon, 29 Jul 2024 16:49:16 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D1=82=D0=B4=D0=B5=D0=B1=D0=B0=D0=B6?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE,=20=D0=BD=D0=BE=20=D0=BE=D1=82=D0=BB=D0=B0?= =?UTF-8?q?=D0=B4=D0=BE=D1=87=D0=BD=D1=8B=D0=B5=20=D1=81=D0=BE=D0=BE=D0=B1?= =?UTF-8?q?=D1=89=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BD=D0=B5=20=D1=83=D0=B1=D1=80=D0=B0=D0=BD=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gmod_subway_81-714_mvm/cl_init.lua | 4 +- lua/entities/gmod_subway_81-714_mvm/init.lua | 4 +- lua/entities/gmod_subway_81-717_mvm/init.lua | 6 +- .../systems/sys_81_714_electric.lua | 2 +- .../systems/sys_81_717_electric.lua | 2 +- lua/metrostroi/systems/sys_battery.lua | 65 ++++++++++++------- lua/metrostroi/systems/sys_bpsn.lua | 17 ++--- 7 files changed, 60 insertions(+), 40 deletions(-) diff --git a/lua/entities/gmod_subway_81-714_mvm/cl_init.lua b/lua/entities/gmod_subway_81-714_mvm/cl_init.lua index 974d47c..c06973f 100644 --- a/lua/entities/gmod_subway_81-714_mvm/cl_init.lua +++ b/lua/entities/gmod_subway_81-714_mvm/cl_init.lua @@ -272,7 +272,7 @@ ENT.ButtonMap["Voltages"] = { buttons = { {ID = "!BatteryVoltage", x=0, y=0, w=72.5,h=75, tooltip="",tooltipFunc = function(ent) return Format(Metrostroi.GetPhrase("Train.Buttons.BatteryVoltage"),ent:GetPackedRatio("BatteryVoltage")*150) end}, - {ID = "!BatteryCurrent", x=72.5, y=0, w=72.5,h=75, tooltip="",tooltipFunc = function(ent) return Format(Metrostroi.GetPhrase("Train.Buttons.BatteryCurrent"),ent:GetPackedRatio("BatteryCurrent")*500) end}, + {ID = "!BatteryCurrent", x=72.5, y=0, w=72.5,h=75, tooltip="",tooltipFunc = function(ent) return Format(Metrostroi.GetPhrase("Train.Buttons.BatteryCurrent"),(ent:GetPackedRatio("BatteryCurrent")-0.5)*500/0.5) end}, } } ENT.ButtonMap["Pressures"] = { @@ -995,7 +995,7 @@ function ENT:Think() self:Animate("train_line", self:GetPackedRatio("TLPressure"),0.14, 0.875, 256,2)--,,0.01) self:Animate("brake_cylinder", self:GetPackedRatio("BCPressure"),0.14, 0.875, 256,2)--,,0.03) self:Animate("voltmeter", self:GetPackedRatio("BatteryVoltage"),0.601, 0.400) - self:Animate("ampermeter", 0.5+self:GetPackedRatio("BatteryCurrent"),0.604, 0.398) + self:Animate("ampermeter", self:GetPackedRatio("BatteryCurrent"),0.604, 0.398) local typ = self:GetNW2Int("LampType",1) if self.LampType ~= typ then diff --git a/lua/entities/gmod_subway_81-714_mvm/init.lua b/lua/entities/gmod_subway_81-714_mvm/init.lua index 5191968..745bfdb 100644 --- a/lua/entities/gmod_subway_81-714_mvm/init.lua +++ b/lua/entities/gmod_subway_81-714_mvm/init.lua @@ -132,7 +132,7 @@ function ENT:Initialize() }, } --self.BattCurrent = 0 - self.eds_eq = 0 + --self.eds_eq = 0 -- Cross connections in train wires self.TrainWireInverts = { @@ -388,7 +388,7 @@ function ENT:Think() ----------------------------------*****************************--------------------------------]] self:SetPackedRatio("BatteryVoltage",(self.Battery.eds_eq)/150.0) - self:SetPackedRatio("BatteryCurrent",self.Battery.Ibatt/1000) + self:SetPackedRatio("BatteryCurrent",0.5 + 0.5*self.Battery.Ibatt/500.0) self:SetPackedRatio("EnginesCurrent", 0.5 + 0.5*(self.Electric.I24/500.0)) self:SetPackedBool("Compressor",Pneumatic.Compressor > 0) diff --git a/lua/entities/gmod_subway_81-717_mvm/init.lua b/lua/entities/gmod_subway_81-717_mvm/init.lua index 554db57..89b4791 100644 --- a/lua/entities/gmod_subway_81-717_mvm/init.lua +++ b/lua/entities/gmod_subway_81-717_mvm/init.lua @@ -225,7 +225,7 @@ function ENT:Initialize() self.OtsekDoor1 = false self.OtsekDoor2 = false --self.BattCurrent = 0 - self.eds_eq = 0 + --self.eds_eq = 0 self.Lamps = { broken = {}, @@ -387,14 +387,14 @@ function ENT:TrainSpawnerUpdate() self.Battery:TriggerInput("CarType",1) --self.Battery:TriggerInput("InitialVoltage",math.random(62,75)) self.Battery:TriggerInput("Dischargeable",self:GetNW2Bool("BattCharge")) - local ccc = 0 + --[[local ccc = 0 self.ComputerCar = false for k,v in ipairs(self.WagonList) do if v.AR63 and v.ComputerCar then ccc = ccc + 1; break end end if ccc == 0 then self.ComputerCar = true - end + end]] math.randomseed(num+817171) if self.CustomSettings then --{"Type","Spawner.717.Type","List",{"Spawner.717.Type.717","Spawner.717.Type.7175"}}, diff --git a/lua/metrostroi/systems/sys_81_714_electric.lua b/lua/metrostroi/systems/sys_81_714_electric.lua index b4a37ec..d036cf7 100644 --- a/lua/metrostroi/systems/sys_81_714_electric.lua +++ b/lua/metrostroi/systems/sys_81_714_electric.lua @@ -250,7 +250,7 @@ function TRAIN_SYSTEM:SolveAllInternalCircuits(Train,dT,firstIter) --Train:WriteTrainWire(36,S["36N"]*(1-Train.BPSNon.Value)) --Train:WriteTrainWire(69,T[36]*Train.BPSNon.Value) - S["B9"] = B*Train.A53.Value + S["B9"] = (BO+BO2)*Train.A53.Value S["B9a"] = S["B9"]*Train.VB.Value Train.KVC:TriggerInput("Set",S["B9a"]) --Train.KUP:TriggerInput("Set",S["B9a"]*Train.A75.Value) diff --git a/lua/metrostroi/systems/sys_81_717_electric.lua b/lua/metrostroi/systems/sys_81_717_electric.lua index 011b0ec..9f3871a 100644 --- a/lua/metrostroi/systems/sys_81_717_electric.lua +++ b/lua/metrostroi/systems/sys_81_717_electric.lua @@ -659,7 +659,7 @@ function TRAIN_SYSTEM:SolveAllInternalCircuits(Train,dT,firstIter) if isDot2 then Train:WriteTrainWire(11,B*Train.VA.Value) end - S["B9"] = B*Train.A53.Value + S["B9"] = (BO+BO2)*Train.A53.Value S["22B"] = T[10]*Train.A10.Value*Train.VMK.Value Train:WriteTrainWire(22,(S["22B"]+T[44])*Train.AK.Value) Train:WriteTrainWire(44,S["22B"]) diff --git a/lua/metrostroi/systems/sys_battery.lua b/lua/metrostroi/systems/sys_battery.lua index f8dd6e3..ab71c41 100644 --- a/lua/metrostroi/systems/sys_battery.lua +++ b/lua/metrostroi/systems/sys_battery.lua @@ -38,9 +38,10 @@ function TRAIN_SYSTEM:Initialize() self.EthaCE = self.EthaCE0 self.Ibatt = 0 self.eds_eq = 0 + self.sump_cond = 0 -- car consumers summary conductivity self.Consumers = {} self.Dischar = false - self.ComputerCar = false + --self.ComputerCar = false --------------------------------------------- -- 10 mV/min — voltage covery/recovery speed during first 30 minutes after charging/discharging stopped @@ -93,10 +94,13 @@ function TRAIN_SYSTEM:Think(dT) end end - if self.Train.ComputerCar then + if self.Train.TrainWireLeader then local nodecurr_sum, branchcond_sum = 0.0, 0.0 local src_cond_sum, sump_cond_sum = 0.0, 0.0 - local eds_eq = 0.0 + local eds_eq = self.eds_eq + + -- TODO: реализовать тепловую защиту БПСН от длительных токов свыше 60 А + -- сделать возможность заменять сгоревшие предохранители АКБ (не более 10 шт. на состав) --a "two-node method" of 10's wire voltage computing for k,v in ipairs(self.Train.WagonList) do @@ -106,29 +110,43 @@ function TRAIN_SYSTEM:Think(dT) src_cond_sum = src_cond_sum + v.A56.Value*(v.VB.Value/v.Battery.IResistance + v.PowerSupply.X2_1*v.A24.Value/v.PowerSupply.IResistance) end branchcond_sum = sump_cond_sum + src_cond_sum - eds_eq = nodecurr_sum/branchcond_sum - local load_curr_sum = eds_eq*sump_cond_sum - local batt_curr_sum = 0 + if branchcond_sum > 0 then eds_eq = nodecurr_sum/branchcond_sum end for k,v in ipairs(self.Train.WagonList) do - v.PowerSupply.car_control_sigma = load_curr_sum - v.PowerSupply.car_control_load = eds_eq*v.Battery.sump_cond - v.Battery.Ibatt = math.min(1,(2-self.Train.PA1.Value-self.Train.PA2.Value)) - *(math.min(1,(v.VB.Value*v.A56.Value+v.A24.Value))*v.VB.Value*((v.A56.Value*(eds_eq - v.Battery.Voltage) - + v.PowerSupply.X2_1*(1-v.A56.Value)*(v.PowerSupply.VoltageOut*v.A24.Value - v.Battery.Voltage))))/v.Battery.IResistance - batt_curr_sum = batt_curr_sum + v.Battery.Ibatt + v.Battery.Ibatt = (v.A56.Value*v.VB.Value*math.min(1,(2-v.PA1.Value-v.PA2.Value))*(eds_eq - v.Battery.Voltage) + + v.PowerSupply.X2_1*v.A24.Value*v.VB.Value*(1-v.A56.Value)*math.min(1,(2-v.PA1.Value-v.PA2.Value))*(v.PowerSupply.VoltageOut - v.Battery.Voltage)) + /v.Battery.IResistance + v.Battery.eds_eq = eds_eq - v.eds_eq = v.Battery.eds_eq - end - for k,v in ipairs(self.Train.WagonList) do - v.PowerSupply.car_control_sigma = v.PowerSupply.car_control_sigma + batt_curr_sum + --v.eds_eq = v.Battery.eds_eq + --v.Battery.nodecurr_sum = nodecurr_sum + --v.Battery.branchcond_sum = branchcond_sum end end + local iload_sum, ibatt_sum, isply_sum, isupply = 0, 0, 0, 0 + for k,v in ipairs(self.Train.WagonList) do + iload_sum = iload_sum + v.Battery.eds_eq*v.Battery.sump_cond + if v.Battery.Ibatt > 0 then + ibatt_sum = ibatt_sum + v.VB.Value*v.A56.Value*math.min(1,(2-v.PA1.Value-v.PA2.Value))*v.Battery.Ibatt + end + if v ~= self.Train then + isupply = math.max(0,(v.PowerSupply.VoltageOut-v.Battery.eds_eq)/v.PowerSupply.IResistance) + isply_sum = isply_sum + v.PowerSupply.X2_1*v.A24.Value*v.VB.Value*v.A56.Value*isupply + end + end + local BPSN = self.Train.PowerSupply + local Train = self.Train + BPSN.Iout = (ibatt_sum + iload_sum - isply_sum)*BPSN.X2_1*Train.A24.Value*Train.VB.Value*Train.A56.Value + + BPSN.X2_1*Train.A24.Value*(1-Train.A56.Value*Train.VB.Value)*self.Ibatt + -- DEBUG - if self.Train.R_VPR and self.Train.R_VPR.Value < 0.5 then - --print(v.eds_eq, nodecurr_sum, branchcond_sum) - --print("v.PowerSupply.X2_1 = "..v.PowerSupply.X2_1,self.Train.Battery.IResistance) - print(self.Train.PowerSupply.car_control_sigma,self.Train.PowerSupply.car_control_load,self.Train.Battery.Ibatt) - print(self.Train.PowerSupply.Iout,self.Train.PowerSupply.Icosume) + if self.Train.A49 and self.Train.A49.Value < 0.5 then + --print(Format("self.nodecurr_sum = %.1f A,\tself.branchcond_sum = %.1f См,\tself.proximity = %.8f",self.nodecurr_sum, self.branchcond_sum,self.proximity)) + --print(iload_sum, ibatt_sum, isply_sum, isupply) + print("BPSN.X2_1 = "..BPSN.X2_1,"R АКБ вн. = "..Train.Battery.IResistance.. " Ом","Счетный вагон: "..(Train.TrainWireLeader and "да" or "нет")) + print(Format("БПСН, Iout = %.1f A,\tТок заряда батареи = %.1f A,\tU АКБ цель = %.1f B",BPSN.Iout,self.Ibatt,self.TargetVoltage)) + print(Format("БПСН, Vout = %.1f B,\tБПСН, ток потр. = %.1f A,\tU 10 пр. = %.1f B",BPSN.VoltageOut,BPSN.Icosume,self.eds_eq)) + --print(Train.PA1.Value,Train.PA2.Value) + print(Format("U АКБ = %.1f B,\tSoC = %.2f %%,\tG load = %.1f См\tПА1, ПА2 = %d, %d\n",self.Voltage,self.SoC,self.sump_cond,Train.PA1.Value,Train.PA2.Value)) end -- Calculate state of charge, internal resistance and battery voltage if self.Dischar then @@ -181,7 +199,7 @@ function TRAIN_SYSTEM:Think(dT) self.Uh_soc=2.62496*self.SoC^8-12.77132*self.SoC^7+22.37586*self.SoC^6-18.04921*self.SoC^5+6.14667*self.SoC^4+0.26467*self.SoC^3-0.82125*self.SoC^2+0.21246*self.SoC+0.02641 self.Train.PA1:TriggerInput("Close",math.abs(self.Ibatt)/2) -- Это неправильно, но я уже заебалась - self.Train.PA2:TriggerInput("Close",math.abs(self.Ibatt)/2) + self.Train.PA2:TriggerInput("Close",math.abs(self.Ibatt)/2) -- (хотя, для .5 это как раз правильно) end -- Calculate battery voltage @@ -204,7 +222,8 @@ function TRAIN_SYSTEM:Think(dT) end self.TargetVoltage = self.TargetVoltage*self.ElementCount - local proximity = 0.055 - (self.TargetVoltage - self.Voltage)*0.045/9 + local proximity = math.min(0.14, 0.01*math.abs(self.TargetVoltage - self.Voltage)) + --self.proximity = proximity self.Voltage = self.Voltage + (self.TargetVoltage - self.Voltage)*proximity -- DEBUG diff --git a/lua/metrostroi/systems/sys_bpsn.lua b/lua/metrostroi/systems/sys_bpsn.lua index 67b3ff5..5ad5165 100644 --- a/lua/metrostroi/systems/sys_bpsn.lua +++ b/lua/metrostroi/systems/sys_bpsn.lua @@ -22,8 +22,8 @@ function TRAIN_SYSTEM:Initialize() self.OutputVoltage = 76 -- volts self.IResistance = 0.01 -- Ohm (сам выдумал, примерно на полтора порядка ниже, чем у АКБ) - self.car_control_load = 0 -- Amp - self.car_control_sigma = 0 -- Amp + --self.car_control_load = 0 -- Amp + --self.car_control_sigma = 0 -- Amp self.Icosume = 0 -- 3rd rail current consumption, amp self.Iout = 0 -- output current, amp self.VoltageOut = 0 @@ -38,7 +38,7 @@ function TRAIN_SYSTEM:Inputs() end function TRAIN_SYSTEM:Outputs() - return { "X2_2", "X6_2", "car_control_load", "car_control_sigma", "VoltageOut", "OutputVoltage", "Icosume", "Iout" } + return { "X2_2", "X6_2", "VoltageOut", "OutputVoltage", "Icosume", "Iout" } end @@ -53,24 +53,25 @@ function TRAIN_SYSTEM:Think() local Train = self.Train -- Get high-voltage input -- X2_1 now indicates that primary converter is operating - self.X2_1 = (Train.Electric.Aux750V > 550 and 1 or 0) * Train.KPP.Value * (1-Train.RZP.Value) + self.X2_1 = (Train.Electric.Aux750V > 300 and 1 or 0) * Train.KPP.Value * (1-Train.RZP.Value) if Train.Electric.Aux750V >= 550 then self.VoltageOut = self.X2_1*(self.OutputVoltage + (Train.Electric.Aux750V - 550)*8/425) else self.VoltageOut = math.max(0,self.X2_1*(Train.Electric.Aux750V - 300)*76/300) end - if self.car_control_sigma > 0 then - self.Iout = Train.A24.Value*Train.PowerSupply.X2_1*self.car_control_sigma + --[[if self.car_control_sigma > 0 then + self.Iout = self.car_control_sigma for k,v in ipairs(Train.WagonList) do if v ~= Train then self.Iout = math.max(0,self.Iout - v.A24.Value*v.PowerSupply.X2_1*(v.PowerSupply.car_control_load + v.A56.Value*v.Battery.Ibatt)) end end self.car_control_sigma = 0 - end + end]] - self.Icosume = Train.NR.Value*self.VoltageOut*self.Iout/(Train.Electric.Aux750V > 0 and Train.Electric.Aux750V or 1) + --self.Iout = self.car_control_load + self.Icosume = --[[Train.NR.Value*]]self.VoltageOut*self.Iout/(Train.Electric.Aux750V > 0 and Train.Electric.Aux750V or 1) -- Get battery input local XT3_1 = self.X2[5]*self.X2_1