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