Modbus协议完整版

news2024/10/7 8:28:05

第一部分:Modbus协议

1 引言

1.1 范围

MODBUS是OSI模型第7层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。

自从1979年出现工业串行链路的事实标准以来,MODBUS使成千上万的自动化设备能够通信。目前,继续增加对简单而雅观的MODBUS结构支持。互联网组织能够使TCP/IP栈上的保留系统端口502 访问MODBUS。

MODBUS 是一个请求/应答协议,并且提供功能码规定的服务。MODBUS 功能码是MODBUS

请求/应答PDU 的元素。本文件的作用是描述MODBUS 事务处理框架内使用的功能码。

1.2 规范性引用文件

1.RFC791,互联网协议,Sep81 DARPA

2.MODBUS 协议参考指南Rev J,MODICON,1996 年6 月,doc#PI_MBUS_300

MODBUS是一项应用层报文传输协议,用于在通过不同类型的总线或网络连接的设备之间的客户机/服务器通信。目前,使用下列情况实现MODBUS:

  1. 以太网上的TCP/IP。

  1. 各种媒体(有线:EIA/TIA-232-E、EIA-422、EIA/TIA-485-A;光纤、无线等等)上的异步串行传输。

  1. MODBUS PLUS,一种高速令牌传递网络。

图1.1.1 Modbus通信栈

2.缩略语

ADU

应用数据单元

MAC

介质访问控制

HDLC

高级数据链路控制

MB

MODBUS 协议

HMI

人机界面

MBAP

MODBUS 协议

IETF

因特网工程工作组

PDU

协议数据单元

I/O

输入/输出设备

PLC

可编程逻辑控制器

IP

互联网协议

TCP

传输控制协议

3.背景概要

MODBUS 协议允许在各种网络体系结构内进行简单通信。

图1.3.1 MODBUS网络体系结构的实例

4. 总体描述

4.1 协议描述

MODBUS 协议定义了一个与基础通信层无关的简单协议数据单元(PDU)。特定总线或网络上

的MODBUS 协议映射能够在应用数据单元(ADU)上引入一些附加域。

图1.4.1 通用MODBUS帧

启动MODBUS 事务处理的客户机创建MODBUS应用数据单元。功能码向服务器指示将执行哪种操作。

MODBUS 协议建立了客户机启动的请求格式。

用一个字节编码MODBUS 数据单元的功能码域。有效的码字范围是十进制1-255(128-255 为异常响应保留)。当从客户机向服务器设备发送报文时,功能码域通知服务器执行哪种操作。

向一些功能码加入子功能码来定义多项操作。

从客户机向服务器设备发送的报文数据域包括附加信息,服务器使用这个信息执行功能码定义的操作。这个域还包括离散项目和寄存器地址、处理的项目数量以及域中的实际数据字节数。

在某种请求中,数据域可以是不存在的(0长度),在此情况下服务器不需要任何附加信息。功能码仅说明操作。

如果在一个正确接收的MODBUS ADU 中,不出现与请求MODBUS 功能有关的差错,那么服务器至客户机的响应数据域包括请求数据。如果出现与请求MODBUS 功能有关的差错,那么域包括一个异常码,服务器应用能够使用这个域确定下一个执行的操作。

例如,客户机能够读一组离散量输出或输入的开/关状态,或者客户机能够读/写一组寄存器的数据内容。

当服务器对客户机响应时,它使用功能码域来指示正常(无差错)响应或者出现某种差错(称为异常响应)。对于一个正常响应来说,服务器仅对原始功能码响应。

图1.4.2 MODBUS事务处理(无差错)

对于异常响应,服务器返回一个与原始功能码等同的码,设置该原始功能码的最高有效位为逻辑1。

图1.4.3 MODBUS事务处理(异常响应)

注释:需要管理超时,以便明确地等待可能不会出现的应答。

串行链路上第一个MODBUS执行的长度约束限制了MODBUS PDU大小(最大RS485ADU=256字节)。

因此,对串行链路通信来说,MODBUS PDU=256-服务器地址(1字节)-CRC(2 字节)=253字节。

从而:

RS232 / RS485 ADU = 253 字节+服务器地址(1 byte) + CRC (2 字节) = 256 字节。

TCP MODBUS ADU = 249 字节+ MBAP (7 字节) = 256 字节。

MODBUS 协议定义了三种PDU。它们是:

  • MODBUS请求PDU,mb_req_pdu

  • MODBUS响应PDU,mb_rsp_pdu

  • MODBUS异常响应PDU,mb_excep_rsp_pdu

定义mb_req_pdu 为:

mb_req_pdu = { function_code, request_data},其中

function_code - [1个字节] MODBUS 功能码

request_data - [n个字节],这个域与功能码有关,并且通常包括诸如可变参考、变量、数据偏移量、子功能码等信息。

