目录
一 Modbus寄存器种类说明
1.线圈状态
2.离散输入状态
3.保持寄存器
4.输入寄存器
二 Modbus功能码简述
1.位操作指令
2.字节操作指令
三 Modbus报文
1.读取线圈状态(功能码01)
2.读取输入状态(功能码02)
3.读取保持寄存器(功能码03)
4.读取输入寄存器(功能码04)
5.强制单线圈(功能码05)
6.预置单寄存器(功能码06)
7.读取异常状态(功能码07)
8.强制多线圈(功能码15)
9.预置多寄存器(功能码16)
10.报告从机标识(功能码17)
Modbus是一种主/从通讯模式。主站在Modbus网络上没有地址,从站的地址范围为0-247,其中0为广播地址,从站的实际地址范围为1-247。
一 Modbus寄存器种类说明
1.线圈状态
输出端口,可设定端口的输出状态,也可以读取该位的输出状态;
2.离散输入状态
输入端口,通过外部设定改变输入状态,可读但不可写;
3.保持寄存器
控制器运行时被设定的某些参数,可读可写;
4.输入寄存器
控制器运行时从外部设备获得的某些参数,可读不可写;
二 Modbus功能码简述
功能码可以分为位操作和字节操作,位操作的最小单位是Bit,字节操作的最小单位为2个字节(Byte).
1.位操作指令
读线圈状态01H、读离散输入状态02H、写单个线圈05H、写多个线圈0FH.
对应modscan客户端 遥信:01H、02H;遥控:05H、0FH
2.字节操作指令
读保存寄存器03H、读输入寄存器04H、写单个保存寄存器06H、写多个保存寄存器10H.
对应modscan客户端 遥测:03H、04H;遥调:06H、10H
三 Modbus报文
1.读取线圈状态(功能码01)
读取从机离散量输出口的(ON/OFF)状态,不支持广播。
查询:查询信息规定了要读的起始线圈和线圈量,线圈的起始地址为0000H,1-16个线圈的寻址地址分为0000H-0015H(DO1=0000H,DO2=0001H,以此类推,其他功能码类似)。
例子:从地址为17的从机读取D01至D06的状态。
响应:响应信息中的各线圈的状态与数据区的每一位的值相对应,即每个D0占用一位(1=ON,0=OFF),第一个数据字节的LSB为查询中的寻址地址,其他的线圈按顺序在该字节中由低位向高位排序,直至8个为止,下一个字节也是从低位向高位排列。若返回的线圈数不是8的倍数,则在最后的数据字节中的剩余位至字节的最高位全部填0,字节数区说明全部的字节数。
2.读取输入状态(功能码02)
读取从机离散量输入信号(ON/OFF)的状态,不支持广播。
查询:查询信息规定了要读的输入起始地址,以及输入信号的数量。输入的起始地址为0000H,1-16个输入口的地址分别为0-15(DO1=0000H,DO2=0001H,以此类推)。
例子:从地址为17的从机读取D01至D16的状态。
响应:响应信息中的各输入口的状态,分别对应于数据区中的每一位值,1=ON,0=OFF,第一个数据字节的LSB为查询中的寻址地址,其他输入口按顺序在该字节中由低位向高位排序,直至8个为止,下一个字节中的8个输入位也是从低位向高位排列。若返回的输入位数不是8的倍数,则在最后的数据字节中的剩余位直至字节的最高位全部填0,字节数区说明了全部数据的字节数。
3.读取保持寄存器(功能码03)
读取从机保持寄存器的二进制数据,不支持广播。
查询:查询信息规定了要读的保持寄存器起始地址及保持寄存器的数量,保持寄存器寻址其实地址为0000H,寄存器1-16所对应的地址分别为0000H-0015H。
例子:从17号从机读3个采集到的基本数据U1、U2、U3,U1的地址为0000H,U2的地址为0001H,U3的地址为0002H。
响应:响应信息中的寄存器数据位二进制数据,每个寄存器分别对应2个字节,第一个字节为高位值数据,第二个字节为低位数据。
读取U1、U2、U3(U1=03E8H,U2=03E7H,U3=03E9H)的响应。
4.读取输入寄存器(功能码04)
读取从机输入寄存器中的二进制数据,不支持广播。
查询:查询信息规定了要读的寄存器起始地址及寄存器的数量,寻址起始地址为0,寄存器1-16所对应的地址分别为0000H-0015H。
例子:请求17号从机的0009寄存器。
响应:响应信息中的寄存器为每个寄存器分别对应2个字节,第一个字节为高位数据,第二个字节为低位数据。
5.强制单线圈(功能码05)
强制单个线圈为ON或OFF状态,广播时,该功能可强制所有从机中同一类型的线圈均为ON或OFF状态。
该功能可跨过控制器内存的保护状态和线圈的禁止状态。线圈强制状态一直保持有效直至下一个控制逻辑作用于线圈为止。控制逻辑中无线圈程序时,则线圈处于强制状态。
查询:查询信息规定了需要强制一个单独线圈的类型,线圈的起始地址为0000H,1-16个线圈的寻址地址分为0000H-0015H(DO1=0000H,DO2=0001H,以此类推)。
由查询数据区中的一个常量,规定请求线圈的ON/OFF状态,FF00H值请求线圈处于ON状态,0000H值请求线圈处于OFF状态,其他值对线圈无效,不起作用。
例子:请求17号从机开D01的ON状态。
响应:对这个命令请求的正常响应是在D0状态改变后传送接收到的数据,与设置值相同。
6.预置单寄存器(功能码06)
把一个值预置到一个保持寄存器中,广播时,该功能把值预置到所有从机的相同类型的寄存器中。
该功能可跨过控制器的内存保护。使寄存器中的预置值保持不变。只能由控制器的下一个逻辑信号来处理该预置值。若控制逻辑中无寄存器程序时,则寄存器中的值保持不变。
查询:查询信息规定了要预置寄存器的类型,寄存器寻址起始地址为0000H,寄存器1所对应的地址为0000H。
例子:请求17号从机0040H的值为2177.
响应:对于预置单寄存器请求的正常响应是在寄存器的值改变以后 将接受到的数据传送回去。
7.读取异常状态(功能码07)
读从机中8个不正常状态线圈的数据,某些线圈号已在不同型号的控制器中预定义,而其他的线圈由用户编程,作为有关控制器的状态信息,如“machien ON/OFF”,“heads retraced”,(缩回标题),“safeties satisfied”(安全性满意),“error conditions”(存在错误条件)或其它用户定义的标志等。该功能码不支持广播。
该功能码为存取该类信息提供了一种简单的方法,不正常线圈的类型是已知的(在功能代码中不需要线圈类型)预定义的不正常线圈号如下:
查询:请求读从机设备17中的不正常状态。
响应:正常响应包含8个不正常的线圈状态,为一个数据字节,每个线圈一位。LSB对应为最低线圈类型的状态。
该例子中,线圈数据为6DH(二进制0110,1101),从左到右(最高位至最低位)的线圈状态分别为:OFF-ON-ON-OFF-ON-ON-OFF-ON。若控制器型号为984,这些位表示线圈8至1的状态;若控制器型号为484则表示线圈264至257的状态。
8.强制多线圈(功能码15)
按线圈的顺序把各线圈强制成ON或OFF。广播时,该功能代码可对各从机中相同类型的线圈起强制作用。
该功能代码可跨过内存能保护和线圈的进制状态线圈。保持强制状态有效,并只能由空、感知器的下一个逻辑来处理。若无线圈控制逻辑程序时,线圈将保持强制状态。
查询:查询信息规定了被强制线圈的类型,线圈的起始地址为0000H,1-16个线圈的寻址地址分为0000H-0015H(DO1=0000H,DO2=0001H,以此类推)。
查询数据区规定了被请求线圈的ON/OFF状态,如数据区的某位值为“1”表示请求的响应线圈状态为ON,位值为“0”,则为OFF状态。
例子:请求从机设备17中一组10个线圈为强制状态,起始线圈为20(则寻址地址为19或13H),查询的数据为2个字节,CD01H(二进制1100 1101 0000 0001)响应线圈的二进制位排序如下:
传送的第一个字节CDH对应线圈为27-20,LSB对应线圈20,传送的第二个字节为01H,对应的线圈为29-28,LSB为对应线圈28,其余未使用的位均填“0”。
响应:正常响应返回从机地址,功能码,起始地址以及强制线圈数。
9.预置多寄存器(功能码16)
把数据按顺序预置到各寄存器中,广播时该功能代码可把数据预置到全部从机中的相同类型King的寄存器中。
该功能代码可跨过控制器的内存保护,在寄存器中的预置值一直保持有效,只能由控制器的下一个逻辑来处理寄存器的内容,控制逻辑中无该寄存器程序时,则寄存器中的值保持不变。
查询:查询信息规定了要预置寄存器的类型,寄存器寻址起始地址为0000H,寄存器1所对应的地址为0000H。
例子:请求17号从机0040H的值为178077833.(十六进制为 0A9D 4089)
响应:对于预置单寄存器请求的正常响应是在寄存器值改变以后将接受到的数据传送回去。
10.报告从机标识(功能码17)
返回一个从机地址控制器的类型,从机的当前状态,以及有关从机的其他说明,不支持广播。
查询:请求报告从机设备17的表示ID和状态。
响应:正常响应格式,数据内容对应每台控制器的类型。
从机ID总结数据区第一个字节为Modicon控制器返回的从机ID