1. ラベルの使い方-ST言語で工学値変換
今回はラベルの使い方の応用で、ST言語で工学値変換を行います。
ST言語にはST言語だけで書くか、ラダー回路の中にST言語を書くインラインST言語があります。
今回はインラインST言語でやってみます。
ST言語を使うことでラベルの本領発揮です。
ラベルを使うことでデータレジスタのアドレスが不要になるので、計算時には、非常に便利です。
作るプログラムは工学値変換です。
工学値変換は電気信号4-20mAをPLCのアナログ入力ユニットで受信し、プロセス計測値に変換する計算です。表で表すと下記のようになります。

三菱電機_MELSEC iQ-R プログラミングマニュアル (プロセス制御FB/命令編) _引用
試しに計算式をCopilotで実行してみましょう。

工学値の計算をラダーで書くとめちゃくちゃ読みづらい。しかも除算があるので、INT2REALなどのデータ型の変換も発生して、長い。。。
無理、、、ということでそんな時はST言語つかいます。
2. 敷居を下げよう!ST言語
2.1. ST言語とは
ST言語は,オープン・コントローラでのロジックの記述方式について規定した国際規格IEC61131-3で定義されている言語です。 ST言語では演算子・制御構文・関数をサポートし,以下のような記述がで きます。
・条件文による選択分岐,反復文による繰り返しなどの制御構文
・演算子(*,/,+,-,,=など)を使用した式
・ユーザが定義したファンクションブロック(FB)の呼び出し ・関数の呼び出し(MELSEC関数・IEC関数) ・漢字などの全角文字を含むコメント記述
三菱電機_ストラクチャードテキスト(ST)プログラミングガイドブック_引用
資料によっては「高級言語」と表記されています。
待て待て待て待て。。PLCが作られた経緯はリレーシーケンスのような回路で、「電気屋さんがプログラムを作れる気軽さ」のはず
言ってしまえば、高級言語がわからない、マイコンがわからないからPLCをやっているはず。
そんなユーザに「国際規格IEC61131-3で定義されている言語です。」とか、「高級言語」なんて説明した途端、耳に入ってこないはずでしょう。
では、ST言語を管理人なりにもう一度解説します。
ST言語は,オープン・コントローラでのロジックの記述方式について規定 した国際規格IEC61131-3で定義されている言語です。 ST言語では演算子・制御構文・関数をサポートし,以下のような記述がで きます。
・条件文による選択分岐,反復文による繰り返しなどの制御構文
・演算子(*,/,+,-,,=など)を使用した式
・ユーザが定義したファンクションブロック(FB)の呼び出し ・関数の呼び出し(MELSEC関数・IEC関数) ・漢字などの全角文字を含むコメント記述よくわからないので省略。。。
Excelと変わりません。簡単です。
三菱、オムロン、キーエンスどれでも同じように作れる超優れものです。
細かい条件式はラダーの真骨頂。無理せずラダーで書きましょう。
2.2. ポイント
- 数式の「=」が「:=」です。ただし、IFなどの関数で使用する場合は普通の「=」です。(ここ引っかかるポイントです)
- CASE文などもありますが、やめましょう。CASE文はラダーで条件分岐を書いたほうがきれいでわかりやすいです。
1÷0(0割り)をするとPLCがエラーで止まるので、0割りしないように演算実行条件の確認用にIF文だけ覚えれば計算はできます。 - IF文の中にIF文を書く(ネスティング)ことは避ける。書いてもネスティングは最大2回までを目途に。
上記での考えでやればそんなに怖くないです。最悪、CHATGPTやCopilotにお願いすれば書いてくれます。
実際、筆者も1週間くらい練習したら、ほぼマニュアルなしで書けるようになりました。
パルスとか、タイマーとかもST言語の中で使いたいと思うと少しまた覚えることがありますが、それはラダー命令でやってしまうのが一つの手です。
3. 使ってみよう(ST言語編)
3.1. 設定
今回は下記のシステム構成で作ります。

インラインSTで書くので、プログラム言語はST言語にします。

