黃 飛
(中車大連機車研究所有限公司 電力電子事業部,遼寧 大連 116021)
機車微機顯示器是一個集成多種電子功能的司機室電子平臺,通過CAN總線與機車控制計算機通信,從而采集機車運行數據并顯示[1]。目前,應用在機車上的微機顯示器所顯示的內容都是開發人員設計的固定界面,雖然可以滿足司乘人員的駕駛需要,但當技術人員分析機車故障和調試機車時就顯得不方便。比如:故障表現在冷卻系統,但原因出現在柴油機的潤滑系統,這時技術人員就不能同時觀察兩個系統的參數。因此無論是機務部門還是機車生產廠商都迫切需要一種數據顯示方式更為靈活的機車微機顯示器。
針對以上問題,本文設計一種界面可編程的機車微機顯示系統軟件。界面可編程是本文提出的獨創性設計理念,本文所設計的機車微機顯示系統軟件為用戶提供若干沒有任何顯示參數的顯示界面,由用戶根據應用需要為空白界面增加參數,并可以保存、修改和刪除。本文基于嵌入式 Windows XP系統,應用Visual Basic開發系統軟件。應用開源免費的SQlite3數據庫和INI文件作為配置文件。由于本軟件是基于嵌入式Windows XP系統,所以在修改底層驅動之后可以快速移植到 PC機或工控機平臺,具有普遍應用性。
本軟件整體架構如圖1所示。整體軟件分為界面顯示與控制、界面編程數據采集與存儲、CAN通信處理三大部分。Visual Basic是微軟公司開發的一種基于對象的程序設計語言,為結構化的、模塊化的、面向對象的可視化程序設計語言[2]。擁有圖形用戶界面和快速應用程序開發系統,因此可以快速開發出機車微機顯示系統軟件的人機界面,本軟件即由Visual Basic開發。
應用INI文件存儲界面編程基本信息。界面顯示變量的詳細信息由數據庫存儲。SQLite3數據庫不僅具有傳統數據庫的主要功能,還具有嵌入式體積小、占用資源少和支持移動技術等特性,常被用在PDA、車載設備、GPS定位和地圖顯示中[3]。基于以上特點,本文應用SQLite3數據庫保存軟件中界面編程所產生的數據,同時應用 SQLite3數據庫保存需要本微機顯示系統處理的 CAN通信數據的解析信息,從而配合數據解析引擎實現數據高速解析。

圖1 軟件整體架構Fig.1 S oftware architecture
首先介紹 INI配置文件的設計和數據庫設計,然后介紹本軟件的詳細設計。
INI是英文“初始化”(initialization)的縮寫。正如該術語所表示的,INI文件被用來對操作系統或特定程序初始化或進行參數設置[4]。文件格式由節和鍵組成,其中節用方括號括起來,單獨占一行,例如:[section]。鍵(key)又名屬性(property),單獨占一行用等號連接鍵名和鍵值,例如:name=value。
本文設計了3個INI文件,分別是chinese.ini,english.ini和 z_para.ini。其中 chinese.ini和 english.ini實現顯示系統語言切換,由于機車微機顯示系統涉及許多機車專有名詞,所有必須事先將所有名詞及對應的英文編入文件。在窗體加載時,通過系統kernel32內核提供的API接口GetPrivateProfileString讀出各顯示標簽對應的顯示內容。配置文件chinese.ini和english.ini的部分對比如表1所示,FC2_Main是主界面名,在文件中作為節名,該節下所有鍵對應界面中的一個標簽,根據語言選擇不同的文件,同一個鍵的鍵值有中文也有英文,這樣則實現了中英文語言切換的效果。

