黃 飛
(中車大連機車研究所有限公司 電力電子事業(yè)部,遼寧 大連 116021)
機車微機顯示器是一個集成多種電子功能的司機室電子平臺,通過CAN總線與機車控制計算機通信,從而采集機車運行數(shù)據(jù)并顯示[1]。目前,應(yīng)用在機車上的微機顯示器所顯示的內(nèi)容都是開發(fā)人員設(shè)計的固定界面,雖然可以滿足司乘人員的駕駛需要,但當技術(shù)人員分析機車故障和調(diào)試機車時就顯得不方便。比如:故障表現(xiàn)在冷卻系統(tǒng),但原因出現(xiàn)在柴油機的潤滑系統(tǒng),這時技術(shù)人員就不能同時觀察兩個系統(tǒng)的參數(shù)。因此無論是機務(wù)部門還是機車生產(chǎn)廠商都迫切需要一種數(shù)據(jù)顯示方式更為靈活的機車微機顯示器。
針對以上問題,本文設(shè)計一種界面可編程的機車微機顯示系統(tǒng)軟件。界面可編程是本文提出的獨創(chuàng)性設(shè)計理念,本文所設(shè)計的機車微機顯示系統(tǒng)軟件為用戶提供若干沒有任何顯示參數(shù)的顯示界面,由用戶根據(jù)應(yīng)用需要為空白界面增加參數(shù),并可以保存、修改和刪除。本文基于嵌入式 Windows XP系統(tǒng),應(yīng)用Visual Basic開發(fā)系統(tǒng)軟件。應(yīng)用開源免費的SQlite3數(shù)據(jù)庫和INI文件作為配置文件。由于本軟件是基于嵌入式Windows XP系統(tǒng),所以在修改底層驅(qū)動之后可以快速移植到 PC機或工控機平臺,具有普遍應(yīng)用性。
本軟件整體架構(gòu)如圖1所示。整體軟件分為界面顯示與控制、界面編程數(shù)據(jù)采集與存儲、CAN通信處理三大部分。Visual Basic是微軟公司開發(fā)的一種基于對象的程序設(shè)計語言,為結(jié)構(gòu)化的、模塊化的、面向?qū)ο蟮目梢暬绦蛟O(shè)計語言[2]。擁有圖形用戶界面和快速應(yīng)用程序開發(fā)系統(tǒng),因此可以快速開發(fā)出機車微機顯示系統(tǒng)軟件的人機界面,本軟件即由Visual Basic開發(fā)。
應(yīng)用INI文件存儲界面編程基本信息。界面顯示變量的詳細信息由數(shù)據(jù)庫存儲。SQLite3數(shù)據(jù)庫不僅具有傳統(tǒng)數(shù)據(jù)庫的主要功能,還具有嵌入式體積小、占用資源少和支持移動技術(shù)等特性,常被用在PDA、車載設(shè)備、GPS定位和地圖顯示中[3]?;谝陨咸攸c,本文應(yīng)用SQLite3數(shù)據(jù)庫保存軟件中界面編程所產(chǎn)生的數(shù)據(jù),同時應(yīng)用 SQLite3數(shù)據(jù)庫保存需要本微機顯示系統(tǒng)處理的 CAN通信數(shù)據(jù)的解析信息,從而配合數(shù)據(jù)解析引擎實現(xiàn)數(shù)據(jù)高速解析。
圖1 軟件整體架構(gòu)Fig.1 S oftware architecture
首先介紹 INI配置文件的設(shè)計和數(shù)據(jù)庫設(shè)計,然后介紹本軟件的詳細設(shè)計。
INI是英文“初始化”(initialization)的縮寫。正如該術(shù)語所表示的,INI文件被用來對操作系統(tǒng)或特定程序初始化或進行參數(shù)設(shè)置[4]。文件格式由節(jié)和鍵組成,其中節(jié)用方括號括起來,單獨占一行,例如:[section]。鍵(key)又名屬性(property),單獨占一行用等號連接鍵名和鍵值,例如:name=value。
本文設(shè)計了3個INI文件,分別是chinese.ini,english.ini和 z_para.ini。其中 chinese.ini和 english.ini實現(xiàn)顯示系統(tǒng)語言切換,由于機車微機顯示系統(tǒng)涉及許多機車專有名詞,所有必須事先將所有名詞及對應(yīng)的英文編入文件。在窗體加載時,通過系統(tǒng)kernel32內(nèi)核提供的API接口GetPrivateProfileString讀出各顯示標簽對應(yīng)的顯示內(nèi)容。配置文件chinese.ini和english.ini的部分對比如表1所示,F(xiàn)C2_Main是主界面名,在文件中作為節(jié)名,該節(jié)下所有鍵對應(yīng)界面中的一個標簽,根據(jù)語言選擇不同的文件,同一個鍵的鍵值有中文也有英文,這樣則實現(xiàn)了中英文語言切換的效果。
表1 語言配置文件對比表Tab.1 Comparison of language configuration files
文件 z_para.ini用來存儲可編程界面的變量信息,文件的部分內(nèi)容如圖2所示。
文件 z_para.ini中的節(jié)對應(yīng)界面名,如圖[Undefined1]和[Undefined2]分別是界面未定義 1和未定義2。當界面沒有被編程時,如:未定義2,在[Undefined2]下的所有鍵的鍵值都為空。當界面被編程并保存時,如:未定義1,在[Undefined1]下,鍵para_id的鍵值是以變量個數(shù)開頭,變量id之間以分號分隔的字符串,鍵 para_name的鍵值是以變量個數(shù)開頭,變量名之間以分號分隔的字符串。
應(yīng)用 SQLite3可視化工具開發(fā)設(shè)計數(shù)據(jù)庫表格,部分表格如圖3所示。應(yīng)用數(shù)據(jù)庫存儲變量的信息,如圖3所示,para_id是變量的id號,每個變量有唯一的id號,程序中根據(jù)id號便可知該變量的顯示信息。項 para_name是變量的變量名,最終顯示界面顯示的變量標題便是這個字符串。變量相關(guān)的CAN數(shù)據(jù)幀ID是表中can_id,由于涉及保密通信協(xié)議細節(jié),所以此處以-1代替,并未提供真實幀ID信息。
圖2 文件z_para.iniFig.2 File z_para.ini
圖3 SQLite3表Fig.3 Table developed by SQLite3
本文僅介紹可編程界面的設(shè)計問題。可編程界面設(shè)計流程如圖4所示。
2.3.1 變量編輯界面的form_load事件
變量編輯界面如圖6所示,form_load事件是該界面的初始化事件,需要考慮的軟件邏輯包括所編輯的界面是第一次編程還是對已有的界面進行修改,SQlite3數(shù)據(jù)庫初始化工作。VB引用SQlite3數(shù)據(jù)庫的方法是:首先將 sqlite3.dll放在程序的路徑下,在VB工程中添加mSqlite.bas模塊,之后在程序中應(yīng)用mSqlite.bas模塊中的函數(shù)即可實現(xiàn)程序?qū)qlite3數(shù)據(jù)庫的全部操作[5]。SQlite3數(shù)據(jù)庫初始化代碼為 mSqlite.sqlite3_initialize(sPath),其中 sPath是數(shù)據(jù)庫的路徑,函數(shù)返回值為1時則初始化成功。打開本軟件所建立數(shù)據(jù)庫的代碼是 mSqlite.sqlite3_open("C:FC2_Codesys.db3", f_lSqlite),C:FC2_Codesys.db3是本軟件所使用數(shù)據(jù)庫的完整路徑和名稱,f_lSqlite是句柄,函數(shù)返回值為 1時則函數(shù)調(diào)用成功。在變量編輯界面的左邊是一個列表框,其初始狀態(tài)為空。初始化工作在即在這里完成,代碼如下:
圖4 可編程界面設(shè)計流程Fig.4 Process of programmable form
通過SQL語句中的SELECT語句將符合條件的變量名選出,通過列表框的additem方法添加,通過列表框的 selected方法實現(xiàn)光標的效果,執(zhí)行完以上代碼之后列表框list1便顯示出所有可編程變量選項。
2.3.2 方向按鈕事件
本文所設(shè)計軟件運行的硬件平臺不是觸摸屏,所有操作均由顯示器上的 8個按鈕執(zhí)行,8個按鈕分別對應(yīng)系統(tǒng)的F1到F8功能鍵。因此,本軟件邏輯也涉及到按鍵響應(yīng)問題。應(yīng)用Form_KeyUp作為按鍵響應(yīng)事件,通過傳遞的鍵值判斷所需要的操作。部分代碼如下:
變量 p_Row在程序中表示列表框中光標的位置,通過對它加減和列表框的 selected方法實現(xiàn)光標在列表框中的上下移動和翻頁。
2.3.3 選擇按鈕事件
變量編輯界面如圖6所示,界面右側(cè)標題為“已選變量”下面區(qū)域是一個列表框 list2,選擇按鈕事件就是確保list2變量數(shù)量不超限并選擇list1變量與list2變量不重復(fù)的前提下,在list2中添加list1中光標停留位置的變量名稱。之后,根據(jù)被選變量的名稱在數(shù)據(jù)庫中查找該變量的id號,最終將list2中所有變量的id號和名稱分別存儲在兩個字符串中。查找和存儲的部分代碼如下:
其中Label7.Caption是存儲變量id的,Label6.Caption是存儲變量名的,這兩個字符串都是相應(yīng)標簽控件的caption屬性,這樣設(shè)計有利于調(diào)試,在程序發(fā)布時將標簽設(shè)置為隱藏即可。
2.3.4 保存按鈕事件
將Label7.Caption和Label6.Caption保存到INI文件中,并且在字符串前加上變量數(shù)量,根據(jù)所選的可編程界面,存入不同的節(jié)名和鍵名下。通過windows內(nèi)核提供的API接口WritePrivateProfileString實現(xiàn)對INI的寫入[6],部分代碼如下:
2.3.5 按字母索引按鈕事件
進行27次循環(huán)計數(shù),計數(shù)值為0時代表列表框list1應(yīng)顯示全部變量,計數(shù)值為1至27時代表列表框list1應(yīng)顯示以A到Z開頭的變量。列表框list1顯示全部變量名稱的代碼與變量編輯界面的form_load事件中的一樣,列表框list1顯示以A到Z開頭的變量名稱通過SELECT LIKE語句實現(xiàn)[7],部分代碼如下:
2.3.6 主界面“選擇”按鈕事件
主界面如圖5所示,在主界面窗體程序中設(shè)置兩個表示光標方向的變量,根據(jù)列坐標可判斷當前光標在固定顯示界面還是可編程界面,根據(jù)行坐標便可確定操作人員希望進入的界面。以上得到確認后,首先加載下一個窗體,然后調(diào)用下一個窗體的show方法,最后卸載當前窗體[8]。這樣的設(shè)計保證同一時刻只用一個窗體在運行,有效控制了系統(tǒng)內(nèi)存和CPU占用率,同時避免了先卸載后加載過程中短暫顯示系統(tǒng)桌面的現(xiàn)象。
2.3.7 50 ms定時觸發(fā)事件
可編程數(shù)據(jù)顯示界面如圖 7所示,該界面的50ms定時器觸發(fā)事件實現(xiàn)顯示界面的刷新,數(shù)據(jù)解析工作。根據(jù)從 INI文件讀取的當前界面所顯示變量的名稱,為變量標題標簽組賦值。根據(jù)從 INI文件讀取的當前界面所顯示變量的 id,為變量單位標簽組賦值,同時id也確認了數(shù)據(jù)的解析方法。
本界面可編程的機車微機顯示系統(tǒng)軟件主界面如圖5所示,在界面上半部分顯示機車工況、牽引力等基本信息和報警信息。左半部分是按機車子系統(tǒng)或功能劃分的顯示界面,這些界面顯示內(nèi)容都是固定不變的。右半部分是9個可編程界面,在沒有對其編程時顯示標題為“未定義”。操作下面的方向按鈕可以使相應(yīng)位置的菜單光標變亮,操作功能按鈕可以選擇固定界面與可編程界面,也可以編輯可編程界面以及刪除之前編輯的可編程界面。
圖5 主界面Fig.5 Main form
按下編輯按鈕進入變量編輯界面如圖6所示。在該界面中可以選擇變量,同時為提高檢索效率,開發(fā)出了按變量單詞首字母檢索的功能。選擇完變量之后按保存按鈕,就可在主界面出現(xiàn)一個以編輯日期為標題的菜單。菜單的標題為月日時分秒,以實心點分隔。選擇并進入該菜單可以看之前編輯的變量,如圖7所示,對于數(shù)字量而言其數(shù)值顯示的“開”或“關(guān)”,對于模擬量而言其數(shù)值有效位不同且數(shù)值后面需有單位跟隨。
圖6 變量編輯界面Fig.6 V ariable edit form
圖7 可編程數(shù)據(jù)顯示界面Fig.7 Pr ogrammable data form
本文所設(shè)計的界面可編程的機車微機顯示系統(tǒng)軟件,打破以往同類型軟件的設(shè)計思路,創(chuàng)造性的提出了界面可編程的概念。目前,本軟件運行于國產(chǎn)某和諧型內(nèi)燃機車微機顯示屏,運行效果良好。本軟件為機車微機控制系統(tǒng)研發(fā)、出廠調(diào)試、機務(wù)運用、故障分析和排查提供了極大的支持。下一步將結(jié)合其他操作系統(tǒng)進行開發(fā),使本軟件成為一種跨平臺的通用性軟件。
[1] 溫陽東. 基于CAN總線的機車LCU通信系統(tǒng)設(shè)計[J]. 安徽大學(xué)學(xué)報(自然科學(xué)版), 2005, 29(4): 63-65.WEN Y D. The locomotive LCU system design based on CAN bus[J]. Journal of Anhui university natural science edition, 2005, 29(4): 63-65. (in Chinese)
[2] 張林峰, 羊四清. Visual Basic程序設(shè)計[M]. 北京: 中國鐵道出版社, 2009.ZHANG L F, YANG S Q. Visual Basic program design [M].Beijing: China Railway Press, 2009. (in Chinese)
[3] 劉玉海, 劉冰. SQLite嵌入式數(shù)據(jù)庫及圖象處理技術(shù)研究[J]. 軟件, 2012, 33(8): 102.LIU Y H, LIU B. SQLite Embedded Database and Image Processing Technology Research[J]. Software, 2012, 33(8):102. (in Chinese)
[4] 劉軍. 利用 VB 語言實現(xiàn)決策樹構(gòu)建算法的實驗研究[J].軟件, 2013, 34(1): 175-176.LIU J. Experiment Research On using VB to Construct Decision Tree[J]. Software, 2013,34(1): 175-176. (in Chinese)
[5] MICHAEL Owens, The Definitive Guide to SQLite[M]. US:APress, 2006.
[6] 周澤云, 向陽霞. 基于SQLite數(shù)據(jù)庫的裝備數(shù)據(jù)采集系統(tǒng)設(shè)計[J]. 四川兵工學(xué)報, 2014, 35(11): 61.ZHOU Z Y, XIANG Y X. Design of equipment data acquisition system based on SQLite [J]. Journal of Sichuan ordnance,2014, 35(11): 61. (in Chinese)
[7] 文奇. 基于VB與SQL的路譜管理系統(tǒng)設(shè)計與開發(fā)[J]. 包裝工程, 2012, 3(33): 81-84.WEN Q. Road spectrum system design based on VB and SQL[J]. Packaging engineering, 2012, 3(33): 81-84. (in Chinese)
[8] 李亞非. Visual Basic 程序設(shè)計教程[M]. 南京: 南京大學(xué)出版社, 2009.LI Y F. Program design course of Visual Basic [M]. Nanjing:Nanjing university press, 2009. (in Chinese)