目 录CONTENT

文章目录

Modbus协议及数据类型详解

焱
2025-03-21 / 0 评论 / 0 点赞 / 7 阅读 / 0 字
温馨提示:
本文最后更新于2025-03-22,若内容或图片失效,请留言反馈。 部分素材来自网络,若有影响到您的利益,请联系我们删除。

协议定义

  1. Modbus 是使用主从关系实现的请求-响应协议。

  2. Modbus协议引入了不同的应用程序数据单元来更改串行通信使用的数据包格式,或允许使用TCP/IP和用户数据报协议(UDP)网络。 其通信协议理解也比较简单,其帧结构如下(ADU中包含PDU):
    ADU:应用数据单元
    PDU:协议数据单元

协议数据单元PDU(功能码和数据)

  • PDU(Packet Data Unit)及其处理代码构成了Modbus应用协议规范的核心。

  • Modbus PDU格式被定义为一个功能代码,后面跟着一组关联的数据。 该数据的大小和内容由功能代码定义,整个PDU(功能代码和数据)的大小不能超过253个字节。 每个功能代码都有一个特定的行为,从设备可以根据所需的应用程序行为灵活地实现这些行为。

  • 从设备会验证功能代码、数据地址和数据范围等输入。 然后执行所请求的操作并发送与代码相符的响应。 如果此过程中的任何步骤失败,则会向请求程序返回异常。

  • PDU由一个单字节的功能代码组成,后面跟着多达252字节的针对特定函数的数据。

  • 功能代码是第一个需要验证的项。 如果功能代码没有被接收到请求的设备识别,则会回应一个异常。 如果功能代码被接受,则从设备根据功能定义开始分解数据。

数据类型

modbus的操作对象有四种:线圈状态、离散量输入、保持寄存器和输入寄存器

  • 线圈:PLC的输出位,开关量,在MODBUS中可读可写 (比如输出某个IO的高低电平)

  • 离散量:PLC的输入位,开关量,在MODBUS中只读 (比如某个按键的状态)

  • 输入寄存器:PLC中只能从模拟量输入端改变的寄存器,在MODBUS中只读 (比如温度值)

  • 保持寄存器:PLC中用于输出模拟量信号的寄存器,在MODBUS中可读可写 (比如多个IO的输出量)

这些数据库定义了所包含数据的类型和访问权限。 从设备可以直接访问这些数据,因为这些数据由设备本地托管。 Modbus可访问的数据通常是设备主存的一个子集。 相反,Modbus主设备必须通过各种功能代码请求访问这些数据。

这些区块允许您限制或允许访问不同的数据元素,并且为应用层提供简化的机制来访问不同的数据类型。
 这些区块是完全概念性的。 它们可能作为独立的内存地址存在于给定的系统中,但也可能重叠。 例如,线圈状态1可能存在于与保持寄存器1所代表的字的第一位相同的内存中。 寻址方案完全由从设备定义,其对每个内存区的解释是设备数据模型的重要组成部分。

数据模型寻址

该规范将每个区块定义为包含多达65,536(216)个元素的地址空间。 在PDU的定义中,Modbus定义了每个数据元素的地址,范围从0到65,535。但是,每个数据元素的编号从1到n,其中n的最大值为65,536。也就是说,线圈状态1位于地址0的线圈状态区块中,而保持寄存器54位于从机被定义为保持寄存器的内存部分中的地址53。
 规范允许的全部范围不需要给定设备实现。 例如,设备可能会选择不执行线圈、离散输入或输入寄存器,而只使用保持寄存器150至175和200至225。这是完全可以接受的,并且通过例外来处理无效的访问尝试。

数据寻址范围

虽然规范将不同的数据类型定义为存在于不同的区块中,并为每种类型分配一个本地地址范围,但这并不一定会转化为用于记录或理解给定设备的Modbus可访问内存的直观编址方案。 为了简化对内存区块位置的理解,引入了一种编号方案,其将前缀添加到所讨论的数据的地址中。
 例如,设备手册不会引用地址13寄存器14的数据项,而是引用地址4,014,40,014或400,014的数据项。在任何情况下,第一个数字都是4,表示保持寄存器,剩余数字则表示指定地址。 4XXX、4XXXX和4XXXXX的区别取决于设备使用的地址空间。 如果所有65,536个寄存器都在使用中,应该使用4XXXXX符号,因为其允许范围为400,001~465,536。如果只使用几个寄存器,通常的做法是使用范围4,001到4,999。
