王盛 肖庭喜 孔祥華 林峰
摘要:各類異常在過(guò)程控制系統(tǒng)中無(wú)法完全規(guī)避,對(duì)異常的科學(xué)處理能提高程序健壯性并利于程序維護(hù)和錯(cuò)誤診斷。概述了過(guò)程控制系統(tǒng)中采用C#的異常處理機(jī)制,并提出了異常處理的通用方案及自定義異常方案,最后對(duì)過(guò)程控制系統(tǒng)的異常管理模塊進(jìn)行功能說(shuō)明?;诖思夹g(shù)的過(guò)程控制系統(tǒng)在現(xiàn)場(chǎng)運(yùn)行良好,為工廠創(chuàng)造了巨大效益。
關(guān)鍵詞:過(guò)程控制系統(tǒng);異常處理;異常管理;C#
中圖分類號(hào):TP311 ? ? ?文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2020)31-0251-03
Abstract: All kinds of exceptions cannot be completely avoided in the process control system. Scientific treatment of exceptions can improve the robustness of the program and facilitate program maintenance and error diagnosis. The exception handling mechanism using C# in the process control system is outlined, and the general and custom exception handling schemes for exception handling are proposed. Finally, the exception management module of process control system is explained. The process control system based on this technology works well on site, creating huge benefits for the factory.
Key words: process control system; exception handling; exception management; C#
1 概述
1.1 過(guò)程控制系統(tǒng)概述
過(guò)程控制系統(tǒng)是流程工業(yè)中不可缺少的關(guān)鍵系統(tǒng),主要功能包括實(shí)時(shí)數(shù)據(jù)采集,原料數(shù)據(jù)管理,成品數(shù)據(jù)管理,物料跟蹤,生產(chǎn)日志及報(bào)表,設(shè)備管理等。以鋼鐵行業(yè)為例,過(guò)程控制系統(tǒng)位于生產(chǎn)管理系統(tǒng)(三級(jí))和基礎(chǔ)自動(dòng)化系統(tǒng)(一級(jí))之間,一般簡(jiǎn)稱二級(jí),起著承上啟下的作用[1]。過(guò)程控制系統(tǒng)強(qiáng)調(diào)設(shè)備的先進(jìn)控制,操作優(yōu)化,減少人為因素的影響,優(yōu)化生產(chǎn)管理,提高產(chǎn)品質(zhì)量[2]。
1.2 異常定義
異常,業(yè)內(nèi)用英文Exception表示,是一種不可預(yù)知的現(xiàn)象,其特指軟件程序開(kāi)發(fā)過(guò)程及現(xiàn)場(chǎng)運(yùn)行時(shí)的各類非正常意外情況,幾乎是不可避免的。如果異常沒(méi)有得到有效處理,程序就會(huì)意外中止運(yùn)行,這樣嚴(yán)重影響生產(chǎn)。另外在程序設(shè)計(jì)中利用好異常處理機(jī)制,可以提高軟件的開(kāi)發(fā)效率,降低開(kāi)發(fā)成本,提高軟件的健壯性和可靠性。
1.3 C#異常處理架構(gòu)簡(jiǎn)述
C#是微軟公司最新推出的一門編程語(yǔ)言,它結(jié)合了過(guò)去幾十年相關(guān)編程語(yǔ)言的優(yōu)勢(shì),充分考慮了編程優(yōu)雅性,操作簡(jiǎn)單性,特性豐富性及組件化編程等優(yōu)勢(shì)[3],是實(shí)現(xiàn)過(guò)程控制系統(tǒng)編程語(yǔ)言的首選。其主要特征包括簡(jiǎn)單易用、安全性高、通用平臺(tái)、面向?qū)ο笤O(shè)計(jì)等。C#運(yùn)行于.NET Framework之上,基于.NET中的海量類庫(kù)編程。
.NET Framewor包含一種標(biāo)準(zhǔn)的錯(cuò)誤報(bào)告機(jī)制,就是結(jié)構(gòu)化異常處理,它由 CLR(公共語(yǔ)言運(yùn)行時(shí))來(lái)控制異常的處理。在C#中,異常本質(zhì)上就是一個(gè)對(duì)象,他繼承于一個(gè)叫作System.Exception的基類。當(dāng)發(fā)生錯(cuò)誤時(shí),系統(tǒng)會(huì)產(chǎn)生一個(gè)異常來(lái)對(duì)應(yīng)用程序通知這個(gè)錯(cuò)誤,異常至少要包括錯(cuò)誤的相關(guān)信息。異常產(chǎn)生后,相關(guān)的應(yīng)用程序?qū)?huì)對(duì)錯(cuò)誤進(jìn)行處理[4]。CLR 將會(huì)遍歷調(diào)用堆棧信息,以便找到合適的處理程序。異常返回的結(jié)果并不是簡(jiǎn)單的是否有異常,而是一整套異常信息,包括異常類別,異常的相關(guān)描述,通過(guò)這些異常信息,工程師就可以定位程序問(wèn)題發(fā)生的原因??傊?,基于C#的異常處理架構(gòu)所編寫(xiě)的應(yīng)用程序更容易閱讀與維護(hù),大大縮短開(kāi)發(fā)人員調(diào)試時(shí)間。
2 異常處理方案
2.1 通用方案
異常的處理形式主要包括如下三種,如表1所示:
(1)try-catch語(yǔ)句
(2)try-catch-finally語(yǔ)句
(3)try-finally語(yǔ)句
針對(duì)有可能發(fā)生異常的語(yǔ)句放到try語(yǔ)句塊中,稱之為嘗試捕捉異常。而在catch語(yǔ)句塊中,放置的是針對(duì)異常情況發(fā)生后進(jìn)行處理的代碼,稱之為異常處理。結(jié)構(gòu)中的finally語(yǔ)句塊通常放置程序必須執(zhí)行的代碼,例如關(guān)閉連接,釋放資源等,無(wú)論是否發(fā)生異常,這里的程序執(zhí)行不受影響。
顯然,如果程序的正常順序執(zhí)行的過(guò)程中,有異常產(chǎn)生了,從try語(yǔ)句塊內(nèi)產(chǎn)生異常的那一行程序代碼開(kāi)始之后的相關(guān)代碼都不會(huì)去執(zhí)行,而是會(huì)跳轉(zhuǎn)到符合條件的catch語(yǔ)句塊或是finally語(yǔ)句塊內(nèi)的第一行代碼。
其中在catch語(yǔ)句塊包含若干種情況,第一,不帶參數(shù),則會(huì)捕捉所有類型的異常。第二,包含參數(shù),則只能捕獲異常參數(shù)所規(guī)定的特定異常。第三,包含多個(gè)不同的參數(shù),也就是try語(yǔ)句塊聯(lián)合多個(gè)不同參數(shù)的catch語(yǔ)句塊,每個(gè)catch語(yǔ)句塊捕捉不同的異常進(jìn)而處理。
實(shí)際代碼中,主要運(yùn)用第(1)(2)這兩種形式,形式(3)比較罕見(jiàn)。
2.2 自定義異常
實(shí)際運(yùn)行項(xiàng)目中,開(kāi)發(fā)人員通常使用自定義的異常類型,其目的是表示特有的代碼在運(yùn)行過(guò)程中不受控所發(fā)生的意外事件,其作用是能為用戶提供更友好的調(diào)試體驗(yàn)。
實(shí)例如下:
[Serializable]
public class MyRpcException : Exception
{
public string MyErrMessage { get;set; }
public MyRpcException()
{
}
public MyRpcException(string errMessage)
{
MyErrMessage = errMessage;
}
public override string ToString()
{
return $"MyRpcException:{ MyErrMessage }";
}
}
由于C#中的異常本身就是一個(gè)類,它需要繼承C#中異常的基類,即System.Exception。一般來(lái)說(shuō),為了代碼規(guī)范,自定義異常類的名稱以 “Exception”這個(gè)詞作為類名的后綴。其中有一個(gè)屬性MyErrMessage,它用于表示具體的錯(cuò)誤信息,捕獲到錯(cuò)誤后用于提示用戶。本實(shí)例中MyRpcException類包括兩個(gè)構(gòu)造函數(shù),第一個(gè)是空構(gòu)造函數(shù),一般較少使用;另一個(gè)是包含一個(gè)字符串類型的錯(cuò)誤信息的構(gòu)造函數(shù),方便代碼使用。它還重寫(xiě)了ToString方法,方便輸出日志或者提示。整個(gè)類通過(guò)Serializable標(biāo)識(shí)為可序列化,便于保存到數(shù)據(jù)庫(kù)。
在C#中,關(guān)鍵字throw用于在發(fā)生錯(cuò)誤時(shí),引發(fā)相應(yīng)的異常。其語(yǔ)句示例如下:
throw new MyRpcException(“未找到遠(yuǎn)程目標(biāo)!”);
3 過(guò)程控制系統(tǒng)的異常處理模塊設(shè)計(jì)
3.1 設(shè)計(jì)需求
過(guò)程控制系統(tǒng)和其他系統(tǒng)一樣,不可避免地出現(xiàn)一些異常,采用通用方案處理即可。但是過(guò)程控制系統(tǒng)中往往會(huì)遇到數(shù)據(jù)庫(kù)讀寫(xiě)異常,網(wǎng)絡(luò)異常,遠(yuǎn)程調(diào)用異常。需要通過(guò)自定義異常處理。過(guò)程控制系統(tǒng)的異常處理模塊主要設(shè)計(jì)需求如下:
(1)完成對(duì)過(guò)程控制系統(tǒng)的各類異??煽?,高效,友好,規(guī)范化處理;
(2)異常信息和類別的多樣化,且各種異常能靈活處理,處理方式不能局限于特定固定的方式。
(3)方便靈活易部署,支持配置修改。
(4)異常處理模塊作為一個(gè)集成好的通用基礎(chǔ)組件,能應(yīng)用與過(guò)程控制系統(tǒng)其他模塊中,與其他模塊無(wú)耦合即插即用,其他模塊開(kāi)發(fā)人員無(wú)須重復(fù)編碼。且異常處理模塊內(nèi)部異常不得影響其他模塊正常運(yùn)行。
3.2 工作流程
如前所述,通常異常處理包括異常捕捉和異常輸出。過(guò)程控制系統(tǒng)如果僅僅采用此流程則顯得處理效率低,無(wú)法追溯管理異常,用戶體驗(yàn)差等一系列缺點(diǎn)。過(guò)程控制系統(tǒng)作為一個(gè)中大型控制系統(tǒng),維護(hù)人員需要了解各種異常發(fā)生的時(shí)機(jī)和原因,以利于優(yōu)化機(jī)組工藝參數(shù),實(shí)現(xiàn)高效率生產(chǎn),低故障率運(yùn)行的目標(biāo)。本文設(shè)計(jì)的流程如下[6],除了包括傳統(tǒng)的處理方式以外(圖1-a),主要對(duì)異常處理進(jìn)行了進(jìn)一步設(shè)計(jì)(圖1-b):
(1)異常持久化:在捕獲到相關(guān)代碼的異常后,至少記錄異常產(chǎn)生時(shí)間,異常類型,異常級(jí)別,類名,代碼位置,異常說(shuō)明等各個(gè)屬性,形成一個(gè)二進(jìn)制流文件,記錄到數(shù)據(jù)庫(kù)中。數(shù)據(jù)持久化引入PROTOBUF技術(shù)[7],序列節(jié)點(diǎn)的分配間隔采用蛇形間隙法,保證工作狀態(tài)與休息狀態(tài)始終之間的動(dòng)態(tài)平衡;使用最優(yōu)先級(jí)規(guī)則完成相關(guān)節(jié)點(diǎn)的存儲(chǔ)數(shù)據(jù),根據(jù)語(yǔ)法結(jié)構(gòu)和目標(biāo)數(shù)據(jù)的語(yǔ)義,建立對(duì)應(yīng)映射關(guān)系,完成異常完整信息的序列化。此方法轉(zhuǎn)化時(shí)間短、空間利用率高。
(2)異常分析:根據(jù)捕捉到的異常類型,從數(shù)據(jù)庫(kù)配置中獲取異常對(duì)應(yīng)的編號(hào)和提示,并且根據(jù)該異常特有的分析方式進(jìn)行解析異常詳細(xì)內(nèi)容。但是如果和數(shù)據(jù)庫(kù)中所有異常類型都不匹配,則表示這是一個(gè)新的異常,此時(shí)按照通用異常處理。
(3)異常通訊:首先從數(shù)據(jù)庫(kù)獲取異常記錄的數(shù)據(jù),通過(guò)消息發(fā)送異常信息數(shù)據(jù)給異常管理模塊,然后等待來(lái)自異常管理模塊異常信息,通訊建立后,獲取到異常信息的相關(guān)數(shù)據(jù)。
(4)異常顯示:首先通過(guò)分析異常得到異常的提示內(nèi)容,在顯示端給用戶一個(gè)友好且的異常提示界面,最后結(jié)合上述異常通訊所獲取到的數(shù)據(jù),在人機(jī)接口畫(huà)面進(jìn)行顯示。
3.3 異常管理功能
過(guò)程控制系統(tǒng)的基礎(chǔ)任務(wù)之一是對(duì)異常報(bào)告信息進(jìn)行有效的管理,方便現(xiàn)場(chǎng)運(yùn)行維護(hù)人員輕松了解異常,并提高處理異常的效率。異常管理功能主要是管理程序的異常錯(cuò)誤報(bào)告、異常日志及異常說(shuō)明等信息,那么開(kāi)發(fā)維護(hù)人員更加輕松了解過(guò)程控制系統(tǒng)所特有的各類異常工況,并便于運(yùn)維人員和軟件開(kāi)發(fā)人員能夠快速查詢和管理異常信息;其主要功能包括如下:異常通信、異常說(shuō)明、異常日志、異常幫助、異常分析及系統(tǒng)管理等功能[6]。
(1)異常通信功能:它是異常管理中的基本功能,為整個(gè)異常處理提供數(shù)據(jù)的來(lái)源。其主要負(fù)責(zé)接收由異常信息通信服務(wù)器發(fā)送來(lái)的異常信息,同時(shí)面向用戶進(jìn)行信息提示。所有這些異常的相關(guān)信息將會(huì)存儲(chǔ)或者導(dǎo)出到專用的異常專用數(shù)據(jù)庫(kù)中,為異常管理模塊提供數(shù)據(jù)基礎(chǔ)。
(2)異常說(shuō)明功能:它的主要用途是對(duì)異常說(shuō)明信息的管理,利于用戶獲取異常信息。例如用戶首先定義具體過(guò)程控制系統(tǒng)的應(yīng)用需求,并配置異常的提示內(nèi)容,根據(jù)這些配置將異常提示以文件導(dǎo)出;具體信息在數(shù)據(jù)庫(kù)的配置表中,用戶可以進(jìn)行修改。
(3)異常日志:它包含兩方面的管理,一是異常日志管理,另一方面是異常處理狀態(tài)管理。用戶可以自定查詢條件進(jìn)行查詢相關(guān)異常日志,并可以根據(jù)異常實(shí)時(shí)處理的進(jìn)度,了解異常最新?tīng)顟B(tài);異常日志的顯示列表采用DataGridView控件完成,通過(guò)綁定后臺(tái)日志數(shù)據(jù),實(shí)現(xiàn)日志自動(dòng)刷新,提高顯示效率。
(4)異常幫助:為用戶提供解決異常的幫助信息。某一用戶完成異常處理后,可以對(duì)異常發(fā)生的情況和解決方法進(jìn)行描述,便于維護(hù)人員進(jìn)行下一步操作;這些幫助存儲(chǔ)在知識(shí)庫(kù)中,人工亦可進(jìn)行增加自定義幫助。
(5)異常分析:對(duì)相關(guān)異常數(shù)據(jù)呈現(xiàn)給用戶,提供直觀形象的各類圖表顯示,方便進(jìn)行統(tǒng)計(jì)和分析及優(yōu)化;分析對(duì)象包括發(fā)生異常子系統(tǒng)名稱、異常時(shí)間、異常級(jí)別、異常類型和異常操作人員五個(gè)選項(xiàng)。 通過(guò)餅圖進(jìn)行異常分布分析、通過(guò)折線圖進(jìn)行異常趨勢(shì)分析、通過(guò)柱狀圖和條形圖進(jìn)行對(duì)比分析。
(6)系統(tǒng)管理:其核心是對(duì)系統(tǒng)(System)、用戶(User)和角色(Role)這三個(gè)基礎(chǔ)數(shù)據(jù)進(jìn)行數(shù)據(jù)管理,至少包括新增、刪除、修改、查詢等功能。管理功能包括用戶信息管理,系統(tǒng)信息管理,角色信息管理等。由于用戶和系統(tǒng)、角色和用戶之間都可能存在多對(duì)多的關(guān)系,例如一個(gè)用戶信息可能包括一項(xiàng)或者多項(xiàng)角色信息,因?yàn)樾枰瑫r(shí)對(duì)多個(gè)數(shù)據(jù)庫(kù)中多個(gè)關(guān)聯(lián)表進(jìn)行維護(hù)。
4 結(jié)論
采用異常處理技術(shù),應(yīng)用于中冶新材多個(gè)冷軋機(jī)組過(guò)程控制中,現(xiàn)場(chǎng)異常提示友好,未發(fā)現(xiàn)宕機(jī)現(xiàn)象,為維護(hù)人員故障診斷提供了便利。現(xiàn)場(chǎng)運(yùn)行經(jīng)驗(yàn)表明,系統(tǒng)資源占用資源可控,響應(yīng)迅速,為鋼廠創(chuàng)造了巨大的經(jīng)濟(jì)效益。
參考文獻(xiàn):
[1] 王國(guó)棟,劉相華,王軍生.冷連軋計(jì)算機(jī)過(guò)程控制系統(tǒng)[J].軋鋼,2003,20(2):41-44.
[2] 白瑞星.鋼鐵企業(yè)過(guò)程控制系統(tǒng)(PCS)的研究與實(shí)現(xiàn)[D].上海:復(fù)旦大學(xué),2007.
[3] 張?jiān)侥?試析C#編程語(yǔ)言的特點(diǎn)及功能[J].軟件,2013,34(3):145-146.
[4] 王海燕.C#和.NET中的異常處理機(jī)制淺析[J].電腦知識(shí)與技術(shù),2015,11(15):202-203.
[5] 唐珺.淺談C#程序中的異常處理機(jī)制[J].計(jì)算機(jī)安全,2010(12):63-65.
[6] 劉媛媛.面向C#程序的異常處理系統(tǒng)的設(shè)計(jì)與應(yīng)用[D].成都:西南交通大學(xué),2016.
[7] 黃斌,謝艷新,唐友,等.數(shù)據(jù)存儲(chǔ)信息序列化完整性及效率評(píng)估仿真[J].計(jì)算機(jī)仿真,2020,37(4):159-163.
【通聯(lián)編輯:梁書(shū)】