在西門(mén)子S7-300和S7-400的編程中經(jīng)常需要調(diào)用一些系統(tǒng)功能或功能塊,在輸入參數(shù)時(shí)經(jīng)常碰到有指針類(lèi)型的參數(shù),那么你對(duì)指針類(lèi)型了解嗎?我第一次接觸指針一詞是在學(xué)習(xí)C語(yǔ)言的時(shí)候,指針和鏈表是C語(yǔ)言中的一個(gè)重點(diǎn)難點(diǎn)。在C語(yǔ)言中,指針即存儲(chǔ)器地址,在西門(mén)子PLC中的指針也是指地址。
下面看看西門(mén)子POINTER類(lèi)型的結(jié)構(gòu):
參數(shù)類(lèi)型POINTER存儲(chǔ)下列信息:
·?DB編號(hào)(或0,如果數(shù)據(jù)沒(méi)有存儲(chǔ)在DB中)
·?CPU中的存儲(chǔ)區(qū)域(下表給出了參數(shù)類(lèi)型POINTER存儲(chǔ)器區(qū)的十六進(jìn)制代碼)
?
十六進(jìn)制代碼 | 存儲(chǔ)區(qū) | 描述 |
b#16#81 | I | 輸入?yún)^(qū)域 |
b#16#82 | Q | 輸出區(qū)域 |
b#16#83 | M | 位存儲(chǔ)區(qū)域 |
b#16#84 | DB | 數(shù)據(jù)塊 |
b#16#85 | DI | 背景數(shù)據(jù)塊 |
b#16#86 | L | 本地的數(shù)據(jù)(L堆棧) |
b#16#87 | V | 先前的本地?cái)?shù)據(jù) |
?
數(shù)據(jù)的地址(格式為字節(jié).位)
STEP 7提供指針格式:p#memory_area byte.bit_address. (如果形式參數(shù)被聲明為參數(shù)類(lèi)型POINTER,只需要指出存儲(chǔ)區(qū)域和地址。STEP 7將自動(dòng)地重定輸入指針的格式。)?下面的實(shí)例說(shuō)明如何為以M50.0開(kāi)始的數(shù)據(jù)輸入?yún)?shù)類(lèi)型POINTER:P#M50.0
存儲(chǔ)器間接尋址:
使用存儲(chǔ)器間接尋址的程序語(yǔ)句包含一條指令,后面跟有[地址]標(biāo)識(shí)符,最后是一個(gè)(地址必須括在方括號(hào)內(nèi))。根據(jù)所用的地址標(biāo)識(shí)符,該指令會(huì)將存儲(chǔ)于指定地址的數(shù)據(jù)解釋為字或雙字指針。完整的數(shù)據(jù)地址由地址標(biāo)識(shí)符和指針構(gòu)成,如下例所示。間接尋址的優(yōu)點(diǎn)是能在程序執(zhí)行期間動(dòng)態(tài)修改指令的數(shù)據(jù)地址。
存儲(chǔ)器間接尋址使用以下兩部分地址:
1.?地址標(biāo)識(shí)符
對(duì)于由位邏輯運(yùn)算尋址的位,可分配地址標(biāo)識(shí)符I、Q、M、L、DIX或DBX。
對(duì)于由裝載指令尋址的字節(jié)、字和雙字,可使用存儲(chǔ)區(qū)I、Q、M、L、D和PI,分配IB、IW、ID、DBB、DBW、DBD、DIB、DIW、DID、PIB、PIW、PID等形式的地址標(biāo)識(shí)符。
對(duì)于由傳送指令尋址的字節(jié)、字和雙字,可使用存儲(chǔ)區(qū)I、Q、M、L、DB、DI和PQ,分配IB、IW、ID、DBB、DBW、DBD、DIB、DIW、DID、PQB、PQW、PQD等形式的地址標(biāo)識(shí)符。
要尋址定時(shí)器、計(jì)數(shù)器或塊,可使用T、C、DB、DI、FB、FC形式的區(qū)域標(biāo)識(shí)符。
2.?括在方括號(hào)"[ ]"內(nèi)的字或雙字指針的地址
字指針 - 含有定時(shí)器(T)、計(jì)數(shù)器(C)、數(shù)據(jù)塊(DB、DI)或邏輯塊(FC、FB)的標(biāo)識(shí)號(hào)的字。字指針是十進(jìn)制整數(shù)。
雙字指針 - 指含有位、字節(jié)、字或雙字的確切位置的雙字。雙字指針的格式為:P#字節(jié).位。指針必須存儲(chǔ)在下列區(qū)域之一,才能進(jìn)行存儲(chǔ)器間接尋址:
M - 位存儲(chǔ)器
L??- 本地?cái)?shù)據(jù)
D - 數(shù)據(jù)塊(DB或DI)
STAT??靜態(tài)數(shù)據(jù)(不是用于具有多重實(shí)例能力的塊的靜態(tài)數(shù)據(jù))
注意如果要尋址使用存儲(chǔ)器間接尋址的字節(jié)、字或雙字,請(qǐng)確保指針的位號(hào)為雙字格式0。
字指針實(shí)例:
L 5 //將指針值載入ACCU 1。T MW2 //將指針傳送到MW2中。
L T[MW2]?//將5號(hào)定時(shí)器的當(dāng)前時(shí)間值載入ACCU 1。
L C[MW2] //將5號(hào)計(jì)數(shù)器的當(dāng)前計(jì)數(shù)值載入ACCU 1。
OPN DB[MW2] //將數(shù)據(jù)塊DB5作為共享數(shù)據(jù)塊打開(kāi)。
OPN DI[MW2] //將數(shù)據(jù)塊DB5作為背景數(shù)據(jù)塊打開(kāi)。
雙字指針實(shí)例:
L P#8.7 //將指針值載入ACCU 1。T MD2 //將指針傳送到MD2中。A I [MD2]?//掃描輸入位8.7的狀態(tài),并將其= Q [MD2]?//信號(hào)狀態(tài)分配給輸出位Q 8.7。
區(qū)域內(nèi)寄存器間接尋址:
使用區(qū)域內(nèi)寄存器間接尋址的程序語(yǔ)句包含一條指令和以下組成部分:地址標(biāo)識(shí)符[地址寄存器標(biāo)識(shí)符,地址]。區(qū)域內(nèi)寄存器間接尋址使用以下兩部分地址:
1.?地址標(biāo)識(shí)符
對(duì)于由位邏輯運(yùn)算尋址的位,可以分配地址標(biāo)識(shí)符I、Q、M、L、DIX或DBX。
對(duì)于由裝載指令尋址的字節(jié)、字和雙字,可使用存儲(chǔ)區(qū)I、Q、M、L、D和PI,分配IB、IW、ID、DBB、DBW、DBD、DIB、DIW、DID、PIB、PIW、PID等形式的地址標(biāo)識(shí)符。
對(duì)于由傳送指令尋址的字節(jié)、字和雙字,可使用存儲(chǔ)區(qū)I、Q、M、L、DB、DI和PQ,分配IB、IW、ID、DBB、DBW、DBD、DIB、DIW、DID、PQB、PQW、PQD等形式的地址標(biāo)識(shí)符。
2. 方括號(hào)"[ ]"中的內(nèi)容包括地址寄存器引用(AR1或AR2)、逗號(hào)分隔符","以及雙字指針。
雙字指針 - 指包含位、字節(jié)、字或雙字的部分地址的雙字。雙字指針的格式為:P#字節(jié).位。
注意請(qǐng)記住您現(xiàn)在使用的是兩個(gè)格式為"P#字節(jié).位"的指針。一個(gè)指針已被精確表示出來(lái)。另一個(gè)指針通過(guò)對(duì)地址寄存器AR1或AR2的引用來(lái)確定。如果要尋址字節(jié)、字或雙字,請(qǐng)確保指針的位號(hào)為0。使用寄存器間接尋址的語(yǔ)句不更改地址寄存器的內(nèi)容。
指針實(shí)例:
L P#8.7 //將指針值載入ACCU 1。LAR1 ??//用ACCU 1中的指針裝載AR1。A I [AR1, P#0.0]?//檢查輸入位I 8.7并將有符號(hào)的狀態(tài)分配給Q 10.0。= Q [AR1, P#1.1]?//確切地址8.7在AR1中。偏移量不對(duì)其產(chǎn)生影響。確切位置10.0由8.7 (AR1)加上1.1 (偏移量)得出,結(jié)果是10.0而不是9.8。
區(qū)域內(nèi)寄存器間接尋址實(shí)例:
A ?? I [AR1,P#4.3] ?對(duì)其位置是由AR1中的內(nèi)容加上4個(gè)字節(jié),再加上3個(gè)位計(jì)算得出的輸入位,執(zhí)行邏輯與運(yùn)算。=??? DIX [AR2, P#0.0]?將RLO位狀態(tài)分配給位于AR2中的實(shí)例數(shù)據(jù)位。L ?? IB [AR1, P#10.0]?將輸入字節(jié)載入ACCU 1中。地址由AR1的內(nèi)容加上十個(gè)字節(jié)計(jì)算得出。T ?? LD [AR2,P#53.0]?將ACCU 1中的內(nèi)容傳送到本地雙字中(該雙字的位置由AR2的內(nèi)容加上53個(gè)字節(jié)計(jì)算得出)。
區(qū)域內(nèi)寄存器間接尋址的特點(diǎn)是:地址標(biāo)示符在方括號(hào)前確定,方括號(hào)中的指針均為不含存儲(chǔ)區(qū)信息(如[AR1,P#4.3]中AR1=P#8.7,兩個(gè)指針都不含有存儲(chǔ)區(qū)信息),否則將會(huì)與方括號(hào)前的地址標(biāo)示符表示的存儲(chǔ)區(qū)沖突。
跨區(qū)域寄存器間接尋址:
使用跨區(qū)域寄存器間接尋址的程序語(yǔ)句包含一條指令和以下組成部分:地址標(biāo)識(shí)符[地址寄存器標(biāo)識(shí)符,地址]。
跨區(qū)域寄存器間接尋址使用以下兩部分地址:
1.?對(duì)已尋址的數(shù)據(jù)對(duì)象(地址標(biāo)識(shí)符)大小的規(guī)定數(shù)據(jù)對(duì)象大小規(guī)定????位(無(wú)規(guī)定表示是一個(gè)位)B???字節(jié)W???字D???雙字
2. 方括號(hào)"[ ]"中的內(nèi)容包括地址寄存器引用(AR1或AR2)、逗號(hào)分隔符","以及雙字指針。雙字指針?- 指包含位、字節(jié)、字或雙字的部分地址的雙字。指針具有以下區(qū)域內(nèi)格式:P#字節(jié).位。
注意事先必須已將跨區(qū)域雙字指針載入到由寄存器間接地址引用的地址寄存器中??鐓^(qū)域雙字指針 - 包含位的部分地址(對(duì)于位邏輯指令)或字節(jié)、字或雙字的部分地址(對(duì)于裝載和傳送指令)的雙字。地址前面的區(qū)域標(biāo)識(shí)符位于用來(lái)指定字節(jié)和位??鐓^(qū)域雙字指針格式為:P#區(qū)域標(biāo)識(shí)符字節(jié).位。
對(duì)于由位邏輯指令尋址的位,可以分配跨區(qū)域指針區(qū)域標(biāo)識(shí)符I、Q、M、DIX或DBX。
對(duì)于由裝載或傳送指令尋址的字節(jié)、字和雙字,可以分配跨區(qū)域指針區(qū)域標(biāo)識(shí)符I、Q、M、DIX、DBX或P。????注意要在指針中指定外設(shè)輸入或PI區(qū)域,請(qǐng)以P#Px.y形式輸入指針。區(qū)域被指定為P。在跨區(qū)域指針中不能使用外設(shè)輸出PQ區(qū)域。請(qǐng)記住您正使用兩個(gè)指針:
作為偏移量,直接在地址中表示的區(qū)域內(nèi)雙字指針,例如P#4.0。
存儲(chǔ)在地址寄存器(AR1或AR2)中的跨區(qū)域雙字指針,例如P#Q4.0。
如果要訪問(wèn)通過(guò)直接尋址方式進(jìn)行尋址的字節(jié)、字或雙字,請(qǐng)確保這兩個(gè)指針的位號(hào)均為0。使用寄存器間接尋址的語(yǔ)句不更改地址寄存器的內(nèi)容。
跨區(qū)域寄存器間接尋址的第一個(gè)實(shí)例:
L P# I8.7 //將指針值和區(qū)域標(biāo)識(shí)符載入ACCU 1。LAR1 ??//將存儲(chǔ)區(qū)I和地址8.7存入AR1。L P# Q8.7 //將指針偏移量和區(qū)域標(biāo)識(shí)符載入ACCU 1。LAR2 ?//將存儲(chǔ)區(qū)Q和地址8.7存入AR2。A [AR1, P#0.0]?//檢查輸入位I 8.7并將其信號(hào)狀態(tài)分配給輸出位Q 10.0。=?[AR2, P#1.1]?//偏移量0.0沒(méi)有任何作用。輸出位10.0由8.7 (AR2)加上1.1 (偏移量)得出,結(jié)果是10.0而不是9.8??鐓^(qū)域寄存器間接尋址的第二個(gè)實(shí)例:
A I 0.0 JC M002 L P#M10.0?//將指針值和區(qū)域標(biāo)識(shí)符載入ACCU 1。LAR1 ?//將存儲(chǔ)區(qū)M和地址10存入ACCU 1。JU M001 M002: L P#Q0.3 //將指針值和區(qū)域標(biāo)識(shí)符載入ACCU 1。LAR1 ?//將存儲(chǔ)區(qū)Q和地址0.3存入ACCU 1。M001:A I 0.4 =?[AR1, P#0.1]?//I 0.0用于控制哪個(gè)指針用于此語(yǔ)句。將I 0.4的信號(hào)狀態(tài)分配給存儲(chǔ)器位M 10.1,或者分配給輸出Q 0.4。
跨區(qū)域寄存器間接尋址實(shí)例A ?[AR1,P#4.3] 對(duì)于其位置是由AR1中的內(nèi)容加上4個(gè)字節(jié),再加上3個(gè)位計(jì)算得出的位,執(zhí)行邏輯與運(yùn)算。位的存儲(chǔ)區(qū)在AR1的位24、25和26中指出。= [AR2, P#0.0]?????將RLO位信號(hào)狀態(tài)分配給位于AR2中的位。位的存儲(chǔ)區(qū)在AR1的位24、25和26中指出。L B [AR1, P#10.0]??將字節(jié)(其位置由AR1的內(nèi)容加上10個(gè)字節(jié)計(jì)算得出)載入ACCU 1。位的存儲(chǔ)區(qū)在AR1的位24、25和26中指出。T D [AR2,P#53.0]???將ACCU 1的內(nèi)容傳送到雙字(該字的精確位置由AR2的內(nèi)容加上53個(gè)字節(jié)計(jì)算得出)。位的存儲(chǔ)區(qū)在AR1的位24、25和26中指出。
跨區(qū)域寄存器間接尋址的特點(diǎn)是:地址標(biāo)示符在方括號(hào)前確定,方括號(hào)中的地址寄存器中包含存儲(chǔ)區(qū)信息(如[AR1,P#4.3]中AR1=P#Q0.3)。
區(qū)域內(nèi)寄存器間接尋址和跨區(qū)域寄存器間接尋址的使用相當(dāng)靈活,可以根據(jù)需要選擇。由上面的說(shuō)明可知,區(qū)域內(nèi)寄存器間接尋址是針對(duì)存儲(chǔ)區(qū)固定的間接尋址方式,尋址的存儲(chǔ)區(qū)是確定的。而跨區(qū)域寄存器間接尋址則在指令中不確定存儲(chǔ)區(qū),存儲(chǔ)區(qū)由地址寄存器中存儲(chǔ)的指針中的信息確定,因而尋址的存儲(chǔ)區(qū)是可變的。
編輯:黃飛
?
評(píng)論
查看更多