光电直读水表 MODBUS-RTU 通讯协议
光电直读水表 MODBUS-RTU 通讯协议
x水表使用了 MODBUS-RTU 通讯协议,MODBUS 协议详细定义了校验码、数据序列等,这些都是特定数据交换的必要内容。MODBUS 协议在一根通讯线上使用主从应答式连接(半双工),这意味着在一根单独的通讯线上信号沿着相反的两个方向传输。首先,主计算机的信号寻址到一台唯一的终端设备(从机),然后,终端设备发出的应答信号以相反的方向传输给主机。
MODBUS 协议只允许在主机(PC,PLC 等)和终端设备之间通讯,而不允许独立的终端设备之间的数据交换,这样各终端设备不会在它们初始化时占据通讯线路,而仅限于响应到达本机的查询信号。
MODBUS-RTU 格式无起始字符和结尾字符,但需要加等待时间,等待时间不少于 3.5 个字符发送时间。
(1) 传输方式
信息传输为异步方式,并以字节为单位,在主机和从机之间传递的通讯信息是 10 位字格式,包含 1 个起始位、8 个数据位(最小的有效位先发送)、无奇偶校验位、1 个停止位。
(2) 数据帧格式
地址码 | 功能码 | 数据区 | CRC 校验码 |
1 字节 | 1 字节 | n 字节 | 2 字节 |
地址码:地址码在帧的开始部分,由一个字节(8 位二进制码)组成,十进制为 0~255,在水表中只使用 1~247,其它地址保留。这些位标明了用户指定的终端设备的地址,该设备将接收来自与之相连的主机数据。每个终端设备的地址必须是唯一的,仅仅被寻址到的终端会响应包含了该地址的查询。当终端发送回一个响应,响应中的从机地址数据便告诉了主机哪台终端正与之进行通信。
功能码:功能码告诉了被寻址到的终端执行何种功能。下表列出了该系列仪表用到的功能码,以及它们的意义和功能。
功能 | 定义 | 操作 |
03H/04H | 读数据寄存器 | 获得一个或多个寄存器的当前二进制值 |
10H | 预置多寄存器 | 设定二进制值到一系列多寄存器中 |
05H | 开关阀门控制 | 开始地址 0001 |
01H | 读阀门状态 | 开始地址 0001 |
数据区:数据区包含了终端执行特定功能所需要的数据或者终端响应查询时采集到的数据。这些数据的内容可能是数值、参考地址或者设置值。例如:功能码告诉终端读取一个寄存器,数据区则需要指明从哪个寄存器开始及读取多少个数据,内嵌的地址和数据依照类型和从机之间的不同内容而有所不同。
CRC 校验码:错误校验(CRC)域占用两个字节,包含了一个 16 位的二进制值。CRC 值由传输设备计算出来,然后附加到数据帧上,接收设备在接收数据时重新计算 CRC 值,然后与接收到的 CRC 域中的值进行比较,如果这两个值不相等,就发生了错误。
生成一个 CRC 的流程为:
1、预置一个 16 位寄存器为 0FFFFH(全 1),称之为 CRC 寄存器。
2、把数据帧中的第一个字节的 8 位与 CRC 寄存器中的低字节进行异或运算,结果存回 CRC 寄存器。
3、将 CRC 寄存器向右移一位,最高位填以 0,最低位移出并检测。
4、如果最低位为 0,重复第三步(下一次移位);如果最低位为 1,将 CRC 寄存器与一个预设的固定值(0A001H)进行异或运算。
5、重复第三步和第四步直到 8 次移位。这样处理完了一个完整的八位。
6、重复第 2 步到第 5 步来处理下一个八位,直到所有的字节处理结束。
7、最终 CRC 寄存器的值就是 CRC 的值。
此外还有一种利用预设的表格计算 CRC 的方法,它的主要特点是计算速度快,但是表格需要较大的存储空间,该方法此处不再赘述,请参阅相关资料。
通信应用格式详解
(1)功能码 03H:读寄存器
此功能允许用户获得设备采集与记录的数据及系统参数。主机一次请求的数据个数没有限制,但不能超出定义的地址范围。
下面的例子是从 01 号从机读 1 个采集到的基本数据(数据帧中每个地址占用 2 个字节)。采集的数据为总用水量(占用 4 个字节),其地址为 00H
主机发送 | 发送信息 | 从机返回 | 返回信息 | |||
地址码 | 01H | 地址码 | 01H | |||
功能码 | 03H | 功能码 | 03H | |||
起始地址 | 高字节 | 00H | 字节数 | 04H | ||
低字节 | 00H | 寄存器数据 | 高字节 | 00H | ||
寄存器数量 | 高字节 | 00H | 低字节 | 12H | ||
低字节 | 02H | 寄存器数据 | 高字节 | D6H | ||
CRC 校验码 | 高字节 | C4H | 低字节 | 87H | ||
低字节 | 0BH | CRC 校验码 | 高字节 | 44H | ||
低字节 | 34H |
(2)功能码 10H:写寄存器
功能码 10H 允许用户改变多个寄存器的内容,该仪表中地址、通讯速率等可用此功能号写入。主机一次最多可以写入 16 个(32 字节)数据。
主机发送 | 发送信息 | 从机返回 | 返回信息 | |||
地址码 | 01H | 地址码 | 01H | |||
功能码 | 10H | 功能码 | 10H | |||
起始地址 | 高字节 | 00H | 起始地址 | 高字节 | 00H | |
低字节 | 15H | 低字节 | 15H | |||
寄存器数量 | 高字节 | 00H | 寄存器数量 | 高字节 | 00H | |
低字节 | 01H | 低字节 | 01H | |||
字节数 | 02H | CRC 校验码 | 高字节 | |||
0015H 待写入 数据 | 高字节 | 08H | 低字节 | |||
低字节 | 03H | |||||
CRC 校验码 | 高字节 |
低字节 |
(3)功能码 05H:开关阀门
此功能允许用户控制阀门操作。
下面的例子是从 01 号从机开关阀,寄存器数据低字节 FF-开阀 00-关阀
主机发送 | 发送信息 | |
地址码 | 01H | |
功能码 | 05H | |
起始地址 | 高字节 | 00H |
低字节 | 01H | |
寄存器数据 | 高字节 | 00H |
低字节 | FFH/00H | |
CRC 校验码 | 高字节 | DCH/9CH |
低字节 | 4AH/0AH | |
主机接收 | 发送接收 | |
地址码 | 01H | |
功能码 | 05H | |
起始地址 | 高字节 | 00H |
低字节 | 01H | |
寄存器数据 | 高字节 | 00H |
低字节 | FFH/00H | |
CRC 校验码 | 高字节 | DCH/9CH |
低字节 | 4AH/0AH | |
(4)功能码 01H:读阀门状态
此功能允许用户读取阀门状态。
下面的例子是从 01 号从机读阀门状态,寄存器数据低字节 FF-开阀 00-关阀
主机发送 | 发送信息 | |
地址码 | 01H | |
功能码 | 01H | |
起始地址 | 高字节 | 00H |
低字节 | 01H | |
寄存器数量 | 高字节 | 00H |
低字节 | 01H | |
CRC 校验码 | 高字节 | ACH |
低字节 | 0AH | |
主机接收 | 发送接收 | |
地址码 | 01H | |
功能码 | 01H | |
起始地址 | 高字节 | 00H |
低字节 | 01H | |
寄存器数据 | 高字节 | 00H |
低字节 | FFH/00H | |
CRC 校验码 | 高字节 | |
低字节 | ||
地址 | 变量名称 | 读写属性 | 数据格式 | |
0000H 0001H | 总用水量 | R | 每个表占用 4 个字节 | |
0015H 高字节 | 通信地址 | R/W | 001-247 | char |
0015H 低字节 | 通信xx率 | R/W | 01 —— 9600bps(默认) 02 —— 4800bps 03 —— 2400bps 04 —— 1200bps | char |
附:1、读写属性:“R”只读,读参量用 03H 号命令;“R/W”可读可写,写参量用 10H 号命令。禁止向未列出的或不具可写属性的地址写入。
2、表的通讯地址和通讯速率出厂时给出,亦可通过本公司提供的软件读出。也可以通过协议设置。
3、表中所测读数占 4 个字节,单位为 m3。高位在前,低位在后,若读出值为 0012D687H
(1234567),则计量值为 1234567×0.01=12345.67m3。