表1 語言配置文件對比表Tab.1 Comparison of language configuration files
文件 z_para.ini用來存儲可編程界面的變量信息,文件的部分內容如圖2所示。
文件 z_para.ini中的節對應界面名,如圖[Undefined1]和[Undefined2]分別是界面未定義 1和未定義2。當界面沒有被編程時,如:未定義2,在[Undefined2]下的所有鍵的鍵值都為空。當界面被編程并保存時,如:未定義1,在[Undefined1]下,鍵para_id的鍵值是以變量個數開頭,變量id之間以分號分隔的字符串,鍵 para_name的鍵值是以變量個數開頭,變量名之間以分號分隔的字符串。
應用 SQLite3可視化工具開發設計數據庫表格,部分表格如圖3所示。應用數據庫存儲變量的信息,如圖3所示,para_id是變量的id號,每個變量有唯一的id號,程序中根據id號便可知該變量的顯示信息。項 para_name是變量的變量名,最終顯示界面顯示的變量標題便是這個字符串。變量相關的CAN數據幀ID是表中can_id,由于涉及保密通信協議細節,所以此處以-1代替,并未提供真實幀ID信息。

圖2 文件z_para.iniFig.2 File z_para.ini

圖3 SQLite3表Fig.3 Table developed by SQLite3
本文僅介紹可編程界面的設計問題。可編程界面設計流程如圖4所示。
2.3.1 變量編輯界面的form_load事件
變量編輯界面如圖6所示,form_load事件是該界面的初始化事件,需要考慮的軟件邏輯包括所編輯的界面是第一次編程還是對已有的界面進行修改,SQlite3數據庫初始化工作。VB引用SQlite3數據庫的方法是:首先將 sqlite3.dll放在程序的路徑下,在VB工程中添加mSqlite.bas模塊,之后在程序中應用mSqlite.bas模塊中的函數即可實現程序對sqlite3數據庫的全部操作[5]。SQlite3數據庫初始化代碼為 mSqlite.sqlite3_initialize(sPath),其中 sPath是數據庫的路徑,函數返回值為1時則初始化成功。打開本軟件所建立數據庫的代碼是 mSqlite.sqlite3_open("C:FC2_Codesys.db3", f_lSqlite),C:FC2_Codesys.db3是本軟件所使用數據庫的完整路徑和名稱,f_lSqlite是句柄,函數返回值為 1時則函數調用成功。在變量編輯界面的左邊是一個列表框,其初始狀態為空。初始化工作在即在這里完成,代碼如下:

圖4 可編程界面設計流程Fig.4 Process of programmable form


通過SQL語句中的SELECT語句將符合條件的變量名選出,通過列表框的additem方法添加,通過列表框的 selected方法實現光標的效果,執行完以上代碼之后列表框list1便顯示出所有可編程變量選項。
2.3.2 方向按鈕事件
本文所設計軟件運行的硬件平臺不是觸摸屏,所有操作均由顯示器上的 8個按鈕執行,8個按鈕分別對應系統的F1到F8功能鍵。因此,本軟件邏輯也涉及到按鍵響應問題。應用Form_KeyUp作為按鍵響應事件,通過傳遞的鍵值判斷所需要的操作。部分代碼如下:

變量 p_Row在程序中表示列表框中光標的位置,通過對它加減和列表框的 selected方法實現光標在列表框中的上下移動和翻頁。
2.3.3 選擇按鈕事件
變量編輯界面如圖6所示,界面右側標題為“已選變量”下面區域是一個列表框 list2,選擇按鈕事件就是確保list2變量數量不超限并選擇list1變量與list2變量不重復的前提下,在list2中添加list1中光標停留位置的變量名稱。之后,根據被選變量的名稱在數據庫中查找該變量的id號,最終將list2中所有變量的id號和名稱分別存儲在兩個字符串中。查找和存儲的部分代碼如下:

其中Label7.Caption是存儲變量id的,Label6.Caption是存儲變量名的,這兩個字符串都是相應標簽控件的caption屬性,這樣設計有利于調試,在程序發布時將標簽設置為隱藏即可。
2.3.4 保存按鈕事件
將Label7.Caption和Label6.Caption保存到INI文件中,并且在字符串前加上變量數量,根據所選的可編程界面,存入不同的節名和鍵名下。通過windows內核提供的API接口WritePrivateProfileString實現對INI的寫入[6],部分代碼如下:

