Modbus TCP
Modbus
(👆 百度百科,放心跳转)
起源
Modbus 由 Modicon 公司于 1979 年开发,是一种工业现场总线协议标准。
Modbus 通信协议具有多个变种,支持串口,以太网多个版本,其中最著名的是 Modbus RTU、
Modbus ASCII 和 Modbus TCP 三种。Modbus TCP 是在施耐德收购 Modicon 后 1997 年发布的。
分类
1、Modbus RTU(Remote Terminal Unit)
运行在串口上的协议,采用二进制表现形式以及紧凑的数据结构,通信效率高,应用广泛。
2、Modbus ASCII
运行在串口上的协议,采用 ASCII 码进行传输,并且在每个字节的开始和结束 都有特殊字符作为标志,传输效率远远低于 Modbus RTU,只有传输数据量较小时,才会考虑。
3、Modbus TCP
运行在以太网上的协议。
优势
免费、简单、容易使用。
应用场景
Modbus 协议是现在国内工业领域应用最多的协议,不只 PLC 设备,各种终端设备,比如水控机、水表、电表、工业秤、各种采集设备,都应用此协议。
通信
1、Modbus 采用主从问答式(master / slave)通信;
有一个节点是 master 节点,其他使用 Modbus 协议参与通信的节点是 slave 节点(可多个), 每个 slave 设备都有唯一一个地址。
Modbus TCP
Modbus TCP 协议 和 Modbus RTU 协议非常相似,只要把 RTU 协议中两个字节的校验码去掉,然后在 RTU 协议的开始加上 5 个 0 和 1 个 6,通信时通过 TCP/IP 网络协议发送出去即可。
特点
1、见“Modbus ——> 通信”;
2、该协议是 应用层的协议,基于传输层的 TCP协议 进行通信;
3、Modbus TCP 默认接收报文的端口号为 502。
协议格式(报文头 + 功能码 + 数据)
Modbus TCP/IP 协议 最大数据帧长度为 260 字节。报文格式如下:
报文头
功能码
寄存器
线圈寄存器,类比为开关量,每一个 bit 都对应一个信号的开关状态,所以 一个 byte 就可以同时控制8 路的信号。 线圈寄存器支持读也支持写,写又分为写单个线圈寄存器和写多个线圈寄存器。
对应功能码:0x01 0x05 0x0f
离散输入寄存器,相当于线圈寄存器的只读模式,也是每个 bit 表示一个开关量,其开关量只能读取输入的开关信号,是不能写的。比如读取外部按键的按下还是松开。
对应功能码: 0x02
保持寄存器,单位不再是 bit 而是两个 byte,是可以存放具体的数据量的。比如设置时间年月日,不但可以写入也可以读出。该寄存器并可读写的,写也分为写单个保持寄存器和写多个保持寄存器。
对应功能码: 0x03 0x06 0x10
输入寄存器,和保持寄存器类似,但也只支持读而不能写。一个寄存器也是占据两个 byte 的空间。比如,通过读取输入寄存器获取现在的 AD 采集值。
对应功能码: 0x04
读数据
主机 ——>从机:
报文头 + 功能码 + 起始地址 + 数量
7 + 1 + 2 + 2 = 12
从机 ——>主机:
报文头 + 功能码 + 字节计数 + 数据
7 + 1 + 1 + n = 9 + n
0x01(读线圈状态)
0x02(读离散输入状态)
0x03(读保持寄存器)
0x04(读输入寄存器)
写单个
主机 ——>从机:
报文头 + 功能码 + 地址 + 断通标志 / 数据
7 + 1 + 2 + 2 = 12
从机 ——>主机:
原文返回
0x05(写单个线圈)
0x06(写单个保持寄存器)
写多个
主机 ——>从机:
报文头 + 功能码 + 起始地址 + 数量 + 字节计数 + 数据
7 + 1 + 2 + 2 + 1 + n = 13 + n
从机 ——>主机:
报文头 + 功能码 + 起始地址 + 数量
7 + 1 + 2 + 2 = 12
0x0F(写多个线圈)
0x10(写多个保持寄存器)
工具软件的安装与使用
Modbus poll
破解
点击 connection -> connect,输入序列号即可。
使用
先设置,后连接。
Modbus slave
破解
点击 connection -> connect,输入序列号即可。
使用
先设置,后连接。
网络调试助手
Wireshark(Windows 版)
捕获器选择:
如果连接有线网络,选择本地连接 / 以太网;
如果连接无线网络,选择 WLAN;
如果只是在本机上的通信,可以选择 NPCAP Loopback apdater 或 Adapter for loopback traffic capture。
过滤条件:
1、过滤端口:tcp.port == 502
2、过滤IP:ip.addr == Windows 的IP
练习:
1、读传感器数据,读1个寄存器数据,写出主从数据收发协议。
2、写出控制 IO 设备开关的协议数据,操作1个线圈,置1。
3、在虚拟机编写客户端,实现 poll 端功能,和 Slave 通信,读保持寄存器的三个值。
uint8_t hldreg[12] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x03, 0x00, 0x00, 0x00, 0x03};send(sockfd, hldreg, sizeof(hldreg), 0);uint8_t buf[32] = {};recv(sockfd, buf, sizeof(buf), 0);for (int i = 0; i < buf[8]; i++)printf("%#x ", buf[9+i]);putchar(10);
运行结果如下:
4、编写客户端程序,实现对 Slave 单个线圈的控制(置一)。
uint8_t coil[12] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x05, 0x00, 0x00, 0xff, 0x00};send(sockfd, coil, sizeof(coil), 0);
运行结果如下:
5、封装函数:设置单元标识符(从机地址)
void set_slave_id(uint8_t *p, int slave_id){p[6] = slave_id;
}
6、封装函数:读保持寄存器
void read_hldreg(int addr, int num, uint8_t *hldreg, uint8_t *dest){hldreg[5] = 0x06;hldreg[7] = 0x03;hldreg[8] = addr >> 8;hldreg[9] = addr & 0xff;hldreg[10] = num >> 8;hldreg[11] = num & 0xff;send(sockfd, hldreg, 12, 0); // 指针类型,不能 sizeof(hldreg)recv(sockfd, dest, 64, 0); // 64 为数组 dest 的长度,sockfd 为全局变量
}
相关文章:

