Modbus协议在TCP/IP上的运用

news2024/11/25 14:33:21

文章目录

    • 1 Modbus规约
    • 2 Modbus TCP/IP
      • 2.1 概要
      • 2.2 0x01读线圈
      • 2.3 0x03读保持寄存器
      • 2.4 0x05写单个寄存器
      • 2.5 0x06写单个寄存器
      • 2.6 0x10写多个寄存器
    • 3 实例(ADU)

1 Modbus规约

  1. Modbus规约是典型的一问一答的通信规约,支持多种电气接口,可在各种介质上传输,并且消息帧格式简单、紧凑、易懂,方便形成工业控制网络。

  2. 通用的Modbus帧由4个部分组成:地址域、功能码、数据和差错校验。整个帧被称为应用数据单元(ADU),功能码和数据组成协议数据单元(PDU)。如下图所示:
    在这里插入图片描述

  3. 通信连接方式主要分为2种,串口和TCP/IP物理层,而串口里又细分为RTU模式和ASCII模式。串口的报文都需要差错校验,但是TCP/IP不需要。
    在这里插入图片描述

  4. 对于串口部分本文不涉及,本文主要围绕Modbus TCP/IP规约的几种常见功能码进行介绍。

2 Modbus TCP/IP

2.1 概要

  1. Modbus TCP/IP最大帧数据长度为260字节,不需要校验功能,因为
    • 底层TCP/IP确保端到端的连接
    • TCP/IP链路层确保传输数据的准确性
  2. 其中,MBAP报文头占用7个字节,分别是:
    • 2个字节的传输标识符(Transaction Id),包序号,可设为0,也可每次通信自动+1,在同一时刻,这个标识符必须唯一;
    • 2个字节的协议标识符(Protocol Id),Modbus协议为0,所以值为0x0000;
    • 2个字节的字节长度(Length),记录后续的字节个数,由服务器应答时生成,其他三个都是复制
    • 1字节的单元标识符(Unit Id),识别从机设备,为从站地址,即Slave Id
  3. 报文头后,就是功能码+数据部分。如下图:
    在这里插入图片描述
  4. 下文是常见的功能码使用,所讲结构单指PDU部分。注意:当响应异常时,异常功能码=正常功能码+0x80

2.2 0x01读线圈

  1. 该功能码的功能是读取各离散输出的开关(ON/OFF)状态。一个寄存器是2个字节,一个字节有8比特位,该功能就是读每个比特位的状态0/1。
  2. 请求PDU结构为:1字节的功能码+2字节的起始地址+2字节的线圈数量,如下图所示:
    在这里插入图片描述
  3. 响应PDU结构为:1字节功能码+1字节数+N个字节的线圈状态,如下图所示:
    在这里插入图片描述
  4. 举例,请求读离散量输出20-38的实例:
    • 请求PDU为:01 0013 0013,功能码0x01;起始地址0x0013,从0开始寻址线圈;输出数量0x0013,从20-38一共19个点
    • 响应PDU:01 03 CD 6B 05,功能码0x01;字节数0x03,一字节8比特位,要知道19个状态,需要3个字节;输出状态27-20为0xCD;输出状态35-28为0x6B;输出状态38-36为0x05。用零填充剩余高比特位。

2.3 0x03读保持寄存器

  1. 功能:使用该功能码读取保持寄存器连续块的内容,从0开始寻址寄存器。
  2. 请求PDU结构:1字节功能码+2字节起始地址+2字节寄存器数量(从起始地址开始要读多少个寄存器)
    在这里插入图片描述
  3. 响应PDU:1字节功能码+1字节字节数+字节数个字节表示寄存器值。
    在这里插入图片描述
  4. 举例,请求读寄存器108-110的值
    • 请求PDU:03 006B 0003,功能码0x03;起始地址0x006B,因为从0开始寻址,所以108对应107;寄存器数量0x0003,108-110共3个寄存器
    • 响应PDU:03 06 023B 0000 0065,功能码0x03,字节数0x06,3个寄存器,每个寄存器有2个字节,所以6个字节;寄存器108值0x023B;寄存器109值0x0000;寄存器110值0x0065

2.4 0x05写单个寄存器

  1. 功能:使用该功能码写单个输出为ON或OFF,0xFF00表示ON,0x0000表示OFF,其余都为非法值。从0开始寻址线圈。
  2. 请求PDU:1字节功能码+2字节输出地址+2字节输出值
    在这里插入图片描述
  3. 响应PDU:1字节功能码+2字节输出地址+2字节输出值。当响应正常时,请求PDU和响应PDU是一样的;异常时,1字节异常功能码+1字节异常码组成。
  4. 举例,请求写线圈173为ON:
    • 请求PDU:05 00AC FF00,功能码0x05;输出地址0x00AC,因为从0开始寻址线圈,所以173对应172;输出值0xFF00表示ON
    • 响应PDU:05 00AC FF00

