西門子PLC間接尋址的學習總結

1.地址的概念:

完整的指令,包括 指令符+操作數,操作數是指令執行的目標,也就是指令要操作的地址。

操作數的地址包括兩個要素:一是存儲的區域,二是這個區域中具體的位置。

而西門子PLC中的存儲區包括:物理輸入輸出區P,映像輸入區I,映像輸出區Q,位存儲區M,定時器T,計數器C,數據區DB和L等。每個區域可以用位(BIT)、字節(BYTE)、字(WORD)、雙子(DWORD)來衡量,指定確切的大小。而其中定時器T和計數器C只能用位來衡量。

比如: A Q2.0,其中A就是指令符,Q是存儲區(映像輸出區),2.0就是指在該區第二個字節的第0位。

西門子PLC間接尋址的學習總結

2.尋址的概念:

尋址,就是指定指令要進行操作的地址。給定指令操作的地址方法就是尋址方法。


西門子PLC間接尋址的學習總結

2.1直接尋址

所謂直接尋址就是直接給出指令的確切操作數。

西門子PLC間接尋址的學習總結

使用符號尋址,首先要給絕對地址定義好符號名,使用符號尋址的好處就是使程序易懂,方便查找故障。

2.2間接尋址

間接尋址就是間接地給出指令的確切操作數。如 A Q[MD100]

西門子PLC間接尋址的學習總結

存儲器間接尋址:

存儲器間接尋址的地址給定格式是:地址標示符+指針。指針所指示存儲單元中所包含的數值,就是地址的確切數值單元。存儲器間接尋址具有兩個指針格式:單字和雙字。

如 A Q[MD100]和A Q[MW500] ,Q是區域標示符,MD100和MW500稱為指針pointer,它指向它們其中包含的數值,才是指令真正要執行的地址區域的確切位置。


西門子PLC間接尋址的學習總結

16位指針:16位地址指針用於定時器T、計數器C、程序塊(DB\FC\FB)的尋址,從0-15bit,被看做一個無符號整數(0-65535).格式如下:


西門子PLC間接尋址的學習總結

32位指針:32位地址指針用於 I、 Q、M、L數據塊等存儲器中位、字節、字及雙字的尋址。32位的地址指針可以使用一個雙字進行標示.第0位~第2位作為尋址操作的位地址;第3位~第18位作為尋址操作的字節地址;第19位~第31位沒有定義.其格式如下:


西門子PLC間接尋址的學習總結

存儲器32位指針僅用於內部區域尋址,尋址格式表示為:地址存儲器標識符[32位地址指針]

32位內部區域指針可用常數表示,表示為P#字節.位,如P#10.3為指向第10個字節第3位的指針常數。若把一個32位整型轉換為字節指針常數,從上述指針格式可以看出,應要把該數左移三位(或是乘以8)即可。

西門子PLC間接尋址的學習總結

單字指針與雙子指針的區別:

單字指針只應用在地址標示符是非位的情況下,它只能對T、C、DB、FC、FB進行尋址,用來代替這些存儲區域的編號。而雙子指針沒有這樣的限制,對於byte.bit這種具體位結構來將,只能用雙子指針。它不僅可以對位地址進行尋址,還可以對字節、字、雙字進行尋址。當然在對於非位進行尋址時,必須確保0-2bit位為0.

寄存器間接尋址:

對於西門子300PLC有兩個寄存器AR1和AR2,西門子400則有4個寄存器。

