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…...
用Python给图片藏个小秘密:手把手教你实现LSB隐写术(附完整代码)
用Python给图片藏个小秘密:手把手教你实现LSB隐写术(附完整代码) 你是否想过在朋友圈分享的照片里藏一段悄悄话?或是把重要信息伪装成普通图片?这听起来像间谍电影里的情节,但用Python只需几十行代码就能实…...
告别手动配置!用Docker一键部署树莓派巴法云客户端,支持TCP/MQTT自动重连
树莓派Docker巴法云:打造高可靠物联网客户端的工程实践 家里闲置的树莓派终于有了用武之地——作为巴法云客户端实现智能家居控制。但直接运行Python脚本总会遇到网络波动导致连接中断、系统重启后需手动恢复等问题。本文将分享如何用Docker容器化技术构建具备自动恢…...
抖音批量下载终极指南:免费开源工具快速搞定视频素材管理
抖音批量下载终极指南:免费开源工具快速搞定视频素材管理 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback su…...
Moon主题开发原理深度解析:Jekyll架构与主题设计哲学
Moon主题开发原理深度解析:Jekyll架构与主题设计哲学 【免费下载链接】Moon 🌓 Moon is a minimal, one column jekyll theme. 项目地址: https://gitcode.com/gh_mirrors/moon/Moon Moon是一款基于Jekyll构建的极简单栏博客主题,以其…...
快速部署ComfyUI Qwen:人脸生成图像环境搭建与模型加载
快速部署ComfyUI Qwen:人脸生成图像环境搭建与模型加载 1. 环境准备与快速部署 1.1 系统要求检查 在开始部署前,请确保你的设备满足以下最低配置要求: 操作系统:Windows 10/11 64位、macOS 10.15或Linux发行版(如U…...
Pixel Aurora Engine实际应用:像素风APP图标+启动页+引导页一体化生成
Pixel Aurora Engine实际应用:像素风APP图标启动页引导页一体化生成 1. 像素极光引擎简介 Pixel Aurora Engine是一款基于AI扩散模型的高端绘图工作站,专为像素艺术创作而设计。它采用复古像素游戏风格的界面设计,通过简单的文字描述就能生…...
手把手教你用OllyDbg(OD)修改程序内存数据(附快捷键大全)
逆向工程实战:用OllyDbg从零破解内存数据的终极指南 当你想了解一个程序内部运作机制,或者需要修复某个软件的小缺陷时,逆向工程工具就像一把打开黑盒子的钥匙。而OllyDbg(简称OD)无疑是Windows平台上最强大的调试器之…...
深入SGLang HiCache与LMCache:两大KV Cache卸载方案,我该选哪个?
深入解析SGLang HiCache与LMCache:KV Cache卸载技术选型指南 在大模型推理服务中,KV Cache管理是影响性能的关键因素之一。随着模型规模的不断扩大,KV Cache占用的显存资源也急剧增加,如何高效管理这些缓存成为技术团队必须面对的…...
如何用Gotham.rs构建RESTful API:10个核心技巧快速上手
如何用Gotham.rs构建RESTful API:10个核心技巧快速上手 【免费下载链接】gotham A flexible web framework that promotes stability, safety, security and speed. 项目地址: https://gitcode.com/gh_mirrors/go/gotham Gotham.rs是一个灵活的Web框架&#…...
软件可用性管理中的MTTR优化
软件可用性管理中的MTTR优化:提升系统可靠性的关键策略 在数字化时代,软件系统的可用性直接影响用户体验和业务连续性。平均修复时间(MTTR)是衡量系统可靠性的核心指标之一,它反映了从故障发生到问题解决所需的平均时…...
