Modbus信息中的所有数据地址均以零作为基准,各项数据的第一个数据地址的编号为0。在图例中,数据区则采用十六进制表示法。此节所提供的例子和图例均用于说明Modbus的查询信息和正常响应。
主机查询是用于读取保持寄存器的状态。当请求从机地址为06,要读取的数据来自地址40108保持寄存器时,需注意寄存器的起始地址为0107 (006BH)。
从机响应返回该功能码,表明了正常响应。字节数“Byle count”中说明了有多少个8位字节被返回,它反映了附在数据区中8位字节的数量。在缓冲响应信息时,字节数的区域值应与数据区中的字节数相等。
Addr
Fun
Data start reg hi
Data start reg lo
Data of regs hi
Data #of regs lo
CRC16 hi
hi
CRC16 lo
lo
06H
03H
00H
6BH
00H
01H
XXH
XXH
图2-X为主机查询Modbus信息的示例。
读取线圈状态(功能码01)查询示例:
查询信息规定了要读取的起始线圈和线圈量。线圈的起始地址为0000H,1至16个线圈的寻址地址分为0000H – 0015H(DO1=0000H,DO2=0001H,依此类推)。此例中,图 2 – 3 的例子是从地址为17的从机读取DO1至DO6的状态。
读取输入状态(功能码02)响应示例:
响应信息中的各输的状态分别对应于数据区中的每一位值,1表示ON,0表示OFF。第一个数据字节的L为查询中的寻址地址,其他输按顺序在该字节中由低位向高位排列直至8个位为止。下一个字节中的8个输入位也是从低位到高位排列。若返回的输入位数不是8的倍数,则在最后的数据字节中的剩余位至字节的最高位全部填0。字节数区说明了全部数据的字节数。
强制单线圈(功能码05)查询与响应示例:
查询信息规定了需要强制一个单独线圈的类型和状态。线圈的强制状态一直有效,直至下一个控制逻辑作用于线圈为止。控制逻辑中无线圈程序时,则线圈处于强制状态。
对于这个命令请求的正常响应是在线圈状态改变之后传送接收到的数据。
预置单寄存器(功能码06)查询与响应示例:
此功能用于将一个值预置到保持寄存器中。查询信息规定了要预置寄存器的类型和地址,以及预置的值。
对于预置单寄存器请求的正常响应是在寄存器值改变之后将接收到的数据传送回去。
通过Modbus协议,我们可以读取中继线圈的异常状态数据。某些线圈号已在不同型号的控制器中预定义,而其他线圈则允许用户编程,作为控制器的状态信息。例如,“machine ON/OFF”、“heads retraced”等。在功能码中,我们提供了存取此类信息的方法。
控制器型号线圈设定
M84型号的控制器,其预定义的线圈号如下:
- 484型号电池状态
- 584型号的特定线圈状态
- 9841-8用户定义
还有其他如258-264用户定义、884 761电池状态、762内存保护状态等。
查询与响应
图示2-15的例子展示了如何查询从机设备17中的不正常状态。正常响应包含8个不正常的线圈状态,每个数据字节对应一个线圈。最低位对应最低的线圈类型状态。
强置多线圈(功能码15)
此功能代码允许按线圈的顺序把各线圈(DO,0X类型)强制成ON或OFF状态。它能够广播,对各从机中相同类型的线圈起强制作用。该功能代码可越过内存保护和线圈的禁止状态,并保持强制状态有效。
预置多寄存器(功能码16)
该功能将数据预置到各寄存器中,用于从机中相同类型的寄存器的预置。它可越过控制器的内存保护,寄存器中的预置值一直保持有效。
报告从机标识(功能码17)
此功能用于返回从机地址控制器的类型、从机的当前状态以及其他说明。不支持广播。正常响应格式中包含数据内容,对应每台控制器的类型。
总结