modbus协议

一、总体描述

1. 协议描述

协议组成

在这里插入图片描述

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

1.1 地址域

1.2 功能码域

用一个字节编码MODBUS数据单元。有效的码字范围是十进制1-255(128-255为异常响应保留)

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

1.3 数据域

数据域包括附加信息,使用这个信息执行功能码定义的操作。这个域还包括离散项目和寄存器地址、处理的项目数量以及域中的实际数据字节数

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

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

1.4 差错校验

2. PDU(功能码+数据域)

串行链路上第一个 MODBUS 执行的长度约束限制了 MODBUS PDU 大小(最大 RS485 ADU=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

2.1 MODBUS 请求 PDU

定义 mb_req_pdu 为:

mb_req_pdu = { function_code, request_data},其中

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

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

2.2 MODBUS 响应 PDU

定义 mb_rsp_pdu 为:

mb_rsp_pdu = { function_code, response_ data},其中

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

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

2.3 MODBUS 异常响应 PDU

定义 mb_excep_rsp_pdu 为:

mb_excep_rsp_pdu = { function_code, request_data},其中

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

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

3. 数据编码

大端对齐

4. MODBUS数据模型

基本表格对象类型访问类型内容
离散量输入单个比特只读I/O系统提供这种数据类型
线圈单个比特读写通过应用程序改变这种类型数据
输入寄存器16-比特字只读I/O系统提供这种数据类型
保持寄存器16-比特字读写通过应用程序改变这种类型数据

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

5. 事务处理的定义

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UDOnpsnh-1656216652568)(C:\Users\Admain\AppData\Roaming\Typora\typora-user-images\image-20220624165140871.png)]

二、功能码分类

三类功能码

1. 公共功能码

1.1 特点

  • 是较好地被定义的功能码
  • 保证是唯一的
  • MODBUS 组织可改变的
  • 公开证明的
  • 具有可用的一致性测试
  • MB IETF RFC 中证明的
  • 包含已被定义的公共指配功能码和未来使用的未指配保留供功能码

1.2 定义

类别描述功能码功能子码索引
物理离散量输入读输入离散量02
内部比特或物理线圈读线圈01
写单个线圈05
写多个线圈15
输入存储器读输入寄存器04
内部存储器或物理输出存储器读多个寄存器03
写单个寄存器06
写多个寄存器16
读/写多个寄存器23
屏蔽写寄存器22
文件记录访问读文件记录206
写文件记录216
封装接口读设备识别码4314

2. 用户定义功能码

2.1 特点

  • 有两个用户定义功能码的定义范围,即 65 至 72 和十进制 100 至 110
  • 用户没有 MODBUS 组织的任何批准就可以选择和实现一个功能码
  • 不能保证被选功能码的使用是唯一的
  • 如果用户要重新设置功能作为一个公共功能码,那么用户必须启动 RFC,以便将改变引入公共分类中,并且指配一个新的公共功能码

3. 保留功能码

在这里插入图片描述

三、功能码描述

1. 读保持寄存器(0x03)

在一个远程设备中,使用该功能码读取保持寄存器连续块的内容。请求 PDU 说明了起始寄存器地址和寄存器数量。

将响应报文中的寄存器数据分成每个寄存器有两字节,在每个字节中直接地调整二进制内容。

对于每个寄存器,大端对齐

请求PDU功能码起始地址线圈数量
字节数1个字节2个字节2个字节
描述0x030x0000至0xFFFF1至125(0x7D)
响应PDU功能码字节数输入状态
字节数1个字节2个字节N*×2
描述0x032×N*

N = 寄存器数量

错误功能码异常码
字节数1个字节1个字节
描述功能码 + 0x8301或02或03或04

2. 读输入寄存器(0x04)

3. 写单个寄存器(0x06)

请求PDU功能码寄存器地址寄存器值
字节数1个字节2个字节2个字节
描述0x060x0000至0xFFFF0x0000至0xFFFF
响应PDU功能码字节数输入状态
字节数1个字节2个字节2个字节
描述0x060x0000至0xFFFF0x0000至0xFFFF

N = 寄存器数量

错误功能码异常码
字节数1个字节1个字节
描述功能码 + 0x8601或02或03或04

4. 写多个寄存器(0x10)

请求PDU功能码起始地址寄存器数量字节数寄存器值
字节数1个字节2个字节2个字节1个字节N×2个字节
描述0x100x0000至0xFFFF0x0001至0x007B2×N
响应PDU功能码字节数输入状态
字节数1个字节2个字节2个字节
描述0x060x0000至0xFFFF0x0001至0x007B

