pid自動模糊控制的例子

比如說有一個泵,我想控制他的轉速,在一個界面上輸入一個大小比如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)

這樣就實現了上面的過程,但我不知道真實的生產環境是怎么樣去做的,具體的運行效果如圖

pid自動模糊控制的例子的圖1

pid自動模糊控制的例子的圖2

登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP

1