この記事中のプログラムコードには誤りがあります。 詳細は下記記事を御覧ください。
前回からの続きです。今回は前回のオートチューニングで得られたパラメーターを当てはめてPIDしてみます。 前回は↓
得られたパラメーターを以下に再掲致します。
Kp=0.02382 Ti=202.0 Td=50.5
これを用いて以下のようにプログラムを作成します。
using Plots tm = 1000 #シミュレーション時間 ie = 0 #誤差積分値初期値 function PID(err,prerr) kp = 0.02382 #比例ゲイン Ti=202.0 #積分時間 Td=50.5 #微分時間 ki = kp/Ti #積分ゲイン kd = kp*Td #微分ゲイン global ie = err + ie ⊿err = err - prerr kp * err + ki * ie + kd * ⊿err end #目標値の変更 function setpoint(simtime) if simtime < 100 return 10 elseif simtime < 300 return 50 else return 80 end end function Plant(simtime,input) td = 100 #Delay T0 = 0 #温度初期値(℃) temp_max = 100 #温度最大値 temp_min = 0 #温度最小値 u = max(input,temp_min) u = min(u,temp_max) print(u) if simtime < td return 0 else return (T0 - u) * exp(-0.005*(simtime-td)) + u end end # 空の配列の作成 u = zeros(tm + 1) y = zeros(tm + 1) r = zeros(tm + 1) er = zeros(tm + 1) for t in 1:tm prer = r[t] - y[t] y[t+1] = Plant(t,u[t]) r[t+1] = setpoint(t) er[t+1] = r[t+1] - y[t+1] u[t+1] = PID(er[t+1],prer) end p = plot([0:tm],[y,r],title="kp=0.24 Ti=202 Td=50.5",label=["y","setpoint"]) display(p)
これを実行すると以下のようなグラフが得られます。
完全に発散してしまっています。 次に、パラメーターを大幅に変更してみます。
多少はましになりました。 オートチューニングのSTEP応答は精度があまり良くないのでしょうか? もしくはプログラムが良くない可能性もありますので ベンチマークとリファクタリングを繰り返しながら様子を見たいと思います。
今回は以上になります。