FP_DECODE

解码十六进制 -> 位状态

如果触发器EN设置为TRUE,此FP指令将根据s2_Control的内容解码由s1_Start指定的数据内容。解码结果存储在从d_Start开始的区域中。

FP_DECODEFP_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) 当触发器为TRUE时,解码s1_Start的4个位(第4–7位,二进制:2#0111或十进制:7)
    5.  (5) 目标

      d_Start的位位置7存储解码数据TRUE

      除7位之外的所有位填充0。

    s1_Start指定区域的nH位开始的2^nL位段的内容将被解码(nL是要解码的位数)。

    解码后的结果存储在从d_Start指定的区域开始的2^nL位段中(nH是指转换起始位)。结果指定区域中的无效位将填充零。

  • s2_Control描述

    s2_Control使用十六进制数据指定要解码的起始位位置和位数。

    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)结果所需的数据区域中的无效位填充0。

  • 解码数据的示例

    解码4位数据时,解码结果的16位数据如下所示。

    • 解码条件:s2_Control

    • 起始位位置0:16#0

    • 要解码的位编号:16#4(4位)

    要解码的数据(4位)

    解码结果

    十六进制

    十进制

    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)
  • 如果使用索引寄存器指定的区域超出限制。

  • 如果1 £ nL £ 8,其中nL是要编码/解码的位数。

  • 如果1 £ nH + nL £ 16,其中nH是转换开始位,nL是要编码/解码的位数。

  • 如果解码结果使用的存储器区域超出限制。

sys_bIsOperationErrorNonHold(对于一次扫描变为TRUE)
  • 如果使用索引寄存器指定的区域超出限制。

  • 如果1 £ nL £ 8,其中nL是要编码/解码的位数。

  • 如果1 £ nH + nL £ 16,其中nH是转换开始位,nL是要编码/解码的位数。

  • 如果解码结果使用的存储器区域超出限制。

示例

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本体

当变量bStart设置为TRUE时,执行此函数。

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-23此页面上的反馈松下热线