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

Result := Encode(Src, BitSize);8ビットエンコード(Encode)は↓の引数で構成されています。
| 引数 | タイプ | データ型 | 初期値 | コメント |
|---|---|---|---|---|
| EN | IN | BOOL | – | イネーブル入力 |
| ENO | OUT | BOOL | – | イネーブル出力 |
| Src | IN | BOOL[*] | – | エンコード対象ビット先頭 |
| BitSize | IN | UINT | 0 | 変換するビット数(1~256) |
| Result | RETURN | UINT | – | ビット位置(0~) |
LD表現
↓がLD表現で使用したラダープログラム例です。

このラダープログラムでは、InFlag(入力フラグ)がON(TRUE)すると、エンコード対象ビット先頭(エンコード元)であるInData[0]~[15](16ビット)のONしている位置を求め、ビット位置(エンコード結果)OutDataに数値”0~15”を格納します。
InData[0]~[15]のON/OFF状態に応じて、エンコード結果OutDataの値は以下のようになります。InData[0]~[15]の中でONしているビットが複数ある場合、最下位のビット位置がOutDataに格納されます。また、InData[0]~[15]が全てOFFの場合、OutDataには$FFFFが格納されます。$FFFFとは16進数のFFFF、10進数に直すと65535を意味します。
| 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)ファンクションブロック等で微分化する」または「8ビットエンコード(Encode)FUNを微分指定する」方法があります。
立ち上がり検出(R_TRIG)ファンクションブロックについては以下のページで解説しております。
微分指定する場合、命令の引数設定ダイアログで微分(E)にチェックを入れます。

ST表現
↓がST表現で使用したST言語例です。
IF InFlag THEN
OutData := Encode(Src := InData[0], BitSize := UINT#16);
END_IF;このSTでは、InFlag(入力フラグ)がON(TRUE)すると、エンコード対象ビット先頭(エンコード元)であるInData[0]~[15](16ビット)のONしている位置を求め、ビット位置(エンコード結果)OutDataに数値”0~15”を格納します。※前述のLD表現と同じ動作です。
2.【例題】ビット配列のON位置を変数に格納する
下記仕様のラダープログラム、STを8ビットエンコード(Encode)を用いて解説します。
BitAry[0]~[15]でONしているビットが一つでもあれば、ランプ緑が点灯する。
配列型変数BitAry[0]~[15]のONしている位置をData00に格納する処理に8ビットエンコード(Encode)FUNを使用します。
8ビットエンコード(Encode)FUNでは、エンコード対象のビットが全てOFFの場合、エンコード結果には$FFFFが格納されます。そのため、今回はエンコード対象であるData00が$FFFFで無ければ(不一致であれば)スイッチ緑をONされる処理を行います。
Data00と$FFFFが不一致であるか判別するため、今回は比較ファンクションを使用します。キーエンスKV-X500/X300シリーズの比較ファンクションについては以下のページで解説しております。
タッチパネルの動作イメージ
タッチパネルの動作イメージは以下のようになります。

配列型変数BitAry[0]~[15]のONしている最下位位置を、常に変数Data00に格納します。BitAry[0]~[15]が全てOFFの場合、Data00には$FFFF(16進数のFFFF、10進数に直すと65535)が格納されます。
BitAry[0]~[15]でONしているビットが一つでもあれば、ランプ緑が点灯します。
使用する変数
使用する変数は以下になります。
| 変数 | データ型 | コメント |
|---|---|---|
| Data00 | UINT | データ00 |
| BitAry | ARRAY[0..15] OF BOOL | ビット配列 |
| LpGreen | BOOL | ランプ緑 |
ラダープログラム
ラダープログラムは以下のようになります。

イネーブル入力に_AlwaysOn(常時ON)、エンコード対象にBitAry[#0]、変換するビット数にUINT#16、エンコード結果にData00を指令することで、配列型変数BitAry[0]~[15]のONしている最下位位置を、常に変数Data00に格納します。(1行目)
LpGreenコイルの条件に、Data00<>UINT#16#FFFFの比較を指令することで、Data00が$FFFF(16進数のFFFF、10進数に直すと65535)の場合、ランプ緑が点灯します。(2行目)
ST言語
ST言語は下記のようになります。
//配列型変数BitAry[0]~[15]のONしている最下位位置をData00に格納
Data00 := Encode(Src := BitAry[0], BitSize := UINT#16);
//Data00が$FFFFで無ければランプ緑点灯
IF Data00 <> UINT#16#FFFF THEN
LpGreen := TRUE;
ELSE
LpGreen := FALSE;
END_IF;3. おわりに
キーエンスKV-X500/X300シリーズにおける8ビットエンコード(Encode)について解説しました。


