我正在研究PLC和第三方设备之间的通信命令协议。
制造商向我提供了以下信息,用于计算CRC值,该值将根据我希望从中读取信息的设备的地址而变化。
A CRC is performed on a block of data, for example the first seven bytes of all transmissions are followed by a two byte CRC for that data. This CRC will be virtually unique for that particular combination of bytes. The process of calculating the CRC follows:
Inputs:
N.BYTES = Number or data bytes to CRC ( maximum 64 bytes )
DATA() = An array of data bytes of quantity N.BYTES
CRC.MASK = 0xC9DA a hexadecimal constant used in the process
Outputs:
CRC = two byte code redundancy check made up of CRC1 (High byte) and CRC2 (Low byte)
Process:
START
CRC = 0xFFFF
FOR N = 1 TO N.BYTES
CRC = CRC XOR ( DATA(N) AND 0xFF )
FOR I = 1 TO 8
IF ( CRC AND 0x0001 ) = 0 THEN LSR CRC
ELSE LSR CRC ; CRC = CRC XOR CRC.MASK
NEXT I
NEXT N
X = CRC1 ; Change the two bytes in CRC around
CRC1 = CRC2
CRC2 = X
END他们还为我提供了两个完整的命令字符串,用于前几个设备地址。
RTU #1
05-64-00-02-10-01-00-6C-4B-53-45-EB-F7
RTU #2
05-64-00-02-10-02-00-1C-AE-53-45-EB-F7
RTU #3
05-64-00-02-10-03-00-CC-F2-53-45-EB-F7前三个命令中的头部CRC字节分别为6C-4B、1C-AE和CC-F2。
当我用Python写出下面的代码时,我手工计算出了前几行代码,以便进行比较。
byte1 = 05
byte2 = 100
byte3 = 00
byte4 = 02
byte5 = 16
byte6 = 01
byte7 = 00
byte8 = 00
mask = 51674
hexarray = [byte1, byte2, byte3, byte4, byte5, byte6, byte7, byte8]
#print hexarray
CRCdata = 65535
for n in hexarray:
CRCdata = CRCdata ^ (n & 255)
print(n, CRCdata)
for i in range(1,8):
if (CRCdata & 1) == 0:
CRCdata = CRCdata >> 1
# print 'if'
else:
CRCdata = CRCdata >> 1
CRCdata = CRCdata ^ mask
# print 'else'
print(i, CRCdata)
print CRCdata我添加了byte8,因为我做了一些研究,提到需要在CRC数组的末尾添加一个额外的0字节来进行计算。我手动转换了最终结果并进行了字节交换。我遇到的问题是,我的CRC计算,无论我是否保留byte8,都与提供的三个示例中的任何一个都不匹配。
我不太确定我在这方面做错了什么,任何帮助都将不胜感激。
发布于 2020-12-01 06:02:04
我能够通过将代码更新为range(0,8)并删除byte8来解决这个问题。
https://stackoverflow.com/questions/65081214
复制相似问题