蘇 芝, 朱鵠駿
(上海船舶運(yùn)輸科學(xué)研究所有限公司 艦船自動(dòng)化系統(tǒng)事業(yè)部, 上海 200135)
船舶機(jī)艙是船舶的“心臟”,也是發(fā)生火災(zāi)的可能性較高的區(qū)域之一。機(jī)艙內(nèi)的很多設(shè)備在運(yùn)行過程中都會(huì)產(chǎn)生油氣,當(dāng)油氣積累到一定程度之后,遇火源會(huì)爆燃,從而引發(fā)安全事故。同時(shí),未經(jīng)處理的油氣混合物排放到空氣中會(huì)造成大氣污染。因此,需對(duì)船舶機(jī)艙內(nèi)的油氣濃度進(jìn)行實(shí)時(shí)監(jiān)測(cè)控制。
傳統(tǒng)的船舶機(jī)艙油氣探測(cè)監(jiān)控報(bào)警系統(tǒng)通常采用傳感器采集機(jī)艙內(nèi)的油氣濃度,通過微處理器編程實(shí)現(xiàn)對(duì)油氣濃度的實(shí)時(shí)顯示、報(bào)警和記錄等功能。這種系統(tǒng)使傳感器數(shù)據(jù)讀取與監(jiān)控報(bào)警處在同一層次,不符合系統(tǒng)高內(nèi)聚、低耦合的設(shè)計(jì)要求,且其是采用C語言開發(fā)的,存在功能固定、可移植性差、不能跨平臺(tái)、配置難度大和維護(hù)成本高等不足。因此,有必要對(duì)監(jiān)控報(bào)警系統(tǒng)軟件進(jìn)行改進(jìn)。
面向?qū)ο蟮脑O(shè)計(jì)方式不僅能屏蔽底層硬件差異,給軟件應(yīng)用提供統(tǒng)一接口,使開發(fā)更工程化,而且能通過將面向?qū)ο蟮母呒?jí)語言與數(shù)據(jù)庫配合使用,使應(yīng)用更靈活,功能更強(qiáng)大,配置管理更方便,且具有跨平臺(tái)、可移植和可擴(kuò)展等優(yōu)勢(shì)。此外,將傳感器數(shù)據(jù)讀取與監(jiān)控報(bào)警等應(yīng)用分布于不同的應(yīng)用對(duì)象中,能降低系統(tǒng)的耦合度,提高系統(tǒng)的可維護(hù)性。本文介紹一種基于嵌入式操作系統(tǒng)(Embedded Operating System,EOS),采用面向?qū)ο蟮腝t/Embedded實(shí)現(xiàn)界面設(shè)計(jì)和開發(fā),利用SQLite數(shù)據(jù)庫進(jìn)行數(shù)據(jù)配置和存儲(chǔ)的新型油氣探測(cè)監(jiān)控軟件。
EOS具有操作方便、簡(jiǎn)單、提供的圖形用戶接口友好和易學(xué)易用等特性,目前在嵌入式操作系統(tǒng)開發(fā)領(lǐng)域,有近50%的項(xiàng)目采用Linux系統(tǒng)作為EOS。與VxWorks和WinCE相比,Linux不僅具有內(nèi)核小、效率高和可擴(kuò)性強(qiáng)等優(yōu)勢(shì),而且是免費(fèi)的,在價(jià)格上極具競(jìng)爭(zhēng)力,最重要的是其源代碼開放,能避免黑箱技術(shù),這與信息產(chǎn)業(yè)安全可控的發(fā)展目標(biāo)是一致的。因此,本文所述操作系統(tǒng)采用成熟穩(wěn)定的嵌入式Linux系統(tǒng),版本為3.10.32。
Qt/Embedded是一個(gè)專門為嵌入式系統(tǒng)設(shè)計(jì)圖形用戶界面的工具包,是挪威Trolltech公司的Qt的嵌入式版本,不僅具有開源代碼和詳盡的API(Application Programming Interface)文檔,以及模塊化設(shè)計(jì)可裁減(最小只有600 KB左右)、可移植性好、有自己的窗口系統(tǒng)、可直接對(duì)底層圖形驅(qū)動(dòng)進(jìn)行操作、支持多種硬件和軟件輸入及可連接數(shù)據(jù)庫等特點(diǎn),而且基于X Windows(X11)的Qt程序,在經(jīng)過Qt/Embedded的庫和工具編譯之后,可直接移植到嵌入式平臺(tái)上運(yùn)行,不需要修改代碼,能大大提高開發(fā)效率,降低開發(fā)和維護(hù)成本。Qt/Embedded和Qt/X11的體系結(jié)構(gòu)見圖1。
圖1 Qt/Embedded和Qt/X11的體系結(jié)構(gòu)
因此,采用在Qt/X11上開發(fā)應(yīng)用程序,調(diào)試完成并重新編譯之后將其移植到嵌入式平臺(tái)上運(yùn)行的方法,使開發(fā)人員能在熟悉的開發(fā)平臺(tái)上進(jìn)行軟件開發(fā),不需要重新學(xué)習(xí)和適應(yīng)新的平臺(tái),大大節(jié)省開發(fā)時(shí)間,同時(shí)便于維護(hù)。
SQLite是一款輕量級(jí)、跨平臺(tái)且向后兼容、文件格式穩(wěn)定、開源的關(guān)系型數(shù)據(jù)庫,占用的資源較少,處理速度較快,不需要運(yùn)行獨(dú)立數(shù)據(jù)庫引擎,可同應(yīng)用一起編譯。此外,與My SQL、Oracle和Postgre SQL等其他主流數(shù)據(jù)庫不同,SQLite非常適合嵌入式系統(tǒng)使用。在開發(fā)嵌入式系統(tǒng)時(shí),SQLite無論是在配置和事務(wù)功能方面,還是在內(nèi)存開銷和讀寫性能方面,都具有獨(dú)特的優(yōu)勢(shì)。基于上述優(yōu)點(diǎn),采用數(shù)據(jù)庫SQLite Expert Professional 3.0實(shí)現(xiàn)對(duì)數(shù)據(jù)的配置和存儲(chǔ),不僅內(nèi)存開銷小、讀寫速度快,而且操作簡(jiǎn)單、方便。
在船舶監(jiān)控系統(tǒng)中,CAN總線通信是一種比較常用的通信方式,不僅成本低,而且使用可靠。因此,本文采用Linux系統(tǒng)下的SocketCAN通信方式實(shí)現(xiàn)CAN總線數(shù)據(jù)通信。
在Linux系統(tǒng)中,采用SocketCAN通信方式進(jìn)行CAN總線數(shù)據(jù)通信,該方式與常用的Windows系統(tǒng)下的CAN總線通信略有不同,具體的操作和使用如下。
1) 在開發(fā)之前將已生成的CAN驅(qū)動(dòng)動(dòng)態(tài)鏈接庫拷貝到Qt相應(yīng)的路徑下,執(zhí)行以下命令:
cp mcuzone/libcan.so mcuzone/nfsroot/roots_bulid/qt486/lib。
2) 在工程文件中添加所需庫。一般Qt工程文件是直接編譯生成的,不需要改動(dòng),且相比Windows系統(tǒng)引入外部動(dòng)態(tài)庫,只需在所需的頭文件中引入即可,Linux系統(tǒng)還需在工程文件xx.pro中添加動(dòng)態(tài)庫的路徑和名稱,具體為
LIBS +=-L /tmp/-lcan
(1)
3) 在程序中應(yīng)用CAN驅(qū)動(dòng)。引入CAN驅(qū)動(dòng)之后,還需在程序中添加相應(yīng)的頭文件和外部CAN接口函數(shù)。此外,與Windows系統(tǒng)下的操作不同的還有,Linux系統(tǒng)中采用建立綁定套接字接口的方式進(jìn)行CAN初始化,具體如下。
(1) 引入和使用CAN接口函數(shù):
(2) SocketCAN套接字接口程序:
4) 接收和發(fā)送CAN數(shù)據(jù)。在Linux系統(tǒng)中,SocketCAN通信方式采用read()和write()函數(shù)接收和發(fā)送數(shù)據(jù),實(shí)現(xiàn)信息交換,具體如下。
(1) SocketCAN接收數(shù)據(jù):
(2) SocketCAN發(fā)送數(shù)據(jù):
Linux系統(tǒng)與Windows系統(tǒng)在編碼上有顯著差別,Windows系統(tǒng)默認(rèn)的是GBK(gb2312),而Linux系統(tǒng)默認(rèn)的是UTF-8。同時(shí),Linux系統(tǒng)中自帶的Qt字庫默認(rèn)不支持中文顯示,因此要進(jìn)行如下操作。
1) 需將系統(tǒng)中的中文字庫復(fù)制到Qt字庫中,執(zhí)行命令:
cp urs/share/fonts/truetype/wqy/wqy-miorohei.ttc
mcuzone/nfsroot/roots_bulid/qt486/lib/fonts
2) 在所建工程的main.cpp中引入支持的中文字庫,具體設(shè)置如下:
該軟件采用Qt/Embedded庫的3層結(jié)構(gòu),即Qt/Embedded(上層控件層)、Qt核心庫(上層圖形層)、圖形引擎和數(shù)據(jù)驅(qū)動(dòng)層,具體結(jié)構(gòu)見圖2。
圖2 Qt/Embedded結(jié)構(gòu)
1) 在上層控件層,利用Qt Creator工具開發(fā)基于Dialog的GUI圖形界面應(yīng)用程序,接收輸入模塊采集并轉(zhuǎn)換的氣體變送器濃度數(shù)據(jù),實(shí)時(shí)監(jiān)控機(jī)艙內(nèi)的氣體變送器濃度數(shù)據(jù),當(dāng)濃度達(dá)到限值時(shí)進(jìn)行聲光報(bào)警。同時(shí),該層具有歷史數(shù)據(jù)查詢等功能。軟件框架設(shè)計(jì)見圖3。
圖3 軟件框架設(shè)計(jì)
2) 在上層圖形層獲得幀緩沖驅(qū)動(dòng)體系所需的具體硬件信息,為下一層驅(qū)動(dòng)提供支持,同時(shí)使底層Linux的幀緩沖驅(qū)動(dòng)圖形操作抽象化(如畫刷、畫線等),供上一層控件使用。
3) 在圖形引擎和數(shù)據(jù)驅(qū)動(dòng)層,將下一層輸入設(shè)備的輸入信息抽象為具體的事件,并直接對(duì)底層的緩沖驅(qū)動(dòng)進(jìn)行訪問。
該軟件的人機(jī)界面主要承擔(dān)系統(tǒng)圖、實(shí)時(shí)數(shù)據(jù)、網(wǎng)絡(luò)圖、歷史數(shù)據(jù)查詢與報(bào)警和設(shè)置等功能。人機(jī)界面設(shè)計(jì)主要分為標(biāo)題欄、菜單欄和界面顯示等3部分。
1) 標(biāo)題欄主要顯示單位Logo、單位名稱、最新一條報(bào)警和報(bào)警數(shù)量,使用戶能很方便地查看當(dāng)前最新的報(bào)警信息,并了解當(dāng)前有多少報(bào)警信息需要處理。
2) 菜單欄主要根據(jù)需求顯示系統(tǒng)圖、實(shí)時(shí)數(shù)據(jù)、網(wǎng)絡(luò)圖、歷史事件和設(shè)置。用戶可便捷地進(jìn)行界面查看和切換操作。
3) 在Qt Designer設(shè)計(jì)窗體界面,均采用自主設(shè)計(jì)開發(fā)控件的方式實(shí)現(xiàn)整體界面開發(fā),不僅復(fù)用性好,而且便于后續(xù)維護(hù)。
系統(tǒng)圖以圖形的方式顯示參數(shù),包括氣體變送器濃度和風(fēng)機(jī)啟動(dòng)信號(hào);網(wǎng)絡(luò)圖以圖形的方式顯示系統(tǒng)網(wǎng)絡(luò)圖,包括系統(tǒng)連接和CAN網(wǎng)通斷;歷史事件以表格的方式顯示參數(shù),包括報(bào)警、消警、應(yīng)答、風(fēng)機(jī)啟動(dòng)信號(hào)、風(fēng)機(jī)啟動(dòng)信號(hào)恢復(fù)、變送器斷線、變送器斷線恢復(fù)、CAN網(wǎng)斷開和CAN網(wǎng)恢復(fù)等;設(shè)置顯示亮度調(diào)節(jié)(通過“+”和“-”按鈕進(jìn)行亮度調(diào)節(jié))和軟件版本號(hào)等信息。
3.3.1 實(shí)時(shí)數(shù)據(jù)處理
該模塊的功能是對(duì)接收的氣體變送器濃度數(shù)據(jù)進(jìn)行加工處理,并根據(jù)該數(shù)據(jù)是否達(dá)到報(bào)警限值進(jìn)行相應(yīng)的報(bào)警處理和記錄,同時(shí)在相應(yīng)的監(jiān)控界面顯示,便于用戶實(shí)時(shí)查看和處理。根據(jù)接收的氣體變送器濃度判斷氣體變送器是否有斷線故障,若有,則設(shè)置氣體變送器為斷線狀態(tài),否則判斷氣體變送器濃度是否達(dá)到報(bào)警限值,若達(dá)到報(bào)警限值,則進(jìn)行報(bào)警顯示,啟動(dòng)抽風(fēng)機(jī),發(fā)出報(bào)警信號(hào),并進(jìn)行相應(yīng)的報(bào)警記錄。具體的實(shí)時(shí)氣體變送器數(shù)據(jù)處理流程見圖4。
圖4 實(shí)時(shí)氣體變送器數(shù)據(jù)處理流程
3.3.2 SocketCAN模塊
該模塊的功能是建立底層與上層軟件的數(shù)據(jù)通信,實(shí)現(xiàn)系統(tǒng)客戶端與數(shù)據(jù)采集和控制端的數(shù)據(jù)交換,便于對(duì)數(shù)據(jù)進(jìn)行實(shí)時(shí)更新處理。首先,采用SocketCAN通信方式進(jìn)行CAN總線數(shù)據(jù)通信,通過初始化,調(diào)用socket()函數(shù)建立一個(gè)套接字,選擇CAN接口;其次,調(diào)用bind()函數(shù),將該套接字與CAN套接字地址綁定;最后,通過read()函數(shù)和write()函數(shù)進(jìn)行數(shù)據(jù)的實(shí)時(shí)接收和發(fā)送處理。具體的SocketCAN程序流程見圖5。
圖5 SocketCAN程序流程
上述配置和開發(fā)工作完成之后,運(yùn)行程序就可得到油氣探測(cè)監(jiān)控軟件,具體展示以系統(tǒng)圖為例,見圖6。
圖6 系統(tǒng)圖界面
本文詳細(xì)介紹了基于嵌入式Linux系統(tǒng)開發(fā)的新型油氣探測(cè)監(jiān)控軟件。該軟件將通信、監(jiān)測(cè)報(bào)警和圖形顯示等功能分布到不同的對(duì)象模塊中,實(shí)現(xiàn)了油氣探測(cè)系統(tǒng)需要的信息集中采集、顯示、報(bào)警和記錄等功能。該軟件通過將面向?qū)ο蟮母呒?jí)開發(fā)語言(Qt/Embedded)與數(shù)據(jù)庫(SQLite)配合使用,降低了系統(tǒng)軟件的耦合度,提高了系統(tǒng)軟件的可維護(hù)性,達(dá)到了軟件跨平臺(tái)、可移植、可擴(kuò)展的設(shè)計(jì)要求,具有界面美觀友好、操作簡(jiǎn)單、功能豐富和管理方便等優(yōu)點(diǎn)。此外,通過開發(fā)該軟件,總結(jié)出了一種通用的控制模塊軟件開發(fā)方式,可在船舶監(jiān)控系統(tǒng)中推廣使用,進(jìn)一步降低船舶監(jiān)控系統(tǒng)軟件開發(fā)的復(fù)雜度和維護(hù)成本,提高軟件開發(fā)的效率。