文档介绍:Modbus通讯协议
一、 Modbus 协议简介
Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络〔例如以太网〕和其它设备之间可以通信。它已经成为一通用工业标准。有了它,不同厂是全“1〞的16位存放器,然后调用一过程将消息中连续的8位字节各当前存放器中的值进展处理。仅每个字符中的8Bit数据对CRC有效,起始位和停顿位以及奇偶校验位均无效。
CRC产生过程中,每个8位字符都单独和存放器容相或〔OR〕,结果向最低有效位方向移动,最高有效位以0填充。LSB被提取出来检测,如果LSB为1,存放器单独和预置的值或一下,如果LSB为0,则不进展。整个过程要重复8次。在最后一位〔第8位〕完成后,下一个8位字节又单独和存放器的当前值相或。最终存放器中的值,是消息中所有的字节都执行之后的CRC值。
CRC添加到消息中时,低字节先参加,然后高字节。
CRC简单函数如下:
unsigned short CRC16(puchMsg, usDataLen)
unsigned char *puchMsg ; /* 要进展CRC校验的消息 */
unsigned short usDataLen ; /* 消息中字节数 */
{
unsigned char uchCRCHi = 0*FF ; /* 高CRC字节初始化 */
unsigned char uchCRCLo = 0*FF ; /* 低CRC 字节初始化 */
unsigned uInde* ; /* CRC循环中的索引 */
while (usDataLen--) /* 传输消息缓冲区 */
{
uInde* = uchCRCHi ^ *puchMsgg++ ; /* 计算CRC */
uchCRCHi = uchCRCLo ^ auchCRCHi[uInde*} ;
uchCRCLo = auchCRCLo[uInde*] ;
}
return (uchCRCHi << 8 uchCRCLo) ;
}
/* CRC 高位字节值表 */
static unsigned char auchCRCHi[] = {
0*00, 0*C1, 0*81, 0*40, 0*01, 0*C0, 0*80, 0*41, 0*01, 0*C0,
0*80, 0*41, 0*00, 0*C1, 0*81, 0*40, 0*01, 0*C0, 0*80, 0*41,
0*00, 0*C1, 0*81, 0*40, 0*00, 0*C1, 0*81, 0*40, 0*01, 0*C0,
0*80, 0*41, 0*01, 0*C0, 0*80, 0*41, 0*00, 0*C1, 0*81, 0*40,
0*00, 0*C1, 0*81, 0*40, 0*01, 0*C0, 0*80, 0*41, 0*00, 0*C1,
0*81, 0*40, 0*01, 0*C0, 0*80, 0*41, 0*01, 0*C0, 0*80, 0*41,
0*00, 0*C1, 0*81, 0*40, 0*01, 0*C0, 0*80, 0*41, 0*00, 0*C1,
0*81, 0*40, 0*00, 0*C1, 0*81, 0*40, 0*01, 0*C0, 0*80, 0*41,
0*00, 0*C1, 0*81, 0*40, 0*01, 0*C0, 0*80, 0*41, 0*01, 0*C0,
0*80, 0*41, 0*00, 0*C1, 0*81, 0*40, 0*00, 0*C1, 0*81, 0*40,
0*01, 0*C0, 0*80, 0*41, 0*01, 0*C0, 0*80, 0*41, 0*00, 0*C1,
0*81, 0*40, 0*01, 0*C0, 0*80, 0*41, 0*00, 0*C1, 0*81, 0*40,
0*00, 0*C1, 0*81, 0*40, 0*01, 0*C0, 0*80, 0*41, 0*01, 0*C0,
0*80, 0*41, 0*00, 0*C1, 0*81, 0*40, 0*00, 0*C1, 0*81, 0*40,
0*01, 0*C0, 0*80, 0*41, 0*00, 0*C1, 0*81, 0*40, 0*01, 0*C0,
0*80, 0*41, 0*01, 0*C0, 0*80, 0*41, 0*