百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

新阁上位机开发---10年工程师的Modbus总结

ahcoder 2025-02-17 10:59 17 浏览

前言

我算了一下,今年是我跟Modbus相识的第10年,从最开始的简单应用到协议了解,从协议开发到协议讲解,这个陪伴了10年的协议,它一直没变,变的只是我对它的理解和认识。


我一直认为Modbus协议的存在有它的历史意义,也就是说即使没有Modbus,也可能会出一个ABUS、DBUS之类的协议,因为控制器与控制器之间通信,一个标准协议,会大大提供开发效率。


因此,现在国产的各种品牌PLC,比如台达、汇川、信捷等,这些PLC都是支持Modbus协议,也就是说,学会了Modbus协议,我们可以很轻松与这些PLC实现数据通信。上位机中,Modbus协议应用还是很广泛的。


文章有点长,感谢大家耐心阅读,文末有福利!


Modbus协议能够成为工业领域应用最广泛的协议,它必须具备以下几个特点:


1、免费:这个是最大的前提,任何产品都是一样,只有通过免费才能获取到前期最大的使用量。


2、简单:Modbus协议帧格式简单紧凑,用户容易理解,厂商容易集成。


3、接口:Modbus协议只是一种规约,属于应用层的协议,因此不仅可以应用在串口(485/232/422),也可以在以太网、光纤、蓝牙、无线上传输。


存储区分类

我一般介绍Modbus协议的时候,喜欢站在Modbus规约制定者的角度,结合一些事物来对比说明,这样对很多人来说,可能会更加容易理解。


假设没有Modbus协议,我们想要制定一个协议,我们首先要明确,协议的目的是为了数据传输,因此,为了更好地存储不同的数据类型,我们会将布尔和非布尔的数据分开存储,因此,就有了线圈和寄存器的概念。


线圈和寄存器,这个经常被很多人诟病,认为不应该这么翻译,感觉不容易理解。从电气角度来看,在电气控制回路中,一般都是靠接触器或中间继电器来实现控制,接触器或中继最终靠的是线圈的得电和失电来控制触点闭合和断开,因此用线圈表示布尔量;而寄存器在计算机中,就是用来存储数据的,因此非布尔的数据放在寄存器里。


这个可以跟PLC的存储区来进行对比,西门子的I/Q/M都是线圈,V/T/C/DB都是寄存器,三菱的X/Y都是线圈,D/W/H都是寄存器,欧姆龙的CIO是线圈,D/W/H是寄存器。

以西门子为例,虽然I和Q都表示线圈,但是他们的分工是不同的,I表示输入,Q表示输出,输入意味着该存储区里的值必须由外部设备接入,是只读的,输出表示输出结果给外部设备,是可读可写的。


因此,Modbus的线圈和寄存器应该也按照只读、读写来进一步细分,因此这就形成了Modbus的存储区,如下表所示:


序号

读写

存储类型

存储区名称

1

只读

线圈

输入线圈

2

读写

线圈

输出线圈

3

只读

寄存器

输入寄存器

4

读写

寄存器

保持寄存器


存储区代号

然而,上面表格里的存储区名称是一个全称,开发和使用中使用全称会比较麻烦,因此需要给他们取个别名,就像西门子的I/Q/M一样,这些都是西门子给存储区取的一个代号,所以Modbus也要给这些存储区取一个代号,干脆直接用数字吧,于是,就有了下面的规定:


存储区名称

存储区代号

输入线圈

1区

输出线圈

0区

输入寄存器

3区

保持寄存器

4区


这个其实就跟我们的姓名和小名一样,姓名是正式场合使用,日常场合,我们一般可以使用小名。


存储区范围

无论是什么存储区,都会有一个范围的限制,就像西门子的M区可能最大到8192,三菱的X区最大到2048,Modbus的每个存储区也应该规定一个范围,不能无限制使用。


Modbus是这么规定的,每个存储区的最大范围是65536,这个范围是很大的。


我们再以三菱的X区为例,如果最大范围是2048,那么意味着我们只能访问X0-X2047这些地址,我们这里说的X0、X2047,就是我们常说的PLC地址,那么这个地址是怎么组成的呢?它是由存储区编号加上一个地址索引组成,我们把这样的PLC地址,理解为绝对地址,后面的地址索引,理解为相对地址。


所谓绝对地址,就是我们仅仅通过一个地址名称,就能知道是什么存储区的第几个数据,而这个第几个,就是我们说的相对地址,因此绝对地址是唯一的,相对地址,每个存储区都有。


那么对于Modbus来说,我们的绝对地址和相对地址是怎么样的呢?


我们仍然遵从公式:绝对地址=区号+相对地址。


