Modbus协议学习

Modbus协议简介

Modbus 就是为了实现多个设备相互通信的应用层协议。 在市面上很多数据采集设备都会采用Modbus协议。

主要包括三种报文:
ModbusRtu,ModebusAscii , ModbusTcp

  • 这三种报文的报文主体(包括从机地址+功能码+数据域)都相同,没有本质区别。
  • 注意的是,ModebusAscii 因为使用的是ASCII编码,相比Rtu 来说,占用空间更大,传输效率更低。

优点:

  • Modbus 是最开始使用RS232 、RS485等串行链路作为底层通信方式,串行总线的接口芯片成本低,而且布线简单;

  • Modbus 是简单的应用层协议,其信息格式简单易懂。

  • 开源免费

  • 可以在多种电气接口(R232,R485)和通讯介质(以太网、蓝牙、wifi等)中运行

  • 报文帧简单紧凑

  • 常用介质:串口、以太网,主要的通讯方式:
    ModbusRtu(常用在串口运行,使用原始二进制,底层使用RS485串行链路通讯)
    ModebusAscii (常用在串口运行,使用ASCII编码底层使用RS485串行链路通讯)
    ModebusUdp
    ModbusTcp
    ModebusRtuOverTcp
    ModebusAsciiOverTcp
    ModebusRtuUdp
    ModebusAsciiUdp

Rtu 和 Ascii 的区别:例如:
发送10 这个数据,使用Rtu 的话,数据被转换为 0x0A = 10,
但是Ascii会将数据转化为两个字符(1 ,0) 0x31 0x30(针对Ascii码表对应的1,0的数转的),而且还有包头包尾

Modbus总线

  • Modbus,bus总线的意思,而总线是一种网络拓扑结构,一般包括星型结构、环型、树型、总线型等多种。当然无论哪种网络拓扑结构最终都是为了实现多个设备之间的通讯。
  • Modbus 则是采用的总系型拓扑结构,如下:
    在这里插入图片描述

特点:

  • 如图,多个设备复用同一条总线,能大大减少了布线的复杂性。

  • 此时多个设备复用同一条总线时,会出现,当同时发送数据时,数据会产生冲突,为了避免数据冲突的出现,Modbus协议就采用了一种主从通讯方式去解决这种问题。

主从通讯模式

在这里插入图片描述

  • 主从模式就是如图所示,在整个系统中只能存在一个主机设备(master),和 多个从机设备(slave)
  • Modbus 采用请求-应答的模式,并规定,Modbus请求只能有主机发起,即主机发送请求数据给从机,从机只能接收来自主机的请求并做出相应的应答,返回应答数据给主机。
  • 从机不能主动发起请求,只能被动接收主机的请求。
  • 为了避免数据冲突,主机不能并行发送数据,当发送完第一个数据,只有等到从机返回应答或者应答超时后,才能发送第二个数据
  • 每个从机在一个系统中只有一个从机地址,主机发送数据请求时,会在请求数据中携带目标从机的地址,当主机发送数据到总线上时,每一个从机都会接到主机的数据,但是只有与请求数据中目标地址相同的从机才会做出应答,其他从机则会忽略此请求。

Modbus存储区

数据类型,分:布尔量 寄存器
读写性,分:只读 读写

只读布尔量:输入线圈 ————规定为 1区,即寄存器1,一般情况地址范围:10001-19999
只读寄存器:输入寄存器———规定为 3区,即寄存器3,范围:30001-39999
读写布尔量:输出线圈————规定为 0区,即寄存器0,范围:00001-09999
读写寄存器:输出寄存器———规定为 4区,即寄存器4,范围:40001-49999

操作

  • 读取输入线圈
  • 读取输入寄存器
  • 读取输出线圈
  • 读取输出寄存器
  • 写入单个输出线圈
  • 写入多个输出线圈
  • 写入单个输出寄存器
  • 写入多个输出寄存器

如何进行上面的操作——功能码

  • 读取输入线圈1—————0x02
  • 读取输入寄存器3————0x04
  • 读取输出线圈0—————0x01
  • 读取输出寄存器4————0x03
  • 写入单个输出线圈0———0x05
  • 写入多个输出线圈0———0x0F
  • 写入单个输出寄存器4——0x06
  • 写入多个输出寄存器4——0x10

Modbus 调试工具:
ModbusPoll (扮演客户端或者主站的角色)
ModbusSlave(扮演服务器或者从站的角色)

VSPD(扮演虚拟串口)

Modbus报文格式 / 消息帧格式

前面已经说过了Modus 通讯协议主要包括以下三种报文
主要包括三种报文:
ModbusRtu,ModebusAscii , ModbusTcp

  • 这三种报文的报文主体(包括从机地址+功能码+数据域)都相同,没有本质区别。

从机地址:

首先从机地址是唯一的,用户可以自定义配置设备的从机地址,但是必须保证从机地址是唯一的。
从机地址范围为1-247, 0为广播地址, 248-255为预留地址

功能码:

功能码就对应了设备提供的某个服务或者功能,Modbus 标准中把功能码分为了3类:
(1)公共功能码:modbus已经规定好的,其功能已经被明确的
(2)用户自定义功能码:设备根据需求自定义的功能码,取值范围为 65-72 和 100-110
(3)保留功能码:目前没有使用,可忽略。

  • 读取输入线圈1—————0x02
  • 读取输入寄存器3————0x04
  • 读取输出线圈0—————0x01
  • 读取输出寄存器4————0x03
  • 写入单个输出线圈0———0x05
  • 写入多个输出线圈0———0x0F
  • 写入单个输出寄存器4——0x06
  • 写入多个输出寄存器4——0x10

数据域

数据域用来存放真正要通讯的数据,数据域是以字节为单位的,长度可变的,数据域的格式可变,而具体的格式是由功能码决定的。

  • 数据地址
    Modbus读写时必须要数据地址,理论上每种寄存器的数据地址的取值范围都为0x0000-0xFFFF,注意不同种类的寄存器的数据地址是独立的。

Modbus TCP

由于以太网的流行,所以modbus也引进了TCP/IP作为通信方式。尽管RS485串行链路比以太网链路简单。毕竟Modbus是应用层协议,不管底层使用RS485链路还是TCP,应用层变化不大。

Modbus 的 TCP通信的相较于串口通讯的特点
前面提到过了Modbus 主从通信模式主要是为了避免多个设备的数据冲突,而TCP 底层已经使用CSMA/CD(我目前还不懂)解决了数据冲突的问题,而且TCP是全双工通讯,RS485是半双工,这就使得Modbus TCP的从机可以主动发送报文到系统中而不会产生冲突,(尽管这种操作是不符合Modbus标准的),所以在使用TCP连接时,Modbus 系统可以实现 多主/多从的通信模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LionelMartin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值