本發明涉及工業自動化控制
技術領域:
,特別是涉及一種plc程序到nusmv輸入模型的自動化構建方法。
背景技術:
:工業控制系統廣泛應用到工業自動化控制領域,比如電力、石油、國防科技等國家基礎設施,以及食品、醫藥、交通等民生領域。工控安全事關經濟發展、社會穩定和國家安全。近年來,隨著信息化和工業化深入融合,工業控制系統從單機走向互聯,從封閉走向開放,從自動化走向智能化,但同時也給工業控制系統安全帶來前所未有的挑戰。工業控制器,即可編程邏輯控制器(plc)作為工業控制系統的大腦,是一種專門用于工業控制的計算機,通過其上運行的業務代碼控制整個系統的運行,plc代碼的安全直接管關系到整個工業控制系統的安全。可編程邏輯控制器支持梯形圖語言(ld)、指令表語言(il)、功能模塊圖語言(fbd)、順序功能流程圖語言(sfc)及結構化文本語言(st)等多種編程語言。plc代碼安全主要包括兩個方面:一是plc代碼自身存在的代碼缺陷,比如空指針引用、數組下標越界、無效跳轉、無限循環、冗余代碼等代碼缺陷,二是plc代碼違反安全需求,比如狀態沖突、時序沖突、傳感器閾值、控制量閾值等安全需求規約。plc代碼缺陷的發現及安全規約違反驗證主要采用模型檢測的方法,此方法成為工業控制系統安全防護中最基本最有效的方法。目前研究中主要有三種模型檢測工具,一種是基于smv的模型檢測工具,包含符號模型檢測技術和二元決策圖,分為nusmv和cadencesmv兩種類型。另一種是基于時間自動機,其大部分來自于uppaal家族或krono。第三種是spin`模型檢查器。nusmv是基于smv的模型檢測工具,廣泛應用于可編程邏輯控制器缺陷代碼的發現,但是nusmv不能直接對plc源程序進行處理,只能手工將源程序翻譯為nusmv輸入模型,然后再進行模型檢測,不僅浪費大量的人力,而且容易出錯。而目前國內外關于plc程序的研究主要是定義plc程序指稱語義的格局、程序語言的語義函數,但這些研究僅停留在簡單對plc程序語義的形式化定義上面。技術實現要素:針對現有技術中存在的缺陷,本發明提供了一種plc程序到nusmv輸入模型的自動化構建方法,大大提高nusmv工具對plc程序進行模型檢測的效率和準確度,實現對工業控制系統plc代碼的安全性驗證。為了實現上述目的,本發明采用以下的技術方案:一種plc程序到nusmv輸入模型的自動化構建方法,包括以下步驟:步驟1,對plc的st語言進行分析,構建st語言的語法;步驟2,根據步驟1給出的st語法對st程序進行處理,將st程序解析為抽象語法樹ast;步驟3,對抽象語法樹ast進行處理,分析st語言語句的控制流特征,確定各語句生成控制流圖cfg的算法;步驟4,根據控制流圖cfg對st程序進行數據流分析,構建狀態轉換鄰接表和變量取值變化鄰接表;步驟5,根據步驟4構建的狀態轉換鄰接表和變量取值變化鄰接表生成nusmv輸入模型。進一步地,所述步驟1中,對plc的st語言進行分析的具體內容是:分析st語言的架構、關鍵字、表達式、賦值、注釋、操作符優先級、條件語句、循環語句以及跳轉語句。進一步地,所述步驟2的具體實現過程如下:步驟201,創建若干個eclipse項目,通過eclipse向導:file->new->project...->xtext->xtextproject;步驟202,選擇項目名稱、語言名稱以及文件擴展名;步驟203,輸入st語言的語法,執行代碼生成器生成各種語言組建,在項目中選中文件generatedomainmodel.mwe2,點擊右鍵runas->mwe2workow,將會觸發xtext語言生成器,生成解析器和序列化器。進一步地,所述控制流圖cfg的結構為:用二元結構cfg=(n,e)表示控制流圖cfg,其中,n代表控制流圖節點的集合,e代表控制流圖弧的集合;控制流圖cfg采用基于十字鏈表的存儲方式進行存儲,節點表示的數據結構如下表:nnumfirstinfirstout其中,nnum表示節點的編號,firstin指向以該節點為弧頭的第一個弧節點,firstout指向以該節點為弧尾的第一個弧節點;弧表示的數據結構如下表:tailnumheadnumetypeguardassignmenthlinktlink其中,tailnum表示弧尾的節點編號,headnum表示弧頭的節點編號,etype表示弧的類型,etype={1,0},當etype=1時,表示弧為分支弧,guard指向對應的條件謂詞取值表達式,assignment為空,當etype=0時,表示弧為順序弧,guard為空,assignment指向對應的賦值語句鏈表,hlink指向弧頭相同的下一條弧,tlink指向弧尾相同的下一條弧。進一步地,所述步驟3中,確定各語句生成控制流圖cfg的算法具體為:根據控制流圖cfg的結構生成賦值語句、if語句、case語句、for語句、while語句以及repeat語句的控制流圖;對于賦值語句直接添加到數據列表assignment中;對于if語句,首先獲得條件語句,并根據條件語句的真假創建兩條分支弧,在遇到關鍵字end_if時,這兩條分支指向匯合節點;對于st語言的case語句,表示多分支結構,首先根據case變量的n個不同的取值生成n條由case頂點到n個不同值節點的弧,然后在遇到關鍵字end_case時,這n條分支指向匯合節點;for語句、while語句以及repeat語句,均是根據條件語句的真假分別生成兩條分支弧,循環體對應生成一條弧,且該弧與條件為真的那條弧的兩個節點相同,方向反向;最后將生成的弧存儲到數組列表arraylist中。進一步地,所述步驟4中,根據控制流圖cfg對st程序進行數據流分析,定義如下的數據結構來表示控制流圖的狀態遷移關系:guardstatenext其中,guard表示狀態遷移所需要滿足的條件,state表示狀態遷移的目標狀態,next指向下一個狀態遷移,定義如下數據結構用于表示系統內變量的取值變化:stateexprnext其中,state表示變量被賦值前的狀態,expr表示系統內變量賦值語句右側的數值或表達式,next表示該變量下一個取值變化;遍歷步驟3生成的弧的數組列表arraylist,參照上述兩個數據結構,分別生成狀態轉換鄰接表state_list以及變量取值變化鄰接表var_list。進一步地,所述nusmv輸入模型包括狀態集合部分、變量聲明部分、狀態轉換部分和變量數據值變化部分;遍歷狀態轉換鄰接表生成狀態集合部分和狀態轉換部分,遍歷變量取值變化鄰接表獲得變量聲明部分和變量數據值變化部分。與現有技術相比,本發明具有以下優點:1、本發明針對目前模型檢測工具都擁有獨特的輸入模型,plc程序不能作為直接輸入,需要人工根據plc程序構建模型檢測器的輸入,造成plc程序的模型檢測準確率和效率低的問題,對plc程序進行解析,控制流分析、數據流分析,將plc程序自動化構建為模型檢測工具的輸入模型,提高plc程序的模型檢測準確率以及效率。附圖說明圖1是本發明一種plc程序到nusmv輸入模型的自動化構建方法的流程示意圖;圖2是本發明一種plc程序到nusmv輸入模型的自動化構建方法的框架圖。具體實施方式下面結合附圖和實施例,對本發明的具體實施方式作進一步詳細描述:實施例一,如圖1和圖2所示,一種plc程序到nusmv輸入模型的自動化構建方法,包括以下步驟:步驟1,對plc的st語言進行分析,構建st語言的語法;根據iec61131-3標準,對plc的st語言進行分析,分析st語言的架構、關鍵字、表達式、賦值、注釋、操作符優先級、條件語句、循環語句以及跳轉語句等特征,編寫對應的語法形式。作為一種實施方式,以條件語句if語句為例編寫對應的語句語法如下:if_stmt→ifconditionthenstatement{elsestatement}end_if。步驟2,根據步驟1給出的st語法對st程序進行處理,將st程序解析為抽象語法樹ast;進一步地,利用xtext特定的編程語言開源框架將st程序解析為抽象語法樹ast;具體實現過程如下:步驟201,創建若干個eclipse項目,通過eclipse向導:file->new->project...->xtext->xtextproject;步驟202,選擇項目名稱、語言名稱以及文件擴展名;步驟203,輸入st語言的語法,執行代碼生成器生成各種語言組建,在項目中選中文件generatedomainmodel.mwe2,點擊右鍵runas->mwe2workow,將會觸發xtext語言生成器,生成解析器和序列化器,以及一些其他基礎結構代碼,可以在控制臺的日志消息中看到相應的過程。步驟3,對抽象語法樹ast進行處理,分析st語言語句的控制流特征,確定各語句生成控制流圖cfg的算法;在本實施例中,用二元結構cfg=(n,e)表示控制流圖cfg,其中,n代表控制流圖節點的集合,e代表控制流圖弧的集合;控制流圖cfg采用基于十字鏈表的存儲方式進行存儲,節點表示的數據結構如下表:nnumfirstinfirstout其中,nnum表示節點的編號,firstin指向以該節點為弧頭的第一個弧節點,firstout指向以該節點為弧尾的第一個弧節點;弧表示的數據結構如下表:tailnumheadnumetypeguardassignmenthlinktlink其中,tailnum表示弧尾的節點編號,headnum表示弧頭的節點編號,etype表示弧的類型,etype={1,0},當etype=1時,表示弧為分支弧,guard指向對應的條件謂詞取值表達式,assignment為空,當etype=0時,表示弧為順序弧,guard為空,assignment指向對應的賦值語句鏈表,hlink指向弧頭相同的下一條弧,tlink指向弧尾相同的下一條弧。根據控制流圖cfg的結構生成賦值語句、if語句、case語句、for語句、while語句以及repeat語句的控制流圖;對于賦值語句直接添加到數據列表assignment中;對于if語句,首先獲得條件語句,并根據條件語句的真假創建兩條分支弧,不管if語句中有沒有else關鍵字,都會有兩條對應于if條件為真或為假的分支,并且最終在遇到關鍵字end_if時,這兩條分支指向匯合節點;對于st語言的case語句,表示多分支結構,首先根據case變量的n個不同的取值生成n條由case頂點到n個不同值節點的弧,然后在遇到關鍵字end_case時,這n條分支指向匯合節點;for語句、while語句以及repeat語句,均是根據條件語句的真假分別生成兩條分支弧,循環體對應生成一條弧,且該弧與條件為真的那條弧的兩個節點相同,方向反向;最后將生成的弧存儲到數組列表arraylist中。步驟4,根據控制流圖cfg對st程序進行數據流分析,構建狀態轉換鄰接表和變量取值變化鄰接表;在本實施例中,根據控制流圖cfg對st程序進行數據流分析,定義如下的數據結構來表示控制流圖的狀態遷移關系:guardstatenext其中,guard表示狀態遷移所需要滿足的條件,state表示狀態遷移的目標狀態,next指向下一個狀態遷移,定義如下數據結構用于表示系統內變量的取值變化:stateexprnext其中,state表示變量被賦值前的狀態,expr表示系統內變量賦值語句右側的數值或表達式,next表示該變量下一個取值變化;遍歷步驟3生成的弧的數組列表arraylist,參照上述兩個數據結構,分別生成狀態轉換鄰接表state_list以及變量取值變化鄰接表var_list。步驟5,根據步驟4構建的狀態轉換鄰接表和變量取值變化鄰接表生成nusmv輸入模型。所述nusmv輸入模型包括狀態集合部分、變量聲明部分、狀態轉換部分和變量數據值變化部分;遍歷狀態轉換鄰接表生成狀態集合部分和狀態轉換部分,遍歷變量取值變化鄰接表獲得變量聲明部分和變量數據值變化部分。以上所示僅是本發明的優選實施方式,應當指出,對于本
技術領域:
的普通技術人員來說,在不脫離本發明原理的前提下,還可以做出若干改進和潤飾,這些改進和潤飾也應視為本發明的保護范圍。當前第1頁12