尋址的一般格式是:地址標識符[寄存器,P#Byte.bit] 如M[AR1,P#10.0]

西門子PLC間接尋址的學習總結

區域內寄存器間接尋址:

區域內寄存器間接尋址的指針格式同存儲器間接尋址的32位指針格式相同。第0位~第2位作為尋址操作的位地址;第3位~第18位作為尋址操作的字節地址;第19位~第31位沒有定義

西門子PLC間接尋址的學習總結

區域間寄存器間接尋址:

區域間寄存器間接尋址,也叫交叉區域寄存器間接尋址,交叉區域指針為32位,第0~18位與32位內部區域指針表示相同,第19~23位和第27~30位為定義,第31位為交叉區域指針尋址標示位,

第24~26位是存儲區域地址標示,8種組合表示8種存儲區域。

000 表示沒有地址存儲區 例如 P#12.0

001 表示輸入地址區 I 例如 P# I 12.0

010表示輸出地址區 Q例如 P# Q 12.0

011 表示標誌位地址區M 例如 P# M 12.0

100 表示數據塊(DB)中的數據 例如 P# DB1.DBX12.0

101 表示數據塊(DI)中的數據 例如 P# DI1.DBX12.0

110 表示區域地址區 L 例如 P# L 12.0

111表示調用程序快的區域地址區V 例如 P# V 12.0


西門子PLC間接尋址的學習總結

例:L W[AR1,P#2.0],要尋址的地址區域和和確切的地址數值單元都未確定,只是確定了存儲大小,這就意味著我們可以在不同的區域間的不同的地址數值單元以給定的區域大小進行尋址。其中 [AR1,P#2.0]就叫做區域間尋址指針。

區域間尋址的AR格式表示 1000 0YYY 0000 0BBB BBBB BBBB BBBB BXXX 這裡的第31位被固定為1,也是與區域內部尋址的區別。用HEX表示的話就是:

對P區尋址時 AR=800XXXXX

對I區尋址時 AR=810XXXXX

對Q區尋址時 AR=820XXXXX

對M區尋址時 AR=830XXXXX

對DB區尋址時 AR=840XXXXX

對DI區尋址時 AR=850XXXXX

對L區尋址時 AR=860XXXXX

對V區尋址時 AR=870XXXXX

綜上可知,如果AR中的內容是以8開頭,那麼就一定是區域間尋址,如果是在DB區域尋址,只需在8的後面跟上40. 如84000000-840FFFFF就指明瞭要尋址的範圍是DB區的0.0-65535.7

例如 AR=840000D4HEX=1000 0100 0000 0000 0000 0000 1101 0100 實際上就是dbx26.4

寄存器尋址指針[ARx,P# Byte.bit]中P# Byte.bit又是什麼意思呢?

P#中的P是pointer,是一個32位的直接指針。所謂的直接就是指#後面所跟的數值或存儲單元由P可以直接給定,就可被用來在指令尋址中作為一個 常數 來對待,可以包含或不包含存儲區域。

例如 L P#Q1.0 就是把Q1.0這個指針存入ACC1中,那麼ACC1的內容=82000008hex

L P#1.0 就是把1.0這個指針存入ACC1中,那麼ACC1的內容=00000008

L P#MB100此表示錯誤,必須按照Byte.bit的結構給定指針。

L P#DB100.DBX26.4 表示錯誤,DBX已經說明了存儲區,不能重複指定。

在寄存器尋址中,P#xxx作為寄存器AR指針的偏移量,用來和AR指針進行相加運算,運算的結果才是指令真正要操作的地址數值單元。

指針偏移運算方法:

AR和P#中的數值,按照BYTE和bit位分類相加。Bit位相加按照八進制規則運算,而BYTE位相加按照十進制規則進行運算。

AR內的地址數據賦值:

要正確運用寄存器尋址,最重要的就是對寄存器AR進行賦值,區分區域內還是區域間尋址,還是看AR內的賦值。

1.直接賦值: L DW#16#83000320

L AR1

可以用16進制、整數、二進制進行賦值,但必須確保是32位數據。經過賦值的AR1中即存儲了地址數值,也指定了存儲區域。

2.間接賦值: L [MD100]

L AR1

可以用存儲器間接尋址指針來給定AR1的內容,具體內容存儲在MD100中。

3.指針賦值: L AR1 P#26.2

使用間接尋址的主要目的,是使指令的執行結果有動態的變化,簡化程序是第一目的。在某些情況下這種尋址方式是必須的,此外間接尋址,可以使程序標準化,更具有柔性。

實例:將DB100.DBW1中的內容傳送到MW1中

一般我們會使用MOVE指令即可,若使用前面所學的存儲器間接尋址方法編寫程序,首先我們要用單字指針制定DB的編號,然後再用一個雙字指針指定DBW和MW存儲區地址

L 100

T MW 100 將16位整數100傳給MW100,來指定DB的編號。

L DW#16#8 雙字16進制數8,用作雙字指針,即8H=1000B=1.0

T MD 2

OPN DB [MW 100]

L DBW [MD 2]

T MW [MD 2]

A DBX [MD 2]

O M [MD 2]

如果要對同樣的數據塊的多個字進行傳送,使用間接尋址是很方便編程的,我們只需改變MW100和MD2的賦值就可以實現。

實例:將DB100中的數據字1-11傳送到MW1-11

我們要理解一個概念:MW10=MB10+MB11

主題程序不作任何變動,而尋址指針是這個程序中唯一要修改的地方。尋址指針是主體程序入口的參數,就好比功能塊的輸入參數,從而是程序看上去標準化,通用化。

要將‘DB100中的數據字1-11傳送到MW1-11’實現這一功能,我們只需將指針內容逐一指向相應的數據字,這種對指針動態的修改,其實就是遍歷。對於遍歷,最近單的就是循環。

一個循環包括幾個要素:

1. 初始循環指針

2. 循環指針自加減

3. 繼續或退出循環體的條件判斷

此處不再舉例!下次講解複雜數據類型及在FC/FB塊裡針參數的應用。


分享到:


相關文章: