本文摘要:本篇文章是由《 計算機科學(xué)與探索 》發(fā)表的一篇電子論文,是由中國電子科技集團公司主管、華北計算技術(shù)研究所主辦的國內(nèi)外公開發(fā)行的計算機學(xué)報級高級學(xué)術(shù)期刊,中國計算機學(xué)會會刊。報道計算機(硬件、軟件)各學(xué)科具有創(chuàng)新性、前沿性、導(dǎo)向性、開拓性及探索
本篇文章是由《計算機科學(xué)與探索》發(fā)表的一篇電子論文,是由中國電子科技集團公司主管、華北計算技術(shù)研究所主辦的國內(nèi)外公開發(fā)行的計算機學(xué)報級高級學(xué)術(shù)期刊,中國計算機學(xué)會會刊。報道計算機(硬件、軟件)各學(xué)科具有創(chuàng)新性、前沿性、導(dǎo)向性、開拓性及探索性的科研成果。內(nèi)容包括高性能計算機,體系結(jié)構(gòu)、并行處理,計算機科學(xué)新理論、算法設(shè)計與分析、人工智能與模式識別、系統(tǒng)軟件,軟件工程、數(shù)據(jù)庫、計算機網(wǎng)絡(luò)、信息安全、計算機圖形學(xué)與計算機輔助設(shè)計、虛擬現(xiàn)實、多媒體技術(shù)及交叉學(xué)科的相互滲透和新理論的衍生等。
摘 要:在過程工業(yè)的控制中存在著大量的通信協(xié)議,這些協(xié)議的結(jié)構(gòu)差別很大。要進行上層應(yīng)用開發(fā),必須對這些協(xié)議進行解析和處理。該文討論了用形式化描述的方法對協(xié)議進行描述,實現(xiàn)了與協(xié)議無關(guān)的協(xié)議解析和處理,從而避免了針對不同通信協(xié)議均要編寫相應(yīng)的解析和處理程序,使協(xié)議的解析和處理具有更好的靈活性和普適性。
關(guān)鍵詞:協(xié)議分析;數(shù)據(jù)幀;編譯技術(shù)
在過程工業(yè)中,工業(yè)自動化技術(shù)日趨成熟,自動化控制系統(tǒng)的應(yīng)用已經(jīng)非常普及,但是各類控制系統(tǒng)絕大多數(shù)是封閉的系統(tǒng),控制裝置自身存在封閉性。不同的廠家為各自的產(chǎn)品提供不同的協(xié)議和通信方式,缺乏統(tǒng)一的、標準的開放式接口。如果要集成在一起,必須為它們開發(fā)專用的通信接口。隨著工業(yè)自動化系統(tǒng)功能要求越來越復(fù)雜,完全用一個廠家的產(chǎn)品來構(gòu)成整個系統(tǒng)是很困難的。用戶在進行上層應(yīng)用程序開發(fā)的時候,通常需要對協(xié)議進行解析,從中提取出所需數(shù)據(jù)項,并進行相應(yīng)的存儲、加工計算和顯示等處理,這就要求用戶不得不針對特定的控制系統(tǒng)開發(fā)特定的、專用的通信接口論文。
這些通信接口程序之間的結(jié)構(gòu)非常類似,主要的區(qū)別在于對網(wǎng)絡(luò)接口收到數(shù)據(jù)幀的理解和解釋不同,極易造成整個應(yīng)用系統(tǒng)的復(fù)雜和冗余。更為不利的是,一旦底層設(shè)備發(fā)生變化,就可能造成整個應(yīng)用程序的重新編寫和編譯,大大增加了系統(tǒng)的維護量和開發(fā)人員的負擔(dān)[1]。
1 控制設(shè)備協(xié)議分析
對于不同控制系統(tǒng)中的控制協(xié)議,其數(shù)據(jù)幀格式往往不同。但是在特定的控制系統(tǒng)中所涉及到的數(shù)據(jù)幀通常都有明確的格式定義,并且數(shù)據(jù)幀與數(shù)據(jù)幀之間往往是相對獨立的。更為重要的是控制系統(tǒng)中的設(shè)備要完成通信功能必須在物理鏈路上建立邏輯連接。這里的物理鏈路包括以太網(wǎng)、串行口等,相應(yīng)的邏輯連接是TCP/IP 協(xié)議、串行通信協(xié)議,在此基礎(chǔ)上各種設(shè)備再定義自己的應(yīng)用層協(xié)議。雖然應(yīng)用層協(xié)議的類別會因設(shè)備和廠家的不同而有很大的變化,但是仔細分析就會發(fā)現(xiàn),這些協(xié)議都各自具有確定的幀格式,如哪些字節(jié)表示命令、哪些字節(jié)表示參數(shù)名、哪些字節(jié)表示設(shè)備位號、哪些字節(jié)表示數(shù)值等。
既然所有的通信協(xié)議都遵守一定的幀格式,那么就可以根據(jù)已知的幀格式構(gòu)造此協(xié)議的解析程序,針對每一種通信協(xié)議手工編寫這樣的解析程序是沒有問題的,本文討論的是能不能將通信協(xié)議數(shù)據(jù)幀格式的描述與協(xié)議的解析代碼相分離,用穩(wěn)定的程序來處理不穩(wěn)定的數(shù)據(jù)幀格式。如果答案肯定,那么就能對不同設(shè)備采用同一個接口采集數(shù)據(jù),如果底層設(shè)備的通信協(xié)議發(fā)生變化,只需要改變協(xié)議相應(yīng)的描述,而不必重新編寫和編譯協(xié)議的解析程序,可以降低系統(tǒng)的復(fù)雜度,便于管理和擴充。
2 協(xié)議解析的解決方案
如前所述,編譯原理中的基本詞法分析和語法分析的思想為解決所面臨的問題提供了理論基礎(chǔ),特別是詞法分析器自動生成器和語法分析器自動生成器提供了很好的借鑒方法[2]。詞法分析器自動生成器的基本實現(xiàn)思想是:(1)對輸入流進行形式化描述生成一個狀態(tài)轉(zhuǎn)換圖,根據(jù)此狀態(tài)圖可以識別此種輸入流的所有形式;(2)由一個主控程序根據(jù)狀態(tài)轉(zhuǎn)換圖對輸入流進行掃描分析以識別符合描述的短語。把這種思想運用到本文所面臨的問題上,問題的解決方案就可描述為:(1)把設(shè)備的通信協(xié)議形式化描述(描述的方式即采用正規(guī)式集的方式);(2)由一個狀態(tài)圖生成程序產(chǎn)生對應(yīng)這些正規(guī)式的狀態(tài)圖(在下文中把狀態(tài)圖稱為驅(qū)動表、相應(yīng)的狀態(tài)圖生成程序稱為驅(qū)動表自動構(gòu)造器);(3)由一個唯一的主控程序根據(jù)此驅(qū)動表對接收到的數(shù)據(jù)幀進行分析識別,輸出用戶希望的數(shù)據(jù)格式。
2.1 總體設(shè)計方案
本文提出一種根據(jù)用戶配置文件自動進行協(xié)議數(shù)據(jù)識別的解決方案,該方案主要由以下部分構(gòu)成,即用戶配置文件、詞法分析器自動生成器、語法分析器自動生成器、數(shù)據(jù)幀識別器,方案結(jié)構(gòu)如圖1 所示。用戶配置文件協(xié)議形式化描述語法規(guī)則配置詞法分析器自動生成器語法分析器自動生成器數(shù)據(jù)幀識別器數(shù)據(jù)幀 數(shù)據(jù)幀分析結(jié)果圖1 總體方案結(jié)構(gòu)程序運行時,首先根據(jù)用戶配置文件自動生成詞法分析器和語法分析器,數(shù)據(jù)幀識別器把接收到的數(shù)據(jù)幀進行詞法分析,然后進行語法分析,最后得到分析結(jié)果。這樣做的好處是,一旦底層應(yīng)用設(shè)備協(xié)議發(fā)生變化,就可以適當(dāng)更改用戶配置文件,而不必把整個程序重新編譯。
2.2 用戶配置文件設(shè)計
用戶配置文件是本文方案的基礎(chǔ)所在,一個良好的配置文件設(shè)計,能夠大大簡便以后詞法分析器和語法分析器的生成。由圖1 可以看出,在設(shè)計時采用了2 個文件單獨配置的方法:(1)底層設(shè)備協(xié)議的形式化描述,該配置文件主要用來自動生成詞法分析器;(2)用戶定義的語法規(guī)則,用來自動生成語法分析器。
協(xié)議的形式化描述實際上就是通過分析設(shè)備的協(xié)議定義,用正規(guī)式集的方式表現(xiàn)出來,以便進行詞法分析。一條命令幀或響應(yīng)幀的基本格式為:命令頭_命令_參數(shù)_數(shù)據(jù)命令頭:Gnn, AnnG:代表命令A(yù):代表響應(yīng)nn:命令或響應(yīng)的序號命令:由兩個字母表示的命令或響應(yīng)的內(nèi)容參數(shù):參數(shù)表示了數(shù)據(jù)的來源、個數(shù)、大小、類型等數(shù)據(jù):數(shù)據(jù)值,有的命令和響應(yīng)沒有數(shù)據(jù)部分_:代表一個或多個空格此類消息的形式化描述,即正規(guī)式集如下所示:digit [0-9]commandtype (a|g|p){digit}{digit}interrupt (p){digit}{digit}id [a-z][a-z0-9_ ]*integer {digit}{digit}*exp [Ee][+-]?{digit}+float ({digit}*"."{digit}+({exp})?)|({digit}+"."{digit}*({exp})?)token [a-z0-9_]+command (si)|(mn)|(sp)|(fg)|(fp)|(fs)| (ms)|(bf)| (bg)|(bd)|(bk)|(pm)|(sc)|(ac)datatype (int)|(flt)|(chr)|(der)bool (on)|(off)
value {integer}|{float}|{token}string語法規(guī)則定義是用戶配置文件的主要部分,它既可以讓用戶定義一定的語法規(guī)則,還能夠讓用戶決定在符合規(guī)則的情況下什么樣的數(shù)據(jù)幀接受,什么樣的數(shù)據(jù)幀拋棄,以及接受的數(shù)據(jù)幀哪一部分需要存儲等一系列動作。該配置文件首先應(yīng)該給出詞法分析所能識別的協(xié)議關(guān)鍵字,這樣用戶就可以根據(jù)這些關(guān)鍵字和協(xié)議手冊實現(xiàn)白己的配置。這些關(guān)鍵字的形式化描述上面己經(jīng)給出。另外還應(yīng)該包括己經(jīng)提前定義的動作。本文在設(shè)計中采用了提前定義動作函數(shù)的方法。再就是規(guī)定用戶配置條目的格式,具體設(shè)計包括兩部分:
(1)語法規(guī)則條
語法規(guī)則條主要是用戶根據(jù)具體需要寫出程序應(yīng)該能夠識別的語法規(guī)則,該語法規(guī)則并不要求用戶寫出所有同該協(xié)議有關(guān)的條目,僅需要寫出用戶需要的規(guī)則即可。例如某用戶僅需要識別返回數(shù)據(jù)的響應(yīng)幀,就可以寫成:commandtype_command_integer_parameter_data不必將并非返回數(shù)據(jù)的命令幀commandtype_ command__ _寫出。
(2)相應(yīng)動作項
相應(yīng)動作項是發(fā)現(xiàn)符合用戶定義的語法規(guī)則的數(shù)據(jù)幀后應(yīng)該執(zhí)行什么樣的動作,常用的是存儲,一般是數(shù)據(jù)項的存儲,也可能是用戶感興趣的命令類型的存儲等。例如,如果定義一個動作save(string key)可以把key 對應(yīng)的實際數(shù)據(jù)值存到一個全局變量中,那么用戶就可以在該分析器以外通過配置和調(diào)用從而獲得感興趣的數(shù)據(jù)。相應(yīng)配置條目可以寫成:commandtype_command_integer_parameter_data {save(data);}表示發(fā)現(xiàn)符合上述語法規(guī)則的數(shù)據(jù)幀就接受,并且存儲data 數(shù)據(jù)項到全局變量。
2.3 詞法分析器自動生成器
詞法分析器的主要目的是讀取用戶的形式化描述,然后自動生成協(xié)議驅(qū)動表,即本文所說的詞法分析器。詞法分析器自動生成器的主要部分就是3 個主要算法,這3 個主要算法實現(xiàn)了從正規(guī)表達式到最小化確定有限自動機的一步步轉(zhuǎn)換。最后生成的最小化確定有限自動機,既可以包括所有形式化描述的最小化確定有限自動機,也可以是針對每一個形式化描述的最小化確定有限自動機。本文采取的是后者。相應(yīng)的數(shù)據(jù)結(jié)構(gòu)如下:Sword[]單詞數(shù)組,包含有3 個域:Name 域代表可識別的單詞名稱;States[]代表該單詞狀態(tài)數(shù)組;Trans[]是狀態(tài)轉(zhuǎn)移矩陣,Nstate=Trans[inChr] [curState]。
(1)從正規(guī)表達式到NFA
設(shè)計中用狀態(tài)轉(zhuǎn)換圖來分別表示相應(yīng)的NFA 或DFA,而在內(nèi)存中的表示,則使用狀態(tài)矩陣表示,即上面提到的Trans[]。在手工方式下,可以手工對每一類單詞建立一張狀態(tài)轉(zhuǎn)換圖,然后把所有的狀態(tài)轉(zhuǎn)換圖合并成一張統(tǒng)一的狀態(tài)圖。在程序自動生成中,所有狀態(tài)以及狀態(tài)轉(zhuǎn)換都需要保存,以便后繼處理的使用。
(2)從NFA 到DFA
從不確定的有限自動機N 轉(zhuǎn)換為一個等價的確定有限自動機M,可以用子集構(gòu)造法完成[3]。M 的每個狀態(tài),對應(yīng)于N 的一個狀態(tài)的集合。其基本思想是:M 讀入一個給定的輸入串之后處于狀態(tài){x, y, z},當(dāng)且僅當(dāng)N 可能處在x, y, z 中任何一個狀態(tài),視N 選定哪個狀態(tài)而定。讓M 記住N 可能走的全部可能路線,并讓M 同N 平行地工作。M 的接收狀態(tài)將是任何含有N 的接收狀態(tài)的任何集合。
(3)DFA 的最小確定化
經(jīng)過上述建立的DFA 并不是最優(yōu)的,其狀態(tài)數(shù)比必要的狀態(tài)數(shù)可能要多,因此需要對這個DFA 進行最小化,其基本思想是:在一個狀態(tài)集合中,還有不等價狀態(tài),就把不等價的狀態(tài)分開,使一個集合中的狀態(tài)等價。分開后,如果一個集合中的狀態(tài)還有不等價的,就繼續(xù)分開,直到每個分開的小集合中的狀態(tài)都等價為止。
2.4 語法分析器自動生成器
有了以上的詞法分析器自動生成器,就可以生成能夠識別協(xié)議形式化描述中的所定義的單詞。而這些單詞,正是本文在用戶語法規(guī)則條中所使用的。利用用戶所定義的語法規(guī)則,生成相應(yīng)的語法樹。
由于該語法分析器是通過讀取用戶配置文件生成,因此首先要有一個小的詞法分析器,能夠識別文件中的單詞,該詞法分析器是按照文件中配置條的特殊字符進行分割,然后對比形式化描述文件中的定義,識別特定的和己經(jīng)定義的單詞符號。語法分析樹自動生成器如圖2 所示。
圖2 語法分析樹自動生成器
(1)腳本文件識別器
腳本文件識別器主要是識別配置文件中所定義的節(jié)點關(guān)鍵詞,如command, integer 等,即在語法配置文件中所出現(xiàn)的Sword[]中的name 域。該識別器也是一個詞法分析器,只不過,它所要進行的動作是按照特定的分割字符,識別關(guān)鍵詞。例如配置條目commandtype_command_integer_parameter_data {save(data);}中所出現(xiàn)的commandtype, command, integer, parameter,data 等。
首先是把形式化描述中的名稱定義為關(guān)鍵字,然后通過詞法分析的方法,識別語法配置腳本中的關(guān)鍵詞,并且記下識別的順序。
(2)語法樹生成
考慮到本文所要進行的語法分析,是一種比較簡單的對比分析,只要符合配置條目中所出現(xiàn)的語法配置條,就可以執(zhí)行其后的動作。因為在設(shè)計中把配置條目的動作也作為一個單獨的節(jié)點掛在語法樹葉子節(jié)點的。這樣一旦語法分析走到葉子節(jié)點,就可以認為是語法匹配,再進一步走到動作節(jié)點,去執(zhí)行相應(yīng)的語法動作。
2.5 數(shù)據(jù)幀識別器
當(dāng)詞法分析器和語法分析器都建立起來以后,就可以對數(shù)據(jù)幀進行分析識別。數(shù)據(jù)幀識別器接收數(shù)據(jù)幀,然后調(diào)用詞法分析器識別單詞,然后根據(jù)識別出的單詞的順序去查語法樹,最后執(zhí)行能夠識別的語法的對應(yīng)動作。
當(dāng)系統(tǒng)取得所要識別的數(shù)據(jù)幀后,首先把它轉(zhuǎn)換成字符串,然后存到字符緩沖區(qū);詞法分析器從緩沖區(qū)的頭部開始進行狀態(tài)匹配,如果出現(xiàn)不匹配的情況要進行字符回退,詞法分析的結(jié)果是把所有的單詞識別出來并按順序存儲。隨后這些按順序存儲的單詞查找語法樹,并執(zhí)行能夠匹配的語法樹的動作。其結(jié)構(gòu)如圖3 所示。
圖3 數(shù)據(jù)幀識別器結(jié)構(gòu)
3 結(jié)束語
該系統(tǒng)如果底層協(xié)議發(fā)生變化,只需要在形式化描述文件中加入新的協(xié)議形式化描述,在用戶語法配置文件中加入新的語法配置條。程序啟動時,會自動生成相應(yīng)的詞法分析器和語法分析器,此時的詞法分析器和語法分析器己經(jīng)是不同于先前而是適合于現(xiàn)在底層協(xié)議的分析器,協(xié)議識別主程序就會調(diào)用該新生成的詞法分析器和語法分析器分別進行詞法分析和語法分析,從而進行相應(yīng)的數(shù)據(jù)提取。此過程完全避免了應(yīng)用程序的重新編譯,而且,一般用戶經(jīng)過簡單培訓(xùn),也可以方便地對配置文件進行手工配置,解放了開發(fā)人員對整個應(yīng)用程序的維護[4]。
轉(zhuǎn)載請注明來自發(fā)表學(xué)術(shù)論文網(wǎng):http:///dzlw/6030.html