現代のFAシステムは目覚ましく高度化しており、より複雑な処理の実装が求められる場面が増えています。予知保全や制御変数の最適制御などの機能を組み込もうとしたときに皆さんはどのようなシステム構成で構築していますでしょうか。
現状のFAシステムの多くはPLC上にラダー言語で実装されているケースが大半かと思いますが、ラダー言語で複雑な処理を実現するのは難しいのが現実です。そこで、PythonやC++などの言語を使う選択肢が上がり、これらの言語を新しく学習されているFA技術者の方も多いのではないでしょうか。
一方、PythonやC++をFAシステムに組み込もうとすると①PLCベースではなくPCベースに移行する②PLCとPCを別建てで構築する③PythonやC++が利用可能なユニットをPLCに追加するなどの対応が必要になります。これらのアプローチでは開発コストや機器コストが大きくなり、ハードルが少し高くなってしまいます。
複雑な処理をPLC上で実装してしまう方法として提案できるのが「ST言語」の活用です。IEC61131-3で規定されているこの言語は、ほぼすべてのPLCメーカーで動作可能です。そのため、ハードウェア構成を変えることなく複雑な処理を実現することが可能となります。
ST言語は非常にシンプルな言語で学習コストは極めて低く取っ付きやすいかと思います。一方で、Pythonのような豊富なライブラリや厚いエコシステムが存在しないデメリットがあります。何をするにもフルスクラッチで実装する必要がありますし、何かに詰まってwebで検索しても何も情報が出てこないことがほとんどです。これらのハードルを乗り越えられるのであれば、FAシステムに複雑な処理を実装するという目的において最高の選択になり得るかと思います。
ST言語を活用する簡単な例として、線形回帰をST言語で実装・ファンクションブロック化してラダーから呼び出せるようにしてみます。
線形回帰のパラメータを最小二乗法で推定する詳細説明は割愛しますが、
のaとbは最小二乗法により以下で求められます。
これをST言語でファンクションブロックとして実装すると以下のようになります。
FUNCTION_BLOCK FB_LinearRegression
VAR_INPUT
// 入力の点数は50とする
x: ARRAY[1..50] OF REAL;
y: ARRAY[1..50] OF REAL;
END_VAR
VAR_OUTPUT
// y = ax + bを求めるとする
a: REAL;
b: REAL;
END_VAR
VAR
sumX: REAL := 0;
sumY: REAL := 0;
sumXY: REAL := 0;
sumXX: REAL := 0;
i : INT;
END_VAR
FOR i := 1 TO 50 DO
sumX := sumX + x[i];
sumY := sumY + y[i];
sumXY := sumXY + x[i] * y[i];
sumXX := sumXX + x[i] * x[i];
END_FOR
a := (50 * sumXY - sumX * sumY) / (50 * sumXX - sumX * sumX);
b := (sumY - a * sumX) / 50;
END_FUNCTION_BLOCK
作ったファンクションブロックはラダー言語などで別途作成するプログラムから以下のような感じで呼び出します。
これでPLC内でも線形回帰を気軽に使えるようになりました。
今回はST言語を使ってFAシステムに複雑な処理をさせる簡単な例として線形回帰を実装してみました。他のもっと難しい処理であっても今回のようにアルゴリズムの中身を理解してST言語で書くことができれば実装可能です。
FA機器メーカーさんから小耳に挟んだ情報によると、昨今のFAシステムの高度化に伴って欧州を中心にST言語を学習するニーズが高まっているようです。
MAZINでも、ST言語のFAシステムとの親和性の高さを評価して、フルスクラッチで様々な複雑な処理を実装していっています。そして、自社プロダクトである切削AIや射出AIもファンクションブロック化してメーカー様に提供しています。このへんの話は別の記事でまた触れようと思います。
今回は以上です。ありがとうございました。