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

相关文章

  • Spring+Http请求+HttpClient实现传参

    Spring+Http请求+HttpClient实现传参

    这篇文章主要介绍了Spring+Http请求+HttpClient实现传参,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • 在Eclipse中部署Spring Boot/Spring Cloud应用到阿里云

    在Eclipse中部署Spring Boot/Spring Cloud应用到阿里云

    这篇文章主要介绍了在Eclipse中部署Spring Boot/Spring Cloud应用到阿里云,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • MAC下基于maven使用IDEA走读TestNG源码解析

    MAC下基于maven使用IDEA走读TestNG源码解析

    这篇文章主要介绍了MAC下基于maven使用IDEA走读TestNG源码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-06-06
  • Java对字符串进行加密解密

    Java对字符串进行加密解密

    这篇文章主要为大家详细介绍了Java字符串加密解密,对用户输入的每个字符的值进行加密解密,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Struts2 使用OGNL遍历map方法详解

    Struts2 使用OGNL遍历map方法详解

    这篇文章主要介绍了Struts2 使用OGNL遍历map方法详解,具有一定参考价值,需要的朋友可以了解下。
    2017-09-09
  • java实现随机输出300题四则运算

    java实现随机输出300题四则运算

    本文主要介绍了java实现随机输出300题四则运算实例,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • java中的通用权限管理设计(推荐)

    java中的通用权限管理设计(推荐)

    下面小编就为大家推荐一篇java中的通用权限管理设计,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • 解析ConcurrentHashMap: transfer方法源码分析(难点)

    解析ConcurrentHashMap: transfer方法源码分析(难点)

    ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成。Segment的结构和HashMap类似,是一种数组和链表结构,今天给大家普及java面试常见问题---ConcurrentHashMap知识,一起看看吧
    2021-06-06
  • java实现潜艇大战游戏源码

    java实现潜艇大战游戏源码

    潜艇大战游戏相信大家都玩过,是一款非常有趣的小游戏,那么基于代码是如何实现的呢?今天小编给大家带来一篇教程帮助大家学习java实现潜艇大战游戏,感谢的朋友一起看看吧
    2021-06-06
  • java实现查找替换功能

    java实现查找替换功能

    这篇文章主要为大家详细介绍了java实现查找替换功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03

最新评论