• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      基于Scintilla的PLC結(jié)構(gòu)化文本語言編輯器的設(shè)計(jì)

      2016-01-18 02:44:35
      自動(dòng)化與儀表 2016年9期
      關(guān)鍵詞:編輯器結(jié)構(gòu)化編程

      (南瑞集團(tuán)公司(國網(wǎng)電力科學(xué)研究院),南京 210003)

      結(jié)構(gòu)化文本(structured text)語言是IEC61131-3中規(guī)定的PLC的5種編程語言之一,與梯形圖相比,結(jié)構(gòu)化文本語言簡單高效、易于掌握,用于數(shù)據(jù)處理和數(shù)據(jù)計(jì)算方面的PLC編程,程序結(jié)構(gòu)更清晰,易于理解和維護(hù)。目前國外的主流PLC產(chǎn)品如AB、施耐德、三菱等已經(jīng)支持結(jié)構(gòu)化文本語言編程,并可以結(jié)合各自公司提供的PLC組態(tài)軟件使用,功能十分完備[1-2]。

      南瑞集團(tuán)自主設(shè)計(jì)與研發(fā)的MB系列PLC,汲取了國際主流PLC的成功經(jīng)驗(yàn),并根據(jù)當(dāng)今PLC的最新發(fā)展方向,采用了計(jì)算機(jī)、通訊、電子和自動(dòng)控制等方面的國際先進(jìn)技術(shù),在CPU操作系統(tǒng)、IO信號處理、網(wǎng)絡(luò)通訊、軟件開發(fā)等方面具有優(yōu)越的性能,適用于各種自動(dòng)化控制的編程需求[3]。但是,目前的PLC組態(tài)軟件MBPro還不支持結(jié)構(gòu)化文本語言編程。為了提高M(jìn)B PLC編程的可用性和穩(wěn)定性,增加產(chǎn)品的綜合實(shí)力和市場競爭力,MBPro升級版本增加了對結(jié)構(gòu)化文本語言的編程支持[4]。

      完整的結(jié)構(gòu)化文本語言編程支持包括前臺和后臺兩部分,前臺負(fù)責(zé)編程語言的編輯和存儲,后臺負(fù)責(zé)編譯結(jié)構(gòu)化文本程序生成針對目標(biāo)平臺的可執(zhí)行程序。本文主要介紹前臺編輯界面的設(shè)計(jì)和實(shí)現(xiàn)。

      1 Scintilla介紹

      Scintilla是一個(gè)免費(fèi)、跨平臺、支持語法高亮的開源編輯控件。它完整支持源代碼的編輯和調(diào)試,包括語法高亮、錯(cuò)誤指示、代碼完成和調(diào)用提示,能包含標(biāo)記的頁邊,可用于標(biāo)記斷點(diǎn)、折疊和高亮當(dāng)前行。

      受益于開源軟件的蓬勃發(fā)展,Scintilla廣泛應(yīng)用于許多軟件中,其中包括文本編輯器NotePad、微型集成開發(fā)環(huán)境Code::Blocks、IDE插件Visual Assist、版本控制工具Tortoise SVN等。但是,大量拿來主義的簡單封裝使得這些軟件具有嚴(yán)重的同質(zhì)化,對于編輯功能只是軟件的部分功能的項(xiàng)目,對Scintilla的封裝使用符合重用的開發(fā)理念,避免了“重復(fù)制造輪子”,但是對于一些本來就是開發(fā)編輯器的項(xiàng)目,一味機(jī)械使用卻不改進(jìn)提升,對Scintilla的發(fā)展是不利的。

      Scintilla在版本3.3.3中新增了對結(jié)構(gòu)化文本語言的Lexer支持,方便用來對關(guān)鍵字著色和語法塊折疊;另外,對于MBPro軟件支持ST語言,編輯界面只是部分功能,并且受制于開發(fā)進(jìn)度和開發(fā)力量的限制,利用開源軟件可顯著提高開發(fā)效率,可以易于保證軟件質(zhì)量,增強(qiáng)軟件的可維護(hù)性。

      2 結(jié)構(gòu)化文本語言編輯器總體結(jié)構(gòu)

      本文實(shí)現(xiàn)的結(jié)構(gòu)化文本語言編輯器可以靈活嵌入MBPro,MBPro是MB系列智能可編程控制器的標(biāo)準(zhǔn)化編程軟件,它主要完成硬件配置、測點(diǎn)組態(tài)、軟件編程以及相關(guān)的調(diào)試下載工作,提供了梯形圖、流程圖等標(biāo)準(zhǔn)化編程語言。該編程軟件為工程技術(shù)人員提供了一套簡單實(shí)用的軟件編程和聯(lián)機(jī)調(diào)試的工具。

      MBPro軟件基于Windows環(huán)境的VC開發(fā),整體程序的功能結(jié)構(gòu)如圖1所示。

      圖1 MBPro功能結(jié)構(gòu)示意Fig.1 MBPro function structure diagram

      結(jié)構(gòu)化文本語言編輯器以MBPro為基礎(chǔ),功能上和梯形圖編輯器以及流程圖編輯器類似,當(dāng)需要新建或者編輯結(jié)構(gòu)化文本程序時(shí),MBPro軟件右側(cè)的編輯子窗口自動(dòng)切換為結(jié)構(gòu)化文本編輯器,針對結(jié)構(gòu)化文本語言的關(guān)鍵字進(jìn)行語法高亮渲染,同時(shí)還支持語法折疊等功能,界面友好、操作簡易,從而滿足工程應(yīng)用中結(jié)構(gòu)化文本編程需求。

      3 結(jié)構(gòu)化文本編輯器的設(shè)計(jì)和實(shí)現(xiàn)

      本文實(shí)現(xiàn)的結(jié)構(gòu)化文本語言編輯器,基于開源軟件Scintilla,進(jìn)行了2層封裝,第一層利用VC消息映射機(jī)制,將Scintilla提供的dll封裝為一個(gè)VC控件;第二層根據(jù)MVC設(shè)計(jì)模式,將控件封裝成一個(gè)VC基礎(chǔ)CView類的衍生類CStEditView,方便MBPro軟件直接調(diào)用。編輯器的封裝結(jié)構(gòu)如圖2所示。

      圖2 編輯器封裝結(jié)構(gòu)Fig.2 Editor encapsulation diagram

      3.1 Scintilla源碼獲取和編譯

      Scintilla的源碼可以在 http://scintilla.sourceforge.net/ScintillaDownload.html獲取,目前最新的版本為3.5.2。另外還有Scinilla相關(guān)的庫下載,比如wxScintilla就是Scintilla的wxWidgets移植版。另外,Scintilla的作者為了演示Scinilla的功能,編寫了一個(gè)叫SciTE的演示程序。這個(gè)演示程序的功能很強(qiáng)大,甚至可以作為我們的常用代碼編輯器。

      下載的源碼根目錄下包含README文檔,文檔中有Windows平臺下編譯的具體步驟,可以用VC的nmake,也可以用mingw的mingw32-make,編譯完成后,在 bin目錄里會得到 Scintilla.dll和SciLexer.dll文件,SciLexer.dll是包含了語法解析器的Scintilla控件。

      SciLexer.dll中包含了lexers目錄下所有語言的語法解析器,所以比較大,可以只保留ST語言的語法解析器,減小SciLexer.dll的大小,步驟如下:

      步驟1進(jìn)到lexers目錄里,移除除LexSTTXT. cxx以外的所有Lex*.cxx文件

      步驟 2執(zhí)行 LexGen.py重建 make文件和KeyWords.cxx文件(需要安裝Python)。

      步驟3重新編譯。

      3.2 Scintilla的第一層封裝

      編譯好的SciLexer.dll可以直接在VC項(xiàng)目中加載使用,程序中以Scintilla作為類名注冊一個(gè)窗體類,可以直接用這個(gè)類名建立窗體。配置和使用Scintilla,可以直接使用SendMessage API,具體方式如下:

      SendMessage(hwndScintilla,sci_command,wparam,lparam)。但是這種方式速度慢、效率不高,所以對Scintilla進(jìn)行一層封裝,先獲取直接控制函數(shù),然后用函數(shù)來配置和使用Scintilla,具體步驟如下:

      步驟 1創(chuàng)建一個(gè) CWnd的子類型 CScintillaCtrl,Scintilla所有的方法都由 CScintillaCtrl對外提供。

      步驟2利用SCI_GETDIRECTFUNCTION和SCI_GETDIRECTPOINTER消息獲取直接函數(shù)和指針。

      步驟3封裝一個(gè)CALL函數(shù),使用函數(shù)指針調(diào)用SendMessage函數(shù)。

      步驟4通過CALL函數(shù)封裝Scintilla的各種消息配置函數(shù),如設(shè)置字體信息、獲取光標(biāo)位置等。

      封裝好的CScintillaCtrl類,可以直接供上層調(diào)用,避免使用SendMessage速度過慢的問題。

      3.3 Scintilla的第二層封裝

      CScintillaCtrl類中封裝了Scintilla支持的全部消息,所以接口多達(dá)六百多個(gè),直接使用時(shí)查找很不方便。實(shí)際應(yīng)用中,基于MFC的多文檔程序結(jié)構(gòu),可以將ST語言編輯器進(jìn)一步封裝成一個(gè)CView的子類CStEditView,這個(gè)類持有一個(gè)CScintillaCtrl類型的私有成員變量,通過這個(gè)成員變量可以獲取Scintilla所有的消息接口。CStEditView通過提供盡量少的對外接口,簡化使用復(fù)雜度,例如提供了初始化接口 OnInitialUpdate(),內(nèi)部再調(diào)用 CScintillaCtrl的關(guān)鍵字設(shè)置、字號字體設(shè)置、頁邊距設(shè)置等初始化設(shè)置。

      經(jīng)過二次封裝的CStEditView類,可以直接供MBPro系統(tǒng)中的Doc類調(diào)用,屏蔽了CScintillaCtrl內(nèi)部過多的復(fù)雜細(xì)節(jié),專注與上層應(yīng)用,不用關(guān)心下層細(xì)節(jié),便于分層管理和降低模塊間的耦合,易于測試及擴(kuò)展。

      3.4 運(yùn)行效果

      圖3所示為實(shí)際運(yùn)行的MBPro軟件,當(dāng)編輯結(jié)構(gòu)化文本語言程序時(shí),右側(cè)編輯窗口即為編輯器窗口,能識別語言關(guān)鍵字,進(jìn)行顏色渲染,同時(shí)對語句塊能進(jìn)行識別,支持語句塊折疊。

      圖3 ST編輯器運(yùn)行效果Fig.3 Running effect of the editor

      4 結(jié)語

      南瑞MB系列PLC產(chǎn)品是其依靠在水電自動(dòng)化控制領(lǐng)域多年的經(jīng)驗(yàn)的智慧結(jié)晶,目前在電力、水利、紡織、冶金、樓宇自動(dòng)化等多個(gè)領(lǐng)域得到了廣泛應(yīng)用,組態(tài)軟件MBPro新增對ST語言編程的支持,完善了PLC產(chǎn)品的功能,增強(qiáng)了產(chǎn)品的綜合競爭力。

      [1]劉成俊,彭文才,趙涌.PLC熱備冗余的研究與設(shè)計(jì)[J].自動(dòng)化與儀表,2015,30(2):46-49.

      [2]王善永.MB系列智能可編程邏輯控制器[J].電力系統(tǒng)自動(dòng)化,2005,29(10):82-84.

      [3]陳思寧.MB系列智能可編程控制器的軟件設(shè)計(jì)[J].水電廠自動(dòng)化,2006(4):45-48.

      [4]張紅芳,劉書良,周霞.MB系列智能PLC編程軟件MBPro[J].PLC與工控機(jī),2010(10):57-59.

      猜你喜歡
      編輯器結(jié)構(gòu)化編程
      我家有只編程貓
      我家有只編程貓
      我家有只編程貓
      我家有只編程貓
      促進(jìn)知識結(jié)構(gòu)化的主題式復(fù)習(xí)初探
      結(jié)構(gòu)化面試方法在研究生復(fù)試中的應(yīng)用
      你距離微信創(chuàng)作達(dá)人還有多遠(yuǎn)?
      車輛段收發(fā)車運(yùn)行圖編輯器的設(shè)計(jì)與實(shí)現(xiàn)
      基于圖模型的通用半結(jié)構(gòu)化數(shù)據(jù)檢索
      基于VLIW目標(biāo)機(jī)的ELF二進(jìn)制編輯器設(shè)計(jì)與實(shí)現(xiàn)
      巩义市| 嵩明县| 青河县| 阿瓦提县| 横峰县| 柳林县| 藁城市| 庆城县| 安徽省| 虎林市| 随州市| 河池市| 从江县| 吉木乃县| 浦东新区| 周口市| 天全县| 嘉兴市| 威海市| 高青县| 宁南县| 凌云县| 阿巴嘎旗| 四子王旗| 永城市| 富民县| 眉山市| 稻城县| 兴安县| 周口市| 蒙城县| 齐齐哈尔市| 工布江达县| 瑞昌市| 望都县| 太湖县| 阳原县| 成武县| 灵寿县| 集安市| 芮城县|