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

Decode(Src, BitSize, Dst);8ビットデコード(Decode)は↓の引数で構成されています。
| 引数 | タイプ | データ型 | 初期値 | コメント |
|---|---|---|---|---|
| EN | IN | BOOL | – | イネーブル入力 |
| ENO | OUT | BOOL | – | イネーブル出力 |
| Src | IN | UINT | – | 変換ビット位置 |
| BitSize | IN | UINT | 0 | 変換するビット数(1~8) |
| Dst | IN-OUT | BOOL[*] | – | デコード結果格納先の先頭 |
BitSizeの値に応じて、Dstで占有するビット数が変化します。
| BitSizeの値 | Dstの占有ビット数 |
|---|---|
| UINT#1 | 2ビット |
| UINT#2 | 4ビット |
| UINT#3 | 8ビット |
| UINT#4 | 16ビット |
| UINT#5 | 32ビット |
| UINT#6 | 64ビット |
| UINT#7 | 128ビット |
| UINT#8 | 256ビット |
占有ビット数がデコードできるビット数と言い換えることが出来ます。例えばBitSizeがUINT#7の場合、Srcの値0~127に応じて、128ヶのビットのいずれかがONします。
LD表現
↓がLD表現で使用したラダープログラム例です。

このラダープログラムでは、InFlag(入力フラグ)がON(TRUE)すると、変換ビット位置(デコード元)であるInDataの値(0~15)に応じて、デコード結果OutData[0]~[15]のいずれかがONします。BitSizeがUINT#4のため、上記の表から占有ビット数は16ビット(OutData[0]~[15])となります。
InDataの値(0~15)に応じて、デコード結果OutData[0]~[15]は以下のようになります。
| InDataの値 | Dstの占有ビット数 |
|---|---|
| 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)ファンクションブロック等で微分化する」または「8ビットデコード(Decode)FUNを微分指定する」方法があります。
立ち上がり検出(R_TRIG)ファンクションブロックについては以下のページで解説しております。
微分指定する場合、命令の引数設定ダイアログで微分(E)にチェックを入れます。

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

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

8ビットデコード(Decode)FUNのイネーブル入力にData00<=UINT#15の比較を指令することで、Data00が15以下の場合のみ8ビットデコード(Decode)が実行されます。(1行目の条件)
8ビットデコード(Decode)FUNの変換ビット位置(デコード元)にData00、変換するビット数にUINT#4、デコード結果にBitAry[0]を指令することで、Data00の値(0~15)に応じて、デコード結果BitAry[0]~[15]のいずれかがONします。(1行目の8ビットデコード(Decode)FUN)
変数リセット(Clear)FUNの対象変数にBitAryを指令することで、Data00が15を超えるとBitAry[0]~[15](配列全体)がゼロクリアされます。(2行目)
ST言語
ST言語は下記のようになります。
//Data00が15以下→BitAryにデコード、15超過→BitAryをクリア
IF Data00 <= UINT#15 THEN
Decode(Src := Data00, BitSize := UINT#4, Dst := BitAry[0]);
ELSE
Clear(BitAry);
END_IF;3. おわりに
キーエンスKV-X500/X300シリーズにおける8ビットデコード(Decode)について解説しました。


