Modbus协议

文章目录

概念

modbus是工业通信总线协议,常用于PLC设备中,像水表、电表等。

优势是免费、简单。

采用主从问答通信(用于信息采集和控制)


分类

modbus RTU:运行在串口上 二进制传输 效率高

modbus ASCII:运行在串口上 ascii传输 用于通信数据量较小的情况下

modbus TCP:运行在以太网上 是应用层协议 基于传输层的TCP协议实现 端口号502


协议格式

报文头7字节(4字节序列号+2字节长度+1字节单元标识符) + 功能码(1字节) + 数据


寄存器

一、位寄存器(1字节) 开关量

输出线圈

离散量输入寄存器

二、字寄存器(2字节) 存储数据

保持/输出寄存器

输入寄存器


读写

功能码

0x01:读输出线圈

0x02:读离散量输入寄存器

0x03:读保持寄存器

0x04:读输入寄存器

0x05:写单个线圈

0x06:写单个保持寄存器

0x0F:写多个线圈

0x10:写多个保持寄存器

读写模板

读:

主机->从机:报文头7byte+功能码1字节+起始地址2byte+数量2byte

从机->主机:报文头7byte+功能码1字节+字节计数1byte+数据

写单个:

主机->从机:报文头7byte+功能码1字节+起始地址2byte+断通标志/数据2byte

写多个:

主机->从机:报文头7byte+功能码1字节+起始地址2byte+数量2byte+字节计数1byte+数据

注意:"断通标志"字段是2字节,但协议规定:这个字段只能天0x0000(对应"关")或0xFF00(对应"开"),实际有效信息只有1位(其他位是协议要求的固定填充)

案例:



Modbus库

应用modbus时,通常会安装modbus库,调用封装好的modbus接口

读输出线圈:modbus_read_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);

读离散量输入寄存器:modbus_read_input_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);

读保持寄存器:modbus_read_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest);

读输入寄存器:modbus_read_input_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest);

写单个线圈:modbus_write_bit(modbus_t *ctx, int addr, int status);

写单个保持寄存器:modbus_write_register(modbus_t *ctx, int addr, int value);

写多个线圈:modbus_write_bits(modbus_t *ctx, int addr, int nb, const uint8_t *val);

写多个保持寄存器:modbus_write_registers(modbus_t *ctx, int addr, int nb, const uint16 *val);

代码举例:

相关推荐
程序员夏洛4 分钟前
HTTP 2.0 和 3.0 有什么区别?
网络·网络协议·http
Sylvia33.4 小时前
LOL实时数据接入深度解析:从WebSocket到完整数据模型
java·网络·python·websocket·网络协议
鼹鼠SDN7 小时前
没有公网 IP,如何在外面访问家里的打印机、摄像头和整个局域网?
网络·网络协议·tcp/ip
幼儿园蛋小黑12 小时前
TCP 并发:从原理到高并发实践
网络·网络协议·tcp/ip
驭渊的小故事15 小时前
网络原理04(http协议详细解析3)(2000详细解析HTTPS的工作原理)
网络·网络协议·http
额额额对了16 小时前
Linux 进程间通信(IPC)核心机制:消息队列、共享内存与信号量详解
linux·网络·网络协议
IPdodo_16 小时前
2026年爬虫代理 IP 选择指南:从可用率、延迟到成本验收
网络协议·tcp/ip·scrapy·http·https·beautifulsoup·httpx
程序员夏洛17 小时前
HTTP 请求包含哪些内容,请求头和请求体有哪些类型?
网络·网络协议·http
瓦格哈儿19 小时前
删掉旧 SSL 证书会影响线上业务吗?风险点梳理
网络协议·https·ssl
美酒没故事°20 小时前
https和tls有什么区别?
网络协议·http·https