N = 寄存器数量

错误功能码异常码
字节数1个字节1个字节
描述功能码 + 0x8601或02或03或04

四、MODBUS异常响应

异常响应报文有两个与正常响应不同的域:

功能码域:在正常响应中,服务器利用响应功能码域来应答最初请求的功能码。所有功能码的最高有效位(MSB)都为 0(它们的值都低于十六进制 80)。在异常响应中,服务器设置功能码的 MSB 为 1。这使得异常响应中的功能码值比正常响应中的功能码值高十六进制 80。

通过设置功能码的 MSB,客户机的应用程序能够识别异常响应,并且能够检测异常码的数据域。

数据域:在正常响应中,服务器可以返回数据域中数据或统计表(请求中要求的任何报文)。在异常响应中,服务器返回数据域中的异常码。这就定义了产生异常的服务器状态。

代码名称含义
01非法功能对于服务器(或从站)来说,询问中接收到的功能码是不可允许的操作。这也许 是因为功能码仅仅适用于新设备而在被选单元中是不可实现的。同时,还指出 服务器(或从站)在错误状态中处理这种请求,例如:因为它是未配置的,并且 要求返回寄存器值。
02非法数据地址对于服务器(或从站)来说,询问中接收到的数据地址是不可允许的地址。特别 是,参考号和传输长度的组合是无效的。对于带有 100 个寄存器的控制器来说, 带有偏移量 96 和长度 4 的请求会成功,带有偏移量 96 和长度 5 的请求将产生 异常码 02。 GB/T ××××—×××× 42
03非法数据值对于服务器(或从站)来说,询问中包括的值是不可允许的值。这个值指示了组 合请求剩余结构中的故障,例如:隐含长度是不正确的。并不意味着,因为 MODBUS 协议不知道任何特殊寄存器的任何特殊值的重要意义,寄存器中被 提交存储的数据项有一个应用程序期望之外的值。
04从站设备故障当服务器(或从站)正在设法执行请求的操作时,产生不可重新获得的差错。
05确认与编程命令一起使用。服务器(或从站)已经接受请求,并切正在处理这个请求, 但是需要长的持续时间进行这些操作。返回这个响应防止在客户机(或主站)中 发生超时错误。客户机(或主站)可以继续发送轮询程序完成报文来确定是否完 成处理。
06从属设备忙与编程命令一起使用。服务器(或从站)正在处理长持续时间的程序命令。张服 务器(或从站)空闲时,用户(或主站)应该稍后重新传输报文。
08存储奇偶性差错与功能码 20 和 21 以及参考类型 6 一起使用,指示扩展文件区不能通过一致性 校验。 服务器(或从站)设法读取记录文件,但是在存储器中发现一个奇偶校验错误。 客户机(或主方)可以重新发送请求,但可以在服务器(或从站)设备上要求服务。
0A不可用网关路径与网关一起使用,指示网关不能为处理请求分配输入端口至输出端口的内部通 信路径。通常意味着网关是错误配置的或过载的。
0B网关目标设备响应失败与网关一起使用,指示没有从目标设备中获得响应。通常意味着设备未在网络 中
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程背景Modbus 协议是工业自动化控制系统中常见的通信协议协议的全面理解是个痛点。本课程主讲老师集10多年在Modbus协议学习、使用中的经验心得,结合当前物联网浪潮下Modbus协议开发的痛点,推出这套面向Modbus 协议初学者的课程。本课程不同于以往市面课程只是协议讲解无实现代码,而是采用讲解与实践并重的方式,结合STM32F103ZET6开发板进行手把手编程实践,十分有利于初学者学习。涵盖了学习者在Modbus协议方面会遇到的方方面面的问题,是目前全网首个对Modbus协议进行全面总结的课程。课程名称   协议讲解及实现>>课程内容1、Modbus 协议的基础。2、Modbus协议栈函数编程实现。3、Modbus协议在串行链路编程实现。4、Modbus协议在以太网链路编程实现。5、常见问题的解决方法。带给您的价值通过学习本课程,您可以做到如下:1、全面彻底的理解Modbus协议。2、理解在串行链路,以太网链路的实现。3、掌握Modbus协议解析的函数编程方法,调试工具的使用。4、掌握多个串口,网口同时运行同一个Modbus协议栈的方法。5、掌握Modbus协议下,负数,浮点数等处理方法。讲师简介许孝刚,山东大学工程硕士,副高职称,技术总监。10多年丰富嵌入式系统开发经验,国家软考“嵌入式系统设计师”。2017年获得“华为开发者社区杰出贡献者”奖励。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值