本發(fā)明屬于工業(yè)控制編程領(lǐng)域,具體涉及結(jié)構(gòu)化文本代碼的處理方法。
背景技術(shù):
IEC61131標(biāo)準(zhǔn)將結(jié)構(gòu)化、模塊化編程引入工業(yè)控制領(lǐng)域,可提高PLC、DCS等控制系統(tǒng)的開放性、兼容性、可維護(hù)性。符合IEC61131標(biāo)準(zhǔn)的控制器產(chǎn)品,即使是不同廠家制造,其編程語言和使用方法也是相同的,產(chǎn)品維護(hù)人員和用戶可以一次學(xué)習(xí),多次使用,可減少人員培訓(xùn)、系統(tǒng)維護(hù)的成本。其中結(jié)構(gòu)化文本由于不涉及到圖形的存儲格式,以純文本的代碼來實現(xiàn)程序的邏輯,可實現(xiàn)復(fù)雜的控制算法,并利于不同版本、不同廠家的程序復(fù)用,得到了廣泛應(yīng)用。
結(jié)構(gòu)化文本(ST)是一種是類似于Pascal的高級編程語言,特別適合復(fù)雜的算法技術(shù),程序結(jié)構(gòu)清晰,便于編程人員和操作維護(hù)人員進(jìn)行算法溝通。結(jié)構(gòu)化文本需要轉(zhuǎn)換為裝置可運行的目標(biāo)文件才能運行。常規(guī)的實現(xiàn)方案是將結(jié)構(gòu)化文本轉(zhuǎn)換為解釋型指令,在裝置內(nèi)解釋執(zhí)行,其缺點是運行效率低,不適用實時性要求高的應(yīng)用場景。有廠家將ST代碼直接轉(zhuǎn)換為機器指令,當(dāng)更新硬件型號時,需要修改轉(zhuǎn)換表,同時從ST代碼轉(zhuǎn)換到機器匯編指令的過程復(fù)雜,出現(xiàn)錯誤時很難定位和排查,存在隱患。也有文獻(xiàn)提出將ST代碼轉(zhuǎn)換為C語言,并將整個工程編譯為1個二進(jìn)制目標(biāo)文件后運行,將ST代碼轉(zhuǎn)換為C語言,轉(zhuǎn)換關(guān)系明確可視,之后調(diào)用經(jīng)過嚴(yán)格測試和大規(guī)模應(yīng)用的第三方編譯器編譯C代碼,過程可靠,C代碼的運行效率高,適用于實時性要求高的場景。然而工業(yè)控制和其它行業(yè)編程的一個顯著差異是,需要在裝置運行時刻能部分更新替換程序,裝置的實時任務(wù)不能中斷。如果編譯為1個可執(zhí)行程序,即使只修改一行代碼,也需重新形成代碼,重新編譯鏈接形成可執(zhí)行程序,并停止裝置程序運行,重新加載可執(zhí)行程序,無法滿足在線無擾更新的場景。因此,在面向工業(yè)控制應(yīng)用開發(fā)中,用戶需要使用標(biāo)準(zhǔn)的結(jié)構(gòu)化文本,轉(zhuǎn)換后的代碼需要高效率運行,還需要支持增量無擾更新等關(guān)鍵需求,尚未有文獻(xiàn)提出同時滿足上述需求的可行解決方案,為了解決上述問題,本案由此產(chǎn)生。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的是將結(jié)構(gòu)化文本轉(zhuǎn)換為高效率運行的目標(biāo)代碼,并以程序組織單元(POU)為單位獨立編譯為二進(jìn)制組件庫,實現(xiàn)程序高效率運行和在線增量更新。為了達(dá)成上述目的,本發(fā)明提供一種結(jié)構(gòu)化文本代碼處理方法,其特征在于包括如下步驟:
將結(jié)構(gòu)化文本代碼按照程序組織單元轉(zhuǎn)換為C代碼文件;
在轉(zhuǎn)換過程中嵌入預(yù)定義的接口函數(shù);
將各個程序組織單元轉(zhuǎn)換后的C代碼文件編譯為獨立的二進(jìn)制組件庫;
裝置獲取并加載若干二進(jìn)制組件庫,運行接口函數(shù)。
優(yōu)選地,所述方法還包括:
裝置的功能代碼由若干編譯后二進(jìn)制組件構(gòu)成,裝置在初始化時加載各個組件,獲取固定名稱的C接口函數(shù)地址,形成初始化、運行函數(shù)鏈表。
裝置運行過程中,可替換更新二進(jìn)制組件庫。裝置在非實時線程中更新替換加載組件,記錄新的接口函數(shù)地址,在實時任務(wù)運行階段更新組件接口函數(shù)地址,實現(xiàn)組件增量更新。
單個程序組織單元轉(zhuǎn)換后的C代碼包括如下內(nèi)容:輸入變量聲明、輸出變量聲明、功能塊實例名聲明、系統(tǒng)功能回調(diào)函數(shù)指針變量、組件的初始化接口函數(shù)、組件的任務(wù)接口函數(shù)、組件變量讀寫接口函數(shù)。
在代碼轉(zhuǎn)換前,預(yù)先建立IEC61131-3標(biāo)準(zhǔn)定義的變量類型、函數(shù)、功能塊、語句的轉(zhuǎn)換映射表,根據(jù)轉(zhuǎn)換映射表,將結(jié)構(gòu)化文本代碼轉(zhuǎn)換為有限子集的C代碼。
優(yōu)選地,所述的裝置包括嵌入式裝置和PC機虛擬裝置。針對嵌入式Linux操作系統(tǒng)的裝置,組件編譯為*.so文件,針對嵌入式Vxworks操作系統(tǒng)的裝置,組件編譯為*.cdf文件,針對PC機虛擬裝置,組件編譯為*.dll文件。
優(yōu)選地,裝置在加載組件時,將全局變量讀寫接口函數(shù)地址賦給組件內(nèi)系統(tǒng)功能回調(diào)函數(shù)指針變量,組件之間的數(shù)據(jù)交互通過調(diào)用函數(shù)指針實現(xiàn)。
一種結(jié)構(gòu)化文本代碼處理系統(tǒng),其特征在于,所述系統(tǒng)包括:結(jié)構(gòu)化文本編輯模塊、代碼轉(zhuǎn)換模塊、代碼編譯模塊、通信模塊、系統(tǒng)軟件模塊。其中:
所述的結(jié)構(gòu)化文本編輯模塊,提供文本編輯界面,編寫結(jié)構(gòu)化文本代碼,并以程序組織單元為單位存儲多個文本代碼;
所述的代碼轉(zhuǎn)換模塊,以程序組織單元為單位分析結(jié)構(gòu)化文本代碼,轉(zhuǎn)換為對應(yīng)的C代碼文件,并在C代碼中嵌入和系統(tǒng)軟件模塊預(yù)定義的接口函數(shù);
所述的代碼編譯模塊,自動形成Makefile文件,調(diào)用嵌入式裝置或PC機虛擬裝置對應(yīng)的編譯器,將C代碼文件編譯形成二進(jìn)制組件庫;
所述的通信模塊,用于將編譯后的二進(jìn)制組件傳輸?shù)窖b置指定目錄;
所述的系統(tǒng)軟件模塊,運行在裝置中。裝置系統(tǒng)軟件模塊在初始化時加載各個組件,獲取固定名稱的C接口函數(shù)地址,形成初始化、運行函數(shù)鏈表。在實時任務(wù)中運行各個組件的任務(wù)函數(shù)。裝置運行過程中,系統(tǒng)軟件模塊的非實時線程可更新替換加載組件,記錄新的接口函數(shù)地址,在實時任務(wù)運行階段更新組件接口函數(shù)地址,實現(xiàn)組件增量更新。
采用上述方案后,本發(fā)明具有如下有益效果:以程序組織單元為單位將將ST轉(zhuǎn)換為C代碼,并且在轉(zhuǎn)換過程中設(shè)計相關(guān)程序結(jié)構(gòu),嵌入預(yù)定義接口,并編譯為獨立的二進(jìn)制組件,系統(tǒng)軟件模塊加載組件,提取預(yù)定義接口,運行組件任務(wù)函數(shù),確保了程序的高效率可靠運行。支持以程序組織單元對應(yīng)的組件的更新替換,實現(xiàn)裝置運行時刻可替換部分ST代碼對應(yīng)的功能,即保證了高效率運行,也實現(xiàn)了高可靠地在線增量更新,更新過程中不需要停止裝置的實時運行功能。
附圖說明
圖1是本發(fā)明中的結(jié)構(gòu)化文本代碼處理過程;
圖2是本發(fā)明中組件結(jié)構(gòu)原理圖;
圖3是本發(fā)明中增量更新原理圖;
圖4是本發(fā)明中結(jié)構(gòu)化文本處理系統(tǒng)圖;
具體實施方式
以下將結(jié)合附圖,對本發(fā)明的技術(shù)方案進(jìn)行詳細(xì)說明。以圖1為例,結(jié)構(gòu)化文本代碼處理方法實現(xiàn)步驟如下:
1)將結(jié)構(gòu)化文本代碼按照程序組織單元轉(zhuǎn)換為C代碼文件。結(jié)構(gòu)化文本以程序組織單元為單位存儲為若干ST文本文件,將ST文本文件轉(zhuǎn)換為C代碼文件。優(yōu)選地,可基于flex-bison構(gòu)建相應(yīng)的語義樹,完成前端分析和提取工作。開發(fā)后端轉(zhuǎn)換模塊,在轉(zhuǎn)換過程中,獲取預(yù)先定義的轉(zhuǎn)換表,構(gòu)建ST語言的變量類型、語句類型對應(yīng)的C語言轉(zhuǎn)換模型,例如ST的SINT類型和C語言的char對應(yīng),ST的INT類型和C語言的short對應(yīng),ST的DATE類型和自定義的C結(jié)構(gòu)體對應(yīng),ST的IF-ELSE語句轉(zhuǎn)換為C語言的if-else語句等。
2)在轉(zhuǎn)換過程中嵌入預(yù)定義的接口函數(shù)。將C代碼文本按照輸入變量聲明、輸出變量聲明、功能塊實例名聲明、系統(tǒng)功能回調(diào)函數(shù)指針變量、組件的初始化接口函數(shù)、組件的任務(wù)接口函數(shù)、組件變量讀寫接口函數(shù)等順序組織。其中組件的初始化接口函數(shù)、組件的任務(wù)接口函數(shù)、組件變量讀寫接口函數(shù)為系統(tǒng)軟件預(yù)先定義的接口函數(shù),在相關(guān)接口函數(shù)內(nèi)形成相關(guān)變量設(shè)置、函數(shù)調(diào)用的代碼。優(yōu)選地,預(yù)先定義的接口函數(shù)可命名為compInit、compTask、compReadVar、compWriteVar等。
3)將各個程序組織單元轉(zhuǎn)換后的C代碼文件編譯為獨立的二進(jìn)制組件庫。將公共系統(tǒng)庫(通用的結(jié)構(gòu)體、IEC61131-3標(biāo)準(zhǔn)的函數(shù)、功能塊對應(yīng)的C代碼庫)、C代碼文件編譯鏈接為組件。C代碼組件原理如圖2所示,以PC機虛擬裝置運行的組件為例,在Windows下組件編譯為動態(tài)鏈接庫(dll),dll是一組源代碼模塊,每個模塊包括一組可被外部模塊調(diào)用的函數(shù),模塊的變量作為私有數(shù)據(jù),通過接口函數(shù)訪問和修改。
4)裝置獲取并加載若干二進(jìn)制組件庫,運行接口函數(shù)。裝置的功能代碼由若干編譯后二進(jìn)制組件構(gòu)成,裝置系統(tǒng)軟件在初始化時加載各個組件,組件文件被映射到裝置系統(tǒng)軟件進(jìn)程的地址空間,操作系統(tǒng)為組件分配相關(guān)變量對應(yīng)的存儲器。裝置系統(tǒng)軟件獲取固定名稱的C接口函數(shù)地址,形成初始化、運行函數(shù)鏈表。組件之間的數(shù)據(jù)交互通過調(diào)用全局變量讀寫接口函數(shù)指針實現(xiàn)。
5)裝置運行過程中,可替換更新二進(jìn)制組件庫。如圖3所示,裝置在非實時線程中更新替換加載組件,記錄新的接口函數(shù)地址,在實時任務(wù)運行階段更新組件接口函數(shù)地址,實現(xiàn)組件增量更新。
一種結(jié)構(gòu)化文本代碼處理系統(tǒng),所述系統(tǒng)如圖4所示,包括:結(jié)構(gòu)化文本編輯模塊、代碼轉(zhuǎn)換模塊、代碼編譯模塊、通信模塊、系統(tǒng)軟件模塊。其中:
所述的結(jié)構(gòu)化文本編輯模塊,提供文本編輯界面,編寫結(jié)構(gòu)化文本代碼,并以程序組織單元為單位存儲多個文本代碼;
所述的代碼轉(zhuǎn)換模塊,以程序組織單元為單位分析結(jié)構(gòu)化文本代碼,轉(zhuǎn)換為對應(yīng)的C代碼文件,并在C代碼中嵌入和系統(tǒng)軟件模塊預(yù)定義的接口函數(shù);
所述的代碼編譯模塊,自動形成Makefile文件,調(diào)用嵌入式裝置或PC機虛擬裝置對應(yīng)的編譯器,將C代碼文件編譯形成二進(jìn)制組件庫;
所述的通信模塊,用于將編譯后的二進(jìn)制組件傳輸?shù)窖b置指定目錄;
所述的系統(tǒng)軟件模塊,運行在裝置中。裝置系統(tǒng)軟件模塊在初始化時加載各個組件,獲取固定名稱的C接口函數(shù)地址,形成初始化、運行函數(shù)鏈表。在實時任務(wù)中運行各個組件的任務(wù)函數(shù)。裝置運行過程中,系統(tǒng)軟件模塊的非實時線程可更新替換加載組件,記錄新的接口函數(shù)地址,在實時任務(wù)運行階段更新組件接口函數(shù)地址,實現(xiàn)組件增量更新。
以上實施例僅為說明本發(fā)明的技術(shù)思想,不能以此限定本發(fā)明的保護(hù)范圍,凡是按照本發(fā)明提出的技術(shù)思想,在技術(shù)方案基礎(chǔ)上所做的任何改動,均落入本發(fā)明保護(hù)范圍之內(nèi)。