バックナンバーはこちら。
https://www.simulationroom999.com/blog/compare-matlabpythonscilabjulia-backnumber/
はじめに
前回は、ScilabによるDCモータ状態空間モデルをPID制御のシミュレーションを実施。
MATLABと同様の結果は取得でき、問題無く動作確認はできた。
構造体の定義もMATLABと一緒ではあるが、Scilabの構造体の実装方法は連想配列になっているらしい。
今回は、これのJulia版を作成する。
そして一旦この回でシリーズの区切りを入れる。
登場人物
博識フクロウのフクさん
![指差しフクロウ](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
![技術者太郎](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
【再掲】PID制御器のブロック線図と全体構成
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
今回はJulia版。
おなじみのPID制御器のブロック線図と全体構成を確認しておこう。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
(手馴れて来たな。)
![PID制御器(変形式)ブロック線図、目標値、実値、1/zは前回値保持の意、Ki、Kp、Kd、T1、ΔT、e(t)、u(t)](https://www.simulationroom999.com/blog/wp-content/uploads/2022/10/02_PID制御器変形式ブロック線図-1024x370.png)
![PID制御器を加味した構成図、指令器0~1の範囲で出力、指令器、制御器、PID制御器、DCモータ、状態空間モデル、target(t)、actual(t)、E(t)、u(t)、ω(t)](https://www.simulationroom999.com/blog/wp-content/uploads/2022/10/03_PID制御器を加味した構成図-1024x468.png)
Juliaコード
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
Juliaコードは以下となる。
using PyPlot
function statespacemodel(A,B,C,D,u,dt,x)
# 状態方程式
x = x + (A*x + B*u) * dt;
# 出力方程式
y = C*x + D*u;
return x,y;
end
mutable struct PID_state
pzi::Float64
izi::Float64
dzi::Float64
end
function PIDController(state, target, actual, Kp, Ki, Kd, dt, t1)
e_i = target - actual;
e_p = (t1/dt)*(e_i - state.pzi);
e_d = (t1/dt)*(e_p - state.dzi);
u = (dt/t1)*(e_p*Kp + e_i*Ki + e_d*Kd) + state.izi;
state.pzi = e_i;
state.dzi = e_p;
state.izi = u;
return state, u;
end
function statespacemodel_pid()
K=0.016;
J=0.000000919;
R=1.34;
L=0.00012;
A=[0 1 0 ; 0 0 K/J ; 0 -K/L -R/L];
B=[0 ; 0; 1/L];
C=[1.0 0 0; 0 1.0 0; 0 0 1.0];
D=[0.0 ; 0.0 ; 0.0];
dt = 0.0001;
t = range(0, 1.0-dt, step=dt); # 時間(横)軸
u = zeros(1,10000); # 入力信号生成
u[1,5000:10000].=1.0; # 0.5秒後に0から1へ
y = zeros(3,length(t));
x = zeros(3,1);
state = PID_state(0.0, 0.0, 0.0);
ratio = 1/60;
Kp = 0.80;
Ki = 0.45;
Kd = 0.0;
t1 = 0.005;
omega = 0;
uPID = zeros(1,length(t));
for i = 1:length(t)
state,uPID[1,i] = PIDController( state, u[:,i][1], omega*ratio, Kp, Ki, Kd, dt, t1 );
x,y[:,i] = statespacemodel(A,B,C,D,reshape(uPID[:,i],1,1),dt,x);
omega = y[2,i];
end
subplot(3,1,1);
plot(t,uPID',color="r");plot(t,u',color="b", linestyle="--");
xlim([0,1]);ylim([-0.1,1.1]);
subplot(3,1,2);
plot(t,y[1:2,:]');
xlim([0,1]);ylim([-5,65]);
subplot(3,1,3);
plot(t,y[3,:]);
xlim([0,1]);ylim([-0.1,1]);
return;
end
statespacemodel_pid();
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
おおよそMATLABと一緒だけど、
構造体がmutableってので定義するんだね。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
Juliaも構造体定義としてstructというキーワードはあるが、
structだと内部のメンバ変数の更新ができない。
対して、mutableはメンバ変数が更新可能な構造体になる。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者03アップ.png)
ほう。
そんな仕様があるのか。
シミュレーション結果
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
そしてシミュレーション結果
![DCモータ状態空間モデルをPID制御(Julia)、target(t)、u(t)、ω(t)、θ(t)、I(t)](https://www.simulationroom999.com/blog/wp-content/uploads/2022/10/02_DCモータ状態空間モデルをPID制御Julia-1024x555.png)
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者a」05アップ.png)
これもOKだね。
今回が最終回?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
一通り確認できたところで、ここいらで一区切りとしよう。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
一区切り?
終了じゃなくて?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
ベクトル、行列を扱うネタはまだまだ大量にあるからな。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」20アップ.png)
じゃー、別に区切りとか無いじゃん・・・。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/考え中フクロウ.png)
あまり1シリーズで記事数が増えるとバックナンバーのページが重くなるんだよね。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」10アップ.png)
あー、1シリーズで300記事オーバーとかもあったもんね。
あのページは確かに重すぎる・・・。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
というわけで、ある程度区切りの良いところでシリーズを分けようと思って。
つまり、次回からは第2章が始まるって感じ。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
ちなみに何章まで行くつもり?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/考え中フクロウ.png)
うーん、結構行き当たりばったりで進めてるから正確なことは言えないが、
4章は固いかな。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」20アップ.png)
(まじかよ。どんだけネタ持ってんだよ)
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/びっくりフクロウ.png)
というわけで本シリーズは一旦終了!
次回は第2章!
まとめ
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
まとめだよ。
- JuliaでDCモータ状態空間モデルをPID制御シミュレーション。
- Juliaも構造体を定義できるが、structだと更新不可になる。よってmutableを使って更新可能な構造体にする必要がある。
- シミュレーション結果は他のツール言語と同じ結果が得られた。
バックナンバーはこちら。
コメント