[杂谈]-快速了解Modbus协议
快速了解Modbus协议
文章目录
- 快速了解Modbus协议
- 1、为何 Modbus 如此受欢迎
- 2、范围和数据速率
- 3、逻辑电平
- 4、层数
- 5、网络与通讯
- 6、数据帧格式
- 7、数据类型
- 8、服务器如何存储数据
- 9、总结
Modbus 是一种流行的低速串行通信协议,广泛应用于自动化行业。 该协议由 Modicon(现已被施耐德电气收购)于 1979 年为其自己的可编程逻辑控制器开发。 该协议充当 PLC 和智能自动化设备之间的链接。 Modbus 现在是由 Modbus 组织维护的开放协议,自诞生以来就深受自动化工程师的欢迎。 该协议广泛用于工业监测和控制,特别是 PLC。
串行协议基于主从配置,能够建立Modbus客户端与最多247个Modbus服务器的通信。 设备上的物理接口通过标准 RS-485 或 RS-232 端口来实现。 总线是两端均为 150 欧姆的屏蔽或非屏蔽双绞线电缆。 该电缆可以使用 9 针 D 型外壳、螺丝端子或 RJ-45 连接器轻松连接到设备。
Modbus 是使用菊花链或分接头的点对点或多点网络。 Modbus 网络中的整个通信均由主站(即 Modbus 客户端)控制和管理
Modbus 广泛用于将仪器仪表和控制设备与控制器或数据收集设备连接。 通常,数据收集设备或 Modbus 客户端是人机界面 (HMI) 或监控和数据采集 (SCADA) 系统内的监控计算机。 包括传感器模块、可编程逻辑控制器(PLC)或可编程自动化控制器(PAC)的远程终端单元(RTU)是Modbus服务器。 几乎所有商用 HMI、SCADA、OPC 服务器和数据采集软件都支持 Modbus,从而可以将 Modbus 兼容设备与任何工业自动化系统 (IAS) 或楼宇管理系统 (BMS) 轻松集成。
1、为何 Modbus 如此受欢迎
Modbus 被许多不同行业的制造商使用,并且因其简单性而变得相当流行。 它是一个开放标准; 因此,制造商可以将 RTU 版本的 Modbus 内置到他们的设备中,而无需支付任何使用费。 该协议甚至可以在 Arduino 等原型板上实现。 事实上,该通信协议可以在任何微控制器或计算机上轻松实现。 数据通信通过请求-响应方式进行,消息具有固定的帧格式。
Modbus 协议最初是作为应用层协议开发的,用于通过串行层传输数据,目前有三个版本:两个用于串行线路 — Modbus RTU 和 Modbus ASCII;两个用于串行线路 — Modbus RTU 和 Modbus ASCII;两个用于串行线路 — Modbus RTU 和 Modbus ASCII。 一种用于以太网(TCP/IP 和 UDP)——Modbus TCP。 虽然相对简单,该协议仍然能够进行消息检查,并且准确率超过 99%。 Modbus RTU 具有循环冗余校验和 (CRC),Modbus ASCII 具有用于错误检查的纵向冗余校验 (LRC)。
尽管该协议诞生于 20 世纪 70 年代,但其实施只需要极少的 RAM 和内存资源。 在 20 世纪 70 年代,计算机技术以及嵌入式技术还没有今天那么先进,像 Modbus 这样的轻量级协议尤其有吸引力。 Modbus 的受欢迎程度从未下降。
2、范围和数据速率
Modbus 的标准数据速率为 9600 b/s 或 19.2 kb/s。 通常,19.2 kb/s 是默认速率。 数据速率可降低至4800 b/s、2400 b/s等。最大数据速率为115.2 kb/s。 在 9600 b/s 的标准数据速率下,Modbus 的最大范围可达 1000 米。 如果数据速率增加,范围就会减小。 龙头长度应始终小于 20 米。
3、逻辑电平
在 Modbus 上,二进制 0 由 +2 至 +6V 的电压电平表示。 二进制1由-2至-6V的电压电平表示。
4、层数
最初,Modbus 是在串行层上实现的单一协议。 当为以太网实现协议时,引入了应用数据单元,以便能够通过串行以及 TCP/IP 和 UDP 网络实现。 该协议现在分为两层——核心层和网络层。 核心层定义协议数据单元(PDU),而网络层定义应用数据单元(ADU)。 即使没有定义任何应用数据单元,PDU也可以通过UDP网络传输。
Modbus 的串行版本(即 Modbus RTU 和 Modbus ASCII)仅需要 PDU,而以太网版本(即 Modbus TCP)则需要 PDU 和 ADU。
5、网络与通讯
Modbus 是一种以主从配置实现的请求-响应协议。 有两种类型的设备 - Modbus 客户端和 Modbus 服务器。 Modbus 客户端是主站,通常是 SCADA 系统或 HMI 中的监控计算机。 Modbus 服务器是从站,通常是远程终端单元,例如传感器模块、PLC 和 PAC。
Modbus 的串行版本支持单个客户端与最多 247 个 Modbus 服务器的通信。 由于 RS-485 和 RS-232 端口都是 Modbus 实现的通用端口,如果使用 RS-232 端口,Modbus 服务器的最大数量可达 247 个,但如果使用 RS-485 端口,则最大 Modbus 服务器数量可达 247 个。 由于 RS-485 标准的实际限制,Modbus 服务器限制为 32 个。 可以有多个客户端和无限的服务器,因为 Modbus 的以太网版本具有用于互联网路由的附加 6 字节标头
整个数据通信由Modbus客户端通过请求-响应的方式控制。 在 Modbus 中,数据被传输为字节。 在 RTU 版本中,每个字节都编码在一个 11 位异步帧中,该帧由起始位、数据字节、偶校验和一个停止位组成。 在 ASCII 版本中,每个字节都编码在 10 位帧中,该帧由起始位、7 位数据、1 位偶数或奇数奇偶校验或无位(如果没有奇偶校验)以及 1 个停止位(如果使用奇偶校验)组成 2 停止位。
主设备/客户端和从设备/服务器之间传递的消息称为协议数据单元(PDU)。 PDU 由从机地址、功能代码(命令)、数据和校验和(CRC 或 LRC)组成。
主设备向由从设备地址标识的从设备之一发送请求。 从机地址为一字节长,可以是 0 到 255 之间的值。根据协议,从机地址 0 保留用于广播消息,标识从机设备的从机地址不能超过 247。功能代码也是一字节 长,它告诉被寻址的从设备必须采取什么样的操作。 1~255范围内的功能码有效,其中128~255保留用于异常响应。 该操作是读取或写入操作,请求中的数据借此提供执行该操作所需的附加信息。 例如,它可以指定从哪里开始读取以及必须读取多少数据。 RTU 版本采用CRC 进行错误检查,而ASCII 版本采用LRC 进行错误检查。
当主设备向寻址的从设备发出请求时,它会发回响应。 从机地址和功能代码在同一响应中回显。 数据包含主站请求的值。 如果在执行请求的操作时发生错误,则功能代码将被修改,并且数据包含描述错误的代码。 同样,分别根据 RTU 或 ASCII 帧的 CRC 或 LRC 用于确保消息或 PDU 的完整性。
6、数据帧格式
在 RTU 成帧中,每个字节代表 11 位帧中的两个 4 位十六进制字符。 PDU 由 1 字节长的从机地址、1 字节长的功能码、0 至 252 字节长的数据和 2 字节长的 CRC 组成。

