張新杰
(上海振華重工(集團(tuán))股份有限公司,上海 200125)
在大型自動(dòng)化生產(chǎn)線(xiàn)項(xiàng)目中,每個(gè)自動(dòng)化工位之間和工位內(nèi)部都會(huì)涉及到數(shù)據(jù)的存儲(chǔ)、讀寫(xiě)和傳送問(wèn)題。PLC 具有結(jié)構(gòu)簡(jiǎn)單、編程方便、可靠性高等特點(diǎn),在工業(yè)及生產(chǎn)過(guò)程中得到廣泛應(yīng)用[1]。但是PLC 常用的編程語(yǔ)言功能簡(jiǎn)單,無(wú)法實(shí)現(xiàn)復(fù)雜的控制邏輯和算法運(yùn)算[1-2]。隨著我國(guó)生產(chǎn)水平的不斷發(fā)展與進(jìn)步,傳統(tǒng)工業(yè)制造對(duì)電氣自動(dòng)化控制也有了新的需求。信息技術(shù)與傳統(tǒng)工業(yè)制造行業(yè)的結(jié)合是必然趨勢(shì)[3],PLC對(duì)復(fù)雜的控制邏輯和算法運(yùn)算的需求勢(shì)必會(huì)日益增大。隨著高級(jí)編程語(yǔ)言在PLC 中的應(yīng)用日益普遍[4],研究在PLC 編程中應(yīng)用高級(jí)編程語(yǔ)言具有重要的現(xiàn)實(shí)意義。
本文在PLC 編程中應(yīng)用高級(jí)編程語(yǔ)言的數(shù)組和指針編程方式,用來(lái)解決實(shí)際控制邏輯中大量數(shù)據(jù)的傳送問(wèn)題。寄希望本文能起到拋磚引玉的效果,引起讀者對(duì)PLC 編程中的高級(jí)編程語(yǔ)言學(xué)習(xí)的重視。
某大型剪叉自動(dòng)焊接生產(chǎn)線(xiàn)項(xiàng)目中,由剪叉激光切割工位、剪叉人工組隊(duì)工位、剪叉半成品板鏈線(xiàn)工位、剪叉自動(dòng)焊接工位、搬運(yùn)機(jī)器人、剪叉成品板鏈線(xiàn)工位、剪叉成品緩存工位和AGV 運(yùn)輸小車(chē)駐車(chē)工位組成。其中,剪叉成品緩存工位上游“聯(lián)接”剪叉成品板鏈線(xiàn)工位和剪叉自動(dòng)焊接工位,下游“銜接”AGV 運(yùn)輸小車(chē)。該剪叉成品緩存工位有伺服電機(jī)驅(qū)動(dòng)的“桁架”,負(fù)責(zé)從板鏈線(xiàn)工位上抓取剪叉成品,經(jīng)過(guò)RFID 識(shí)別后分別存放至剪叉成品緩存工位的緩存區(qū)域。根據(jù)剪叉成品不同的型號(hào)規(guī)格,緩存區(qū)域設(shè)置有20 個(gè)剪叉緩存位置;每個(gè)緩存位置可以疊放至8 層。同時(shí),AGV 運(yùn)輸小車(chē)上有可以疊放8 層的10 個(gè)剪叉存放位置。“桁架”不僅負(fù)責(zé)從剪叉成品板鏈線(xiàn)工位抓取剪叉成品存放于剪叉緩存區(qū)域,同時(shí)也負(fù)責(zé)從剪叉緩存區(qū)域抓取剪叉成品至AGV 運(yùn)輸小車(chē)的剪叉存放位置。
在剪叉成品緩存工位中,有一個(gè)剪叉成品板鏈線(xiàn)取料點(diǎn)位置,一個(gè)桁架停車(chē)位;有20 個(gè)剪叉成品緩存區(qū)域位置以及10 個(gè)AGV 的剪叉存放位置,共計(jì)32 個(gè)位置點(diǎn)。每個(gè)位置點(diǎn)有4 個(gè)位置數(shù)據(jù)值需要存儲(chǔ),分別是:大車(chē)方向位置值(X 方向),小車(chē)方向位置值(Y 方向),起升方向位置值(Z 方向)及疊放層數(shù)的數(shù)值。綜上,該工位僅存取位置值所需位置數(shù)據(jù)量已經(jīng)多達(dá)128 個(gè)。而剪叉成品緩存工位能否正確運(yùn)行的關(guān)鍵,取決于PLC 控制系統(tǒng)能否給到正確的大車(chē)方向、小車(chē)方向和起升方向的位置數(shù)據(jù)值至大車(chē)、小車(chē)和起升伺服控制器。剪叉成品緩存工位的總覽圖如圖1 所示。
圖1 剪叉成品緩存工位總覽
剪叉成品緩存工位一旦剪叉成品板鏈線(xiàn)位置、20個(gè)剪叉成品緩存區(qū)域以及AGV 停車(chē)位置確定,那么這32 個(gè)位置點(diǎn)相對(duì)于桁架的“零點(diǎn)”的數(shù)據(jù)值就會(huì)確定;這些數(shù)據(jù)值就是伺服控制器運(yùn)行的目標(biāo)值。
拋開(kāi)其他的PLC 控制邏輯不談,如果按照常規(guī)的PLC 編程方式把每個(gè)位置點(diǎn)的位置數(shù)據(jù)傳送到伺服控制器,這就需要使用“MOVE”指令。把上述確定的位置數(shù)據(jù)值發(fā)送至伺服控制器,一個(gè)位置點(diǎn)需要使用4 次“MOVE”指令;32 個(gè)位置點(diǎn)需要使用128 次“MOVE”指令。編寫(xiě)完成這段數(shù)據(jù)傳送邏輯后,會(huì)發(fā)現(xiàn)以下2 個(gè)問(wèn)題。
2.1.1 數(shù)據(jù)傳送邏輯篇幅冗長(zhǎng),不夠簡(jiǎn)練
僅僅一個(gè)傳送位置數(shù)據(jù)到伺服控制器的邏輯,就需要重復(fù)使用“MOVE”指令128 次。篇幅過(guò)長(zhǎng),增加查看邏輯、尋找故障上的困難。如果存儲(chǔ)的位置點(diǎn)再增加的話(huà),這段數(shù)據(jù)傳送邏輯篇幅需要得更長(zhǎng)。
2.1.2 數(shù)據(jù)傳送邏輯修改不方便、易出錯(cuò)
現(xiàn)場(chǎng)調(diào)試階段不確定因素較多,位置點(diǎn)的增加、減少或者調(diào)整的情況屢見(jiàn)不鮮。在這種情況下就會(huì)出現(xiàn)大量的邏輯增加、刪除或者數(shù)據(jù)修改工作。稍有不慎,很容易出錯(cuò);給調(diào)試工作帶來(lái)諸多不便。對(duì)于大型復(fù)雜的控制系統(tǒng),修改某一局部控制邏輯時(shí),很可能會(huì)牽涉到整個(gè)系統(tǒng)的每個(gè)環(huán)節(jié),給系統(tǒng)其他部分造成意料不到的影響[2]。
常規(guī)的編程方式需要大量的重復(fù)使用“MOVE”指令,而且一旦修改或刪除即有可能對(duì)整個(gè)控制系統(tǒng)造成嚴(yán)重的影響。能否簡(jiǎn)化僅使用一個(gè)“標(biāo)識(shí)”就能同時(shí)發(fā)送多個(gè)數(shù)據(jù)呢?高級(jí)編程語(yǔ)言中的“指針”和“數(shù)組”不就是利用指針來(lái)傳送數(shù)據(jù)的嗎[5-6]?利用“指針和數(shù)組”的思維,重新梳理下位置數(shù)據(jù)傳送的這段邏輯。
首先在PLC 控制程序中,建立4 個(gè)一維數(shù)組;分別對(duì)應(yīng)32 個(gè)位置點(diǎn)大車(chē)方向位置值、小車(chē)方向位置值、起升方向位置值和疊放層數(shù)的數(shù)值。數(shù)組內(nèi)的元素初步設(shè)定為40 個(gè),從0~39;并規(guī)定板鏈線(xiàn)大車(chē)位置[0]作為板鏈線(xiàn)的位置數(shù)據(jù)值,板鏈線(xiàn)大車(chē)位置[1]~[20]作為存儲(chǔ)區(qū)1 號(hào)至20 號(hào)位置數(shù)據(jù),板鏈線(xiàn)大車(chē)位置[24]作為桁架停車(chē)位位置數(shù)據(jù),板鏈線(xiàn)大車(chē)位置[25]~[34]作為AGV 存儲(chǔ)區(qū)10 個(gè)位置值數(shù)據(jù)(板鏈線(xiàn)大車(chē)位置[21]~[23]和[35]~[39]作為備用)。將32 個(gè)位置點(diǎn)的大車(chē)方向位置值、小車(chē)方向位置值、起升方向位置值和疊放數(shù)量值分別填入對(duì)應(yīng)的數(shù)據(jù)內(nèi),并把這些數(shù)據(jù)的屬性設(shè)置為斷電保持;防止這些位置數(shù)據(jù)值的丟失。
現(xiàn)在,只需要一個(gè)“指針”指向想要讀取或者寫(xiě)入的位置數(shù)據(jù)即可;這樣位置數(shù)據(jù)傳送的這段邏輯就極大地簡(jiǎn)化。位置數(shù)據(jù)的修改只需要到相應(yīng)的數(shù)組內(nèi)修改即可。同時(shí),位置點(diǎn)的數(shù)量也可以通過(guò)調(diào)整數(shù)組內(nèi)元素的數(shù)量來(lái)調(diào)整。極大方便了現(xiàn)場(chǎng)的調(diào)試,也降低現(xiàn)場(chǎng)修改邏輯的工作量及發(fā)生錯(cuò)誤的機(jī)率。
在西門(mén)子PLC 中,S1500 系列相對(duì)高等級(jí)的PLC中使用FileRead:讀取域的功能塊就可以實(shí)現(xiàn)上述功能。從該功能塊的幫助文檔中可以得知,INDEX 是要讀取數(shù)據(jù)值的索引值,MEMBER 是要讀取數(shù)據(jù)數(shù)組的第一個(gè)元素;而VALUE 則是讀取到索引值對(duì)應(yīng)數(shù)據(jù)值[7]。PLC 程序中讀取桁架大車(chē)位置數(shù)據(jù)的程序邏輯,如圖2所示。
圖2 FileRead 讀取域功能塊
根據(jù)FileRead 讀取域的幫助文檔說(shuō)明,當(dāng)需要板鏈線(xiàn)大車(chē)方向位置數(shù)據(jù)時(shí),只需要把INDEX 輸入“指令變量”的值設(shè)置為0;VALUE 輸出的值就把板鏈線(xiàn)大車(chē)位置值數(shù)組內(nèi)第一個(gè)數(shù)值(板鏈線(xiàn))自動(dòng)傳送到“自動(dòng)運(yùn)行大車(chē)目標(biāo)值”的變量中。而當(dāng)需要AGV 存儲(chǔ)區(qū)10 號(hào)位置時(shí),需要把“指令變量”的值設(shè)置為34 即可。這里的“指令變量”就類(lèi)似高級(jí)編程語(yǔ)言中的“指針”,利用修改“指針”的數(shù)值,得到想要的數(shù)組內(nèi)的數(shù)值[5-6]。
以此類(lèi)推,利用FileRead 讀取域的功能塊同樣可以很方便得到桁架所需要的小車(chē)方向位置數(shù)據(jù)、起升方向位置數(shù)據(jù)及疊放數(shù)量值,進(jìn)行數(shù)據(jù)計(jì)算和下一步的邏輯處理。
如果PLC 中沒(méi)有FileRead 讀取域的系統(tǒng)功能塊時(shí),則可以利用“指針和數(shù)組”的編程方式編寫(xiě)功能塊來(lái)實(shí)現(xiàn)相同的功能。在西門(mén)子PLC 中,使用高級(jí)編程語(yǔ)言SCL(結(jié)構(gòu)化控制語(yǔ)言)編寫(xiě)相應(yīng)程序邏輯就可以實(shí)現(xiàn)和FileRead 讀取域系統(tǒng)功能塊相同的功能。
首先是讀取功能塊輸入的數(shù)據(jù)(整型數(shù)據(jù)的一維數(shù)組),把一維數(shù)組內(nèi)的數(shù)據(jù)存入臨時(shí)的一維數(shù)組內(nèi)(Temp_Int_Arr)。利用Index_Data 的“指針”變量指向要讀取的數(shù)據(jù),并通過(guò)#Temp_REF_Data:= REF(#Temp_Int_Arr [#index_Data]) 以及#Int_DataOut:=#Temp_REF_ Data^;語(yǔ)句輸出。功能塊邏輯及功能對(duì)比測(cè)試左側(cè)部分的控制邏輯,如圖3 所示。
圖3 功能塊邏輯及功能對(duì)比測(cè)試
編寫(xiě)完成功能塊后,在主程序中分別調(diào)用ArrayDataRead 功能塊和FieldRead 系統(tǒng)功能塊。在“指針”變量輸入側(cè)填入相同的變量(Pointer1),數(shù)據(jù)輸入側(cè)填入相同的一維數(shù)組(Test_DB.Test_Int_Data)。下載程序后運(yùn)行并在線(xiàn)監(jiān)控,從圖3 功能塊邏輯及功能對(duì)比測(cè)試的右側(cè)部分可以看到,編寫(xiě)的ArrayDataRead 功能塊和FieldRead 系統(tǒng)功能塊運(yùn)行輸出的結(jié)果相同,證明編寫(xiě)的功能塊ArrayDataRead 和系統(tǒng)功能塊FieldRead 有相同的功能。
綜上所述,無(wú)論是采用FieldRead 系統(tǒng)功能塊還是使用自主編寫(xiě)的ArrayDataRead 功能塊,都能極大地簡(jiǎn)化桁架位置數(shù)據(jù)傳送的控制邏輯;降低桁架位置數(shù)據(jù)傳送控制邏輯的編寫(xiě)量,使PLC 程序更易于查看、修改和故障排查。
無(wú)獨(dú)有偶,在某項(xiàng)目設(shè)備的編碼器參數(shù)傳送邏輯中,同樣也應(yīng)用到“指針和數(shù)組”編程方式,實(shí)現(xiàn)了根據(jù)設(shè)備ID 進(jìn)行編碼器參數(shù)傳動(dòng)功能的邏輯。根據(jù)項(xiàng)目控制邏輯的需求,通過(guò)設(shè)備的ID 進(jìn)行判斷,從而傳送出左右2 個(gè)不同的編碼器參數(shù)并進(jìn)行長(zhǎng)度數(shù)據(jù)的運(yùn)算。
首先,在PLC 中設(shè)置128 個(gè)整形量編碼器參數(shù)的一維整型變量數(shù)組Paramter_Array;并根據(jù)需要設(shè)置相應(yīng)的編碼器參數(shù)(按照先右側(cè)編碼器參數(shù)后左側(cè)編碼器參數(shù)排列,共64 組)。然后,將設(shè)備的ID 作為“指針”進(jìn)行轉(zhuǎn)換并計(jì)算,把計(jì)算結(jié)果放入臨時(shí)變量Temp 中;即Temp:=(Byte_To_Int(SP_ID)-1)*4;。緊接著獲得一維數(shù)據(jù)的首地址ADR(Patameter_Array);那么右側(cè)編碼器參數(shù)數(shù)據(jù)的地址為Ptr:=ADR(Patameter_Array)+Temp;,左側(cè)編碼器參數(shù)數(shù)據(jù)的地址為Ptr1:=ADR(Patameter_Array)+Temp+2;。最后把左右兩側(cè)編碼器的數(shù)參數(shù)據(jù)分別輸出,即R_Encode_Para:=Ptr^;和L_Encode_Para:=Ptr1^;。這樣就可以實(shí)現(xiàn)以設(shè)備的ID 作為“指針”;來(lái)獲取對(duì)應(yīng)的左右兩側(cè)編碼器參數(shù)的功能。圖4 為獲取設(shè)備編碼器參數(shù)圖片內(nèi)所示的控制邏輯。
圖4 獲取設(shè)備編碼器參數(shù)
在PLC 控制邏輯中采用高級(jí)編程語(yǔ)言中的“指針和數(shù)組”編程方式,不僅順利解決了剪叉成品緩存工位中桁架定位數(shù)據(jù)的存儲(chǔ)和傳送問(wèn)題,以及實(shí)現(xiàn)用設(shè)備ID 選擇編碼器參數(shù)的功能,而且極大地簡(jiǎn)化數(shù)據(jù)傳送的控制邏輯。增加了PLC 控制邏輯的可讀性,降低桁架位置數(shù)據(jù)傳送和編碼器參數(shù)選擇控制邏輯的編寫(xiě)量,使PLC 程序更易于查看、修改和故障排查。隨著科學(xué)技術(shù)的不斷進(jìn)步,PLC 的控制系統(tǒng)將會(huì)日趨龐大和復(fù)雜;其勢(shì)必會(huì)面臨更為復(fù)雜的控制邏輯及算法計(jì)算。因此,對(duì)PLC 編程中高級(jí)編程語(yǔ)言的學(xué)習(xí)愈發(fā)緊迫和重要。