块校验码计算
根据s1_Control指定的计算方法,从s2_Start指定的16位区域开始计算ASCII数据的s3_Number个字节的块校验字符(BCC),其用于检测信息发送中的错误。块校验码(BCC)存储在以d指定的16位区域的较低字节中。(BCC为一个字节。d的较高字节不变。)
输入
指定BCC计算方法:
0:加法(SYS_BCC_CALCULATION_METHOD_ADD)
1:减法(SYS_BCC_CALCULATION_METHOD_SUB)
2:异或(SYS_BCC_CALCULATION_METHOD_XOR)
16#A:CRC-16 (SYS_BCC_CALCULATION_METHOD_CRC16)
计算BCC的起始16位区域
指定BCC计算的字节数
输出
用于存储BCC的16位区域
建议使用相应的FP7指令,来代替使用此F型指令:FP_CRC、FP_BCC
指定控制代码s1_Control
0:加法(SYS_BCC_CALCULATION_METHOD_ADD)
1:减法(SYS_BCC_CALCULATION_METHOD_SUB)
2:异或(SYS_BCC_CALCULATION_METHOD_XOR)
16#A:CRC-16 (SYS_BCC_CALCULATION_METHOD_CRC16)
0–F
如果指定CRC-16作为计算方法,则无法为转换数据指定ASCII代码。
如果目标数据的指定字节数超出指定数据区域的限制。
如果目标数据的指定字节数超出指定数据区域的限制。
所有用于编程此函数的输入和输出变量已在POU头中声明。 所有编程语言使用相同的POU头。
VAR
Start: BOOL:=FALSE;
(*activates the function*)
BCC_Calc_Method: INT:=2;
ASCII_String: STRING[32]:='%01#RCSX0000';
(*specifies the operation:
0: addition
1: subtraction
2:XOR*)
BCC: WORD:=0;
(*result after a 0->1 leading
edge from start: 10#172*)
END_VAR
当Start变为TRUE时,将在ASCII_String上执行块校验字符计算。计算方法为异或。(当发送大量数据时,使用此方法)。
如何使用异或运算计算BCC:
bvar_1 |
bvar_2 |
bvar_3 |
|
0 |
0 |
0 |
|
0 |
1 |
1 |
|
1 |
0 |
1 |
|
1 |
1 |
0 |
前两个字符的ASCII二进制代码位相互比较,得出8字符异或运算结果:
比较符号 |
ASCII二进制代码 |
% |
00100101 |
0 |
00110000 |
异或结果 |
00010101 |
然后将此结果与下一个字符的ASCII二进制代码(即"1")进行比较。
比较符号 |
ASCII二进制代码 |
异或结果 |
00010101 |
1 |
00110001 |
下一个异或 |
00100100 |
以此类推,直至到达最终字符。
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 11 ;
NETWORK_BODY
B(B_F,F70_BCC!,Instance,26,1,34,7,,?DEN?Ds1_Control?Ds2_Start?Ds3_Number?AENO?Cd);
B(B_CONTACT,,Start,3,2,5,4,);
B(B_VARIN,,BCC_Calc_Method,24,3,26,5,);
B(B_F,Adr_Of_VarOffs_I!,Instance,16,5,25,9,,?D@'Var'?DOffs?CAdr);
B(B_VAROUT,,BCC,34,3,36,5,);
B(B_VARIN,,ASCII_String,11,4,13,6,);
B(B_VARIN,,2,14,7,16,9,);
B(B_F,LEN!,Instance,16,8,21,11,,?DIN?C);
L(16,5,16,7);
L(13,5,16,5);
L(13,5,13,10);
L(13,10,16,10);
L(25,5,25,7);
L(25,5,26,5);
L(26,6,26,10);
L(21,10,26,10);
L(5,3,26,3);
L(1,3,3,3);
L(1,0,1,11);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF start then
F70_BCC( s1_Control:= BCC_Calc_Methode,
s2_Start:= Adr_Of_VarOffs( Var:= ASCII_String,
Offs:= 2),
s3_Number:= LEN( ASCII_String),
d=> BCC);
END_IF;