專利名稱:一種梯形圖內(nèi)嵌高級(jí)語言進(jìn)行混合編程的實(shí)現(xiàn)方法
技術(shù)領(lǐng)域:
本發(fā)明屬于計(jì)算機(jī)信息技術(shù)領(lǐng)域,涉及一種梯形圖內(nèi)嵌高級(jí)語言進(jìn)行混合編程的實(shí)現(xiàn)方法。
背景技術(shù):
長期以來PLC在工業(yè)控制領(lǐng)域有著廣泛的應(yīng)用,梯形圖是PLC程序設(shè)計(jì)的主要手段,有著使用簡(jiǎn)單,直觀明了的優(yōu)點(diǎn)。然而PLC主要是用于邏輯控制,因此梯形圖在進(jìn)行邏輯控制程序設(shè)計(jì)時(shí)簡(jiǎn)單易用,但隨著被控設(shè)備功能越來越復(fù)雜,簡(jiǎn)單的邏輯控制已無法滿足設(shè)備控制的需要。因此為了滿足增強(qiáng)PLC功能的實(shí)際需要,往往需要在原有邏輯控制中增加智能算法,但是梯形圖實(shí)現(xiàn)算法的過程過于復(fù)雜。計(jì)算機(jī)高級(jí)編程語言(如C語言),在編寫算法時(shí)具有功能強(qiáng)大的特點(diǎn)。因此若能將計(jì)算機(jī)高級(jí)編程語言編寫的算法嵌入梯形圖,將極大地提高梯形圖算法設(shè)計(jì)的能力,可增強(qiáng)梯形圖功能。通過該技術(shù)可為設(shè)備控制系統(tǒng)的智能化帶來便利。
發(fā)明內(nèi)容
本發(fā)明的目的在于針對(duì)現(xiàn)有的梯形圖適合實(shí)現(xiàn)邏輯控制程序設(shè)計(jì),而復(fù)雜的算法實(shí)現(xiàn)困難,為其提供了一種梯形圖內(nèi)嵌入計(jì)算機(jī)高級(jí)語言實(shí)現(xiàn)混合編程的方法,實(shí)現(xiàn)將高級(jí)語言編寫的算法模塊嵌入梯形圖,由梯形圖實(shí)現(xiàn)算法模塊的調(diào)用達(dá)到增強(qiáng)梯形圖功能的目的。本發(fā)明解決技術(shù)問題所采取的技術(shù)方案為
1. 一種梯形圖內(nèi)嵌高級(jí)語言進(jìn)行混合編程的實(shí)現(xiàn)方法,其特征在于該方法包括以下步
驟
步驟1.在梯形圖設(shè)計(jì)環(huán)境中以控件方式增加高級(jí)語言算法模塊,具體是步驟1-1.新增一個(gè)算法模塊控件并將其添加到梯形圖設(shè)計(jì)環(huán)境中,在使用時(shí)將算法模塊控件拖拉到需要插入算法模塊的位置,并給出需要調(diào)用的函數(shù)名稱;
步驟1-2.在文件中編輯高級(jí)語言模塊代碼,函數(shù)名和梯形圖算法模塊控件中描述的函數(shù)名必須一致;所有函數(shù)均沒有形參,數(shù)據(jù)傳遞通過公共數(shù)據(jù)區(qū)完成;步驟2.高級(jí)語言程序預(yù)處理,具體是步驟2-1. PLC中數(shù)據(jù)區(qū)分配;
在PLC的內(nèi)存中,選擇一塊專用的公共數(shù)據(jù)區(qū)來表示PLC軟元件值,在PLC引擎程序中定義了一個(gè)字節(jié)數(shù)組用來表示這個(gè)專用公共數(shù)據(jù)區(qū),通過宏表示各類數(shù)據(jù)區(qū)在公共數(shù)據(jù)區(qū)中的起始地址;
步驟2-2.轉(zhuǎn)換字節(jié)類型數(shù)據(jù)將程序中字節(jié)類型數(shù)據(jù)轉(zhuǎn)換成地址訪問數(shù)據(jù)的方式;步驟2-3.轉(zhuǎn)換位類型數(shù)據(jù)
位類型數(shù)據(jù)操作包括賦值和位值判斷;對(duì)于賦值操作,賦值0和1分別通過位的與運(yùn)算和或運(yùn)算實(shí)現(xiàn);
位的值判斷通過將相應(yīng)的位和1作與運(yùn)算,其它位和0作與運(yùn)算的結(jié)果來判斷位的
值;
步驟2-4.將預(yù)處理后的高級(jí)語言程序?qū)懭胛募?,從而生成高?jí)語言程序文件;步驟3.嵌入高級(jí)語言模塊的梯形圖程序編譯,具體是步驟3-1.轉(zhuǎn)換成IL指令
在IL指令集中增加算法模塊調(diào)用指令,然后把梯形圖程序轉(zhuǎn)換成IL指令;步驟3-2.定義用來翻譯算法模塊調(diào)用指令的宏,宏帶有形參,在使用宏時(shí)被實(shí)例化成需調(diào)用的函數(shù)名;宏定義體中采用PLC支持的機(jī)器指令實(shí)現(xiàn);
步驟3-3.將IL指令翻譯成宏,在編譯前通過宏替換生成PLC支持的機(jī)器指令,具體
是
首先遍歷所有的IL指令,然后將IL指令翻譯成對(duì)應(yīng)的宏,在編譯前由編譯器自動(dòng)實(shí)現(xiàn)宏替換;
步驟3-4.代碼編譯
通過任何支持目標(biāo)平臺(tái)的編譯器對(duì)生成的機(jī)器指令集和高級(jí)語言代碼進(jìn)行統(tǒng)一編譯,編譯后的可執(zhí)行文件下載到PLC中即可運(yùn)行。SHAPE MERGEFORMAT
本發(fā)明的有益效果是通過在梯形圖內(nèi)嵌入由計(jì)算機(jī)高級(jí)語言編寫的算法模塊,克服復(fù)雜的算法實(shí)現(xiàn)困難的問題,同時(shí)利用了梯形圖穩(wěn)定可靠的優(yōu)點(diǎn),不但可提高復(fù)雜控制系統(tǒng)的開發(fā)效率,并可通過嵌入智能算法達(dá)到增強(qiáng)梯形圖功能的目的。
圖1梯形圖內(nèi)嵌入高級(jí)語言進(jìn)行混合編程的方法示意圖;圖2高級(jí)語言和梯形圖通過公共數(shù)據(jù)區(qū)交互數(shù)據(jù)的示意圖;圖3梯形圖中函數(shù)調(diào)用實(shí)現(xiàn)過程示意圖。
具體實(shí)施例方式本發(fā)明的一種梯形圖內(nèi)嵌入高級(jí)編程語言實(shí)現(xiàn)混合編程,統(tǒng)一編譯的方法,其思想是將高級(jí)語言程序作為模塊插入到梯形圖,插入的程序模塊以函數(shù)形式存放在文件中,如圖1所示。高級(jí)語言程序文件和由梯形圖程序生成的機(jī)器指令代碼一起編譯成可執(zhí)行文件下載到PLC。運(yùn)行時(shí),在由梯形圖程序生成的機(jī)器指令中調(diào)用高級(jí)語言程序模塊,實(shí)現(xiàn)高級(jí)語言程序模塊的執(zhí)行。下面以C語言為例說明方法的實(shí)現(xiàn)過程,具體設(shè)計(jì)步驟如下
1、梯形圖設(shè)計(jì)環(huán)境中以控件方式增加高級(jí)語言程序模塊
1.1、新增一個(gè)圖形化控件并將其添加到梯形圖設(shè)計(jì)環(huán)境中,用來表示高級(jí)語言程序模塊。在使用時(shí)將高級(jí)語言程序模塊控件拖拉到需要插入高級(jí)語言程序的位置,并給出需要調(diào)用的函數(shù)名稱;
1. 2、在文件中編輯高級(jí)語言程序,函數(shù)名和步驟1. 1高級(jí)語言程序模塊控件中給出的函數(shù)名必須一致。所有函數(shù)均沒有形參,數(shù)據(jù)傳遞通過公共數(shù)據(jù)區(qū)完成,即高級(jí)語言程序和梯形圖程序都直接使用PLC公共數(shù)據(jù)區(qū)中的D區(qū)數(shù)據(jù)實(shí)現(xiàn)數(shù)據(jù)交換,如圖2所示。在編寫函數(shù)體時(shí),可以定義臨時(shí)變量,也可以直接使用D區(qū)數(shù)據(jù),使用時(shí)必須要指明數(shù)據(jù)長度。如以C語言語法和名為fimc的函數(shù)為例,格式如下#ifdef funcFlag
void func ()
{
if (MlOOO==I)
{
(DWORD)VD2000 = (DWORD)VD2000+1;
}
}
#endif
為了編程方便,也可以使用臨時(shí)變量的方式表示D區(qū)數(shù)據(jù),首先把D區(qū)數(shù)據(jù)值賦值給臨時(shí)變量,操作完以后再把臨時(shí)變量值寫回?cái)?shù)據(jù)區(qū)。上述例子可以更改為#ifdef funcFlag
void func ()
{
int paral ;
paral = (DWORD)VD2000;
if (MlOOO==I)
{
paral++;
ι
(DWORD)VD2000=paral;
}
#endif
上例中funcFlag是宏定義,格式為“函數(shù)名+Flag”,用來實(shí)現(xiàn)條件編譯。當(dāng)函數(shù)在梯形圖中被調(diào)用時(shí),宏funcFlag將在頭文件中被定義,實(shí)現(xiàn)被調(diào)函數(shù)的編譯。VD2000是PLC中D區(qū)的數(shù)據(jù)地址,PLC的數(shù)據(jù)采用八進(jìn)制,因此VD2000表示相對(duì)D區(qū)起始地址偏移10 個(gè)字節(jié),DWORD表示雙字,表示從VD2000的地址開始取4個(gè)字節(jié)。M1000是位地址。和地址操作相關(guān)的內(nèi)容在后面詳細(xì)介紹。2、高級(jí)語言程序預(yù)處理
在嵌入高級(jí)語言程序模塊的梯形圖程序編譯前,需對(duì)高級(jí)語言程序代碼進(jìn)行預(yù)處理,主要將高級(jí)語言程序中用到的PLC數(shù)據(jù)區(qū)數(shù)據(jù)轉(zhuǎn)換成符合高級(jí)語言語法規(guī)范的數(shù)據(jù)訪問方式。下面以D區(qū)和M區(qū)為例解釋預(yù)處理過程,具體實(shí)現(xiàn)步驟為2. UPLC中數(shù)據(jù)區(qū)分配
在PLC的內(nèi)存中,有一塊專用的公共數(shù)據(jù)區(qū)來表示PLC軟元件值,在PLC引擎程序中定義一個(gè)字節(jié)數(shù)組CASSMem [Length]來表示這個(gè)專用公共數(shù)據(jù)區(qū),通過宏DMart、MStart、CStart, TStart, SStart表示在公共數(shù)據(jù)區(qū)中D區(qū)、M區(qū)、C區(qū)、T區(qū)和S區(qū)等在公共數(shù)據(jù)區(qū)中的起始地址。因?yàn)樽止?jié)數(shù)組中數(shù)據(jù)的最小單位是字節(jié),因此對(duì)于位數(shù)據(jù)除了地址偏移量外,還需要指定字節(jié)內(nèi)偏移量。如M2001是M200. 1的縮寫,表示相對(duì)于M區(qū)起始地址偏移1 字節(jié)(1 為八進(jìn)制數(shù)200的值)數(shù)據(jù)的第1位。2. 2、轉(zhuǎn)換字節(jié)類型數(shù)據(jù)
將程序中字節(jié)類型數(shù)據(jù)轉(zhuǎn)換成地址訪問數(shù)據(jù)方式,轉(zhuǎn)換成地址的目的是為了解決取數(shù)據(jù)時(shí)的長度問題。在程序中共有BYTE,WORD,DWORD三類數(shù)據(jù)類型,分別表示1個(gè)字節(jié),2個(gè)字節(jié)和4個(gè)字節(jié)數(shù)據(jù)。在轉(zhuǎn)換時(shí),分別轉(zhuǎn)換成char *,short *和int *類型指針,并通過指針訪問數(shù)據(jù)。如(DW0RD)VD2000,將轉(zhuǎn)換成 *((int &CASSMem[DStart+1024]) 2. 3、轉(zhuǎn)換位類型數(shù)據(jù)
位類型數(shù)據(jù)包括M、C、T、Q、S等區(qū)數(shù)據(jù),位類型數(shù)據(jù)操作包括賦值和位值判斷。對(duì)于賦值操作,賦值0和1分別通過位的與運(yùn)算和或運(yùn)算實(shí)現(xiàn)。如M2003=l,將被轉(zhuǎn)換成CASSMem [MStart+128] | (1 3)。位的值判斷主要用在條件判斷中,通過將相應(yīng)的位和1作與運(yùn)算,其余位和0作與運(yùn)算的結(jié)果來判斷位的值,如if(M2003==l)將被轉(zhuǎn)換成if (CASSMem[MMart+128]&(1<<3))。其他數(shù)據(jù)區(qū)數(shù)據(jù),如C區(qū)、T區(qū)、Q區(qū)和S區(qū)等轉(zhuǎn)換方式類同于M區(qū)數(shù)據(jù)轉(zhuǎn)換。2. 4、生成高級(jí)語言程序文件
經(jīng)過預(yù)處理后的代碼就是符號(hào)高級(jí)語言語法規(guī)范的程序代碼,將代碼寫入文件。3、嵌入高級(jí)語言程序模塊的梯形圖程序編譯,如圖3所示3.1、轉(zhuǎn)換成IL指令
首先在IL指令集中增加FUNC指令,用來實(shí)現(xiàn)C語言程序模塊的調(diào)用,格式為“FUNC函數(shù)名”;然后梯形圖程序轉(zhuǎn)換成IL指令集。3. 2、增加用來翻譯FUNC指令的宏CASSFunc
IL指令是通過宏的方式翻譯成機(jī)器指令,宏是一段獨(dú)立的程序代碼。其語法格式為MACRO
Macroname {$ parameter1, $parameter2, ......}
指令序列
MEND
MACRO標(biāo)識(shí)宏定義的開始,MEND標(biāo)識(shí)宏定義的結(jié)束。其中,Macroname為所定義宏的名稱,如CassFunc。$ parameterl, $parameter2等為宏的參數(shù),當(dāng)宏被展開時(shí)將被替換成相應(yīng)的值,類似于函數(shù)中的形式參數(shù)。CassFunc指令宏定義為MACRO
CassFUNC $V, $Lbl EnableFuntst r7,#lbeq EndCassFUNC$Lbl $V
nop
add rO, pc, #3bx r0EndCassFUNC$LMEND
其中$V為將要被調(diào)用的高級(jí)語言程序函數(shù)名,$L為當(dāng)前高級(jí)語言程序模塊調(diào)用指令在IL指令集中的行號(hào),用來確定當(dāng)前指令執(zhí)行后需要執(zhí)行的下一條指令地址。3. 3、將IL指令翻譯成宏,在編譯前通過宏替換生成機(jī)器指令
首先遍歷所有的IL指令,將IL指令翻譯成對(duì)應(yīng)的宏,如FUNC func ()翻譯成CASSFimcfuncO 10,其中10表示當(dāng)前IL指令在IL指令集中的行號(hào)。在編譯前的宏替換過程中,通過將CASSFimc宏替換成若干條機(jī)器指令,實(shí)現(xiàn)將3. 1步驟中生成的IL指令集翻譯成機(jī)器指令集,在生成的機(jī)器指令集中包含了高級(jí)語言程序函數(shù)的調(diào)用指令。3. 4、代碼編譯
通過任何支持目標(biāo)平臺(tái)的編譯器對(duì)生成的機(jī)器指令集和高級(jí)語言代碼進(jìn)行編譯,編譯后的可執(zhí)行文件下載到PLC中即可運(yùn)行。在運(yùn)行時(shí),通過機(jī)器指令調(diào)用高級(jí)語言程序函數(shù),實(shí)現(xiàn)高級(jí)語言程序模塊的執(zhí)行。以上所述僅為本發(fā)明的一個(gè)實(shí)施例子,以C語言為例說明了本發(fā)明方法的實(shí)現(xiàn)過程,事實(shí)上任何語言都可以作為本方法的實(shí)現(xiàn)語言。不能以此限制本發(fā)明的范圍,凡依據(jù)本發(fā)明所做的結(jié)構(gòu)上的變化,只要不失本發(fā)明的要義所在,都應(yīng)視為落入本發(fā)明保護(hù)范圍之內(nèi)受到制約。
權(quán)利要求
1. 一種梯形圖內(nèi)嵌高級(jí)語言進(jìn)行混合編程的實(shí)現(xiàn)方法,其特征在于該方法包括以下步驟步驟1.在梯形圖設(shè)計(jì)環(huán)境中以控件方式增加高級(jí)語言算法模塊,具體是 步驟1-1.新增一個(gè)算法模塊控件并將其添加到梯形圖設(shè)計(jì)環(huán)境中,在使用時(shí)將算法模塊控件拖拉到需要插入算法模塊的位置,并給出需要調(diào)用的函數(shù)名稱;步驟1-2.在文件中編輯高級(jí)語言模塊代碼,函數(shù)名和梯形圖算法模塊控件中描述的函數(shù)名必須一致;所有函數(shù)均沒有形參,數(shù)據(jù)傳遞通過公共數(shù)據(jù)區(qū)完成; 步驟2.高級(jí)語言程序預(yù)處理,具體是 步驟2-1. PLC中數(shù)據(jù)區(qū)分配;在PLC的內(nèi)存中,選擇一塊專用的公共數(shù)據(jù)區(qū)來表示PLC軟元件值,在PLC引擎程序中定義了一個(gè)字節(jié)數(shù)組用來表示這個(gè)專用公共數(shù)據(jù)區(qū),通過宏表示各類數(shù)據(jù)區(qū)在公共數(shù)據(jù)區(qū)中的起始地址;步驟2-2.轉(zhuǎn)換字節(jié)類型數(shù)據(jù)將程序中字節(jié)類型數(shù)據(jù)轉(zhuǎn)換成地址訪問數(shù)據(jù)的方式; 步驟2-3.轉(zhuǎn)換位類型數(shù)據(jù)位類型數(shù)據(jù)操作包括賦值和位值判斷;對(duì)于賦值操作,賦值0和1分別通過位的與運(yùn)算和或運(yùn)算實(shí)現(xiàn);位的值判斷通過將相應(yīng)的位和1作與運(yùn)算,其它位和0作與運(yùn)算的結(jié)果來判斷位的值;步驟2-4.將預(yù)處理后的高級(jí)語言程序?qū)懭胛募瑥亩筛呒?jí)語言程序文件; 步驟3.嵌入高級(jí)語言模塊的梯形圖程序編譯,具體是 步驟3-1.轉(zhuǎn)換成IL指令在IL指令集中增加算法模塊調(diào)用指令,然后把梯形圖程序轉(zhuǎn)換成IL指令; 步驟3-2.定義用來翻譯算法模塊調(diào)用指令的宏,宏帶有形參,在使用宏時(shí)被實(shí)例化成需調(diào)用的函數(shù)名;宏定義體中采用PLC支持的機(jī)器指令實(shí)現(xiàn);步驟3-3.將IL指令翻譯成宏,在編譯前通過宏替換生成PLC支持的機(jī)器指令,具體是首先遍歷所有的IL指令,然后將IL指令翻譯成對(duì)應(yīng)的宏,在編譯前由編譯器自動(dòng)實(shí)現(xiàn)宏替換;步驟3-4.代碼編譯通過任何支持目標(biāo)平臺(tái)的編譯器對(duì)生成的機(jī)器指令集和高級(jí)語言代碼進(jìn)行統(tǒng)一編譯, 編譯后的可執(zhí)行文件下載到PLC中即可運(yùn)行。
全文摘要
本發(fā)明涉及一種梯形圖內(nèi)嵌高級(jí)語言進(jìn)行混合編程的實(shí)現(xiàn)方法。本發(fā)明是將高級(jí)語言程序作為模塊插入到梯形圖,插入的程序模塊以函數(shù)形式存放在文件中。高級(jí)語言程序文件和由梯形圖程序生成的機(jī)器指令代碼一起編譯成可執(zhí)行文件下載到PLC。運(yùn)行時(shí),在由梯形圖程序生成的機(jī)器指令中調(diào)用高級(jí)語言程序模塊,實(shí)現(xiàn)高級(jí)語言程序模塊的執(zhí)行。本發(fā)明通過在梯形圖內(nèi)嵌入由計(jì)算機(jī)高級(jí)語言編寫的算法模塊,克服復(fù)雜的算法實(shí)現(xiàn)困難的問題,同時(shí)利用了梯形圖穩(wěn)定可靠的優(yōu)點(diǎn),不但可提高復(fù)雜控制系統(tǒng)的開發(fā)效率,并可通過嵌入智能算法達(dá)到增強(qiáng)梯形圖功能的目的。
文檔編號(hào)G05B19/05GK102393670SQ201110324868
公開日2012年3月28日 申請(qǐng)日期2011年10月24日 優(yōu)先權(quán)日2011年10月24日
發(fā)明者嚴(yán)義, 趙建勇, 鄔惠峰 申請(qǐng)人:杭州電子科技大學(xué)