Advertisement
Hammi

BiggerReactor PID Controller

Aug 8th, 2021
1,719
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 1.70 KB | None | 0 0
  1. sleep(1)
  2.  
  3. -- Regler
  4. soll = 0.75
  5. ist = 1
  6. Kp = 1.5
  7. Ki = 0
  8. Kd = 0.5
  9. Ta = 0.1
  10. esum = 0
  11. ealt = 0
  12.  
  13. local reactor = peripheral.wrap("back")
  14.  
  15. function PID()
  16.     e = soll - ist
  17.     esum = ((esum + e) > 1 and 1 or (esum + e))
  18.     y = Kp * e + Ki * Ta * esum + Kd * (e-ealt)/Ta
  19.     ealt = e
  20.     if y < 0 then
  21.         y = 0
  22.       elseif y > 1 then
  23.         x = 1
  24.       else
  25.         y = y
  26.       end
  27.     return y
  28. end
  29.  
  30. function calcRodLevel()
  31.     return (reactor.battery().stored()/reactor.battery().capacity())
  32. end
  33.  
  34. function setControlRodLevels(level)
  35.     rodLevel = level
  36.     reactor.setAllControlRodLevels(math.floor(rodLevel))
  37.     for i = 0, math.floor(reactor.controlRodCount()*(rodLevel%1))-1, 1 do
  38.         reactor.getControlRod(i).setLevel(math.floor(rodLevel)+1)
  39.     end
  40. end
  41.  
  42. function printRodLevels(level)
  43.     print("Level to set:")
  44.     print(string.format("%.3f", level))
  45.     print("Level to be set:")
  46.     print(math.floor(level*reactor.controlRodCount())/reactor.controlRodCount())
  47.     local x,y = term.getCursorPos()
  48.     print("Rod:")
  49.     term.setCursorPos(7,y)
  50.     print("Level:")
  51.     local rodAverage = 0
  52.     for i = 0, reactor.controlRodCount()-1 , 1 do
  53.         print(i)
  54.         term.setCursorPos(7,y+1+i)
  55.         rodAverage = rodAverage + reactor.getControlRod(i).level()
  56.         print(reactor.getControlRod(i).level())
  57.     end
  58.     rodAverage = rodAverage / reactor.controlRodCount()
  59.     print("Value set:")
  60.     print(rodAverage)
  61. end
  62.  
  63. function printStats()
  64.     print(string.format("%.2f".." KiRF/Ingot", (reactor.battery().producedLastTick()/reactor.fuelTank().burnedLastTick())))
  65. end
  66.  
  67. while true do
  68.     term.clear()
  69.     term.setCursorPos(1,1)
  70.     ist = calcRodLevel()
  71.     level = (1-PID())*100
  72.     setControlRodLevels(level)
  73.     -- setControlRodLevels(75.5)
  74.     printRodLevels(level)
  75.     printStats()   
  76.     sleep(Ta)
  77. end
  78.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement