張新杰
(上海振華重工(集團)股份有限公司,上海 200125)
在大型自動化生產(chǎn)線項目中,每個自動化工位之間和工位內(nèi)部都會涉及到數(shù)據(jù)的存儲、讀寫和傳送問題。PLC 具有結(jié)構(gòu)簡單、編程方便、可靠性高等特點,在工業(yè)及生產(chǎn)過程中得到廣泛應用[1]。但是PLC 常用的編程語言功能簡單,無法實現(xiàn)復雜的控制邏輯和算法運算[1-2]。隨著我國生產(chǎn)水平的不斷發(fā)展與進步,傳統(tǒng)工業(yè)制造對電氣自動化控制也有了新的需求。信息技術與傳統(tǒng)工業(yè)制造行業(yè)的結(jié)合是必然趨勢[3],PLC對復雜的控制邏輯和算法運算的需求勢必會日益增大。隨著高級編程語言在PLC 中的應用日益普遍[4],研究在PLC 編程中應用高級編程語言具有重要的現(xiàn)實意義。
本文在PLC 編程中應用高級編程語言的數(shù)組和指針編程方式,用來解決實際控制邏輯中大量數(shù)據(jù)的傳送問題。寄希望本文能起到拋磚引玉的效果,引起讀者對PLC 編程中的高級編程語言學習的重視。
某大型剪叉自動焊接生產(chǎn)線項目中,由剪叉激光切割工位、剪叉人工組隊工位、剪叉半成品板鏈線工位、剪叉自動焊接工位、搬運機器人、剪叉成品板鏈線工位、剪叉成品緩存工位和AGV 運輸小車駐車工位組成。其中,剪叉成品緩存工位上游“聯(lián)接”剪叉成品板鏈線工位和剪叉自動焊接工位,下游“銜接”AGV 運輸小車。該剪叉成品緩存工位有伺服電機驅(qū)動的“桁架”,負責從板鏈線工位上抓取剪叉成品,經(jīng)過RFID 識別后分別存放至剪叉成品緩存工位的緩存區(qū)域。根據(jù)剪叉成品不同的型號規(guī)格,緩存區(qū)域設置有20 個剪叉緩存位置;每個緩存位置可以疊放至8 層。同時,AGV 運輸小車上有可以疊放8 層的10 個剪叉存放位置。“桁架”不僅負責從剪叉成品板鏈線工位抓取剪叉成品存放于剪叉緩存區(qū)域,同時也負責從剪叉緩存區(qū)域抓取剪叉成品至AGV 運輸小車的剪叉存放位置。
在剪叉成品緩存工位中,有一個剪叉成品板鏈線取料點位置,一個桁架停車位;有20 個剪叉成品緩存區(qū)域位置以及10 個AGV 的剪叉存放位置,共計32 個位置點。每個位置點有4 個位置數(shù)據(jù)值需要存儲,分別是:大車方向位置值(X 方向),小車方向位置值(Y 方向),起升方向位置值(Z 方向)及疊放層數(shù)的數(shù)值。綜上,該工位僅存取位置值所需位置數(shù)據(jù)量已經(jīng)多達128 個。而剪叉成品緩存工位能否正確運行的關鍵,取決于PLC 控制系統(tǒng)能否給到正確的大車方向、小車方向和起升方向的位置數(shù)據(jù)值至大車、小車和起升伺服控制器。剪叉成品緩存工位的總覽圖如圖1 所示。

圖1 剪叉成品緩存工位總覽
剪叉成品緩存工位一旦剪叉成品板鏈線位置、20個剪叉成品緩存區(qū)域以及AGV 停車位置確定,那么這32 個位置點相對于桁架的“零點”的數(shù)據(jù)值就會確定;這些數(shù)據(jù)值就是伺服控制器運行的目標值。
拋開其他的PLC 控制邏輯不談,如果按照常規(guī)的PLC 編程方式把每個位置點的位置數(shù)據(jù)傳送到伺服控制器,這就需要使用“MOVE”指令。把上述確定的位置數(shù)據(jù)值發(fā)送至伺服控制器,一個位置點需要使用4 次“MOVE”指令;32 個位置點需要使用128 次“MOVE”指令。編寫完成這段數(shù)據(jù)傳送邏輯后,會發(fā)現(xiàn)以下2 個問題。
2.1.1 數(shù)據(jù)傳送邏輯篇幅冗長,不夠簡練
僅僅一個傳送位置數(shù)據(jù)到伺服控制器的邏輯,就需要重復使用“MOVE”指令128 次。篇幅過長,增加查看邏輯、尋找故障上的困難。如果存儲的位置點再增加的話,這段數(shù)據(jù)傳送邏輯篇幅需要得更長。
2.1.2 數(shù)據(jù)傳送邏輯修改不方便、易出錯
現(xiàn)場調(diào)試階段不確定因素較多,位置點的增加、減少或者調(diào)整的情況屢見不鮮。在這種情況下就會出現(xiàn)大量的邏輯增加、刪除或者數(shù)據(jù)修改工作。稍有不慎,很容易出錯;給調(diào)試工作帶來諸多不便。對于大型復雜的控制系統(tǒng),修改某一局部控制邏輯時,很可能會牽涉到整個系統(tǒng)的每個環(huán)節(jié),給系統(tǒng)其他部分造成意料不到的影響[2]。
常規(guī)的編程方式需要大量的重復使用“MOVE”指令,而且一旦修改或刪除即有可能對整個控制系統(tǒng)造成嚴重的影響。能否簡化僅使用一個“標識”就能同時發(fā)送多個數(shù)據(jù)呢?高級編程語言中的“指針”和“數(shù)組”不就是利用指針來傳送數(shù)據(jù)的嗎[5-6]?利用“指針和數(shù)組”的思維,重新梳理下位置數(shù)據(jù)傳送的這段邏輯。
首先在PLC 控制程序中,建立4 個一維數(shù)組;分別對應32 個位置點大車方向位置值、小車方向位置值、起升方向位置值和疊放層數(shù)的數(shù)值。數(shù)組內(nèi)的元素初步設定為40 個,從0~39;并規(guī)定板鏈線大車位置[0]作為板鏈線的位置數(shù)據(jù)值,板鏈線大車位置[1]~[20]作為存儲區(qū)1 號至20 號位置數(shù)據(jù),板鏈線大車位置[24]作為桁架停車位位置數(shù)據(jù),板鏈線大車位置[25]~[34]作為AGV 存儲區(qū)10 個位置值數(shù)據(jù)(板鏈線大車位置[21]~[23]和[35]~[39]作為備用)。將32 個位置點的大車方向位置值、小車方向位置值、起升方向位置值和疊放數(shù)量值分別填入對應的數(shù)據(jù)內(nèi),并把這些數(shù)據(jù)的屬性設置為斷電保持;防止這些位置數(shù)據(jù)值的丟失。
現(xiàn)在,只需要一個“指針”指向想要讀取或者寫入的位置數(shù)據(jù)即可;這樣位置數(shù)據(jù)傳送的這段邏輯就極大地簡化。位置數(shù)據(jù)的修改只需要到相應的數(shù)組內(nèi)修改即可。同時,位置點的數(shù)量也可以通過調(diào)整數(shù)組內(nèi)元素的數(shù)量來調(diào)整。極大方便了現(xiàn)場的調(diào)試,也降低現(xiàn)場修改邏輯的工作量及發(fā)生錯誤的機率。
在西門子PLC 中,S1500 系列相對高等級的PLC中使用FileRead:讀取域的功能塊就可以實現(xiàn)上述功能。從該功能塊的幫助文檔中可以得知,INDEX 是要讀取數(shù)據(jù)值的索引值,MEMBER 是要讀取數(shù)據(jù)數(shù)組的第一個元素;而VALUE 則是讀取到索引值對應數(shù)據(jù)值[7]。PLC 程序中讀取桁架大車位置數(shù)據(jù)的程序邏輯,如圖2所示。

