0 引言
軟件PLC的開發(fā)中,各編程語言模塊的開發(fā)是關鍵環(huán)節(jié)。在IEC1131 3標準提出的5種編程標準語言中,指令語言和梯形圖語言應用最為廣泛。指令表語言的解析過程主要是根據編譯原理,通過詞法分析、語法分析及語義分析等環(huán)節(jié),最終生成中間代碼。梯形圖是圖形化的編程語言,其編程模塊包括編輯和編譯2部分,其中面向用戶的編輯環(huán)境已經有很成熟的應用。另外,對于不同操作系統(tǒng)的數控系統(tǒng),PLC程序的控制執(zhí)行策略是不同,如何設計簡單高效的程序執(zhí)行機也是軟件PLC的重點環(huán)節(jié)。以前的一些研究在一定程度上實現了軟件PLC的部分功能,但都沒有涉及程序的描述模型的概念,提出針對所有語言的通用解決方案。在此提出了PLC程序的描述模型和通用可執(zhí)行數據結構,開發(fā)了梯形圖的圖形化編程模塊,并設計了基于RT Linux的數控系統(tǒng)的PLC程序的執(zhí)行機。
1 梯形圖編程環(huán)境
梯形圖的編程環(huán)境包括編輯和檢查2個環(huán)節(jié)。編輯的任務是提供一個編制PLC程序的工具,使之方便地完成程序草圖的設計、修改、檢查和儲存等編輯功能。梯形圖程序結構模型如圖1所示。結構模型中,每個方框代表一個單元。單元類型可分為:輸入單元(包括常開單元、常閉單元等。每個單元對應于輸入寄存器中相應的地址);輸出單元(基本功能單元、擴展功能單元等。輸出單元對應邏輯運算結果輸出地址);邏輯單元(主要指串聯符號與并聯符號,其一般不參與運算,但決定輸入單元之間的邏輯關系,是邏輯計算依據);空單元(梯形圖中的空白部分是空單元所處位置,空單元表示沒有實際單元,但不意味沒有含義。解析梯形圖程序的過程中,空單元也需要加以分析,是有意義的);功能單元(包括計時器、計數器等其它實現特殊功能的單元)。模型中的最小元素是單元(即圖1中的小方塊),因此梯形圖草圖能夠記錄于一個二維數組lad-der_draft[MAX_ROW][MAX_COL]中。其中,MAX_COL表示圖中的一列最多可以容納的單元數量,MAX_ROW表示梯形圖最多可以容納的行的數量。數組中每個結構體成員記錄著草圖中每個單元的每項信息,包括單元的類型、單元寄存器的地址、寄存器類型、自然行號、列號和備注說明等。事實上,梯形圖程序草圖對應于一個面向對象的數組,還包括對數組的操作。對于用戶,繪制草圖的過程實質是對數組ladder_draft[MAX_ROW][MAX_COL]的操作過程。操作主要包括4種:De-lete cell,刪除梯形圖上已存在的一個單元;Deleterow,刪除梯形圖上的一自然行,其下的一行自動連接上;Undo,撤銷上一次的刪除操作;Redo,解除上一步的撤銷操作。梯形圖程序流程如圖2所示,程序經編輯環(huán)節(jié)需進行檢查,檢查出錯誤需要報錯。
圖1 梯形圖程序結構模型
a.程序的語法錯誤檢查。語法檢查負責檢查各個單元的參數是否正確。如寄存器地址是否越界、重復,計時器、計數器的設定值是否超過了限定的最大值等。當發(fā)現錯誤時,保存錯誤類型即錯誤所在的行號和列號。流程如圖2a所示。
b.程序的邏輯錯誤檢查。梯形圖的邏輯錯誤負責檢查指令位置,如并聯單元的順序,輸出單元是不是存在,位置是否合理等等。當發(fā)現錯誤時,同樣提示報錯,流程如圖2b所示。
圖2 程序流程
2 描述模型數據結構及執(zhí)行機原理
PLC程序編譯的最終目的是獲得可執(zhí)行文件。對于硬件PLC,將可執(zhí)行文件送往硬件執(zhí)行模塊即可。對于本文中的軟件PLC,程序描述模型的記錄,即可執(zhí)行程序通用數據結構,是可執(zhí)行文件的主要內容。因此,選擇恰當的程序描述模型是整個問題的關鍵,該模型需要完整地表述梯形圖程序中所包含的層次特征和所有單元之間的邏輯關系。基于此點,我們設計模型結構如圖3所示。
圖3 模型結構
模型在形式上類似梯形圖中的一個梯級,包含有5個層次,從低到高依次是:單元層次、邏輯行層次、段層次、梯級層次、梯形圖層次。
a.自然行。梯形圖中的所有水平并列的單元構成了一個自然行。
b.邏輯行。由單元組成,段內是并聯關系。同處一個自然行的單元不一定同處一個邏輯行。圖中的每個矩形框代表一個邏輯行。
c.段。由邏輯行組成。梯級內的段與段是串聯關系。圖3中,從上到下、并行排列的幾個矩形框構成一段。
d.梯級。由相互聯系而不可分割的一個或數個自然行組成,同時也由段串聯組成。圖3中前3個輸入段與最后的輸出段構成一個梯級。
e.梯形圖。由一個或數個梯級依次排列而成。各梯級間一般有邏輯或者時間上的順序。
針對具體梯形圖的設計規(guī)模,還需要制定一些規(guī)則,即每個梯形圖最多包含60個自然行;每個自然行包含12個單元;每個邏輯行至多包含6個單元;每段至多包含6個邏輯行,每個梯級至多包含4段,其中包含1個輸出段;整個梯形圖至多包含20個梯級以及30個輸出單元。規(guī)則中的參數可以通過實際的情況靈活修改。
程序模型的作用在于為解析PLC程序提供參照,描述模型的數據結構即為PLC程序的最終數據結構。對應程序模型,數據結構同樣分為5個層次,分別為單元、邏輯行、段、梯級、梯形圖。
struct SLadderCell //單元層次
{
char type; //單元類型
int address; //地址
int setting_value; //設定
int current_value; //當前值
char reg_type; //寄存器類型
int result_value; //單元值
};
struct SLadderRow //邏輯行層次
{
int cell_num; //實際包含的單元數量
struct SLadderInputCell cell[MAX_CELL_OF
_ROW]; //記錄一行的單元
int result_value; //行的值
};
段、梯級的數據結構與邏輯行的數據結構大體類似,不再重復。其中,最重要的梯形圖程序模型的層次結構如下。
struct SLadderGragh //梯形圖程序層次
{
int layer_num; //實際包含的梯級數
int output_num; //實際的輸出單元的數
SLadderLayer layer [MAX _ LAYER _ OF _
GRAPH]; //梯級的記錄
};
針對以上通用數據結構,設計軟件PLC執(zhí)行機結構如下。
PLC executive //PLC程序執(zhí)行機
{
FOR (LAYER NO. < ACTUAL LAYER
NUMBER)
{
FOR (SEGMENT NO. < ACTUAL SEG-
MENT NUMBER)
{
FOR (LOGIC ROW NO. < ACTUAL LOG-
IC ROW NUMBER)
{
FOR (CELL NO. <ACTUAL CELL NUM-
BER)
{
ROW RESULT = ROW _ RESULT &&
VALUE OF THE NEXT CELL //單元之間執(zhí)行
與運算
}
SEG RESULT = SEG_RESULT || VALUE
OF THE NEXT LOGIC ROW //邏輯行間執(zhí)行
或運算
}
LAYER RESULT = LAYER RESULT &&
VALUE OF THE NEXT SEGMENT //段之間
執(zhí)行與運算
}
}
}
3 梯形圖的解析
梯形圖解析的最終目的是通用數據結構,程序描述模型的結構框架是解析的參照標準,具體的步驟是通過層次分析、邏輯判斷,為每個單元在程序描述模型中/定位0,即確定單元的梯級號、段號、行號和列號。單元數據結構的數據成員分為2組:第1組包括單元類型、單元對應的寄存器地址和類型、備注說明及單元在圖中的自然坐標等,這些成員在編輯草圖的過程中由設計者直接確定;第2組為邏輯行號、邏輯列號、梯級號和段號。這些成員的數值需要分析得出。分析的基本方法是掃描二維數組ladder_draft[MAX_ROW][MAX_COL],單元類型是掃描的關注點。掃描分為2步進行:第1次掃描過程中,當掃描到某個具體單元時,由于沒有后繼單元的信息便無法計算出當前單元的完整信息。這次掃描的目的在于向中間結果數組中記錄相應信息。無論是設計文本編程環(huán)境還是圖形化編程環(huán)境,我們的分析都應著眼于表意的最小元素。對于PLC程序,最小表意元素是一個完整的梯級。當掃描處在某個梯級當中,打破了梯形圖的最小表意單元(梯級),則無法得出單元的完整信息。SRowPropertynaturerow[MAX_ROW]是中間結果數組,主要記錄自然行的信息。通過該數組可確定梯形圖單元在/垂直方向0的參數(梯級號和邏輯行號)。中間結果數組的數據結構如下。
struct SRowProperty
{
int or_num; //并聯符的個數
int layer_no; //自然行所在的梯級
int logic_row; //自然行的邏輯行號
int seg_num; //自然行出現過的段的數量
};
自然行的信息是劃分梯級的依據。凡是存在并聯符的自然行和其上面相鄰的一行必屬同一梯級,凡沒有并聯符的、非空自然行是新梯級的開端。準確劃分梯級,將確定每個自然行所處的梯級號以及每個自然行在所屬梯級的位置(邏輯行號)。自然行的梯級號和邏輯行號與該自然行上每個單元的梯級號和邏輯行號是一個概念。第2步掃描針對/水平方向0的參數(段號和邏輯列號),結合了中間結果,能最終實現對段的準確劃分。段的處理方式與梯級劃分的區(qū)別在于梯級劃分在于找到梯級的/首0,而段的劃分在于找到段的/尾0。段的劃分與邏輯列號的確定是同一過程。
綜上所述,編譯就是參照PLC的程序模型對梯形圖的劃分過程,從圖劃分成梯級,梯級劃分成段,段劃分成邏輯行,最后是單元,依次進行。
4 應用實例
圖4所示是一個在編程環(huán)境完成的主軸運動控制的局部梯形圖。
圖4 主軸運動控制的局部梯形
圖4中包括主軸旋轉方向控制(順時針旋轉SPCW或逆時針旋轉SPCCW)、主軸齒輪換檔控制(低速檔SPL或高速檔SPH)以及主軸停(SPOFF)的控制??刂品绞椒譃槭謩?HAND)和自動(AU-TO)2種工作方式。在/主軸順時針旋轉0梯級中,HAND=/10,主軸旋轉方向選擇旋鈕置于順時針位置,CW.M(順轉開關信號)=1,又由于主軸停止旋鈕開關OFF.M沒接通,SPOFF常閉接點為/10,使主軸手動控制順時針旋轉。當方向選擇旋鈕置于逆時針接通狀態(tài)時,和順時針旋轉分析方式相同,使主軸逆時針旋轉。
第1,第2和第3自然行為第1梯級,即/主軸順時針旋轉0梯級。第1行中,HAND與SW.M 2個常開單元是串聯,SW.M右旁為一個串聯單元,標志邏輯行的結束; SPOFF是常閉單元是新邏輯行的開始,其右邊的串聯單元同樣表示這個邏輯行的結束,第1行是沒有并聯單元的;第2行中,串聯關系的AUTO和M03組成一個邏輯行,M03右邊的右并聯單元是邏輯行的結束標志;第3行和第2行幾乎完全一樣。應該注意到,第2行和第3行都存在并聯單元,這個信息在第一步掃描時記錄在中間結果數組中。這表明第2行、第3行與第1行有/聯系0,即同屬一個梯級;第4行沒有并聯單元,表明這是一個新梯級,即/主軸逆時針旋轉0梯級的首行。由上述可知,段的劃分與判斷邏輯行的終止是一個概念,一個邏輯行的結束就是其所屬的段在其所處的自然行上的結束。
局部梯形圖共包含5個梯級,除了/主軸順時針旋轉0梯級、還有/主軸逆時針旋轉0梯級、/主軸停0梯級、/變低速檔齒輪0梯級以及/變高速檔齒輪0梯級。但分析的原理與步驟與第1個梯級的相似,不再重復。
5 結束語
應用程序模型的概念,實現了圖形化編程環(huán)境,通過數控系統(tǒng)中主軸控制的一個應用實例表明,上述分析方法和原理是有效、可行的。
(審核編輯: 滄海一土)