嵌入式软件工程师养成记-必备通信协议篇之modbus通信

Modbus是什么

Modbus是一种串行通信协议,由Modicon公司(现为施耐德电气)于1979年开发,主要用于工业自动化系统中连接电子设备(如PLC、传感器、仪表等)。它因其简单性、开放性和易用性成为工业领域应用最广泛的通信协议之一。简单来说就是一种应用层协议,它定义了发送数据的格式和应答的机制,它可以基于串口(232或者485)发送出去,也可以基于网络(TCP)发送出去。

Moubus怎么学

modbus协议很简单,发展了那么多年,已经固化了,也没有太多可以研究的,简单学习掌握一下就行,作为开发的话,使用也很简单,前辈们造了很多轮子,我们只需要用就行了,多余的时间用在更加重要的事情或者复杂的知识点就行了,C/C++的话就用libmodbus,python就用modbus_tk。做了这么多年了,我还没用到过Modbus TCP,所以掌握Modbus RTU就够用了,我个人觉得,如果使用了TCP网络了,那直接上http或者mqtt这些上层协议不是更加灵活和方便吗,还使用Modbus TCP干嘛。Modbus TCP感觉就是维护存量的设备。

Modbus特性

  1. 主从架构(Master-Slave)
    • 仅允许一个主设备(Master)发起请求,多个从设备(Slave)响应。
    • 从设备地址范围:1-247(地址0用于广播)。
  2. 数据传输格式
    • Modbus RTU:基于二进制传输,效率高,适用于RS-485/RS-232物理层。
    • Modbus ASCII:基于ASCII字符传输,可读性强,效率较低。
    • Modbus TCP:基于TCP/IP协议,适用于以太网,封装为TCP报文(默认端口502)。
  3. 开放标准
    • 协议规范公开,无版权限制,支持跨厂商设备互联。

Modbus协议结构

  1. 数据帧格式(以Modbus RTU为例)
  • 地址域:1字节,标识从设备地址。
  • 功能码:1字节,定义操作类型(读/写)。
  • 数据域:可变长度,包含寄存器地址、数据值等。
  • 错误校验:2字节CRC校验(RTU)或LRC校验(ASCII)。
  1. Modbus寄存器类型
寄存器类型地址范围访问权限功能说明
线圈(Coils)0xxxx读/写布尔量(如开关状态)
离散输入(Inputs)1xxxx只读布尔量(如传感器输入)
保持寄存器(Holding)4xxxx读/写16位整数或浮点数
输入寄存器(Input)3xxxx只读16位整数或浮点数
  1. 常用功能码
功能码操作类型说明
01读线圈读取多个线圈状态(0x0000-0xFFFF)
02读离散输入读取多个离散输入状态
03读保持寄存器读取多个保持寄存器的值
04读输入寄存器读取多个输入寄存器的值
05写单个线圈设置单个线圈状态(ON/OFF)
06写单个保持寄存器写入单个保持寄存器的值
15写多个线圈批量设置线圈状态
16写多个保持寄存器批量写入保持寄存器的值

Modbus RTU 报文速查表(主站→从站),假设从站地址为0x01。

功能码操作类型请求报文(Hex)响应报文(Hex)关键说明
01读线圈01 01 00 00 00 0A BD CC01 01 02 55 01 4D 8F读地址0x0000开始的10(0A)个线圈,响应2字节(0x55=01010101,0x01=00000001)
02读离散输入01 02 00 00 00 08 B9 F901 02 01 0F 60 4D读地址0x0000的8个离散输入,响应1字节(0x0F=00001111)
03读保持寄存器01 03 00 6B 00 03 76 8701 03 06 12 34 56 78 9A BC 05 6F读地址0x006B开始的3个寄存器,返回3个16位值(0x1234, 0x5678, 0x9ABC)
04读输入寄存器01 04 00 00 00 02 70 0B01 04 04 00 FF 01 00 10 3A读地址0x0000的2个输入寄存器,返回2个值(0x00FF, 0x0100)
05写单个线圈01 05 00 03 FF 00 7C 3A01 05 00 03 FF 00 7C 3A写地址0x0003的线圈为ON(FF00=ON),响应与请求一致
06写单个保持寄存器01 06 00 01 00 FF 98 0401 06 00 01 00 FF 98 04写地址0x0001的保持寄存器为0x00FF,响应与请求一致
0F写多个线圈01 0F 00 00 00 0A 02 55 01 8E 5501 0F 00 00 00 0A 92 05写10个线圈(数据字节0x55=01010101,0x01=00000001)
10写多个保持寄存器01 10 00 01 00 02 04 00 0A 01 2C 47 0F01 10 00 01 00 02 C1 91写地址0x0001的2个寄存器(0x000A, 0x012C)
异常响应(功能码+0x80)01 83 02 C0 F101 83 02 C0 F1功能码0x03读寄存器异常(错误码0x02=地址无效)

关于我

抖音:嵌入式石小星

csdn:嵌入式石小星

微信公众号:嵌入式石小星

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值