循环冗余校验
此函数通过使用参数NumberOfBytes指定的n个字节(8位)和起始地址StartAddress,计算所有PLC类型的CRC16(循环冗余校验)。
输入
校验和计算的起始地址。对于不支持通过CRC16计算的指令F70_BCC的PLC(FP0, FP5, FP10),起始地址必须在DT或FL区域内。
以StartAddress开始的字节数(8位),在其上执行CRC16计算。
输出
计算的校验和,仅在标志IsValid设置为TRUE时有效。
指示计算的校验和是否有效的标志。
对于不支持通过CRC16计算的指令F70_BCC的PLC(FP0, FP5, FP10),CRC在以下情况下无效:
在建立内部表时的前八次执行扫描期间
如果变量StartAddress的地址区域不在DT或FL区域内。
对于支持通过CRC16计算的指令F70_BCC的PLC,CRC始终有效。
建议使用相应的FP7指令,来代替使用此F型指令:FP_CRC 循环冗余校验
视PLC类型而定,将使用函数的以下两种实现方式之一:
对于支持通过参数s1=10计算CRC16的指令F70_BCC的PLC(FP-e, FP-Sigma, FP2, FP2SH, FP10SH),直接使用F70_BCC。
对于其他PLC(FP0, FP0R, FP3, FP5, FP10),调用进行显式CRC16计算的子程序。以下限制适用于该子程序:
在建立内部表时的前八次执行扫描期间。在此期间,不计算校验和,且输出IsValid保持为FALSE。之后,计算校验和,且输出IsValid设置为TRUE。
StartAddress必须为一个在DT或FL区域内的地址。
当CRC16用作子程序时,步数可最多增加到约200。
编程时,请注意建立内部表并计算校验和需要一定时间,尤其是对于大数据量。
所有用于编程此函数的输入和输出变量已在POU头中声明。 所有编程语言使用相同的POU头。
VAR
Array1: ARRAY [0..10] OF INT:=[0,1,2,3,4,5,6,7,8,9,10];
ARRAY1_BYTES: INT:=22;
Array1Crc: WORD:=0;
CrcIsvalid: BOOL:=FALSE;
END_VAR
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_F,CRC16!,Instance,10,0,21,4,,?DStartAddress?DNumberOfBytes?CCRC?CIsValid);
B(B_VARIN,,Array1,8,1,10,3,);
B(B_VARIN,,ARRAY1_BYTES,8,2,10,4,);
B(B_VAROUT,,Array1Crc,21,1,23,3,);
B(B_VAROUT,,CrcIsvalid,21,2,23,4,);
L(1,0,1,5);
END_NETWORK_BODY
END_NET_WORK
END_BODY
CRC16(StartAddress := Array1,
NumberOfBytes := ARRAY1_BYTES,
CRC => Array1Crc,
IsValid => CrcIsvalid);