pid自動模糊控制的例子
瀏覽:2487
比如說有一個泵,我想控制他的轉速,在一個界面上輸入一個大小比如1000轉每分鐘,然后對應的后臺就自動控制泵到達了這個轉速。一直很好奇這是怎么實現的,當然我想了一個方法具體的步驟如下
1、用request把我要輸入的值傳遞到后臺,這里用Python實現一下
import requests
import json
url = 'http://192.168.150.1:8081/put'
pre = 136.
requests.get(url, data=json.dumps({'data': pre}))
2.后臺我用一個隊列來實現兩個進程之間的數據貢獻,代碼如下
from multiprocessing import Queue
from fastapi import FastAPI, Query, Request
import uvicorn
from pydantic import BaseModel
app = FastAPI()
queue = Queue(3)
class data(BaseModel):
data: float
@app.get("/put")
def index(data: data):
queue.put(data.data) # 把需要控制的放進去
return {"state": "輸入控制變量"}
@app.get("/get")
def index():
if queue.qsize():
data = queue.get()
print(data)
else:
data = 0
return {"Hello": f'{str(data)}'}
if __name__ == '__main__':
uvicorn.run(app="waite:app", log_level="info", host="0.0.0.0", port=8081, workers=1)
上面的代碼不僅寫了我把數據傳入隊列的路由,還把我獲取數據的路由也寫在了下面
3.然后就是pid了,這里我一泵為例,后臺不停的獲取數據,如果數據不為0,那么我就更新pid控制的參數,讓pid自動去計算輸出量
import requests import json import time as t url = 'http://192.168.150.1:8081/get' from pid import * dt = 0.01 time = 0 tinm_l = [] output_l = [] baoshijie = car() # 生產一輛車 pid_controller = PIDController(0.45, 0.02, 0.001) # 一個pid控制器 speed_limit = 150 # 設定車速限制 # --------------------測試-------------------------------------------------------- # while time < 1: # try: # data = requests.get(url) # _ = float(json.loads(data.text)['Hello']) # t.sleep(0.01) # if _ != 0: # speed_limit = _ # except Exception as e: # print(e) # tinm_l.append(time) # output_l.append(baoshijie.speed) # error = speed_limit - baoshijie.speed # manu = pid_controller.calculate_output(error, dt) # baoshijie.run(manu) # # print(baoshijie.speed) # time += dt # plt.plot(tinm_l, output_l) # plt.show() # --------------------運行------------------------------------------------ while True: try: data = requests.get(url) _ = float(json.loads(data.text)['Hello']) t.sleep(0.01) if _ != 0: speed_limit = _ except Exception as e: print(e) output_l.append(baoshijie.speed) error = speed_limit - baoshijie.speed manu = pid_controller.calculate_output(error, dt) baoshijie.run(manu) print(baoshijie.speed)
這樣就實現了上面的過程,但我不知道真實的生產環境是怎么樣去做的,具體的運行效果如圖


技術鄰APP
工程師必備
工程師必備
- 項目客服
- 培訓客服
- 平臺客服
TOP
1




















