Modbus协议在TCP/IP上的运用

news/2024/5/9 12:54:16/文章来源:https://blog.csdn.net/yiyantangad/article/details/131439245

文章目录

    • 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.luyixian.cn/news_show_323807.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构--顺序栈的实现

数据结构–顺序栈的实现 顺序栈的定义 顺序栈的定义代码实现 #define MaxSize 10 typedef struct {ElemType data[MaxSize]; //静态数组存放栈中元素int top; //栈顶指针 } SqStack;int main() {SqStack S; //声明一个顺序栈(分配空间)//... ...return 0; }一些常见操作 初始…

hyperf 学习 一、搭建

docker中ubuntu容器php语言hyperf框架开发环境搭建。 docker地址:Docker tag:20.04 docker pull ubuntu:20.04docker run --name hyperf -v D:\workspace\docker\hyperf:/wj/hyperf -p 9501:9501 -it --privileged -u root --entrypoint /bin/sh ubuntu:20.04步骤…

事务不同的隔离级别产生的脏读、不可重复读、幻读是什么

目录 1.什么是事务的隔离级别 2.脏读 3.不可重复读 4.幻读 1.什么是事务的隔离级别 1.声明式事务属性---事务隔离级别 2.设置隔离级别为默认级别(在mysql中为可重复读) Transactional(isolation Isolation.DEFAULT ) 3.什么是隔离级别&#xff…

SpringBoot - 在IDEA中经常发现:Could not autowire. No beans of ‘xxx‘ type found的错误

错误描述 在SPRINGBOOT的项目中,使用IDEA时经常会遇到Could not autowire. No beans of ‘xxxx’ type found的错误提示,但是程序的编译和运行都没有问题,这个错误提示并不影响项目的生产。 解决方案

【保姆级】Redis安装教程(Windows版)

Redis安装教程(Windows版) 文章目录 Redis安装教程(Windows版)1.下载安装包2. 安装注意事项3. 注意事项4. 登录Redis客户端5. 停止Redis服务附:详细安装步骤附:RESP(Redis桌面管理)使…

leetcode 145. 二叉树的后序遍历

2023.6.24 继上一题前序遍历&#xff0c;这道后序遍历就很容易了&#xff0c;把递归的顺序稍微改一下就行。 递归法&#xff1a; class Solution { public:void travelsal(TreeNode* cur , vector<int>& ans){if(cur nullptr) return;travelsal(cur->left , an…

【静态单元格 Objective-C语言】

一、预习QQ动态 1.我们今天,是三、到四个任务,第一个任务,就是这个,预习QQ动态 OK,看到这个效果了吗 这是咱们第一个任务,第一个任务,是实现这么一个效果, 一看这个,就肯定是个啥,UITableView吧, 是不是肯定是一个TableView啊 又能滚动,又能显示一行一行的数据…

解密:Prompt、Token、和completions是什么?

Prompt、Token、和completions 本文是科普向&#xff0c;大家放心阅读 在ChatGPT越来越火的时候&#xff0c;很多开发者都想大展拳脚&#xff0c;但在这之前&#xff0c;我们需要了解一些基础知识&#xff0c;比如你知道什么是token、什么是prompt、什么是Complemention Pro…

Windows 引导启动流程详述(BIOS-UEFI)

Windows 启动流程详述 BIOS 和 UEFI 的由来BIOS 存在哪里BIOS 程序的功能BIOS 和 UEFI 的发展由来如何查看当前计算机是什么方式引导启动呢&#xff1f;Linux 下如何查看 BIOS 大小&#xff1f; 启动流程详述使用 BIOS 进行系统启动流程使用 UEFI 进行系统启动流程SEC阶段PEI阶…

广州华锐互动:机电专业VR模拟实操教学平台提供沉浸式的实践操作和训练机会

虚拟现实(VR)技术是一种先进的技术&#xff0c;可以应用于机电专业的培训中。以下是VR技术应用到机电专业培训的一些好处&#xff1a; 模拟实际操作环境&#xff1a;VR技术可以创建一个虚拟的环境&#xff0c;模拟真实的机械和电气设备的操作环境。这使得学生可以在安全的环境…

自定义MVC

目录 一、MVC概念描述 1、什么是MVC&#xff1f; 2、什么是自定义MVC&#xff1f; 3、自定义MVC有什么用&#xff08;主要用途&#xff09;&#xff1f; 二、MVC三层架构 第一种版本 JSP页面 servlet 结果 第二种版本 JSP代码 servlet 结果 第三种版本 jsp页面 s…

Ubuntu18.04 系统设置修改物理内存-迅为RK3568开发板

打开虚拟机&#xff0c;如下图。单击红色框中的“虚拟机”。如下图所示&#xff1a; 然后点击“设置”弹出虚拟机的设置界面&#xff0c;如下图所示&#xff1a; 更多教程B站搜&#xff1a;迅为3568开发板

云原生运维实战 | 快速解决高可用K8s集群证书到期问题

欢迎关注「全栈工程师修炼指南」公众号 设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习&#xff01; 专注 企业运维实践、网络安全、系统运维、应用开发、物联网实战、全栈文章 等知识分享 “ 花开堪折直须折&#xff0c;莫待无花空折枝。 ” 作者主页&#xff1…

(小程序)uniapp调接口完整流程

(小程序)uniapp调接口完整流程 代码&#xff1a; <script lang"ts" setup>import { ref } from "vue"; const form ref({searchVal: "", });//搜索const searchClick () > {console.log(form.value.searchVal)let data {text: form…

Redis高并发分布式锁

文章目录 高并发场景秒杀抢购超卖Bug高并发场景秒杀抢购Demo测试结果 JVM级别锁使用nginx对本地服务进行负载均衡 Redis实现分布式锁Redis分布式锁实现DemoRedis分布式锁有关问题 分布式锁性能的提升减少锁的粒度使用异步处理 高并发场景秒杀抢购超卖Bug 在今天的数字化世界中&…

Python操作SQLite数据库

文章目录 这篇博客很简单&#xff0c;简单记录下SQLite基础使用。有些数据文件是.db为扩展名的&#xff0c;要用到SQLite进行读写和增删改查操作。SQLite数据库是一种轻量级的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;以单个文件的形式存储&#xff0c;整…

【数据挖掘】时间序列教程【二】

2.4 示例&#xff1a;颗粒物浓度 在本章中&#xff0c;我们将使用美国环境保护署的一些空气污染数据作为运行样本。该数据集由 2 年和 5 年空气动力学直径小于或等于 3.2017 \&#xff08;mu\&#xff09;g/m\&#xff08;^2018\&#xff09; 的颗粒物组成。 我们将特别关注来自…

优盘数据恢复怎么做?3个方法分享!

我的优盘里保存了很多有纪念意义的照片&#xff0c;但是刚刚将u盘插入电脑后&#xff0c;发现有些照片已经损坏了。我想将优盘里的数据恢复&#xff0c;有什么靠谱的方法吗&#xff1f;给我推荐一下吧&#xff01; 优盘是一种便携式存储设备&#xff0c;常用于存储和传输数据。…

Linux v4l2框架分析

1. 概述 V4L2(Video for Linux 2)&#xff1a;Linux内核中关于视频设备驱动的框架&#xff0c;对上向应用层提供统一的接口&#xff0c;对下支持各类复杂硬件的灵活扩展&#xff1b; V4L2框架&#xff0c;主要包括v4l2-core、meida framework、videobuf2等模块&#xff0c;这也…

攻防世界-Crypto-Normal_RSA

题目描述&#xff1a;下载附件后&#xff0c;附件中只有两个文件&#xff0c;一个是加密后的密钥&#xff0c;一个是公钥文件 背景知识&#xff1a;RSA加密算法 现在相当于给出了密文和公钥&#xff0c;需要我们去求解明文 1. 思路分析 既然要解密&#xff0c;那么必须要获取…