但是也会有一些不一样的地方,以保持型寄存器为例,第一个绝对地址是400001,这个地方不是400000,这个是由Modbus规约决定的,其它存储区也是类似的。


因此,Modbus存储区范围如下图所示:


正如上文所说,65536这个范围是很大的,但在实际使用中,我们一般用不了这么多地址,一般情况下,10000以内就已经足够我们使用了,因此,为了方便起见,我们有一种短的地址模型,如下图所示:


功能码

功能码这个概念,我们可以这么去理解,先回到我们的初衷,协议的目的是为了数据传输,也就是为了读取数据和写入数据,我们已经确定好4个存储区,存储不同的数据类型,那么接下来我们就要对这些存储区进行读写,那么可能会产生很多种不同的行为,比如读取输入线圈存储区、读取输出线圈存储区,这就是两种不同的行为,同样的,如果用读取输入线圈存储区、读取输出线圈存储区,会比较麻烦,那么我们干脆给每种形成指定一个代号,那么这种代号就是功能码。


我们再来探讨一下,究竟有多少种不同的行为呢?


读取和写入是2种行为,存储区有4个,但是我们知道输入线圈和输入寄存器是只读的,因此不能进行写入,除去这2种的话,应该会产生6种不同的行为,如下图所示:


行为序号

具体行为

1

读取输入线圈

2

读取输出线圈

3

读取输入寄存器

4

读取保持寄存器

5

写入输出线圈

6

写入保持寄存器


然而,Modbus规约将写入输出线圈和写入保持寄存器这2种行为,又进一步做了细分,包括写入单个和写入多个,因此原来的6种行为就变成了8种行为,同时给每种行为设置一个代号,就形成了下图所示的功能码列表:


功能码

功能说明

0x01

读取输出线圈

0x02

读取输入线圈

0x03

读取保持寄存器

0x04

读取输入寄存器

0x05

写入单个线圈

0x06

写入单个寄存器

0x0F

写入多个线圈

0x10

写入多个寄存器


Modbus规约中的功能码其实不止这8个,还有一些功能码是用于诊断或异常码,但是一般很少使用,这8种功能码是最主要的核心功能码。


协议分类

Modbus严格来说,是一个标准化的规约,而不是一个具体协议。我们常说的设备A和设备B之间通过Modbus协议来通信,这句话其实是不严谨的。


Modbus规约上有三种不同的协议,分别是ModbusRtu、ModbusAscii、ModbusTcp。


一般来说,ModbusRtu和ModbusAscii是运行在串口上的协议,ModbusTcp是运行是以太网上的协议,但是这并非绝对的,我们也可以将ModbusRtu、ModbusAscii运行在以太网或光纤上使用,同样的,在串口网络里,我们也可以使用ModbusTcp的协议,因为协议只是一种规范,并不限制通信介质。


报文格式

前面我们说了Modbus有三种不同的协议,分别是ModbusRtu、ModbusAscii、ModbusTcp,那么这三种协议的报文格式也是不同的,下面分别对这三种协议的报文格式进行说明:


  1. ModbusRtu的报文格式如下:


第一部分:从站地址,占1个字节

第二部分:功能码,占1个字节

第三部分:数据部分,占N个字节

第四部分:校验部分,CRC校验,占2个字节


2. ModbusAscii的报文格式如下:


第一部分:开始字符(:)

第二部分:从站地址,占2个字节

第三部分:功能码,占2个字节

第四部分:数据部分,占N个字节

第五部分:校验部分,LRC校验,占2个字节

第六部分:结束字符(CR LF)


3. ModbusTcp的报文格式如下:


第一部分:事务处理标识符,占2个字节

第二部分:协议标识符,占2个字节

第三部分:长度,占2个字节

第四部分:单元标识符,占1个字节

第五部分:功能码,占1个字节

第六部分:数据部分,占N个字节


调试软件

Modbus学习成本很低,因为协议是公开免费的,我们可以直接获取到《Modbus中文协议文档》。


同时,也有很多调试软件可以进行仿真调试,因此我们可以在不购买任何硬件的情况下,就把Modbus协议学好。


【协议文档和调试软件】可以联系助教老师获取


Modbus 学习必须要配合相关的调试软件,可以达到事半功倍的效果,Modbus

学习必备的三大神器分别是 ModbusPoll、ModbusSlave 及 VSPD,ModbusPoll 软件主要用于仿真 Modbus主站或 Modbus 客户端,ModbusSlave 软件主要用于仿真 Modbus 从站或 Modbus 服务器,而 VSPD 全称 Configure Virtual Serial Port Driver,是用来给电脑创建虚拟串口使用的。


