modbus初识

来源:互联网 发布:c语言之家 编辑:程序博客网 时间:2024/05/21 18:37

近期因为用到了modbus,看了两天公司代码,有点蒙,周六的时候闲了在网上又搜了下相关的说明。现在清晰明了了。在这里总结下:


1.modbus协议,是在物理层的rs485电气连接的基础上广泛用于工业仪表通信的协议。因为rs485电器上采用了两根差分线来进行传输,因此抗干扰以及对外辐射减小,因此,传输距离更远。


2.modbus通信采用的是主从模式,跟i2c类似,有主设备和从设备之分。modbus支持的设备 32,64,128,256个设备,但是数量的不同好像是跟采用的rs485芯片有关,因该是芯片的参数决定的。

3.modbus有两种传输方式:ASCII 以及 RTU,但是普遍采用的好像还是 RTU 模式,两种方式的数据包结构相同都为    <地址>  <功能码>  <数据>  <校验>。modbus的最大 协议数据单元(Protocol Data Unit)继承于第一次的modbus实现,最大 应用数据单元(Application Data Unit)256bytes限制。因此ADU的大小为253bytes:

RS232 / RS485 ADU  = 253 bytes + Server address (1 byte) + CRC (2 bytes) = 256 bytes.
TCP MODBUS ADU  = 253 bytes + MBAP (7 bytes) = 260 bytes.


请求 PDU 格式为 {function_code, request_data}

function_code = [1 byte] MODBUS function code,  
request_data = [n bytes] 独立于功能码可以包含多种信息 such as variable references,  variable counts, data offsets, sub-function codes etc.

响应 PDU 格式为 {function_code, response_data}

function_code = [1 byte] MODBUS function code

response_data = [n bytes] 独立于功能码可以包含多种信息 such as variable references,  variable counts, data offsets, sub-function codes etc.

异常响应 PDU 格式为  {exception-function_code, request_data}

exception-function_code = [1 byte] MODBUS 功能码 + 0x80
exception_code = [1 byte]   一个字节的modbus异常码 "MODBUS Exception Codes" (see section 7 )

功能码包含公共定义以及用户自定义,公共定义直接查看定义即可。相关的bit的定义如下:




4.数据的传输采用大端方式,如果数据大于1个字节的,数据的排列方式为先是 高字节,后是 低字节。比如 16bits寄存器,0x1234,先传送0x12,然后再是0x34.

5.从设备流程图。


步骤如下:等待呼入 -->收到呼入-->检查功能码-->检查数据地址-->检查数据值/范围-->执行该请求-->发送结果。中间过程如有异常会直接返回异常响应。

6,命令格式:

读取多线圈:


上述格式为 PDU 部分的内容,前面的地址以及最后的crc部分没有标出来。例子中举例的为,请求读取多个线圈(0x01),起始地址为0x0013,读取数量为0x0013个。

响应PDU内容为,读取多个线圈(0x01),数据字节数目0x03个,27-20地址为0xCD,35-28地址为0x6B,38-36地址为0x05。这里要注意传回来的数据的话0xCD高位对应着高位寄存器,也就是27-20的状态为  1100_1101.

其它命令的格式都是类似的样子。看官方的应用协议规范就行了。去官网直接下载就行,http://www.modbus.org/specs.php

7,其它的 TCP的还没了解。等了解了再来补一下,其他的再有认识了也会再补充整理下。

0 0
原创粉丝点击