定义mb_rsp_pdu 为:

mb_rsp_pdu = { function_code, response_ data},其中

function_code - [1个字节] MODBUS 功能码

response_data - [n个字节],这个域与功能码有关,并且通常包括诸如可变参考、变量、数据偏移量、子功能码等信息。

定义mb_excep_rsp_pdu 为:

mb_excep_rsp_pdu = { function_code, request_data},其中

function_code - [1个字节] MODBUS 功能码+ 0x80

exception_code - [1个字节],在下表中定义了MODBUS 异常码。

4.2 数据编码

MODBUS 使用一个‘big-Endian’ 表示地址和数据项。这意味着当发射多个字节时,首先发送最高有效位。例如:

寄存器大小

16 -比特

0x1234

(发送的第一字节为0x12 然后0x34)

注释:更详细的信息参见[1]。

4.3 MODBUS数据模型

MODBUS 以一系列具有不同特征表格上的数据模型为基础。四个基本表格为:

基本表格

对象类型

访问类型

内容

离散量输入

单个比特

只读

I/O系统提供这种数据类型

线圈

单个比特

读写

通过应用程序改变这种数据类型

输入寄存器

16-比特字

只读

I/O系统提供这种数据类型

输出寄存器

16-比特字

读写

通过应用程序改变这种数据类型

输入与输出之间以及比特寻址的和字寻址的数据项之间的区别并没有暗示任何应用操作。如果这是对可疑对象核心部分最自然的解释,那么这种区别是可完全接受的,而且很普通,以便认为四个表格全部覆盖了另外一个表格。

对于基本表格中任何一项,协议都允许单个地选择65536 个数据项,而且设计那些项的读写操作可以越过多个连续数据项直到数据大小规格限制,这个数据大小规格限制与事务处理功能码有关。

很显然,必须将通过MODBUS 处理的所有数据放置在设备应用存储器中。但是,存储器的物理地址不应该与数据参考混淆。要求仅仅是数据参考与物理地址的链接。

MODBUS 功能码中使用的MODBUS 逻辑参考数字是以0 开始的无符号整数索引。

MODBUS模型实现的实例

下例实例示出了两种在设备中构造数据的方法。可能有不同的结构,这个文件中没有全部描述出来。每个设备根据其应用都有它自己的数据结构。

实例1:有4 个独立块的设备

下例实例示出了设备中的数据结构,这个设备含有数字量和模拟量、输入量和输出量。由于不同块中的数据不相关,每个块是相互独立。按不同MODBUS 功能码访问每个块。

图1.4.4 带有独立块的MODBUS数据模型

实例2:仅有1 个块的设备

在这个实例中,设备仅有1 个数据块。通过几个MODBUS 功能码可能得到一个相同数据,或者通过16 比特访问或1 个访问比特。

图1.4.5 仅带有1个块的MODBUS数据模型

4.4 MODBUS 事务处理的定义

下列状态图描述了在服务器侧MODBUS 事务处理的一般处理过程。

图1.4.6 MODBUS事务处理的状态图

一旦服务器处理请求,使用合适的MODBUS服务器事务建立MODBUS 响应。

根据处理结果,可以建立两种类型响应:

  • 一个正MODBUS响应:

  • 响应功能码= 请求功能码

  • 一个MODBUS 异常响应(参见第6.14节):

  • 用来为客户机提供处理过程中与被发现的差错相关的信息;

  • 响应功能码= 请求功能码+ 0x80;

  • 提供一个异常码来指示差错原因。

5. 功能码分类

有三类MODBUS 功能码。它们是:

  • 公共功能码

  1. 是较好地被定义的功能码,

  1. 保证是唯一的,

  1. MODBUS组织可改变的,

  1. 公开证明的,

  1. 具有可用的一致性测试,

  1. MB IETF RFC 中证明的,

  1. 包含已被定义的公共指配功能码和未来使用的未指配保留供功能码。

  • 用户定义功能码

  1. 有两个用户定义功能码的定义范围,即65 至72 和十进制100 至110。

  1. 用户没有MODBUS 组织的任何批准就可以选择和实现一个功能码

  1. 不能保证被选功能码的使用是唯一的。

  1. 如果用户要重新设置功能作为一个公共功能码,那么用户必须启动RFC,以便将改变引入

公共分类中,并且指配一个新的公共功能码。

  • 保留功能码

  1. 一些公司对传统产品通常使用的功能码,并且对公共使用是无效的功能码。

图 1.5.1 MODBUS功能码分类

5.1 公共功能码定义

访问类型

含义

功能码

十六进制码

子码

数据访问

字节

物理离散量输入

读输入离散量

02

02

内部字节或物理线圈

读线圈

01

01

写单个线圈

05

05

写多个线圈

15

0F

16比特

输入存储器

读输入寄存器

04

04

内部存储器

