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