Modbus协议介绍

Modbus简介

Modbus 是一种工业自动化领域广泛使用的串行通信协议,由 Modicon 公司于 1979 年开发。它具有以下特点:

  • 🔴 开放标准,无版权限制

  • 🔴 简单易实现,广泛支持

  • 🔴 支持多种物理层(串口、以太网)

  • 🔴 主从架构(Master-Slave)

特性Modbus RTUModbus TCP
物理层串口(RS-232/RS-485)以太网(TCP/IP)
传输方式二进制编码TCP 数据包
帧格式需要校验(CRC)内置 TCP 校验
传输距离较短(RS-485 约 1200m)取决于网络
速度较低(典型 9600-115200 bps)较高(10/100/1000 Mbps)
应用场景传统设备、本地控制现代工业、远程控制

Modbus 关键概念

基本定位

  • 主从架构:1 主多从
    • 主站(Master):主动发指令
    • 从站(Slave):只响应,不主动发
  • 通用工业协议,简单、稳定、开源

四类数据区(最核心)

Modbus协议规定了4个存储区 分别是0 1 3 4区 其中0区和4区是可读可写,1区和3区是只读。

区号名称读写地址范围
0区输出线圈可读可写布尔量00001-09999
1区输入线圈只读布尔量10001-19999
3区输入寄存器只读寄存器30001-39999
4区保持寄存器可读可写寄存器40001-49999
  1. 线圈(Coils)

    • 功能码:01(读)、05(写单)、15(写多)
    • 类型:位,读写
    • 用途:继电器、开关输出
  2. 离散输入(Discrete Inputs)

    • 功能码:02
    • 类型:位,只读
    • 用途:传感器、限位、DI 输入
  3. 输入寄存器(Input Registers)

    • 功能码:04
    • 类型:16 位字,只读
    • 用途:温度、压力、模拟量输入
  4. 保持寄存器(Holding Registers)

    • 功能码:03(读)、06(写单)、16(写多)
    • 类型:16 位字,读写
    • 用途:参数、设定值、控制字

日常 90% 用:03 读保持寄存器

地址与偏移

  • 协议地址从 0 开始
  • 设备文档常从 1 开始→ 编程时要 -1

功能码(Function Code)

常用:

  • 01:读线圈
  • 02:读离散输入
  • 03:读保持寄存器
  • 04:读输入寄存器
  • 05:写单个线圈
  • 06:写单个保持寄存器
  • 15:写多个线圈
  • 16:写多个保持寄存器

两种传输方式

  1. Modbus RTU
    • 二进制,串口(RS485/232)
    • 短帧、高效
  2. Modbus TCP
    • 以太网,封装在 TCP/IP
    • 端口默认:502

报文结构(RTU)

从站地址 + 功能码 + 数据 + CRC校验

字节序问题(大坑)

  • 32 位浮点数 / 整数跨两个寄存器
  • 常见顺序:
    • ABCD(正常)
    • BADC、CDAB 等不对应就换字节序

异常码

告诉你为什么失败:

  • 01:功能码不支持
  • 02:地址错误
  • 03:数据错误
  • 04:设备故障

时序规则

  • 主站发 → 等从站回
  • 同一时间只能一主一从通信
  • 必须有超时重发机制

从站地址(Slave Address)/ 单元 ID(Unit ID)

定义:从站地址(也叫单元 ID/Slave ID)是 Modbus 网络中唯一标识每台从站设备的数字编号,本质是给每台设备分配一个 “身份证号”,让主站能精准找到要通信的设备。

  • 取值范围:1-247(0 是广播地址,不分配给具体设备);
  • 名称差异:RTU 场景常叫 “从站地址”,TCP 场景常叫 “单元 ID”(MBAP 头中第 7 字节),本质是同一个东西。

核心模式:一主多从(Single Master-Multiple Slaves)

定义:Modbus 协议规定:一个通信网络中只能有 1 个主站,可同时连接多个从站(最多 247 个),所有通信由主站主动发起,从站仅响应指向自己地址的指令。

