Advertisement
Putnam

Extreme Reactors temp PID for opencomputers

Feb 2nd, 2017
1,321
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 1.86 KB | None | 0 0
  1. -- keeps reactor working efficiently at all times; increases power load when necessary, goes idle at 90% power until below 10%
  2.  
  3. local reactor=require('component').br_reactor
  4.  
  5. local curPower,controlRodLevel,powerMode,tickCount=0,50,0,0
  6.  
  7. local upTicks=0
  8.  
  9. local integral=0
  10.  
  11. local controlRodNumber=reactor.getNumberOfControlRods()
  12.  
  13. powerMode = reactor.getEnergyStored()<9000000
  14.  
  15. local function reactorActivities()
  16.   tickCount=tickCount+1
  17.   curPower = reactor.getEnergyStored()
  18.   if curPower>9000000 then
  19.     powerMode=false
  20.   elseif curPower<1000000 and curPower>0 then
  21.     powerMode=true
  22.   end
  23.   if powerMode then
  24.     upTicks=upTicks+1
  25.     reactor.setActive(true)
  26.     local temperature = reactor.getFuelTemperature and reactor.getFuelTemperature() or reactor.getTemperature()
  27.     oldError=curError or 0
  28.     curError = temperature - 950 or 0
  29.     integral=integral+curError or 0
  30.     derivative = tickCount>1 and curError - oldError or 0
  31.     local deltaControlRodLevel=(Kp*curError)+(Ki*integral)+(Kd*derivative)
  32.     local numberOfControlRodsToAddOneTo=math.floor((deltaControlRodLevel%1)*controlRodNumber)
  33.     deltaControlRodLevel=deltaControlRodLevel<0 and math.ceil(deltaControlRodLevel) or deltaControlRodLevel>0 and math.floor(deltaControlRodLevel) or 0
  34.     controlRodLevel = controlRodLevel+deltaControlRodLevel
  35.     if controlRodLevel>100 or controlRodLevel<0 then
  36.      integral=0
  37.     end
  38.     controlRodLevel = controlRodLevel>100 and 100 or controlRodLevel<0 and 0 or controlRodLevel
  39.     for i=0,controlRodNumber-1 do
  40.         reactor.setControlRodLevel(i,controlRodLevel+(i<numberOfControlRodsToAddOneTo and 1 or 0))
  41.     end
  42.   else
  43.     reactor.setActive(false)
  44.   end
  45. end
  46.  
  47. local args = {...}
  48.  
  49. interval = 0.5
  50. Kp=0.5
  51. Ki=0.005*interval
  52. Kd=0.01*interval
  53.  
  54. while reactor.getConnected() do
  55.    pcall(reactorActivities)
  56.    os.sleep(interval)
  57. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement