在Modbus主站与从站之间进行大数据量通信的方法

在Modbus主站与从站之间进行大数据量通信的方法

什么​是​Modbus​协议?

Modbus​是​使用​主从关系​实现​的​请求 - 响应​协议。 在​主从关系​中,​通信​总是​成​对​发生 —— 一个​设备​必须​发起​请求,​然后​等待​响应 , 并且​发起​设备​(主​设备)​负责​发起​每次​交互。 通常,​主​设备​是​人​机​界面​(HMI)​或​监​控​和​数据​采集​(SCADA)​系统,​从​设备​是​传感器、​可​编​程​逻辑​控制器​(PLC)​或可​编​程​自动​化​控制器​(PAC)。 这些​请求​和​响应​的​内容​以及​发送​这些​消息​的​网络​层​由​协议​的​不同​层​来​定义。

在Modbus主站与从站之间进行大数据量通信的方法_第1张图片 图1. 主从网络关系

Modbus​协议层

在​最初​的​做法​中,​Modbus​是​建立​在​串​行​端​口​之上​的​单一​协议,​因此​它​不能​被​分成​多个​层。 随着​时间​的​推移,​该​协议​引入​了​不同​的​应用​程序​数据​单元​来​更改​串​行​通信​使用​的​数据​包​格式,​或​允许​使用​TCP/​IP​和​用户​数据​报​协议​(UDP)​网络。 这​实现​了​定义​协议​数据​单元​(PDU)​的​核心​协议​和​定义​应用​数据​单元​(ADU)​的​网络​层​的​分离。

协议​数据​单元​(PDU)

PDU​及其​处理​代码​构成了Modbus应用协议规范的​核心。 该​规范​定义​了​PDU​的​格式、​协议​使用​的​各种​数据​概念、​如何​使用​功能​代码​访问​数据,​以及​每​个​功能​代码​的​具体​实现​和​限制。

Modbus PDU​格式​被​定义​为​一个​功能​代码,​后面​跟着​一​组​关联​的​数据。 该​数据​的​大小​和​内容​由​功能​代码​定义,​整个​PDU(功能​代码​和​数据)​的​大小​不能​超过​253​个​字​节。 每​个​功能​代码​都有​一个​特定​的​行为,​从​设备​可以​根据​所需​的​应用​程序​行为​灵活​地​实现​这些​行为。 PDU​规范​定义​了​数据​访问​和​操作​的​核心​概念;​但是,​从​设备​可能​会​以​规范​中​未​明确​定义​的​方式​处理​数据。

访问​Modbus​和​Modbus​数据​模型​中的​数据

通常,​Modbus​可​访问​的​数据​存储​在​四​个​数据​库​或​地址​范围​的​其中​一个: 线圈​状态、​离散​量​输入、​保持​寄存器​和​输入​寄存器。 与​许多​规范​一样,​名称​可能​因​行业​或​应用​而​异。 例如,​保持​寄存器​也可以​称为​输出​寄存器,​线圈​状态​可能​称为​数字​或​离散​量​输出。 这些​数据​库​定义​了​所​包含​数据​的​类型​和​访问​权限。 从​设备​可以​直接​访问​这些​数据,​因为​这些​数据​由​设备​本地​托管。 Modbus​可​访问​的​数据​通常​是​设备​主​存​的​一个​子​集。 相反,​Modbus​主​设备​必须​通过​各种​功能​代码​请求​访问​这些​数据。

表​1​中​描述​了​每​个​区块​的​行为。

表1. Modbus 数据模型区块
内存区块 数据类型 主设备访问 从设备访问
线圈状态 布尔 读/写 读/写
离散输入 布尔 只读 读/写
保持寄存器 无符号双字节整型 读/写 读/写
输入寄存器 无符号双字节整型 只读 读/写

这些​区块​允许​您​限制​或​允许​访问​不同​的​数据​元素,​并且​为​应用​层​提供​简化​的​机制​来​访问​不同​的​数据​类型。

这些​区块​是​完全​概念​性的。 它们​可能​作为​独立​的​内存​地址​存在​于​给​定​的​系统​中,​但​也​可能​重叠。 例如,​线圈​状态​1​可能​存在​于​与​保持​寄存器​1​所​代表​的​字​的​第​一位​相同​的​内存​中。 寻​址​方案​完全​由​从​设备​定义,​其​对​每​个​内存​区​的​解释​是​设备​数据​模型​的​重要​组成​部分。

数据​模型​寻址

该​规范​将​每​个​区块​定义​为​包含​多​达​65,536(2^16)​个​元素​的​地址​空间。 在​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。

