algorithm - PLC 校验字节未知

标签 algorithm hash crc plc

我试图了解一台旧机器 (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/

相关文章:

java - 将 int 转换为 string 减少了计算其长度的时间复杂度

algorithm - 将增长率从慢到快排序

c# - 让算法更高效

java SecretKeyFactory 密码哈希无法正常工作

c - C 的最终 CRC

c# - 什么是双向链表的测试最佳排序算法

ruby - 为什么我不能从 ruby​​ 中的选定键创建新的散列?

javascript - JavaScript 中的通用 2D 哈希?

hash - 什么时候使用 CRC 比 MD5/SHA1 更合适?

Java执行crc检查(将bytearray除以bytearray)