趙青
[摘 要] 對(duì)S7-200smartPLC來(lái)說(shuō),尋址分為直接尋址和間接尋址,其中間接尋址主要用于需要在程序中修改地址的場(chǎng)合,特別是處理數(shù)據(jù)內(nèi)容比較多的情況,使用間接尋址編程靈活,節(jié)省程序空間。大多教材關(guān)于間接尋址的概念和應(yīng)用介紹得不夠通俗易懂,很多學(xué)生,甚至工程技術(shù)人員對(duì)間接尋址的使用存在概念不清,應(yīng)用不明的情況。通過(guò)三個(gè)例子循序漸進(jìn)地說(shuō)明間接尋址的概念和應(yīng)用,經(jīng)過(guò)教學(xué)實(shí)踐,學(xué)生反饋較好。
[關(guān) 鍵 詞] 間接尋址;操作數(shù);地址;指針
[中圖分類號(hào)] TP273 [文獻(xiàn)標(biāo)志碼] A [文章編號(hào)] 2096-0603(2018)24-0018-02
PLC將信息存于不同的存儲(chǔ)器單元,每個(gè)單元都有唯一的地址。地址也是我們?cè)L問(wèn)所有數(shù)據(jù)的依據(jù),那么我們?cè)L問(wèn)數(shù)據(jù)的過(guò)程就是尋址。在s7-200smartPLC中通過(guò)地址訪問(wèn)數(shù)據(jù),地址是訪問(wèn)數(shù)據(jù)的依據(jù),訪問(wèn)數(shù)據(jù)的過(guò)程稱為“尋址”。幾乎所有的指令和功能都與各種形式的尋址有關(guān)。直接尋址指定了存儲(chǔ)器的長(zhǎng)度和位置,例如VW90是V存儲(chǔ)區(qū)中16位的字,其地址為90。而間接尋址在指令中給出的不是操作數(shù)的值或操作數(shù)的地址,而是給出一個(gè)被稱為指針的雙字存儲(chǔ)單元的地址,指針里存放的是真正的操作數(shù)的地址。
一、如何進(jìn)行間接尋址
使用間接尋址的方式存取數(shù)據(jù)主要分為以下三個(gè)步驟來(lái)實(shí)現(xiàn):
(一)建立指針
使用間接尋址之前,應(yīng)創(chuàng)建一個(gè)指針。指針以雙字的形式存儲(chǔ)要訪問(wèn)的存儲(chǔ)器的地址,只能用V存儲(chǔ)器、L存儲(chǔ)器或者累加器AC作為指針。建立指針時(shí),用雙字傳送指令MOVD將需要間接尋址的存儲(chǔ)器起始地址送到指針中。指針的輸入數(shù)應(yīng)該以“&”符號(hào)開頭來(lái)表明存儲(chǔ)區(qū)的地址,注意不是其內(nèi)容將移動(dòng)到指令的輸出操作數(shù)中。
S7-200smartPLC中允許使用指針對(duì)下述存儲(chǔ)區(qū)進(jìn)行間接尋址:I、Q、V、M、S、AI、AQ、SM、T(僅當(dāng)前值)和C(僅當(dāng)前值)。但不能對(duì)單個(gè)的位地址、HC、L存儲(chǔ)區(qū)和累加器進(jìn)行間接尋址。
例1:針對(duì)存儲(chǔ)區(qū)VB0為起始地址的一組數(shù)據(jù)和以T37為起始地址的一組定時(shí)器當(dāng)前值進(jìn)行間接尋址。VB0的地址作為指針?biāo)腿隫D100,“&VB0”是VB0的地址,而不是VB0中的內(nèi)容;同理T37的地址作為指針?biāo)腿隫D200,“&T37”是T37的地址,而不是定時(shí)器T37的當(dāng)前值。
(二)數(shù)據(jù)讀取
用指針訪問(wèn)數(shù)據(jù)時(shí),操作數(shù)前加“*”號(hào),表示指令中的操作數(shù)是一個(gè)指針。當(dāng)有M0.0的上升沿脈沖時(shí),將指針VD100所指的存儲(chǔ)單元的數(shù)據(jù)內(nèi)容送到VB400中,針針VD200所指的存儲(chǔ)單元的數(shù)據(jù)內(nèi)容送到VW1000中。
將程序下載到s7-200smartPLC調(diào)試,打開狀態(tài)圖表,假設(shè)約定兩組數(shù)據(jù),第一組以VB0為首地址的數(shù)據(jù),即VB0=-10,VB1=25,VB3=38,VB4=-99;第二組數(shù)據(jù)是以T37為首地址的數(shù)據(jù),即T37當(dāng)前值=10,T38當(dāng)前值=20,T39當(dāng)前值=30,T40當(dāng)前值=40,(為了調(diào)試方便,數(shù)組組成個(gè)數(shù)為4個(gè))點(diǎn)擊“監(jiān)控圖標(biāo)”后點(diǎn)擊“寫入圖標(biāo)”寫入新值。指針VD100的當(dāng)前值+134217728,指針VD200的當(dāng)前值為+150995020,不影響間接尋址。
此例中,當(dāng)讀取數(shù)據(jù)條件,M0.0由0變成1時(shí),即執(zhí)行了第一次讀取數(shù)據(jù),讀取的數(shù)據(jù)相應(yīng)送入VB400和VW1000,此時(shí)VB400的值即為VB0的數(shù)據(jù),等于“-10”,VD1000的值即為T37的數(shù)據(jù),等于“10”;若將VD100偏移量加1,即當(dāng)前值由134217728加1變?yōu)?34217729,VD200偏移量為2,即當(dāng)前值由150995020加2變?yōu)?50995022,再次將M0.0的狀態(tài)由0變?yōu)?,讀取的數(shù)據(jù)相應(yīng)送入VB400和V1000,此時(shí)VB400的值即為VB1,等于“25”,VD1000的值即為T38的數(shù)據(jù),等于“20”。讀者可以在狀態(tài)圖表中進(jìn)行監(jiān)控調(diào)試,這里不再給出尋址其他數(shù)據(jù)的說(shuō)明。
(三)修改指針
用指針訪問(wèn)相鄰的一個(gè)數(shù)據(jù)時(shí),可以在狀態(tài)圖表中在監(jiān)控條件下通過(guò)將M0.0的位狀態(tài)的改變來(lái)修改指針,也可在程序里使用雙字加法(ADDD)或雙字遞增(INCD)指令(指針是32位的數(shù)據(jù))。修改時(shí)記住需要調(diào)整的存儲(chǔ)器地址的字節(jié)數(shù),訪問(wèn)字節(jié)時(shí),指針值加1,訪問(wèn)字時(shí),指針值加2,訪問(wèn)雙字時(shí),指針值加4??蓞⒖既缦鲁绦颍浩渲?,M0.0為指針偏移的條件,讀取數(shù)據(jù)則用SM0.0,讀者可以自行下載,用狀態(tài)圖表監(jiān)控。
LD SM0.1
MOVD &VB0, VD100 //建立指針
MOVD &T37, VD200 //建立指針
LD M0.0
EU
+D 1, VD100 //訪問(wèn)字節(jié),指針值加1
+D 2, VD200 //訪問(wèn)字,指針值加2
LD SM0.0
MOVB *VD100 VB400 //讀取數(shù)據(jù)
MOVW *VD200 VW1000 //讀取數(shù)據(jù)
以上三個(gè)步驟就可以完成間接尋址,讀者可以通過(guò)上面的例子進(jìn)行試驗(yàn),理解清楚間接尋址的概念。
二、間接尋址的應(yīng)用
間接尋址常用于循環(huán)程序,處理連續(xù)地址的數(shù)據(jù)。以下通過(guò)例子來(lái)介紹間接尋址的應(yīng)用。
(一)用于循環(huán)程序
用循環(huán)程序來(lái)累加一片連續(xù)的存儲(chǔ)區(qū)中的數(shù)值時(shí),每次循環(huán)累加一個(gè)數(shù)值。應(yīng)在累加后修改指針中存儲(chǔ)單元的地址值,使指針指向下一個(gè)存儲(chǔ)單元,為下一次循環(huán)的累加運(yùn)算做好準(zhǔn)備。沒有間接尋址,就不能編寫循環(huán)程序。間接尋址的優(yōu)點(diǎn)是可以在程序運(yùn)行期間,通過(guò)改變指針的值,動(dòng)態(tài)地修改指令中的操作數(shù)的地址。舉例說(shuō)明:
例2:在M0.5的上升沿求VB0~VB3中4個(gè)字節(jié)的異或值,運(yùn)算結(jié)果用VB4保存。
第一次循環(huán)將指針AC1所指定的VB0與VB4異或,運(yùn)算結(jié)果存入VB4中,然后將指針AC1的值加1,指針指向VB1,為下一次循環(huán)的異或運(yùn)算做好準(zhǔn)備。參考程序如下:
LD M0.5
EU
MOVB 0,VB4 //將保存運(yùn)算結(jié)果的存儲(chǔ)單元清零
MOVD &VB0, AC1 //將存儲(chǔ)區(qū)起始地址送指針AC1
FOR VW100,1,4 //循環(huán)開始
LD SM0.0
XORB *AC1,VB4 //字節(jié)異或
INCD AC1 //指針AC1的值加1,指向下一個(gè)字節(jié)
NEXT //循環(huán)結(jié)束
此例是間接尋址方式在循環(huán)程序中的典型應(yīng)用。
(二)工程應(yīng)用
例3:在葡萄汁生產(chǎn)中,根據(jù)產(chǎn)品成分:水、鮮榨果汁、糖、香料、溫度和速度的不同,可以生產(chǎn)出葡萄果汁、葡萄蜜露、葡萄飲品這三種飲料。要求編寫一個(gè)配方程序,使操作人員可以選擇生產(chǎn)不同的葡萄汁產(chǎn)品:(1)在觸摸屏畫面,選擇某一個(gè)配方,按下“調(diào)用配方”按鈕,則調(diào)用出相應(yīng)的配方;(2)若任意一個(gè)果汁產(chǎn)品的配方不合適,可以通過(guò)“修改配方”按鈕修改配方并保存;(3)按下“刪除配方”按鈕,可以刪除配方數(shù)據(jù)。
此例配合HMI應(yīng)用,因畫面制作比較簡(jiǎn)單,這里不贅述。按照要求,每種飲料都與六個(gè)變量有關(guān),分別是水、鮮榨果汁、糖、香料以及調(diào)配時(shí)的速度和溫度。下圖是在觸摸屏SMART LINE中制作的畫面。
“配方選擇”框內(nèi)可以填“1”或“2”或“3”,即選擇某一配方,存在VD200中。按下“調(diào)用配方”按鈕,即可調(diào)用所選擇的一種配方時(shí),在畫面的右側(cè)應(yīng)顯示該配方對(duì)應(yīng)數(shù)組。配方1的六個(gè)變量對(duì)應(yīng)VW0、VW2、VW4、VW6、VW8、VW10,首地址為VW0;配方2和配方3按順序以此類推,首地址分別是VW12和VW24。利用間接尋址,可以非常方便地處理這種數(shù)據(jù)內(nèi)容比較多的情況,使用間接尋址編程靈活,節(jié)省程序空間。
將VB0的地址送入指針VD300中。2號(hào)配方的首地址是1號(hào)配方的首地址增加12,3號(hào)配方的首地址是2號(hào)配方的首地址增加12,編寫程序時(shí)可以用數(shù)學(xué)運(yùn)算指令來(lái)計(jì)算指針的偏移量。選擇第n(1或2或3)號(hào)配方,則該配方指針VD300偏移量為:(n-1)*12+指針VD300。
調(diào)用配方實(shí)際就是讀取配方的內(nèi)容,可以直接讀取指針對(duì)應(yīng)的數(shù)據(jù)到目標(biāo)存儲(chǔ)區(qū)VW100-VW110中;修改配方是將目標(biāo)存儲(chǔ)區(qū)中配方的內(nèi)容存到指針對(duì)應(yīng)的配方數(shù)據(jù)區(qū);刪除配方是清零。
讀者可以自行驗(yàn)證以上程序,通過(guò)觸摸屏畫面或者狀態(tài)圖表觀察配方的變化情況。
使用間接尋址處理連續(xù)地址中的數(shù)據(jù)非常方便,而且可以減少編程工作量,使編程變得靈活。通過(guò)這幾個(gè)實(shí)例,間接尋址這個(gè)難點(diǎn)迎刃而解,學(xué)生不僅在概念上更清晰了,而且在工程應(yīng)用方面更進(jìn)一步。
參考文獻(xiàn):
[1]廖常初.S7-200SMARTPLC編程及應(yīng)用[M].北京:機(jī)械工業(yè)出版社,2015.
[2]吳浩.變頻器與PLC的通訊控制原理及應(yīng)用分析[J].科技創(chuàng)新與應(yīng)用,2016(35).