本文介绍的隧道环境监控系统,利用区域控制部分的实时监控技术对各监控点的照明亮度、能见度、CO浓度、烟雾浓度等参数进行采集、监测,并根据这些参数控制相关的交通灯、应急灯、LED交通指示牌、限速牌以及报警装置。然后通过现场总线将各节点的参数和报警信号发送至本地监控中心,由本地控制中心对各区域控制模块进行调度。本地控制中心还将这些参数通过以太网发送至远程监控终端处,在终端上远程监控隧道的环境参数。
1 系统总体结构
系统的总体结构如图1所示。系统主要包括区域控制部分、本地控制中心和远程监控终端。

由于CAN总线协议不对节点进行地址编码,而是采用对通信数据块进行编码的方式,这使得CAN总线上的节点数量理论上几乎不受限制[2]。然而实际上,由于存在电气特性上的限制,CAN总线上节点数量不宜超过100个。因此各个区域控制模块与本地控制中心使用另一条CAN总线进行数据通信。区域控制模块在采集到环境参数并做出控制动作后会将参数打包通过CAN总线发送至本地控制中心的工控机。本地控制中心如收到某个区域控制部分的报警信号,会根据报警信号类型对该区域控制部分前方的各区域控制部分做出控制,提前预警车辆隧道前方通行环境存在问题。
远程控制终端通过客户端的显示程序显示出由本地控制中心发送的隧道环境参数,并将参数保存在数据库,以实现历史数据的存储。
2 系统硬件设计
整个系统硬件部分包括由区域控制模块和各环境参数测量模块组成的区域控制部分、本地控制中心的工控机以及监控终端。其中关键部分为区域控制部分,本文将对这部分进行重点介绍。
区域控制模块选用意法半导体公司的STM32F105RCT6为控制核心,它是采用ARM Cortex-M3为内核的32位高性能嵌入式微处理器。它集成了两个CAN控制器,并为每个CAN控制器分配了256 B的SRAM,每个CAN控制器有三个发送邮箱和两个接收FIFO[1]。模块的其他外设包括用于CAN总线信号收发的CAN收发器,用于显示当前环境参数的点阵液晶,用于实现基本控制功能的按键等。区域控制模块的硬件框图如图2所示。

能见度测量模块由能见度检测仪和控制模块组成。能见度检测仪能将检测到的能见度值通过RS232发送至控制模块。当区域控制模块向能见度测量模块中的控制模块请求数据时,控制模块会使能见度检测仪通过RS232向控制模块发送数据,并转换成CAN数据包发送至CAN总线。其他测量模块工作模式与能见度测量模块相同。
3 区域控制模块软件设计
由于区域控制部分在测量环境参数以及控制相应设施方面对实时性和稳定性要求,区域控制模块选择使用μC/OS-II管理控制任务的调度。μC/OS-II是一个专为嵌入式应用设计,基于优先级调度的抢占式实时操作系统内核,它包含了任务调度、任务管理、时间管理/任务间通信与同步等功能。各任务之间通过信号量、邮箱和消息队列实现相互间的数据交换和同步[3]。
根据区域控制模块在系统中的作用,嵌入式操作系统中应实现多个不同优先级的控制任务。这些任务按照优先级由高到低分别为:接收本地控制中心调度;接收按键控制;采集环境参数;控制相关设备;显示环境参数;发送数据到本地控制中心。对于区域控制系统来说,本地控制中心的调度命令决定着它的系统设置,因此需要把接受本地控制中心调度任务分配到相对最高的优先级。其他任务也根据相对的重要性和执行顺序分配相应的优先级。系统启动流程图如图3所示。

环境参数采集任务和控制设备任务中CAN总线使用CAN 2.0B协议,波特率设置为250 kb/s。STM32F105RCT6的CAN控制器中包含28个共享的可配置标识符过滤器组。通过过滤器组的设置,配合使用不同的接收FIFO寄存器,可以在硬件上设置区分不同标识符的报文。每收到一帧报文,首先与过滤器组中设置的报文ID进行比较。报文如果与过滤器组中设置的环境参数报文的ID匹配则将报文送入接收FIFO0寄存器,如果与过滤器组中控制报文的ID匹配则将报文送入接收FIFO1寄存器,如果都不匹配,则认定此报文为垃圾报文,直接丢弃。
环境参数采集采用轮询的方式,由区域控制模块轮询请求各数据采集点的数据,轮询时间间隔为1 s,轮询由任务延时函数OSTimeDLY()实现。在接收到所有环境参数采集点的数据后,这些参数将被存入共享内存。接着通过OSTimeDLY()函数的调用,实现将当前任务挂起,并延时时钟节拍1 s,然后调用OSSched()进行任务重新调度。在指定的时钟节拍到来之后,当前任务会被恢复为就绪状态。环境参数采集任务流程图如图4所示。

接收本地控制中心调度任务和按键控制任务在创建之后就通过调用OSTaskSuspend()函数进入挂起状态,当接收到调度命令和按键中断以后,才会通过调用OSTaskResume()函数恢复任务,实现任务的执行。
本文给出了基于CAN总线的隧道环境监控系统的软硬件设计方法。系统中区域控制模块采用高性能嵌入式微处理器和嵌入式实时操作系统为核心,并使用稳定的工业现场总线,保证了系统的高可靠性和高实时性,满足了隧道环境的监控需求。
参考文献
[1] 王永虹,徐炜,郝立平.STM32系列ARM Cortex-M3微控制器原理与实践[M].北京:北京航空航天大学出版社,2008.
[2] 饶运涛,邹继军,郑勇芸.现场总线CAN原理与应用技术[M].北京:北京航空航天大学出版社,2003.
[3] 肖圣兵,肖红菊.μC/OS-II 在ARM Cortex-M3处理器上的移植[J].电子技术,2010(7):54-55,51.