我
算了一下,今年是我跟Modbus相识的第10年,从Zui开始的简单应用到协议了解,从协议开发到协议讲解,这个陪伴了10年的协议,它一直没变,变的只是我对它的理解和认识。
我一直认为Modbus协议的存在有它的历史意义,也就是说即使没有Modbus,也可能会出一个ABUS、DBUS之类的协议,因为控制器与控制器之间通信,一个标准协议,会大大提供开发效率。
因此,现在国产的各种品牌PLC,比如台达、汇川、信捷等,这些PLC都是支持Modbus协议,也就是说,学会了Modbus协议,我们可以很轻松与这些PLC实现数据通信。
文章有点长,感谢大家耐心阅读,文末有福利!
Modbus协议能够成为工业领域应用Zui广泛的协议,它必须具备以下几个特点:
1、免费:这个是Zui大的前提,任何产品都是一样,只有通过免费才能获取到前期Zui大的使用量。
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区可能Zui大到8192,三菱的X区Zui大到2048,Modbus的每个存储区也应该规定一个范围,不能无限制使用。
Modbus是这么规定的,每个存储区的Zui大范围是65536,这个范围是很大的。
我们再以三菱的X区为例,如果Zui大范围是2048,那么意味着我们只能访问X0-X2047这些地址,我们这里说的X0、X2047,就是我们常说的PLC地址,那么这个地址是怎么组成的呢?它是由存储区编号加上一个地址索引组成,我们把这样的PLC地址,理解为juedui地址,后面的地址索引,理解为相对地址。
那么对于Modbus来说,我们的juedui地址和相对地址是怎么样的呢?
我们仍然遵从公式:juedui地址=区号+相对地址。
但是也会有一些不一样的地方,以保持型寄存器为例,第一个juedui地址是400001,这个地方不是400000,这个是由Modbus规约决定的,其它存储区也是类似的。
因此,Modbus存储区范围如下图所示:
正如上文所说,65536这个范围是很大的,但在实际使用中,我们一般用不了这么多地址,一般情况下,10000以内就已经足够我们使用了,因此,为了方便起见,我们有一种短的地址模型,如下图所示: