Modbus TCP

news2025/1/10 18:20:33

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 为全局变量
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1241076.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智慧城市内涝积水监测仪功能,提升城市预防功能

内涝积水监测仪不仅改变了人们应对城市内涝的老办法&#xff0c;还让智慧城市往前迈了一大步。这个监测仪是怎么做到的呢&#xff1f;就是靠它精准的数据监测和预警&#xff0c;让城市管理有了更科学高效的解决妙招。它就像有了个聪明又负责任的助手&#xff0c;让城市管理更加…

AI虚拟主播系统+智能交互+AI词库+虚拟形象 附带完整的搭建教程

近几年电商直播带货热潮持高不跌&#xff0c;很多商家企业都会选择线上直播卖产品&#xff0c;与此同时&#xff0c;虚拟主播开始盛行&#xff0c;与真人主播相比&#xff0c;品牌虚拟主播无档期风险、离职风险、人设稳定更可控。 AI虚拟主播的不是为了取代真人主播而开发&…

AI:86-基于深度学习的街景图像地理位置识别

🚀 本文选自专栏:人工智能领域200例教程专栏 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的代码,详细讲解供大家学习,希望可以帮到大家。欢迎订阅支持,正在不断更新中,…

mapBox地图第一个案例和聚合图标自定义

Mapbox地图数据平台 1.简介 Mapbox是移动的和Web应用程序的位置数据平台&#xff0c;适用于分层区位分析图&#xff0c;可自定义元素、色彩等&#xff0c;任何图层都可编辑.。Mapbox灵活的地图和位置构建块可以无缝集成到您的数据分析应用程序或数据可视化中。 平滑的矢量地…

Dubbo从入门到上天系列第十八篇:Dubbo引入Zookeeper等注册中心简介以及DubboAdmin简要介绍,为后续详解Dubbo各种注册中心做铺垫!

文章目录 一&#xff1a;Dubbo注册中心引言 1&#xff1a;什么是Dubbo的注册中心&#xff1f; 2&#xff1a;注册中心关系图解 3&#xff1a;引入注册中心服务执行流程 4&#xff1a;Dubbo注册中心好处 5&#xff1a;注册中心核心作用 二&#xff1a;注册中心实现方案 …

10.docker的网络network-概述

1.docker的网络模式 docker共有四种网路模式&#xff0c;分别是bridge、host、none和container. 1.1 bridge bridge,也称为虚拟网桥。在bridge模式下&#xff0c;为每个容器分配、配置IP等&#xff0c;并将容器连接到一个docker0。使用–network bridge命令指定&#xff0c;…

程序员指南六:数据平面开发套件

PORT HOTPLUG FRAMEWORK 端口热插拔框架为DPDK应用程序提供在运行时附加和分离端口的能力。由于该框架依赖于PMD实现&#xff0c;PMD无法处理的端口超出了该框架的范围。此外&#xff0c;在从DPDK应用程序分离端口后&#xff0c;该框架不提供从系统中移除设备的方法。对于由物…

【用unity实现100个游戏之16】Unity中程序化生成的2D地牢5(附项目源码,完结)

文章目录 最终效果前言生成墙壁优化方法一、使用rule tile方法二、使用代码生成墙壁补充最终效果后续参考源码完结最终效果 前言 本期是本项目最后一期,主要是进行墙壁的生成优化和补充一下剩下了的其他内容 生成墙壁优化 方法一、使用rule tile 我这里大概给个rule tile参…

跟着Cancer Cell 学作图| 配对棒棒糖图(Lollipop chart)

dotplot 本期图片 ❝ Doi&#xff1a;https://doi.org/10.1016/j.ccell.2022.02.013 ❞ ❝ Dotplot showing the association of cell populations with different tissue types (organ or tumor). The x axis represents cell types, and the y axis represents the different…

对比两个数组中对应位置的两个元素将每次对比的最大值用于构成新的数组np.maximum()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 对比两个数组中对应位置的两个元素 将每次对比的最大值用于构成新的数组 np.maximum() 选择题 以下代码的输出结果为&#xff1f; import numpy as np a1 [1,2,33] a2 [11,2,3] print("…

webshell之无扩展免杀

1.php加密 这里是利用phpjiami网站进行加密&#xff0c;进而达到加密效果 加密前&#xff1a; 查杀效果 可以看到这里D某和某狗都查杀 里用php加密后效果 查杀效果 可以看到这里只有D某会显示加密脚本&#xff0c;而某狗直接绕过 2.dezend加密 可以看到dezend加密的特征还是…

DockerHub 无法访问 - 解决办法

背景 DockerHub 镜像仓库地址 https://hub.docker.com/ 突然就无法访问了,且截至今日(2023/11)还无法访问。 这对我们来说,还是有一些影响的: ● 虽然 DockerHub 页面无法访问,但是还是可以下载镜像的,只是比较慢而已 ● 没法通过界面查询相关镜像,或者维护相关镜像了…

【JavaEE初阶】认识线程、创建线程

1. 认识线程&#xff08;Thread&#xff09; 1.1 概念 1) 线程是什么 一个线程就是一个 "执行流". 每个线程之间都可以按照顺序执行自己的代码. 多个线程之间 "同时" 执行着多份代码. 举例&#xff1a; 还是回到我们之前的银⾏的例⼦中。之前我们主要描…

算法——双指针

一、背景知识 双指针&#xff08;Two Pointers&#xff09;&#xff1a;指的是在遍历元素的过程中&#xff0c;不是使用单个指针进行访问&#xff0c;而是使用两个指针进行访问&#xff0c;从而达到相应的目的。对撞时针&#xff1a; 两个指针方向相反对撞指针一般用来解决有序…

ts实现合并数组对象中key相同的数据

背景 在平常的业务中&#xff0c;后端同学会返回以下类似的结构数据 // 后端返回的数据结构 [{ id: 1, product_id: 1, pid_name: "Asia", name: "HKG01" },{ id: 2, product_id: 1, pid_name: "Asia", name: "SH01" },{ id: 3, pro…

为Oracle链接服务器使用分布式事务

1 现象 在SQL Server中创建指向Oracle的链接服务器&#xff0c;SQL语句在事务中向链接服务器插入数据。返回链接服务器无法启动分布式事务的报错。 2 解决 在Windows平台下&#xff0c;SQL Server依赖分布式事务协调器&#xff08;MSDTC&#xff09;来使用分布式事务&#xff0…

Autocad2020切换经典界面

Autocad2020切换经典界面 1.更改1.1设置另存为 1.更改 1.1设置另存为

CURL踩坑记录

因为项目使用的windows server&#xff0c;且没有安装Postman&#xff0c;所以对于在本地的Postman上执行的请求&#xff0c;要拷贝到服务器执行&#xff0c;只能先转化成为curl命令&#xff0c;操作也很简单&#xff0c;如下&#xff1a; 注意&#xff0c;Postman默认对url包围…

关于 win11 系统下12代/13代英特尔大小核架构 CPU 的 VMware 优化:输入延迟、卡顿,大小核调度

关于 win11 系统下12代/13代英特尔大小核架构 CPU 的 VMware 优化&#xff1a;输入延迟、卡顿&#xff0c;大小核调度 一、前言二、VMware 的优化2.1 键鼠输入延迟问题的解决2.1.1 搜索内核隔离2.1.2 关闭内存完整性并重启2.1.3 搜索启用或关闭windows功能2.1.4 关闭 hyper-v 和…