10.4.2 Modbus寄存器(存储区)
Modbus协议中的一个重要概念是寄存器,所有数据均存放于寄存器。最初,Modbus协议借鉴了PLC中寄存器的含义,但是随着Modbus协议的广泛应用,寄存器的概念进一步泛化,它不再是指具体的物理寄存器,也可能是指一块内存区域Modbus寄存器根据存放的数据类型以及各自的读写特性将寄存器分为四部分,这四部分既可以连续,也可以不连续,由开发者决定。寄存器意义如下表所示:
Modbus寄存器(存储区)
寄存器 种类 | 说明 | 与PLC 类比 | 举例 说明 |
线圈状态 (Coil Status) | 输出端口。可设定端口输出状态,也可以读取该位的输出状态。可分为两种不同的执行状态,列如保持型或边沿触发型。 | DO (数字量输出) | 电磁阀输出、 MOSFEF输出、LED显示等 |
离散输入 状态 (Input Status) | 输入端口。通过外部设定改变输入状态,可读但不可以写。 | DI (数字量输入) | 拨码开关、接近开关等 |
保持寄存器 (Holding Register) | 输出参数或保持参数,控制器运行时被设定的某些参数,可读可写。 | AO (模拟量输出) | 模拟量输出设定 值,PID运行参数,变量阀输出大小,传感器报警上限下限 |
输入寄存器 | 输入参数。控制器运行时从外部设备获得的参数,但可读不可写。 | AI (模拟量输入) | 模拟量输入 |
(PLC)数据的传输离不开存储和读写操作,为了更好存储不同的数据类型,我们可以理解Modbus会将布尔和非布尔的数据分开存储。
1
存储区类型
我们可以将存储区类型分为布尔类型和非布尔类型,布尔类型我们用线圈(Coil)表示,非布尔用寄存器(Register)表示。
什么是布尔?
①布尔类型只有两个值,false和true。
②通常用来判断条件是否成立。
③C语言语法规定,如果变量值为0就是false,否则为true,布尔变量只有这两个值。
因此,我们便有了线圈和寄存器的概念。
那线圈和寄存器又是什么?
①线圈:从电气角度来看,在电气控制回路中,一般都是靠接触器或中间继电器来实现控制,接触器或中继最终靠的是线圈的得电和失电来控制触点闭合和断开,因此用线圈表示布尔量。
②寄存器:用来暂时存放参与运算的数据和运算结果,具有接收数据、存放数据和输出数据的功能。断开,因此用线圈表示布尔量。
③而寄存器在计算机中,就是用来存储数据的,因此非布尔的数据放在寄存器里。
回到存储区分类,目的就是:更好地存储和区分不同的数据类型。
Modbus的线圈和寄存器应该也按照只读、读写来进一步划分,因此这就形成了Modbus的存储区,如下表所示:
Modbus存储区类型及名称
序号 | 读写 | 存储类型 | 存储区名称 |
1 | 只读 | 线圈 | 输入线圈 |
2 | 读写 | 线圈 | 输出线圈 |
3 | 只读 | 寄存器 | 输入寄存器 |
4 | 读写 | 寄存器 | 保持寄存器 |
存储区代号
为什么需要存储区代号?上面表格里的存储区名称是一个全称,开发和使用中使用全称会比较麻烦,因此需要给他们取个别名。所以Modbus也要给这些存储区取一个代号,直接用数字表示,于是,就有了下面的规定:
存储区名称 | 存储区代号 |
输入线圈 | 1区 |
输出线圈 | 0区 |
输入寄存器 | 3区 |
保持寄存器 | 4区 |
存储区代号其实可以简单理解为我们的名字,例如我们的名字有全名和小名,全名是正式场合外人叫的,小名是我们亲近的人日常场合叫的。这么一说就理解有存储区代号的原因了。
存储区范围:
①无论是什么存储区,都会有一个范围的限制;Modbus的每个存储区也规定了一个范围,不能无限制使用。
②Modbus规定每个存储区的最大范围是65536,也就是0~65535。
2
协议地址模型
PLC地址是我们常见的,但它是怎么组成的的,它是由存储区代号+地址组成,我们把这样的地址称为绝对地址,把后面的地址成为相对地址;而我们的Modbus地址跟PLC地址也是类似的。
Modbus地址公式:存储区代号+(地址+1)如下表所示:
Modbus长地址模型
存储区名称 | 存储区代号 | 绝对值范围 | 相对值范围 |
输入线圈 | 1区 | 100001~165536 | 0~65535 |
输出线圈 | 0区 | 000001~065536 | 0~65535 |
输入寄存器 | 3区 | 300001~365536 | 0~65535 |
保持寄存器 | 4区 | 400001~465536 | 0~65535 |
Modbus地址分为长地址模型和短地址模型,上面Modbus长地址模型,但是在实际使用中,我们一般用不了这么多地址,一般情况下,10000以内就已经足够使用了;因此,为了方便我们就有了另一种短的地址模型,如下图所示:
Modbus短地址模型
存储区名称 | 存储区代号 | 绝对值范围 | 相对值范围 |
输入线圈 | 1区 | 10001~19999 | 0~9998 |
输出线圈 | 0区 | 00001~09999 | 0~9998 |
输入寄存器 | 3区 | 30001~39999 | 0~9998 |
保持寄存器 | 4区 | 40001~49999 | 0~9998 |
如您在使用瑞萨MCU/MPU产品中有任何问题,可识别下方二维码或复制网址到浏览器中打开,进入瑞萨技术论坛寻找答案或获取在线技术支持。
https://community-ja.renesas.com/zh/forums-groups/mcu-mpu/
未完待续
推荐阅读
头文件、库文件与Makefile配置要点 - RZ MPU工业控制教程连载(22)
学习Modbus的快速方法 - RZ MPU工业控制教程连载(23)
初识Modbus - RZ MPU工业控制教程连载(24)