PLCプログラムは下記の5種類の言語が国際規格で定められています。
- IL(インストラクション・リスト)
- LD(ラダー・ダイアグラム)
- FBD(ファンクション・ブロック・ダイアグラム)
- ST(ストラクチャ―ド・テキスト)
- SFC(シーケンシャル・ファンクション・チャート)
5種類の言語の中でも、テキスト形式で記述可能なST言語は生成AIでのプログラミングが可能です。実際に生成AIによって生成されたプログラミングを活用したいと考える人も多いでしょう。しかし、生成AIで生成したプログラムが実際のPLCで問題なく利用できるのでしょうか。
もし、生成AIで実用レベルのST言語が記述できるのなら、文法を知らない現場の社員が簡単に装置の不具合修正や動作改善が可能です。
そこで本記事では生成AIで生成したPLCプログラムがそのまま実用レベルなのかを解説します。結論を先に述べると、生成AIで生成したプログラムはおおむね実用レベルです。ただし、注意点もあるため、その理由や注意すべき点などを実際に生成したSTプログラムを使って解説します。
もくじ
ST言語の特徴
FA業界では、メカ機構よりも電気やソフトに頼る割合が増え、コントロールのプロセスがますます複雑になっています。プロセスが複雑になることで、複雑なデータ処理や計算も必要となり、従来のPLC言語として長く利用されているラダー・ダイヤグラムでの記述が難しくなってきました。
そこで開発された言語がSTです。ST言語はPASCAL-baseの高級言語であり、人間にとってわかりやすく、理解しやすいプログラム言語となります。
ここではST言語を利用するメリットとデメリットについて考えてみましょう。
ST言語のメリット
ST言語のメリットは主に下記の3点です。
- テキストのみで記述が可能
- 複雑な計算の記述が容易
- 繰り返し処理、条件分岐の記述が容易
PLCで古くから利用されているラダー・ダイヤグラムは記号を使用するため、専用ソフトを使用しなければプログラミングができません。実際はニーモニックでも記述可能ですが、さらに複雑なプログラムになります。一方、ST言語はテキストのみで記述できるため、AI生成も容易です。
また、複雑な計算や繰り返し処理など、ラダー・ダイヤグラムで記述すると長くなってしまう場合でも、ST言語に置き換えると簡単に記述できます。
ST言語のデメリット
ST言語のもっとも大きなデメリットは、文法を理解しなければプログラムを記述できない点です。
プログラミングを学んだ人にとっては、それほど難しい文法ではありません。しかし、プログラミング未経験の人にとっては慣れない文法に苦慮する可能性があります。
しかし、現在は文法を知らなくてもAI生成でST言語のプログラムの生成が可能です。それでは、AI生成によって吐き出されたプログラムは、PLCにそのまま活用できるのかどうかを考えてみましょう。
生成AIでPLCプログラムを生成
生成AIでPLC用のプログラムをST言語で生成しました。生成したプログラムは、下記の5種類です。
- 四則演算
- PLCの入出力処理
- 条件分岐(IF文)
- 繰り返し処理(FOR文)
- 構造体の定義と配列の計算
順に見ていきましょう。
1.四則演算
前述したとおり、PLCプログラムは装置の入出力処理に関しては簡単に記述が可能です。一方で数値データの取り扱いに関しては一つずつ段階を経て計算しなければならないため、プログラムの記述が複雑になります。
そこで、下記のような質問をChatGPT4に投げかけてみました。
ST (Structured Text) 言語で次のプログラムを作ってください。
- D0とD2とD4の和をD6倍し、5で割った値をD20に代入する
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によるプログラミングは可能であることがわかりました。今回は取り上げませんでしたが、四則演算以外に三角関数や平方根の計算なども可能です。
2.PLCの入出力処理
四則演算と同様に、以下のようなPLCの入出力処理についても投げかけてみました。
- Y000に1を代入する(Y000の出力をONにする)
- Y001に0を代入する(Y000の出力をOFFにする)
- X010の値をY000に代入する
- X011の値をY001に代入する。
ChatGPT4の回答は以下のとおりです。
// Y000に1を代入する。
Y000 := 1;
// Y001に0を代入する。
Y001 := 0;
// X010の値をY000に代入する。
Y000 := X010;
// X011の値をY001に代入する。
Y001 := X011;
単純な入出力の代入については、問題なく生成できました。ただし、自己保持に関しては多少問題があるようです。ChatGPT4に次のような質問を投げかけ、自己保持回路がどのように表現されるのかを確認してみました。
- X010に割り付けたスイッチ入力がONになったときにY000をONし、X011に割り付けたスイッチの入力がONになるまで自己保持する。
ChatGPT4の解答は下記のとおりです。
// X010に割り付けたスイッチ入力がONになったときにY000をONし、
// X011に割り付けたスイッチの入力がONになるまで自己保持する。
IF X010 THEN
Y000 := 1;
ELSIF X011 THEN
Y000 := 0; // 自己保持のためには、外部の制御ロジックが必要になる場合があります。
END_IF;
上記のプログラムでも自己保持は可能です。しかし、想定していたよりも複雑な記述となっています。ChatGPT4からの解答には、下記のような注意書きも書かれていました。
このコードは、与えられた指示に基づいていますが、自己保持ロジックやFORループでのインクリメント方法など、いくつかの操作は通常のPLCプログラミングの慣習とは異なる可能性があるため、実際のPLCハードウェアやソフトウェアの仕様に合わせて調整が必要です。
自己保持ロジックはPLCプログラミングの習慣とは異なる可能性があるとのこと。想定していたプログラムは下記のようなものでした。
- Y000 := X010 OR Y000;
ただし、PLCの機種やメーカーによって異なる場合があります。上記は三菱製のPLCに対応したST言語のプログラムのため、他メーカーのPLCを使用する場合は注意しなければなりません。
3.条件分岐
PLCプログラムにおいて、条件分岐をラダー・ダイヤグラムで記述した場合、わかりづらくなることがあります。一方、ST言語での記述はわかりやすい表現です。
ChatGPT4に、以下のような問いかけを行いました。
- もし、X000の値が1であればY000を1にし、それ以外のとき、Y000を0にする。
- D0×D1が200以下であれば、D2に0を代入し、それ以外の場合はD2に1を代入する。
解答は下記のとおりです。
// もし、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の機種に関係なくそのまま利用可能です。ただし、入出力アドレスは機種によって異なるため、注意してください。
4.繰り返し(FOR文)
条件分岐以上に複雑なプログラムになる構文が、繰り返しです。繰り返しはいくつか方法がありますが、ここではFOR文を取り上げました。
ChatGPT4への指令は下記のとおりです。
- D100を0で初期化し、D100が30まで処理を繰り返す。
- さらにD100を1づつ増加させ、D200にD100+1を代入する。
下記のような解答が得られました。
// 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」は不要となります。
5.構造体の定義と配列の計算
品種データや検査データなどを扱っていると、異なる種類のデータをまとめて扱いたい場合が出てきます。そんなときに便利なデータの型が構造体です。
たとえば、学校の1学年が100人だったとして、身長や体重のデータをひもづけて扱う場合を考えてみましょう。個人のデータとしては下記のようになります。
- 名前(文字列データ)
- 身長(実数データ)
- 体重(実数データ)
1学年分のデータを扱うため、上記を組み合わせたデータを100個の配列として考えなければなりません。そこで、ChatGPT4に以下のような問いかけを行いました。
- 名前、身長、体重のデータ構造を100人分の配列として定義し、身長と体重の平均値を求めます。
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プログラムは若干の修正が必要(まとめ)
本記事ではAI生成されたPLCのプログラムが実用レベルかどうかを検証しました。結論は、ほぼ実用レベルと言えるでしょう。
ST言語は国際規格によって標準化されていますが、PLCメーカーや機種によって異なる部分があります。とくに、自己保持や繰り返しの構文には各メーカーで違いがあるため、AIによって生成されたプログラムを修正しなければなりません。
ただし、ChatGPT4に投げかける質問を工夫することで、クリアできる可能性もあります。また、AIは日々進化しているため、今後はより確実なプログラムの生成が可能になるでしょう。
また、AIによって生成されたプログラムが正しいかどうかの判断をするには、ST言語の文法を知らなければなりません。したがって、まったく知識が無い人が生成AIによるST言語のプログラミングを行うことは難しいでしょう。
PLCやST言語についての知識があり、時間短縮のために利用するのであれば、生成AIは十分に利用価値があります。その辺りのことを踏まえて、AIも上手に活用してみてください。
ITトレンドEXPO2024 Summerに出展します!
弊社からは、製造業のデスクワークを簡単にするAI「SPESILL」を出展します。
ITトレンドEXPO 2024 Summer イベント概要
開催日時 2024年9月18日(水)~20日(金)
開催場所 オンラインでの開催
参 加 費 無料
※過去ITトレンドEXPOに参加いただいた方も再度参加登録をお願いします。
インターネット接続せずに使える生成AI「ローカルLLM」を使いたい方はこちら
https://spesill-local.studio.site
インターネット接続せず、セキュアに生成AI活用ができる環境を提供します。具体的には、ローカルLLMを使用して、専用アプリを50万円~提供します。買い切りになるのでランニングコストはかかりません。
DIfy、Microsoft Copilot Studio、GPTsの構築支援のご相談はこちら
DifyやMicrosoft CopilotなどのノーコードAIツールの活用方法がわからない、社内に導入したけど使用している社員が少ない、生成AIを活用した新事業を立ち上げたい、という企業様を徹底的にサポートします!
お気軽にお問い合わせください。
汎用的な生成AIツールを導入したい方はこちら
Word、Excelと親和性が高く、高度な文章生成、図表から文字・文字から図表の生成ができ、ナレッジ検索ができるAIアシスタントツールです。
専門文書の作成や社内外からのお問い合わせ対応などに課題を感じている、人手不足で業務が逼迫している、埋もれている有益なデータが大量にあるなどナレッジマネジメントのお悩みがあれば是非お気軽にお問い合わせください。
運営会社について
製造DX.comを運営する株式会社ファースト・オートメーションは製造業特化の生成AI活用支援会社です。製造DX.com内で研究成果の一部を投稿しています。また、製造業のデスクワークをAIで簡単にする「SPESILL(スぺシル)」を開発提供しており、特に反響をいただいております。ぜひご活用ください!