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个称。也就是我们所说的地址了。
这么乍一看,好像只需要三个字段,就可以表示HMI所需要读的数据了。
确实也是呀。HMI只是想读一个称的数据,没必要发其它不相关的数据的呀。
“HMI可以连接多个PLC嘛,怎么连接?”
“HMI可以通过485,接几个PLC的哦。”
“可是我要怎么知道我要读哪个PLC的数据呢”
“这样吧,我们给不同的PLC起一个编号,也就是站号,这样就可以了。”
“那Modbus协议上,我是不是也带这个站号呢。”
“是的,我们在Modbus上面加个站号就是行了。这样,如果PLC收到的报文,是自己的站号的,就回复,不是自己站号的,就不要回复,就解决了呀。”
“嗯,好办法。那就用第一个字节表示吧。”
这样,一个Modbus RTU协议,就此诞生了。
我们再回过头来总结看一下,这个modbus 协议,大概就五个参数。
我们每个字段开始聊一下。
第一个字段,就是站号。
主设备是没有站号的。只有从设备有站号。
为什么主设备没有站号呢。
主要是因为在一个modbus 通信里,有且只能有一个主站。只有主站才能主动发报文,从设备接到报文再判断是否要回复。
那从设备是否只能一个呢。
如果是接到485总线上面,从站就可以有多个了。一般建议不超过32个。这个梗下期会聊的。
主设备要访问哪个设备的时候呢,就根据站号来区分了。
不过,有时候呢,如果需要同时操作多个从设备,比如,想让10个从设备同时开灯,怎么做比较合适呢。
逐个发送写请求,那效率就有点慢了。
于是就有广播站号的概念了。站号0代表广播站号,当主站对站号0进行写操作的时候,所有的从设备收到命令之后,一般只执行,不回复。
第二个字段,是功能码。
这个功能码呢,我们换一个角度去讲解。
我们回归到协议本身,这个协议主要就是用于通信,采集和控制的。那采集什么数据呢。
就是位变量和数值变量。有只读的,可读可写的。
其实到这里,我们基本就把modbus协议掌握了。
modbus ascii和modbus tcp 也离不了这几个参数。
一般来说新手只要了解到这里,基本可以了。modbus 就算是入门了。
至于是要继续还是从入门到放弃,就看缘分了。
笔者从事物联网以来,接触的设备支持modbus的,不在少数。可以说,99%就只用到前面介绍的内容,真的不能更多了。
所以,本文就不再深入讲解modbus rtu更多的功能码和内容了。
国内外常见的PLC,还有各种单片机做出来的控制器,基本也就围绕0X,1X,4X,3X功能码的这几个功能码。
所以当你网上搜索出来各种中英文介绍Modbus 协议,讲一大堆,不知道哪些要看,哪些不要看。笔者的经验告诉我,不需要全都了解。
我们先看看读的。
位寄存器比较特殊,8个位占一个字节。在Modbus回复的数据里,并不是用一个字节表示一个位寄存器。而是用一个位,表示一个位寄存器。
这样读20个寄存器,就需要3个字节了。
这样从站回复的数据就是FF FF 0F了。
也就是从站是至少一个字节起回复,不够一个字节的位,按一个字节回复。
大概的公式就是 位寄存器个数/8 得到字节个数,然后再看是否整除,如果不整除,有余数,则再补一个寄存器。
20/8=2,然后有余数,余数是4。所以是三个字节。最后一个字节,只取低4位有效。
4.[功能码02]读1X寄存器,地址10,读16个寄存器
总结起来,Modbus协议,也就常见8种功能码。由于多写可以兼容单写,甚至有的控制器,直接去掉单写命令,用多写实现,这样就只有6种功能码了。