2.5 0x06写单个寄存器

  1. 功能:使用该功能码写单个保持寄存器,从0开始寻址寄存器

  2. 请求PDU:1字节功能码+2字节寄存器地址+2字节寄存器值
    在这里插入图片描述

  3. 响应PDU:1字节功能码+2字节寄存器地址+2字节寄存器值。当响应正常时,请求PDU和响应PDU是一样的;异常时,1字节异常功能码+1字节异常码组成。

  4. 举例,请求将0x0003写入寄存器2中:

    • 请求PDU:06 0001 0003,功能码0x06;寄存器地址0x0001,从0开始寻址,所以寄存器2对应1;寄存器值0x0003
    • 响应PDU:06 0001 0003

2.6 0x10写多个寄存器

  1. 功能:使用该功能码写连续寄存器块。从0开始寻址。
  2. 请求PDU:1字节功能码+2字节起始地址+2字节寄存器数量+1字节的字节数+字节数个字节的寄存器值
    在这里插入图片描述
  3. 响应PDU:1个字节功能码+2字节起始地址+2字节寄存器数量
    在这里插入图片描述
  4. 举例,请求将0x000A和0x0102写入以2为开始的两个寄存器
    • 请求PDU:10 0001 0002 04 000A 0102,功能码0x10;起始地址0x0001;寄存器数量0x0002;字节数量0x04;写入值0x000A和0x0102
    • 响应PDU:10 0001 0002

3 实例(ADU)

  1. 客户端和服务端通过TCP/IP进行连接,下面为通信信息。
  2. 客户端请求:19B2 0000 0006 06 03 0027 0002
    • 0x19B2,MBAP报文头里的Transaction Id,服务端只要复制该内容,通常表示这一来回的序列号
    • 0x0000,MBAP报文头的Protocol Id,Modbus TCP/IP规定协议为0x0000,服务端只要复制该内容
    • 0x0006,MBAP报文头的Length,表示该字节以后的字节数量,服务器回时要自行计算。实例可见,该部分后06 03 0027 0002共有6个字节
    • 0x06,MBAP报文头的Unit Id,表示从站设备地址,slave Id
    • 0x03,功能码为0x03,读保持寄存器
    • 0x0027,起始地址,从寄存器40开始,因为从0寻址
    • 0x0002,寄存器数量,从起始寄存器开始读2个寄存器
  3. 服务端正常响应:19B2 0000 0007 06 03 04 0000 0000
    • 0x0007,表示其后的字节数,响应报文是7个字节,所以与请求报文的0x0006不同
    • 0x04,表示读寄存器的字节数,读2个寄存器,共4个字节
    • 0x0000 0000,读取的内容
  4. 服务端异常响应:19B2 0000 0003 06 83 02
    • 0x83,异常功能码是由正常功能码+0x80计算而来
    • 0x02,异常码,表示异常原因为非法数据地址。对于服务器(或从站)来说,询问中接收到的数据地址是不可允许的地址。比如:本次请求为读寄存器40-41的值,但是从站只有40个寄存器,这时将产生异常码0x02
    • 异常码还有许多,自行搜索查看

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

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

相关文章

android checkBox的使用

一、前言:之前工作中遇到的checkbox的使用是左边一个复选框,右边一个text。系统学完之后发现那样做的话有点别扭,还是中规中矩的舒坦。记录一下学习经过。 二、代码展示: 1.使用系统自带的checkbox插件。 创建一个CheckBoxActiv…

【Spring -02学习】

Spring 笔记记录 1. spring整合mybatis 注解开发2. spring整合junit3. IOC底层核心原理3.1 层次结构3.2 组件扫描器3.3 自定义导入器3.4 自定义注册器3.5 bean初始化过程解析 4.AOP配置4.1 AOP核心概念4.2 AOP入门案例4.2.1 XML方式4.2.2 注解方式 4. 3 切入点的三种形式4.4 五…

基于Python爬虫+K-means机器学习算法今日热点新闻推荐系统——热点推荐、热词呈现及个性化分析(含全部工程源码)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境Pycharm 环境相关库下载 模块实现1. 数据爬取2. 新闻处理与聚类3. 新闻推荐 系统测试1. 数据准备2. 文本聚类3. 热点新闻推荐 工程源代码下载其它资料下载 前言 本项目基于网络爬虫技术,用于爬取新闻…

01-创建项目-工具使用备忘录

创建项目 Keil5 (编写程序工具)生成输出hex文件 STC-ISP (下载程序辅助工具)辅助功能生成代码下载程序到单片机中运行 Keil5 (编写程序工具) 创建项目 创建好目录文件夹 选择对应芯片型号 不用自动生成启…

VMware虚拟机迁移到阿里云

1. 前言 最近公司内部研发部门有几台jenkins build机器运行在VMware平台上面,由于本地VMware平台底层计算资源不足导致虚拟机运行速度特别慢,每次版本发布都要build好久,而且VMware有时候计算资源不足,还会自动给占用资源大的机器…

nginx中的防盗链原理

