我试图了解一台旧机器 (PLC) 如何在其数据交换中生成校验字节,但我无法弄清楚是做什么的以及如何完成的,或者正在使用哪种算法。
关于机器的文档非常稀少,我已经尝试了一些算法,如普通 crc、ccitt crc、xmodem crc 类型...但没有人给出正确的结果。
消息是这样构成的: M*NNNNNNwwSSdd
哪里:
M* - 是固定的
NNNNNN - N 是数字或空格
ww - w 也是数字或空格
SS - S 是一个字符或空格
dd - d 数字或空格
一些示例生成以下字节检查(其中 de byte '×' 实际上是空格字符 ' ',我使用此字符只是为了更容易识别空格数):
一个:
- M*614976××××12 -> 一个
- M*615138×××××× -> 一个
b:
- M*615028××××12 -> b
- M*615108×××××× -> b
c:
- M*614933×××××× -> c
- M*614956××××12 -> c
d:
- M*614934×××××× -> d
- M*614951××××12 -> d
是:
- M*614942×××××× -> e
- M*615079×××××× -> e
:
- M*614719××××12 -> f
- M*614936×××××× -> f
克:
- M*614718××××12 -> g
- M*614937×××××× -> g
:
- M*614727×××××× -> h
- M*614980××××12 -> h
我:
- M*614734××××12 -> i
- M*614939×××××× -> 我
- M*×××××××××××× -> 我
z:
- M*××××××××SC12 -> z
j:
- M*××××××××××12 -> j
是:
- M*××××××××SC×× -> y
还有更多的组合,但这些就足够了。
另一个特殊性是检查字节结果只存在于一个定义的范围内——从 char 0x60 到 0x7F 不多(当前的解决方案是有效的,因为我在这个范围内循环,直到机器给我一个 ok)
那么我的问题是,你知道这个校验字节是怎么计算出来的吗?你能给我一些更简单的算法来计算 PLC 机器中数据的完整性吗,结果字节检查只有一个字符一定更简单。
谢谢
最佳答案
在我看来,如果我将消息中的所有字符异或在一起,将它们视为 ascii 并将您的奇数 quasi-x 替换为空格,然后在 0xe 中异或,我将得到校验和中的字符。至少我建议您构建一个表,显示消息中所有字符的异或,以及写为十六进制的校验和字符。考虑到 www.bttautomatyka.com.pl/pdf/HA466357.pdf 中描述的 block 检查
(我实际上已经编写了一个 mod-2 方程求解器并打算寻找 5 位 CRC,当它弹出时!)
关于algorithm - PLC 校验字节未知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8050315/