Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- DIESEL = {
- IDLE_RPM = 480, --IDLE ENGINE RPM
- MAX_RPM = 1100, --MAX ENGINE RPM
- RPM_AIM = 1.6, --MAX RPM CHANGE PER SECOND
- HEATING_RPM_S = 600, --ENGINE RPM WHEN HEATING ON AND REGIME SUMMER
- HEATING_RPM_W = 800, --ENGINE RPM WHEN HEATING ON AND REGIME WINTER
- MIN_OIL_PRESSURE = 0.15, --MIN PERMISSIBLE OIL PRESSURE FOR ENGINE TO WORK - should not be lower than 0.15 of gauge
- MAX_OIL_PRESSURE = 0.65, --MAX OIL PRESSURE
- MAX_ENGINE_POWER = 1460, --MAX ENGINE POWER
- MAX_GENERATOR_POWER = 1200, --MAX GENERATOR POWER
- ENGINE_TO_BIG_CIRCUIT_KOEF = 80, --kfs
- ENGINE_TO_AMBIENT_KOEF = 1, --kfe
- ENGINE_TO_OIL_KOEF = 25, --kfo
- OIL_TO_SMALL_CIRCUIT_WATER_KOEF = 24, --kfo2
- SMALL_CIRCUIT_TO_AMBIENT_KOEF = 0.011, --kw
- SMALL_CIRCUIT_TO_AMBIENT_MOVING_KOEF = 0.07, --kv
- BIG_CIRCUIT_TO_AMBIENT_KOEF = 0.011, --kw
- BIG_CIRCUIT_TO_AMBIENT_MOVING_KOEF = 0.07, --kv
- SMALL_CIRCUIT_SHUTTERS_OPEN = 61,
- SMALL_CIRCUIT_SHUTTERS_CLOSE = 55,
- BIG_CIRCUIT_SHUTTERS_OPEN = 81,
- BIG_CIRCUIT_SHUTTERS_CLOSE = 75,
- V_HYP = 7.2,
- V_ADD = 5.5,
- PWR_CR = 1,
- FMAX = 215000,
- NUM_POWERED_AXLES = 4,
- WHEEL_RADIUS = 0.523095,
- TRANSMITION_RATIO = 77/16,
- RPM_BASED_CURRENT_MULTIPLIER = 4,
- RPM_BASED_CURRENT_ADDITION = -2570,
- GENERATOR_CONSTANT = 1,
- GEN_EXCIT_FIELD_DELTA = 1,
- GENERATOR_RESISTANCE = 1.2,
- engineRPM = 0,
- targetRPM = 0,
- rpmToFullRatio = 0,
- engineStop = false,
- engineStart = false,
- isOn = false,
- spinup = false,
- fuelPump = true,
- waterPump = false,
- oilPump = false,
- oilTargetPressure = 0,
- oilPressure = 0,
- powerControl = 0,
- trainHeatingMode = 0, --0 - off; 1 - summer; 2 - winter
- trainHeatingPower = 0,
- mainFanTargetRPM = 0,
- bigCircuitFanRPM = 0,
- auxiliaryFanTargetRPM = 0,
- smallCircuitFanRPM = 0,
- ambientTemp = 31,
- engineTemp = 50,
- oilTemp = 50,
- bigCircuitCoolerTemp = 50,
- bigCircuitWaterTemp = 50,
- smallCircuitCoolerTemp = 50,
- smallCircuitWaterTemp = 50,
- bigCircuitMeasuredTemp = 50,
- smallCircuitMeasuredTemp = 50,
- realPower = 0,
- apparentPower = 0,
- smallCircuitShuttersRequest = false,
- smallCircuitShutters = false,
- bigCircuitShuttersRequest = false,
- bigCircuitShutters = false,
- generatorExcitationField = 0,
- generatorExcitationCurrent = 0,
- generatorVoltage = 0,
- generatorCurrent = 0,
- tractionEngineVoltage = 0,
- tractionEngineInductedVoltage = 0,
- tractionEngineExcitationCurrent = 0,
- tractionEngineExcitationField = 0,
- tractionEngineArmatureCurrent = 0,
- emitterColor = 0,
- emitterVelocity = 0,
- emitterRate = 0,
- Limit = function(self, v, min, max)
- if v < min then v = min elseif v > max then v = max end
- return v
- end,
- InitTemps = function(coldStart, temperature)
- self.ambientTemp = temperature
- if coldStart then
- self.engineTemp = temperature
- self.oilTemp = temperature
- self.bigCircuitCoolerTemp = temperature
- self.bigCircuitWaterTemp = temperature
- self.smallCircuitCoolerTemp = temperature
- self.smallCircuitWaterTemp = temperature
- self.bigCircuitMeasuredTemp = temperature
- self.smallCircuitMeasuredTemp = temperature
- end
- end,
- toInt = function(self, val)
- if val then
- return(1)
- end
- return(0)
- end,
- Update = function (self, dGameTime, dRealTime)
- --OIL PRESSURE
- if self.engineRPM > 0.1 then
- self.oilTargetPressure = self.MIN_OIL_PRESSURE + (self.rpmToFullRatio)*(self.MAX_OIL_PRESSURE-self.MIN_OIL_PRESSURE)
- elseif self.oilPump then
- self.oilTargetPressure = math.min(self.MIN_OIL_PRESSURE+0.1, self.MAX_OIL_PRESSURE)
- else
- self.oilTargetPressure = 0
- end
- koef = 0.035
- if self.engineRPM > 300 then
- koef = 0.05
- end
- if self.oilPressure < self.oilTargetPressure then
- self.oilPressure = math.min(self.oilTargetPressure, self.oilPressure + koef*dRealTime)
- elseif self.oilPressure > self.oilTargetPressure then
- self.oilPressure = math.max(self.oilTargetPressure, self.oilPressure - koef/2*dRealTime)
- end
- self.oilPressure = self:Limit(self.oilPressure, 0, 1.5)
- --ENGINE UPDATE
- if self.engineStart and not self.isOn then
- --self.spinup = true
- self.isOn = true
- --self.engineRPM = math.max(self.engineRPM, 0.35*(IDLE_RPM))
- end
- --self.spinup = (self.spinup and not self.engineStop and self.engineRPM < self.IDLE_RPM)
- self.isOn = (self.isOn and not self.engineStop and self.oilPressure > self.MIN_OIL_PRESSURE)
- --OUTPUT FORCE CALCULATION
- availablePower = math.max(self.MAX_GENERATOR_POWER - self.trainHeatingPower, 0)
- targetPower = self.MAX_GENERATOR_POWER*self.powerControl
- generatedPower = 0
- if self.targetRPM > 0 then
- generatedPower = targetPower * (self.engineRPM/self.targetRPM)
- end
- genPowerToFullRatio = generatedPower/(targetPower)
- generatedPower = math.min(generatedPower,availablePower)
- if self.generatorExcitationCurrent > self.generatorExcitationField+0.1 then
- self.generatorExcitationField = self.generatorExcitationField + math.sqrt(self.generatorExcitationCurrent-self.generatorExcitationField)*dRealTime*self.GEN_EXCIT_FIELD_DELTA
- elseif self.generatorExcitationField > self.generatorExcitationCurrent+0.1 then
- self.generatorExcitationField = self.generatorExcitationField + math.sqrt(self.generatorExcitationField-self.generatorExcitationCurrent)*dRealTime*self.GEN_EXCIT_FIELD_DELTA
- else
- self.generatorExcitationField = self.generatorExcitationCurrent
- end
- generatedVoltage = self.GENERATOR_CONSTANT * self.generatorExcitationField * (math.pi*self.engineRPM/30)
- self.generatorVoltage = generatedVoltage - self.generatorCurrent * self.GENERATOR_RESISTANCE
- tractiveForce = generatedPower/Call("GetSpeed")
- -- if self.isOn and self.powerControl > 0 then
- -- if Call("GetSpeed") < self.V_HYP * (self.availablePower/targetPower) then
- -- tractiveForce = (self.FMAX-((self.FMAX - 1000*targetPower/(self.V_HYP+self.V_ADD))*(Call("GetSpeed")/self.V_HYP))/self.PWR_CR)*genPowerToFullRatio
- -- else
- -- tractiveForce = 1000*generatedPower/(Call("GetSpeed")+self.V_ADD)/self.PWR_CR
- -- end
- -- end
- -- wheelForce = tractiveForce / self.NUM_POWERED_AXLES
- -- wheelMoment = wheelForce * self.WHEEL_RADIUS
- -- engineMoment = wheelMoment / self.TRANSMITION_RATIO
- self.apparentPower = self.realPower + 0.15 * self.rpmToFullRatio * self.MAX_ENGINE_POWER
- --REVOLUTIONS CALCULATION
- self.targetRPM = 0
- if self.isOn and self.fuelPump then
- self.targetRPM = self.IDLE_RPM + self.powerControl*(self.MAX_RPM-self.IDLE_RPM)
- if self.trainHeatingMode == 2 then
- self.targetRPM = math.max(self.targetRPM, math.min(self.MAX_RPM, self.HEATING_RPM_W))
- elseif self.trainHeatingMode == 1 then
- self.targetRPM = math.max(self.targetRPM, math.min(self.MAX_RPM, self.HEATING_RPM_S))
- end
- self.emitterColor = 1-self:Limit(0.07 + 0.00583*(self.targetRPM-self.engineRPM), 0, 1)*0.9
- else
- self.targetRPM = 0
- self.emitterColor = 0
- end
- if self.targetRPM ~= self.engineRPM then
- startupKoef = self.Limit(self.engineRPM/self.IDLE_RPM,0.2,1)
- if self.targetRPM > self.engineRPM then
- self.engineRPM = math.min(self.engineRPM + 60*dRealTime/self.RPM_AIM*startupKoef, self.targetRPM)
- elseif self.targetRPM < self.engineRPM then
- self.engineRPM = math.max(self.engineRPM - 120*dRealTime/self.RPM_AIM, self.targetRPM)
- end
- if math.abs(self.engineRPM - self.targetRPM) < 0.1 then
- self.engineRPM = self.targetRPM
- end
- end
- self.rpmToFullRatio = self.engineRPM/self.MAX_RPM
- if self.isOn then
- self.bigCircuitFanRPM = self.bigCircuitFanRPM + self:Limit(self.mainFanTargetRPM - self.bigCircuitFanRPM, -100, 50)*dRealTime
- self.smallCircuitFanRPM = self.smallCircuitFanRPM + self:Limit(self.auxiliaryFanTargetRPM - self.smallCircuitFanRPM, -100, 50)*dRealTime
- else
- self.bigCircuitFanRPM = self.bigCircuitFanRPM * math.max(0, 1-self.bigCircuitFanRPM*dRealTime)
- self.smallCircuitFanRPM = self.smallCircuitFanRPM * math.max(0, 1-self.smallCircuitFanRPM*dRealTime)
- end
- --ENGINE HEAT
- qs = 44700
- engineHeatCapacity = 11000
- waterHeatCapacity = 4.189
- oilHeatCapacity = 1.885
- minHeatLoss = 400
- maxHeatLoss = 4000
- heatLossFactor = minHeatLoss+(self.rpmToFullRatio*(maxHeatLoss-minHeatLoss))
- waterFlowFactor = self:toInt(self.isOn)*heatLossFactor+self:toInt(self.waterPump)*1000+self:toInt(not self.isOn)*200
- dieselPower = self.rpmToFullRatio * self.MAX_ENGINE_POWER
- generatedEnergy = (0.21*dieselPower+12)/3600
- usedEnergy = (dieselPower/950)+self.trainHeatingPower+70
- generatedHeat = self:toInt(self.isOn)*(qs*generatedEnergy-usedEnergy)
- Call("SetControlValue", "generovaneTeploMotoru", 0, generatedHeat)
- remainedHeat = generatedHeat - (self.ENGINE_TO_BIG_CIRCUIT_KOEF * (self.engineTemp - self.bigCircuitCoolerTemp)) - (self.ENGINE_TO_AMBIENT_KOEF * (self.engineTemp - self.ambientTemp))
- Call("SetControlValue", "zbyleTeploMotoru", 0, remainedHeat)
- dEngineTemperature = remainedHeat/engineHeatCapacity
- Call("SetControlValue", "dTeplotaMotoru", 0, dEngineTemperature)
- self.engineTemp = self.engineTemp + dEngineTemperature*dRealTime
- dOilTemperature = ((self.ENGINE_TO_OIL_KOEF * (self.engineTemp - self.oilTemp)) - (self.OIL_TO_SMALL_CIRCUIT_WATER_KOEF * (self.oilTemp - self.smallCircuitCoolerTemp)))/(heatLossFactor*oilHeatCapacity)
- self.oilTemp = self.oilTemp + dOilTemperature*dRealTime
- self.smallCircuitShuttersRequest = self.smallCircuitMeasuredTemp > self.SMALL_CIRCUIT_SHUTTERS_OPEN or (self.smallCircuitMeasuredTemp > self.SMALL_CIRCUIT_SHUTTERS_CLOSE and self.smallCircuitShuttersRequest)
- self.auxiliaryFanTargetRPM = self:toInt(self.smallCircuitShuttersRequest)*1200
- smallCircuitSpecificDissipatedHeat = self.SMALL_CIRCUIT_TO_AMBIENT_KOEF * (0.3+0.7*self:toInt(self.smallCircuitShutters)) * self.smallCircuitFanRPM + self.SMALL_CIRCUIT_TO_AMBIENT_MOVING_KOEF * (0.3+0.7*self:toInt(self.smallCircuitShutters)) * Call("GetSpeed") + 2
- Call("SetControlValue", "MVOmerneTeplo", 0, smallCircuitSpecificDissipatedHeat)
- dOilExchangedEnergy = (self.OIL_TO_SMALL_CIRCUIT_WATER_KOEF * (self.oilTemp - self.smallCircuitCoolerTemp))/(waterFlowFactor*waterHeatCapacity)
- Call("SetControlValue", "MVOodOleje", 0, dOilExchangedEnergy)
- smallCircuitDissipatedHeat = -smallCircuitSpecificDissipatedHeat * (self.smallCircuitCoolerTemp - self.ambientTemp)
- Call("SetControlValue", "MVOvyzareneTeplo", 0, smallCircuitDissipatedHeat)
- dSmallCircuitDissipatedEnergy = smallCircuitDissipatedHeat/(waterFlowFactor*waterHeatCapacity)
- Call("SetControlValue", "MVOvyzarenaEnergie", 0, dSmallCircuitDissipatedEnergy)
- smallCircuitWatterLostTemp = self.smallCircuitWaterTemp + dSmallCircuitDissipatedEnergy*dRealTime
- self.smallCircuitWaterTemp = smallCircuitWatterLostTemp + dOilExchangedEnergy*dRealTime
- self.smallCircuitCoolerTemp = 0.5 * (self.smallCircuitWaterTemp + smallCircuitWatterLostTemp)
- self.smallCircuitMeasuredTemp = self.smallCircuitWaterTemp
- self.bigCircuitShuttersRequest = self.bigCircuitMeasuredTemp > self.BIG_CIRCUIT_SHUTTERS_OPEN or (self.bigCircuitMeasuredTemp > self.BIG_CIRCUIT_SHUTTERS_CLOSE and self.bigCircuitShuttersRequest)
- self.mainFanTargetRPM = self:toInt(self.bigCircuitShuttersRequest)*1200
- bigCircuitSpecificDissipatedHeat = self.BIG_CIRCUIT_TO_AMBIENT_KOEF * (0.3+0.7*self:toInt(self.bigCircuitShutters)) * self.bigCircuitFanRPM + self.BIG_CIRCUIT_TO_AMBIENT_MOVING_KOEF * (0.3+0.7*self:toInt(self.bigCircuitShutters)) * Call("GetSpeed") + 5
- Call("SetControlValue", "VVOmerneTeplo", 0, bigCircuitSpecificDissipatedHeat)
- dEngineExchangedEnergy = (self.ENGINE_TO_BIG_CIRCUIT_KOEF * (self.engineTemp - self.bigCircuitCoolerTemp))/(waterFlowFactor*waterHeatCapacity)
- Call("SetControlValue", "VVOodMotoru", 0, dEngineExchangedEnergy)
- bigCircuitDissipatedHeat = -bigCircuitSpecificDissipatedHeat * (self.bigCircuitCoolerTemp - self.ambientTemp)
- Call("SetControlValue", "VVOvyzareneTeplo", 0, bigCircuitDissipatedHeat)
- dBigCircuitDissipatedEnergy = bigCircuitDissipatedHeat/(waterFlowFactor*waterHeatCapacity)
- Call("SetControlValue", "VVOvyzarenaEnergie", 0, dBigCircuitDissipatedEnergy)
- bigCircuitWatterLostTemp = self.bigCircuitWaterTemp + dBigCircuitDissipatedEnergy*dRealTime
- self.bigCircuitWaterTemp = bigCircuitWatterLostTemp + dEngineExchangedEnergy*dRealTime
- self.bigCircuitCoolerTemp = 0.5 * (self.bigCircuitWaterTemp + bigCircuitWatterLostTemp)
- self.bigCircuitMeasuredTemp = self.bigCircuitWaterTemp
- --SMOKE GENERATION
- if self.targetRPM > 0 then
- if self.engineRPM < self.IDLE_RPM then
- self.emitterVelocity = math.max(((100-math.min(self.engineRPM,100))/30)^2,3)
- else
- self.emitterVelocity = 3*self.engineRPM/self.targetRPM
- end
- else
- self.emitterVelocity = 0
- end
- if self.engineRPM^2/(50+0.2*self.engineRPM) > self.IDLE_RPM then
- self.emitterRate = self:Limit(DIESEL.engineRPM/DIESEL.targetRPM/10-0.02,0.02,0.1)
- else
- self.emitterRate = math.max(5/DIESEL.engineRPM,0.02)
- end
- end
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement