1.通信协议格式
远程IO设备实现Modbus通信时,均作为从机,遵循Modbus通信过程,采用了MODBUS-RTU协议的命令子集,使用读寄存器命令(03)和单寄存器设置命令(06)。每消息的开头和结尾至少有3.5个字节时间的间隔。
注:03命令用于主机读取远程IO设备的采集数据或端口状态;
06命令用于设置设备参数或远程控制IO设备继电器动作;
功能码03(读指令)利用Modbus通信协议的03功能码,读取设备的数值。
主机请求数据格式:从机地址、功能码、起始地址、数据个数及CRC码
主机发送 | 字节数 | 信息内容 | 备注 |
从机地址 | 1 | xx | 向地址为xx的从机要数据 |
功能码 | 1 | 03 | 读取寄存器 |
寄存器起始地址Rn | 2 | NN Rn | 起始地址=NNRn NN为00-FF的任意数值 |
数据长度Ln | 2 | 00 XX | 读取XX个数据,每数据2个字节 |
CRC码 | 2 | CRCL、CRCH | 由主机计算得到的CRC码,低位在前、高位在后。 |
例如: 从机地址为01,读取设备寄存器地址=0000的数值(1个数值)。
01 | 03 | 00 | 00 | 00 | 01 | 84 | 0A |
从机响应数据格式:从机地址、功能码、字节数、数据区及CRC码
从机发送 | 字节数 | 信息内容 | 备注 |
从机地址 | 1 | xx | 从机地址 |
功能码 | 1 | 03 | 读取寄存器 |
数据长度 | 1 | 00 XX | 读取XX个字节(共2倍数据个数) |
寄存器0高字节 | 1 | DATA0H | 寄存器0数据,高位在前,低位在后。 |
寄存器0低字节 | 1 | DATA0L | |
寄存器n高字节 | 1 | DATAnH | 寄存器n数据,高位在前,低位在后。 |
寄存器n低字节 | 1 | DATAnL | |
CRC码 | 2 | CRCL、CRCH | 由从机计算得到的CRC码,低位在前,高位在后。 |
寄存器数据为二个字节,高位在前。CRC码都是二个字节,低位在前。
例如: 从机地址为01返回:
01 03 02 DATA0H DATA0L CRCL CRCH
功能码06(写指令)利用Modbus通信协议的06功能码,设置设备的一个寄存器的数值。
信息帧格式:
①主机请求数据格式:从机地址、功能码、寄存器地址、设置的数据及CRC码
主机发送 | 字节数 | 信息内容 | 备注 |
从机地址 | 1 | ADDxx | 向地址为XX的从机预置数据 |
功能码 | 1 | 06 | 预置单个寄存器 |
寄存器地址 | 2 | 00-Rn | 需要预置的寄存器 |
数据值高位 | 1 | DATAH | 需要预置数据 |
数据值低位 | 1 | DATAL | 需要预置数据 |
CRC码 | 2 | CRCL、CRCH | 由主机计算得到的CRC码,低位在前,高位在后。 |
2.寄存器
寄存器地址 (16进制) | 功能 (每寄存器数值16bit,即2字节) | 存取属性 读功能码:03 写功能码:06 |
0001 | 485地址 | 读写 |
0002 | 串口波特率 | 读写 |
0000:1200;0001:2400;0002:4800;0003:9600;0004:19200 | |
0003 | 所有DO输出状态,返回值1-16bit,按位表示第x路输出状态,所在位 | 只读 |
为0:继电器常态(开路),所在位为1:继电器闭合(合路) | |
注:当前仅有前6个bit有效。 | |
0004 | 所有DI输入状态,返回值1-16bit,按位表示第x路输入状态, | 只读 |
所在位为0:无输入,所在位为1:有输入 | |
注:当前仅有前4个bit有效。 | |
0005 | 第1路继电器状态 | 读写 |
0000:继电器常态(开路) | |
0001:继电器闭合(合路) | |
0006 | 第2路继电器状态 | 读写 |
0000:继电器常态(开路) | |
0001:继电器闭合(合路) | |
0007 | 第3路继电器状态 | 读写 |
0000:继电器常态(开路) | |
0001:继电器闭合(合路) | |
0008 | 第4路继电器状态 | 读写 |
0000:继电器常态(开路) | |
0001:继电器闭合(合路) | |
0009 | 第5路继电器状态 | 读写 |
0000:继电器常态(开路) | |
0001:继电器闭合(合路) | |
000A | 第6路继电器状态 | 读写 |
0000:继电器常态(开路) | |
0001:继电器闭合(合路) | |
000B | 读第1路DI输入状态 | 只读 |
0000:无输入(开路状态) | |
0001:有输入(合路状态) | |
000C | 第2路DI输入状态 | 只读 |
0000:无输入(开路状态) | |
0001:有输入(合路状态) | |
000D | 第3路DI输入状态 | 只读 |
0000:无输入(开路状态) | |
0001:有输入(合路状态) | |
000E | 第4路DI输入状态 | 只读 |
0000:无输入(开路状态) | |
0001:有输入(合路状态) | |
000F | 第1路输入计数值-高16位 | 读写 |
0010 | 第1路输入计数值-低16位 | 读写 |
0011 | 第2路输入计数值-高16位 | 读写 |
0012 | 第2路输入计数值-低16位 | 读写 |
0013 | 第3路输入计数值-高16位 | 读写 |
0014 | 第3路输入计数值-低16位 | 读写 |
0015 | 第4路输入计数值-高16位 | 读写 |
0016 | 第4路输入计数值-低16位 | 读写 |