四种寄存器说明
线圈状态(coil status) 输出端口 对应PLC DO(数字输出)如电磁阀,MOSFET输出
离散输入状态(input status)输入端口 对应PLC DI(数字输入) ,如拨码开关,接近开关
保持寄存器(holding Register)输出参数 对应PLC AO (模拟输出)。
输入寄存器(input Register)输入参数,对应PLC AI(模拟输入)。
图1:
寄存器种类 | 寄存器PLC地址(address) | Modbus协议地址 | 简称 | 读写状态 |
线圈状态 | 00001~09999 | 0000~FFFF (address-1) | 0X | 读写 |
离散输入状态 | 10001~19999 | 0000~FFFF(address-10001) | 1X | 读 |
保持寄存器 | 40001~49999 | 0000~FFFF(address-40001) | 4x | 读写 |
输入寄存器 | 30001~39999 | 0000~FFFF(address-30001) | 3X | 读 |
注意:程序(代码中)实际使用的是0~FFFF的地址,和PLC地址的关系如上图。PLC地址开头0,1,4,3实际表明了操作的是何种寄存器。
Modbus报文主要由四个部分组成。设备地址,功能码,数据域,校验。
功能码
如下图:图2
功能码 | 名称 | 寄存器PLC地址 | 位、子操作 | 操作数量 |
01 | 读线圈 | 见图1,下同 | 位 | 1或多 |
02 | 读离散输入 |
| 位 | 1或多 |
03 | 读保持寄存器 |
| 字 | 1或多 |
04 | 读输入寄存器 |
| 字 | 1多 |
05 | 写单个线圈 |
| 位 | 1 |
06 | 写单个保持寄存器 |
| 字 | 1 |
15 | 写多个线圈 |
| 位 | 多 |
16 | 写多个保持寄存器 |
| 字 | 多 |
软件说明
下面以Modbus Poll 和Modbus Slave为例,说明Modbus协议具体内容。
下载这个两个软件,版本6.X,注册码分别是
slave
5455415451475662master
5A5742575C5D10
对于Slave
F8设置:
1.从机地址
2.设置四种寄存器的一个,配置其开始地址和地址数量。
F3连接设置,默认就好,Modbus master同理。
点击Display ->Commnunications查看通信数据。Master相同。
对于Master
F8配置
1.从机地址
2.图2 中八种功能码中 的一种
3起始地址(已经给出40011对应10这样的例子)。
4数据量。
5扫描频率。
协议格式
读协议
报文格式:
主===> 从
从设备地址,功能码,起始地址,寄存器数量,校验。
从===>主
从设备地址,功能码,数据域字节数,数据域,校验。
说明:起始地址和寄存器数量都是big endian (高字节在前,低字节在后),short类型。
从设备返回的数据域构成:对于位类型,会把每8个位合并成一个byte类型。
对于字类型,N个寄存器会有N*2个字节,按照高字节在前,低字节在后的顺序。
例1:01读线圈状态
slave id为34,寄存器选项为0X,设置起始地址2000,数量20,
具体数据如图所示
Master配置成
读取线圈状态:从设备ID为34,起始地址2000,数量为20的。
通信数据
下行:22 01 07 D0 00 14 3B DB
上行:22 01 03 07 03 03 CA 2D
例2:02读取离散输入状态
读取从设备ID 为1,起始地址为0,数量20个离散输入寄存器
通信数据:
下行:01 02 00 00 00 14 78 05
上行:01 02 03 03 03 03 C8 BF
例3:03读取保持寄存器
从设备id 50,地址60,数量3
通信数据:
下行:32 03 00 3C 00 03 C0 04
上行:32 03 06 0C 8E 00 38 00 29 49 44
例4:04读取输入寄存器
从设备ID 24,起始地址0,数量4
通信数据:
下行:18 04 00 00 00 04 F3 C0
上行:18 04 08 00 0C 00 2D 00 0B 00 2A CE 4A
写协议
报文格式:
单个数据
主===>从:从设备ID,功能码,起始地址,变更数据,校验。
从===>主:从设备ID,功能码,起始地址,变更数据,校验。
多个数据
主===>从:从设备ID,功能码,起始地址,寄存器数量,字节数量,变更数据,校验
从===>主:从设备ID,功能码,起始地址,寄存器数量,校验
起始地址和寄存器数量都是2个字节。
例5:05写单个线圈
设置从设备ID 为24,寄存器地址56,在数据编辑框中写1或者0
通信数据:18 05 00 38 FF 00 0F FE,返回相同。
如果对线圈写0,通信数据变为18 05 00 38 00 00 4E 0E
例6:06写单个保持寄存器
从设备ID,为1,寄存器地址50,写一个数据52
通信数据:01 06 00 32 00 34 29 D2,返回相同。
例7:15写多个线圈
从设备ID为100,寄存器地址50 ,数量20个,写数据如下图
通信数据:
下行:64 0F 00 32 00 14 03 03 07 03 E2 29
上行:64 0F 00 32 00 14 FD FE
例8:16写多个保持寄存器
从设备ID为48,寄存器地址100,数量为4
写入如下数据
通信数据:
下行:30 10 00 64 00 04 08 01 01 00 33 00 17 00 09 93 2B
上行:30 10 00 64 00 04 84 34
异常响应
报文格式:从设备ID,功能码,异常码,校验
返回报文将功能码最高位置为1,
异常码说明:
01 非法功能码
02 非法数据地址
03非法数据值
04从设备故障
参考文档:
https://wenku.baidu.com/view/d233d09feff9aef8941e0698.html