payfsl
級別: 工控俠客
|
圖片:
鋼管折彎設備: 客戶對弧度要求比較高,人工手動調整不能滿足要求,想用傳感器實時檢測弧度,通過PID運算驅動伺服電機帶動活動輪進行自動調整。不知道這樣的方案可不可行,各位大神有沒有更好的方案? 另外具體寫程序也還是迷迷糊糊,以前寫過溫度的PID,還沒有寫過運動控制的PID,也希望大神能賜教。 因為鋼管有反彈,并且反彈的量不固定,所以才引入檢測和PID運算進行動態補償 [ 此帖被payfsl在2022-04-25 20:11重新編輯 ] |
|
---|---|---|
|
payfsl
級別: 工控俠客
|
就是因為有反彈,并且反彈的量不固定,所以才引入檢測和PID運算 |
|
---|---|---|
|
payfsl
級別: 工控俠客
|
就是因為同一批來料一致性不好,沒有辦法建立數據庫,所以想要動態補償,國內的材料供應商沒法解決,韓國進口的一致性比較好,但是價格太高, |
|
---|---|---|
|
payfsl
級別: 工控俠客
|
現在的企業不容易,已經用不起高價的材料了,所以要靠技術來降本,正好也能體現工控人的價值,不然誰找你?不過我只想在這里討論純技術的事情,不想討論別的 |
|
---|---|---|
|
payfsl
級別: 工控俠客
|
傳感器還是有辦法的,現在設想用3點位移傳感器檢測,計算弧度,不過還沒有實際實驗過 |
|
---|---|---|
|
payfsl
級別: 工控俠客
|
你說得對的,或者叫彎管設備可能更加合理;現在就是一次加工以后用檢具檢測,不合格的進行2次加工,費時費力,生產效力低,公司要提升,所以把它作為公司提升技改的一個項目 |
|
---|---|---|
|
payfsl
級別: 工控俠客
|
實際設備有11個輪子,圖只是說明原理 |
|
---|---|---|
|
payfsl
級別: 工控俠客
|
首先感謝你的回復!電控確實有難度,但是機械已經黔驢技窮了,少說也已經努力了5年,做過很多方法,比如沖壓折彎,滾彎,拉彎,熱彎,冷彎,等等已經說不盡了,現在是想在電控上面做一下配合 |
|
---|---|---|
|
payfsl
級別: 工控俠客
|
(1)位置式PID OUT= Kp *Ek+(((Kp*T)/Ti)+((Kp*Td)/T)*(Ek-Ek-1))+OUT0 (2)增量式PID △OUT=OUTk-OUTk-1= Kp (Ek-Ek-1)+((Kp*T)/Ti) Ek+((Kp*Td)/T)*(Ek-2*Ek1+Ek-2) Ek: 本次的偏差 Ek-1: 上次的偏差 Ek-2: 上上次的偏差 Kp:算法增益調節 Ti: 積分時間 Td: 微分時間常數 |
|
---|---|---|
|
payfsl
級別: 工控俠客
|
PID程序: pid.cpp #ifndef _PID_SOURCE_ #define _PID_SOURCE_ #include <iostream> #include <cmath> #include "pid.h" using namespace std; class PIDImpl { public: PIDImpl( double dt, double max, double min, double Kp, double Kd, double Ki ); ~PIDImpl(); double calculate( double setpoint, double pv ); private: double _dt; double _max; double _min; double _Kp; double _Kd; double _Ki; double _pre_error; double _integral; }; PID::PID( double dt, double max, double min, double Kp, double Kd, double Ki ) { pimpl = new PIDImpl(dt,max,min,Kp,Kd,Ki); } double PID::calculate( double setpoint, double pv ) { return pimpl->calculate(setpoint,pv); } PID::~PID() { delete pimpl; } /** * Implementation */ PIDImpl::PIDImpl( double dt, double max, double min, double Kp, double Kd, double Ki ) : _dt(dt), _max(max), _min(min), _Kp(Kp), _Kd(Kd), _Ki(Ki), _pre_error(0), _integral(0) { } double PIDImpl::calculate( double setpoint, double pv ) { // Calculate error double error = setpoint - pv; // Proportional term double Pout = _Kp * error; // Integral term _integral += error * _dt; double Iout = _Ki * _integral; // Derivative term double derivative = (error - _pre_error) / _dt; double Dout = _Kd * derivative; // Calculate total output double output = Pout + Iout + Dout; // Restrict to max/min if( output > _max ) output = _max; else if( output < _min ) output = _min; // Save error to previous error _pre_error = error; return output; } PIDImpl::~PIDImpl() { } #endif [ 此帖被payfsl在2022-05-12 07:49重新編輯 ] |
|
---|---|---|
本帖最近評分記錄:
|