通讯协议(V1.0)
通讯协议(V1.0)
概述
本通讯协议采用标准Modbus协议,所用的传输模式为RTU模式。Modbus协议是一种主-从式协议。
任何时刻只有一个设备能够在线路上进行发送。由主站管理信息交换,且只有它能发起。它会相继对从站进行轮询。除非被主站批准,否则任何从站都不能发送消息。从站之间不能进行直接通信。
协议帧中不包含任何消息报头字节或消息字节结束符。它的定义如下:
从站地址 | 请求代码 | 数据 | CRC16 |
从站地址:- 地址必须在1到247之间,默认为1
- 每个地址在网络设备环境中必须唯一。数据 : 以二进制代码传输。
CRC16 : 循环冗余校验参数。
当间隔时间长于或等于3.5字符时,即作为检测到帧结束。
1、通讯口设置
通讯方式 RS-485
xx率 9600bps 2、字节数据格式
. 一位起始位
. 八位数据位
. 一位停止位
. 无校验
1 | * | * | * | * | * | * | * | * | 1 |
1 位起始位 8 位数据位 1 位停止位
3、仪表通讯帧格式
下表给出工作在从机模式时的的Modbus功能,并规定其限值。
从站编号:本机仪表地址,地址必须在1到247之间,且同一总线上各仪表地址不可重复。地址为0时用于广播功能,且此时只有写功能有效。单字节。
功能代码:“读”和“写”功能是从主站角度定义的。单字节。
功能代码 | Modbus名 | 功能名 | 广播 | 一次连续的N 的最大值 |
3 (0x03) | Read Holding Registers | 读N个寄存器值 | NO | 4 |
16 (0x10) | Write Multiple Registers | 写N个寄存器值 | YES | 4 |
首寄存器地址:要读取的第一个内部寄存器的地址。双字节。每个内部寄存器的值数据为双字
节。
寄存器数:要读取或修改的内部寄存器个数。双字节。
读取的字节数:被读取的内部寄存器的数据的字节总数。单字节。
CRC16:循环冗余校验参数。
1) 读N个输出字:功能3
注意: Hi = 高位字节,Lo = 低位字节。 此功能可被用于读取参数,而无论类型如何。
主站请求
从站编号 | 0x03 | 首寄存器地址 | 寄存器数 | CRC16 | |||
Hi | Lo | Hi | Lo | Lo | Hi |
1 字节 1 字节 2 字节 2 字节 2 字节
从站响应
从站编号 | 0x03 | 读取的字节数 | 首寄存器数值 | …… | 末寄存器数值 | CRC16 | |||
Hi | Lo | Hi | Lo | Lo | Hi |
1字节 1字节 1字节 2 字节 2 字节 2 字节
例1:使用功能3读取从站1上的1个单元“ALK”(地址0002H,见附表):主站请求
0x01 | 0x03 | 0x00 | 0x02 | 0x00 | 0x01 | 0x25 | 0xCA |
从站响应 | 1 字节 | 1 字节 | 2 字节 | 2 字节 | 2 字节 | ||
0x01 | 0x03 | 0x02 | 0x00 | 0x00 | 0xB8 | 0x44 | |
1字节 | 1字节 | 1字节 | 2字节 | 2字节 |
2) 写N个输出字:功能16(0x10)
主站请求
从站编号 | 0x10 | 首寄存器地址 | 寄存器数 | 字节数 | 首字数据 | …… | CRC16 | ||||
Hi | Lo | Hi | Lo | Hi | Lo | Lo | Hi |
从站编号 | 0x10 | 首寄存器地址 | 寄存器数 | CRC16 | |||
Hi | Lo | Hi | Lo | Lo | Hi |
1字节 1字节 2 字节 2 字节 1字节 2字节 2字节从站响应
1字节 1字节 2 字节 2 字节 2 字节
例2:使用功能16将数据0x00FE写入从站1中的1个单元“Addr”(寄存器地址0000H,见附表):主站请求
从站编号 | 请求代码 | 首寄存器地址 | 寄存器数 | 字节数目 | 首寄存器数据 | CRC16 | ||||
0x01 | 0x10 | 0x00 | 0x00 | 0x00 | 0x01 | 0x02 | 0x00 | 0xF7 | 0Xea | 0x46 |
从站响应
从站 编号 | 响应 代码 | 首寄存器地址 | 寄存器数 | CRC16 | |||
0x01 | 0x10 | 0x00 | 0x00 | 0x00 | 0x01 | 0x00 | 0x18 |
3) 异常响应
当从站不能执行发送给它的请求时,它将返回一个异常响应。异常响应的格式:
从站编号 | 响应代码 | 错误代码 | CRC16 | |
Lo | Hi |
1字节 1字节 1字节 2 字节
响应代码:请求的功能代码 + 0x80(最高位被置为1)。
错误代码:
1 = 请求中要访问的寄存器地址不在寄存器地址范围内,地址最大为3。
2 = 请求中一次性访问寄存器的数量超过可连续访问寄存器数量的最大值4。
4、用八路报警板内部参数对应地址表(地址范围:0--2):
编 号 | 参数符号 | 参 数 名 称 | 寄存器 地 址 | 数据格式 | 类型 | 数 值 范 围 |
1 | Addr | 仪表地址 | 0000 | 双字节无符号 | 读/写 | 1~247 |
2 | ALN | 通道实时报警状态 | 0001 | 只读 | 0-0xFF | |
3 | ALK | 报警记忆状态 | 0002 | 只读 | 0-0xFF |
ALN | Bit15 ~ Bit8 | Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0 | ||||||||
无意义 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | |
表示通道 8 有报警 | 表示通道 8 无报警 | 表示通道 7 有报警 | 表示通道 7 无报警 | 表示通道 6 有报警 | 表示通道 6 无报警 | 表示通道 5 有报警 | 表示通道 5 无报警 | 表示通道 4 有报警 | 表示通道 4 无报警 | 表示通道 3 有报警 | 表示通道 3 无报警 | 表示通道 2 有报警 | 表示通道 2 无报警 | 表示通道 1 有报警 | 表示通道 1 无报警 |
ALK | Bit15 ~ Bit8 | Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0 | ||||||||
无意义 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | |
表示通道 8 有报警 | 表示通道 8 无报警 | 表示通道 7 有报警 | 表示通道 7 无报警 | 表示通道 6 有报警 | 表示通道 6 无报警 | 表示通道 5 有报警 | 表示通道 5 无报警 | 表示通道 4 有报警 | 表示通道 4 无报警 | 表示通道 3 有报警 | 表示通道 3 无报警 | 表示通道 2 有报警 | 表示通道 2 无报警 | 表示通道 1 有报警 | 表示通道 1 无报警 |