计蒙 TS-3000 微站,是将 计蒙 TS-2000 传感嵌入至一个小型的金属微站内,同时集成 五参传感器、一分四模块、水泵、电球阀、水箱等元件进行集中采集的小型设施。
五参传感器通信协议
本章节着重讲解终端控制器与五参传感器之间的通信方式、原理等,计蒙 TS-2000 的通信方式已在上文中给出。
数据格式
基于较为标准的 ModBus - RTU 协议,但该传感器仅支持三个功能码: 03、06、10
- 03: 读取多个连续寄存器指令。
- 06: 写入单个寄存器指令。
- 10: 写入多个连续寄存器指令。
数据帧格式
主站发送方: 一帧完整的数据由 地址码、功能码、寄存器地址码(寄存器起始地址码)、寄存器数量码、校验码构成。所有的数据为 16 进制格式 1 字节, 1 个字节为 2 为 16进制数: 0x01 0x0C
- 地址码: 从设备的标识符,地址码唯一,在同一个系统中,一个从设备只对应一个地址码。
- 功能码: 具体实现的功能标识符,标准的 ModBus - RTU 功能码只有两个功能:读/写,且功能码唯一,一个功能只对应一个地址码(该传感器仅支持 03、06、10 三个功能码)。
- 寄存器地址码: 实际进行操作的寄存器的地址,或连续的寄存器的起始地址。
- 寄存器数量码: 实际进行操作的寄存器的数量,根据寄存器所占的空间进行自动匹配,int 型寄存器占 1 字节,float 型寄存器占 2 字节。
- 校验码: 过 ModBus-CRC16 循环校验方法计算出的 2 字节 16进制数,**低位在前、高位在后**。
校验码格式
循环冗余校验(Cyclic redundancy check,通称:CRC)是一种根据网路数据封包或电脑档案等数据产生简短固定位数验证码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。生成的数字在传输或者储存之前计算出来并且附加到数据后面,然后接收方进行检验确定数据是否发生变化。由于本函数易于用二进制的电脑硬件使用、容易进行数学分析并且尤其善于检测传输通道干扰引起的错误,因此获得广泛应用。
CRC 校验的多项式与方法众多,我们在此选用适合我们设备间通讯的 ModBus-CRC16 校验方式:
设置 CRC 变量的初始值为 FFFF,称此变量为 CRC 寄存器
把第一个 8 位数据与 CRC 寄存器的低位异或,并把结果存放于 CRC 寄存器。
检测 CRC 寄存器最低为,若为 1:寄存器右移 1 位,再与多项式(8005) A001H 异或;若为 0, 则寄存器只需右移 1 位
重复步骤三,直到右移 8 次,处理完 8位数据
重复步骤二~四,进行下一个 8 位数据处理
将最后得到的 CRC 寄存器的值取出,即为 CRC 校验码.
CRC校验代码
1 | /** |
寄存器地址表
寄存器名称 | 寄存器地址 | 数据类型 | 读写类型 | 备注 |
测量参数1值 | 0002H | Float | 读 | 测量参数由配置的传感器决定,需进行提前读取预知各个参数 |
测量参数2值 | 0004H | Float | 读 | |
测量参数3值 | 0006H | Float | 读 | |
测量参数4值 | 0008H | Float | 读 | |
测量参数5值 | 000AH | Float | 读 | |
测量参数6值 | 000CH | Float | 读 | |
测量参数7值 | 000EH | Float | 读 | |
测量参数8值 | 0010H | Float | 读 | |
测量参数9值 | 0012H | Float | 读 | |
测量参数10值 | 0014H | Float | 读 | |
测量参数11值 | 0016H | Float | 读 | |
测量参数12值 | 0018H | Float | 读 | |
参数1/参数2 | 001AH | UINT | 读 | 查询对应的参数代码(即参数名称)高字节代表奇数位参数,低字节代表偶数位参数,例如查询 “参数1/参数2” ,读取到 0x02 0x03,则参数1为02电导率参数,参数2为03溶解氧参数 |
参数3/参数4 | 001BH | UINT | 读 | |
参数5/参数6 | 001CH | UINT | 读 | |
参数7/参数8 | 001DH | UINT | 读 | |
参数9/参数10 | 001EH | UINT | 读 | |
参数11/参数12 | 001FH | UINT | 读 | |
传感器连接状态 | 0020H | UINT | 读 | 由低到高依次对应 1~4 通道,连接成功为1,否则为0 |
通道1/通道2 | 0022H | UINT | 读 | 对应通道搭配的传感器型号高字节代表奇数位通道,低字节代表偶数位通道,例如查询 “通道1/通道2” ,读取到 0x04 0x07,则通道1为04浊度传感器,通道2为07氨氮传感器 |
通道3/通道4 | 0023H | UINT | 读 | |
通道5/通道6 | 0024H | UINT | 读 | |
通道7/通道8 | 0025H | UINT | 读 | |
温度通道绑定 | 0028H | UINT | 读/写 | 默认绑定通道1,可绑定任何一个传感器读取 |
生产批次 | 0029H | UINT | 读 | 2218 |
传感器序号 | 002AH | UINT | 读 | 1001 |
地址码 | 002BH | UINT | 读/写 | 1 ~ 31可改;默认 1 |
波特率 | 002CH | UINT | 读/写 | 0 - 9600;1 - 19200;2 - 115200 |
校验位 | 002DH | UINT | 读/写 | 0 - NONE;1 - ODD;2 - EVEN |
停止位 | 002EH | UINT | 读/写 | 0 - 1 bit;1 - 2 bit |
1点校正 | 002FH | UINT | 写 | 命令11H |
1点标准值 | 0030H | Float | 读/写 | 默认 4.01 |
2点校正 | 0032H | UINT | 写 | 命令21H |
2点标准值 | 0033H | Float | 读/写 | 默认 6.86 |
3点校正 | 0035H | UINT | 写 | 命令31H |
3点标准值 | 0036H | Float | 读/写 | 默认 9.18 |
参数代码表
参数代码(十六进制) | 对应测量参数名 | 单位 | 校正说明 |
01 | 温度 | ℃ | B |
02 | 酸碱度 | 无计量单位 | B + 2point |
03 | 电导率 | uS/cm (1μS/cm=10^-4 S/m) |
K、B + 2point |
04 | 浊度 | NTU | K、B + 3point |
05 | 氧化还原电位 | mV | B |
06 | 悬浮物 (浊度传感器复合输出) |
mg/L | K、B + 3point |
07 | 氨氮 | mg/L | K、B + 2point |
08 | 化学需氧量 (传感器复合输出浊度) |
mg/L | K、B + 3point |
09 | 氟化物 | mg/L | K、B + 2point |
0A | 氯化物 | mg/L | K、B + 2point |
0B | 硝酸盐 | mg/L | K、B + 2point |
0C | 水位 | cm | K、B + 2point |
0D | 透明度 | cm | K、B + 1point |
0E | 叶绿素 | ug/L | K、B + 3point |
0F | 蓝绿藻 | kcells/mL | K、B + 3point |
10 | - | - | - |
11 | 水中油 | ppm | K、B + 3point |
12 | - | - | - |
13 | 盐度 (电导率传感器复合输出) |
ppt | K、B |
14 | 溶解性固体 (电导率传感器复合输出) |
mg/L | K |
五参传感器交互指令
指令 1 - 读取单个参数值
主设备发送: 01 01 00 00 00 00 0A 3C
从设备返回:
设置成功 01 52 49
设置失败 01 46 41
校验失败 01 43 52 43 45 52
响应时间: 1.5s
注意: TS-2000 传感器上电后请等待 2~3s 以后开启串口,避免因传感器端上电复位导致的信号波动.