diff --git a/lua/entities/gmod_subway_81-714_mvm/init.lua b/lua/entities/gmod_subway_81-714_mvm/init.lua index 9692261..5191968 100644 --- a/lua/entities/gmod_subway_81-714_mvm/init.lua +++ b/lua/entities/gmod_subway_81-714_mvm/init.lua @@ -331,6 +331,7 @@ function ENT:Think() self:SetPackedBool("lightsActive"..i,false) end end + self.Battery.Consumers["SalonLights"] = {Panel.MainLights+Panel.EmergencyLights,(Panel.MainLights*36^-1 + Panel.EmergencyLights*74^-1)^-1,0} self:SetPackedBool("DoorsW",Panel.DoorsW > 0) self:SetPackedBool("GRP",Panel.GreenRP > 0) diff --git a/lua/entities/gmod_subway_81-717_mvm/init.lua b/lua/entities/gmod_subway_81-717_mvm/init.lua index 4f67214..554db57 100644 --- a/lua/entities/gmod_subway_81-717_mvm/init.lua +++ b/lua/entities/gmod_subway_81-717_mvm/init.lua @@ -601,7 +601,9 @@ function ENT:Think() self:SetPackedBool("lightsActive"..i,false) end end - + self.Battery.Consumers["SalonLights"] = {Panel.MainLights+Panel.EmergencyLights,(Panel.MainLights*36^-1 + Panel.EmergencyLights*74^-1)^-1,0} + self.Battery.Consumers["HeadLights"] = {Panel.Headlights1*(1+Panel.Headlights2),(Panel.Headlights1*22^-1*(1 + Panel.Headlights2))^-1,0} + if self:ReadTrainWire(4)*self:ReadTrainWire(5)*self:ReadTrainWire(10) > 0 then self.A54:TriggerInput("Set",0) end diff --git a/lua/metrostroi/systems/sys_battery.lua b/lua/metrostroi/systems/sys_battery.lua index 2fcd1fe..f8dd6e3 100644 --- a/lua/metrostroi/systems/sys_battery.lua +++ b/lua/metrostroi/systems/sys_battery.lua @@ -50,7 +50,7 @@ function TRAIN_SYSTEM:Initialize() for k,v in pairs(self.Train.Systems) do if v.hasCoil and not self.Consumers[v] then - --print("Registering relay",v.Name, "Train: ", self.Train) + --print("Registering relay",v.Name, "Train: ", self.Train, type(v)) self.Consumers[v] = {0,v.coil_res,0} end end @@ -87,41 +87,50 @@ function TRAIN_SYSTEM:Think(dT) if self.CarType == 1 then for k,v in pairs(self.Consumers) do - v[1] = k.Value - v[3] = k.Current + if type(k) == "table" then + v[1] = k.Value + v[3] = k.Current + end end if self.Train.ComputerCar 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 --a "two-node method" of 10's wire voltage computing for k,v in ipairs(self.Train.WagonList) do nodecurr_sum = nodecurr_sum + v.A56.Value*(v.VB.Value*v.Battery.Voltage/v.Battery.IResistance + v.PowerSupply.X2_1*v.A24.Value*v.PowerSupply.VoltageOut/v.PowerSupply.IResistance) - branchcond_sum = branchcond_sum + GetBranchCondSum(v.Battery.Consumers) + v.A56.Value*(v.VB.Value/v.Battery.IResistance + v.PowerSupply.X2_1*v.A24.Value/v.PowerSupply.IResistance) + v.Battery.sump_cond = GetBranchCondSum(v.Battery.Consumers) + sump_cond_sum = sump_cond_sum + v.Battery.sump_cond + 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 for k,v in ipairs(self.Train.WagonList) do - local consumers_cond = GetBranchCondSum(v.Battery.Consumers) - v.PowerSupply.car_control_load = eds_eq*consumers_cond + 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 - v.PowerSupply.Iout = v.PowerSupply.car_control_load + v.Battery.Ibatt + batt_curr_sum = batt_curr_sum + v.Battery.Ibatt v.Battery.eds_eq = eds_eq v.eds_eq = v.Battery.eds_eq - - -- 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) - --print(v.PowerSupply.car_control_load,v.Battery.Ibatt,v.Battery.IResistance) - --print(v.PowerSupply.Iout,v.PowerSupply.Icosume) - --end + end + for k,v in ipairs(self.Train.WagonList) do + v.PowerSupply.car_control_sigma = v.PowerSupply.car_control_sigma + batt_curr_sum end end + -- 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) + end -- Calculate state of charge, internal resistance and battery voltage - -- TODO: сделать, чтобы освещение и фары тоже потребляли ток if self.Dischar then self.Capacity = self.Capacity - dT * (self.FullCapacity*0.1/86400) -- make capacity loss ~ 10% per day (just a game abstraction) if self.Ibatt > 0 then @@ -171,7 +180,6 @@ function TRAIN_SYSTEM:Think(dT) self.EMF_soc=-0.68175*self.SoC^8+8.82823*self.SoC^7-24.43179*self.SoC^6+31.87221*self.SoC^5-23.97881*self.SoC^4+11.24774*self.SoC^3-3.40685*self.SoC^2+0.74692*self.SoC+1.22076 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.BattCurrent = self.Ibatt*self.Train.A24.Value self.Train.PA1:TriggerInput("Close",math.abs(self.Ibatt)/2) -- Это неправильно, но я уже заебалась self.Train.PA2:TriggerInput("Close",math.abs(self.Ibatt)/2) end diff --git a/lua/metrostroi/systems/sys_bpsn.lua b/lua/metrostroi/systems/sys_bpsn.lua index 6e4f569..67b3ff5 100644 --- a/lua/metrostroi/systems/sys_bpsn.lua +++ b/lua/metrostroi/systems/sys_bpsn.lua @@ -23,9 +23,11 @@ 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.Icosume = 0 -- 3rd rail current consumption, amp self.Iout = 0 -- output current, amp self.VoltageOut = 0 + self.ISumpSetpoint = math.random(25,30) -- overload consumption current protection setpoint self.Active = 0 self.Train:LoadSystem("ConverterProtection","Relay","Switch", {bass = true}) @@ -36,7 +38,7 @@ function TRAIN_SYSTEM:Inputs() end function TRAIN_SYSTEM:Outputs() - return { "X2_2", "X6_2", "car_control_load", "VoltageOut", "OutputVoltage", "Icosume", "Iout" } + return { "X2_2", "X6_2", "car_control_load", "car_control_sigma", "VoltageOut", "OutputVoltage", "Icosume", "Iout" } end @@ -57,13 +59,26 @@ function TRAIN_SYSTEM:Think() 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 + 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 + 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 - if Train.Electric.Aux750V*self.X2_1 > 975 or self.Icosume > 28 then -- should be 25 - 30 amp + if Train.Electric.Aux750V*self.X2_1 > 975 or self.Icosume > self.ISumpSetpoint then Train.RZP:TriggerInput("Close",1) - --print("self.Icosume = "..self.Icosume, "Train.Electric.Aux750V = "..Train.Electric.Aux750V, "self.Iout = "..self.Iout) + print "-------------------------------------------------------------------------------------------\n" + print(Format("Сработала защита БПСН вагона %s:",Train.WagonNumber)) + print(Format("I потр = %.2f A\tI вых = %.2f A\tI уст = %.2f A\tU кс = %.1f B", self.Icosume, self.Iout, self.ISumpSetpoint, Train.Electric.Aux750V)) --print("Train.Battery.eds_eq = "..Train.Battery.eds_eq, "self.VoltageOut = "..self.VoltageOut) self.X2_1 = 0 XT3_1 = 0