ModBus协议CRC16校验S7-SCL算法2:查表法
经过几天的测试,发现在FC中无法对数组进行初始化,而在FB中可以,所以就将这种算法写成FB了。
在定义时对数组的初始化这个事困扰了我好多天,后来发现初始化不能超过255个成员,可能是系统的限制吧。
下面是CRC功能模块源代码:
|
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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
FUNCTION_BLOCK FB17 CONST // Constants ARRAY_COUNT := 32; END_CONST VAR CRCHi: ARRAY [0..255] OF BYTE := [ // 不知道这里为什么只能初始化255个成员,系统限制吗? 16#00, 16#C1, 16#81, 16#40, 16#01, 16#C0, 16#80, 16#41, 16#01, 16#C0, 16#80, 16#41, 16#00, 16#C1, 16#81, 16#40, 16#01, 16#C0, 16#80, 16#41, 16#00, 16#C1, 16#81, 16#40, 16#00, 16#C1, 16#81, 16#40, 16#01, 16#C0, 16#80, 16#41, 16#01, 16#C0, 16#80, 16#41, 16#00, 16#C1, 16#81, 16#40, 16#00, 16#C1, 16#81, 16#40, 16#01, 16#C0, 16#80, 16#41, 16#00, 16#C1, 16#81, 16#40, 16#01, 16#C0, 16#80, 16#41, 16#01, 16#C0, 16#80, 16#41, 16#00, 16#C1, 16#81, 16#40, 16#01, 16#C0, 16#80, 16#41, 16#00, 16#C1, 16#81, 16#40, 16#00, 16#C1, 16#81, 16#40, 16#01, 16#C0, 16#80, 16#41, 16#00, 16#C1, 16#81, 16#40, 16#01, 16#C0, 16#80, 16#41, 16#01, 16#C0, 16#80, 16#41, 16#00, 16#C1, 16#81, 16#40, 16#00, 16#C1, 16#81, 16#40, 16#01, 16#C0, 16#80, 16#41, 16#01, 16#C0, 16#80, 16#41, 16#00, 16#C1, 16#81, 16#40, 16#01, 16#C0, 16#80, 16#41, 16#00, 16#C1, 16#81, 16#40, 16#00, 16#C1, 16#81, 16#40, 16#01, 16#C0, 16#80, 16#41, 16#01, 16#C0, 16#80, 16#41, 16#00, 16#C1, 16#81, 16#40, 16#00, 16#C1, 16#81, 16#40, 16#01, 16#C0, 16#80, 16#41, 16#00, 16#C1, 16#81, 16#40, 16#01, 16#C0, 16#80, 16#41, 16#01, 16#C0, 16#80, 16#41, 16#00, 16#C1, 16#81, 16#40, 16#00, 16#C1, 16#81, 16#40, 16#01, 16#C0, 16#80, 16#41, 16#01, 16#C0, 16#80, 16#41, 16#00, 16#C1, 16#81, 16#40, 16#01, 16#C0, 16#80, 16#41, 16#00, 16#C1, 16#81, 16#40, 16#00, 16#C1, 16#81, 16#40, 16#01, 16#C0, 16#80, 16#41, 16#00, 16#C1, 16#81, 16#40, 16#01, 16#C0, 16#80, 16#41, 16#01, 16#C0, 16#80, 16#41, 16#00, 16#C1, 16#81, 16#40, 16#01, 16#C0, 16#80, 16#41, 16#00, 16#C1, 16#81, 16#40, 16#00, 16#C1, 16#81, 16#40, 16#01, 16#C0, 16#80, 16#41, 16#01, 16#C0, 16#80, 16#41, 16#00, 16#C1, 16#81, 16#40, 16#00, 16#C1, 16#81, 16#40, 16#01, 16#C0, 16#80, 16#41, 16#00, 16#C1, 16#81, 16#40, 16#01, 16#C0, 16#80, 16#41, 16#01, 16#C0, 16#80, 16#41, 16#00, 16#C1, 16#81]; CRCLo: ARRAY [0..255] OF BYTE := [ 16#00, 16#C0, 16#C1, 16#01, 16#C3, 16#03, 16#02, 16#C2, 16#C6, 16#06, 16#07, 16#C7, 16#05, 16#C5, 16#C4, 16#04, 16#CC, 16#0C, 16#0D, 16#CD, 16#0F, 16#CF, 16#CE, 16#0E, 16#0A, 16#CA, 16#CB, 16#0B, 16#C9, 16#09, 16#08, 16#C8, 16#D8, 16#18, 16#19, 16#D9, 16#1B, 16#DB, 16#DA, 16#1A, 16#1E, 16#DE, 16#DF, 16#1F, 16#DD, 16#1D, 16#1C, 16#DC, 16#14, 16#D4, 16#D5, 16#15, 16#D7, 16#17, 16#16, 16#D6, 16#D2, 16#12, 16#13, 16#D3, 16#11, 16#D1, 16#D0, 16#10, 16#F0, 16#30, 16#31, 16#F1, 16#33, 16#F3, 16#F2, 16#32, 16#36, 16#F6, 16#F7, 16#37, 16#F5, 16#35, 16#34, 16#F4, 16#3C, 16#FC, 16#FD, 16#3D, 16#FF, 16#3F, 16#3E, 16#FE, 16#FA, 16#3A, 16#3B, 16#FB, 16#39, 16#F9, 16#F8, 16#38, 16#28, 16#E8, 16#E9, 16#29, 16#EB, 16#2B, 16#2A, 16#EA, 16#EE, 16#2E, 16#2F, 16#EF, 16#2D, 16#ED, 16#EC, 16#2C, 16#E4, 16#24, 16#25, 16#E5, 16#27, 16#E7, 16#E6, 16#26, 16#22, 16#E2, 16#E3, 16#23, 16#E1, 16#21, 16#20, 16#E0, 16#A0, 16#60, 16#61, 16#A1, 16#63, 16#A3, 16#A2, 16#62, 16#66, 16#A6, 16#A7, 16#67, 16#A5, 16#65, 16#64, 16#A4, 16#6C, 16#AC, 16#AD, 16#6D, 16#AF, 16#6F, 16#6E, 16#AE, 16#AA, 16#6A, 16#6B, 16#AB, 16#69, 16#A9, 16#A8, 16#68, 16#78, 16#B8, 16#B9, 16#79, 16#BB, 16#7B, 16#7A, 16#BA, 16#BE, 16#7E, 16#7F, 16#BF, 16#7D, 16#BD, 16#BC, 16#7C, 16#B4, 16#74, 16#75, 16#B5, 16#77, 16#B7, 16#B6, 16#76, 16#72, 16#B2, 16#B3, 16#73, 16#B1, 16#71, 16#70, 16#B0, 16#50, 16#90, 16#91, 16#51, 16#93, 16#53, 16#52, 16#92, 16#96, 16#56, 16#57, 16#97, 16#55, 16#95, 16#94, 16#54, 16#9C, 16#5C, 16#5D, 16#9D, 16#5F, 16#9F, 16#9E, 16#5E, 16#5A, 16#9A, 16#9B, 16#5B, 16#99, 16#59, 16#58, 16#98, 16#88, 16#48, 16#49, 16#89, 16#4B, 16#8B, 16#8A, 16#4A, 16#4E, 16#8E, 16#8F, 16#4F, 16#8D, 16#4D, 16#4C, 16#8C, 16#44, 16#84, 16#85, 16#45, 16#87, 16#47, 16#46, 16#86, 16#82, 16#42, 16#43, 16#83, 16#41, 16#81, 16#80]; END_VAR VAR_INPUT Byte_Array : ARRAY[0..ARRAY_COUNT-1] OF BYTE; Count : INT; END_VAR VAR_OUTPUT RESULT : WORD; END_VAR VAR_TEMP // Temporary Variables hi: BYTE; lo: BYTE; index,i,datalength: INT; END_VAR // Statement Section hi := 16#FF; lo := 16#FF; datalength := Count; i := 0; WHILE (datalength > 0) DO index := BYTE_TO_INT(hi XOR Byte_Array[i]); i := i + 1; hi := lo XOR crchi[index]; lo := crclo[index]; datalength := datalength - 1; END_WHILE; RESULT := hi; RESULT := SHL(IN := RESULT, N:= 8) OR lo; END_FUNCTION_BLOCK DATA_BLOCK DB17 FB17 // // Block Comment... // BEGIN // 数组定义时只让初始化255个,剩下的一个只能在这初始化了 CRCLo[255] := 16#40; CRCHi[255] := 16#40; END_DATA_BLOCK |
调用代码如下:
|
1 2 3 4 5 6 |
dd[0] := 16#31;dd[1] := 16#32;dd[2] := 16#33;dd[3] := 16#34;dd[3] := 16#35; FB17.DB17(Byte_Array := DD // IN: ARRAY ,Count := 5 // IN: INT ); MW112 := DB17.RESULT; // OUT: WORD |
找了好久就是要灵图天行者
找了好久呀 我要灵图天行者
博主的知识真是渊博!
写的很好,支持