1 引言
IEC61131-3國(guó)際標(biāo)準(zhǔn)是工業(yè)自動(dòng)化軟件的集成標(biāo)準(zhǔn)。IEC61131-3第一個(gè)為工業(yè)自動(dòng)化控制系統(tǒng)的軟件設(shè)計(jì)提供標(biāo)準(zhǔn)化編程語(yǔ)言的國(guó)際標(biāo)準(zhǔn)。對(duì)當(dāng)代工業(yè)控制器中種類(lèi)繁多的概念及語(yǔ)言進(jìn)行了標(biāo)準(zhǔn)化,在工業(yè)控制領(lǐng)域中產(chǎn)生了重要的影響,被全球越來(lái)越多制造商和客戶所接受,并且成為DCS、PLC、FCS、IPC、CNC、以及SCADA的編程系統(tǒng)事實(shí)上的標(biāo)準(zhǔn)。
本項(xiàng)目采用Visual C++作為開(kāi)發(fā)語(yǔ)言,在開(kāi)發(fā)遵循1EC61131-3標(biāo)準(zhǔn)設(shè)計(jì)過(guò)程中采用面向?qū)ο蟮姆椒ǎ蕴岣哕浖目芍赜眯?。此外,Visual C++在圖形編程方面也有比較強(qiáng)大的功能,在梯形圖編輯界面的設(shè)計(jì)中提供了方便。集成了編輯、編譯連接、下載和調(diào)試等功能,方便了用戶對(duì)PLC的開(kāi)發(fā)和使用。
2 PLC編程軟件的基本功能設(shè)計(jì)
項(xiàng)目主要任務(wù)是開(kāi)發(fā)出一個(gè)符合國(guó)際標(biāo)準(zhǔn)IEC61131-3《可編程序控制器的編程軟件標(biāo)準(zhǔn)》的基于PC的PLC用戶軟件集成開(kāi)發(fā)平臺(tái),為我們自行開(kāi)發(fā)的可編程控制器提供一個(gè)友好、高效的編程環(huán)境。運(yùn)行效果如圖1所示。

