1:通讯过程
- :主站设备主动向从站设备发送请求。
- :从站设备处理主站的请求后,向从站返回结果。
- :如果从站设备请求出现异常,则向主站设备返回异常功能码。
2:数据传输方式
- :线圈(Coile)操作单元为1位字的开关量,PLC的输出位,在Modbus中可读可写。
- :离散量(discreteinputs)操作单位为1位字的开关量,PLC的输入位,在Modbus中只读。
- :输入寄存器(input Registers)操作单位为16位字(两个字节)数据,PLC中只能从模拟量输入端改变的寄存器,在Modbus中只读。
- :保存寄存器(holdingRegisters)操作单位为16位字(两个字节)数据,PLC中只能从模拟量输出端改变的寄存器,在Modbus中可读可写。
3:Modbus_Tcp报文结构
modbus-tcp的报文由MBAP+PDU组成
1):MBAP报文头
MBAP报文头的组成为:
域 | 长度 | 描述 |
事务元标识符 | 2 个字节 | MODBUS 请求/响应事务处理的识别码,主要用于在主站设备在接收到响应时能知道是哪个请求的响应 |
协议标识符 | 2 个字节 | 协议来说,这里恒为0 |
长度 | 2 个字节 | 对于MODBUS以下字节的数量,也就是完整报文的字节数减去6 |
单元标识符 | 1 个字节 | 串行链路或其它总线上连接的远程从站的识别码,也就是要访问的从站的标识号,因为只有一个字节,所以一个主站最多只能访问256个从站设备 |
2):PDU报文体
Modbus协议功能码如下表所示:
0x01 | 读线圈 | 0x07 | 读异常状态(仅用于串行链路) | 0x11 | 报告 从站ID(仅用于串行链路) |
0x02 | 读离散量输入 | 0x08 | 诊断(仅用于串行链路) | 0x14/0x06 | 读文件记录 |
0x03 | 读保持寄存器 | 0x09 | 获得通信事件计数器(仅用于串行链路) | 0x15/0x06 | 写文件记录 |
0x04 | 读输入寄存器 | 0x0C | 获得通信事件记录(仅用于串行链路) | 0x16 | 屏蔽写寄存器 |
0x05 | 写单个线圈 | 0x0F | 写多个线圈 | 0x17 | 读/写多个寄存器 |
0x06 | 写单个寄存器 | 0x10 | 写多个寄存器 | 0x18 | 读FIFO队列 |
4:报文举例解析
1:读取输出线圈发送报文格式如下:
发送报文含义:读取1号从站输出线圈,起始地址为0x13=19,对应地址为00020,线圈数量为0x1B=27,即读取1号从站输出线圈,地址从00020-00046,共27个线圈的状态值。
注意:协议中的起始地址指的是索引,后面的地址指的是具体地址,对于任意一个存储区,索引都是从0开始的,但是对应的具体地址,与存储区是相关的,比如输出线圈,0对应00001;输入线圈,0对应10001;输入寄存器,0对应30001;保持寄存器,0对应40001。
读取输出线圈返回报文格式如下:
返回报文含义:返回1号从站输出线圈00020-00046,共27个线圈的状态值,返回字节数为4个,分别为CD 6B B2 05。CD=1100 1101 对应 00020-00027,6B=0110 1011 对应 00028-00035,B2=1011 0010 对应 00036-00043,05=0000 0101 对应 00044-00046。
2:Modbus协议读取输入线圈
读取输入线圈发送报文格式如下:
发送报文含义:读取1号从站输入线圈,起始地址为0xC4=196,对应地址为10197,线圈数量为0x1D=29,即读取1号从站输入线圈,地址从10197-10225,共29个线圈的状态值。
读取输入线圈返回报文格式如下:
返回报文含义:返回1号从站输入线圈10197-10225,共29个线圈的状态值,返回字节数为4个,分别为CD 6B B2 05CD=1100 1101 对应 10197-10204,6B=0110 1011 对应 10205-10212,B2=1011 0010 对应 10213-10220,05=0000 0101 对应 10221-10225。
3:Modbus协议读取保持寄存器
读取保持寄存器发送报文格式如下:
发送报文含义:读取1号从站保持寄存器,起始地址为0x6B=107,对应地址为40108,寄存器数量为0x02=2,即读取1号从站保持寄存器,地址从40108-40109,共2个寄存器的数值。
读取保持寄存器返回报文格式如下:
返回报文含义:返回1号从站保持寄存器40108-40109,共2个寄存器的数值,返回字节数为4个,分别为02 2B 01 06。40108对应数值为0x022B,40109对应数值为0x0106。
4:Modbus协议读取输入寄存器
读取输入寄存器发送报文格式如下:
发送报文含义:读取1号从站输入寄存器,起始地址为0x6B=107,对应地址为30108,寄存器数量为0x02=2,即读取1号从站输入寄存器,地址从30108-30109,共2个寄存器的数值。
读取输入寄存器返回报文格式如下:
返回报文含义:返回1号从站输入寄存器30108-30109,共2个寄存器的数值,返回字节数为4个,分别为02 2B 01 06。30108对应数值为0x022B,30109对应数值为0x0106。
5:Modbus协议预置单线圈
预置单线圈发送报文格式如下:
发送报文含义:预置1号从站单个线圈的值,线圈地址为0x00AC=172,对应地址为00173,断通标志0xFF00表示置位,0x0000表示复位,即置位1号从站输出线圈00173。
预置单线圈返回报文格式如下:
返回报文含义:预置单输出线圈原报文返回。
6:Modbus协议预置单寄存器
预置单寄存器发送报文格式如下:
发送报文含义:预置1号从站单个保持寄存器的值,寄存器地址为0x0087=135,对应地址为40136,写入值为0x039E,即预置1号从站保持寄存器40136值为0x039E。
预置单寄存器返回报文格式如下:
返回报文含义:预置单保持寄存器原报文返回。
7:Modbus协议预置多线圈
预置多线圈发送报文格式如下:
发送报文含义:预置1号从站多个线圈的值,线圈地址为0x0013=19,对应地址为00020,线圈数为0x0A=10,写入值为0xCD00,即预置1号从站线圈00020-00027=0xCD=1100 1101,00028-00029=0x00=0000 0000。
预置多线圈返回报文格式如下:
返回报文含义:预置多输出线圈返回报文是在原报文基础上除去字节数及具体字节后返回。
8:Modbus协议预置多寄存器10
预置多寄存器发送报文格式如下:
发送报文含义:预置1号从站多个寄存器的值,寄存器地址为0x0087=135,起始地址为40136,寄存器数量为0x02=2,结束地址为40137,写入值为0x0105和0x0A10,即预置1号从站寄存器40136=0x0105,40137=0x0A10。
预置多寄存器返回报文格式如下:
返回报文含义:预置多保持寄存器返回报文是在原报文基础上除去字节数及具体字节后返回。