2023年04月11日(火)
ChatGPTが作ったPI制御ソフトを動かしてみました
株式会社プリンシパルテクノロジー
大羽規夫
最近「ChatGPT」という人工知能チャットボットが話題となっていますが、そのChatGPTはソフトウェアの作成も得意のようです。そこで、このChatGPTが作成した制御ソフトが、パワーエレクトロニクスの制御にも応用できるかを検証しました。具体的には、系統連系インバータの電流制御を対象として、すでにPSIMのCブロックを使って制御ソフト(C言語)の動作を検証し、その結果を下のYouTubeに投稿していますので、ぜひこちらもご覧ください。
今回のパワエレコラムでは、無料で使える Typhoon HIL の Virtual HIL というツールを使ってChatGPTが作成した制御ソフトを動かしてみました。その結果をご紹介します。
ChatGPTのプロンプトと応答
以下は、ChatGPTへのプロンプトとそれに対する応答の画面キャプチャです。今回使用する Virtual HIL の C function では構造体が使えないので、構造体を使わずにコードを作成するように指示しました。(Advanced C function という構造体を使えるブロックもあります)
ChatGPTの画面キャプチャ
このようにソースコードだけでなく、ソースコードの解説と実際に使用する場合のアドバイスまで提供してもらえました。
検証ツール:Virtual HIL
今回の制御ソフトの動作検証に使うのはVirtual HILというツールです。本来は、パワエレ用のリアルタイムシミュレータである Typhoon HIL をパソコン上で動かすためのエミュレータとして使うものですが、これを回路シミュレータの様に使用することもできます。ご興味ある方はこちらで詳細をご確認ください。
対象システム:三相系統連系インバータ
ここでは、ChatGPTが作成したPI制御のソフトを組み込む対象であるVirtual HILで動作する系統連系インバータについて説明します。
※回路図は「Typhoon HIL Schematic Editor」で作成したものです。
下の図は対象となる三相系統連系インバータの主回路です。三相フルブリッジインバータ(Three Phase Inverte1)と系統電源(Vs)との間に接続された三相リアクトル(Lu,Lv,Lw)に流れる電流(Ia,Ib,Ic)を制御するシステムです。
検証に使用する三相系統連系インバータの主回路(Typhoon HIL Schematic Editor)
制御回路は下の図のようになっており、三相交流をdq軸座標に変換して、d軸電流指令(Id_ref)q軸電流指令(Iq_ref)とリアクトル電流(Id,Iq)が一致するように動作するように構成されています。
図中の青枠で示した電流制御部がChatGPTが作成したC言語の制御ソフトと置き換える部分です。
制御回路
C言語に置き換える前に、このシステムの動作波形を確認しておきます。
下図の上段には、d軸の電流指令と実際の電流制御結果が示されており、中段にはq軸の電流指令と実際の電流制御結果が示されています。d軸、q軸ともに指令値をステップ変化させ、制御結果はそのステップ変化に良好に追従していることがわかります。
なお、下段には参考としてU相電流と系統電源のU相電圧を示しています。
動作波形
ChatGPTの生成コード
ChatGPTが生成したコードを以下に示します。
#include <stdio.h>
// PI制御器のパラメータ
float kp = 0.5; // 比例ゲイン
float ki = 0.2; // 積分ゲイン
// PI制御器の変数
float integral = 0.0; // 積分項
float error_prev = 0.0; // 前回の誤差
int main() {
// 目標値
float setpoint = 50.0;
// 制御対象の初期値
float process_variable = 0.0;
// 制御周期
float dt = 0.1;
// 制御対象の変化量
float process_variable_delta = 0.0;
// 制御を100回繰り返す
for (int i = 0; i < 100; i++) {
// 誤差を計算する
float error = setpoint - process_variable;
// 積分項を計算する
integral += error * dt;
// 比例項と積分項を足して、制御量を求める
float control_variable = kp * error + ki * integral;
// 制御量を使って、制御対象を更新する
process_variable_delta = control_variable * dt;
process_variable += process_variable_delta;
// 結果を出力する
printf("制御対象: %f, 制御量: %f\n", process_variable, control_variable);
// 前回の誤差を更新する
error_prev = error;
}
return 0;
}
このコードほとんどは変数の宣言と初期化になっています。そして、実質的にPI制御の演算をしているのは、main関数内の forループで回っている最初の3行だけです。
// 誤差を計算する
float error = setpoint - process_variable;
// 積分項を計算する
integral += error * dt;
// 比例項と積分項を足して、制御量を求める
float control_variable = kp * error + ki * integral;
これ以降は、制御対象が積分特性の場合の制御結果算出、結果の表示、微分演算に必要となる誤差の保存、戻り値の設定であり、今回は必要のないコードとなります。
次に電流制御のPI制御演算が実現するように、このコードを Virtual HILの C function へ実装していきます。
C functionへの実装
Typhoon HILには、C言語を使用するためのブロックとして「C function」と「Advanced C function」の2つがあります。今回は、簡単に使える C function を使用し、C言語の演算を実行します。
制御回路は、下図のように、電流指令および実際の電流を入力とし、電圧指令が出力となるC functionをd軸用とq軸用の2つを用いる構成とします。
C functionに変更した制御回路
次に C function の設定ですが、まずGeneralタブで変数を定義します。
変数名はChatGPTが生成した変数名をそのまま使用します。
(ChatGPTは積分項の変数名を「integral」として生成しましたが、Typhoon HILでは「int」で始まる変数名は使用できないため「_integral」に変更しました)
Inputsタブに C functionの入力変数を設定します。
目標値:setpoint
制御対象の初期値:process_variable
Outputsタブに C functionの出力変数を設定します。
制御量:control_variable
Variablesタブに演算に必要となるその他の変数を設定します。
誤差:error
積分項:_integral
比例ゲイン:kp
積分ゲイン:ki
制御周期:dt
実際に演算を実行するためのC言語コードはFunctionsタブに実装します。
処理周期(シミュレーション・ステップ)で呼び出される output_fnc にChatGPTが生成したPI制御演算を記述します。init_funcはシミュレーション開始時に呼び出され、ここに変数の初期化コードを記述します。
C functionによる制御結果
ChatGPTが生成した制御ソフトによる制御結果は下の図のようになり、良好に制御できていることがわかります。
しかし、C function に変更する前の波形と比較すると、指令値と制御結果のズレが大きくなっています。
これは、ChatGPTが生成した制御ソフトではdq軸間の干渉項および系統電圧のフィードフォワードが無くなったためです。これでも要求性能を満たしていればフィードフォワードは無くても問題ありませんが、制御ゲインを調整しても要求性能を満足できない場合にはフィードフォワードが性能改善に有効です。
C functionに変更した場合の動作波形
このように、Virtual HILの C function で、C言語で作成した制御ソフトウェアの動作確認ができます。
回路シミュレータとは少し使い勝手が異なりますが、無料でC言語が使えるのでお勧めです。
まとめ
ChatGPTと対話をすることで、以上のようなまとめ文章を作成できました!
すごいですよね。文章の作成が苦手な私にとって、救世主が現れたような気分です。
プログラムや文章の作成以外にも、制御設計など技術者としての仕事でAIを有効活用するために、ますますパワーエレクトロニクス技術を高め、AIには真似できないクリエイティブな仕事ができる技術者を目指しましょう!