オムロンNJ/NXシリーズにおける「ビットエンコーダ(Encoder)」は、指定した範囲(最大256ビット)のビットデバイスのONしている位置を求めるファンクションです。
一般的にエンコード(Encode)とは、ある情報を別の形式に変換する処理を指します。例えば「文字をコンピュータ内部で扱える数値データに変換する文字コード化」「音声や映像をデジタルデータとして圧縮する処理」など幅広い分野で使われています。
ラダープログラムにおいてエンコードは複数のビット信号を1つの数値(バイナリ値)にまとめる処理を意味します。
ビットエンコーダ(Encoder)は「異常ビット位置からコード化」「軸の完了ポジション(複数のビット)から現在ポジション番号を格納」といった用途に用いることがあります。いずれもビット列のONしている位置を変数やワードデバイスに格納する処理になります。
この記事では、オムロンNJ/NXシリーズにおけるビットエンコーダ(Encoder)の指令方法とラダープログラム、ST言語の例について解説します。
目次
1. ビットエンコーダ(Encoder)の指令方法
ビットエンコーダ(Encoder)はLD表現(ラダープログラム)とST表現(ST言語)で使用することができます。

Out := Encoder(In, Size);ビットエンコーダ(Encoder)は↓の引数で構成されています。
| 引数 | タイプ | データ型 | 初期値 | コメント |
|---|---|---|---|---|
| EN | IN | BOOL | – | イネーブル入力 |
| ENO | OUT | BOOL | – | イネーブル出力 |
| In | IN | データ型に従う※ | – | 変換対象配列 |
| Size | IN | USINT | 1 | 変換するビット数(0~8) |
| Out | RETURN | BYTE | – | 変換結果 |
※使用できるデータ型は以下の通りです。

LD表現
↓がLD表現で使用したラダープログラム例です。

このラダープログラムでは、InFlag(入力フラグ)がON(TRUE)すると、変換対象配列(エンコード元)であるInData[0]~[15](16ビット)のONしている位置を求め、ビット位置(エンコード結果)OutDataに数値”0~15”を格納します。
変換するビット数にUSINT#4を指令することで、変換対象配列は16ビット長(\(2^4=16\))となります。
InData[0]~[15]のON/OFF状態に応じて、変換結果OutDataの値は以下のようになります。InData[0]~[15]の中でONしているビットが複数ある場合、最上位のビット位置がOutDataに格納されます。また、InData[0]~[15]が全てOFFの場合OutFlagはOFFとなり、一つでもONしているビットがあればOutFlagはONします。
| InDataの状態 | OutDataの値 |
|---|---|
| InData[0]がON | 0 |
| InData[1]がON | 1 |
| InData[2]がON | 2 |
| InData[3]がON | 3 |
| InData[4]がON | 4 |
| InData[5]がON | 5 |
| InData[6]がON | 6 |
| InData7]がON | 7 |
| InData[8]がON | 8 |
| InData[9]がON | 9 |
| InData[10]がON | 10 |
| InData[11]がON | 11 |
| InData[12]がON | 12 |
| InData[13]がON | 13 |
| InData[14]がON | 14 |
| InData[15]がON | 15 |
配列型変数InDataはBOOL型の一次元配列、要素は[0]~[15]の要素数16とします。
InFlag(入力フラグ)がON(TRUE)中にエンコード対象(上記だとInData)の値が変化すると、OutData(エンコード結果)の結果も追従して変化します。
InFlag(入力フラグ)がON(TRUE)した瞬間のみエンコードを行う場合、「InFlag(入力フラグ)を立ち上がり微分(R_TRIG)ファンクションブロック等で微分化する」または「ビットエンコーダ(Encoder)FUNに微分型(@)を指定する」方法があります。
立ち上がり微分(R_TRIG)ファンクションブロックについては以下のページで解説しております。
微分型(@)を指定する場合、FUN(ファンクション)入力時、頭文字に@を付けます。

ST表現
↓がST表現で使用したST言語例です。
IF InFlag THEN
OutData := Encoder(In := InData[0], Size := USINT#4);
END_IF;このSTでは、InFlag(入力フラグ)がON(TRUE)すると、変換対象配列(エンコード元)であるInData[0]~[15](16ビット)のONしている位置を求め、ビット位置(エンコード結果)OutDataに数値”0~15”を格納します。※前述のLD表現と同じ動作です。
2.【例題】ビット配列のON位置を変数に格納する
下記仕様のラダープログラム、STをビットエンコーダ(Encoder)を用いて解説します。
BitAry[0]~[15]でONしているビットが一つでもあれば、ランプ緑が点灯する。
配列指定変数BitAry[0]~[15]のONしている位置をData00に格納する処理にビットエンコーダ(Encoder)FUNを使用します。
ビットエンコーダ(Encoder)FUNでは、エンコード元のビットが一つでもONしている場合、イネーブル出力(ENO)はONになります。そのため、今回はイネーブル出力がONであればランプ緑を点灯させる処理を行います。
タッチパネルの動作イメージ
タッチパネルの動作イメージは以下のようになります。

配列指定変数BitAry[0]~[15]のONしている最上位位置を、常に変数Data00に格納します。
BitAry[0]~[15]でONしているビットが一つでもあれば、ランプ緑が点灯します。
使用する変数
使用する変数は以下になります。
| 変数 | データ型 | コメント |
|---|---|---|
| Data00 | BYTE | データ00 |
| BitAry | ARRAY[0..15] OF BOOL | ビット配列 |
| LpGreen | BOOL | ランプ緑 |
ラダープログラム
ラダープログラムは以下のようになります。

イネーブル入力に_P_On(常時ON)、変換対象配列にBitAry[0]、変換するビット数にUSINT#4、変換結果にData00を指令することで、配列型変数BitAry[0]~[15]のONしている最上位位置を、常に変数Data00に格納します。
また、イネーブル出力にLpGreenのコイルを指令することで、変換対象配列が一つでもONしていればランプ緑が点灯します。
ST言語
ST言語は下記のようになります。
//配列型変数BitAry[0]~[15]のONしている最下位位置をData00に格納
Data00 := Encoder(In := BitAry[0], Size := USINT#4, ENO => LpGreen);3. おわりに
オムロンNJ/NXシリーズにおけるビットエンコーダ(Encoder)について解説しました。

