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

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










