「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战」
1、Modbus是什么
基本上,Modbus 是一种用于设备之间通信的应用层协议主要用于交换自动化领域的典型数据。
在这个级别上,Modbus 是一种无状态的客户端-服务器协议(例如,很像 HTTP),基于事务,它由请求(由客户端发出)和响应(由服务器发出)组成。在通常应用该协议的领域中,存在一个概念,即使用共享信号电缆的网络上控制较低级别通信行为的可能模式之一:主从。为了防止混淆,以下有向关系根据客户端-服务器范式描述了主从:
Master
主站 对应 —-> 客户端
Slave
从站 对应—–>服务端
2、Modbus协议解析
无状态通信基于一个简单的包,称为协议数据单元 (PDU)。协议规范定义了三种类型的 PDU:
-
请求 PDU,包括:
- 指定功能的代码(功能代码,1 字节)
- 和功能特定数据(功能数据,可变字节数)
-
响应 PDU,包括:
- 请求对应的功能码(Function Code,1字节)
- 和响应特定数据(响应数据,可变字节数)
-
异常响应 PDU,包括:
- 请求对应的功能码+0x80(128),(错误码,1字节)
- 以及指定异常的代码(异常代码,1 字节)
2.1、Modbus功能
每个功能都分配了一个特定的功能代码。它们的范围是 1-127(十进制),因为129(即 1+128)- 255(即 127+128)代表错误代码的范围。 功能码是协议的一部分,功能码就分为以下三类,一个是协议里规定好的功能,用户也可以自定义功能
- Public
保证是唯一的,并指定公开记录的明确定义的功能。这些由社区验证并且存在一致性测试。- 读离散输入
- 读写线圈
- 读输入寄存器
- 读写保持寄存器
- User-Defined
可用于用户定义的函数,因此它们的代码可能不是唯一的。该规范为用户定义的函数定义了代码范围 65-72 和 100-110。 - 保留
这些目前被一些公司用于遗留产品,不能公开使用
函数的文档包括:
- 函数的描述(即它的用途)、它的参数和返回值(包括可能的异常)。
- 分配的功能代码
- 请求 PDU
- 响应 PDU
- 异常响应PDU
2.2、Modbus数据模型
Modbus的功能就是基于这些数据模型实现的
离散输入
-
类型
一位
-
使用权
只读
-
视觉的
离散输出(线圈)
-
类型
一位
-
使用权
读写
-
视觉的
输入寄存器
-
类型
16 位字
-
使用权
只读
-
视觉的
保持寄存器(Register)
-
类型
16 位字
-
使用权
读写
-
视觉的
3、Modbus实现
3.1、串行Modbus实现
Modbus 以异步串行网络通信的实现形式开始了它的生命。应用层协议直接在串行接口和串行通信标准之上运行。最常见的(通过电线)是:
- RS232 (EIA232) :
参见RS232 @ 维基百科 - RS422:
请参阅EIA422 @ 维基百科 - RS485:
参见EIA 485 @ 维基百科**
RS232用于短距离点对点通信,EIA422同样适用,它是RS232在工业环境下的双向扩展,也支持更远的距离。
EIA485 可用于多点通信(即多个设备连接到同一条信号电缆),采用主从模式(一个主站和 n 个固定地址从站)。
图 4 显示了可能的网络设置。
为了启用此设置的实际通信,该实现使用附加字段扩展了 PDU,更好的说法是,它将 PDU 包装到一个带有标头和错误校验和的包中(参见图 5)。结果包由协议规范定义为应用程序数据单元 (ADU),其最大包大小为 256 字节。
笔记 |
---|
256 字节的最大包大小限制适用于所有现有的 Modbus 协议实现(传统)! |
头部由地址字段(1 个字节)组成,尾部是整个包的错误校验和,包括地址字段(即头部)。为了传输,Modbus 消息(即 ADU)被放入一个具有已知开始和结束点的帧中,从而允许检测消息的开始和结束,从而检测部分消息。存在两种传输模式,它们的编码、成帧和校验和有所不同:
-
ASCII码
帧被编码为每个字节两个 ASCII 字符,代表字节的十六进制表示法(即字符 0-9、A-F)。错误校验和由纵向冗余校验(LRC;1 字节)表示,消息以冒号(’:’,0x3A)开头,以回车符-换行符(“CRLF”,0x0D0A)结束。字符之间可能会出现 1 秒的停顿。
-
RTU
帧以二进制传输以实现更高的密度。错误校验和由循环冗余校验(16 位 CRC;2 字节)表示,消息以至少 3.5 个字符时间的静默间隔开始和结束。这最容易实现为网络上正在使用的波特率的字符时间的倍数。两个字节之间可能发生的最大暂停为 1.5 个字符时间。
jamod 旨在支持两种传输模式,使用基于 javax.comm API 的实现。
警告 |
---|
RTU 实现仅支持 Master 端。它按照最大努力原则工作,这意味着它可能无法在低延迟实时环境中以可靠的方式工作。 |
确实可以实现基于其他串行堆栈实现(即 Java Comm API 实现的替代品)的串行传输,例如SerialPort ( www.sc-systems.com/products/se… ) . 根据产品信息,它支持大约20个平台,并已成功用于在Java中实现两种串行传输模式(仅限Master,参见Field Talk/Java,Focus Engineering的商业Master协议包)。
3.2、基于 IP 的 Modbus 实现
基于 TCP/IP 的 Modbus 协议实现 (Modbus/TCP) 最近已作为 RFC 草案提交给 IETF。它使用 TCP/IP 堆栈进行通信(注册端口为 502)并使用 IP 特定报头扩展 PDU(参见图 6)。
可能的网络设置不受规范的约束;可以建立多主系统或实现双向通信(即同时有主从节点)。但是,用户应该清楚地意识到主/从模式的偏差会产生影响。
IP 特定报头(在规范中称为 MBAP)长 7 个字节,由以下字段组成:
- 用于交易配对的调用标识(2 个字节);以前称为交易标识符
- Modbus的协议标识符(2个字节),是0用于Modbus默认; 为将来的扩展保留
- 报文长度(2个字节),所有后面字节的字节计数
- 用于标识位于非 TCP/IP 网络上的远程单元的单元标识符(1 个字节)
4、总结
本文翻译自Modbus Java版官方文档 jamod官方文档http://jamod.sourceforge.net/kb/protocol.html
今天的文章了解Modbus协议分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/23500.html