Modbus TCP
Modbus (👆 百度百科,放心跳转) 起源 Modbus 由 Modicon 公司于 1979 年开发,是一种工业现场总线协议标准。 Modbus 通信协议具有多个变种,支持串口,以太网多个版本,其中最著名的…...

基于人工兔算法优化概率神经网络PNN的分类预测 - 附代码
基于人工兔算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于人工兔算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于人工兔优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神经网络…...

微服务学习(十二):安装Minio
微服务学习(十二):安装Minio 一、简介 MinIO 是一款基于Go语言发开的高性能、分布式的对象存储系统。客户端支持Java,Net,Python,Javacript, Golang语言。MinIO系统,非常适合于存储大容量非结构化的数据,例如图片、视…...

SpringCloud实用-OpenFeign整合okHttp
文章目录 前言正文一、OkHttpFeignConfiguration 的启用1.1 分析配置类1.2 得出结论,需要增加配置1.3 调试 二、OkHttpFeignLoadBalancerConfiguration 的启用2.1 分析配置类2.2 得出结论2.3 测试 附录附1:本系列文章链接附2:OkHttpClient 增…...
Python 异步套接字编程
异步套接字编程是异步编程在网络通信中的应用,它使用异步 IO 操作和事件循环来实现高并发的网络应用。Python 中的 asyncio 模块提供了对异步套接字编程的支持,以下是异步套接字编程的一些重要概念和使用方法: 1. 异步套接字服务器ÿ…...

今年的校招薪资真的让人咋舌!
秋招接近尾声,各大公司基本也陆续开奖了。这里整理了部分公司的薪资情况,数据来源于 OfferShow 和牛客网。 ps:爆料薪资的几乎都是 211 和 985 的,并不是刻意只选取学校好的。另外,无法保证数据的严格准确性。 淘天 …...