2.3.5 按字母索引按鈕事件
進行27次循環計數,計數值為0時代表列表框list1應顯示全部變量,計數值為1至27時代表列表框list1應顯示以A到Z開頭的變量。列表框list1顯示全部變量名稱的代碼與變量編輯界面的form_load事件中的一樣,列表框list1顯示以A到Z開頭的變量名稱通過SELECT LIKE語句實現[7],部分代碼如下:

2.3.6 主界面“選擇”按鈕事件
主界面如圖5所示,在主界面窗體程序中設置兩個表示光標方向的變量,根據列坐標可判斷當前光標在固定顯示界面還是可編程界面,根據行坐標便可確定操作人員希望進入的界面。以上得到確認后,首先加載下一個窗體,然后調用下一個窗體的show方法,最后卸載當前窗體[8]。這樣的設計保證同一時刻只用一個窗體在運行,有效控制了系統內存和CPU占用率,同時避免了先卸載后加載過程中短暫顯示系統桌面的現象。
2.3.7 50 ms定時觸發事件
可編程數據顯示界面如圖 7所示,該界面的50ms定時器觸發事件實現顯示界面的刷新,數據解析工作。根據從 INI文件讀取的當前界面所顯示變量的名稱,為變量標題標簽組賦值。根據從 INI文件讀取的當前界面所顯示變量的 id,為變量單位標簽組賦值,同時id也確認了數據的解析方法。
本界面可編程的機車微機顯示系統軟件主界面如圖5所示,在界面上半部分顯示機車工況、牽引力等基本信息和報警信息。左半部分是按機車子系統或功能劃分的顯示界面,這些界面顯示內容都是固定不變的。右半部分是9個可編程界面,在沒有對其編程時顯示標題為“未定義”。操作下面的方向按鈕可以使相應位置的菜單光標變亮,操作功能按鈕可以選擇固定界面與可編程界面,也可以編輯可編程界面以及刪除之前編輯的可編程界面。

圖5 主界面Fig.5 Main form
按下編輯按鈕進入變量編輯界面如圖6所示。在該界面中可以選擇變量,同時為提高檢索效率,開發出了按變量單詞首字母檢索的功能。選擇完變量之后按保存按鈕,就可在主界面出現一個以編輯日期為標題的菜單。菜單的標題為月日時分秒,以實心點分隔。選擇并進入該菜單可以看之前編輯的變量,如圖7所示,對于數字量而言其數值顯示的“開”或“關”,對于模擬量而言其數值有效位不同且數值后面需有單位跟隨。

圖6 變量編輯界面Fig.6 V ariable edit form

圖7 可編程數據顯示界面Fig.7 Pr ogrammable data form
本文所設計的界面可編程的機車微機顯示系統軟件,打破以往同類型軟件的設計思路,創造性的提出了界面可編程的概念。目前,本軟件運行于國產某和諧型內燃機車微機顯示屏,運行效果良好。本軟件為機車微機控制系統研發、出廠調試、機務運用、故障分析和排查提供了極大的支持。下一步將結合其他操作系統進行開發,使本軟件成為一種跨平臺的通用性軟件。
[1] 溫陽東. 基于CAN總線的機車LCU通信系統設計[J]. 安徽大學學報(自然科學版), 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程序設計[M]. 北京: 中國鐵道出版社, 2009.ZHANG L F, YANG S Q. Visual Basic program design [M].Beijing: China Railway Press, 2009. (in Chinese)
[3] 劉玉海, 劉冰. SQLite嵌入式數據庫及圖象處理技術研究[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 語言實現決策樹構建算法的實驗研究[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數據庫的裝備數據采集系統設計[J]. 四川兵工學報, 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的路譜管理系統設計與開發[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 程序設計教程[M]. 南京: 南京大學出版社, 2009.LI Y F. Program design course of Visual Basic [M]. Nanjing:Nanjing university press, 2009. (in Chinese)