嵌入式
返回首页

Modbus协议长啥样呢?Modbus RTU协议有哪些参数?

2024-07-01 来源:elecfans

Modbus 协议可以走串口,可以走网口。

我们就先以Modbus RTU为主,毕竟Modbus RTU用的实在太多了。


其实只要把Modbus RTU掌握了,理解了,其它衍生出来的协议,自然也就理解了。

那Modbus 协议长啥样呢。

我们先来直接看一组数据。

主站发送:01 03 00 14 00 01 C4 0E

从站回复:01 03 02 00 63 F8 6D

好,不管你有没有学过Modbus协议,我们先假装看懂了上面的报文。

我们进入情景中。

现场有一个HMI。

还有一个PLC。

PLC接了100个灯,100个门,100个称。

“谁家PLC会接这么多个灯,接这么多称呀。”

“你管的着么,双十一打折,多买了几个不行呀。”

那灯的数据呢,就只有开还是关。也就是非0即1了。是开关类型。

那称的数据呢,如果单位是克,那可以是0到9999克,比如,这个称只能称到9999克上限。

那HMI通过Modbus协议,理应可以读到100个灯里,任意一个或者连续几个灯的数据。

也可以读一个称或者连续几个称的数据。

也就是报文上,要能把这些表现出来。

比如HMI想读第20个称的数据,只读一个。

那20,也就是十六进制0x14。

读一个,1,也就是0x01 。

我们看一下报文。

01 03 00 14 00 01 C4 0E。

真的有14 这个字节。

但是是00 14 呢还是14 00 还是14 呢。

如果只有一个字节,只能表示0到255。不行,数量太少了,肯定不够。那必须两个字节表示。

所以,0014就是第20个称。也就是我们所说的地址了。

1.jpg

这么乍一看,好像只需要三个字段,就可以表示HMI所需要读的数据了。

确实也是呀。HMI只是想读一个称的数据,没必要发其它不相关的数据的呀。

“HMI可以连接多个PLC嘛,怎么连接?”

“HMI可以通过485,接几个PLC的哦。”

“可是我要怎么知道我要读哪个PLC的数据呢”

“这样吧,我们给不同的PLC起一个编号,也就是站号,这样就可以了。”

“那Modbus协议上,我是不是也带这个站号呢。”

“是的,我们在Modbus上面加个站号就是行了。这样,如果PLC收到的报文,是自己的站号的,就回复,不是自己站号的,就不要回复,就解决了呀。”

“嗯,好办法。那就用第一个字节表示吧。”

1.jpg

这样,一个Modbus RTU协议,就此诞生了。

我们再回过头来总结看一下,这个modbus 协议,大概就五个参数。

1.jpg

我们每个字段开始聊一下。

第一个字段,就是站号。

主设备是没有站号的。只有从设备有站号。

为什么主设备没有站号呢。

主要是因为在一个modbus 通信里,有且只能有一个主站。只有主站才能主动发报文,从设备接到报文再判断是否要回复。

那从设备是否只能一个呢。

如果是接到485总线上面,从站就可以有多个了。一般建议不超过32个。这个梗下期会聊的。

主设备要访问哪个设备的时候呢,就根据站号来区分了。

不过,有时候呢,如果需要同时操作多个从设备,比如,想让10个从设备同时开灯,怎么做比较合适呢。

逐个发送写请求,那效率就有点慢了。

于是就有广播站号的概念了。站号0代表广播站号,当主站对站号0进行写操作的时候,所有的从设备收到命令之后,一般只执行,不回复。

第二个字段,是功能码。

这个功能码呢,我们换一个角度去讲解。

我们回归到协议本身,这个协议主要就是用于通信,采集和控制的。那采集什么数据呢。

就是位变量和数值变量。有只读的,可读可写的。

1.jpg

其实到这里,我们基本就把modbus协议掌握了。

modbus ascii和modbus tcp 也离不了这几个参数。

一般来说新手只要了解到这里,基本可以了。modbus 就算是入门了。

至于是要继续还是从入门到放弃,就看缘分了。

笔者从事物联网以来,接触的设备支持modbus的,不在少数。可以说,99%就只用到前面介绍的内容,真的不能更多了。

所以,本文就不再深入讲解modbus rtu更多的功能码和内容了。

国内外常见的PLC,还有各种单片机做出来的控制器,基本也就围绕0X,1X,4X,3X功能码的这几个功能码。

所以当你网上搜索出来各种中英文介绍Modbus 协议,讲一大堆,不知道哪些要看,哪些不要看。笔者的经验告诉我,不需要全都了解。

我们先看看读的。

1.jpg

位寄存器比较特殊,8个位占一个字节。在Modbus回复的数据里,并不是用一个字节表示一个位寄存器。而是用一个位,表示一个位寄存器。

这样读20个寄存器,就需要3个字节了。

这样从站回复的数据就是FF FF 0F了。

也就是从站是至少一个字节起回复,不够一个字节的位,按一个字节回复。

大概的公式就是 位寄存器个数/8 得到字节个数,然后再看是否整除,如果不整除,有余数,则再补一个寄存器。

20/8=2,然后有余数,余数是4。所以是三个字节。最后一个字节,只取低4位有效。

4.[功能码02]读1X寄存器,地址10,读16个寄存器

1.jpg

2.jpg

总结起来,Modbus协议,也就常见8种功能码。由于多写可以兼容单写,甚至有的控制器,直接去掉单写命令,用多写实现,这样就只有6种功能码了。


进入嵌入式查看更多内容>>
相关视频
  • PX4固件二次开发课程

  • RISC-V嵌入式系统开发

  • NuttX Workshop 2024

  • 自己动手写操作系统

  • SOC系统级芯片设计实验

  • 自己动手做一台计算机

精选电路图
  • 用数字电路CD4069制作的万能遥控轻触开关

  • 红外线探测报警器

  • 短波AM发射器电路设计图

  • RS-485基础知识:处理空闲总线条件的两种常见方法

  • 带有短路保护系统的5V直流稳压电源电路图

  • 基于ICL296的大电流开关稳压器电源电路

    相关电子头条文章