PLCの設定をしていきます。今回はR04CPUとR60AD4を使用します。
ナビゲーションウィンドウの「ユニット構成」をクリック。
下記のような画面が表示されます。

ツールバーの「表示」→「ドッキングウィンドウ」→「部品選択」をクリック。
部品の中から「R35B」、「R61P」、「R04CPU」、「R60AD4」をドラッグしてシステム構成を作成します。作成したらシート上で右クリックして「確定」をクリック。

3.2. プログラム作成
ツールバーの「ST」をクリック。

このシートみたいなのにST言語書きます。

ラベルを設定します。今回はナビゲーションウィンドウの「ローカルラベル」に入力します。

この回路はアナログ入力(D1000)が入ってきて、工学値で出力される回路になります。
アナログ入力の異常入力はカットするために、LIMIT命令を使います。
PLCのアナログ入力ユニットの仕様を確認すると、4-20mAを0~32000のデジタル値としてPLCに出力するので、SCALEには32000を入力。
RHは200、RLは0で入力します。
ST言語の内容はこんな感じです。
//////////////////////ST言語//////////////////////
CALC_ERR := FALSE;
TMP0 := INT_TO_REAL(DIGITAL_VALUE); //INT型→単精度実数へ変換
TMP1 := INT_TO_REAL(SCALE); //INT型→単精度実数へ変換
IF SCALE <= 0 THEN //SCALE設定が0ならば工学値変換をせず、エラー出力
CALC_ERR :=TRUE; //エラー出力
ELSE
EV_VALUE := (TMP0 / TMP1)* (RH – RL) + RL; //工学値変換
END_IF;
//////////////////////////////////////////////////////////////////
3.3. ユニットラベル
アナログユニットのディジタル出力値は前回簡単に紹介したユニットラベルを使用してみます。「部品選択」の「ユニット」をクリック。
ユニット構成を作成した際に「0000:R60AD4」のユニットラベルのフォルダが追加されています。フォルダを右クリックして、「ユニットラベルの追加(U)」をクリックします。
フォルダ「0000:R60AD4」→「R60AD_1」→「モニタ」→「CH1」の「wDigitalOutputValue」をドラッグすると回路上に配置できます。
接点回路で出てきてしまうので、「R60AD_1.stnMonitor[0].wDigitalOutputValue」をコピーします。

「R60AD_1.stnMonitor[0].wDigitalOutputValue」は構造化タグと配列で構成されているようです。構成タグと配列の解説は別の記事でしますので、ひとまずはこんなものという認識で覚えていてください。
完成形は下図のようになります。

3.4. 書き込み
それではプログラムを書き込みます。
「オンライン」の「シーケンサへの書き込み」をクリック。

「パラメータ+プログラム」をクリックして、「実行」をクリック。

PLC本体を「リセット」→「RUN」します。
キーボードのF3を押すとモニタ状態になります。
3.5. テスト

実際にアナログユニットのCH1に12mAを入れて、スケールの50%の16000となるようにしましたが、16001と少しずれてしまいました。EV_VALUEは計算値「100.0」に対して、「100.006」なので、計算は合っていますね。
実行文の隣に変数の現在値が表示してくれます、デバッグのしやすさがST言語の魅力ですね。
以上がラベルとST言語を使った工学値変換の紹介でした。
ラベルを使うとデータ型変換の時にデータレジスタのアドレスを気にしなくてよいので、とても使いやすいですね。
管理人はST言語を覚えてから計算はすべてST言語でやるようになって、早く簡単に間違いなく計算処理ができるようになりました。
次回は今回のプログラムを使ってファンクションブロックを作ってみたいと思います。
不明点はコメントに投稿お願いいたします。
この記事を見て、SMATEX エンジニアリングに仕事お願いしてみたいと思った方はお問い合わせよりご連絡ください。
次回もぜひ読んで下さい!
SMATEXエンジニアリングでは、MELSEC iQ-Rを用いたPLC計装、制御盤設計、既設設備改造、SCADA連携のご相談を承っています。
アナログ入力、工学値変換、PID制御、GOT画面、GX Works3でのラベル設計など、現場で使える制御設計を前提にご提案します。





この記事へのコメントはありません。