CRC16

循环冗余校验

此函数通过使用参数NumberOfBytes指定的n个字节(8位)和起始地址StartAddress,计算所有PLC类型的CRC16(循环冗余校验)。

参数

输入

StartAddress (BOOL, INT, UINT, WORD, DINT, UDINT, DWORD, REAL, DATE, TOD, DT, STRING)

校验和计算的起始地址。对于不支持通过CRC16计算的指令F70_BCC的PLC(FP0, FP5, FP10),起始地址必须在DTFL区域内。

NumberOfBytes (INT)

StartAddress开始的字节数(8位),在其上执行CRC16计算。

输出

CRC (WORD, INT, UINT)

计算的校验和,仅在标志IsValid设置为TRUE时有效。

IsValid (BOOL)

指示计算的校验和是否有效的标志。

对于不支持通过CRC16计算的指令F70_BCC的PLC(FP0, FP5, FP10),CRC在以下情况下无效:

  • 在建立内部表时的前八次执行扫描期间

  • 如果变量StartAddress的地址区域不在DTFL区域内。

对于支持通过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必须为一个在DTFL区域内的地址。

注释
  • CRC16用作子程序时,步数可最多增加到约200。

  • 编程时,请注意建立内部表并计算校验和需要一定时间,尤其是对于大数据量。

示例

POU头

所有用于编程此函数的输入和输出变量已在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

LD本体

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

ST本体

CRC16(StartAddress := Array1, 
        NumberOfBytes := ARRAY1_BYTES, 
        CRC => Array1Crc, 
        IsValid => CrcIsvalid);

最后更新日期: 此页面上的反馈松下热线