modbus的帧格式
设备地址 | 功能代码 | 数据格式 | CRC校验L | CRC校验H |
---|---|---|---|---|
8bit | 8bit | N*8bit | 8bit | 8bit |
1 主机对从机单个寄存器写数据操作(0x06)
从机地址 | 功能代码 | 数据格式(数据地址) | 数据格式(数据) | CRC校验L | CRC校验H |
---|---|---|---|---|---|
01 | 06 | 00 01 | 00 17 | 98 | 04 |
假如从机地址是 01,那么从机接收到这串数据,根据CRC16进行校验判断数据是否正确,如果数据无误,就改变自己寄存器的值。然后从机原封不动返回这句话,告诉主机通讯成功!!!
通讯过程来看
对主机而言,发送01 06 00 04 00 07 89 C9后,接收了01 06 00 04 00 07 89 C9;
对从机而言,接收01 06 00 04 00 07 89 C9后,发送了01 06 00 04 00 07 89 C9。
2 主机对从机读数据操作(0x03)
从机地址 | 功能代码 | 数据格式(数据地址) | 数据格式(读取数据的长度) | CRC校验L | CRC校验H |
---|---|---|---|---|---|
01 | 03 | 00 01 | 00 01 | 84 | 0A |
假如从机地址是 01,那么从机接收到这串数据,根据CRC16进行校验判断数据是否正确,如果数据无误,就发送相应的寄存器的值给主机!!
从机地址 | 功能代码 | 数据格式(数据个数) | 数据格式(数据) | CRC校验L | CRC校验H |
---|---|---|---|---|---|
01 | 03 | 00 02 | 00 11 | 78 | 48 |
这里的数据字节个数,在主机下发数据那里可以变更,单位是不同的——对主机端,一个数据个数对应从机端两个字节的数据。
通讯过程来看
对主机而言:发送01 03 00 00 00 01 84 0A 后接收到01 03 02 00 11 78 48
对从机而言:发送01 03 02 00 11 78 48 后接收到01 03 00 00 00 01 84 0A
poll为主机,slave为从机
3 主机对从机连续写多个寄存器
16功能码也是写寄存器但是与06所不同的是,该功能码可以连续写多个寄存器,主机下发的数据结构为:地址、功能码、寄存器起始地址、寄存器个数、要写入数据的字节数、数据、校验码等。从机回复的数据格式为:地址、功能码、寄存器起始地址、寄存器个数、校验码等。
3.1写一个寄存器
从机地址 | 功能代码 | 寄存器起始地址 | 寄存器个数 | 数据的字节数 | 数据 | CRC校验L | CRC校验H |
---|---|---|---|---|---|---|---|
01 | 10(十六进制) | 00 00 | 00 01 | 02 | 00 11 | 66 | 5c |
回复
从机地址 | 功能代码 | 寄存器起始地址 | 寄存器个数 | CRC校验L | CRC校验H |
---|---|---|---|---|---|
01 | 10(十六进制) | 00 00 | 00 01 | 66 | 5c |
3.2写多个寄存器
从0x0034开始连续写入四个字节的数据到2个寄存器中
从机地址 | 功能代码 | 寄存器起始地址 | 寄存器个数 | 数据的字节数 | 数据 | CRC校验L | CRC校验H |
---|---|---|---|---|---|---|---|
01 | 10(十六进制) | 00 34 | 00 02 | 04 | 0c 02 12 45 | XX | XX |
回复
从机地址 | 功能代码 | 寄存器起始地址 | 寄存器个数 | CRC校验L | CRC校验H |
---|---|---|---|---|---|
01 | 10(十六进制) | 00 34 | 00 02 | XX | XX |