間接尋址方式是指通過使用指針來存取存儲器中的數(shù)據(jù)的一種尋址方式。S7-200 CPU允許使用指針對I、Q、V、M、S、T(僅當(dāng)前值)和C(僅當(dāng)前值)存儲區(qū)域進(jìn)行間接尋址,但不能對獨(dú)立的位或模擬量進(jìn)行間接尋址。使用間接尋址方式存取數(shù)據(jù)的過程如下。
(1)建立指針
使用間接尋址之前應(yīng)創(chuàng)建一個指向該位置的指針。由于存儲器的物理地址為32位,所以指針的長度應(yīng)當(dāng)為雙字,只能用變量存儲器V、局部存儲器L或累加器AC1、AC2和AC3作指針。
為了生成指針,必須用雙字傳送指令( MOVD)將要間接尋址的某存儲器的地址裝入用來作為指針的編程元件中,裝入的是地址而不是數(shù)據(jù)本身。例如,
MOVD &VB200, AC1 //VB200的地址送入AC1,建立指針
MOVD &C3, VD6 //C3的地址送入VD6,建立指針
MOVD &MB4, LD8 //MB4的地址送入LD6,建立指針
指令的輸入操作數(shù)開始處使用“&”符號,表示所尋址的操作數(shù)是要進(jìn)行間接尋址的存儲器的地址;指令的輸出操作數(shù)是指針?biāo)赶虻拇鎯ζ鞯刂罚鋽?shù)據(jù)長度為雙字。
(2)用指針來存取數(shù)據(jù)
用指針來存取數(shù)據(jù)時(shí),操作數(shù)前加“*”號,表示該操作數(shù)為一個指針。圖2-17中的“*AC1”表示AC1是一個指針,*AC1是MOVW指令確定的一個字長的數(shù)據(jù)。此例中,存于VB101和VB102的數(shù)據(jù)被傳送到累加器ACO的低16位。
圖2-17 指針間接尋址方式
(3)修改指針
連續(xù)存取指針?biāo)傅臄?shù)據(jù)時(shí),因?yàn)橹羔樖?2位的數(shù)據(jù),應(yīng)使用雙字指令來修改指針值,如雙字加法(ADDD)或雙字加1(INCD)指令。修改時(shí)需要根據(jù)所存取的數(shù)據(jù)長度來正確調(diào)整指針。當(dāng)存取字節(jié)數(shù)據(jù)時(shí),指針調(diào)整單位為1,即可執(zhí)行1次INCD指令;當(dāng)存取字時(shí),指針調(diào)整單位為2;當(dāng)存取雙字時(shí),指針調(diào)整單位為4,如圖2-18所示。
圖2-18 改變指針尋址方式