读线圈状态
读取从设备的线圈或离散量输出状态,即DO(Discrete Output,离散输出)
请求码:01
地址范围:00000~00016
报文如下:Tx:006700-44 D4 00 00 00 06 01 01 00 00 00 11
从起始地址0000开始读取17个线圈的状态
44 D4:标识传输标识
00 00:协议标识
00 06:长度标识
01:单位标识(从站标识)
01:功能码
00 00:起始地址
00 11:线圈数量
响应报文:Rx:006701-44 D4 00 00 00 06 01 01 03 AB 92 00
如果查询正确且成功,响应中功能码与请求中功能码相同,否则功能码+0x80返回。其中03代表长度,后面三个字节,将AB 92 00转成2进制为:
101010111001001000000000
响应报文中每个线圈占用一个bit,一个寄存器占16位两个字节长度,即一个字节表示8个线圈的状态,1=on,0=off。Modbus使用低位保存在高位地址的方式,所以AB 92 00应转换为:110101010100100100000000
读取离散量输入值
读取离散输入DI(Discrete Input)的on/off状态,可读取的1-2000个连续的离散输入量状态。
请求码:02
请求报文:Tx:006706-55 07 00 00 00 06 01 02 00 00 00 11
响应报文:001-Rx:00 01 00 00 00 06 01 02 03 AB 92 00
查询某个线圈的状态,例如:查询地址为00009线圈的状态00 01 00 00 00 06 01 02 00 09 00 01;
响应:003-Rx:00 01 00 00 00 04 01 02 01 01
读取保持寄存器值
读取保持寄存器的内容。寄存器数量占两个字节,取值范围0x0001~0x007D(125)最多读取连续125个寄存器的内容。Modbus的保持寄存器和输入寄存器以字为单位。
请求码:03
请求报文:000-Tx:00 01 00 00 00 06 01 03 00 00 00 11,读取17个寄存器的数值
响应报文:001-Rx:00 01 00 00 00 25 01 03 22 00 0F 00 0E 00 0D 00 0C 00 0B 00 0A 00 09 00 08 00 07 00 06 00 05 00 04 00 03 00 02 00 01 00 01 00 02
其中功能码后面的数字代表返回的位数0x22 = 34个字节,共34/2=17个寄存器,每个寄存器的值由两个字标识。
读取输入寄存器值
读取从设备输入寄存器的内容。
请求码:04
请求报文:010-Tx:00 01 00 00 00 06 01 04 00 00 00 11,读取17个寄存器的值。
响应:011-Rx:00 01 00 00 00 25 01 04 22 00 DF 12 23 34 56 1F 43 00 11 11 22 33 44 55 66 77 88 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
响应报文中的字段含义同上。
写单个线圈
用于将单个线圈寄存器(或离散输入)设置为ON或则OFF状态,支持广播模式。在广播模式下所有从站设备的同一地址的值将被统一修改。
请求码:05
请求报文:080-Tx:00 01 00 00 00 06 01 05 00 09 FF 00 ,起始地址由两个字节构成;目标数据也由两个字节构成,只能取值:0xFF00或0x0000
响应报文:081-Rx:00 01 00 00 00 06 01 05 00 09 FF 00(如果设置成功,响应报文与查询报文相同)
写单个保持寄存器
更新从设备的单个保持寄存器的值,支持广播模式。
请求码:06
请求报文:008-Tx:00 01 00 00 00 06 01 06 00 09 09 03,将地址为00009的寄存器设置为09 03。
响应报文:设置成功后,响应报文和请求报文内容相同。例如:
写多个线圈
将连续的多个线圈或离散输出设置为on/off状态。支持广播模式。起始地址两个字节,寄存器数量由两个字节构成。
请求码:15(0x0F)
测试内容:设置从00005开始到00016的状态如下(使用大端字符序存储)
由于一共12位,所以需要2个字节16位存储,起始地址从00005开始计算,所以二进制表示为10101011 00000111,十六进制为AB 07。
请求报文:017-Tx:00 01 00 00 00 09 01 0F 00 05 00 0C 02 AB 07
0F:请求码,一个字节
00 05:寄存器起始地址,2个字节
00 0C:寄存器个数,2个字节
02:后续字节数
AB 07:具体设置的状态值。
响应报文:018-Rx:00 01 00 00 00 06 01 0F 00 05 00 0C(如果设置成功,响应报文包括请求码,起始地址和寄存器个数)
写多个保持寄存器
用于设置或写入从设备保持寄存器的多个连续的地址快(1123),支持广播模式。起始地址由2个字节;寄存器数量2个字节,取值范围0x00010x007B。
请求码:10
测试内容:测试地址从00010开始到00016结束。设置00010~00016地址范围内寄存器的值如下
请求报文:033-Tx:00 01 00 00 00 13 01 10 00 0A 00 06 0C 00 0A 00 0B 00 0C 00 0D 00 0E 00 0F
00 13:后续字节长度(换算为十进制19)
01:单位标识
10:请求码
00 0A:寄存器起始地址
00 06:写入寄存器数量
0C:后续字节长度
响应报文:034-Rx:00 01 00 00 00 06 01 10 00 0A 00 06(设置成功后响应报文中包含功能码,起始地址,寄存器个数)
掩码写入寄存器
使用AND掩码和OR掩码更新指定寄存器的内容。可以用来设置或者清除寄存器中各个位。
请求码:22(0x16)
请求报文:Tx:000176-2D 79 00 00 00 08 01 16 00 00 F9 5A FF AA
16:请求码
00 00:寄存器地址
F9 5A:and掩码
FF AA:or 掩码
通过and和or的计算公式:
Result = (Current Contents AND And_Mask) OR (Or_Mask AND (NOT And_Mask))
响应报文:001-Rx:00 01 00 00 00 08 01 16 00 00 F9 5A FF AA(设置成功后响应报文中包含功能码,寄存器地址,and掩码和or掩码)
读写多个寄存器
将读和写功能放在同一个modbus会话里。
请求码:23(0x17)
请求报文:Tx:000190-35 2B 00 00 00 1B 01 17 00 00 00 08 00 00 00 08 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
17:功能码
00 00:读寄存器的起始地址,占2字节
00 08:读寄存器的个数,占2字节
00 00:写寄存器的起始地址,占2字节
00 08:写寄存器的个数,占2字节
10:后续字节,1个字节
00 00 00 00 00 00…:从起始地址开始每个寄存器设置的值,占2字节。
响应报文:001-Rx:00 01 00 00 00 13 01 17 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00(设置成功后响应报文中包含功能码,后续字节数,每个寄存器的值。)