1 ラベルの使い方-FB(ファンクションブロック)で工学値変換
こんにちは。SMATEXエンジニアリングです。
今回は前回取り扱ったST言語で工学値変換したプログラムをFB(ファンクションブロック)にします。
2 FB(ファンクションブロック)について
2.1 FB(ファンクションブロック)とは
FB(ファンクションブロック)の略称で,シーケンスプログラム内で繰り返し使用する回路ブロックを部品化して,シーケンスプログラムの中で流用できるようにしたものです。
これにより,プログラム開発を効率化するとともにプログラムミスを削減し,プログラムの品質を向上することができます。
三菱電機_スクールテキスト_応用:MELSEC iQ-Rプログラミング (GX Works3版)より引用
ファンクションブロックを使うと、プログラムを一つの部品として扱い、デジタル回路のような回路図となります。これでラダーがすっきりした見栄えで可読性が上がります。また、同じ処理を繰り返すときに有効です。
例えばですが、ポンプが2個3個ある場合は、ラダーのコピー&ペーストでラベル名を変更することで対応できます。ところがプロセスによってはポンプが30個、バルブが100個くらいある場合があります。その際にON-OFF回路を作るときはラダー図でFOR-NEXTで作る方法があります。ただしFOR-NEXTで作るとデバッグの際に個々の動きがどうなっているか(例えば100回繰り返している途中の3回目がどうなっているか)を確認するのが難しい問題があります。
同じ処理を何度もする場合にプログラムをFB化することで可読性を上げることができます。
2.2 サブルーチン型とマクロ型
FBには二つのタイプがありますが、基本的にはサブルーチン型を使用します。
①サブルーチン型
FOR-NEXTのように、ひとつのプログラムに引数を渡して実行する形。FBを修正すればすべてまとめて修正されるので保守性が高い。
今回作成する工学値変換などの同じ処理を実行するのに最適。繰り返し処理と同様にプログラムステップ数も削減できる。
②マクロ型
何度も同じプログラムをコピー&ペーストして使用する形。
保守性が低い代わりに、個々のプログラムで動きを変更することができる。
バルブ制御だと複数のメーカで信号の取り合いが異なるので、その際に活用できる(?)。
正直言うと、そういう時は汎用FBの中でモード切替で動作を変更できるような回路で対応したほうが良いので、最適な活用例が少ない気がします。
私の知見不足なだけなので、最適例があれば、是非コメントで教えてください。
プログラムステップ数はサブルーチン型と同じ処理を10個行ったら10倍になります。
3 使ってみよう(FB編)
3.1 設定
まずは、ナビゲーションウィンドウの「FB/FUN」を右クリック。「データ新規作成」をクリック。

データ名を「工学値変換」にします。基本的にはサブルーチン型にします。
筆者はマクロ型使って作成したことがありません。
「OK」をクリック。

3.2 プログラム作成
プログラムファイルができたので、まずは、記事3.で作成したファイルのローカルラベルをコピーして「工学値変換」のローカルラベルに貼り付けます。


下記のクラスを変更します。
| ラベル名 | クラス(変更前) | クラス(変更後) |
| DIGITAL_VALUE | VAR | VAR_INPUT |
| RH | VAR | VAR_INPUT |
| RL | VAR | VAR_INPUT |
| SCALE | VAR | VAR_INPUT |
| EV_VALUE | VAR | VAR_OUTPUT |
| CALC_ERR | VAR | VAR_OUTPUT |
これでファンクションブロックのIO端子が作成されます。
ここから少し改良を加えます。
・変更:警報4点(上限HH, H, L, LL)の設定値と警報出力を追加します。
ローカルラベルに追加します。

ST言語部分は下記のようにします。
↓↓↓↓↓↓↓↓↓↓↓↓ST言語↓↓↓↓↓↓↓↓↓↓↓↓
//初期化//
CALC_ERR := FALSE;
//データ型変換//
TMP0 := INT_TO_REAL(DIGITAL_VALUE); //INT型→単精度実数へ変換
TMP1 := INT_TO_REAL(SCALE); //INT型→単精度実数へ変換
//ハンチング防止HYS演算回路//
ALM_HH_HYS := ALM_HH_SET – ALM_HYS;
ALM_H_HYS := ALM_H_SET – ALM_HYS;
ALM_L_HYS := ALM_L_SET + ALM_HYS;
ALM_LL_HYS := ALM_LL_SET + ALM_HYS;
//工学値変換//
IF SCALE <= 0 THEN //SCALE設定が0のならば工学値変換をせず、エラー出力
CALC_ERR :=TRUE; //エラー出力
ELSE
EV_VALUE := (TMP0 / TMP1)* (RH – RL) + RL; //工学値変換
END_IF;
//警報HH発生//
IF EV_VALUE >= ALM_HH_SET THEN
ALM_HH := TRUE;
END_IF;
//警報HH復旧//
IF EV_VALUE < ALM_HH_HYS THEN
ALM_HH := FALSE;
END_IF;
//警報H発生//
IF EV_VALUE >= ALM_H_SET THEN
ALM_H := TRUE;
END_IF;
//警報H復旧//
IF EV_VALUE < ALM_H_HYS THEN
ALM_H := FALSE;
END_IF;
//警報L発生//
IF EV_VALUE <= ALM_L_SET THEN
ALM_L := TRUE;
END_IF;
//警報L復旧//
IF EV_VALUE > ALM_L_HYS THEN
ALM_L := FALSE;
END_IF;
//警報LL発生//
IF EV_VALUE <= ALM_LL_SET THEN
ALM_LL := TRUE;
END_IF;
//警報LL復旧//
IF EV_VALUE > ALM_LL_HYS THEN
ALM_LL := FALSE;
END_IF;
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
前回は定数をラダーで宣言していましたが、FBにするとそれが不要になります。
完成形はこちら(長すぎてスクリーンショットできず印刷する羽目に)

これで一度「全変換」を実行。
続いては通常のスキャンプログラムにプログラムファイルを追加。
「部品選択」の「ファンクションブロック」にFB/FUNで作成したFBが追加されていますので、ドラッグしてラダー回路上に置きます。

置くと下記のような画面が表示されるので、FBの名称を入力。ここでは「工学値変換_1」とします。

こんな感じで入力します。

では、書き込みます。
3.3 テスト
うまく動作していれば、下図のように出力されています。

ヒステリシス設定で警報がON-OFFを繰り返すハンチングを防止しています。ハンチングではなく、タイマーでやるなど、ほかにも色々方法がありますね。
FBで注意したいのが、FB/FUNのみの作成だと、変換は問題なくても、実際にプログラム上に配置して変換したときにFB/FUNのエラーが発生しますので、作りっぱなしだと後々エラーになってしまうので、FBを作ったら都度テストが必要です。(ちなみにプログラム上で使っていない場合はFB/FUNのファイル名の色が変わります)
FB/FUNで作ったものはFBDでも使用可能です。こちらは次回紹介します。
あとラダー上にFBを置くと、端子だらけになってしまって見づらいというのもあります。これは次回、FBDで作成する場合に構造体を使って解決したいと思います。
不明点はコメントに投稿お願いいたします。
この記事を見て、SMATEX エンジニアリングに仕事お願いしてみたいと思った方はお問い合わせよりご連絡ください。
次回もぜひ読んで下さい!
SMATEXエンジニアリングでは、MELSEC iQ-Rを用いたPLC計装、制御盤設計、既設設備改造、SCADA連携のご相談を承っています。
アナログ入力、工学値変換、PID制御、GOT画面、GX Works3でのラベル設計など、現場で使える制御設計を前提にご提案します。





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