(1.青島杰瑞工控技術有限公司,山東 青島 266061;2.中船重工(青島)海洋裝備研究院有限責任公司,山東 青島 266520)
隨著計算機技術的發(fā)展,越來越多的計算機語言被應用到工程應用程序的設計與開發(fā)中。WinForm[1-2]是.NET 開發(fā)平臺中對Windows Form 的一種稱謂,Windows 窗體具有3 個重要特點。1)功能強大。Windows 窗體可用于設計窗體和可視控件,以創(chuàng)建豐富的基于Windows 的應用程序。2)操作方便。提供易于連接OLEDB 和ODBC 數據源的數據控件。3)使用安全。Windows 窗體充分利用公共語言運行庫的安全特性。
該文充分發(fā)揮WinForm 的技術優(yōu)勢,綜合考慮碼頭自動化裝卸的優(yōu)缺點,設計開發(fā)了一套碼頭裝卸設備管理系統(tǒng)軟件。利用先進的計算機技術彌補了傳統(tǒng)人工裝卸作業(yè)的缺點,提高了裝卸效率,提升了作業(yè)的穩(wěn)定性與準確性。
碼頭裝卸設備管理系統(tǒng)是監(jiān)控和控制自動化碼頭設備及所有事件和過程的軟件,因為碼頭裝卸設備在運行過程中需要人工干預,并且用戶希望能夠實時了解系統(tǒng)的運行狀態(tài)和進程,所以需要通過設備管理系統(tǒng)的UI 界面來實現。系統(tǒng)的主要功能包括制定堆場計劃、裝船計劃、卸船計劃、任務優(yōu)先級調整、用戶登錄權限管理、堆場監(jiān)控、遠程操控等。這些功能的好壞用戶只能通過人機交互界面來進行直觀感受,后臺邏輯代碼的先進性、可靠性也都需要借助人機交互界面來體現,所以人機交互界面必須作為設備管理系統(tǒng)的重要部分進行開發(fā)。
該系統(tǒng)將整個業(yè)務劃分為界面層、業(yè)務邏輯層、數據訪問層,對外數據交互采用Oracle,系統(tǒng)主要包括系統(tǒng)管理模塊、設備管理模塊和任務管理模塊。其中系統(tǒng)管理模塊又包括狀態(tài)監(jiān)控模塊、系統(tǒng)日志模塊和權限管理模塊。設備管理模塊用于碼頭裝卸設備的遠程管理和操作,包括AGV、場橋和岸橋模塊。任務管理模塊用于制定堆場內的翻/搗箱計劃、移箱計劃及給遠洋船舶制定裝船和卸船計劃。該軟件的開發(fā)主要是基于WinForm 已有的控件進行的,每種控件自帶的大量屬性和方法便于開發(fā)者直接進行設置和調用,加快了開發(fā)速度,減少了開發(fā)時間,節(jié)約了開發(fā)成本。但是控件自帶的許多屬性和方法在開發(fā)過程中并不會用到,而這些用不到的屬性和方法也會占用一定的內存,從而拖慢了程序的運行速度,因此,需要進行系統(tǒng)的測試與驗證。
系統(tǒng)管理模塊主要包括狀態(tài)監(jiān)控模塊、系統(tǒng)日志模塊和權限管理模塊。
2.1.1 狀態(tài)監(jiān)控模塊
碼頭狀態(tài)監(jiān)控模塊可以實時顯示堆場和碼頭的運行情況。該界面共有14 460 個箱位,每個箱位會根據數據庫中的信息顯示不同的顏色(箱位顯示的顏色與箱位堆放集裝箱的層數有關,最多可堆放5 層)。這種堆場顯示方式可向操作人員展示大量的堆場信息,使操作人員對堆場利用情況有較為直觀的認識。每個箱位在顯示時都要進行數據計算,因此,該界面每次刷新都需要進行一次數據的讀取操作和100 萬余次的數據處理。
2.1.2 系統(tǒng)日志模塊
系統(tǒng)日志模塊是對碼頭工作流程和運行設備的主要時間節(jié)點發(fā)生的事件進行記錄,這樣在作業(yè)過程中發(fā)生異常時,就可以通過查詢系統(tǒng)日志找出問題的根源,快速解決問題。另外系統(tǒng)日志產生的大量自動化碼頭工作數據,可以作為大數據分析和碼頭設備遠程運維的重要信息支撐。
2.1.3 權限管理模塊
權限管理模塊就是要為不同的操作人員設置不同的操控權限,以保障碼頭設備的安全運行。權限管理界面主要分為超級管理員和普通管理員2 種界面。超級管理員是由具有數據庫管理權限的操作員在系統(tǒng)初始化時設置的,普通管理員可以由超級管理員進行添加、修改和刪除。超級管理員和普通管理員擁有不同的訪問權限。
設備管理模塊主要用來接收AGV、場橋和岸橋的運行數據,包括設備的運行速度、連續(xù)工作時間、相對坐標等數據。設備管理模塊可以為碼頭裝卸設備的遠程操控提供實時的數據和畫面參考。
任務管理模塊的主要功能是讀取已經制定好的作業(yè)計劃,根據既定的算法以最優(yōu)的結果來進行設備的調配,以此來完成工作計劃。為了擴展設備管理模塊的功能,該系統(tǒng)在其中加入手動制定作業(yè)計劃模塊。手動制定作業(yè)計劃模塊主要包括堆場計劃模塊、裝船計劃模塊、卸船計劃模塊和任務管理模塊。其中堆場計劃模塊用來制定堆場內的裝箱、移箱和翻箱等作業(yè)計劃;裝/卸船計劃模塊用來制定船舶裝/卸計劃;任務管理模塊可以查看已經制定好的作業(yè)計劃,并可以手動修改已制定作業(yè)的執(zhí)行順序。
該系統(tǒng)UI 界面中需要顯示碼頭堆場地圖信息,而堆場布局會隨著港口技術和要求的發(fā)展不斷更新變化,所以將設備管理系統(tǒng)軟件的UI 界面開發(fā)成了可配置界面。
為了使用戶可以根據需要修改界面顯示的效果,該設計采用XML[3-4]文件完成界面的參數化配置,XML 易與Windows、Linux 及其他平臺的信息結合。通過加載XML 數據,就可以以XML 格式輸出結果,在不同程序間傳遞數據。該設計中各箱區(qū)的集裝箱貝位數、集裝箱排位數、貝位間距、排位間距、貝位顯示的字體、字號等信息,都可根據XML 文件配置。
由上文可知,堆場地圖界面的每次刷新都需要進行100 萬余次的數據處理,如果不選取恰當的方法和技術,就會造成界面嚴重卡頓甚至程序異常終止。進行數據處理之前應該先將數據從數據庫中讀取出來,最好的處理方式是一次性讀取數據庫中的數據,然后存入指定的容器內再進行數據運算。不應該每次都進行數據庫的讀寫操作,頻繁地進行大量的數據庫讀寫操作會造成數據庫崩潰。
WinForm 中可選的臨時存取數據的容器有很多種,考慮到數據處理時需要快速準確地取出指定的數據,所以選擇DataGridView 控件和List<T>集合。DataGridView 相對于List<T>在顯示數據方面更具優(yōu)勢,但是數據存取效率要比List<T>集合低。為了確定兩者在100 萬次數據存取中的耗時差距,特地進行了以下2 組測試。1)從DataGridView 中讀取100 萬次數據,數據種類:String,字節(jié)長度:10,計算耗時。2)從List<T>中讀取100 萬次數據,數據種類:String,字節(jié)長度:10,計算耗時。
測試結果顯示,從DataGridView 中讀取100 萬次數據耗時3 865.1731 ms。從List<T>集合中讀取100 萬次數據耗時3 649.0187 ms。兩者用時相差216.1544 ms。
結果顯示兩者對于100 萬次的讀取耗時差別并不明顯,但是程序運行時不只是進行存取操作。如果在程序獲取數據之前增加判斷環(huán)節(jié),就需要重新測試耗時。因此,進行了以下2 組測試。1)增加判斷語句,從DataGridView 中讀取100 萬次數據,數據種類:String,字節(jié)長度:10,計算耗時。2)增加判斷語句,從List<T>中讀取100 萬次數據,數據種類:String,字節(jié)長度:10,計算耗時。
測試結果顯示,從DataGridView 中讀取100 萬次數據耗時3 934.379 ms。從List<T>集合中讀取100 萬次數據耗時4 493.6972 ms,兩者用時相差559.3182 ms。由于DataGridView 中沒有查詢元素是否存在的contains 方法,而List<T>作為專門用于臨時存取數據的容器,提供了查詢元素的contains 方法,所以在不需要展示臨時數據的情況下,應該優(yōu)先選用List<T>集合。
假死的程序如果是運行在后臺的邏輯代碼,那么給用戶的感覺就是程序運行較慢,如果是UI 程序假死,給用戶的感覺就是程序卡頓、技術落后,所以對于UI 界面來說,必須解決程序假死問題。該程序在解決程序假死問題時用到了多線程技術[5],給程序耗時較長的部分開辟一個新的線程去執(zhí)行,以此來解決程序界面卡頓的問題。
程序功能在設計時要充分了解用戶需求,考慮程序后期的可擴展性,要善于利用既有的開發(fā)技術和開發(fā)工具。在使用WinForm 技術開發(fā)UI 界面時,為了提高臨時數據的存取和查詢速度,可以使用List<T>集合工具類。程序假死是UI 開發(fā)中必須重點注意的問題,測試證明多線程技術的使用可以解決UI 程序假死的問題。