デコードHex -> ビットステート
このFP命令は、トリガENがTRUEに設定されているとき、s2_Controlで指定された内容に従って、s1_Startで指定したデータの内容をデコードします。デコード結果は、d_Startで始まるエリアに格納されます。
FP_DECODEは、FP_ENCODEの逆命令です。
入力
デコードする変換元エリアまたは定数データ
デコードするデータの先頭ビット位置とビット数を指定する制御データ
出力
デコードデータを格納するための先頭アドレス(格納先)
変数s1_Start、s2_Control、d_Startは同じデータ型を使用してください。
例 s2_Control=16#404
デコードされたデータTRUEは、d_Startのビット位置7に格納されます。
ビット7以外のすべてのビットはゼロで埋められます。
s1_Startで指定されるエリアのnHビットからの2^nLビットセグメントの内容がデコードされます(nLはデコードされるビット数)。
デコード結果は、d_Startで指定されたエリアから始まる2^nLビットセグメントに格納されます(nHは変換開始ビット)。結果用に指定されたエリア内の無効ビットは、ゼロで埋められます。
s2_Controlの説明
s2_Controlは、デコードする先頭ビット位置とビット数を16進数で指定します。
「-」とマークされたビットは無効です。 |
|||||
設定値 16#0~16#F |
(3) デコードする先頭ビット位置 |
設定値 16#0~16#8 |
(4) デコードされたビットの数値 |
||
16#0 |
0 |
16#0 |
0 |
||
16#1 |
1 |
16#1 |
1 |
||
16#2 |
2 |
16#2 |
2 |
||
16#3 |
3 |
16#3 |
3 |
||
16#4 |
4 |
16#4 |
4 |
||
16#5 |
5 |
16#5 |
5 |
||
16#6 |
6 |
16#6 |
6 |
||
16#7 |
7 |
16#7 |
7 |
||
16#8 |
8 |
16#8 |
8 |
||
16#9 |
9 |
||||
16#A |
10 |
||||
16#B |
11 |
||||
16#C |
12 |
||||
16#D |
13 |
||||
16#E |
14 |
||||
16#F |
15 |
ビット数とデコード結果が占めるエリアの関係
デコードするビット数 |
デコード結果の占有長 |
デコードされたビット数(結果) |
---|---|---|
1 |
1ワード |
2ビット1) |
2 |
1ワード |
4ビット1) |
3 |
1ワード |
8ビット1) |
4 |
1ワード |
16ビット |
5 |
2ワード |
32ビット |
6 |
4ワード |
64ビット |
7 |
8ワード |
128ビット |
8 |
16ワード |
256ビット |
1)結果で必要とされるデータエリアの無効ビットはゼロで埋められます。
デコードされたデータの例
4ビットデータをデコードする場合、デコード結果の16ビットデータを以下に示します。
デコーディング条件:s2_Control
先頭ビット位置0:16#0
デコードするビット数:16#4(4ビット)
デコードされるデータ(4ビット) |
デコード結果 |
|
---|---|---|
16進 |
10進 |
|
16#0000 |
0 |
0000 0000 0000 0001 |
16#0001 |
1 |
0000 0000 0000 0010 |
16#0010 |
2 |
0000 0000 0000 0100 |
16#0011 |
3 |
0000 0000 0000 1000 |
16#0100 |
4 |
0000 0000 0001 0000 |
16#0101 |
5 |
0000 0000 0010 0000 |
16#0110 |
6 |
0000 0000 0100 0000 |
16#0111 |
7 |
0000 0000 1000 0000 |
16#1000 |
8 |
0000 0001 0000 0000 |
16#1001 |
9 |
0000 0010 0000 0000 |
16#1010 |
10 |
0000 0100 0000 0000 |
16#1011 |
11 |
0000 1000 0000 0000 |
16#1100 |
12 |
0001 0000 0000 0000 |
16#1101 |
13 |
0010 0000 0000 0000 |
16#1110 |
14 |
0100 0000 0000 0000 |
16#1111 |
15 |
1000 0000 0000 0000 |
インデックス修飾時にエリアを超えたとき
エンコード/デコードされるビット長nLが1 £ nL £ 8の場合
変換開始ビットnHとエンコード/デコードされるビット長nLが1 £ nH + nL £ 16の場合
デコード結果で使用されるメモリエリアが制限を超えた場合。
インデックス修飾時にエリアを超えたとき
エンコード/デコードされるビット長nLが1 £ nL £ 8の場合
変換開始ビットnHとエンコード/デコードされるビット長nLが1 £ nH + nL £ 16の場合
デコード結果で使用されるメモリエリアが制限を超えた場合。
POUヘッダには、このプログラムで使用するすべての入力変数と出力変数を宣言します。 POUヘッダは全プログラム言語で使用できます。
VAR
bStart: BOOL:=FALSE;
(*activates the function*)
wInput_value: WORD:=2#1100011000011110;
wControlCode: WORD:=16#0003;
(*specifies decoding*)
wConversionResult: WORD:=0;
(*result after a 0->1 leading
edge from start:
2#0000000001000000*)
END_VAR
変数bStartがTRUEにセットされると、このファンクションが実行されます。
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 6 ;
NETWORK_BODY
B(B_CONTACT,,bStart,8,1,10,3,);
B(B_VARIN,,wInput_value,11,2,13,4,);
B(B_VARIN,,wControlCode,11,3,13,5,);
B(B_VAROUT,,wConversionResult,21,2,23,4,);
B(B_F,FP_DECODE!,,13,0,21,5,,?DEN?Ds1_Start?Ds2_Control?AENO?Cd_Start);
L(10,2,13,2);
L(1,2,8,2);
L(1,0,1,6);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF start then
FP_DECODE(s1_Start := wInput_value,
s2_Control := wControlCode,
d_Start => wConversionResult);
END_IF;