?S7-200間接尋址 對指令的操作數(shù)的指定方式,我將其理解為“尋址”。 下面將以我個人的理解對西門子S7-200的尋址方式進(jìn)行描述,如有不當(dāng)之處,還請廣大讀者指正。 在程序中絕大部分的指令都帶有操作數(shù),所謂的操作數(shù),是執(zhí)行這一指令時被這一指令加以操作、處理的數(shù)值。對指令的操作數(shù)的指令方式大致的總結(jié)一下,可以概括為如下幾個類型: 1:指令的操作數(shù)為“立即數(shù)”,(如:15、16#F、2#1111等、、、、、、)。 LD M0.0 MOVW +255, VW0 +I +45, VW0 這是一條加法指令,被加數(shù)為:255、加數(shù)為45執(zhí)行這條指令后計算出來的“和”存放在VW0這一存儲器內(nèi)。 LD M0.0 MOVB 15, VB0 這是一條傳指令,譯為:將15傳送至存儲器VB0內(nèi)。 2:指令的操作數(shù)沒有直接的給出,而是給出它所在的地址。 LD M0.0 MOVW VW0, VW4 -I VW2, VW4 這是一條減法指令,譯為:將存儲器VW0內(nèi)的數(shù)值減去存儲器VW2內(nèi)的數(shù)值,將“差”存放在存儲器VW4內(nèi)。 3:指令的操作數(shù)沒有直接的給出,而是給出它所在的地址的“地址”,在S7-200中,將這種尋址方式稱之為“指針尋址”。 下面,我們一起來學(xué)習(xí)一下關(guān)于指針的使用方法: 在使用指針進(jìn)行間接尋址的過程中,會涉及到的兩個符號: &:建立指針(進(jìn)行間接訪問的區(qū)域) *:讀取指針(讀取指針間接指定的地址) 下面是使用指針的一般步驟: 1:建立指針 建立指針需要使用雙字傳送指令,如下所示: LD M0.0 MOVD &MB0, VD10 譯為:在VD10建立指針,指針指向被間接訪問的首地址MB0。 在建立指針時需要注意如下幾個問題: ①可以進(jìn)行間接訪問的區(qū)域,包括如下幾個區(qū)域:I、Q、M、S、V、T(當(dāng)前值)、C(當(dāng)前值)。在S7-200中位狀態(tài)是不能進(jìn)行間接指定的,所以這里特別強(qiáng)調(diào)只是訪問定時器及計數(shù)器的當(dāng)前值,而不是其位狀態(tài)。 ②可以作為建立指針的區(qū)域,包括如下幾個區(qū)域:V、L、及累加器AC1至AC3。且只能是雙字(32bit)類型的地址。 ③在建立指針時在存儲器前加“&”這個符號的表示進(jìn)行間接訪問的區(qū)域的首地址,所以除定時器T及計數(shù)器C外都必須是以字節(jié)的形式出現(xiàn)的。 2:讀取指針 在讀取指針時,有如下幾種不同的情況出現(xiàn): ①以字節(jié)的形式讀取指針: LD M0.0 MOVD &MB0, VD10 MOVB *VD10, VB30 譯為:在VD10建立指針,指針指向以MB0為首地址的地址,讀取在指針VD10所指向的首地址開始的一個字節(jié)(即以MB0開始的一個字節(jié),很明顯就是MB0本身),所以,讀取指針時將MB0放到VB30。 ②以字的形式讀取指針: LD M0.0 MOVD &MB0, VD10 MOVW *VD10, MW20 譯為:在VD10建立指針,指針指向以MB0為首的地址,讀取在 指針VD10所指向的首地址開始的一個字(即以MB0開始的一個字,很明顯就是MW0),所以,讀取指針時將MW0放到MW20。 ③以雙字的形式讀取指針: LD M0.0 MOVD &VB0, VD10 MOVD *VD10, VD40 譯為:在VD10建立指針,指針指向以VB0為首的地址,讀取在指針VD10所指向的首地址開始的一個雙字(即以VB0開始的一個雙字,很明顯就是VD0),所以,讀取指針時將VD0放到VD40。 3:修改指針 修改指針是在使用指針尋址中關(guān)健的一部分,修改指針是將指針指向的首地址進(jìn)行適當(dāng)?shù)钠?,使之指向我們需要訪問的地址,這樣我們可以比較方便的使用在這一存儲區(qū)的某一具體地址,使程序的靈活性有所增加。 修改指針的方法大致的可以概括為如下幾種: ①使用加法或減法指令,對指針進(jìn)行指定常數(shù)作為偏移量的修改指針。 ②使用加“1”或減“1”指令,對指針進(jìn)行1個單位(字節(jié))的偏移。 下面將以實際情況為例來說明修改批指針的方法: 例1: 網(wǎng)絡(luò)1: LD M0.0 MOVD &VB0, VD10 MOVD *VD10, VD40 +D 4, VD10 網(wǎng)絡(luò)2: LD M0.1 MOVD *VD10, VD44 譯為:在VD10建立指針,指針指向以VB0為首的地址,讀取在指針VD10所指向的首地址開始的一個雙字(即以VB0開始的一個雙字,很明顯就是VD0),所以,讀取指針時將VD0放到VD40。然后對指針進(jìn)行修改,對其指定4個單位的偏移量,即指針此時指向的首地址為VB4。 在下一網(wǎng)絡(luò)中又以雙字的形式讀取指針。所以,此時讀取指針是將以VB4為首的一個雙字傳送至VD44(即VD4傳送至VD44)。 例2: 網(wǎng)絡(luò)1: LD M0.0 MOVD &VB0, VD10 MOVB *VD10, MB0 INCD VD10 網(wǎng)絡(luò)2: LD M0.1 MOVB *VD10, MB1 譯為:在VD10建立指針,指針指向以VB0為首的地址,讀取在指針VD10所指向的首地址開始的一個字節(jié)(即以VB0開始的一個字節(jié),很明顯就是VB0),所以,讀取指針時將VB0放到MB0。然后對指針進(jìn)行修改,對其進(jìn)行一個單位(字節(jié))的偏移,即指針此時指向的首地址為VB1。 在下一網(wǎng)絡(luò)中又以字節(jié)的形式讀取指針。所以,此時讀取指針是將以VB1為首的一個字節(jié)傳送至MB1(即VB1傳送至MB1)。 在程序中,如果希望以連續(xù)的形式去間接訪問地址(即:讀取VB0后希望下一次讀取的是VB1、讀取VW0后希望下一次讀取的是VW2、讀取VD0后希望下一次讀取的是VD4),修改指針時,需要注意以下問題: ①讀取下一個字節(jié): 網(wǎng)絡(luò)1: LD M0.0 MOVD &VB0, VD10 MOVB *VD10, VB100 +D 1, VD10 網(wǎng)絡(luò)2: LD M0.1 MOVB *VD10, VB100 第一次讀指針時,讀取的是VB0。 第二次讀指針時,讀取的是VB1。 ②讀取下一個字: 網(wǎng)絡(luò)1: LD M0.0 MOVD &VB0, VD10 MOVW *VD10, VW100 +D 2, V VD10 網(wǎng)絡(luò)2: LD M0.1 MOVW *VD10, VW100 第一次讀指針時,讀取的是VW0。 第二次讀指針時,讀取的是VW2。 ③讀取下一個雙字: 網(wǎng)絡(luò)1: LD M0.0 MOVD &VB0, VD10 MOVD *VD10, VD100 +D 4, VD10 網(wǎng)絡(luò)2: LD M0.1 MOVD *VD10, VD100 第一次讀指針時,讀取的是VD0。 第二次讀指針時,讀取的是VD4。 綜上所述,在以連續(xù)方式讀取指針時: ⑴讀取下一個字節(jié),修改指針時“加1”。 ⑵讀取下一個字,修改指針時“加2”。 ⑶讀取下一個雙字,修改指針時“加4”。 下面,給出兩個應(yīng)用實例,讀者可自行分析其工作原理。 例1: 網(wǎng)絡(luò)1: LD I1.0 EU MOVD &VB0, VD100 S M0.0, 1 網(wǎng)絡(luò)2: LD M0.0 FOR VW1000, 1, 10 網(wǎng)絡(luò)3: LD Always_On:SM0.0 MOVW VW1000, VW1002 +I VW1000, VW1002 MOVW VW1002, *VD100 +D 2, VD100 網(wǎng)絡(luò)4: NEXT 網(wǎng)絡(luò)5: LDW>= VW1000, 10 R M0.0, 1 例2: 網(wǎng)絡(luò)1: LD M0.0 MOVD &VB300, VD131 MOVW 0, VW129 網(wǎng)絡(luò)2: LD M0.0 FOR VW125, 1, 6 網(wǎng)絡(luò)3: LD SM0.0 MOVB *VD131, AC0 +I AC0, VW129 +D 1, VD131 網(wǎng)絡(luò)4: NEXTS7-200cpu允許使用指針對下述存儲區(qū)進(jìn)行間接尋址:I, Q, V, M, S, T和C。但不能對獨(dú)立的位或模擬量進(jìn)行間接尋址。指針為雙字值,用來存放另一個存儲器的地址,只能用V, L或累加器AC1,AC2和AC3作指針。為了生成指針,必須用雙字傳送指令(MOVD)將某個位置的地址移入另一個位置或累加器作為指針。 MOVD &VB200,AC1 MOVW *AC1,AC0
|
|