オムロンNJ/NXシリーズにおける「ビットデコーダ(Decoder)」は、数値データの値に応じて、いずれか1点のビットデバイスのみをONさせるファンクションです。
一般的にデコード(Decode)とは、「符号化された情報を元の意味に読み解く」「数値や信号を分解して解釈する」といった意味を持つ言葉です。映像・音声・通信などの分野では、データを受け取った側が、符号化(エンコード)された情報を再び元の状態に戻す処理を指して使われます。
ラダープログラムにおいてデコードは数値を対応する1点のビット信号として展開する処理を意味します。
ビットデコーダ(Decoder)は「異常コードのビット展開」「軸の現在ポジションに応じたビット展開」といった用途に用いることがあります。いずれも変数やワードデバイスに格納された値に応じて、特定のビット列に展開する処理になります。
この記事では、オムロンNJ/NXシリーズにおけるビットデコーダ(Decoder)の指令方法とラダープログラム、ST言語の例について解説します。
目次
1. ビットデコーダ(Decoder)の指令方法
ビットデコーダ(Decoder)はLD表現(ラダープログラム)とST表現(ST言語)で使用することができます。

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

Size(変換するビット数)の値に応じて、InOut[]配列で占有するビット数が変化します。
| Sizeの値 | InOut[]配列の占有ビット数 |
|---|---|
| USINT#1 | 2ビット |
| USINT#2 | 4ビット |
| USINT#3 | 8ビット |
| USINT#4 | 16ビット |
| USINT#5 | 32ビット |
| USINT#6 | 64ビット |
| USINT#7 | 128ビット |
| USINT#8 | 256ビット |
占有ビット数がデコードできるビット数と言い換えることが出来ます。例えばSizeがUSINT#7の場合、InOut[]配列の値0~127に応じて、128ヶのビットのいずれかがONします。
LD表現
↓がLD表現で使用したラダープログラム例です。

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

ST表現
↓がST表現で使用したST言語例です。
IF InFlag THEN
Decoder(In := InData, Size := USINT#4, InOut := OutData[0]);
END_IF;このSTでは、InFlag(入力フラグ)がON(TRUE)すると、変換するビット位置(デコード元)であるInDataの値(0~15)に応じて、デコード結果OutData[0]~[15]のいずれかがONします。※前述のLD表現と同じ動作です。
2.【例題】変数の値をビット配列にデコードする
下記仕様のラダープログラム、STをビットデコーダ(Decoder)を用いて解説します。
Data00の値が15超過の場合、BitAry[0]~[15]は全てOFFする。
配列指定変数BitAryは一次元配列、要素は[0]~[15]の要素数16とする。
配列指定変数BitAry[0]~[15]のいずれか1点のみをONする処理にビットデコーダ(Decoder)FUNを使用します。
Data00の値が15超過の場合にBitAry[0]~[15]を全てOFFにするため、今回は初期化(Clear)を使用します。オムロンNJ/NXシリーズの初期化(Clear)ファンクションについては以下のページで解説しております。
Data00の値に応じて、デコード処理を行う場合(15以下)と、初期化処理を行う場合(15超過)に分岐する必要があります。比較ファンクションを使用して、Data00と定数15の比較を行い各条件に合致した場合のみファンクションを実行します。オムロンNJ/NXシリーズの比較ファンクションについては以下のページで解説しております。
タッチパネルの動作イメージ
タッチパネルの動作イメージは以下のようになります。

変数Data00の値(0~15)に応じて、配列指定変数BitAry[0]~[15]のいずれか1点のみがONします。Data00の値が15超過の場合、BitAry[0]~[15]は全てOFFします。
使用する変数
使用する変数は以下になります。
| 変数 | データ型 | コメント |
|---|---|---|
| Data00 | BYTE | データ00 |
| BitAry | ARRAY[0..15] OF BOOL | ビット配列 |
ラダープログラム
ラダープログラムは以下のようになります。

ビットデコーダ(Decoder)FUNのイネーブル入力にData00<=BYTE#16#0Fの比較を指令することで、Data00が15以下(16進数だと0F以下)の場合のみビットデコーダ(Decoder)が実行されます。(1行目の条件)
ビットデコーダ(Decoder)FUNの変換するビット位置(デコード元)にData00、変換するビット数にUSINT#4、デコード結果にBitAry[0]を指令することで、Data00の値(0~15)に応じて、デコード結果BitAry[0]~[15]のいずれかがONします。(1行目のビットデコーダ(Decoder)FUN)
初期化(Clear)FUNの対象変数にBitAryを指令することで、Data00が15を超える(16進数だと0Fを超える)とBitAry[0]~[15](配列全体)がゼロクリアされます。(2行目)
ST言語
ST言語は下記のようになります。
//Data00が15以下→BitAryにデコード、15超過→BitAryをクリア
IF Data00 <= BYTE#16#0F THEN
Decoder(In := Data00, Size := USINT#4, InOut := BitAry[0]);
ELSE
Clear(BitAry);
END_IF;3. おわりに
オムロンNJ/NXシリーズにおけるビットデコーダ(Decoder)について解説しました。