物理输出存储器

读多个寄存器

03

03

写单个寄存器

06

06

写多个寄存器

16

10

读写多个寄存器

23

17

屏蔽写寄存器

22

16

文件记录访问

读文件记录

20

6

14

写文件记录

21

6

15

封装接口

读设备识别码

43

14

2B

6. 功能码描述

6.1 01(0x01)读线圈

在一个远程设备中,使用该功能码读取线圈的1 至2000 连续状态。请求PDU 详细说明了起始地址,即指定的第一个线圈地址和线圈编号。从零开始寻址线圈。因此寻址线圈1-16 为0-15。

根据数据域的每个比特将响应报文中的线圈分成为一个线圈。指示状态为1= ON 和0= OFF。第一个数据字节的LSB(最低有效位)包括在询问中寻址的输出。其它线圈依次类推,一直到这个字节的高位端为止,并在后续字节中从低位到高位的顺序。

如果返回的输出数量不是八的倍数,将用零填充最后数据字节中的剩余比特(一直到字节的高位端)。字节数量域说明了数据的完整字节数。

请求PDU

响应PDU

错误

功能码

1个字节

0x01

功能码

1个字节

0x01

功能码

1个字节

功能码+0x80

起始地址

2个字节

0x0000至0xFFFF

字节数

1个字节

N*

异常码

1个字节

01或02或03或04

线圈数量

2个字节

1至2000(0x7D0)

线圈状态

N个字节

n=N或N+1

*N=输出数量/8,如果余数不等于0,那么N=N+1

这是一个请求读离散量输出20-38 的实例:

请求

响应

域名

(十六进制)

域名

(十六进制)

功能

01

功能

01

起始地址Hi

00

字节数

03

起始地址Lo

13

输出状态27-20

CD

输出数量Hi

00

输出状态35-28

6B

输出数量Lo

13

输出状态28-36

05

将输出27-20 的状态表示为十六进制字节值CD,或二进制1100 1101。输出27 是这个字节的MSB,输出20 是LSB。

通常,将一个字节内的比特表示为MSB 位于左侧,LSB 位于右侧。第一字节的输出从左至右为27至20。下一个字节的输出从左到右为35至28。当串行发射比特时,从LSB向MSB传输:20 . . .27、28 . . . 35 等等。

在最后的数据字节中,将输出状态38-36表示为十六进制字节值05,或二进制0000 0101。输出38 是左侧第六个比特位置,输出36 是这个字节的LSB。用零填充五个剩余高位比特。

注:用零填充五个剩余比特(一直到高位端)。

(未完待续。。。。。。)

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

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

相关文章

【图卷积网络】03-空域卷积介绍

注:本文为3.1-3.2 空域卷积视频笔记,仅供个人学习使用 1、谱域图卷积 1.1 回顾 上篇博客【图卷积神经网络】02-谱域图卷积介绍讲到了三个经典的谱域图卷积: SCNN用可学习的对角矩阵来代替谱域的卷积核。 ChebNet采用Chebyshev多项式代替谱…

TIA博途中计算多个数据的算术平均值的具体方法示例

TIA博途中计算多个数据的算术平均值的具体方法示例 我们这里采用官方提供的Floating Average功能块来实现多个数据的算术平均值的计算。 此功能块计算最新输入的100个数值的均值(浮动平均值)。采集的数据队列达到100个之后,队列每入栈一个新数值,将去掉一个队列里最早进来的…

高通平台开发系列讲解(GPS篇)gpsONE 系统架构

