声明:该资源从安富莱论坛摘录
1.Modbus简介——来自维基百科Modbus是一种串行通信协议,是Modicon于1979年,为使用可编程逻辑控制器(PLC)而发表的。MODBUS是工业领域通信协议的业界标准,并且现在是工业电子设备之间相当常用的连接方式。Modbus比其他通信协议使用的更广泛的主要原因有:1.公开发表并且无版税要求2.相对容易的工业网络部署3.对供应商来说,修改移动原生的位元或字节没有很多限制
2.MODBUS指令说明
2.1 读线圈寄存器01H
1) 描述:
读MODBUS从机线圈寄存器当前状态。
2) 查询:
例如从机地址为0x11,线圈寄存器的起始地址为0x0013,结束地址为0x0037。该次查询总共访问(0x0037-0x0013 + 1)37个线圈寄存器。
表2.1.1 读线圈寄存器-查询 Hex从机地址(1个字节)11功能码(1个字节)01寄存器起始地址高字节(1个字节)00寄存器起始地址低字节(1个字节)13寄存器数量高字节(1个字节)00寄存器数量低字节(1个字节)25CRC校验高字节(1个字节)0ECRC校验低字节(1个字节)843) 响应
响应负载中的各线圈状态与数据内容每位相对应。1代表ON,0代表OFF。若返回的线圈数不为8的倍数,则在最后数据字节未尾使用0代替。
表2.1.2 读线圈寄存器-响应 Hex从机地址(1个字节)11功能码(1个字节)01返回字节数(1个字节)05数据1(线圈0x001A - 线圈0x0013)(1个字节)CD数据2(线圈0x0022 - 线圈0x001B)(1个字节)6B数据3(线圈0x002A - 线圈0x0023)(1个字节)B2数据4(线圈0x0032 - 线圈0x002B)(1个字节)0E数据5(线圈0x0037 - 线圈0x0033)(1个字节)1BCRC校验高字节(1个字节)45CRC校验低字节(1个字节)E6线圈0x0013到线圈0x001A的状态为0xCD,二进制值为11001101,该字节的最高字节为线圈0x001A,最低字节为线圈0x0013。线圈0x001A到线圈0x0013的状态分别为ON-ON-OFF-OFF-ON-ON-OFF-ON。
表2.1.3 线圈0x0013到0x001A状态 0x001A0x00190x00180x00170x00160x00150x00140x0013ONONOFFOFFONONOFFON最后一个数据字节中,线圈0x0033到线圈0x0037状态为0x1B(二进制00011011),线圈0x0037是左数第4位,线圈0x0033为该字节的最低字节,线圈0x0037至线圈0x0033的状态分别为ON-ON-OFF-ON-ON,剩余3位使用0填充。
表2.1.4 线圈0x0033到线圈0x0037状态 0x003A0x00390x00380x00370x00360x00350x00340x0033填充填充填充ONONOFFONON
2.2 读离散输入寄存器 02H
1) 说明
读离散输入寄存器状态。
2) 查询
从机地址为0x11。离散输入寄存器的起始地址为0x00C4,结束寄存器地址为0x00D9。总共访问(0x00D9-0x00C4+1)22个离散输入寄存器。
表 2.2.1 读离散输入寄存器——查询 Hex从机地址(1个字节)11功能码(1个字节)02寄存器地址高字节(1个字节)00寄存器地址低字节(1个字节)C4寄存器数量高字节(1个字节)00寄存器数量低字节(1个字节)16CRC校验高字节(1个字节)BACRC校验低字节(1个字节)A93) 响应
响应各离散输入寄存器状态,分别对应数据区中的每位值,1 代表ON;0 代表OFF。第一个数据字节的LSB(最低字节)为查询的寻址地址,其他输入口按顺序在该字节中由低字节向高字节排列,直到填充满8位。下一个字节中的8个输入位也是从低字节到高字节排列。若返回的输入位数不是8的倍数,则在最后的数据字节中的剩余位至该字节的最高位使用0填充。
表2.2.1 读输入寄存器-响应 Hex从机地址(1个字节)11功能码(1个字节)02返回字节数(1个字节)03数据1(0x00CB - 0x00C4)(1个字节)AC数据1(0x00D3 - 0x00CC)(1个字节)DB数据1(0x00D9 - 0x00D4)(1个字节)35CRC校验高字节(1个字节)20CRC校验低字节(1个字节)18离散输入寄存器0x00D4到0x00D9的状态为0x35 (二进制00110101)。输入寄存器0x00D9为左数第3位,输入寄存器0x00D4为最低位,输入寄存器0x00D9到0x00D4的状态分别为ON-ON-OFF-ON-OFF-ON。0x00DB寄存器和0x00DA寄存器被0填充。
表2.2.2 离散输入寄存器0x00C4到0x00DB状态 0x00CB0x00CA0x00C90x00C80x00C70x00C60x00C50x00C4001101010x00D30x00D20x00D10x00D00x00CF0x00CE0x00CD0x00CC111010110x00DB0x00DA0x00D90x00D80x00D70x00D60x00D50x00D4填充填充1101012.3 读保持寄存器 03H1) 说明读保持寄存器。可读取单个或多个保持寄存器。2) 查询从机地址为0x11。保持寄存器的起始地址为0x006B,结束地址为0x006D。该次查询总共访问(0x006D-0x006B+1)3个保持寄存器。
表2.3.1 读保持寄存器-查询 Hex从机地址(1个字节)11功能码(1个字节)03寄存器地址高字节(1个字节)00寄存器地址低字节(1个字节)6B寄存器数量高字节(1个字节)00寄存器数量低字节(1个字节)03CRC高字节(1个字节)76CRC低字节(1个字节)873) 响应保持寄存器的长度为2个字节。对于单个保持寄存器而言,寄存器高字节数据先被传输,低字节数据后被传输。保持寄存器之间,低地址寄存器先被传输,高地址寄存器后被传输。
表2.3.2 读保持寄存器-响应 Hex从机地址(1个字节)11功能码(1个字节)03字节数(1个字节)06数据1高字节(0x006B)(1个字节)00数据1低字节(0x006B)(1个字节)6B数据2高字节(0x006C)(1个字节)00数据2低字节(0x006C)(1个字节)13数据3高字节(0x006D)(1个字节)00数据3低字节(0x006D)(1个字节)00CRC高字节(1个字节)38CRC低字节(1个字节)B9 表2.3.3保持寄存器0x006B到0x006D结果0x006B
高字节
0x006B
低字节
0x006C
高字节
0x006C
低字节
0x006D
高字节
0x006D
低字节
006B001300002.4 读输入寄存器 04H
1) 说明读输入寄存器命令。该命令支持单个寄存器访问也支持多个寄存器访问。2) 查询从机地址为0x11。输入寄存器的起始地址为0x0008,寄存器的结束地址为0x0009。本次访问访问2个读入寄存器。
表2.4.1 读输入寄存器-查询 Hex从机地址(1个字节)11功能码(1个字节)04寄存器起始地址高字节(1个字节)00寄存器起始地址低字节(1个字节)08寄存器数量高字节(1个字节)00寄存器数量低字节(1个字节)02CRC高字节(1个字节)F2CRC低字节(1个字节)993) 响应 输入寄存器长度为2个字节。对于单个输入寄存器而言,寄存器高字节数据先被传输,低字节数据后被传输。输入寄存器之间,低地址寄存器先被传输,高地址寄存器后被传输。
表2.4.2 读寄存器-响应 Hex从机地址(1个字节)11功能码(1个字节)04字节数(1个字节)04数据1高字节(0x0008)(1个字节)00数据1低字节(0x0008)(1个字节)0A数据2高字节(0x0009)(1个字节)00数据2低字节(0x0009)(1个字节)0BCRC高字节(1个字节)8BCRC低字节(1个字节)80 表2.4.3输入寄存器0x0008到0x0009结果0x0008
高字节
0x0008
低字节
0x0009
高字节
0x0009
低字节
0x000x0A0x000x0B2.5 写单个线圈寄存器 05H1) 说明写单个线圈寄存器。0xFF00值请求线圈处于ON状态,0x0000值请求线圈处于OFF状态。0x05指令设置单个线圈的状态,0x15指令可以设置多个线圈的状态,两个指令虽然都设定线圈的ON/OFF状态,但是ON/OFF的表达方式却不同。2) 查询从机地址为0x11,线圈寄存器的地址为0x00AC。使0x00AC线圈处于ON状态,即数据内容为0xFF00。
表2.5.1 写单个线圈-查询 Hex从机地址(1个字节)11功能码(1个字节)05寄存器地址高字节(1个字节)00寄存器地址低字节(1个字节)AC数据1高字节(1个字节)FF数据1低字节(1个字节)00CRC校验高字节(1个字节)4ECRC校验低字节(1个字节)8B
3) 响应
2.5.1强制单个线圈——响应 Hex从机地址(1个字节)11功能码(1个字节)05寄存器地址高字节(1个字节)00寄存器地址低字节(1个字节)AC寄存器1高字节(1个字节)FF寄存器1低字节(1个字节)00CRC校验高字节(1个字节)4ECRC校验低字节(1个字节)8B2.6 写单个保持寄存器 06H1) 说明写保持寄存器。注意0x06指令只能操作单个保持寄存器,0x16指令可以设置单个或多个保持寄存器。2) 查询从机地址为0x11。保持寄存器地址为0x0001。寄存器内容为0x0003。
表2.6.1 写单个保持寄存器——查询 Hex从机地址(1个字节)11功能码(1个字节)06寄存器地址高字节(1个字节)00寄存器地址低字节(1个字节)01数据1高字节(1个字节)00数据1低字节(1个字节)01CRC校验高字节(1个字节)9ACRC校验低字节(1个字节)9B3) 响应
表2.6.2 写单个保持寄存器——响应 Hex从机地址(1个字节)11功能码(1个字节)06寄存器地址高字节(1个字节)00寄存器地址低字节(1个字节)01寄存器数量高字节(1个字节)00寄存器数量低字节(1个字节)01CRC校验高字节(1个字节)1BCRC校验低字节(1个字节)5A2.7 写多个线圈寄存器 0FH1) 说明写多个线圈寄存器。若数据区的某位值为“1”表示被请求的相应线圈状态为ON,若某位值为“0”,则为状态为OFF。2) 查询从机地址为0x11,线圈寄存器的起始地址为0x0013,线圈寄存器的结束地址为0x001C。总共访问(0x001C-0x0013+1)10个寄存器。寄存器内容如下表所示。
表2.7.1 线圈寄存器0013H到001CH 0x001A0x00190x00180x00170x00160x00150x00140x0013110011010x00220x00210x00200x001F0x001E0x001D0x001C0x001B00000001传输的第一个字节0xCD对应线圈为0x0013到0x001A,LSB(最低位)对应线圈0x0013,传输第二个字节为 0x01,对应的线圈为0x001B到0x001C,LSB对应线圈0x001C,其余未使用位使用0填充。
表2.7.1 写多个线圈寄存器——查询 Hex从机地址(1个字节)11功能码(1个字节)0F寄存器地址高字节(1个字节)00寄存器地址低字节(1个字节)13寄存器数量高字节(1个字节)00寄存器数量低字节(1个字节)0A字节数(1个字节)02数据1(0x0013 - 0x001A)(1个字节)CD数据2(0x001B - 0x001C)(1个字节)01CRC校验高字节(1个字节)BFCRC校验低字节(1个字节)0B3) 响应
表2.7.1 写多个线圈寄存器——响应 Hex从机地址(1个字节)11功能码(1个字节)0F寄存器地址高字节(1个字节)00寄存器地址低字节(1个字节)13寄存器数量高字节(1个字节)00寄存器数量低字节(1个字节)0A字节数(1个字节)02CRC校验高字节(1个字节)99CRC校验低字节(1个字节)1B2.8 写多个保持寄存器10H1) 说明写多个保持寄存器。2) 查询从机地址为0x11。保持寄存器的起始地址为0x0001,寄存器的结束地址为0x0002。总共访问(0x0002-0x0001+1)2个寄存器。保持寄存器0x0001的内容为0x000A,保持寄存器0x0002的内容为0x0102。
表2.8.1 写多个保持寄存器——请求 Hex从机地址(1个字节)11功能码(1个字节)10寄存器起始地址高字节(1个字节)00寄存器起始地址低字节(1个字节)01寄存器数量高字节(1个字节)00寄存器数量低字节(1个字节)02字节数(1个字节)04数据1高字节(1个字节)00数据1低字节(1个字节)0A数据2高字节(1个字节)01数据2低字节(1个字节)02CRC校验高字节(1个字节)C6CRC校验低字节(1个字节)F0 表2.8.2保持寄存器0x0001到0x0002内容 地址0x0001
高字节
0x0001
低字节
0x0002
高字节
0x0002
低字节
数值0x000x0A0x010x023) 响应
表2.8.3 写多个保持寄存器——响应 Hex从机地址(1个字节)11功能码(1个字节)10寄存器起始地址高字节(1个字节)00寄存器起始地址低字节(1个字节)01寄存器数量高字节(1个字节)00寄存器数量低字节(1个字节)02CRC校验高字节(1个字节)12CRC校验低字节(1个字节)98