Modbus初学者教程,第五章:Modbus 中的功能码和异常码

news/2024/9/19 1:43:34/文章来源:https://www.cnblogs.com/cj94/p/18375105

第五章:Modbus 中的功能码和异常码

平时调试Modbus设备,或者学习Modbus协议,推荐一款Modbus主从站模拟器:

主站下载地址:Modbus从站模拟器

从站下载地址:Modbus主站模拟器

可视化 Modbus 设备中的数据

Modbus 从设备可以想象为具有一个内部电子表格,其中填满了数字。Modbus 主设备将向从设备询问其在给定行和列中找到的数据值或数字,从设备将通过将该数据发送回主设备来响应。当然,这个过程可以逆转,Modbus 主设备告诉从设备在给定行和列处将什么数字放入其数据表中。

Modbus 设备“电子表格”中的“列”更正式地称为寄存器类型。寄存器类型可能是线圈、离散输入(又称状态输入)、输入寄存器或保持寄存器。

Modbus 设备“电子表格”中的“行”只是寄存器编号。通常,这些行从 1 开始并按顺序递增。某些设备可能没有寄存器 1,例如,它们的第一个寄存器可能是 100。如果从设备中不存在寄存器编号,它将发回一个异常消息。该异常提供了一个错误代码,提示“没有这样的寄存器”(异常代码 2,非法数据地址)。

image

什么是 Modbus TCP?

Modbus TCP 将 Modbus RTU 请求和响应数据包封装在通过标准以太网网络传输的 TCP 数据包中。单元号仍包含在内,其解释因应用程序而异 - 单元或从站地址不是 TCP 中的主要寻址方式。这里最重要的地址是 IP 地址,例如 192.168.1.100。Modbus TCP 的标准端口是 502,但如果需要,通常可以重新分配端口号。

TCP 数据包中省略了通常位于 RTU 数据包末尾的校验和字段。对于 Modbus TCP,校验和和错误处理由以太网处理。

Modbus 的 TCP 版本遵循 OSI 网络参考模型。Modbus TCP 定义了 OSI 模型中的表示层和应用层。

Modbus TCP 使主设备和从设备的定义不那么明显,因为以太网允许对等通信。客户端和服务器的定义在基于以太网的网络中更为人所知。在这种情况下,从设备成为服务器,主设备成为客户端。可以有多个客户端从服务器获取数据。在 Modbus 术语中,这意味着可以有多个主设备和多个从设备。现在,系统设计人员的责任是创建主设备和从设备功能之间的逻辑关联,而不是逐个物理设备地定义主设备和从设备。

什么是 Modbus ASCII?

Modbus ASCII 是一种较旧的实现,它包含 RTU 数据包的所有元素,但完全以可打印的 ASCII 字符表示。Modbus ASCII 被认为已弃用,很少再使用,并且未包含在正式的 Modbus 协议规范中。

Modbus 寄存器类型回顾

Modbus 设备中引用的寄存器类型包括:

  • 线圈(离散输出)
  • 离散输入(或状态输入)
  • 输入寄存器
  • 保持寄存器

特定设备是否包含所有这些寄存器类型取决于制造商。所有 I/O 都仅映射到保持寄存器的情况非常常见。线圈是 1 位寄存器,用于控制离散输出,可以读取或写入。离散输入是用作输入的 1 位寄存器,只能读取。输入寄存器是用于输入的 16 位寄存器,只能读取。保持寄存器是最通用的 16 位寄存器,可以读取或写入,可用于各种用途,包括输入、输出、配置数据或任何“保持”数据的要求。

当网关为主控或以直接模式(Babel Buster SP-GW)运行时,网关将支持所有寄存器类型。将非 Modbus 设备连接到 Modbus 网络的控制解决方案网关在某些情况下将仅使用保持寄存器来表示非 Modbus 设备数据。

大多数控制解决方案 I/O 设备都使用保持寄存器来表示所有类型的输入和输出。在大多数情况下,相同的 I/O 也可以像其他寄存器类型一样访问,并且 I/O 状态或值在多个寄存器中镜像。

Modbus 功能码

Modbus 协议定义了几个用于访问 Modbus 寄存器的功能代码。Modbus 定义了四个不同的数据块,每个数据块中的地址或寄存器编号重叠。因此,要完整定义在何处查找数据,需要地址(或寄存器编号)和功能代码(或寄存器类型)。

下表列出了 Modbus 设备最常识别的功能代码。这只是可用代码的一个子集 - 其中一些代码具有通常不适用的特殊应用。

功能码 寄存器类型
1 读取线圈
2 读取离散输入
3 读取保持寄存器
4 读取输入寄存器
5 写入单个线圈
6 写入单个保持寄存器
15 写入多个线圈
16 写入多个保持寄存器

Modbus 异常(错误)代码

当 Modbus 从站识别出数据包,但确定请求中存在错误时,它将返回异常代码回复,而不是数据回复。异常回复由从站地址或单元号、设置了高位的功能代码副本和异常代码组成。例如,如果功能代码为 3,则异常回复中的功能代码将为 0x83。异常代码将是以下之一:

异常码 说明 详细说明
1 非法的功能码 查询中收到的功能代码不被从站识别或不被从站允许。
2 非法的数据地址 查询中收到的数据地址(寄存器编号)不是从站允许的地址,即寄存器不存在。如果请求多个寄存器,则至少有一个寄存器不被允许。
3 非法的数据值 查询数据字段中包含的值对于从站来说是不可接受的。
4 从设备故障 从站尝试执行请求的操作时发生不可恢复的错误
6 从设备忙 从属设备正在处理一个长持续时间的命令。主设备应稍后重试。
10 网关路径不可用 与网关结合使用的专门用途,通常意味着网关配置错误或超载
11 网关目标设备无法响应 专门与网关结合使用,表示未从目标设备收到响应。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.redisant.cn/

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

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

相关文章

袋鼠

先转化一下题意:求有多少个1~n的排列p能够满足 \(\forall i \in (1,n)\) ,使 $ p_{i} $ 左右两边的数同时小于或者大于 \(p_{i}\) ,并且\(p_{1}=s,p_{n}=t\) 。 比较明显的预设型DP(连转化题意我都做不到,悲),先正常来分析一下,我们填数从小往大枚举,如果我们填入一个数,…

JetBrains Writerside 2024.2 (macOS, Linux, Windows) - 编写、测试、构建和发布最佳教程

JetBrains Writerside 2024.2 (macOS, Linux, Windows) - 编写、测试、构建和发布最佳教程JetBrains Writerside 2024.2 (macOS, Linux, Windows) - 编写、测试、构建和发布最佳教程 JetBrains 跨平台开发者工具 请访问原文链接:https://sysin.org/blog/jetbrains-writerside/…

Citrix ADC Release 13.1 Build 54.29 (nCore, VPX, SDX, CPX, BLX) - 混合多云应用交付控制器

Citrix ADC Release 13.1 Build 54.29 (nCore, VPX, SDX, CPX, BLX) - 混合多云应用交付控制器Citrix ADC Release 13.1 Build 54.29 (nCore, VPX, SDX, CPX, BLX) - 混合多云应用交付控制器 Citrix ADC - 混合多云应用交付控制器 请访问原文链接:https://sysin.org/blog/citr…

Metasploit Pro 4.22.3-2024081901 (Linux, Windows) - 专业渗透测试框架

Metasploit Pro 4.22.3-2024081901 (Linux, Windows) - 专业渗透测试框架Metasploit Pro 4.22.3-2024081901 (Linux, Windows) - 专业渗透测试框架 Rapid7 Penetration testing, release Aug 19, 2024 请访问原文链接:https://sysin.org/blog/metasploit-pro-4/,查看最新版。…

dotnet X11 栈空间被回收导致调用 XPutShmImage 闪退

本文记录在使用 X11 过程中的问题,由于不正确使用导致栈空间被回收,从而在调用 XPutShmImage 时让应用闪退,此问题本质上讲只和 X11 的设计有一分钱关系,更多的问题在于我的写法上在 上一篇博客 里,介绍了使用 MIT-SHM 共享内存推送图片,详细请看:dotnet X11 简单使用 M…

Avalonia 11.1 已知问题 IterationCount 为 Infinite 的动画播放出现异常

如果在 Avalonia 后台代码播放一个动画,这个动画的 Animation 的 IterationCount 被设置为 Infinite 那么将在播放的时候抛出 InvalidOperationException 异常本文所使用的 Avalonia 为 11.1.0 版本,由于 Avalonia 行为和 API 变动较多,如大家使用其他版本还请重新测试 如以…

11 Large Companies That Use Java

https://terenbro.com/blog/11-large-companies-that-use-javaWhat is Java? Why do Companies Use Java? 11 Companies That Use Java Overview List of Companies That Use Java Consider Terenbro as Your Trusted Partner Final ThoughtsTOP-5 PostsPopular Java Use Cas…

mysql全片篇

零,快速总结篇# 1)、查询所有数据库 show databases ; # 2)、查询当前数据库 select database() ; # 3)、创建数据库 create database [ if not exists ] 数据库名 [ default charset 字符集 ] [ collate 排序规则 ] ; # 4)、删除数据库 drop database [ if exists ] 数据库名…

最简单100%解决pip 不是内部或外部命令,也不是可运行的程序 或批处理文件

相信你看了不少教程还是没有解决pip的问题 最关键的问题还是在于没有找到正确的路径。 解决办法: 在cmd中输入python -m pip install --upgrade pip, 它会告诉你 WARNING: Ignoring invalid distribution -ip (d:\python3.9\lib\site-packages)Requirement already satisfie…

为 OpenWrt 路由器编译 minieap-sysu 项目

学校的校园网要使用锐捷认证,于是想把认证客户端装到刷了 OpenWrt 的路由器上面。然而认证客户端 Linux 版只支持 x86 架构,我的路由器处理器却是 AArch64 架构,装不了,所以只能想办法找 AArch64 架构的解决方案。 经过一番搜索,我找到了 minieap-sysu 这个项目,不过需要…

线性dp:最长上升子序列

最长上升子序列本文与leetcode300.最长递增子序列,这题题意一样,阅读完本文可以挑战一下力扣链接 题目叙述: 给定一个无序的整数数组,找出其中最长上升子序列(LIS)的长度。 输入: [5,7,1,9,4,6,2,8,3]输出 4解释最长上升子序列是[1,4,6,8],其长度为4。动态规划的设计…