解码十六进制 -> 位状态
如果触发器EN设置为TRUE,此FP指令将根据s2_Control的内容解码由s1_Start指定的数据内容。解码结果存储在从d_Start开始的区域中。
FP_DECODE是FP_ENCODE的反向指令。
输入
要解码的源区域或等效常量
用于指定要解码的起始位位置和位数的控制数据
输出
存储解码数据的起始地址(目标)
变量s1_Start、s2_Control和d_Start必须为相同的数据类型。
示例 s2_Control=16#404
在d_Start的位位置7存储解码数据TRUE。
除7位之外的所有位填充0。
s1_Start指定区域的nH位开始的2^nL位段的内容将被解码(nL是要解码的位数)。
解码后的结果存储在从d_Start指定的区域开始的2^nL位段中(nH是指转换起始位)。结果指定区域中的无效位将填充零。
s2_Control的描述
s2_Control使用十六进制数据指定要解码的起始位位置和位数。
标记"-"的位无效。 |
|||||
设置值 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 |
如果使用索引寄存器指定的区域超出限制。
如果1 £ nL £ 8,其中nL是要编码/解码的位数。
如果1 £ nH + nL £ 16,其中nH是转换开始位,nL是要编码/解码的位数。
如果解码结果使用的存储器区域超出限制。
如果使用索引寄存器指定的区域超出限制。
如果1 £ nL £ 8,其中nL是要编码/解码的位数。
如果1 £ nH + nL £ 16,其中nH是转换开始位,nL是要编码/解码的位数。
如果解码结果使用的存储器区域超出限制。
所有用于编程此函数的输入和输出变量已在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;