Modbus协议技术总结

生来就可爱ヽ(ⅴ<●) 提交于 2020-01-27 08:23:16

1 概念

Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。
Modbus比其他通信协议使用的更广泛的主要原因有:

  • 公开发表并且无版权要求;
  • 易于部署和维护;
  • 对供应商来说,修改移动本地的比特或字节没有很多限制;

Modbus允许多个 (大约240个) 设备连接在同一个网络上进行通信,举个例子,一个由测量温度和湿度的装置,并且将结果发送给计算机。在数据采集与监视控制系统(SCADA)中,Modbus通常用来连接监控计算机和远程终端控制系统(RTU)。

2 协议

2.1 协议介绍

当在网络上通信时,Modbus协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成应答并使用Modbus协议发送给询问方。
Modbus协议包括ASCII、RTU、TCP等,并没有规定物理层。Modbus有国际标准,也有国家标准,内容是完全一样的。在标准钟支持2种物理链路:一是基于RS485(RS232)的串行链路;二是基于以太网的TCP/IP链路。事实上,Modbus协议作为一种应用层协议对物理键子并没有特别的要求,光纤、无线等都是可以实现的。
Modbus的ASCII、RTU协议规定了消息、数据的结构、命令和就答的方式,数据通讯采用Maser/Slave方式,Master端发出数据请求消息,Slave端接收到正确消息后就可以发送数据到Master端以响应请求;Master端也可以直接发消息修改Slave端的数据,实现双向读写。在TCP方式时被称为服务器和客户端。这种称呼只是叫法不同,但在本质上是没有区别。
在这里插入图片描述

2.2 功能码

代码(HEX) 含义 操作
0x01 读取动作信息 读取一组动作线圈状态
0x02 读取输入信息 读取一组离散输入状态
0x03 读保持寄存器数值 读取一个或更多保持寄存器值
0x04 读输入寄存器数值 读取一个或更多输入寄存器值
0x05 写单个线圈 对单个的读写型的状态量进行写入
0x06 写单个寄存器 对单个的读写型的寄存器量进行写入
0x0F 写多个线圈 对多个的读写型的状态量进行写入
0x10 写多个寄存器 对多个的读写型的寄存器量进行写入

2.3 校验码

Modbus协议需要对数据进行校验,串行协议中除有奇偶校验外,ASCII模式采用LRC校验,RTU模式采用16位CRC校验,但TCP模式没有额外规定校验,因为TCP协议是一个面向连接的可靠协议。另外,Modbus采用主从方式定时收发数据,在实际使用中如果某Slave站点断开后(如故障或关机),Master端可以诊断出来,而当故障修复后,网络又可自动接通。因此,Modbus协议的可靠性较好。

3 报文实例

3.1 MODBUS-RTU报文模型

设备地址 功能码 数据格式 CRC校验L CRC校验H
8bit 8bit N*8bit 8bit 8bit

一个报文就是一帧数据,一个数据帧就一个报文: 指的是一串完整的指令数据,就像上面的一串数据。

3.2 主机对从机写数据操作

如果单片机接收到一个报文那么就对报文进行解析执行相应的处理;

0x01 0x06 00 01 00 17 98 04
从机地址 功能码 数据地址 数据 CRC校验

3.3 主机对从机读数据操作

0x01 0x03 00 01 00 01 D5 CA
从机地址 功能码 数据地址 读取寄存器个数 CRC校验

单片机接收到这串数据根据数据计算CRC校验判断数据是否正确,如果判断数据无误,则结果是:返回信息给主机,返回的信息也是有格式的:

3.4 从机对主机返回内容

0x01 0x03 00 02 00 17 F8 4A
从机地址 功能码 数据字节个数 两个字节数据 CRC校验

推荐学习

CPU 上的通信口(Port0)支持 Modbus RTU 从站通信协议

串口通信之(二)数据上传到上位机 (modbus rtu slave)

Demo下载

基于Modbus Rtu java 串口通信从机 Demo 实现

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!