RTU vs TCP 的 “一主多从” 差异
场景实现方式示例(C# 开发)
Modbus RTU所有从站挂在同一 RS485 总线上,主站发指令时携带从站地址,只有匹配的从站响应串口总线上挂地址 1 的传感器、地址 2 的变频器、地址 3 的 PLC
Modbus TCP主站通过 IP + 端口连接不同从站(或同一 IP 不同端口),指令中仍需指定单元 ID主站连接 192.168.1.10:502(单元 ID1)、192.168.1.11:502(单元 ID2)

NModbus4 核心总结

本质:.NET(C#)平台下的开源 Modbus 协议实现库,专门帮你封装 Modbus RTU/TCP 的底层通信细节(拼报文、算 CRC、解析 MBAP 头),不用手写二进制数据就能开发 Modbus 主 / 从站。

核心用法

  • 主站:创建ModbusIpMaster(TCP)/ModbusSerialMaster(RTU),调用ReadHoldingRegisters/WriteSingleCoil等方法读写数据;
  • 从站:创建ModbusSlave,绑定 Coils/Registers 数组,模拟工业设备响应主站请求。

使用串口的Modbus 报文帧

  一个报文就是一帧数据,一个数据帧就一个报文: 指的是一串完整的指令数据,本质就是一串数据。Modbus 报文是指主机发送给从机的一帧数据,其中包含着从机的地址,主机想执行的操作,校验码等内容。Modbus 使用串口中一共有两种模式:Modbus ASCII 模式和Modbus RTU 模式,常用的就是Modbus RTU 模式。

Modbus ASCII 模式

 当控制器设为在 Modbus 网络上以 ASCII 模式通信时,在消息中每个 8 位(b)字节都将作 为两个 ASCII 字符发送。这种方式的主要优点是字符发送的时间可隔可达到 1 秒且不产生错误。

在 ASCII 模式下,消息 以冒号(:)字符(ASCII 码为 0x3A) 开始, 以回车换行奇结束 (ASCII 码为 0x0D、0x0A) 。消息的其他字段(域)可以使用的传输字符是十六进制的 0···9、 A··· F。处于网络上的 Modbus 设备不断侦测 “ :”字符,当接收到一个冒号时,每个设备进 入解码阶段,并解码下一个字段(地址域)以判断是否是发给自己的。消息帧中的字符间发送 的时间间隔最长不能超过 1 秒,否则接收设备将认为发生传输错误。

需要注意的是,在消息中的每个字节都作为两个ASCII字符发送

十六进制的0-F 分别对应ASCII字符的0…9,A…F,也就是0x30~0x3A 0x41~0x46

Modbus RTU 模式

Modbus 协议 RTU 报文格式如下所示:

帧结构 = 从机地址 + 功能码 + 数据 + 校验

 从机地址: 每个从机都有唯一地址,占用一个字节,范围 0-255,其中有效范围是 1-247, 其中 255 是广播地址(广播就是对所有从机发送应答)

功能码: 占用一个字节,功能码的意义就是,知道这个指令是干啥的,比如你可以查询从 机的数据,也可以修改从机的数据,所以不同功能码对应不同功能.

数据: 根据功能码不同,有不同功能,比方说功能码是查询从机的数据,这里就是查询 数据的地址和查询字节数等。

校验: 在数据传输过程中可能数据会发生错误,CRC 检验检测接收的数据是否正确

功能码概要

Modbus 标准在协议中规定了以下 3 类 Modbus 功能码。

公共功能码:

  1. 被明确定义的功能码;

  2. 保证唯一性;

  3. 由 Modbus 协会确认,并提供公开的文档;

  4. 可进行一致性测试;

  5. 包括协议定义的功能码和保留将来使用的功能码。

用户自定义功能码:

  1. 有两个用户自定义功能码区域,分别是 65~72 和 100~110;

  2. 用户自定义,无法保证唯一性。

保留功能码:

保留功能码因为历史遗留原因,某些公司的传统产品现行使用的功能码不作为公共使用。

什么是RS-485 RS-232?

RS232,RS485是一种电平标准

数据在通信双方之间传输,本质是传输物理的电平 比方说传输5V的电压 -1V的电压信号,这些物理信号在传输过程中会受到很多干扰,比方说你传输一个5V的电压,到了接收端可能就变成了4.8V,并且通信的双方高低电平的参考电压可能不同。

那么这个时候就需要一个电平标准,来判断多少V的电压是高电平 1,多少V的电压是低电平 0 这就诞生了 RS-485 RS-232

RS232:是电子工业协会(Electronic Industries Association,EIA) 制定的异步传输标准接口,同时对应着电平标准和通信协议(时序),其电平标准:+3V~+15V对应0,-3V~-15V对应1。

  • 全双工
  • 逻辑1:-15V–5V
  • 逻辑0:+3V–+15V

RS485:RS485是一种串口接口标准,为了长距离传输采用差分方式传输,传输的是差分信号,抗干扰能力比RS232强很多。两线压差为-2~-6V表示0,两线压差为+2~+6V表示1

  • 半双工
  • 逻辑1:+2V~+6V
  • 逻辑0: -2V~ -6V

注意485的电平指的是485-A和485-B两根传输线,两线间的电压差。而不是传输线上的电压

Modbus-TCP协议

我们首先看下Modbus-TCP和Modbus-ACSII的区别

Modbus-TCP并不需要从从机地址,而是需要MBAP报文头

并且不需要差错校验,因为TCP本身就具有校验差错的能力

MBAP报文头格式如下:

其中事务处理表示符合协议标识符我们正常使用设置为0即可 长度为6个字节 0x0006

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值