ModBus协议CRC16校验S7-SCL算法
算法源代码:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
FUNCTION FC16 : WORD // // ModBus CRC16算法 // www.tansoo.cn CONST // Constants ARRAY_COUNT := 32; END_CONST VAR_INPUT Byte_Array : ARRAY[0..ARRAY_COUNT-1] OF BYTE; Count : INT; END_VAR VAR_TEMP CRC16Lo, CRC16Hi, CL, CH, UseHi, UseLo: WORD; i, index: INT; END_VAR CRC16Lo := 16#FF; //CRC16Lo为CRC寄存器低8位 CRC16Hi := 16#FF; //CRC16Hi为CRC寄存器高8位 CL := 16#01; CH := 16#A0; // A001 H 是CRC-16多项式代码 FOR i := 0 TO Count-1 DO CRC16Lo := CRC16Lo XOR Byte_Array[i]; //每一个数据与CRC寄存器异或 FOR index := 0 TO 7 DO UseHi := CRC16Hi; UseLo := CRC16Lo; CRC16Hi := SHR (IN:=CRC16Hi, N:=1); CRC16Lo := SHR (IN:=CRC16Lo, N:=1); //右移一位 IF ((UseHi AND 16#1) = 16#1) THEN //如果高位字节最后一位是1的话 CRC16Lo := CRC16Lo OR 16#80; //低位字节右移后前面补1 END_IF; IF ((UseLo AND 16#1) = 16#1) THEN //如果LSB 为1,则与多项式进行异或 CRC16Hi := CRC16Hi XOR CH; CRC16Lo := CRC16Lo XOR CL; END_IF; END_FOR; END_FOR; FC016 := SHL(IN:=CRC16Lo, N:=8) OR CRC16Hi; END_FUNCTION |
调用方法:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
ORGANIZATION_BLOCK CYCLE VAR_TEMP systemdata : ARRAY[0..20] OF BYTE; //OB1专用区 DD : ARRAY[0..31] OF BYTE; END_VAR BEGIN dd[0] := 16#31; dd[1] := 16#32; dd[2] := 16#33; dd[3] := 16#34; MW110 := FC16(Byte_Array := DD // IN: ARRAY ,Count := 4 // IN: INT ); // WORD END_ORGANIZATION_BLOCK |