文章目录 一、系统架构图二、gpsONE系统组成三、gpsONE交互流程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢高通的定位系统模块,名称叫gpsONE。 一、系统架构图 二、gpsONE系统组成 GPS系统架构可以分为六个部分: APP层Framework Client端(LocationManager API…

网站被挂马植入webshell导致网站瘫痪案例

一、问题现象 下午两点,刚刚睡醒,就接到了客户打来的电话,说他们的网站挂(这个用词很不准确,但是感觉到问题的严重性)了,询问是怎么发生的,之前做了什么操作,客户的回答…

Bash 脚本实例:获取符号链接的目标位置

我们都熟悉 Linux 中的符号链接,通常称为符号链接或软链接,符号链接是指向任何文件系统中的另一个文件或目录的特定文件。本文将介绍 Linux 中符号链接的基础知识,并创建一个简单的 bash 脚本来获取符号链接的目标位置。符号链接的类型主要有…

【栈和队列】java实现栈和队列以及集合中的栈和队列

前言: 大家好,我是良辰丫🏍🏍🏍,今天我带领大家去学习栈和队列的相关知识,💞💞💞栈和队列在数据结构中是相对简单的,但是应用还是蛮多的&#xff…

分享142个ASP源码,总有一款适合您

ASP源码 分享142个ASP源码,总有一款适合您 下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下..., 142个ASP源码下载链接:https://pan.baidu.com/s/1TxdTrCJpO08rKLCUzIh0hQ?pwdyhka 提取码&#x…

微信小程序+云函数+腾讯云对话机器人API(ChatBot)

文章目录 前言 一、小程序云开发是什么? 二、步骤 1. 在app.js中绑定好云环境id,并且选好当前环境以及选好云文件夹 2. 去到腾讯云API Explorer中选好Region地区和Query这个必填参数,然后进行代码生成 3. 在上面的API Explorer网站点击前往获…

Python局部函数及用法

Python 函数内部可以定义变量,这样就产生了局部变量,有读者可能会问,Python 函数内部能定义函数吗?答案是肯定的。Python 支持在函数内部定义函数,此类函数又称为局部函数。那么,局部函数有哪些特征&#x…

Redis实现好友关注 | 黑马点评

目录 一、关注和取关 二、共同关注 三、关注推送(feed流) 1、Timeline模式的方案 拉模式 推模式 推拉结合模式 总结 2、推模式实现关注推送 需求 feed流分页问题 feed流的滚动分页 实现推送到粉丝的收件箱 …

(学习笔记)opencv和dlib的基础操作

来源:投稿 作者:LSC 编辑:学姐 本篇文章将讲述作者对opencv和dlib基础操作的学习笔记。 首先来看opencv的11种基础操作 (1)imread 读取图片 (2)resize 图片缩放 (3)cvtColor 灰度化 (4)threshold 阈值化 (5)bitwise_not 图像取反 (6)a…

JavaEE-初识网络

目录一、局域网二、广域网三、网络通信基础3.1 IP地址3.2 端口号3.3 协议四、协议分层五、封装和分用一、局域网 局域网,网络种类,覆盖范围一般是方圆几千米之内,其具备的安装便捷、成本节约、扩展方便等特点使其在各类办公室内运用广泛。局…

有序列表标签与无序列表标签

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title></title> </head> <body bgcolor"bisque"> <!-- 在ol有序列表标签和ul无序列表标签…

【初识数据库】进入数据库的大门+数据库基本操作

前言&#xff1a; 大家好&#xff0c;我是良辰丫&#x1f353;&#x1f353;&#x1f353;&#xff0c;这个专栏我将带领大家去探索数据库的汪洋大海&#xff0c;我主要使用的数据库软件是MySQL&#xff0c;数据库软件大同小异&#xff0c;嘿嘿嘿&#xff0c;废话不多说&#x…

分布式事务Seata学习笔记

目录 1.Seata 是什么 2. Seata快速开始 2.1 Seata Server&#xff08;TC&#xff09;环境搭建 db存储模式Nacos(注册&配置中心)部署 3. Seata Client快速开始 4.demo源码:springcloudAlibaba: Alibaba微服务学习demo 1.Seata 是什么 Seata 是一款开源的分布式事务…

神级程序员上网都在看什么?

同样都是上网&#xff0c;为什么大神总能在最短时间内汲取最有效的信息呢&#xff1f; 不怕大神不上网&#xff0c;就怕大神上网比你精&#xff01;其实&#xff0c;你与大神的区别都藏在细节中。 这些神级网站都是我偷看他们电脑抄来的&#xff08;误&#xff09;&#xff0c;…

超链接(还称热连接)标签

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>超链接(还称热连接)</title> </head> <body> <!-- 超链接的特点&#xff1a; 1、有…

Python内置函数

5.6 Python内置函数 Python自带的所有内置函数如下&#xff1a; Python函数 以上为Python3.10中所有的内置函数&#xff0c;其中绝大部分在前面的学习当中都已经接触过了。这里在补充介绍下没有提到或学习到的函数。 5.6.1 callable(object) 描述 如果参数 object 是可调…

Java面试题,mysql相关基础问题(全是自己的总结,如有不对,敬请斧正)

mysql相关基础问题一、mysql中int类型单引号问题二、静态SQL与动态SQL1. 静态SQL2. 动态SQL3. 动态SQL与静态SQL的区别与联系一、mysql中int类型单引号问题 今天写mysql的时候发现了一个问题&#xff0c;在查询的时候不小心把int类型的id加上引号查询了&#xff0c;但是也能查…

Day08 C++STL入门基础知识五——vector容器(下) 插入删除-数据存取-交换容器-预留空间【全面深度剖析+例题代码展示】

More haste, less speed. 欲速则不达 文章目录1. 承接上文2. 插入操作2.1 函数原型(总括)2.2 尾插尾删2.2.1 操作2.2.2 代码展示2.2.3 测试结果2.3 迭代器插入2.3.1 操作2.3.2 代码展示2.3.3 测试结果2.4 think小思考2.4.1 小疑问2.4.2 思路2.4.3 代码展示2.4.4 测试结果3. 删除…