关于Modbus通讯协议的编程举例
控制器能设置两种模式,分别是:ASCII和RTU
根据控制器选择的模式,主设备就选用相应的模式进行传输。
另外:在一个Modbus网络上所有的设备都必须选择相同的传输模式和串口参数。
ASCII模式:
地址码 功能码 数据量 数据1 …… 数据n LRC高 LRC低 回车 换行
RTU模式:
地址码 功能码 数据量 数据1 …… 数据n CRC高 CRC低
CRC16循环冗余校验:
Unsigned short CRC16(puchMsg, usDataLen)
Unsigned char *puchMsg
Unsigned short usDataLen;
{
Unsigned char uchCRCHi=0xFF
Unsigned char uchCRCLo=0xFF
Unsigned nIndex
While(usDataLen--)
{
uIndex=uchCRCHi ^ *puchMsg++;
uchCRCHi=uchCRCLo ^ auchCRCHi(uIndex);
uchCRCLo=uchCRCLo[uIndex];
}
Return(uchCRCHi<<8 | uchCRCLo)
}
计算CRC码的步骤为:
预置16位寄存器为十六进制FFFF(即全为1)。称此寄存器为CRC寄存器;
把第一个8位数据与16位CRC寄存器的低位相异或,把结果放于CRC寄存器;
把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位;
如果最低位为0:重复第3步(再次移位); 如果最低位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
重复步骤2到步骤5,进行下一个8位数据的处理;
最后得到的CRC寄存器即为CRC码。
Private Function CRC16(data() As Byte) As String
将本文加入收藏夹
新闻详情