圖1 運(yùn)行效果圖
主要功能有以下部分:
(1) 實(shí)現(xiàn)梯形圖與語(yǔ)句表的編輯功能;
(2) 實(shí)現(xiàn)梯形圖程序語(yǔ)法檢查部分(有無(wú)指令地址越界等語(yǔ)法錯(cuò)誤)和梯形圖程序邏輯檢查部分(有無(wú)邏輯錯(cuò)誤,如指令位置不正確、梯級(jí)中缺少輸出指令等);
(3) 實(shí)現(xiàn)梯形圖向語(yǔ)句表的轉(zhuǎn)換及語(yǔ)句表向梯形圖的轉(zhuǎn)換;
(4) 實(shí)現(xiàn)語(yǔ)句表程序的下載功能。
3 PLC語(yǔ)言編輯模塊設(shè)計(jì)
3.1 梯形圖語(yǔ)言編輯模塊
(1) 梯形圖的表示
整個(gè)梯形圖指令由若干個(gè)梯級(jí)組成,每個(gè)梯級(jí)又是由一個(gè)或幾個(gè)輸入元件和一個(gè)輸出元件組成。我們可以發(fā)現(xiàn)梯形圖中每個(gè)元件其實(shí)都有一個(gè)共同的屬性,該屬性可以用一個(gè)四元組表示(元件類(lèi)型,所在位置,地址)。這個(gè)四元組是對(duì)所有梯形圖元件共性的抽象表示,我們將這四個(gè)元素封裝在類(lèi)CIO中。
為每個(gè)梯形圖元件建立各自一個(gè)單獨(dú)的類(lèi)LD,LDN,O,ON,HOR,OUT。這樣做的好處就在于,因?yàn)槲覀冊(cè)诿恳粋€(gè)單位區(qū)域中畫(huà)的圖形相對(duì)于單位區(qū)域的位置可以比較容易的控制。
我們知道如果把所有的觸點(diǎn)如常閉觸點(diǎn)、常開(kāi)觸點(diǎn)等類(lèi)似的觸點(diǎn),甚至輸出觸點(diǎn)等功能塊的輸入電流線起點(diǎn)終點(diǎn)的位置相對(duì)于單元區(qū)域都是在一條水平線上的時(shí)候,當(dāng)把一個(gè)個(gè)梯形圖元素連接起來(lái)的時(shí)候,連線也就自然在一條水平線上了。
(2) 梯形圖的存儲(chǔ)
在繪制梯形圖時(shí),我們每次都只繪制一個(gè)元件(橫向連線和縱向連線也當(dāng)成元件處理),這些元件從產(chǎn)生時(shí)間的角度看是前后相串聯(lián)的,而且,每個(gè)梯形圖程序中所使用的元件的數(shù)量又是不定的,這兩個(gè)特點(diǎn)恰是鏈表結(jié)構(gòu)所特有的性質(zhì),所以,我們使用鏈表結(jié)構(gòu)來(lái)描述梯形圖程序是最合適的。
我們使用MFC給我們提供的COb- Array類(lèi)來(lái)實(shí)現(xiàn),CObArray和CPtrArray用法很類(lèi)似,都有GetSize,Add,GetAt等函數(shù),但是CObArray類(lèi)本身支持串行化,所以我們選用CObArray類(lèi)來(lái)實(shí)現(xiàn),有關(guān)文件讀寫(xiě)的操作在CDocument的Serialize函數(shù)中進(jìn)行,有關(guān)數(shù)據(jù)和圖形顯示的操作在CView的OnDraw函數(shù)中進(jìn)行。我們?cè)谄渑缮?lèi)中,只需要去關(guān)注Serialize和OnDraw函數(shù)就可以了,其它的細(xì)節(jié)我們不需要去理會(huì),程序就可以良好地運(yùn)行。
(3) 梯形圖錯(cuò)誤處理
主要檢查所繪制的梯形圖是否符合規(guī)定的格式,如果梯形圖不符合格式要求,則會(huì)給出錯(cuò)誤信息。首先在設(shè)置元件地址時(shí),檢查地址是否為‘I’,‘Q’,‘SM’,‘M’等事先規(guī)定好的字母,如不是則指出錯(cuò)誤;然后對(duì)字母后的數(shù)字進(jìn)行檢查,例如I后面數(shù)字的范圍在0.0-31.7之間,不是則指出相應(yīng)錯(cuò)誤。還要檢查輸出元件是否在最右邊,元件是否為孤立的等,如果有錯(cuò)在編譯是提示出錯(cuò)信息。
3.2 語(yǔ)句表編輯模塊
在設(shè)計(jì)語(yǔ)句表編輯模塊時(shí),選用微軟基本類(lèi)庫(kù)中的CEditView類(lèi)作為基類(lèi)。CEditView是一個(gè)已具有文字編輯功能的類(lèi),它所使用的窗口是bbbbbbs的標(biāo)準(zhǔn)控件之一Edit,其SerializeRaw成員函數(shù)可以把Edit控件中的數(shù)據(jù)寫(xiě)到文件中。另一方面,由于該類(lèi)是從CView類(lèi)派生而來(lái),支持多窗口操作并有文件預(yù)覽功能。因此,語(yǔ)句表文件可以非常方便地在編輯視窗中進(jìn)行編輯。
4 梯形圖與語(yǔ)句表的互譯模塊
4.1 梯形圖向語(yǔ)句表轉(zhuǎn)換的實(shí)現(xiàn)
通過(guò)對(duì)梯形圖及其設(shè)計(jì)規(guī)則的分析,筆者發(fā)現(xiàn),用梯形圖編制程序的過(guò)程實(shí)質(zhì)上是一個(gè)用梯形圖圖符來(lái)表示操作指令、用圖符的串并聯(lián)及位置順序來(lái)表示操作指令之間邏輯關(guān)系的過(guò)程。為了在程序設(shè)計(jì)中更合理地描述梯形圖,我們綜合考慮了提高程序執(zhí)行效率、節(jié)省存儲(chǔ)空間、便于操作等因素,采用十字鏈表數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)梯形圖。
4.2 語(yǔ)句表向梯形圖轉(zhuǎn)換的實(shí)現(xiàn)
在對(duì)語(yǔ)句表程序進(jìn)行識(shí)別并將它轉(zhuǎn)換為梯形圖時(shí),在內(nèi)存建立與梯形圖相對(duì)應(yīng)的十字鏈表,用于存放轉(zhuǎn)換所得的梯形圖。
梯形圖的生成在設(shè)計(jì)中,對(duì)語(yǔ)句及其對(duì)應(yīng)的梯形圖符進(jìn)行了詳細(xì)的分析,總結(jié)出梯形圖的生成規(guī)則:
(l) 當(dāng)前指令的輸出端個(gè)數(shù)為零
指令隊(duì)列中的所有元素出列,按規(guī)則繪制相應(yīng)的圖符;
(2) 當(dāng)前指令的輸出端個(gè)數(shù)不為零
進(jìn)一步判斷是否為O,ON或OLD指令。若是,則指令隊(duì)列中的所有元素出列,按規(guī)則繪制相應(yīng)的圖符;否則,當(dāng)前指令進(jìn)指令隊(duì)列;
(3) 指令的輸入端個(gè)數(shù)為零
繪制對(duì)應(yīng)的梯形圖符時(shí)應(yīng)與左側(cè)母線連接;
(4) 指令的輸入端個(gè)數(shù)為1
繪制對(duì)應(yīng)的梯形圖符時(shí)應(yīng)按程序的邏輯關(guān)系,建立正確的連接;
(5) 指令的輸入端個(gè)數(shù)為2
繪制對(duì)應(yīng)的梯形圖符時(shí),將占用同一列上的上一行和當(dāng)前行2個(gè)編輯區(qū),并把前一列的上一行和當(dāng)前行中的兩個(gè)梯形圖圖符相連接;
(6) 指令的輸入端個(gè)數(shù)為3
繪制對(duì)應(yīng)的梯形圖符時(shí),將占用同一列上的當(dāng)前行及上兩行3個(gè)編輯區(qū);并把前一列的上兩行及當(dāng)前行中的3個(gè)梯形圖符相連接。
5 通訊下載模塊的實(shí)現(xiàn)
這個(gè)模塊主要完成的功能是實(shí)現(xiàn)運(yùn)行,停止PLC和能夠?qū)TL語(yǔ)言編譯成PLC硬件能識(shí)別的代碼,實(shí)現(xiàn)下載的功能。
梯形圖語(yǔ)言的處理方式與其它語(yǔ)言不同:梯形圖語(yǔ)言作為一種“圖形”語(yǔ)言,要直接對(duì)其編譯是比較困難的,考慮到梯形圖語(yǔ)言與語(yǔ)句表語(yǔ)言之間的緊密聯(lián)系,筆者將梯形圖語(yǔ)言翻譯為語(yǔ)句表語(yǔ)言,再利用語(yǔ)句表語(yǔ)言的編譯模塊對(duì)其編譯。
筆者建一個(gè)能夠?qū)崿F(xiàn)串口通信的類(lèi)Cserial,里面有三個(gè)重要的函數(shù)Open,ReadData,SendData。按照PLC的通信格式,建立上位機(jī)與PLC的通信。逐行掃描語(yǔ)句表程序,將其翻譯對(duì)應(yīng)的代碼,將得到的程序代碼放入下載格式的代碼中,就能實(shí)現(xiàn)下載等功能。
6 結(jié)束語(yǔ)
本文較詳細(xì)地介紹了PLC編程軟件的設(shè)計(jì)思想,給出了其中用到的主要數(shù)據(jù)結(jié)構(gòu),還給出了它們的運(yùn)行效果。這為開(kāi)發(fā)基于IEC61131-3新型軟件PLC的工作打下了較堅(jiān)實(shí)的基礎(chǔ)。










