【ロボット導入事例】樹脂製品の磨き工程を自動化!直交ロボットと組み合わせ待機時間をゼロへ
- #垂直多関節ロボット
- #直交ロボット
PLCプログラムは下記の5種類の言語が国際規格で定められています。
5種類の言語の中でも、テキスト形式で記述可能なST言語は生成AIでのプログラミングが可能です。実際に生成AIによって生成されたプログラミングを活用したいと考える人も多いでしょう。しかし、生成AIで生成したプログラムが実際のPLCで問題なく利用できるのでしょうか。
もし、生成AIで実用レベルのST言語が記述できるのなら、文法を知らない現場の社員が簡単に装置の不具合修正や動作改善が可能です。
そこで本記事では生成AIで生成したPLCプログラムがそのまま実用レベルなのかを解説します。結論を先に述べると、生成AIで生成したプログラムはおおむね実用レベルです。ただし、注意点もあるため、その理由や注意すべき点などを実際に生成したSTプログラムを使って解説します。
もくじ
FA業界では、メカ機構よりも電気やソフトに頼る割合が増え、コントロールのプロセスがますます複雑になっています。プロセスが複雑になることで、複雑なデータ処理や計算も必要となり、従来のPLC言語として長く利用されているラダー・ダイヤグラムでの記述が難しくなってきました。
そこで開発された言語がSTです。ST言語はPASCAL-baseの高級言語であり、人間にとってわかりやすく、理解しやすいプログラム言語となります。
ここではST言語を利用するメリットとデメリットについて考えてみましょう。
ST言語のメリットは主に下記の3点です。
PLCで古くから利用されているラダー・ダイヤグラムは記号を使用するため、専用ソフトを使用しなければプログラミングができません。実際はニーモニックでも記述可能ですが、さらに複雑なプログラムになります。一方、ST言語はテキストのみで記述できるため、AI生成も容易です。
また、複雑な計算や繰り返し処理など、ラダー・ダイヤグラムで記述すると長くなってしまう場合でも、ST言語に置き換えると簡単に記述できます。
ST言語のもっとも大きなデメリットは、文法を理解しなければプログラムを記述できない点です。
プログラミングを学んだ人にとっては、それほど難しい文法ではありません。しかし、プログラミング未経験の人にとっては慣れない文法に苦慮する可能性があります。
しかし、現在は文法を知らなくてもAI生成でST言語のプログラムの生成が可能です。それでは、AI生成によって吐き出されたプログラムは、PLCにそのまま活用できるのかどうかを考えてみましょう。
生成AIでPLC用のプログラムをST言語で生成しました。生成したプログラムは、下記の5種類です。
順に見ていきましょう。
前述したとおり、PLCプログラムは装置の入出力処理に関しては簡単に記述が可能です。一方で数値データの取り扱いに関しては一つずつ段階を経て計算しなければならないため、プログラムの記述が複雑になります。
そこで、下記のような質問をChatGPT4に投げかけてみました。
ST (Structured Text) 言語で次のプログラムを作ってください。
ChatGPT4からの回答は以下のとおりです。
Structured Text (ST) 言語で指定されたプログラムを作成するには、以下のステップに従って各機能を実装します。Structured TextはPLCプログラミングで使用されるテキストベースの言語であり、IF…THEN…ELSE、FOR…TO…DOなどの制御構造をサポートしています。
```pascal
// D0とD2とD4の和をD6倍し、5で割った値をD20に代入する
D20 := (D0 + D2 + D4) * D6 / 5;
生成AIにより、想定していたとおりの解答を導き出せたため、そのままPLCに転載しても問題はありません。計算に関しては生成AIによるプログラミングは可能であることがわかりました。今回は取り上げませんでしたが、四則演算以外に三角関数や平方根の計算なども可能です。
四則演算と同様に、以下のようなPLCの入出力処理についても投げかけてみました。
ChatGPT4の回答は以下のとおりです。
// Y000に1を代入する。
Y000 := 1;
// Y001に0を代入する。
Y001 := 0;
// X010の値をY000に代入する。
Y000 := X010;
// X011の値をY001に代入する。
Y001 := X011;
単純な入出力の代入については、問題なく生成できました。ただし、自己保持に関しては多少問題があるようです。ChatGPT4に次のような質問を投げかけ、自己保持回路がどのように表現されるのかを確認してみました。
ChatGPT4の解答は下記のとおりです。
// X010に割り付けたスイッチ入力がONになったときにY000をONし、
// X011に割り付けたスイッチの入力がONになるまで自己保持する。
IF X010 THEN
Y000 := 1;
ELSIF X011 THEN
Y000 := 0; // 自己保持のためには、外部の制御ロジックが必要になる場合があります。
END_IF;
上記のプログラムでも自己保持は可能です。しかし、想定していたよりも複雑な記述となっています。ChatGPT4からの解答には、下記のような注意書きも書かれていました。
このコードは、与えられた指示に基づいていますが、自己保持ロジックやFORループでのインクリメント方法など、いくつかの操作は通常のPLCプログラミングの慣習とは異なる可能性があるため、実際のPLCハードウェアやソフトウェアの仕様に合わせて調整が必要です。
自己保持ロジックはPLCプログラミングの習慣とは異なる可能性があるとのこと。想定していたプログラムは下記のようなものでした。
ただし、PLCの機種やメーカーによって異なる場合があります。上記は三菱製のPLCに対応したST言語のプログラムのため、他メーカーのPLCを使用する場合は注意しなければなりません。
PLCプログラムにおいて、条件分岐をラダー・ダイヤグラムで記述した場合、わかりづらくなることがあります。一方、ST言語での記述はわかりやすい表現です。
ChatGPT4に、以下のような問いかけを行いました。
解答は下記のとおりです。
// もし、X000の値が1であればY000を1にし、それ以外のとき、Y000を0にする。
IF X000 = 1 THEN
Y000 := 1;
ELSE
Y000 := 0;
END_IF;
// D0×D1が200以下であれば、D2に0を代入し、それ以外の場合はD2に1を代入する。
IF D0 * D1 <= 200 THEN
D2 := 0;
ELSE
D2 := 1;
END_IF;
上記のプログラムはPLCの機種に関係なくそのまま利用可能です。ただし、入出力アドレスは機種によって異なるため、注意してください。
条件分岐以上に複雑なプログラムになる構文が、繰り返しです。繰り返しはいくつか方法がありますが、ここではFOR文を取り上げました。
ChatGPT4への指令は下記のとおりです。
下記のような解答が得られました。
// D100を0で初期化し、D100が30まで処理を繰り返す。
// さらにD100を1づつ増加させ、D200にD100+1を代入する。
D100 := 0;
FOR D100 TO 30 DO
D200 := D100 + 1;
D100 := D100 + 1; // 通常、FORループの中でループ変数を変更することは推奨されません。
END_FOR;
「FOR文」と指定したわけではありませんでしたが、FOR文の解答だったため、おおむね良好です。ただし、三菱のPLCを想定した場合のプログラムは下記のようになります。
FOR D100:=0
TO 30
BY 1 D
D200 := D100 + 1;
END_FOR;
FOR文はPLCメーカーによって記述方法が若干異なるため、注意が必要です。キーエンスのPLCで上記の内容を記述する場合には「BY 1 D」は不要となります。
品種データや検査データなどを扱っていると、異なる種類のデータをまとめて扱いたい場合が出てきます。そんなときに便利なデータの型が構造体です。
たとえば、学校の1学年が100人だったとして、身長や体重のデータをひもづけて扱う場合を考えてみましょう。個人のデータとしては下記のようになります。
1学年分のデータを扱うため、上記を組み合わせたデータを100個の配列として考えなければなりません。そこで、ChatGPT4に以下のような問いかけを行いました。
ChatGPT4の回答は以下のとおりです。
Structured Text(ST)はPLC(Programmable Logic Controller)プログラミングで使用される高レベルのプログラミング言語の一つで、IEC 61131-3標準に基づいています。あなたが要求しているプログラムは、名前、身長、体重のデータを保持する構造体を定義し、それを100人分格納する配列を作成し、最後に身長と体重の平均値を計算するものです。
以下は、そのような要件を満たすST言語のプログラムの例です。
```pascal
TYPE
Person: STRUCT
Name: STRING[20];
Height: REAL; // 単位: cm
Weight: REAL; // 単位: kg
END_STRUCT;
END_TYPE
VAR
People: ARRAY[1..100] OF Person;
TotalHeight: REAL := 0;
TotalWeight: REAL := 0;
AverageHeight: REAL;
AverageWeight: REAL;
i: INT;
END_VAR
(* ここで、People配列を実際のデータで初期化します。実例として、2人分のデータを示しますが、実際には100人分のデータを入力する必要があります。
People[1].Name := 'Alice';
People[1].Height := 165;
People[1].Weight := 55;
People[2].Name := 'Bob';
People[2].Height := 175;
People[2].Weight := 75;
*)
(* 身長と体重の合計を計算 *)
FOR i := 1 TO 100 DO
TotalHeight := TotalHeight + People[i].Height;
TotalWeight := TotalWeight + People[i].Weight;
END_FOR
(* 平均を計算 *)
AverageHeight := TotalHeight / 100;
AverageWeight := TotalWeight / 100;
(* 結果を出力 *)
(* この部分はPLCや開発環境によって異なるため、具体的な出力方法は省略します。通常はデバッグウィンドウ、LCDパネル、または外部システムへの通信を介して行われます。 *)
```
この例では、`Person`という名前の構造体を定義し、それを要素とする`People`という名前の配列を100要素分定義しています。その後、forループを使用して全ての人の身長と体重の合計を計算し、最後にそれぞれの平均値を計算しています。
このプログラムは基本的な枠組みを提供していますが、実際のデータ入力や結果の出力方法は、使用しているPLCや開発環境によって異なるため、適宜調整が必要になります。また、このコードは擬似的なものであり、実際にはPLCプログラムで使用する前に、開発環境に応じた適切な修正が必要になることがあります。
平均身長をAverageHeigh、平均体重をAverageWeightとして計算するプログラムができました。 特殊な命令は含まれていないため、ほとんどそのままPLCのエディタに転載すれば使用できます。
ただし、FOR文に関しては前述したとおり、PLCメーカーによって異なるため、三菱製のPLCでは正常に計算ができません。
また、実際の個人データは別途入力するプログラムが必要です。AIは実際に入力することも考慮して警告してくれるため、秀逸と言えるでしょう。
本記事ではAI生成されたPLCのプログラムが実用レベルかどうかを検証しました。結論は、ほぼ実用レベルと言えるでしょう。
ST言語は国際規格によって標準化されていますが、PLCメーカーや機種によって異なる部分があります。とくに、自己保持や繰り返しの構文には各メーカーで違いがあるため、AIによって生成されたプログラムを修正しなければなりません。
ただし、ChatGPT4に投げかける質問を工夫することで、クリアできる可能性もあります。また、AIは日々進化しているため、今後はより確実なプログラムの生成が可能になるでしょう。
また、AIによって生成されたプログラムが正しいかどうかの判断をするには、ST言語の文法を知らなければなりません。したがって、まったく知識が無い人が生成AIによるST言語のプログラミングを行うことは難しいでしょう。
PLCやST言語についての知識があり、時間短縮のために利用するのであれば、生成AIは十分に利用価値があります。その辺りのことを踏まえて、AIも上手に活用してみてください。
製造DX.comでは、製造現場の生産性向上に役立つ先進的な情報を発信するメールマガジン「製造DX.com-Plus」を配信しています。メールマガジン読者限定の情報を配信しておりますので、ぜひご登録ください!
製造DX.comを運営する株式会社ファースト・オートメーションは製造業に特化した生成AI「SPESILL(スペシル)」を提供しています。製造DX.comでは生成AIに関する研究開発の成果を投稿しています。
厳選した記事を定期配信
キャンペーン情報などをいち早く確認