1 引言
IEC61131-3國際標準是工業自動化軟件的集成標準。IEC61131-3第一個為工業自動化控制系統的軟件設計提供標準化編程語言的國際標準。對當代工業控制器中種類繁多的概念及語言進行了標準化,在工業控制領域中產生了重要的影響,被全球越來越多制造商和客戶所接受,并且成為DCS、PLC、FCS、IPC、CNC、以及SCADA的編程系統事實上的標準。
本項目采用Visual C++作為開發語言,在開發遵循1EC61131-3標準設計過程中采用面向對象的方法,以提高軟件的可重用性。此外,Visual C++在圖形編程方面也有比較強大的功能,在梯形圖編輯界面的設計中提供了方便。集成了編輯、編譯連接、下載和調試等功能,方便了用戶對PLC的開發和使用。
2 PLC編程軟件的基本功能設計
項目主要任務是開發出一個符合國際標準IEC61131-3《可編程序控制器的編程軟件標準》的基于PC的PLC用戶軟件集成開發平臺,為我們自行開發的可編程控制器提供一個友好、高效的編程環境。運行效果如圖1所示。

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










