带你轻松了解Modbus协议

目录
  • 1、Modbus是什么
  • 2、Modbus协议解析
    • 2.1、Modbus功能
    • 2.2、Modbus数据模型
  • 3、Modbus实现
    • 3.1、串行Modbus实现
    • 3.2、基于 IP 的 Modbus 实现
  • 4、总结

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协议内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java利用socket通信实现Modbus-RTU通信协议的示例代码

    Modbus Modbus是一种串行通信协议.Modbus 一个工业上常用的通讯协议.一种通讯约定.Modbus协议包括RTU.ASCII.TCP.其中MODBUS-RTU最常用,比较简单,在单片机上很容易实现. 简单分析Modbus-RTU报文 37 03 10 3F 80 00 00 00 00 00 00 3F 80 00 00 40 40 00 00 24 dd(十六进制) 37:从站地址 ,03:功能码,10:读取的字节数,24 dd:crc校验码.其它就是传送的数据. 4G DTU(

  • 带你轻松了解Modbus协议

    目录 1.Modbus是什么 2.Modbus协议解析 2.1.Modbus功能 2.2.Modbus数据模型 3.Modbus实现 3.1.串行Modbus实现 3.2.基于 IP 的 Modbus 实现 4.总结 1.Modbus是什么 基本上,Modbus 是一种用于设备之间通信的应用层协议主要用于交换自动化领域的典型数据. 在这个级别上,Modbus 是一种无状态的客户端-服务器协议(例如,很像 HTTP),基于事务,它由请求(由客户端发出)和响应(由服务器发出)组成.在通常应用该协议的

  • 15行Python代码带你轻松理解令牌桶算法

    在网络中传输数据时,为了防止网络拥塞,需限制流出网络的流量,使流量以比较均匀的速度向外发送,令牌桶算法就实现了这个功能, 可控制发送到网络上数据的数目,并允许突发数据的发送. 什么是令牌 从名字上看令牌桶,大概就是一个装有令牌的桶吧,那么什么是令牌呢? 紫薇格格拿的令箭,可以发号施令,令行禁止.在计算机的世界中,令牌也有令行禁止的意思,有令牌,则相当于得到了进行操作的授权,没有令牌,就什么都不能做. 用令牌实现限速器 我们用1块令牌来代表发送1字节数据的资格,假设我们源源不断的发放令牌给程序,程

  • Android端使用Modbus协议的简单方法

    目录 1.导入Modbus4Android的库 2.基于 TCP/IP 的 Modbus Master/客户端 2.1.初始化ModbusMaster 2.2.读写保持寄存器 2.3.读写线圈 2.4 回收Master 3.基于 TCP/IP 的 Modbus Salve/服务端 4.总结 点我了解Modbus协议 Modbus用于设备之间的通信,同样在正常App开发中用的也很少 1.导入Modbus4Android的库 gayhub地址:github.com/zgkxzx/Modb- 使用Ja

  • 5招带你轻松优化MySQL count(*)查询性能

    目录 前言 1 count(*)为什么性能差 2 如何优化count(*)性能 2.1 增加redis缓存 2.2 加二级缓存 2.3 多线程执行 2.4 减少join的表 2.5 改成ClickHouse 3 count的各种用法性能对比 前言 最近我在公司优化过几个慢查询接口的性能,总结了一些心得体会拿出来跟大家一起分享一下,希望对你会有所帮助. 我们使用的数据库是Mysql8,使用的存储引擎是Innodb.这次优化除了优化索引之外,更多的是在优化count(*). 通常情况下,分页接口一般

  • 一文带你轻松学会Go语言动态调用函数

    目录 前言 JavaScript 动态调用函数 Go 中动态调用方法 前言 经常在开发的时候会遇到这样的场景,几个模块的都有相同的方法,但会因为不同的类型的需要调用不同模块的方法.使用一个 switch 可以很方便的解决问题.但是当你遇到的场景是几个模块的方法都是需要的执行,同时它需要在不同的配置下执行相对应的方法. func m1(){} func m2(){} func m3(){} c := cron.New(cron.WithSeconds()) c.addFunc(config1,fu

  • 一篇文章带你轻松了解C# Lock关键字

    相信绝大多数.NET玩家和我一样,常常使用Timer这个对象,而在WPF中使用DispatcherTimer的人也是很多,DispatcherTimer是在UI线程跑的.我们的程序中大多数都会充斥很多Timer,可以理解它是一个线程,它继承自 System.Windows.Threading . 程序中也许会有一些静态变量或是单例模式的对象来让不同的页面进行交互,但也就是这样让每个线程之间打架提供了基础.因为资源是单独的,就像是脚踩两只船的人,必定会翻车.例如一个List集合,你在一个线程中对它

  • torchtext入门教程必看,带你轻松玩转文本数据处理

    用深度学习做nlp也有一段时间了,熟悉这块内容的同学都知道,实践算法的时候,写模型是个简单的事,最麻烦的是数据处理,数据处理不仅会浪费我们大部分时间,而且会消耗很大的计算资源,浪费人力物力. 今年开始接触pytorch,简洁的API,动态图,更加灵活的编写模式,诸多优点不用多说. 最近尝试使用torchtext工具,这里想先说明的是,torchtext并不是pytorch所独有的,使用其它深度学习框架,torchtext仍然可以使用. 但是比较麻烦的是,并没有很好很全面的torchtext教程,

  • 带你轻松搞定Java面向对象的编程--数组,集合框架

    目录 一.数组 1.数组的定义 2.数组的声明 3.数组的初始化 二.集合概述 三.Collection接口 1.Collection接口概述 2.集合框架的三个组件 3.Iterator接口 四.List接口 1.ArrayList类 2.LinkedList类 五.Set接口 1.HashSet类 六.Map接口 1.HashMap类 七.泛型 总结 一.数组 1.数组的定义 数组是为了解决同类数据整合摆放而提出的,可以理解为一组具有相同类型的变量的集合,它的每个元素都具有相同的数据类型.

  • 带你轻松掌握Redis分布式锁

    目录 1. 什么是分布式锁 2. 分布式锁该具备的特性 3. 基于数据库做分布式锁 4. 基于Redis做分布式锁 4.1 超时问题 4.2 可重入锁 4.3 集群环境的缺陷 4.4 Redlock 目前很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题. 基于 CAP理论,任何一个分布式系统都无法同时满足一致性(Consistency).可用性(Availability)和分区容错性(Partition tolerance),最多只能同时满足两项. 我们为

  • 一篇文章带你轻松搞懂Golang的error处理

    目录 Golang中的error error的几种玩法 哨兵错误 自定义错误类型 Wrap error Golang1.13版本error的新特性 errors.UnWrap() errors.Is() errors.As() error处理最佳实践 优先处理error 只处理error一次 不要反复包装error 不透明的错误处理 简化错误处理 bufio.scan errWriter 何时该用panic 小补充 总结 Golang中的error Golang中的 error 就是一个简单的接

随机推荐