debian 设置系统默认以命令行方式启动,关闭x windows
debian 设置系统默认以命令行方式启动,关闭x windows 2021-01-02 tech linux 设置 grub启动设置在/etc/default/grub中,打开 default grub 配置: $ sudo vim /etc/default/grub修改以下配置: 更新grub,设置多用户启动: …...
AMEYA360:蔡司新能源汽车解决方案驱动产业未来
电动化正在重塑中国汽车工业。自中国汽车工业开始发展以来,在电动化和智能化的浪潮推动下,汽车行业从未面临着如此巨大的变革。得益于中国汽车产业尤其是新能源车过去十余年的激流勇进,消费者对新能源汽车的接受度也在发生转变。新能源汽车市…...
C#面试问题整理
sqlserver中视图和表的区别 在 SQL Server 中,视图(View)和表(Table)是不同的对象,它们有以下几点区别: 数据存储方式:表是一种实际存储数据的数据库对象,它包含列和行&…...

微信小程序 基于Android的共享付费自习室座位选座系统uniAPP
题目: 基于Android的共享自习室APP设计与实现 (学校要求:数据库不少于有逻辑关系的20个表,系统功能不少于60个功能点) 技术: 功能: 1. 用户端: 一、首页: (1&…...
Java中类的类型判断技巧以及没有无参构造函数时的应对策略。isInstance()方法解析
类的类型判断 基本数据类型的包装类中,例如Integer、Long这些类是没有无参构造方法的,因此在以下情况中,会出错 具体类型是未知的,只有全路径类名 String typeSte "java.lang.Integer"; Class<?> typeClass …...

基于微信小程序的员工宿舍报修系统
项目介绍 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时…...

机器学习探索计划——KNN算法流程的简易了解
文章目录 数据准备阶段KNN预测的过程1.计算新样本与已知样本点的距离2.按照举例排序3.确定k值4.距离最近的k个点投票 scikit-learn中的KNN算法 数据准备阶段 import matplotlib.pyplot as plt import numpy as np# 样本特征 data_X [[0.5, 2],[1.8, 3],[3.9, 1],[4.7, 4],[6.…...

ES6之class类
ES6提供了更接近传统语言的写法,引入了Class类这个概念,作为对象的模板。通过Class关键字,可以定义类,基本上,ES6的class可以看作只是一个语法糖,它的绝大部分功能,ES5都可以做到,新…...

17 redis集群方案
1、RedisCluster分布式集群解决方案 为了解决单机内存,并发等瓶颈,可使用此方案解决问题. Redis-cluster是一种服务器Sharding技术,Redis3.0以后版本正式提供支持。 这里的集群是指多主多从,不是一主多从。 2、redis集群的目标…...

[数据结构]—栈和队列
💓作者简介🎉:在校大二迷茫大学生 💖个人主页🎉:小李很执着 💗系列专栏🎉:数据结构 每日分享✨:到头来,有意义的并不是结果,而是我们度…...
【GridSearch】 简单实现并记录运行效果
记录了使用for循环实现网格搜索的简单框架。 使用df_search记录每种超参数组合下的运行结果。 lgb_model.best_score返回模型的最佳得分 lgb_model.best_iteration_返回模型的最佳iteration也就是最佳n_extimator import numpy as np import pandas as pd import lightgbm as …...
SecureCRT出现Key exchange failed.No compatible key exchange method. 错误解决方法
SecureCRT出现Key exchange failed.No compatible key exchange method. 如下 Key exchange failed. No compatible key exchange method. The server supports these methods: curve25519-sha256,curve25519-sha256libssh.org,diffie-hellman-group-exchange-sha256解决方法&…...
Android RGB转YUV的算法
将 ARGB(Alpha-Red-Green-Blue)颜色空间转换为 YUV(亮度-色度)颜色空间的常用算法有以下几种: 矩阵转换法 使用预定义的转换矩阵将 RGB 值转换为 YUV 值。其中,Y 表示亮度,U 和 V 表示色度。这…...
Spring事务底层原理(待完善)
EnableTransactionManagement 我们经常使用EnableTransactionManagement开启事务, 这个注解导入一个类,Import(TransactionManagementConfigurationSelector.class), 会在spring容器增加两个bean, AutoProxyRegistrar和ProxyTransactionManagementConfiguration. AutoProxyRe…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...