带你轻松了解Modbus协议

 更新时间:2021年11月03日 11:30:22   作者:被遗忘的凉白开  
这篇文章主要给大家介绍了关于Modbus协议的相关资料,此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的,需要的朋友可以参考下

1、Modbus是什么

基本上,Modbus 是一种用于设备之间通信的应用层协议主要用于交换自动化领域的典型数据。

在这个级别上,Modbus 是一种无状态的客户端-服务器协议(例如,很像 HTTP),基于事务,它由请求(由客户端发出)和响应(由服务器发出)组成。在通常应用该协议的领域中,存在一个概念,即使用共享信号电缆的网络上控制较低级别通信行为的可能模式之一:主从。为了防止混淆,以下有向关系根据客户端-服务器范式描述了主从:

Master

主站 对应 ----> 客户端

Slave

从站 对应----->服务端

2、Modbus协议解析

无状态通信基于一个简单的包,称为协议数据单元 (PDU)。协议规范定义了三种类型的 PDU:

请求 PDU,包括:

  1. 指定功能的代码(功能代码,1 字节)
  2. 和功能特定数据(功能数据,可变字节数)

响应 PDU,包括:

  1. 请求对应的功能码(Function Code,1字节)
  2. 和响应特定数据(响应数据,可变字节数)

异常响应 PDU,包括:

  1. 请求对应的功能码+0x80(128),(错误码,1字节)
  2. 以及指定异常的代码(异常代码,1 字节)

2.1、Modbus功能

每个功能都分配了一个特定的功能代码。它们的范围是 1-127(十进制),因为129(即 1+128)- 255(即 127+128)代表错误代码的范围。

功能码是协议的一部分,功能码就分为以下三类,一个是协议里规定好的功能,用户也可以自定义功能

Public

保证是唯一的,并指定公开记录的明确定义的功能。这些由社区验证并且存在一致性测试。

  • 读离散输入
  • 读写线圈
  • 读输入寄存器
  • 读写保持寄存器

User-Defined

可用于用户定义的函数,因此它们的代码可能不是唯一的。该规范为用户定义的函数定义了代码范围 65-72 和 100-110。

保留

这些目前被一些公司用于遗留产品,不能公开使用

函数的文档包括:

  1. 函数的描述(即它的用途)、它的参数和返回值(包括可能的异常)。
  2. 分配的功能代码
  3. 请求 PDU
  4. 响应 PDU
  5. 异常响应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)被放入一个具有已知开始和结束点的帧中,从而允许检测消息的开始和结束,从而检测部分消息。存在两种传输模式,它们的编码、成帧和校验和有所不同:

1、ASCII码

帧被编码为每个字节两个 ASCII 字符,代表字节的十六进制表示法(即字符 0-9、A-F)。错误校验和由纵向冗余校验(LRC;1 字节)表示,消息以冒号(':',0x3A)开头,以回车符-换行符(“CRLF”,0x0D0A)结束。字符之间可能会出现 1 秒的停顿。

2、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 个字节,由以下字段组成:

  1. 用于交易配对的调用标识(2 个字节);以前称为交易标识符
  2. Modbus的协议标识符(2个字节),是0用于Modbus默认; 为将来的扩展保留
  3. 报文长度(2个字节),所有后面字节的字节计数
  4. 用于标识位于非 TCP/IP 网络上的远程单元的单元标识符(1 个字节)

4、总结

本文翻译自Modbus Java版官方文档

jamod官方文档http://jamod.sourceforge.net/kb/protocol.html

到此这篇关于带你轻松了解Modbus协议的文章就介绍到这了,更多相关了解Modbus协议内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java C++算法题解leetcode801使序列递增的最小交换次数

    Java C++算法题解leetcode801使序列递增的最小交换次数

    这篇文章主要为大家介绍了Java C++题解leetcode801使序列递增的最小交换次数示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • spring boot整合scurity做简单的登录校验的实现

    spring boot整合scurity做简单的登录校验的实现

    这篇文章主要介绍了spring boot整合scurity做简单的登录校验的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • java 字符串截取的实例详解

    java 字符串截取的实例详解

    这篇文章主要介绍了java 字符串截取的实例详解的相关资料,这里提供了实例代码帮助大家实现这样的功能,需要的朋友可以参考下
    2017-08-08
  • 图片叠加效果Java代码实现

    图片叠加效果Java代码实现

    这篇文章主要为大家详细介绍了图片叠加效果Java代码实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • vscode 配置java环境并调试运行的详细过程

    vscode 配置java环境并调试运行的详细过程

    这篇文章主要介绍了vscode 配置java环境并调试运行的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • Java Classloader机制用法代码解析

    Java Classloader机制用法代码解析

    这篇文章主要介绍了Java Classloader机制用法代码解析,涉及JDK默认ClassLoader,双亲委托模型,自定义ClassLoader等相关内容,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • java简单实现自定义日历

    java简单实现自定义日历

    这篇文章主要为大家详细介绍了java简单实现自定义日历,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • SpringBoot整合Netty心跳机制过程详解

    SpringBoot整合Netty心跳机制过程详解

    这篇文章主要介绍了SpringBoot整合Netty心跳机制过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • 简单了解Java编程中对异常处理的运用

    简单了解Java编程中对异常处理的运用

    这篇文章主要简单介绍了Java编程中对异常处理的运用,是Java入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • Java Spring 事件监听详情解析

    Java Spring 事件监听详情解析

    这篇文章主要介绍了Java Spring 事件监听详情解析,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07

最新评论