一、什么是资源盗链 资源盗链是指内容不在自己服务器上,而通过技术手段,绕过别人的限制,将别人的内容,比如热门的图片放到自己页面上,展示给用户,以此来盗取别人网站的流量,即蹭流量。 简而言…

Mybatis【Map传参与模糊查询】

使用 Map 传参 当我们的实体类或者对应的数据库表的字段过多时,应当考虑使用Map! 我们之前通过对象传递参数来实现增改时,是通过传递对象做参数 来实现的: 我们在测试类中调用接口中的方法后,UserMapper.xml 会自动根…

阿里云短信发送接口实现

使用阿里云短信接口发送验证码 1. 引入依赖 springboot 工程引入web 引入 lombok 关键代码引入 <!--阿里云短信服务--> <dependency><groupId>com.aliyun</groupId><artifactId>dysmsapi20170525</artifactId><version>2.0.23<…

记录一次重装windows11没有WiFi驱动的排错错误示范

机器是自己组装的台式机&#xff1a; 查看主板的幸好&#xff0c;机箱我是没看懂&#xff0c;然后台式机 bios或者 msinfo32都可以查看 显示&#xff1a; 如下的页面进行查询&#xff1a; 下载 windows的驱动程序和工具包&#xff0c;结果显示华硕官网没有对应的驱动&#xf…

在线Markdown编辑器

一直在寻找一款好用的在线Markdown编辑器&#xff0c;但是好像没有比较知名的简洁的&#xff0c;寻思自己赶紧搞一个&#xff0c;于是找了项目&#xff0c;手动搞了一个上线了&#xff0c;效果不错&#xff0c;特性拉满。欢迎试用 支持“标准” Markdown / CommonMark 和 Gith…

点云可视化

pcl::visualization::CloudViewer 与 pcl::visualization::PCLVisualizer的区别 pcl::visualization::CloudViewer是一个简单的点云查看器类&#xff0c;提供了一个简单的接口来在窗口中显示点云数据。它可以快速地显示点云&#xff0c;并且只需要几行代码即可实现简单的点云查…

数据结构与算法:链表、树、图、堆、散列表

1 链表 链表是线性数据结构&#xff08;数据元素之间存在着“一对一”关系&#xff09;&#xff0c;链表中的每个元素是一个包含数据data和引用字段的对象&#xff0c;引用字段只有next为单向链表&#xff0c;同时又prev和next为双向链表。 1.1 链表基本操作 链表读取第 i 个…

java集合体系结构笔记

java集合的特点&#xff1a; 提供一种存储空间可变的存储模型&#xff0c;存储的数据容量可以随时发生改变。 单列数据&#xff1a; 双列数据&#xff1a; 单列数据集合存储实现接口Collection 双列数据集合存储实现接口Map 单列数据集合&#xff0c;数据值可重复存储实…

git杀手级功能 —— 分支管理

目录 分支介绍 创建分支 切换分支 和并分支 删除分支 合并冲突 分支管理策略 分支策略 bug分支 其他问题 强行删除临时分支 结语 分支介绍 在版本回退里发现&#xff1a;每次提交&#xff0c;git都会把它们穿成一条时间线&#xff0c;而这条时间线就可以理解为一个分支…

数据库监控与调优【十八】—— Percona Toolkit调优神器安装与使用

Percona Toolkit调优神器安装与使用 Percona Toolkit安装 本文基于Percona Toolkit 3.2.0&#xff0c;理论支持所有版本。 Percona Toolkit是一款MySQL世界里面非常实用的工具套件&#xff0c;如何安装它。 Windows系统 不支持。详见https://forums.percona.com/discussion/…

vue 一直运行 /sockjs-node/info?t=解决办法

sockjs-node介绍 sockjs-node 是一个JavaScript库&#xff0c;提供跨浏览器JavaScript的API&#xff0c;创建了一个低延迟、全双工的浏览器和web服务器之间通信通道。 服务端&#xff1a;sockjs-node&#xff08;https://github.com/sockjs/sockjs-node&#xff09;客户端&…

短视频抖音账号矩阵系统源码开发者自研(二)

一、短视频账号矩阵系统源码开发储存集群化开发运转更快 短视频账号矩阵系统源码开发采用储存集群化开发&#xff0c;可以显著提高系统的运转速度和效率。通过优化储存结构和算法&#xff0c;系统能够更快地处理短视频账号数据&#xff0c;确保用户能够流畅地浏览和观看短视频…

6.4 原子引用

1、什么是原子引用 原子引用以cas的方式实现控制多线程之前的同步&#xff0c;从而保证多线程的安全性 原子引用主要有以下三个类 AtomicReferenceAtomicStampReferenceAtomicMarkableReference 2、demo演示 Slf4j(topic "c.Test35") public class Test35 {pub…

C++day2

一、类和结构体的区别 成员访问权限&#xff1a;类中的成员默认是私有的&#xff0c;需要使用访问修饰符&#xff08;如public、private、protected&#xff09;来显式指定访问权限。而结构体中的成员默认是公共的&#xff0c;即可以直接访问。 继承&#xff1a;类支持继承&am…