带你轻松了解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协议内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈@RequestBody和@RequestParam可以同时使用

    浅谈@RequestBody和@RequestParam可以同时使用

    这篇文章主要介绍了@RequestBody和@RequestParam可以同时使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java 堆内存溢出原因分析

    Java 堆内存溢出原因分析

    这篇文章主要介绍了Java 堆内存溢出原因分析,任何使用过基于 Java 的企业级后端应用的软件开发者都会遇到过这种报错,java.lang.OutOfMemoryError:Java heap space。,需要的朋友可以参考下
    2019-06-06
  • 深入理解Java基础之try-with-resource语法糖

    深入理解Java基础之try-with-resource语法糖

    这篇文章主要介绍了深入理解Java基础之try-with-resource语法糖,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • Velocity基本语法介绍

    Velocity基本语法介绍

    以下是对Velocity的基本语法进行了深入的介绍。需要的朋友可以过来参考下
    2013-08-08
  • 详解Java类型擦除机制

    详解Java类型擦除机制

    Java泛型是JDK 5引入的一个特性,它允许我们定义类和接口的时候使用参数类型,泛型在集合框架中被广泛使用。这篇文章主要介绍了Java类型擦除机制,需要的朋友可以参考下
    2019-07-07
  • springboot中websocket简单实现

    springboot中websocket简单实现

    本文主要介绍了springboot中websocket简单实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • idea同时打开多个项目的图文教程

    idea同时打开多个项目的图文教程

    这篇文章主要给大家介绍了idea同时打开多个项目的图文教程,文章通过图文结合的形式给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-02-02
  • Java date format时间格式化操作示例

    Java date format时间格式化操作示例

    这篇文章主要介绍了Java date format时间格式化操作,结合具体实例形式分析了java针对日期时间进行格式化操作的相关实现技巧,需要的朋友可以参考下
    2017-03-03
  • Java基于LoadingCache实现本地缓存的示例代码

    Java基于LoadingCache实现本地缓存的示例代码

    本文主要介绍了Java基于LoadingCache实现本地缓存的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 基于spring boot 2和shiro实现身份验证案例

    基于spring boot 2和shiro实现身份验证案例

    这篇文章主要介绍了基于spring boot 2和shiro实现身份验证案例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04

最新评论