- 1. 一、Fehler.检测的三层架构
- 2. 二、Charaktere层:奇Zufällige Prüfungen
- 3. 2.1 原理
- 4. 2.2 BerechnungBeispiel
- 5. 2.3 奇Zufällige Prüfungen的局限
- 6. 三、帧层(一):LRC Prüfungen —— Modbus ASCII 模式
- 7. 3.1 LRC Was ist das?
- 8. 3.2 Modbus ASCII 帧结构
- 9. 3.3 LRC 算法
- 10. 3.4 LRC 的 C 语言实现
- 11. 3.5 LRC 的局限
- 12. 四、帧层(二):CRC-16 Prüfungen —— Modbus RTU 模式
- 13. 4.1 CRC-16 Modbus 的数学定义
- 14. 4.2 CRC-16 Modbus 算法流程(逐位Berechnung法)
- 15. 4.3 CRC-16 Modbus C 语言实现
- 16. 4.4 查表法 —— EingebettetAusrüstung上的标准实现
- 17. 4.5 验证你的 CRC 实现
- 18. 4.6 CRC 的检错能力
- 19. 五、应用层:Ungewöhnliche Reaktion码
- 20. 5.1 Ungewöhnliche Reaktion的帧Das Format
- 21. 5.2 标准Ungewöhnlicher Code速查表
- 22. 5.3 Ungewöhnlicher Code的实际Tests用法
- 23. 六、超时机制:Hauptstation的最后一道防线
- 24. 七、vollständig排障流程
Quelle:Modbus Chinesisches Netzwerk(modbus.cn) —— Inländisch führend.ModbusKommunikationsprotokoll Technologie Gemeinschaft
本文:Modbus 通讯Fehler.的检测与诊断:从奇Zufällige PrüfungenzuUngewöhnlicher Code的vollständig体系 · Der Autor:Technisches Team von Modbus · 发布于 2026-07-01
摘要:Das Modbus-Protokoll的Fehler.检测Unterteilung为三个层次——Charaktere级的奇Zufällige Prüfungen、帧级的 LRC/CRC-Prüfung、以及应用层的Ungewöhnliche Reaktion码和超时机制。本文逐一拆解每种检测方式的工作原理、算法实现(含可Betrieb的 C/Python 代码)和实际Tests用途,并给出vollständig的Ungewöhnlicher Code速查表和排障流程。关键词:Modbus CRC、LRC Prüfungen、奇Zufällige Prüfungen、Modbus Ungewöhnlicher Code、Modbus Fehler.检测、CRC16 Modbus。
在 RS-485 总线上传输一个 Modbus 帧,就像在嘈杂的车间里喊话——喊出去的是 01 03 00 00 00 01,对端收zu的可能变成了 01 03 00 00 00 03。一个比特翻转,Temperatur读数就从 25°C 变成 26°C,或者某台阀门「为什么不动」的原因就埋在这里。
Modbus 从 1979 Jahr诞生就带着一套Unterteilung层Fehler.检测机制:每个Charaktere用奇Zufällige Prüfungen挡住比特Fehler.,整帧Daten用 CRC(RTU 模式)或 LRC(ASCII 模式)兜底,应用层再通过Ungewöhnliche Reaktion码告诉Hauptstation「你的Bitte有问题」。这三层机制配合超时重发策略,构成了 Modbus 在Industrie-Standort存活近五十Jahr不倒的可靠性基础。
坦率说,Modbus 的Fehler.检测不是密码学级别的——CRC16 不能防篡改,LRC 对连续偶数位Fehler.可能漏检。但在一个 9600bps、几十米 RS-485 总线的物理环境下,这些机制已经够用了。它们的价值不在于理论完美,而在于实现简单、Berechnung开销低——一个 8 位单片机用不zu 100 Bytes的代码就能abgeschlossen. CRC16 Berechnung。
一、Fehler.检测的三层架构
Modbus 串行Kommunikation的Fehler.检测Unterteilung成三个层级,从上zu下覆盖整个Kommunikation栈:
应用层:Ungewöhnliche Reaktion码 + 超时重发
↓
帧层 :CRC-16(RTU)或 LRC(ASCII)
↓
Charaktere层:奇Zufällige Prüfungen(Even/Odd/None)
Charaktere层保护每个Bytes的传输Richtig.性——一个 UART 帧里的 8 个Datenplatz加上一个Prüfstand.,硬件自动abgeschlossen.Prüfungen。
帧层保护整条 Modbus 消息的vollständig性——von der Station Adressezu最后一个DatenBytes,Alles参与Berechnung。如果帧Prüfungen不通过,从Ausrüstung静默丢弃这条消息,不回复任何内容。
应用层处理「物理层没问题,但逻辑上有问题」的情况——比如你Bitte的FunktionscodeAusrüstung不支持、Register-Adressenicht existiert.、Daten值超出范围。这些Fehler.通过Ungewöhnliche Reaktion码告知Hauptstation。
三层各司其职,但Tests的时候工程师更容易看zu应用层的Ungewöhnlicher Code,而忽略了物理层的奇Zufällige PrüfungenFehler.——因为奇Zufällige PrüfungenFehler.在从Ausrüstung硬件层面就被丢弃了,你根本看不zu。
二、Charaktere层:奇Zufällige Prüfungen
2.1 原理
奇Zufällige Prüfungen是在每个 UART Charaktere帧中附加一个Prüfstand.,使得整个帧中「1」的总数为奇数(Seltsame Tests,Odd)或偶数(Zufällige Prüfungen,Even)。
Modbus 的Charaktere帧定义因模式而异:
| 模式 | Anfang位 | Datenplatz | Prüfstand. | Stoppen Sie Platz | 总位数 |
|---|---|---|---|---|---|
| RTU(有Prüfungen) | 1 | 8 | 1 | 1 | 11 |
| RTU(无Prüfungen) | 1 | 8 | 0 | 2 | 11 |
| ASCII | 1 | 7 | 1 | 1 | 10 |
注意 RTU 无Prüfungen时用 2 个Stoppen Sie Platz来凑总位数——这是硬性要求,很多人在配置Serienparameter时选了 No Parity 但忘了把Stoppen Sie Platz从 1 改成 2,ErgebnisKommunikation不稳定但又不至于完全不通,非常难查。
2.2 BerechnungBeispiel
取一个Bytes:11000101。Von denen 1 的个数是 4(偶数)。
- Zufällige Prüfungen → Prüfstand. = 0,保持 1 的总数为偶数(4 个)
- Seltsame Tests → Prüfstand. = 1,使 1 的总数为奇数(5 个)
硬件 UART 在Senden Sie时自动Berechnung并填入Prüfstand.,Empfang时自动Prüfungen。如果Empfang端Prüfungen不通过,UART 硬件会标记一个奇Zufällige PrüfungenFehler.(Parity Error),但不会自动丢弃Daten——要不要丢弃由软件决定。
2.3 奇Zufällige Prüfungen的局限
奇Zufällige Prüfungen只能检测奇数个比特Fehler.。如果传输中恰好翻转了 2 个比特,奇偶性不变,Prüfungen通过,但Daten已经错了。在 RS-485 上,电磁干扰导致单比特翻转的概率远高于多比特同时翻转,所以奇Zufällige Prüfungen在实际中还是有用的——但它绝不是万能的。
Tests建议:如果你怀疑线路质Quantität有问题,用逻辑Unterteilung析仪抓 UART 帧看每个Charaktere的奇Zufällige PrüfungenFehler.标记。Die SerieAssistenten.(如 SSCOM)可以显示奇偶Fehler.次数,这个计数器如果一直在涨,说明你的物理线路有电磁干扰问题——可能是电缆不屏蔽、和变频器走zu一个桥架里了、或者终端电阻没接导致信Nr.反射。
三、帧层(一):LRC Prüfungen —— Modbus ASCII 模式
3.1 LRC Was ist das?
纵向冗余Prüfungen(Longitudinal Redundancy Check,LRC)是 Modbus ASCII 模式使用的帧Prüfungen算法。它是一个 8 位(1 Byte)的Prüfcode,位于帧的末尾,Prüfungen范围是von der Station AdressezuDatenzone的所有Bytes,不包括帧头(冒Nr. :)和帧尾(回车换行符 CR/LF)。
3.2 Modbus ASCII 帧结构
: 01 03 21 02 00 02 D7 CR LF
│ └─────────┬────────────┘ │
帧头 LRC Prüfungen范围 LRC码
一个vollständig的 Modbus ASCII BitteFrame:
:0103020002F8rn
3.3 LRC 算法
算法极其简单——三步:
- 将Adresse码zuDatenzone的所有Bytes相加求和
- 取和的低 8 位(模 256)
- 取其补码(256 减去这个值,或者按位取反后加 1)
Beispiel:Meldung : 01 03 21 02 00 02
求和:0x01 + 0x03 + 0x21 + 0x02 + 0x00 + 0x02 = 0x29
低 8 位:0x29
补码:256 - 0x29 = 0xD7
LRC Prüfcode = D7
vollständig帧为:: 01 03 21 02 00 02 D7 rn
3.4 LRC 的 C 语言实现
/**
* Berechnung Modbus ASCII LRC Prüfcode
* buf: 需要Prüfungen的Daten(从Adresse码zuDatenzone的所有Bytes)
* len: Anzahl der Bytes
* 返回值: 1 Byte LRC Prüfcode
*/
unsigned char LRC(unsigned char *buf, unsigned short len)
{
unsigned char lrc = 0;
while (len--) {
lrc += *buf++;
}
// 取补码:256 - lrc,等效于 (-lrc)
return (unsigned char)(-lrc);
}
用 Python 验证:
def calc_lrc(data: bytes) -> int:
"""Berechnung Modbus ASCII LRC Prüfcode"""
return (256 - (sum(data) & 0xFF)) & 0xFF
# 测试
msg = bytes([0x01, 0x03, 0x21, 0x02, 0x00, 0x02])
lrc = calc_lrc(msg)
print(f"LRC: 0x{lrc:02X}") # 输出: LRC: 0xD7
3.5 LRC 的局限
LRC 只能检测zu一定比例的Fehler.。如果两个Bytes的同一个比特位同时翻转(比如Bytes A 的Die 3 位从 0 变 1,Bytes B 的Die 3 位从 1 变 0),求和Ergebnis不变,LRC Prüfungen通过。这也是为什么 Modbus RTU 使用更强的 CRC-16 而不是 LRC——RTU 模式用于BinärsystemDaten传输,对可靠性要求更高,而 ASCII 模式主要用于Tests和兼容老Ausrüstung。
四、帧层(二):CRC-16 Prüfungen —— Modbus RTU 模式
4.1 CRC-16 Modbus 的数学定义
Modbus RTU 使用 CRC - 16 - Algorithmus,Parameter如下:
| Parameter | Wert |
|---|---|
| 宽度 | 16 位 |
| 生成多项式 | 0x8005(x¹⁶ + x¹⁵ + x² + 1) |
| 实际运算多项式 | 0xA001(0x8005 位反转形式) |
| 初始值 | 0xFFFF |
| 输入Bytes反射 | 否 |
| 输出 CRC 反射 | 是(最终Ergebnis高低Bytes交换) |
| 输出Unterschiedlich oder值 | 0x0000 |
这里的「位反转」是 CRC Parameter体系中很容易搞混的概念。Modbus 的Berechnung实际上是按位处理的、从 LSB 方向移位,使用反转多项式 0xA001,Berechnungsergebnisse自然就是反转的——所以最终不需要再做一次全局反转,只需要高低Bytes交换。Senden Sie时低Bytes在前,hohe Bytes在后。
4.2 CRC-16 Modbus 算法流程(逐位Berechnung法)
逐位Berechnung虽然慢,但能让人看清每一步发生了什么:
- 预置 16 位 CRC Register.为
0xFFFF - 将Meldung的Die一个Bytes与 CRC Register.的低 8 位Unterschiedlich oder,Ergebnis存回 CRC Register.
- CRC Register.右移 1 位,最高位补 0,检查移出的最低位
- 移出位 = 1 → CRC Register.与 0xA001 Unterschiedlich oder;移出位 = 0 → 不做Operationen
- 重复步骤 3~4,共 8 次(处理完一个Bytes的 8 个位)
- 重复步骤 2~5,处理Meldung中下一个Bytes
- 所有Bytes处理abgeschlossen.后,CRC Register.的低Bytes在前、hohe Bytes在后,即为 CRC-16 Prüfcode
4.3 CRC-16 Modbus C 语言实现
/**
* Berechnung Modbus RTU CRC-16 Prüfcode(逐位Berechnung法)
* buf: 需要Prüfungen的Daten(从Adresse码zuDatenzone的所有Bytes)
* len: Anzahl der Bytes
* 返回值: 16 位 CRC 值(低Bytes在前)
*/
unsigned short CRC16_Modbus(unsigned char *buf, unsigned short len)
{
unsigned short crc = 0xFFFF;
unsigned short i, j;
for (i = 0; i < len; i++) {
crc ^= buf[i]; // 步骤 2
for (j = 0; j < 8; j++) { // 步骤 3~5 循环 8 次
if (crc & 0x0001) {
crc = (crc >> 1) ^ 0xA001; // 移出位为 1
} else {
crc >>= 1; // 移出位为 0
}
}
}
// 注意:Modbus CRC Senden Sie时低Bytes在前
return crc;
}
4.4 查表法 —— EingebettetAusrüstung上的标准实现
逐位Berechnung每个Bytes要做 8 次循环,对Eingebettet MCU 开销太大。工程上用的是查表法,预先Berechnung 256 个Bytes的 CRC 值,每Bytes只做一次查表 + 一次Unterschiedlich oder + 一次移位。
高位表查表法(am häufigsten verwendet):
/* CRC hoch位表 */
static const unsigned char auchCRCHi[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
/* ... vollständig 256 项,此处省略 */
};
/* CRC niedrig位表 */
static const unsigned char auchCRCLo[] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
/* ... vollständig 256 项,此处省略 */
};
unsigned short CRC16_Modbus_Table(unsigned char *buf, unsigned short len)
{
unsigned char crcHi = 0xFF;
unsigned char crcLo = 0xFF;
unsigned short index;
while (len--) {
index = crcLo ^ *buf++;
crcLo = crcHi ^ auchCRCHi[index];
crcHi = auchCRCLo[index];
}
return (crcHi << 8) | crcLo;
}
vollständig的高低位表共 512 Bytes,可直接从 Modbus-Protokollspezifikation附录中抄过来,Modbus.org V1.1b3 规范的Die 40 页给出了vollständig的Beispiel表。
4.5 验证你的 CRC 实现
用已知Meldung测试:
Meldung: 01 03 00 00 00 01
Richtig.的 CRC: 84 0A(低Bytes在前)
验证步骤:
crc = 0xFFFF
crc ^= 0x01 → 0xFFFE
bit0=0, crc>>1 → 0x7FFF
bit1=1, (0x3FFF) ^ 0xA001 → 0x9FFE
...
最终 crc = 0x0A84
Senden Sie时低Bytes在前: 84 0A
整个MeldungSenden SieSequenz:01 03 00 00 00 01 84 0A
你也可以用 Modbus Poll 或 Modbus 小程序直接算 CRC,和你的代码实现交叉验证。
4.6 CRC 的检错能力
CRC-16 可以检测zu以下Fehler.Typus:
- 所有单比特Fehler.
- 所有双比特Fehler.(在Meldung不超过 32767 位的条件下)
- 所有奇数个比特Fehler.
- 所有突发Fehler.,Länge ≤ 16 位
- 99.998% 的更长突发Fehler.
简单说,在 Modbus 帧通常不超过 256 Bytes的前提下,CRC-16 可以捕捉几乎所有物理层传输Fehler.。用 CRC-Prüfung通过的Daten帧,基本可以信任。
五、应用层:Ungewöhnliche Reaktion码
物理层和帧Prüfungen都通过了,从Ausrüstung收zu了一个vollständigWirksam的 Modbus 帧——但逻辑上是错的。这时候从Ausrüstung不是沉默,而是返回一个Ungewöhnliche Reaktion,告诉Hauptstation「你让我做的事我做不了」。
5.1 Ungewöhnliche Reaktion的帧Das Format
正常Antwort和Ungewöhnliche Reaktion的区别只有一个:Funktionscode的最高位。
- 正常Antwort:Funktionscode = 原始Funktionscode(如 0x03 Lesen Sie das Register)
- Ungewöhnliche Reaktion:Funktionscode = 原始Funktionscode + 0x80(如 0x83),然后跟一个Bytes的Ungewöhnlicher Code
Beispiel:HauptstationBitte读Register. 01 03 00 00 00 01 84 0A
正常Antwort:01 03 02 00 7B F9 8D(读回 2 BytesDaten 00 7B)
Ungewöhnliche Reaktion(假设Register existiert nicht.):01 83 02 C0 F1
83= 0x03(原Funktionscode)+ 0x8002= Ungewöhnlicher Code,表示「Illegale Datenadressen」
5.2 标准Ungewöhnlicher Code速查表
| Ungewöhnlicher Code | Name | 含义 | Häufig原因 |
|---|---|---|---|
| 0x01 | Illegal Function | 非法的Funktionscode | Ausrüstung不支持该Funktionscode(如给只读Ausrüstung发写指令) |
| 0x02 | Illegal Data Address | 非法的DatenAdresse | Register-Adresse超出范围,或Ausgang Adresse+Anzahl越界 |
| 0x03 | Illegal Data Value | 非法的Daten值 | 写入的值超出了Register.的允许范围 |
| 0x04 | Slave Device Failure | 从Ausrüstung故障 | 从Ausrüstung在执行Operationen时发生了不可恢复的Fehler. |
| 0x05 | Acknowledge | Bestätigen(正在处理中) | Bitte已接受但需要较长Zeit处理,Hauptstation应等待 |
| 0x06 | Slave Device Busy | 从Ausrüstung忙 | Ausrüstung正在处理另一个Befehl,暂时无法Antwort |
| 0x07 | Negative Acknowledge | 否定Bestätigen | 从Ausrüstung不能执行该Funktion(通常是非特定Fehler.) |
| 0x08 | Memory Parity Error | 内存奇Zufällige PrüfungenFehler. | 扩展文件区一致性Prüfungen失败 |
0x01 zu 0x04 是最容易遇zu的,0x05 zu 0x08 在常规 Modbus Ausrüstung上比较少见——很多Ausrüstung厂商只实现了前 4 个Ungewöhnlicher Code。
5.3 Ungewöhnlicher Code的实际Tests用法
「为什么Ausrüstung不回Daten?」排除物理层和 CRC 问题后,看Ungewöhnlicher Code:
收zu 0x01(Illegale Funktionen):你发了一Ein Gerät不支持的Funktionscode。最Häufig的Szene是——你用 0x03(Lesen Sie das Register)去读了一个只能通过 0x04(Eingangsregister lesen)访问的模拟Quantität输入。去翻Ausrüstung手册的Registerabbildung表,Bestätigen该Adresse对应的访问Funktionscode。
收zu 0x02(非法Adresse):你的Ausgang Adresse加上BitteAnzahl超出了Ausrüstung支持的Adresse范围。比如Ausrüstung只有 10 个保持Register.(Adresse 0-9),你Bitte了从Adresse 0 开始的 12 ein Register.——跨过了边界。解决方法:减小每次Bitte的Anzahl der Register,或者在读之前先用 0x11(报告Von der Station ID)BestätigenAusrüstungTypus。
收zu 0x03(Illegale Datenwerte):你要写入的值对Ausrüstung没有意义。比如Ausrüstung支持 0-100 的Daten范围,你写入了 200。或者写入时的DatenAnzahl der Bytes与Funktionscode要求的Länge不匹配。
完全没有Antwort:不是Ungewöhnlicher Code,而Was ist das?都没有。可能的原因:CRC Fehler.(从Ausrüstung静默丢弃)、帧间隔(3.5 个CharaktereZeit)没有Richtig.实现、Geräte Adresse不匹配。这时候需要用逻辑Unterteilung析仪抓总线,Bestätigen从Ausrüstung收zu了什么、UART 硬件上有没有奇Zufällige PrüfungenFehler.标记。
六、超时机制:Hauptstation的最后一道防线
Modbus 规范要求Hauptstation配置一个超时Zeit。在以下情况下,超时会触发:
- Hauptstation发出Bitte后,Von der Station在规定Zeit内没有任何Antwort
- Von der Station检测zu帧Fehler.(CRC/LRC 失败),静默丢弃帧,Hauptstation收不zu回复
- von der Station Adressenicht existiert.——Meldung发zu了空Adresse上
超时Zeit的设置有一个约束:必须größer als从Ausrüstung最长可能的AntwortZeit。Berechnung方式为:
超时Zeit > 传输延迟 × 2 + Von der Station处理Zeit
在 9600bps 下,一个典型的 Modbus RTU Bitte(读 1 ein Register.)约 8 Bytes = 64 位,传输Zeit = 64 / 9600 ≈ 6.7ms。Antwort约 7 Bytes = 56 位,传输Zeit ≈ 5.8ms。加上Von der Station处理Zeit(假设最慢 50ms),双向总Zeit约 6.7 + 50 + 5.8 ≈ 62.5ms。留一倍余Quantität,超时设 100-200ms 比较合理。
如果总线上有多个Von der Station,要把轮询最慢Die Ausrüstung(比如有些老 PLC 处理一个Bitte要 100ms)考虑进去。Modbus 规范建议的默认超时是 1 秒——这个值对于现代Ausrüstung偏大,但作为初始值启动Tests是稳妥的。
七、vollständig排障流程
当你面对「Modbus Kommunikation失败」时,按这个顺序逐层排查:
| 层 | 检查项 | Werkzeuge | 判断方法 |
|---|---|---|---|
| 物理层 | RS-485 接线(A/B、共地、终端电阻) | 万用表 | 导通、总线空闲电平 ≥ 200mV |
| Charaktere层 | Serienparameter(Porter Rate、Datenplatz、Prüfstand.、Stoppen Sie Platz) | 逻辑Unterteilung析仪 | 实测位宽 = 1/baud |
| Charaktere层 | 奇Zufällige PrüfungenFehler. | 逻辑Unterteilung析仪 / Die SerieAssistenten. | 奇偶Fehler zählen = 0 |
| 帧层 | CRC-Prüfung | Modbus 小程序 / 自写代码 | Empfang CRC = Berechnung CRC |
| 帧层 | 帧间隔(≥ 3.5 CharaktereZeit) | 逻辑Unterteilung析仪 | 帧间空闲 ≥ 3.6ms @ 9600bps |
| 应用层 | von der Station Adresse | Ausrüstung手册 / 拨码Schalter! | BitteAdresse = Von der Station实际Adresse |
| 应用层 | Funktionscode + Adresse范围 | AusrüstungRegisterabbildung表 | Funktionscode和Register-Adresse在Ausrüstung支持范围内 |
| 应用层 | Ungewöhnliche Reaktion码 | Die SerieAssistenten. / 抓包 | Funktionscode最高位为 1 时检查Ungewöhnlicher Code |
| 应用层 | 超时 | 抓包看Zeit戳 | AntwortZeit < 超时配置 |
特别注意:用 「01 03 00 00 00 01」 这类标准 Modbus Bitte去交互时,不要直接用 ASCII Charaktere串Senden Sie——必须Senden SieBinärsystem帧。初学者在Die SerieAssistenten.里用 ASCII 模式发了 0x31 0x30 0x33 0x30 0x30 0x30 0x30 0x30 0x30 0x31(ASCII Charaktere串的 “010300000001”),而不是 01 03 00 00 00 01 这 6 个Bytes。这个Fehler.几乎每个学 Modbus 的人都犯过。
CRC-Prüfung码的Richtig.Berechnung是 Modbus Kommunikation可靠的基石。但工程现场的问题九成不在 CRC 本身——在接线、在Parameter、在Adresse范围越界、在Funktionscode选错。CRC 更像一个安全网,在你说「Daten应该是对的」的时候给你信心。当Daten确实不对的时候,先查前面几层。
把这篇Artikel里的代码放zu你的工程里交叉验证一下,别指望网上随便抄一段 CRC 代码就能直接用——我见过太多因为Befehlseite搞反导致 CRC 永远Prüfungen不通过的案例。有兴趣可以翻一下 Modbus.org V1.1b3 规范的附录部Unterteilung,那里有 CRC 查找表的vollständigDaten和高低位两种实现方式的官方Beispiel。
有问题再聊。
1