西門子STL間接尋址常 問(wèn)問(wèn)題集
1.1如何獲得指針或者間接尋址有關(guān)的信息?
指針的類型包括16位指針、32位指針、Pointer(6Byte)和Any(10Byte)。16位指針用于定時(shí)器、計(jì)數(shù)器、程序塊的尋址;32位指針用于I/Q/M/L/數(shù)據(jù)塊等存儲(chǔ)器中位、字節(jié)、字以及雙字的尋址,其中第0~2位表示位地址(0~7)、第3~18位為字節(jié)地址,其余位未定義;Pointer和Any一般應(yīng)用在復(fù)雜數(shù)據(jù)類型(比如Date_and_Time /Array/bbbbbb等)在FB、FC之間的傳遞。而Any可以看做是對(duì)Pointer的延伸,因?yàn)橛?0Byte組成的Any中Byte4~Byte9就是一個(gè)Pointer。
了解指針的格式十分重要,為正確使用指針,應(yīng)閱讀如下內(nèi)容:
1、 "SIMATIC Programming with STEP 7 V5.5" 05/2010 第27.3.4章 參數(shù)類型
2、文檔:1008用于S7-300 和S7-400 的語(yǔ)句表(STL)編程
3、文檔:F0215,S7-300和S7-400尋址 1.2為什么語(yǔ)句 LAR1 P##Pointerbbbbb 在一個(gè)函數(shù)(FC)中是無(wú)效的,然而,同樣的語(yǔ)句在一個(gè)功能塊(FB)中是有效的?
在FC被調(diào)用時(shí),復(fù)雜數(shù)據(jù)類型例如指針是被復(fù)制到調(diào)用者的臨時(shí)變量區(qū)中,在FC內(nèi)部對(duì)此V區(qū)地址直接取址放入到地址寄存器AR1或AR2是不被編譯器規(guī)則接受的(導(dǎo)致MC7寄存器信息過(guò)長(zhǎng)),也就是說(shuō)在FC內(nèi)部通過(guò)P#進(jìn)行地址寄存器取址僅能支持Temp臨時(shí)變量。因此如果需要在FC中操作指針等復(fù)雜輸入輸出變量地址需要使用累加器進(jìn)行中轉(zhuǎn)。
考慮到程序的一致性、遵守編譯器規(guī)則和STL手冊(cè)中LAR1指令說(shuō)明,建議用戶使用如下指令操作:
L P##Pointerbbbbb
LAR1 1.3 STEP 7 中哪些操作會(huì)覆蓋DB/DI寄存器或者地址寄存器AR1/AR2的內(nèi)容?
下面說(shuō)明了可能引起DB/DI寄存器或者地址寄存器AR1/AR2內(nèi)容改變的一些操作:
可以用下面的方法處理:
TAR2 (得到多重背景FB在背景DB里的偏移地址)
AD DW#16#00FFFFFF (屏蔽掉存儲(chǔ)區(qū)ID,可參考32位指針格式)
L P##Variable (得到變量在多重背景FB里的地址)
+D (多重背景FB的偏移地址與變量在多重背景FB里地址相加,即得到實(shí)際絕對(duì)偏移量)
LAR1
上述語(yǔ)句就是就得到了變量在背景DB中的絕對(duì)偏移量,從而供后續(xù)程序處理。 1.5如何在程序中使用ANY 型指針? 簡(jiǎn)要說(shuō)明如下:
L P##bbbbb //指向存儲(chǔ)地址指針bbbbb首地址
//這個(gè)參數(shù)是一個(gè)Any類型,P##bbbbb指向參數(shù)bbbbb的值所在地址,這就是指針的指針
LAR1 //裝載到地址寄存器AR1中。
L W [AR1,P#4.0] //打開DB塊
// 由Any類型結(jié)構(gòu)知道Any類型的Byte4、Byte5存放的數(shù)據(jù)塊號(hào)
T #BLOCK_NO
OPN DB [#BLOCK_NO] //如果是DB塊,打開指定的DB塊。
L W [AR1,P#2.0] //判斷ANY指針中數(shù)據(jù)長(zhǎng)度
// Any類型的Byte2、Byte3是重復(fù)系數(shù),如P#DB1.DBX0.0 Byte 8后面的Byte 8
_001:T #DATA_LEN //通常此處做loop循環(huán)!!
L D [AR1,P#6.0] //找出需要計(jì)算數(shù)據(jù)區(qū)的開始地址
// Any類型Byte6~Byte9是32位區(qū)域地址
指針的類型包括16位指針、32位指針、Pointer(6Byte)和Any(10Byte)。16位指針用于定時(shí)器、計(jì)數(shù)器、程序塊的尋址;32位指針用于I/Q/M/L/數(shù)據(jù)塊等存儲(chǔ)器中位、字節(jié)、字以及雙字的尋址,其中第0~2位表示位地址(0~7)、第3~18位為字節(jié)地址,其余位未定義;Pointer和Any一般應(yīng)用在復(fù)雜數(shù)據(jù)類型(比如Date_and_Time /Array/bbbbbb等)在FB、FC之間的傳遞。而Any可以看做是對(duì)Pointer的延伸,因?yàn)橛?0Byte組成的Any中Byte4~Byte9就是一個(gè)Pointer。
了解指針的格式十分重要,為正確使用指針,應(yīng)閱讀如下內(nèi)容:
1、 "SIMATIC Programming with STEP 7 V5.5" 05/2010 第27.3.4章 參數(shù)類型
2、文檔:1008用于S7-300 和S7-400 的語(yǔ)句表(STL)編程
3、文檔:F0215,S7-300和S7-400尋址 1.2為什么語(yǔ)句 LAR1 P##Pointerbbbbb 在一個(gè)函數(shù)(FC)中是無(wú)效的,然而,同樣的語(yǔ)句在一個(gè)功能塊(FB)中是有效的?
在FC被調(diào)用時(shí),復(fù)雜數(shù)據(jù)類型例如指針是被復(fù)制到調(diào)用者的臨時(shí)變量區(qū)中,在FC內(nèi)部對(duì)此V區(qū)地址直接取址放入到地址寄存器AR1或AR2是不被編譯器規(guī)則接受的(導(dǎo)致MC7寄存器信息過(guò)長(zhǎng)),也就是說(shuō)在FC內(nèi)部通過(guò)P#進(jìn)行地址寄存器取址僅能支持Temp臨時(shí)變量。因此如果需要在FC中操作指針等復(fù)雜輸入輸出變量地址需要使用累加器進(jìn)行中轉(zhuǎn)。
考慮到程序的一致性、遵守編譯器規(guī)則和STL手冊(cè)中LAR1指令說(shuō)明,建議用戶使用如下指令操作:
L P##Pointerbbbbb
LAR1 1.3 STEP 7 中哪些操作會(huì)覆蓋DB/DI寄存器或者地址寄存器AR1/AR2的內(nèi)容?
下面說(shuō)明了可能引起DB/DI寄存器或者地址寄存器AR1/AR2內(nèi)容改變的一些操作:
- DB寄存器和AR1受到影響的操作
1. 使用完整的DB路徑(如L DB20.Val)或者調(diào)用FC/FB時(shí)使用DB塊完整地址作為其參數(shù),則DB寄存器內(nèi)容被覆蓋。
例如在OB1中調(diào)用FC1后,DB寄存器變成20。
OPN DB1
Call FC1
bbbbb(bit):DB20.DBX0.2
因此在編程的時(shí)候,OPN 指令打開數(shù)據(jù)塊,通過(guò)DBX x.y的方式訪問(wèn)其中內(nèi)容, 但是如果在打開數(shù)據(jù)塊后DB寄存器的內(nèi)容被修改了,則DBX x.y的方式訪問(wèn)變量則 會(huì)訪問(wèn)到錯(cuò)誤的地址??梢酝ㄟ^(guò)使用符號(hào)尋址的方式或者使用完整路徑編程避免,當(dāng) 然重新使用 OPN指令也是可以的。
2. 調(diào)用FC時(shí)使用bbbbbb, array, structure ,UDT作為其形參或者調(diào)用FB時(shí)使用bbbbbb, array, structure 或者UDT作為其in out形參,在FC/FB程序中訪問(wèn)這些地址則AR1寄存器內(nèi)容被覆蓋,因此當(dāng)使用AR1進(jìn)行間接尋址時(shí)需要注意AR1內(nèi)容的正確性。 - AR2地址寄存器和DI寄存器在FB中作為參數(shù)和靜態(tài)變量的基址尋址使用。AR2和DI如果被修改,會(huì)影響FB的參數(shù)訪問(wèn),如果希望在FB中使用DI寄存器或者地址寄存器AR2,必須預(yù)先保存它們中的內(nèi)容,并在使用后恢復(fù)它們,例如:
TAR2 #AR2_SAVE; //AR2寄存器狀態(tài)保存到#AR2_SAVE
L DINO;
T #DB2_SAVE; //DI寄存器狀態(tài)保存到#DB2_SAVE
LAR2 #AR2_SAVE; //AR2寄存器恢復(fù)到使用前狀態(tài)1.4 如何得到多重背景FB中的變量在背景DB里的絕對(duì)偏移量呢?
OPN DI [#DB2_SAVE]; //DI寄存器恢復(fù)到使用前狀態(tài)
可以用下面的方法處理:
TAR2 (得到多重背景FB在背景DB里的偏移地址)
AD DW#16#00FFFFFF (屏蔽掉存儲(chǔ)區(qū)ID,可參考32位指針格式)
L P##Variable (得到變量在多重背景FB里的地址)
+D (多重背景FB的偏移地址與變量在多重背景FB里地址相加,即得到實(shí)際絕對(duì)偏移量)
LAR1
上述語(yǔ)句就是就得到了變量在背景DB中的絕對(duì)偏移量,從而供后續(xù)程序處理。 1.5如何在程序中使用ANY 型指針? 簡(jiǎn)要說(shuō)明如下:
L P##bbbbb //指向存儲(chǔ)地址指針bbbbb首地址
//這個(gè)參數(shù)是一個(gè)Any類型,P##bbbbb指向參數(shù)bbbbb的值所在地址,這就是指針的指針
LAR1 //裝載到地址寄存器AR1中。
L W [AR1,P#4.0] //打開DB塊
// 由Any類型結(jié)構(gòu)知道Any類型的Byte4、Byte5存放的數(shù)據(jù)塊號(hào)
T #BLOCK_NO
OPN DB [#BLOCK_NO] //如果是DB塊,打開指定的DB塊。
L W [AR1,P#2.0] //判斷ANY指針中數(shù)據(jù)長(zhǎng)度
// Any類型的Byte2、Byte3是重復(fù)系數(shù),如P#DB1.DBX0.0 Byte 8后面的Byte 8
_001:T #DATA_LEN //通常此處做loop循環(huán)!!
L D [AR1,P#6.0] //找出需要計(jì)算數(shù)據(jù)區(qū)的開始地址
// Any類型Byte6~Byte9是32位區(qū)域地址
本文標(biāo)簽:西門子STL間接尋址常 問(wèn)問(wèn)題集
* 由于無(wú)法獲得聯(lián)系方式等原因,本網(wǎng)使用的文字及圖片的作品報(bào)酬未能及時(shí)支付,在此深表歉意,請(qǐng)《西門子STL間接尋址常 問(wèn)問(wèn)題集》相關(guān)權(quán)利人與機(jī)電之家網(wǎng)取得聯(lián)系。
關(guān)于“西門子STL間接尋址常 問(wèn)問(wèn)題集”的更多資訊
個(gè)人求購(gòu)
鄔經(jīng)理 【求購(gòu)】 LED分析... 2026-4-10
李先生 【求購(gòu)】 綜合微機(jī)保... 2026-4-10
王坤 【求購(gòu)】 石英碎片 2026-4-9
陳經(jīng)理 【求購(gòu)】 攪拌設(shè)備的... 2026-4-9
周經(jīng)理 【求購(gòu)】 遠(yuǎn)大流量計(jì) 2026-4-9
蔡經(jīng)理 【求購(gòu)】 歐姆龍傳感... 2026-4-8
呂經(jīng)理 【求購(gòu)】 二手伺服變... 2026-4-8
曾經(jīng)理 【求購(gòu)】 金龍羽電線 2026-4-8
李先生 【求購(gòu)】 綜合微機(jī)保... 2026-4-10
王坤 【求購(gòu)】 石英碎片 2026-4-9
陳經(jīng)理 【求購(gòu)】 攪拌設(shè)備的... 2026-4-9
周經(jīng)理 【求購(gòu)】 遠(yuǎn)大流量計(jì) 2026-4-9
蔡經(jīng)理 【求購(gòu)】 歐姆龍傳感... 2026-4-8
呂經(jīng)理 【求購(gòu)】 二手伺服變... 2026-4-8
曾經(jīng)理 【求購(gòu)】 金龍羽電線 2026-4-8










