姜 飞 ,童海明 ,赵玉薇 ,董刘同 ,张 瀚
(1.杭州浅海科技有限责任公司,浙江 杭州 310052;2.纳晶科技股份有限公司,浙江 杭州 300450;3.航天长征火箭技术有限公司,北京100076)
随着物联网技术的高速发展,众多种类的传感器、仪器设备在工业、民用领域被广泛应用。与此同时,为降低传感器使用过程中的运营、维护成本,特别是应对特殊地理条件下能源供应匮乏的现状,具有超低功耗特性的传感器应用需求强烈[1-2],超低功耗特性已成为传感器未来发展趋势。
Modbus 协议由于在通信过程中具有带宽节省、安全性和可靠性等方面显著优势,成为传感器在工业控制和自动化应用中常被采用的通信协议[3]。然而,传统的Modbus 协议信息处理方式不适用于超低功耗应用环境,在一定程度上限制了Modbus 协议的应用范围。最近一段时间,虽然在此方面出现了一些研究成果,不过更多的是针对硬件设计方面的考虑[4]。本文通过对Modbus 协议和超低功耗设备设计理念进行分析和改进,重新规划寄存器数据实时响应机制,建立分层式的 Modbus 通信模型,可以实现超低功耗特性传感器与Modbus 通信协议的兼容。
Modbus 是一种总线结构,如图1 所示。通信线路由一台主机扩充到多台设备,是一种单主站的主/从通信模式。通信过程由主机发起,从机被动接受指令并做出响应,执行相关动作或者返回数据[5]。
图1 Modbus 拓扑结构
Modbus 协议将设备中的各种数据、状态、控制端口等所有的功能,全部抽象成4 种数据类型概念,分别是离散输入、线圈、数据寄存器、保持寄存器,表1 展示了它们的常用功能。通过对这些数据类型的读写,实现了设备的各种功能。
表1 Modbus 数据类型
传统的Modbus 处理机制比较简单,线圈和寄存器都是显式存在,即寄存器真实地排布在存储空间的某个位置。Modbus 通信接口和设备内部运行程序,都独立地面向寄存器(或线圈)操作。
对于读取过程,内部寄存器通过自身独立的一套逻辑进行工作,并在特定的时间更新这些寄存器[6]。例如设备具有测量温度的功能,那么内部的温度测量模块会以一定的周期不断重复工作,并更新温度寄存器,过程展示如图2 所示。当设备收到 Modbus 主机读取温度寄存器指令时,会将当前寄存器中的内容打包发送出去,而不考虑该数据的时效性。
图2 传统寄存器读取与任务执行过程
对于写入操作过程,主机通过Modbus 协议对相应的寄存器进行修改就可以实现对设备的控制[7],例如向一个指示灯寄存器写入一个特定数值表示打开设备指示灯。通信过程仅仅代表该寄存器被成功写入,指示灯并不会立即打开,设备内部会有一个以一定周期不断扫描寄存器的进程,当这个进程读取到寄存器时,灯才会打开,这会造成通信过程和动作执行之间有一定时差。过程展示如图3所示。
图3 传统寄存器写入与任务执行过程
由此可见,传统的Modbus 是一个简单的分层结构,层级功能操作相互独立,层与层之间通过一个真实存在的寄存器(或者线圈)间接联系起来。其优点是设计思路清晰,独立性好,可靠性强[8]。但是缺点也是显而易见的。首先,通信指令与获取数据、执行动作之间的实时性问题将造成响应周期的存在,更为重要的是,因为数据更新和动作执行是一个不断重复的过程,这种设计无法实现低功耗特征。
在分析传统Modbus 协议及通信机理基础上,对常用设备的低功耗处理机制进行分析研究,明确了处理机制存在的缺点,对数据更新和动作响应机制做出设计改进,以实现 Modbus 设备的低功耗特性。
一个设备的功耗特性受限于多种因素,包括:工作原理、机械结构、运行状态、电源设计、芯片选择等,但在嵌入式软件系统对设备控制的层面上讲,有一条重要原则,即减少无意义的能源消耗[9]。当某个功能不被使用时,与其相关的模块应被关闭,包括:硬件断电、软件功能停止以及宏观连续但微观间歇性工作等状态。由于电子器件速度非常快,可以微观上实施间歇性的工作[10-11],例如一些慢速通信接口。
一个低功耗设备,如温度传感器,在主机未索要温度数据的时候,温度传感器部分不应自主工作 (且此时工作产生的数据也无任何意义)。当主机索要温度数据的时候,才会开启温度传感器模块,并立即工作一次,得到最新的温度数据,然后立即关闭温度传感器模块,最后设备将数据结果按照Modbus 协议格式反馈给主机。可以看出,此读取过程改进设计,能够实现传感器动作与通信过程的紧密联系与同步操作,中间的寄存器已经变成隐式。即主机发起通信,寄存器中的数据尚未准备好(或者这个寄存器尚不存在),对这个寄存器的读取要求将演变成一个温度测量需求,并导致后面一系列的测量动作。当温度测量完成后,寄存器才显现出来。信息处理与动作过程见图4。但从主机角度来看,从机仍然严格遵循着Modbus 协议。同时,由于传感器数据是最新生成的,这种过程比传统方式带来了更高的实时性。
图4 改进后寄存器读取与任务触发过程
对寄存器的写入行为,表现在仪器设备上,一般是参数设定、功能的打开或者关闭等控制动作。以设备上受控的信号指示灯为例,当主机未对设备的信号进行设定时,设备不应频繁查看该寄存器内容,只有在主机对该寄存器发生写入动作时,设备再去检查该寄存器内容,从而控制信号灯变化。可以看出,此写入过程改进设计,能够实现设备指示灯变化与通信紧密联系,中间的寄存器变为隐式,即当这个过程完成后,寄存器的作用又会消失。数据写入与触发动作过程见图5。从主机角度来看,从机仍然严格遵循着 Modbus 协议。同时,由于从机对寄存器改变进行了立即响应,这种过程比传统的控制方式带来了更高的实时性。
图5 改进后寄存器写入与任务触发过程
Modbus 标准通信过程并没有限定对寄存器操作的数量和范围,也就是说,主机可以使用一条指令对多个连续的寄存器进行读取或写入操作,可能涉及多个功能和参数的访问或改变。在传统的工作机理中,由于寄存器是真实存在的,并且与设备实际动作分离,多寄存器的操作不存在任何问题。但是,在低功耗特性设备的工作模式下,为了应对多寄存器的批量操作,在寄存器和设备实际动作执行之间需要独立出一层,用于负责对寄存器操作进行监视,分辨对寄存器读取或写入,明确指令波及的寄存器范围,以及影响到的功能模块区间,并根据影响的区间,将这些读写操作转换为一个或多个相关功能模块的动作,而后将这些动作结构整合起来,表现在寄存器层面上,最后再统一转换为Modbus 协议格式,对主机进行反馈。图6 展示了多寄存器操作与多动作触发的处理机制。
图6 多寄存器、多动作触发运行框架
搭建测试系统,结构如图7 所示。系统的传感器是应用于物理海洋观测的高精度CTD 传感器(测量温度、盐度、深度)。其实际工作环境位于 1 000 m深度的海洋中,通过科考船部署在制定区域,依赖自身的电池或者上位机(浮标系统)有限的电源工作[12],安装和维护成本非常高,因此必须具备超低功耗特性。整个系统的各个传感器与浮标系统主机之间均使用Modbus 协议进行通信。
图7 低功耗Modbus 通信测试系统
测试系统中使用 RS485 作为 Modbus 的通信物理层,使用海洋物性参数监测浮标的数据采集系统,开启标准Modbus 通信接口作为主站发送控制指令至 CTD 传感器,波特率为 9 600 b/s。经过RS485 电平转化芯片后,进入单片机的 UART 接口。CTD 传感器内部采用STM32L462 超低功耗单片机作为主控芯片,平时整个系统处于低功耗休眠模式,运行时钟关闭,串口模块功能处于打开状态,能够随时监听指令。
系统测试包含了传感器在休眠状态下的功耗、休眠唤醒功能、Modbus 指令处理功能、数据反馈功能、丢包率、响应速度、指令执行完后的功耗状态[13]。关键测试数据见表2,单次通信的电流消耗动态过程见图8。可以看出,在传感器中运行的低功耗模式 Modbus 协议,实现了数据的准确、有效通信,同时相对于传统协议,能够保持传感器长时间处于超低功耗状态。
表2 通信过程测试数据
图8 单次Modbus 通信过程电流消耗
本文针对具有超低功耗特性需求的Modbus 设备,设计了新的信息处理过程和动作触发机制,抽象了传统的寄存器概念,使得设备在兼容传统的Modbus 协议基础上,能够适应超低功耗休眠状态,最大程度上降低系统整体功耗。实验测试表明,应用该设计思想的嵌入式系统,能够正确响应主站指令,丢包率极低,响应速度快,可靠性高,设备在线时的功耗电流低于 10 μA。此外,该设计思想基于分层结构,可以面向多种设备的多种用途,具备可扩展性和可复制性,可以很好地应用在科学观测、工业测量、物联网等对功耗要求高的多种场合。