本篇文章为大家介绍 Modbus 的一些基础知识。
前言
这篇文章为大家介绍 什么是modbus,以及modbus 通信协议的四种寄存器,modbus 的功能码。
🌈Modbus 概述
- Modbus 是什么?
Modbus 是一种工业通信协议,最早由 Modicon 公司(现为施耐德电气)于 1979 年 提出,用于 可编程逻辑控制器(PLC) 之间的数据交换。如今,它已成为工业自动化领域最广泛使用的通信协议之一,适用于 传感器、仪表、PLC、HMI(人机界面)、SCADA(监控系统) 等设备之间的通信。
- Modbus
主从架构
Modbus 是一主多从的通信协议,支持一个主机和多个从机间的数据传输。
- 主设备(Master):发起请求(PC, PLC)。
- 从设备(Slave):响应请求(传感器,执行器)。
- 传输方式
Modbus 报文是指主机发送给从机的一帧数据,其中包含着从机的地址,主机想执行的操作,校验码等内容。
(1)Modbus RTU (串口通信)。
传输方式:基于RS-485/RS-232 (工业常用RS-485,支持多设备)
数据格式:二进制。
Modbus 报文帧结构:
[设备地址][功能码][数据][CRC校验]
(2)Modbus ASCII(文本格式)
传输方式:基于串口,但数据以ASCII字符传输(可读性更强)
Modbus 报文帧结构:
// LRC校验:比CRC简单,但效率低。
:[设备地址][功能码][数据][LRC校验]<CR><LF>
(3)Modbus TCP/IP(以太网通信)
传输方式:基于TCP/IP 。
Modbus 报文帧结构:
//MBAP头:包含事务标识,协议标识,长度等信息。
[MBAP头][设备地址][功能码][数据]
✨Modbus 寄存器介绍
Modbus 使用寄存器(Register)去存储数据,不同的寄存器类型不痛 对应的功能也不同。
寄存器根据存放的数据类型以及各自的读写特性将寄存器分为四部分,这四部分既可以连续,也可以不连续,由开发者决定。
下面是 Modbus 的四种寄存器的类型,下面我将逐个详细介绍:
- 线圈寄存器(输出线圈)
可读可写
数据类型:1 位布尔值
存储区代号:0 区
短地址范围:00001 - 09999
- 离散输入寄存器(输入线圈)
只读
数据类型:1 位布尔值
存储区代号:1 区
短地址范围:10001 - 19999
- 输入寄存器
只读
数据类型:16 位无符号整数
存储区代号:3 区
短地址范围:30001 - 39999
- 输出寄存器(保持寄存器)
可读可写
数据类型:16 位无符号整数
存储区代号:4 区
短地址范围:40001 - 49999
❄️ 常用功能码介绍
Modbus 协议的功能码(Function Code)是协议的核心机制,用于定义客户端(主站)对服务器(从站)的具体操作请求类型。
Modbus 标准在协议中规定了以下 3 类 Modbus 功能码。
-
公共功能码(Public Function Codes)
标准定义:由Modbus组织官方维护,所有设备必须支持
数值范围:1-127
(十进制) -
用户自定义功能码(User-Defined Function Codes)
标准定义:由设备厂商自定义扩展
数值范围:65-72, 100-110(十进制) -
保留功能码(Reserved Function Codes)
特殊用途:用于协议兼容性扩展或历史遗留功能
典型示例:9,10,13,14等
🌤️Modbus 协议详述
- modbus 协议是一个单主/多从的通信协议,同一时间总线上只能有一个主设备,但是可以有一个或者多个(最多247个)从设备。
modbus 通信是由主设备发起,当从设备没有收到来自主设备的请求时,从设备不会主动发送数据,从设备间不能相互通信,主设备只能同时启动一个modbus 坊回事务处理。
主控发出的数据里,必定含有如下的信息:
1. 设备地址:要访问从设备1,还是从设备2.
2. 功能码: 访问哪类寄存器,只访问1个寄存器,还是多个,读还是写。
3. 数据:起始寄存器的地址,寄存器的数量。
4. CRC校验码:保证数据传输的可靠。
如下图:
2. modbus 是一个请求,应答协议。下面是modbus 的事务处理过程:
① 主机设备创建 modbus 应用数据单元形成的查询报文(数据帧)。功能码标识了向从机设备将要执行的动作 占用1 字节。
查询报文创建完毕,主机设备向从机发送该报文。
从机收到报文后回根据功能码做出相应的动作,并将响应报文返回给主机。
② 如果在一个正确接收的 Modbus ADU 中不出现差错,那么从设备将返回正常的响应报文。
如果出现与请求 Modbus 功能有关的差错,那么响应报文的功能码区域将包括一个 异常码。主设备会根据异常码确定下一步执行的操作。
对于异常响应,服务器返回一个与原始功能码等同的码,设置该原始功能码的最高有效位为 逻辑1,用于通知主设备,如下图:
总结
下一篇文章为大家介绍 libModbus 库。