摘要:文章首先介紹了PLC的概念、功能特點(diǎn)和具有PLC功能的產(chǎn)品優(yōu)勢,接著分析了硬PLC和軟PLC的區(qū)別,最后從PLC繪圖工具的制作、PLC各種文件的生成、PLC語句表文件的編譯和存儲(chǔ)數(shù)據(jù)結(jié)構(gòu)、PLC文件的運(yùn)行機(jī)制、程序分類和運(yùn)行控制等方面描述了在產(chǎn)品開發(fā)中軟PLC的實(shí)現(xiàn)過程。
關(guān)鍵詞:產(chǎn)品開發(fā);硬PLC;軟PLC;梯形圖;一級(jí)程序;二級(jí)程序 文獻(xiàn)標(biāo)識(shí)碼:A
中圖分類號(hào):TG659 文章編號(hào):1009-2374(2015)14-0011-02 DOI:10.13535/j.cnki.11-4406/n.2015.14.006
PLC是一個(gè)以微處理器為核心的數(shù)字運(yùn)算操作的電子系統(tǒng)裝置,專為在工業(yè)現(xiàn)場應(yīng)用而設(shè)計(jì),它采用可編程序的存儲(chǔ)器,用以在其內(nèi)部存儲(chǔ)執(zhí)行邏輯運(yùn)算、順序控制、定時(shí)/計(jì)數(shù)和算術(shù)運(yùn)算等操作指令,并通過數(shù)字式或模擬式的輸入、輸出接口,控制各種類型的機(jī)械或生產(chǎn)過程。
1 軟PLC的概念
所謂的軟PLC是利用軟件技術(shù)在產(chǎn)品中開發(fā)PLC功能,在一些通用的CPU或者M(jìn)CU上實(shí)現(xiàn)PLC指令的解釋和編譯運(yùn)行,它僅是整個(gè)產(chǎn)品中的一個(gè)功能模塊,該模塊能夠完成硬PLC大部分功能要求。
2 軟PLC的實(shí)現(xiàn)全部過程
精心策劃和技術(shù)論證后,筆者在產(chǎn)品開發(fā)中用以下方案實(shí)現(xiàn)了軟PLC開發(fā),具體實(shí)現(xiàn)方案框圖如圖1所示:
圖1 軟PLC開發(fā)具體實(shí)現(xiàn)方案
3 PLC繪圖工具制作和各種文件的產(chǎn)生
框圖實(shí)現(xiàn)的具體過程:第一,在PC機(jī)上用高級(jí)編程語言如VC等編寫一個(gè)PLC梯形圖制作工具,該工具不僅能繪制PLC梯形圖,并且繪制梯形圖所需要的指令元器件全部可以定制,可以按照你產(chǎn)品所需增加或刪除指令,可以設(shè)定指令的地址類型和取值范圍,可以設(shè)定指令的引腳屬性。第二,制作好指令元器件后,運(yùn)用該工具繪制你所需要的PLC梯形圖后并編譯它,生成你所需要的語句表文件和各種信息文件。第三,PLC的文件如何放到系統(tǒng)產(chǎn)品上?這就取決于你的產(chǎn)品能夠如何接收外部的文件或數(shù)據(jù)。下文以USB接口和串口為例來講述一下其實(shí)現(xiàn)接收PLC文件的過程:(1)U盤接口的實(shí)現(xiàn)方法。將用PC工具生成的PLC工程文件包從電腦拷貝到U盤,再將U盤插入到產(chǎn)品上,通過操作U盤讀取PLC工程文件包,從文件包里得到你所需要的語句表文件和其他信息文件;(2)串口RS232的實(shí)現(xiàn)方法。由于RS232每次只支持接受一個(gè)文件,你可以先編寫一個(gè)應(yīng)用程序,將該應(yīng)用程序放在PLC工程文件夾下指定的位置,運(yùn)行該應(yīng)用程序,提取所需要的文件信息生成一個(gè)TXT的文本格式文件,再用RS232方式傳送到產(chǎn)品使用。
4 PLC語句表文件的編譯和存儲(chǔ)數(shù)據(jù)結(jié)構(gòu)
梯形圖是由很多個(gè)由上到下順序的網(wǎng)絡(luò)組成。一個(gè)網(wǎng)絡(luò)可看成一個(gè)總的輸入和一個(gè)輸出或多級(jí)輸出組成??偟妮斎胗稍S多從左到右順序相“AND”的列組成。一個(gè)列可能由一個(gè)或多個(gè)行從上到下順序的行相“OR”組成,一個(gè)行又可能包括多個(gè)從左到右順序的相“AND”輸入指令。按照上述對(duì)PLC梯形圖原理的理解,筆者設(shè)計(jì)以下的編譯后數(shù)據(jù)存儲(chǔ)方法供PLC運(yùn)行調(diào)用。
語句表語言是PLC功能的另外一種表達(dá)方法,一般由梯形圖轉(zhuǎn)換出來。一個(gè)PLC語句表文件是由一級(jí)程序、二級(jí)程序和各個(gè)子程序組成。將一級(jí)程序、二級(jí)程序和各個(gè)子程序編譯后都變成一個(gè)個(gè)獨(dú)立的程序分開存儲(chǔ),每個(gè)程都有一個(gè)程序開始存儲(chǔ)地址,從這個(gè)地址開始存儲(chǔ)該程序的程序信息和所有編譯后的網(wǎng)絡(luò)數(shù)據(jù),各個(gè)程序之間或網(wǎng)絡(luò)之間相互調(diào)用或跳轉(zhuǎn)使用編譯后的相對(duì)地址進(jìn)行。
每個(gè)程序先存儲(chǔ)程序信息,緊接著存儲(chǔ)PLC程序的編譯后的一個(gè)個(gè)網(wǎng)絡(luò)數(shù)據(jù)。每個(gè)程序的組成具體為:程序信息+網(wǎng)絡(luò)數(shù)據(jù)#1+“%%”+網(wǎng)絡(luò)數(shù)據(jù)#2+…,網(wǎng)絡(luò)與網(wǎng)絡(luò)之間有一個(gè)字符串(“%%”)隔開。
程序信息主要包括:網(wǎng)絡(luò)總數(shù)+程序中的所有網(wǎng)絡(luò)信息(#1+#2+#3…)+程序編譯后的網(wǎng)絡(luò)數(shù)據(jù)#1開始存儲(chǔ)的地址。
網(wǎng)絡(luò)信息主要包括:該網(wǎng)絡(luò)輸入的總列數(shù)+輸入每列的行數(shù)+輸出行數(shù)+各個(gè)網(wǎng)絡(luò)數(shù)據(jù)(#1 #2 #3…等等)在PLC程序中的開始存儲(chǔ)的地址。
在程序信息之后,開始依次存儲(chǔ)編譯后網(wǎng)絡(luò)數(shù)據(jù)#1、網(wǎng)絡(luò)數(shù)據(jù)#2…的數(shù)據(jù),步驟如下:
第一,填寫輸入指令開始存儲(chǔ)標(biāo)志(“N_IN”)。
第二,一個(gè)網(wǎng)絡(luò)數(shù)據(jù)保存格式為:(1)保存網(wǎng)絡(luò)第一個(gè)列的第一行數(shù)據(jù),存儲(chǔ)格式為:輸入指令個(gè)數(shù)+第一個(gè)輸入指令(指令類型+指令地址號(hào)+觸點(diǎn)類型)+“&&”+第二個(gè)輸入指令(指令類型+指令地址號(hào)+觸點(diǎn)類型)…。如果同行內(nèi)有多個(gè)輸入指令,則指令之間有一個(gè)字符串(“&&”)隔開。(2)同樣方式保存該列的第二行…。如果一列內(nèi)有多行,行與行之間一個(gè)字符串(“||”)隔開。(3)…直至保存完該列的所有行。
第三,接著保存網(wǎng)絡(luò)第二個(gè)列數(shù)據(jù),保存方法同上,直至保存完所有的列。
第四,如果一個(gè)網(wǎng)絡(luò)內(nèi)有多列,列與列之間有一個(gè)字符串(“&&”)隔開。
第五,填寫輸出指令開始存儲(chǔ)標(biāo)志(“NOUT”)。
第六,接著保存輸出指令,輸出的存儲(chǔ)格式為:第一個(gè)輸出指令(指令類型+指令地址號(hào))+第二個(gè)輸出指令(指令類型+指令地址號(hào))…,如果是多級(jí)輸出,指令之間有一個(gè)字符串(“++”)隔開。
第七,接著,用同樣的方式開始存儲(chǔ)網(wǎng)絡(luò)數(shù)據(jù)#2,…直至當(dāng)前程序的網(wǎng)絡(luò)編譯信息存儲(chǔ)完畢。
PLC語句表文件的總體結(jié)構(gòu)、PLC程序信息結(jié)構(gòu)和PLC網(wǎng)絡(luò)信息結(jié)構(gòu)格式詳見如下:
//PLC語句表文件的總體結(jié)構(gòu)
typedef struct_PLC_File_t
{
uint32 PLCFlags[4] ;//PLC語句表文件存在標(biāo)志,存在“_PLC_PLC_PLC_PLC”
//不存在,全部用0XFF代替
(uint32*)Addr_Level1; //存儲(chǔ)一級(jí)程序的開始地址
(uint32*)Addr_Level2; //存儲(chǔ)二級(jí)程序的開始地址
(uint32*)Addr_Son[C_MaxSonProgs];//存儲(chǔ)子程序程序的開始地址
//uint32 Reserve[10] ;//保留
}PLC_File_t,*ptr_PLC_File_t;
//PLC程序信息(如:一級(jí)程序 二級(jí)程序 子程序)結(jié)構(gòu)
__align(256) typedef struct_PLC_Program_t
{
uint32 Nets; //PLC網(wǎng)絡(luò)數(shù),若為0,則無該P(yáng)LC程序
PLC_Net_t NetLineRows[C_MaxNetsPerFile]; //PLC每個(gè)網(wǎng)絡(luò)信息
uint32 *address_File; //該程序編譯后的網(wǎng)絡(luò)數(shù)據(jù)開始存儲(chǔ)地址
//uint32 Reserve[10] ;//保留
}PLC_Program_t,*ptr_PLC_Program_t;
//PLC網(wǎng)絡(luò)信息結(jié)構(gòu)
__align(4)typedef struct_PLC_Net_t
{
uint8 In_Rows; //網(wǎng)絡(luò)輸入列數(shù)
uint8 Lines[C_MaxLinesPerRow]; //網(wǎng)絡(luò)每列行數(shù)
uint8 Out_Lines; //網(wǎng)絡(luò)輸出行數(shù),若大于1,為多級(jí)輸出
uint32 *Address_Net; //該網(wǎng)絡(luò)數(shù)據(jù)在PLC程序中的開始存儲(chǔ)地址
//uint32 Reserve; //保留
}PLC_Net_t,*ptr_PLC_Net_t;
5 PLC運(yùn)行機(jī)制、程序分類和運(yùn)行控制
PLC程序的運(yùn)行是在中斷模式下來實(shí)現(xiàn)對(duì)產(chǎn)品所有的輸入和輸出進(jìn)行監(jiān)控,只要PLC程序存在,產(chǎn)品從開機(jī)就要循環(huán)運(yùn)行PLC程序監(jiān)控產(chǎn)品的運(yùn)行。在PLC中斷模式下,中斷服務(wù)程序不能夠占用中斷太多的時(shí)間,否則CPU就沒有時(shí)間來執(zhí)行其他的程序:一方面PLC程序一部分代碼又必須快速及時(shí)地執(zhí)行和響應(yīng),另一方面PLC程序又可能比較長,要運(yùn)行完所有的PLC程序可能會(huì)消耗CPU太多的中斷時(shí)間。如何解決這一問題?解決辦法是將PLC程序分成一級(jí)程序和二級(jí)程序,將一部分必須快速完成的程序歸入一級(jí)程序,另外一部分程序歸為二級(jí)程序。一級(jí)程序每次PLC中斷都是要執(zhí)行,二級(jí)程序根據(jù)程序運(yùn)行消耗的時(shí)間動(dòng)態(tài)分段,在一個(gè)PLC中斷周期除了運(yùn)行一級(jí)程序外,還要運(yùn)行二級(jí)程序的其中一段。這樣二級(jí)程序就必須分段執(zhí)行。
此外,還要在中斷周期內(nèi)正確調(diào)配二級(jí)中斷程序。方法一:編譯時(shí)就根據(jù)指令的運(yùn)行時(shí)間將二級(jí)程序分段,保證一次中斷只運(yùn)行其中一段二級(jí)程序。方法二:運(yùn)行時(shí)計(jì)算中斷的消耗時(shí)候,中斷運(yùn)行時(shí)間到就停止在二級(jí)程序的某一個(gè)指令上,下一個(gè)中斷運(yùn)行二級(jí)程序時(shí)就接著上次的二級(jí)程序指令繼續(xù)運(yùn)行。
傳統(tǒng)硬PLC性價(jià)比增長很緩慢,但隨著電子技術(shù)和計(jì)算機(jī)技術(shù)的迅猛發(fā)展,軟PLC技術(shù)打破了硬PLC許多局限性,開發(fā)PLC功能硬件成本和技術(shù)開發(fā)難度也越來越低,因此,在各行各業(yè)中軟PLC都具有廣泛的發(fā)展前景。
參考文獻(xiàn)
[1] 周萬珍,高鴻斌.PLC分析與設(shè)計(jì)應(yīng)用[M].北京:電子工業(yè)出版社,2004.
[2] 曹輝.可編程序控制器過程控制技術(shù)[M].北京:機(jī)械工業(yè)出版社,2006.
作者簡介:劉軍高(1971-),男,江西人,廣州數(shù)控設(shè)備有限公司工程師,研究方向:數(shù)控系統(tǒng)產(chǎn)品開發(fā)。
(責(zé)任編輯:周 瓊)