Modbus是工业上的一种常见的通讯协议,其中包括有Modbus-RTU、Modbus-ASCII、Modbus-TCP。而Modbus-RTU相对另外两种更常见也更容易实现。
我们先从Modbus的报文中进行观察:01 03 14 00 00 01 9E 9B
依次来看:
其中01指的是从机地址、03指的是功能码、14指的是起始地址高位、00是起始地址低位、00是指数据总位数的高位、01指的是数据总位数的低位、9E 9B指的是CRC校验。
其意思大致可看成是:将数据0x0001写入01号从机的0x1400地址中。
其中从机地址是指一个主站可以有多个从机,而每个从机都需要有一个地址、通过地址进行一对一的传输数据。
功能码则可以分成以下这数种:
01 Read Coils 读取线圈状态,读取一组逻辑线圈的当前状态(ON/OFF)
02 Read DiscreteInputs 读取输入状态,读取一组开关输入的当前状态(ON/OFF)
03 Read Holding Registers 读取保持寄存器,在一个或多个保持寄存器中取得当前二进制值
04 Read Input Registers 读取输入寄存器,在一个或多个输入寄存器中取得当前二进制值
05 Write Single Coil 强制(写)单线圈,强制(写)一个逻辑线圈的通断状态(ON/OFF)
06 Write Single Register 预置(写)单寄存器,把具体二进制值写入一个保持寄存器
0F Write Multiple Coils 强制(写)多线圈,强制(写)一串连续逻辑线圈的通断状态(ON/OFF)
10 Write Multiple Registers 预置(写)多寄存器,把具体二进制值写入一串连续的保持寄存器
起始地址则是指数据在从机的某个地址开始写入。
CRC校验则是为了判断接收到的数据是否出错。
具体操作则如下所示:
用了两个虚拟串口进行测试,分别为COM5和COM6。在Modbus poll中选择其中一个端口作为主站,而Modbus Slave选择另一端口作为从机。如下图所示:
上面的是主站下面的是从机。需要特别注意的是:从机中的波特率数据位校验位和停止位都需要和主机设置的一致,本次设置为波特率19200,8位数据位,无校验位,1位停止位。
如此则成功连接,可将数据从主站中写入从机中。
具体的数据读写可从串口监听软件中获取相应信息,初始值如上可看到设置的数据为1,此处的1位十进制的1,即十六进制的 00 01,
则可以从软件中监听到如下信息:
前两行是每次读写数据前初始化的数据,
而真正读写的数据则是从第三行开始,由进程mbpoll即Modbus slave对应的串口COM6中看到其写入了一串16进制数据:01 03 02 00 01 79 84
而从COM5中读入相同的数据。
将数据修改为100即十六进制的0064,则可获得如下:
所获得的十六进制数据为01 03 02 00 64 B9 AF。