苏 芝, 朱鹄骏
(上海船舶运输科学研究所有限公司 舰船自动化系统事业部, 上海 200135)
船舶机舱是船舶的“心脏”,也是发生火灾的可能性较高的区域之一。机舱内的很多设备在运行过程中都会产生油气,当油气积累到一定程度之后,遇火源会爆燃,从而引发安全事故。同时,未经处理的油气混合物排放到空气中会造成大气污染。因此,需对船舶机舱内的油气浓度进行实时监测控制。
传统的船舶机舱油气探测监控报警系统通常采用传感器采集机舱内的油气浓度,通过微处理器编程实现对油气浓度的实时显示、报警和记录等功能。这种系统使传感器数据读取与监控报警处在同一层次,不符合系统高内聚、低耦合的设计要求,且其是采用C语言开发的,存在功能固定、可移植性差、不能跨平台、配置难度大和维护成本高等不足。因此,有必要对监控报警系统软件进行改进。
面向对象的设计方式不仅能屏蔽底层硬件差异,给软件应用提供统一接口,使开发更工程化,而且能通过将面向对象的高级语言与数据库配合使用,使应用更灵活,功能更强大,配置管理更方便,且具有跨平台、可移植和可扩展等优势。此外,将传感器数据读取与监控报警等应用分布于不同的应用对象中,能降低系统的耦合度,提高系统的可维护性。本文介绍一种基于嵌入式操作系统(Embedded Operating System,EOS),采用面向对象的Qt/Embedded实现界面设计和开发,利用SQLite数据库进行数据配置和存储的新型油气探测监控软件。
EOS具有操作方便、简单、提供的图形用户接口友好和易学易用等特性,目前在嵌入式操作系统开发领域,有近50%的项目采用Linux系统作为EOS。与VxWorks和WinCE相比,Linux不仅具有内核小、效率高和可扩性强等优势,而且是免费的,在价格上极具竞争力,最重要的是其源代码开放,能避免黑箱技术,这与信息产业安全可控的发展目标是一致的。因此,本文所述操作系统采用成熟稳定的嵌入式Linux系统,版本为3.10.32。
Qt/Embedded是一个专门为嵌入式系统设计图形用户界面的工具包,是挪威Trolltech公司的Qt的嵌入式版本,不仅具有开源代码和详尽的API(Application Programming Interface)文档,以及模块化设计可裁减(最小只有600 KB左右)、可移植性好、有自己的窗口系统、可直接对底层图形驱动进行操作、支持多种硬件和软件输入及可连接数据库等特点,而且基于X Windows(X11)的Qt程序,在经过Qt/Embedded的库和工具编译之后,可直接移植到嵌入式平台上运行,不需要修改代码,能大大提高开发效率,降低开发和维护成本。Qt/Embedded和Qt/X11的体系结构见图1。
图1 Qt/Embedded和Qt/X11的体系结构
因此,采用在Qt/X11上开发应用程序,调试完成并重新编译之后将其移植到嵌入式平台上运行的方法,使开发人员能在熟悉的开发平台上进行软件开发,不需要重新学习和适应新的平台,大大节省开发时间,同时便于维护。
SQLite是一款轻量级、跨平台且向后兼容、文件格式稳定、开源的关系型数据库,占用的资源较少,处理速度较快,不需要运行独立数据库引擎,可同应用一起编译。此外,与My SQL、Oracle和Postgre SQL等其他主流数据库不同,SQLite非常适合嵌入式系统使用。在开发嵌入式系统时,SQLite无论是在配置和事务功能方面,还是在内存开销和读写性能方面,都具有独特的优势。基于上述优点,采用数据库SQLite Expert Professional 3.0实现对数据的配置和存储,不仅内存开销小、读写速度快,而且操作简单、方便。
在船舶监控系统中,CAN总线通信是一种比较常用的通信方式,不仅成本低,而且使用可靠。因此,本文采用Linux系统下的SocketCAN通信方式实现CAN总线数据通信。
在Linux系统中,采用SocketCAN通信方式进行CAN总线数据通信,该方式与常用的Windows系统下的CAN总线通信略有不同,具体的操作和使用如下。
1) 在开发之前将已生成的CAN驱动动态链接库拷贝到Qt相应的路径下,执行以下命令:
cp mcuzone/libcan.so mcuzone/nfsroot/roots_bulid/qt486/lib。
2) 在工程文件中添加所需库。一般Qt工程文件是直接编译生成的,不需要改动,且相比Windows系统引入外部动态库,只需在所需的头文件中引入即可,Linux系统还需在工程文件xx.pro中添加动态库的路径和名称,具体为
LIBS +=-L /tmp/-lcan
(1)
3) 在程序中应用CAN驱动。引入CAN驱动之后,还需在程序中添加相应的头文件和外部CAN接口函数。此外,与Windows系统下的操作不同的还有,Linux系统中采用建立绑定套接字接口的方式进行CAN初始化,具体如下。
(1) 引入和使用CAN接口函数:
(2) SocketCAN套接字接口程序:
4) 接收和发送CAN数据。在Linux系统中,SocketCAN通信方式采用read()和write()函数接收和发送数据,实现信息交换,具体如下。
(1) SocketCAN接收数据:
(2) SocketCAN发送数据:
Linux系统与Windows系统在编码上有显著差别,Windows系统默认的是GBK(gb2312),而Linux系统默认的是UTF-8。同时,Linux系统中自带的Qt字库默认不支持中文显示,因此要进行如下操作。
1) 需将系统中的中文字库复制到Qt字库中,执行命令:
cp urs/share/fonts/truetype/wqy/wqy-miorohei.ttc
mcuzone/nfsroot/roots_bulid/qt486/lib/fonts
2) 在所建工程的main.cpp中引入支持的中文字库,具体设置如下:
该软件采用Qt/Embedded库的3层结构,即Qt/Embedded(上层控件层)、Qt核心库(上层图形层)、图形引擎和数据驱动层,具体结构见图2。
图2 Qt/Embedded结构
1) 在上层控件层,利用Qt Creator工具开发基于Dialog的GUI图形界面应用程序,接收输入模块采集并转换的气体变送器浓度数据,实时监控机舱内的气体变送器浓度数据,当浓度达到限值时进行声光报警。同时,该层具有历史数据查询等功能。软件框架设计见图3。
图3 软件框架设计
2) 在上层图形层获得帧缓冲驱动体系所需的具体硬件信息,为下一层驱动提供支持,同时使底层Linux的帧缓冲驱动图形操作抽象化(如画刷、画线等),供上一层控件使用。
3) 在图形引擎和数据驱动层,将下一层输入设备的输入信息抽象为具体的事件,并直接对底层的缓冲驱动进行访问。
该软件的人机界面主要承担系统图、实时数据、网络图、历史数据查询与报警和设置等功能。人机界面设计主要分为标题栏、菜单栏和界面显示等3部分。
1) 标题栏主要显示单位Logo、单位名称、最新一条报警和报警数量,使用户能很方便地查看当前最新的报警信息,并了解当前有多少报警信息需要处理。
2) 菜单栏主要根据需求显示系统图、实时数据、网络图、历史事件和设置。用户可便捷地进行界面查看和切换操作。
3) 在Qt Designer设计窗体界面,均采用自主设计开发控件的方式实现整体界面开发,不仅复用性好,而且便于后续维护。
系统图以图形的方式显示参数,包括气体变送器浓度和风机启动信号;网络图以图形的方式显示系统网络图,包括系统连接和CAN网通断;历史事件以表格的方式显示参数,包括报警、消警、应答、风机启动信号、风机启动信号恢复、变送器断线、变送器断线恢复、CAN网断开和CAN网恢复等;设置显示亮度调节(通过“+”和“-”按钮进行亮度调节)和软件版本号等信息。
3.3.1 实时数据处理
该模块的功能是对接收的气体变送器浓度数据进行加工处理,并根据该数据是否达到报警限值进行相应的报警处理和记录,同时在相应的监控界面显示,便于用户实时查看和处理。根据接收的气体变送器浓度判断气体变送器是否有断线故障,若有,则设置气体变送器为断线状态,否则判断气体变送器浓度是否达到报警限值,若达到报警限值,则进行报警显示,启动抽风机,发出报警信号,并进行相应的报警记录。具体的实时气体变送器数据处理流程见图4。
图4 实时气体变送器数据处理流程
3.3.2 SocketCAN模块
该模块的功能是建立底层与上层软件的数据通信,实现系统客户端与数据采集和控制端的数据交换,便于对数据进行实时更新处理。首先,采用SocketCAN通信方式进行CAN总线数据通信,通过初始化,调用socket()函数建立一个套接字,选择CAN接口;其次,调用bind()函数,将该套接字与CAN套接字地址绑定;最后,通过read()函数和write()函数进行数据的实时接收和发送处理。具体的SocketCAN程序流程见图5。
图5 SocketCAN程序流程
上述配置和开发工作完成之后,运行程序就可得到油气探测监控软件,具体展示以系统图为例,见图6。
图6 系统图界面
本文详细介绍了基于嵌入式Linux系统开发的新型油气探测监控软件。该软件将通信、监测报警和图形显示等功能分布到不同的对象模块中,实现了油气探测系统需要的信息集中采集、显示、报警和记录等功能。该软件通过将面向对象的高级开发语言(Qt/Embedded)与数据库(SQLite)配合使用,降低了系统软件的耦合度,提高了系统软件的可维护性,达到了软件跨平台、可移植、可扩展的设计要求,具有界面美观友好、操作简单、功能丰富和管理方便等优点。此外,通过开发该软件,总结出了一种通用的控制模块软件开发方式,可在船舶监控系统中推广使用,进一步降低船舶监控系统软件开发的复杂度和维护成本,提高软件开发的效率。