FP_DECODE

デコードHex -> ビットステート

このFP命令は、トリガENTRUEに設定されているとき、s2_Controlで指定された内容に従って、s1_Startで指定したデータの内容をデコードします。デコード結果は、d_Startで始まるエリアに格納されます。

FP_DECODEは、FP_ENCODEの逆命令です。

パラメータ

入力

s1_Start (WORD)

デコードする変換元エリアまたは定数データ

s2_Control (WORD)

デコードするデータの先頭ビット位置とビット数を指定する制御データ

出力

d_Start (WORD)

デコードデータを格納するための先頭アドレス(格納先)

解説

  • 変数s1_Starts2_Controld_Startは同じデータ型を使用してください。

  • s2_Control=16#404

    1.  (1) 変換元
    2.  (2) ビット位置
    3.  (3) ビット位置4
    4.  (4) 4ビット(ビット4~7、バイナリ:2#0111または10進法:s1_Startの7)は、トリガがTRUEのときにデコードされます
    5.  (5) 格納先

      デコードされたデータTRUEは、d_Startのビット位置7に格納されます。

      ビット7以外のすべてのビットはゼロで埋められます。

    s1_Startで指定されるエリアのnHビットからの2^nLビットセグメントの内容がデコードされます(nLはデコードされるビット数)。

    デコード結果は、d_Startで指定されたエリアから始まる2^nLビットセグメントに格納されます(nHは変換開始ビット)。結果用に指定されたエリア内の無効ビットは、ゼロで埋められます。

  • s2_Control説明

    s2_Controlは、デコードする先頭ビット位置とビット数を16進数で指定します。

    1.  (1) 16ビットデータ
    2.  (2) ビット0~15の数値

    「-」とマークされたビットは無効です。

     

    設定値

    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

エラーフラグ

sys_bIsOperationErrorHold (TRUEになり、TRUEを保持)
  • インデックス修飾時にエリアを超えたとき

  • エンコード/デコードされるビット長nL1 £ nL £ 8の場合

  • 変換開始ビットnHとエンコード/デコードされるビット長nL1 £ nH + nL £ 16の場合

  • デコード結果で使用されるメモリエリアが制限を超えた場合。

sys_bIsOperationErrorNonHold (1回のスキャンに対してTRUE)
  • インデックス修飾時にエリアを超えたとき

  • エンコード/デコードされるビット長nL1 £ nL £ 8の場合

  • 変換開始ビットnHとエンコード/デコードされるビット長nL1 £ nH + nL £ 16の場合

  • デコード結果で使用されるメモリエリアが制限を超えた場合。

POUヘッダCopy code to clipboard

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

POUボディ

変数bStartTRUEにセットされると、このファンクションが実行されます。

LDボディCopy code to clipboard

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

STボディCopy code to clipboard

IF start then
    FP_DECODE(s1_Start := wInput_value, 
              s2_Control := wControlCode, 
              d_Start => wConversionResult);
END_IF;

最終修正日: 2023-05-10このページに関するフィードバックお問い合わせ窓口