圖2 FileRead 讀取域功能塊
根據(jù)FileRead 讀取域的幫助文檔說明,當需要板鏈線大車方向位置數(shù)據(jù)時,只需要把INDEX 輸入“指令變量”的值設置為0;VALUE 輸出的值就把板鏈線大車位置值數(shù)組內(nèi)第一個數(shù)值(板鏈線)自動傳送到“自動運行大車目標值”的變量中。而當需要AGV 存儲區(qū)10 號位置時,需要把“指令變量”的值設置為34 即可。這里的“指令變量”就類似高級編程語言中的“指針”,利用修改“指針”的數(shù)值,得到想要的數(shù)組內(nèi)的數(shù)值[5-6]。
以此類推,利用FileRead 讀取域的功能塊同樣可以很方便得到桁架所需要的小車方向位置數(shù)據(jù)、起升方向位置數(shù)據(jù)及疊放數(shù)量值,進行數(shù)據(jù)計算和下一步的邏輯處理。
如果PLC 中沒有FileRead 讀取域的系統(tǒng)功能塊時,則可以利用“指針和數(shù)組”的編程方式編寫功能塊來實現(xiàn)相同的功能。在西門子PLC 中,使用高級編程語言SCL(結(jié)構(gòu)化控制語言)編寫相應程序邏輯就可以實現(xiàn)和FileRead 讀取域系統(tǒng)功能塊相同的功能。
首先是讀取功能塊輸入的數(shù)據(jù)(整型數(shù)據(jù)的一維數(shù)組),把一維數(shù)組內(nèi)的數(shù)據(jù)存入臨時的一維數(shù)組內(nèi)(Temp_Int_Arr)。利用Index_Data 的“指針”變量指向要讀取的數(shù)據(jù),并通過#Temp_REF_Data:= REF(#Temp_Int_Arr [#index_Data]) 以及#Int_DataOut:=#Temp_REF_ Data^;語句輸出。功能塊邏輯及功能對比測試左側(cè)部分的控制邏輯,如圖3 所示。

圖3 功能塊邏輯及功能對比測試
編寫完成功能塊后,在主程序中分別調(diào)用ArrayDataRead 功能塊和FieldRead 系統(tǒng)功能塊。在“指針”變量輸入側(cè)填入相同的變量(Pointer1),數(shù)據(jù)輸入側(cè)填入相同的一維數(shù)組(Test_DB.Test_Int_Data)。下載程序后運行并在線監(jiān)控,從圖3 功能塊邏輯及功能對比測試的右側(cè)部分可以看到,編寫的ArrayDataRead 功能塊和FieldRead 系統(tǒng)功能塊運行輸出的結(jié)果相同,證明編寫的功能塊ArrayDataRead 和系統(tǒng)功能塊FieldRead 有相同的功能。
綜上所述,無論是采用FieldRead 系統(tǒng)功能塊還是使用自主編寫的ArrayDataRead 功能塊,都能極大地簡化桁架位置數(shù)據(jù)傳送的控制邏輯;降低桁架位置數(shù)據(jù)傳送控制邏輯的編寫量,使PLC 程序更易于查看、修改和故障排查。
無獨有偶,在某項目設備的編碼器參數(shù)傳送邏輯中,同樣也應用到“指針和數(shù)組”編程方式,實現(xiàn)了根據(jù)設備ID 進行編碼器參數(shù)傳動功能的邏輯。根據(jù)項目控制邏輯的需求,通過設備的ID 進行判斷,從而傳送出左右2 個不同的編碼器參數(shù)并進行長度數(shù)據(jù)的運算。
首先,在PLC 中設置128 個整形量編碼器參數(shù)的一維整型變量數(shù)組Paramter_Array;并根據(jù)需要設置相應的編碼器參數(shù)(按照先右側(cè)編碼器參數(shù)后左側(cè)編碼器參數(shù)排列,共64 組)。然后,將設備的ID 作為“指針”進行轉(zhuǎn)換并計算,把計算結(jié)果放入臨時變量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^;。這樣就可以實現(xiàn)以設備的ID 作為“指針”;來獲取對應的左右兩側(cè)編碼器參數(shù)的功能。圖4 為獲取設備編碼器參數(shù)圖片內(nèi)所示的控制邏輯。

圖4 獲取設備編碼器參數(shù)
在PLC 控制邏輯中采用高級編程語言中的“指針和數(shù)組”編程方式,不僅順利解決了剪叉成品緩存工位中桁架定位數(shù)據(jù)的存儲和傳送問題,以及實現(xiàn)用設備ID 選擇編碼器參數(shù)的功能,而且極大地簡化數(shù)據(jù)傳送的控制邏輯。增加了PLC 控制邏輯的可讀性,降低桁架位置數(shù)據(jù)傳送和編碼器參數(shù)選擇控制邏輯的編寫量,使PLC 程序更易于查看、修改和故障排查。隨著科學技術的不斷進步,PLC 的控制系統(tǒng)將會日趨龐大和復雜;其勢必會面臨更為復雜的控制邏輯及算法計算。因此,對PLC 編程中高級編程語言的學習愈發(fā)緊迫和重要。