线圈和寄存器
前面介绍 Modbus 的内容中多次提到线圈(coil)和寄存器(register)的概念,尤其是 Modbus 功能码 中,操作的对象基本上都是线圈和寄存器。
在 Modbus 协议中之所以仍然称为线圈和寄存器,完全是历史原因。在 PLC 应用领域,一个线圈就代表一个 PLC 输出点,也称为输出继电器。通过控制线圈导通与否来改变继电器输出状态,实现弱电控制强电。
![Modbus 寄存器插图1 Modbus 寄存器插图1](https://www.modbus.cn/wp-content/themes/module2/themer/assets/images/lazy.png)
但实际上,在如今的 Modbus 设备中,它们都只是对应一块内存区域而已。其中,线圈代表位操作(bit),表示一个布尔变量;寄存器代表字操作(word),表示一个整型变量(当然也可以通过多个字的组合,表示浮点数以及其他复合数据结构)。在 Modbus 协议中,字(word)的长度是 16 位,即 2 个字节。
寄存器种类说明
在 Modbus 协议中,所有数据均存放于寄存器中。根据存放的数据类型以及各自读写特性,可以将寄存器分为四个部分,这四个部分可以连续也可以不连续,完全由开发者决定。
下表展示了四类寄存器的含义以及与 PLC 的类比。
寄存器种类 | 含义 | PLC | 示例 |
---|---|---|---|
线圈状态 (Coil Status) | 输出端口(可读可写) | DO(数字量输出) | 电磁阀输出、LED 显示 |
离散输入状态 (Input Status) | 输入端口(只读) | DI(数字量输入) | 拨码开关、微动开关 |
保持寄存器 (Holding Register) | 输出参数(可读可写) | AO(模拟量输出) | PID 运行参数、阈值上下限 |
输入寄存器 (Input Register) | 输入参数(只读) | AI(模拟量输入) | 传感器数据输入 |
寄存器地址分配
Modbus 寄存器地址分配如下表所示,同样参照了 PLC 寄存器地址的分配方法。
寄存器种类 | 寄存器PLC地址 | 寄存器Modbus协议地址 | 简称 |
---|---|---|---|
线圈状态 | 00001~09999 | 0000H~FFFFH | 0x |
离散输入状态 | 10001~19999 | 0000H~FFFFH | 1x |
保持寄存器 | 40001~49999 | 0000H~FFFFH | 4x |
输入寄存器 | 30001~39999 | 0000H~FFFFH | 3x |
该表中的 PLC 地址可以理解为 Modbus 协议地址的变种,在触摸屏和 PLC 编程中应用较为广泛。
- 寄存器 PLC 地址指存放于控制器中的地址,这些控制器可以是 PLC,也可以是触摸屏,或者文本显示器。PLC 地址一般采用十进制描述,共有 5 位,其中第一位数字代表寄存器类型。
- 寄存器 Modbus 协议地址指的是通信时使用的寄存器寻址地址,例如 PLC 地址 40001 对应寻址地址 0x0000,40002 对应寻址地址 0x0001。寄存器寻址地址一般使用十六进制描述。
细心的你会发现,PLC 寄存器地址 40003 对应的协议地址是 0x0002,PLC 寄存器地址 30003 对应的协议地址也是 0x0002,虽然通信时使用两个相同的 Modbus 协议地址,但是因为不同寄存器的功能码是不相同的,因此并不存在访问冲突。