pid自动模糊控制的例子
2023年6月10日 22:18浏览:2121
比如说有一个泵,我想控制他的转速,在一个界面上输入一个大小比如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




