在这种寻址方案中,每种数据类型都被分配了一个前缀:

线圈状态存在前缀为0的情况。这意味着4001的引用可能指的是保持寄存器1或线圈4001。因此,建议所有新寻址方案都采用带前导零的6位寻址,并在文档中进行标注。 因此,保持寄存器1的地址为400,001,而线圈4001的地址则为004,001。

数据地址起始值

内存地址和参考数字之间的差异会由给定应用程序选择的索引进一步复杂化。 如前所述,保存寄存器1位于地址零。 通常,参考号码是1索引,这意味着给定范围的起始值为1。 因此,400,001就表示为地址0的保持寄存器00001。一些做法选择以零开始其范围,这意味着400,000转换为地址零的保持寄存器。
如下为寄存器索引方案,1索引范围应用较为广泛,强烈建议采用。

数据的大端和小端

多寄存器数据(单精度浮点值),可以通过将数据拆分到两个寄存器,轻松地在Modbus中传输。 由于这不是由标准定义的,因此分割的字节顺序没有规定。 尽管每个无符号字必须以网络(big-endian)字节顺序发送以满足标准,但许多设备会颠倒多字节数据的字节顺序。 下图所示的是一个不常见但有效的例子。

字符串可以很容易地存储在Modbus寄存器中。 为了简单起见,一些方法要求字符串长度为2的倍数,并使用控制来填充额外的空间。 字节顺序也是字符串交互中的一个变量。 字符串格式可能包含也可能不包含NULL作为最终值

Modbus功能码

根据对象的不同,modbus的功能码:

功能码

名称

作用

01

读取线圈状态

取得一组逻辑线圈的当前状态 (ON/OFF)

02

读取输入状态

取得一组开关输入的当前状态 (ON/OFF)

03

读取保持寄存器

在一个或多个保持寄存器中取得当前的二进制值

04

读取输入寄存器

在一个或多个输入寄存器中取得当前的二进制值

05

强置单线圈

强置一个逻辑线圈的通断状态

06

预置单寄存器

把具体二进值装入一个保持寄存器

07

读取异常状态

取得8个内部线圈的通断状态、这8个线圈的选址由控制器决定,用户逻辑可以将这些线圈定义,以说明从机状态,短报文适宜于迅速读取状态

08

回送诊断校检

把诊断校验报文送从机,以对通信处理进行评鉴

09

编程(只用于484)

使主机模拟编程器作用,修改 PC从机逻辑

10

控询(只用于484)

可使主机与一台正在执行长程序任务从机通信,探询该从机是否已完成其操作任务,仅在含有功能码9的报文发送后,本功能码才发送

11

读取事件计数

可使主机发出单询问,并随即判定投作是否成功,尤其是该命令或其他应答产生通信错误时

12

读取通信事件记录

可使主机检索每台从机的 ModBus 事务处理通信事件记录。如果某项事务处理完成,记录会给出有关错误

13

编程(184/384 484 584)

可使主机模拟编程器功能修改 PC从机逻辑

14

控询(184/384 484 584)

可使主机与正在执行任务的从机通信,定期控询该从机是否已完成其程序操作,仅在含有功能13的报文发送后,本功能码才得发送

15

强置多线圈

强置一串连续逻辑线圈的通断

16

预置多寄存器

把具体的二进制值装入一串连续的保持寄存器

17

报告从机标识

可使主机判断编址从机的类型及该从机运行指示灯的状态

18

(884和micro 84)

可使主机模拟编程功能,修改PC状态逻辑

19

重置通信链路

发生非可修改错误后,是从机复位于已知状态,可重置顺序字节

20

读取通用参数(584L)

显示扩展存储器文件中的数据信息

21

写入通用参数(584L)

把通用参数写入扩展存储文件,或修改之

22-64

保留以备用户功能所用

65-72

保留以备用户功能所用

留作用户功能的扩展编码

73-199

非法功能

120-127

保留

留作内部作用

128-255

保留

用于异常应管

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区