编码位状态 -> 十六进制
如果触发器EN为TRUE,此FP指令将根据s2_Control的内容对由s1_Start指定的数据内容进行编码。编码结果存储在以指定位位置开头的d_Start指定的16位目标区域。对编码结果指定的区域中的无效位将填充零。
FP_ENCODE是FP_DECODE的反向指令。
输入
要编码的起始16位区域(源)
用于指定要编码的起始位位置和位编号的控制数据
输出
用于存储编码数据的16位区域(目标)
变量s1_Start、s2_Control和d_Start必须为相同的数据类型。
示例,其中s2_Control=16#0005
16# |
0 |
0 |
0 |
5 |
|
↑ |
↑ |
要编码的位数: 25=32位 |
|||
要编码的数据的起始位位置:位位置0 |
当触发器EN为TRUE时,解码结果8(十进制)存储在d_Start中。
过程描述
s1_Start指定区域开头2^nL位段的内容将被编码(nL是指要编码的位编号)。
编码结果作为十进制数据存储在从指定为nH位的位开始的8个位中(nH是指转换起始位)。结果指定区域中的无效位将填充零。
s2_Control的描述
s2_Control使用十六进制数据指定要编码的目标数据的起始位位置和位数。
标记"-"的位无效。 |
|||||
设置值 16#0–16#F |
(3) 编码目标数据的起始位位置 |
设置值 16#0–16#8 |
(4) 编码位编号 |
||
16#0 |
0 |
16#1 |
2 |
||
16#1 |
1 |
16#2 |
4 |
||
16#2 |
2 |
16#3 |
8(1字节) |
||
16#3 |
3 |
16#4 |
16(1个字) |
||
16#4 |
4 |
16#5 |
32(2个字) |
||
16#5 |
5 |
16#6 |
64(4个字) |
||
16#6 |
6 |
16#7 |
128(8个字) |
||
16#7 |
7 |
16#8 |
256(16个字) |
||
16#8 |
8 |
||||
16#9 |
9 |
||||
16#A |
10 |
||||
16#B |
11 |
||||
16#C |
12 |
||||
16#D |
13 |
||||
16#E |
14 |
||||
16#F |
15 |
编码示例
编码16位数据(nL=4)时,编码结果如下所示。
要编码的数据(4位) |
编码结果 |
|
---|---|---|
十六进制 |
十进制 |
|
0000 0000 0000 0001 |
16#0000 |
0 |
0000 0000 0000 0010 |
16#0001 |
1 |
0000 0000 0000 0100 |
16#0010 |
2 |
0000 0000 0000 1000 |
16#0011 |
3 |
0000 0000 0001 0000 |
16#0100 |
4 |
0000 0000 0010 0000 |
16#0101 |
5 |
0000 0000 0100 0000 |
16#0110 |
6 |
0000 0000 1000 0000 |
16#0111 |
7 |
0000 0001 0000 0000 |
16#1000 |
8 |
0000 0010 0000 0000 |
16#1001 |
9 |
0000 0100 0000 0000 |
16#1010 |
10 |
0000 1000 0000 0000 |
16#1011 |
11 |
0001 0000 0000 0000 |
16#1100 |
12 |
0010 0000 0000 0000 |
16#1101 |
13 |
0100 0000 0000 0000 |
16#1110 |
14 |
1000 0000 0000 0000 |
16#1111 |
15 |
如果使用索引寄存器指定的区域超出限制。
如果1 £ nL £ 8,其中nL是要编码/解码的位数。
如果1 £ nH + nL £ 16,其中nH是转换开始位,nL是要编码/解码的位数。
如果要编码的数据全部为0。
如果使用索引寄存器指定的区域超出限制。
如果1 £ nL £ 8,其中nL是要编码/解码的位数。
如果1 £ nH + nL £ 16,其中nH是转换开始位,nL是要编码/解码的位数。
如果要编码的数据全部为0。
所有用于编程此函数的输入和输出变量已在POU头中声明。 所有编程语言使用相同的POU头。
VAR
bStart: BOOL:=FALSE;
(*activates the function*)
wInput_value: WORD:=2#0000000001000000;
wControlCode: WORD:=16#0003;
(*specifies the encodation*)
wOutput_value: WORD:=0;
(*result after a 0->1 leading
edge from start:
2#0000000000000110*)
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 := 5 ;
NETWORK_BODY
B(B_CONTACT,,bStart,6,1,8,3,);
B(B_VARIN,,wInput_value,10,2,12,4,);
B(B_VARIN,,wControlCode,10,3,12,5,);
B(B_VAROUT,,wOutput_value,20,2,22,4,);
B(B_F,FP_ENCODE!,,12,0,20,5,,?DEN?Ds1_Start?Ds2_Control?AENO?Cd_Start);
L(1,2,6,2);
L(8,2,12,2);
L(1,0,1,5);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF bStart then
FP_ENCODE(s1_Start := wInput_value,
s2_Control := wControlCode,
d_Start => wOutput_value);
END_IF;