在 ASCII 帧中,每个字节代表 10 位帧中的两个 ASCII 字符。 PDU 由 1 个字符长的起始字符、2 个字符长的从机地址、2 个字符长的功能代码、0 至 504 个字符长的数据、2 个字符长的 LRC 和 2 个字符长的结束字符组成。 起始字符始终为冒号 (😃 或 ASCII 3A 十六进制。 结束字符始终是带有换行符的回车符(ASCII 0D 和 0A 十六进制)。 RTU 中的每个 PDU 以及 ASCII 版本均由 28 位或 3.5 个字符分隔。

Modbus 的 RTU 和 ASCII 版本几乎相似,除了一些差异之外。 在 RTU 成帧中,字节以二进制形式表示,而在 ASCII 成帧中,字节以可读的 4 位 ASCII 字符表示。 ASCII 帧具有文本开始和文本结束字符,而在 RTU 帧中,PDU/消息之间的 28 位分隔被解释为检测帧的开始和结束。 由于 RTU 成帧使用较短的消息,因此它比 ASCII 版本更快。 ASCII 版本确实有一个优点,即消息中的字符之间最多可以间隔一秒。 如果间隔超过一秒,设备将视为传输错误。
TCP版本的Modbus中的PDU由2字节长的事务ID、2字节长的协议字段、2字节长的长度字段、1字节长的从机地址和1到252字节长的协议字段组成。 消息字段。

事务 ID 标识事务,协议始终设置为 0 以指示 Modbus。 长度表示后面的字节数。 接下来是 1 字节长的从机地址。 消息字段是类似于Modbus帧的RTU版本,由功能代码和数据组成。 消息字段的最大大小可以是 253 字节(即功能代码为 1 字节,数据如 RTU 帧中最大为 252 字节)。
在所有版本(RTU、ASCII 和 TCP)中,最低有效位首先发送。Modbus 兼容设备无法自动检测波特率,因此需要在总线的客户端和服务器端显式设置相同的波特率。 Modbus PDU 支持的格式只能发送数据,无法跨通信设备发送参数。
7、数据类型
Modbus 中有两种类型的数据——线圈( Coils)和寄存器(Registers)。 线圈是单个位,可以是 0(关)或 1(开)。 线圈可以是离散的输出线圈或离散的输入触点。 离散输入触点是物理离散输入的状态,即“开”或“关”。 离散输出线圈是物理离散输出信号的状态,即 ON 或 OFF。
这些寄存器是 16 位无符号寄存器,可以包含表示浮点数、ASCII 文本、队列或表的值。 寄存器本身仅存储 0 到 65535 范围内的正值,即 0x0000 到 0xFFFF 十六进制。 存储在寄存器中的 16 位数据可以被 Modbus 客户端解释为 16 位无符号整数、16 位有符号整数、2 字符 ASCII 字符串或离散 ON/OFF 值。 存储在寄存器中的 32 位数据可以被 Modbus 客户端解释为 32 位无符号整数、32 位有符号整数、4 个字符的 ASCII 字符串或 32 位双精度浮点数。
有两种类型的寄存器——模拟输入寄存器和模拟输出保持寄存器。 与离散输入触点(线圈)一样,输入寄存器将外部输入的状态存储为 0 到 65535(0x0000 和 0xFFFF)之间的值。 过去,输入寄存器通常用于存储模拟输入值的数字表示,这些模拟输入值可以是电压或电流信号。 输出保持寄存器用于存储设备上的数据。 现在,由于大多数Modbus兼容设备都不是输入/输出设备,因此输入寄存器也用于存储数据。
8、服务器如何存储数据
在传感器模块、PLC 或 PAC 等 Modbus 服务器上,数据被组织到四个表或数据库中。 有两个数据库用于存储离散的开/关值或线圈。 这些数据库分别存储离散输出线圈和离散输入触点。 然后,有两个存储数值的数据库或寄存器,分别存储模拟输入寄存器和模拟输出保持寄存器。
每个数据库可存储 9999 个值。 例如,离散输出线圈和离散输入触点的数据库可以分别存储 0000 到 270E 范围内的 9999 位。 模拟输入寄存器和模拟输出保持寄存器的数据库可存储 9999 个字,每个字的范围为 0000 至 270E,每个字为 16 位长。
离散量输出线圈和模拟量输出保持寄存器的数据库是读写型的,而离散量输入触点和模拟量输入寄存器的数据库是只读型的。
数据库中的值可以通过位置名称来访问。 离散量输出线圈、离散量输入触点、模拟量输入寄存器和模拟量输出保持寄存器的数据库位置分别为 19999、1000119999、30001~39999 和 40001~49999。 下表总结了 Modbus 服务器上四个数据库的结构和性质。

9、总结
Modbus 是一种广泛使用的工业通信协议,通常与 PLC 一起使用。 该协议具有三个版本:RTU、ASCII 和 Modbus。 RTU 版本是开放标准且速度最快,最常被制造商使用。 对于较短的消息,RTU 帧的 Modbus 消息可以以 100 毫秒的间隔更新。 几乎所有商业 HMI、SCADA、OPC 服务器和数据采集软件都支持 Modbus,因此可以轻松地将 Modbus 兼容设备集成到任何工业自动化系统或楼宇管理系统中。
相关文章:
[杂谈]-快速了解Modbus协议
快速了解Modbus协议 文章目录 快速了解Modbus协议1、为何 Modbus 如此受欢迎2、范围和数据速率3、逻辑电平4、层数5、网络与通讯6、数据帧格式7、数据类型8、服务器如何存储数据9、总结 Modbus 是一种流行的低速串行通信协议,广泛应用于自动化行业。 该协议由 Mo…...
WhatsApp的两个商业模式该如何选择
WhatsApp Business 是什么 目前 WhatsApp 提供两种商业模式,企业应根据自身需求选择相应版本。 第一个版本是 WhatsApp Business:初创企业只需一个手机应用程序,便可以个体单位与客户轻松互动; 另一个版本是 WhatsApp Business APIÿ…...
动态表单设计
动态表单设计 背景方案讨论基于上面分析,对比调研,自定义动态表单数据模型表单详解(一) 表单模板:jim_dynamic_form(二)表单数据类型:jim_form_data_type(三)…...
JAR will be empty - no content was marked for inclusion!
现象 在对自建pom依赖组件打包时,出现JAR will be empty - no content was marked for inclusion!错误。 方案 在pom中怎么加packaging标签内容为pom,标识只打包pom文件 <?xml version"1.0" encoding"UTF-8"?> ...<grou…...
软件生命周期及流程【软件测试】
软件的生命周期 软件生命周期是软件开始研制到最终被废弃不用所经历的各个阶段。 瀑布型生命周期模型 规定了它们自上而下、相互衔接的固定次序,如同瀑布流水,逐级下落,具有顺序性和依赖性。每个阶段规定文档并需进行评审。 特点ÿ…...
2023高教社杯数学建模E题思路代码 - 黄河水沙监测数据分析
# 1 赛题 E 题 黄河水沙监测数据分析 黄河是中华民族的母亲河。研究黄河水沙通量的变化规律对沿黄流域的环境治理、气候变 化和人民生活的影响, 以及对优化黄河流域水资源分配、协调人地关系、调水调沙、防洪减灾 等方面都具有重要的理论指导意义。 附件 1 给出了位…...
双翌保养码使用指南方法(一)
保养码使用指南一 为了确保软件的正常运行和有效使用,正确地使用保养码是至关重要的。以下是保养码使用的简单指南,以帮助您进行正确的操作。 1. 打开软件入口:首先,在您的电脑上打开文件夹,并找到s-y softactive tool…...
hive指定字段插入数据,包含了分区表和非分区表
1、建表 语句如下: CREATE EXTERNAL TABLE ods_lineitem_full (l_shipdate date,l_orderkey bigint,l_linenumber int,l_partkey int,l_suppkey int,l_quantity decimal(15, 2),l_extendedprice decimal(15, 2),l_discount de…...
浏览器端vscode docker搭建(附带python环境)
dockerfile from centos:7 #安装python环境 run yum -y install wget openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel zlib-devel libffi-devel gcc make run wget https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tgz run tar -xvf Python-3.9.…...
Echarts图表跟随父容器的变化自适应
如果页面中有多个图表 隐藏/展开左边侧边栏echarts图表自适应 <div class"line"><div class"title">制冷站关键参数</div><div id"chartLine1" style"width: 100%;height:85%;"></div></div><…...
【多线程】ThreadLocal是什么?有哪些使用场景?使用ThreadLocal需要注意些什么?
文章目录 前言一、ThreadLocal 是什么?二、有哪些使用场景?三、实现原理四、在线程池中使用 ThreadLocal 为什么可能导致内存泄露呢?五、线程池中,如何正确使用 ThreadLocal?六、ThreadLocal 核心方法 前言 一、Threa…...
一种基于动态代理的通用研发提效解决方案
作为一名研发人员,除了业务开发之外,研发提效是一个永恒的话题,而女娲正是这一话题下进行的一次全面的剖析和实践。 作者:张全洪(钝悟) 一、女娲是什么 女娲是业务研发同学(开发、测试、运维)在软件迭代的…...
【vue3】一些关于hooks的使用经验
前言 最近接到了一个需求,隔壁嵌入式部门希望我们用前端解析渲染Kconfig表单。这篇文章用来记录一下本次使用hook pinia vue3的经验 hooks hooks的概念最早是在 React 中听到的,虽然早些时间也写过一点react,但也只是照葫芦画瓢…...
面试系列 - Java 并发容器详解
Java 并发容器是一组用于在多线程环境下安全访问和操作数据的数据结构。它们提供了线程安全的集合和映射,使开发者能够更轻松地处理并发编程问题。 一、Java并发容器 ConcurrentHashMap: 它是一个高效的并发哈希表,支持多线程并发操作而不需…...
使用动态住宅代理还能带来哪些好处?
一、什么是动态住宅代理ip 动态住宅代理是一种代理技术,它利用代理服务器中转用户和目标服务器之间的网络流量,实现用户真实位置的屏蔽。代理提供商会有自己的ip大池子,当你通过代理服务器向网站发送请求时,服务器会从池子中选中…...
笙默考试管理系统-MyExamTest----codemirror(18)
笙默考试管理系统-MyExamTest----codemirror(18) 目录 一、 笙默考试管理系统-MyExamTest----codemirror 二、 笙默考试管理系统-MyExamTest----codemirror 三、 笙默考试管理系统-MyExamTest----codemirror 四、 笙默考试管理系统-MyExamTest---…...
TGA格式文件转材质
今天淘宝上买了一个美女的模型,是blender的源文件,上面说有fbx格式的。我用unity,所以觉得应该可以用。文件内容如下图: FBX文件夹打开后,内容如下图所示,当时就预感到可能没有色彩。 unity打开后果然发现只…...
IP应用场景查询API:深入了解网络用户行为的利器
前言 随着数字时代的不断发展,互联网已经成为人们生活的重要组成部分。而随着越来越多的业务和社交活动迁移到在线平台上,了解和理解网络用户行为变得至关重要。为了满足这个需求,IP 应用场景查询 API 崭露头角,成为深入了解网络…...
docker从零部署jenkins保姆级教程(上)
jenkins,基本是最常用的持续集成工具。在实际的工作中,后端研发一般没有jenkins的操作权限,只有一些查看权限,但是我们的代码是经过这个工具构建出来部署到服务器的,所以我觉着有必要了解一下这个工具的搭建过程以及简…...
2023数模A题——定日镜场的优化问题
A题——定日镜场的优化问题 思路:该题主要考察的几何知识和天文学知识,需要不同角度下的镜面和遮挡情况。 资料获取 问题1: 若将吸收塔建于该圆形定日镜场中心,定日镜尺寸均为 6 m6 m,安装高度均为 4 m,且…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
41道Django高频题整理(附答案背诵版)
解释一下 Django 和 Tornado 的关系? Django和Tornado都是Python的web框架,但它们的设计哲学和应用场景有所不同。 Django是一个高级的Python Web框架,鼓励快速开发和干净、实用的设计。它遵循MVC设计,并强调代码复用。Django有…...
基于stm32F10x 系列微控制器的智能电子琴(附完整项目源码、详细接线及讲解视频)
注:文章末尾网盘链接中自取成品使用演示视频、项目源码、项目文档 所用硬件:STM32F103C8T6、无源蜂鸣器、44矩阵键盘、flash存储模块、OLED显示屏、RGB三色灯、面包板、杜邦线、usb转ttl串口 stm32f103c8t6 面包板 …...
Linux入门课的思维导图
耗时两周,终于把慕课网上的Linux的基础入门课实操、总结完了! 第一次以Blog的形式做学习记录,过程很有意思,但也很耗时。 课程时长5h,涉及到很多专有名词,要去逐个查找,以前接触过的概念因为时…...
