贺亚楠,朱洪海
(齐鲁工业大学(山东省科学院)山东省科学院海洋仪器仪表研究所 山东省海洋环境监测技术重点实验室 国家海洋监测设备工程技术研究中心,山东 青岛266061)
海水表层温度是我国海洋水文常规观测中的重要测量参数[1]。基于船载平台的海水表层水温观测由于受到船舶和波浪运动的影响,目前采用的主要手段是人工观测。早期的海温观测以直接观测为主,包括船舶观测、浮标观测、船体感应温度计观测。船体感应海温测量是利用船体上安装的温度计直接测量海温[2]。温度计需要放置在海面水下0.5 m的位置。为了使温度计始终在船的吃水线以下,经常垂直排列放置3~5个温度计。
为了实现基于船载平台的海水表层水温自动观测,需要在船体一侧布放水温传感器,并且水温传感器始终处于船舶吃水线范围。本文设计了基于Libmodbus的走航式海洋表层水温总线,实现了表层水温信息采集和船舶的海水表层水温自动监测。
RS485总线具有设备简单、价格低廉、控制方便、能进行长距离通信的优点,其收发器采用平衡发送和差分接收,因此具有抑制共模干扰的能力[3]。使用RS485总线和一对双绞线就能实现多站联网,构成分布式系统。因此本系统使用4个水温传感器设计RS485作为硬件层协议,采用主从结构,构成串行通信系统。
Modbus协议是全球第一个真正用于工业现场的总线协议[4],这是一个请求/应答协议,并且提供功能码规定的服务。Modbus协议定义了一个与基础通信层无关的简单协议数据单元(PDU),其协议数据单元如图1所示。
图1 Modbus协议数据单元
Modbus串行链路协议是单主/多从通信协议。在同一时刻,只有一个主节点连接于总线,一个或多个子节点(最大编号为247)连接于同一个串行总线。在 Modbus 串行链路,地址域只含有子节点地址,主节点通过将子节点的地址放到报文的地址域对子节点寻址。当子节点返回应答时,将自己的地址放到应答报文的地址域以让主节点知道哪个子节点在回答。Modbus定义了报文域的位内容在线路上串行的传送,并确定信息如何打包为报文和解码。有两种串行模式即:RTU模式和ASCII模式,区别见表1。
表1 Modbus-RTU和Modbus-ASCII区别
Modbus-ASCII模式的一个子节需要两个字符,在波特率相同时RTU模式的传输数据密度以及吞吐率比 ASCII模式的要高。
Modbus总线广泛应用于智能仪器仪表、智能监控设备等诸多领域[5],所以本系统采用Modbus-RTU作为软件层协议。为了加强数据检错能力,软件方面使用CRC16算法校验数据。系统整体框图如图2所示。
图2 海洋表层水温采集系统整体框图
PT100是一种正温度系数的热敏电阻,随着温度的升高电阻增大,并且基本呈线性方式,很适合用作连续测温。铂电阻测温工作原理为:铂金属材料在不同的温度下电导率不同,铂丝的电导率与温度之间大致成正比的关系,其可测量的温度范围大致在-200 ℃~600 ℃。PT100温度传感器还具有抗振动、稳定、测温精度高、寿命较长等优点[6]。因此,本设计采用PT100进行测温。图3中电阻R2、R3、R4与PT100组成电桥电路,REF3030为电桥电路提供标准的3.3 V电压。AD623用一个2 kΩ的放大反馈电阻精确地把电桥的压差放大51倍。
图3 测温电路图
本电路采用MAX485作为RS485总线的驱动芯片,如图4所示。将RE和DE短接,由单片机的I/O端口经反相器控制半双工通信时接收和发送的状态切换。三极管Ql及电阻Rl、R2构成反相电路,防止出现总线冲突问题;R3、R4为总线空闲时的箝位电阻,用于抗干扰;R7为阻抗匹配电阻,以减小信号反射;R5、R6及4个快恢复稳压管Dl~D4可将瞬态高电压箝位在一定的电压范围之内,以保护通信接口,保证通信的可靠性。
图4 RS485通信接口电路
RS232与RS485转换模块通过MAX232芯片把RS232标准电平转换为TTL标准电平,然后使用MAX485芯片将TTL电平转换为RS485电平。MAX485芯片包含一个驱动器和一个接收器,适合于RS485通信标准的低功率收发器。MAX485芯片采用单一电源5 V工作,额定电流为300 μA,采用半双工通信方式,可以将TTL电平转换为RS485电平。RS232与RS485转换电路如图5所示。
图5 RS232与RS485转换电路
Libmodbus作为一个优秀而且免费开源的跨平台库,支持RTU和TCP模式的Modbus开发库。本文利用Libmodbus开源类库V3.0.6版本,在Win7操作系统下,使用Visual Studio 2013建立MFC工程,利用MFC类库和Libmodbus类库进行Modbus上位机开发。
首先对Libmodbus库进行编译,得到Modbus静态库和动态库。利用VS2013建立MFC应用程序,将Modbus静态库(modbus.lib)和动态库添(modbus.dll)加进工程文件。
在本次开发中需要用到的文件有:modbus.h;modbus-rtu.h;modbus-tcp.h;modbus-version.h;modbus.lib;modbus.dll。在modbus.h文件中,宏定义了Modbus的功能码,还定义最大可读/可写线圈数量、最大可读/可写寄存器数量及各种错误码常量,并提供串口设置模式、modbus-tcp环境、释放modbus环境、设置从站ID、读写数据等一系列MODBUS_API的声明。modbus-version.h是modbus类库的版本信息。
完整的Modbus指令支持很多功能码,但一个项目里只用到其中的一部分功能码,因此本文实现的上位机包含读保持寄存器、写单个保持寄存器这2个指令。
首先要检测读取的寄存器数量是否在允许范围内,之后再对查询帧报文进行预处理以实现查询帧的构造,发送报文。对接收到的报文进行数据完整性检测,比较从设备地址,并进行CRC计算比较。数据完整性检测完毕之后,得到的才是各个寄存器的值。本机将查询帧报文预处理、查询帧构造、数据完整性检测、CRC校验这些功能分别封装成函数。读指令由modbus_read_registers(modbus_t *ctx, int addr, int nb, uint16_t*dest)利用函数调用的思想实现。流程图如图6所示。
图6 读指令流程图
首先创建相对应的Modbus-RTU环境。在读指令操作中,查询帧报文预处理、查询帧构造、数据完整性检测、CRC校验这些功能分别封装成函数。同以上读指令一样,利用函数调用的思想,由modbus_write_registers(modbus_t*ctx, int addr, int nb, const uint16_t*data)函数实现写指令的操作。写指令模块运行流程图如图7所示。
图7 写指令流程图
编写好的上位机(图8)先在实验室利用虚拟串口软件VSPD进行测试,可以正确读写寄存器。而后在2019年11月,于青岛中苑码头岸基实验站进行测试。本机物理端口为COM3,因此串口设置为COM3,波特率设为19 200,校验位设为无,数据位设为8,停止位设为1。将传感器固定在船体侧面,处于船舶吃水线变动范围内,分别采集海水表层温度、水下1 m处的温度、水下2 m处的温度及气温。采集的温度数据由Matlab处理如图9所示。
图8 软件界面
由图9可知,冬季青岛岸基实验站附近的海水,气温要比表层水温高3 ℃左右,表层水温相差不多,水下1 m处的水温基本稳定在18.62 ℃,水下2 m处的水温基本稳定在18.60 ℃。温度链与水温精度为0.05、电导率0.05 mS/cm的亚力克温盐传感器同时测量海水表层温度,其最大标准差约为0.1 ℃。误差分析如图10所示。
图9 温度曲线图
图10 误差分析
本文设计的上位机经测试,各项功能正常,运行稳定,操作简单方便,并具有可移植性和可扩展性。该设计可以在计算机上实现Modbus-RTU远程监测,并扩展了Modbus-TCP模块,设计了任务栏托盘功能,实现了用户可视化,方便了用户的操作与使用。为了能够在没有安装VS的计算机上使用,可以生成Release版本。
海洋表层水温是研究海气间水汽交换、了解海区水文及水质状况的重要参数[7],是海洋科学研究、海洋环境监测、海上交通安全、国防军事建设的重要参考依据[8]。基于船舶进行海水表层水温自动监测,能够使志愿船自动观测实现从气象观测扩展到水文观测,增加了观测要素,对研究、开发和利用海洋都具有重要意义。