Modbus是美国Modicon公司(即现在的Schneider Electric公司)于1979年开发的一种通信协议,其目的是采用一根双绞线实现多个设备之间的通信。
Modbus 协议采用问答式的通信方式,具有简单、硬件便宜、通用性强、使用方便的优点,容易开发和实现。Modbus RTU几乎成了国产PLC和变频器首选的通信协议。
Modbus 协议不需要专门的通信模块,通信所需的堆栈和协议机制是以软件形式实现的,属于ISO-OSI 参考模型的第7层。它的另一个优点是可以通过任何传输媒介进行通信,包括双绞线、无线通信、光导纤维、以太网、电话调制解调器、移动电话以及微波等。这样可以很容易地在一个新的或者是现有的工厂里建立起Modbus连接。
目前使用的Modbus有三个版本:Modbus ASCII、Modbus RTU和Modbus/TCP。
1.Modbus ASCII协议需要将一个字节的数据转换为两个字节的ASCII码后发送。Modbus RTU协议的数据以二进制进行编码,每个字节的数据只需要一个字节的通信量。
2.Modbus RTU通信采用主-从方式,最多传送255个字节的数据。主设备与一个或多个从设备进行通信。比较典型的主设备是PLC、PC、DCS(集散控制系统)或者RTU(远程终端单元)。Modbus RTU的从设备一般是现场设备。当Modbus RTU主设备想要从一台从设备得到数据的时候,主设备发送一条包含该从设备站地址、所需要的数据以及一个用于检测错误的CRC校验码。网络上所有其它设备都可以接收到这条信息,但是只有地址被指定的从设备才会作出反应。Modbus网络上的从设备不能发起通信,它们只能在主设备对它说话的时候回答。
Modbus RTU采用16位的循环冗余校验码(CRC)。通过一个对数据进行“或”运算以及移位运算的复杂程序,由主设备产生CRC,并且由接收设备进行检查。如果双方计算出的CRC值不符,从设备就会要求重新传送信息。
Modbus RTU协议分为Modbus RTU主站协议和Modbus RTU从站协议。Modbus通信是由功能码来控制的,主站直接访问从站的数据区。
3.Modbus /TCP可以被理解为以太网上的Modbus。Modbus /TCP不过是采用TCP/IP标准,简单地把Modbus信息包打包压缩而已。这样Modbus /TCP设备就可以通过以太网和光纤网络进行连接和通信。与RS-485接口相比,Modbus /TCP还允许使用更多的地址、可以采用多主站架构、传送速率可以达到GB/s的水平。Modbus /TCP网络的从站数量仅受限于网络物理层的能力。通常从站的数量一般在1024个左右。
附:Modbus RTU CRC校验码计算方法
在CRC计算时只用8个数据位,起始位及停止位,如有奇偶校验位也包括奇偶校验位,都不参与CRC计算。
CRC计算方法是:
1、 加载一值为0XFFFF的16位寄存器,此寄存器为CRC寄存器。
2、 把第一个8位二进制数据(即通讯信息帧的第一个字节)与16位的CRC寄存器的相异或,异或的结果仍存放于该CRC寄存器中。
3、 把CRC寄存器的内容右移一位,用0填补最高位,并检测移出位是0还是1。
4、 如果移出位为零,则重复第三步(再次右移一位);如果移出位为1,CRC寄存器与0XA001进行异或。
5、 重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理。
6、 重复步骤2和5,进行通讯信息帧下一个字节的处理。
7、 将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换
8、 最后得到的CRC寄存器内容即为:CRC校验码
直接上代码:
///
/// 转换成CRC码
///
///
///
///
///
//modbus CRC16
publicvoid CRC16Calc(byte[] dataBuff, int dataLen)
{
int CRCResult = 0xFFFF;
if (dataLen < 2)
{
return;
}
for (int i = 0; i < (dataLen - 2); i++)
{
CRCResult = CRCResult ^ dataBuff[i];
for (int j = 0; j < 8; j++)
{
if ((CRCResult & 1) == 1)
CRCResult = (CRCResult >> 1) ^ 0xA001;
else CRCResult >>= 1;
}
}
dataBuff[dataLen - 1] =Convert.ToByte(CRCResult >> 8);
dataBuff[dataLen - 2] =Convert.ToByte(CRCResult & 0xff);
}
部分参考:http://blog.sina.com.cn/s/blog_762cf5f80101ctkt.html