即使我们想要结合硬件,支持Modbus协议的设备也有很多,各种品牌PLC、各种品牌的仪表、各种温湿度传感器、流量计等都可以很好地支持Modbus协议。


深入学习

纸上得来终觉浅,绝知此事要躬行。


为了便于大家更好地掌握了Modbus协议,我们组织了一次集训营《3天学会分析上位机通信报文与通信实践》,希望可以通过项目实战的形式,来带大家深入了解Modbus协议原理及应用。就从今天晚上开始,想要学习的小伙伴,可以来腾讯课堂报名参加,或者私信我,给你报名链接。

相关推荐

Linux ntp时钟同步问题(linux ntp同步命令)

有时候,操作系统会报linux的ntp时钟错误。从时钟源同步时间超时。我查看了一下ntp的时钟源,发现执行ntpq-p显示超时。执行nslookup时钟服务器域名,发现可以正常解析。执行了n...

linux服务器同步利器Rsync全介绍(付脚本)

1、认识Rsync(remotesynchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。Rsync使用所谓的“Rsync算法”来使本地和远程两个主机之间的文件...

如何使用Rsync同步两个网站服务器的内容

本头条号每天坚持更新原创干货技术文章,欢迎关注本头条号"Linux学习教程",公众号名称“Linux入门学习教程"。如需学习视频,请复制以下信息到手机浏览器或电脑浏览器上:zc...

Linux TB级小文件同步备份解决方案

在某些电子档案存储的业务系统下,按照业务场景要求,需要将产生的所有电子影像资料永久存储,并支持备份;因为“钞能力”等原因,一般备份存储只有一个节点(即:一个备份存储服务器);这样就要求研发工程师,不...

CentOS7下使用Lsyncd实现文件实时同步

Lsyncd简单介绍Lsyncd使用文件系统事件接口(inotify或fsevents)来监视本地文件和目录的更改。Lsyncd在几秒钟内将这些文件事件整理核对后,然后生成一个或多个进程以将更...

如何手动同步Linux系统时间并与互联网时间保持同步?

在Linux系统中,正确的时间同步对于许多任务都是至关重要的。一些关键应用程序可能需要准确的时间戳才能正常工作,而一些安全功能也需要确保所有服务器的时间都是准确的。NTP服务可以自动同步系统时间和互...

Linux服务器Rsync定时同步一键化配置指南

1、主从服务器同时安装rsyncopenssh-clientaptupdate&&aptinstall-yrsyncopenssh-client2、主服务器安装好后输入以下命令生成密钥...

Linux系统如何使用NTPDATE命令设置时间同步

简介:咱们在使用Linux系统的时候,常常能发现用了一阵子之后,Linux系统的时间就对不上了。已经知道的情况是,安装Linux的时候选的时区是Asia/Shanghai,可这系统运行了一...

开源的Linux文件同步工具有哪些?(linux 文件夹 同步)

Linux系统之间经常需要文件同步,一个好的文件同步工具省时省力,这里介绍几款开源的Linux文件同步工具1.rsync:rsync是Linux上一个功能强大的命令行工具,可以在不同的服务器之间同...

Linux 系统使用 rsync + inotify 实现文件实时同步

Linux系统使用rsync+inotify实现文件实时同步简介inotify监控文件的变化后通知rsync进行文件的同步#配置免密登录ssh-keygen-trsaca...

Linux 远程数据同步工具详解(linux远程同步命令)

一、简介1认识Rsync(remotesynchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。Rsync使用所谓的“Rsync算法”来使本地和远程两个主机之...

构建基于 Linux 的 NTP 时间同步集群与时间安全防护实战指南

一、为什么时间同步对系统如此重要?在分布式系统、数据库复制、消息队列、审计日志、安全认证(如Kerberos)、容器编排等场景中,系统时间一致性是保障正确性与安全性的基础。一旦服务器间时间漂移,可能...

每日Linux学习:同步备份工具 rsync

rsync是一个用于高效同步文件和目录的工具。它通过仅传输变化的部分(增量传输)来节省时间和带宽,支持本地同步、远程同步(通过SSH),还能保留文件原有权限、时间戳等属性。本文通过几个常用的实例来...

Chromixium OS 1.0发布 基于Ubuntu发行版

Chromixium项目宣布chromixiumOS1发布,一款基于Ubuntu的Linux分支,chromixiumOS试图重新打造一款外观和感觉与ChromeOS相似的完...

iOS8.0.X~iOS8.1完美越狱!盘古团队出品

【巴士速递·移动情报站】最新消息,iOS8.1越狱了!!此次越狱依旧是iOS7时代我国的大神盘古团队带来的,而该次越狱支持最新的iPhone6、iPhone6Plus、iPadAir2和iPad...