在​这种​寻​址​方案​中,​每​种​数据​类型​都​被​分配​了​一个​前​缀,​如​表​2​所​示。

表2. 数据范围前缀
数据区块 前缀
线圈状态 0
离散输入 1
输入寄存器 3
保持寄存器 4

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

数据​地址​起始值

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

表3. 寄存器索引方案
地址 寄存器编号 编号1(1索引,标准) 编号(0索引,替换)
0 1 400 001 400 000
1 2 400 002 400 001
2 3 400 003 400 002

 1​索引​范围​应用​较​为​广泛,​强烈​建议​采用。 无论​哪​种​情况,​每​个​范围​的​起始​值​都​应​在​文​档​中​注明。

大​数据​类型

Modbus​标准​提供​了​一个​相对​简单​的​数据​模型,​它​不​包含​无​符号​字​和​位​值​之外​的​其他​数据​类型。 如果​系统​的​位​值​对应​于​螺线​管​和​继电器,​并且​字​值​对应​于​未​缩​放​的​ADC​值,​这​是​足够​的,​但​对于​更​高级​的​系统​则​可能​不足。 因此,​许多​Modbus​实现​都​包含​跨​寄存器​边界​的​数据​类型。例如,​存储​在​保持​寄存器​中的​字符​串​遵循​标准​格式​(400,001),​但​后​跟​一个​十进制​数、​长度​和​字符​串​的​字​节​顺序​(400,001.2H​是​指​保持​寄存器​1​中的​两​个​字符​串,​其中​高位​字​节​对应​到​字符​串​的​第​一个​字符)。 这​是​必需​的,​因为​每​个​请求​的​大小​都是​有限​的,​所以​Modbus​主机​必须​知道​字符​串​的​确切​范围,​而不是​像​NULL​那样​搜索​长度​或​分隔​符。

位​访问

除了​允许​访问​跨​寄存器​边界​的​数据​之外,​一些​Modbus​主​设备​还​支持​对​寄存器​中​各个​位​的​引用。 这​是有​好处​的,​因为​它​允许​设备​将​相同​内存​范围​内的​每​种​类型​的​数据​组合​在一起,​而不​必将​二​进制​数据​分成​线圈​整体​和​离散​量​输入​范围。 这​通常​使用​小数点​和​位​索引​或​数字​进行​索引,​具体​取决​于​如何​实现。 也就是说,​第​一个​寄存器​的​第​一位​可能是​400,001.00​或​400,001.01。 建议​任何​文​档​都要​说明​所​使用​的​索引​方案。

数据​字​节​顺序

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


一种在Modbus主站和从站间进行大数据量通信的方法,包括以下步骤:

步骤一:Modbus主站发送Modbus请求报文。该Modbus请求报文的数据域包括帧类型、数据类型、起始地址和数据量四个位场;

步骤二:Modbus从站接收到该Modbus请求报文,根据该Modbus请求报文中指定的数据类型、起始地址和数据量,从内存中取出数据;

步骤三:Modbus从站将该数据分段封装到Modbus响应报文里,形成分段响应报文,并依次连续发送该分段响应报文。该Modbus响应报文的数据域包括帧类型、数据类型、分段协议、有效数据数量和有效数据五个位场;

步骤四:Modbus主站接收该分段响应报文,判断其是否有分段帧错误或遗失,如果是,则执行步骤五,否则执行步骤七;

步骤五:Modbus主站根据分段协议计算错误或丢失的分段帧中有效数据的地址和长度,重新发送对该有效数据的请求报文;

步骤六:Modbus从站返回响应报文;

步骤七:本次数据通信过程结束。

Modbus总线由于其协议开放、实施简便、可靠性高的特点,已经成为一种事实上的工业标准,得到了众多厂商的产品支持。目前已经安装的Modbus节点超过1000万个。随着信息技术的不断发展,许多应用场合要求使用现有的Modbus设备进行大数据量通信,如电力通信领域一次传输的故障波形记录可能达到数十MB,视频监控领域一次传输的图像数据可能达到数百MB。Modbus协议中定义的数据模型仅支持最多65536个数据寻址,对“输入寄存器”类型数据,最大只能寻址131.072KB数据容量。在进行大数据量通信时,从站设备地址空间不足。

Modbus早期在串行链路上执行的长度约束限制了其ADU (应用数据单元)的大小,一帧Modbus报文最大长度为256字节。使用Modbus协议中已经定义的公共功能码进行通信时,主站(作为客户机)和从站(作为服务器)之间按照“请求--应答”格式交换信息。在进行大数据量通信时,需要主站多次请求,从站多次应答,通信效率较低。

https://patents.google.com/patent/CN102820959A/zh

你可能感兴趣的:(通信)