選單

博圖學習---間接定址(2)___PEEK&POKE &陣列指標

3、PEEK和POKE指令

原來學習過PEEK和POKE指令,是當時使用的時候學的,這次看西門子 資料,又看到這兩個指令的資料,再次學習下。

博圖學習---間接定址(2)___PEEK&POKE &陣列指標

在SCL語言所程式設計的子程式內,為了實現對資料的間接定址,可以利用PEEK讀取和POKE寫入指令完成。

1)PEEK指令用於資料的讀取過程,POKE指令用於資料的寫入過程。根據定址資料寬度的不同,需要選擇想對應的PEEK和POKE指令。

如果定址的資料寬度為位寬度,需要選擇PEEK_BOOL和POKE_BOOL指令,如果定址的資料寬度為位元組,字,雙字寬度,需要選擇PEEK和POKE指令。

Peek_BOOL讀取儲存位,用於在不指定資料型別的情況下從標準儲存區讀取儲存位:

透過AREA和DBNUMBER指定定址資料的區域標識和資料塊編號;

透過BYTEOFFSET和BITOFFSET指定定址資料的位元組地址和位地址,這兩個變數就是作為間接定址過程中的指標進行使用,其資料型別分別為雙整型和整形;

在執行過程中,透過對指標變數賦值及變動,就可以實現間接讀取儲存位的定址過程。

PEEK讀取儲存地址,在不指定資料型別的情況下,從儲存區讀取儲存地址。使用方法與PEEK_BOOL指令基本相同,只需使用一個雙整型的指標變數指定定址的位元組地址BYTEOFFSET。

2)POKE指令

POKE指令用於資料的寫入過程,使用方式與PEEK指令基本相同。

博圖學習---間接定址(2)___PEEK&POKE &陣列指標

在使用POKE指令時,如果定址的資料寬度為大於4個位元組,則需要選擇POKE_BLK指令。在指令中,分別透過指標變數指定源端和目的端資料的位元組地址,然後指定讀寫的資料長度,即可實現將一個儲存區域內的資料寫入到不同的標準儲存區域內。

博圖學習---間接定址(2)___PEEK&POKE &陣列指標

博圖學習---間接定址(2)___PEEK&POKE &陣列指標

三、陣列指標及限值可變陣列(學得很吃力)

1、陣列指標

ARRAY 資料型別的變量表示一個由多個數目固定且資料型別相同元素組成的資料結構。這些元素可使用除 ARRAY 之外的所有資料型別。

建立 ARRAY 變數時,將在方括號內定義小標的限值,並在關鍵字“of”之後定義資料型別。ARRAY 限值可使用整數或全域性/區域性常量定義的固定值,也可定義為塊的形參,或使用 ARRAY[*] 進行定義。下限值必須小於或等於上限值。一個 ARRAY 最多可包含六個維度,各維度的限值使用逗號進行分隔。

例如,ARRAY 資料型別的一維變數的結構具有以下形式:

博圖學習---間接定址(2)___PEEK&POKE &陣列指標

ARRAY 的最大限值取決於以下因素:

ARRAY 元素的資料型別

儲存區預留(僅適用於最佳化訪問的塊中)

更多資訊,請參見“無需重新初始化進行塊擴充套件載入的基本資訊”。

資料塊的最大大小

CPU 的最大儲存空間(更多資訊,請參見裝置手冊)

S71500 中,對於塊屬性為“最佳化塊訪問”的塊,BOOL 資料型別的一個元素需要佔用 1 個位元組的儲存空間。ARRAY of <資料型別> 時,也同樣如此。例如,在最佳化程式塊中的 ARRAY [0。。1] of BOOL 需要佔用 2 個位元組。

博圖學習---間接定址(2)___PEEK&POKE &陣列指標

如果定址的資料儲存在陣列中,也可以利用陣列指標對陣列元素進行間接訪問。

陣列指標為最大寬度32位的整數變數,變數的值僅在執行過程中計算,透過對陣列指標進行變數賦值和變動,就可以靈活地對陣列元素進行定址。該變數可以採用絕對地址或符號地址定址的整型資料型別的全域性或區域性變數。這種定址方式也支援多維ARRAY和子陣列定址方式(<陣列名>[i,j,k。。。])。

博圖學習---間接定址(2)___PEEK&POKE &陣列指標

ARRAY資料型別的變數可作為引數進行傳遞。如果塊中的輸入引數為ARRAY資料型別,則傳遞ARRAY時的結構必須與實參的相同。即資料型別,維數和域元素的個數都必須完全相同。ARRAY的名稱不必相同。

在ARRAY作為引數型別的訪問過程中,同樣可以利用陣列指標對陣列型別的引數進行訪問,其使用方法與訪問全域性資料區中的陣列相同。

2、限制可變陣列ARRAY【*】

1)Array【*】的宣告

可變 ARRAY 限值 ARRAY[*](僅適用於最佳化訪問塊中)

在向被調程式塊傳遞陣列型別的實參時,如果陣列的長度需要隨應用例項進行變化,則無法聲明確定的ARRAY資料型別引數。可以使用限制可變陣列引數資料型別實現。

博圖學習---間接定址(2)___PEEK&POKE &陣列指標

ARRAY【*】可用於宣告函式或函式塊引數中限制可變的ARRAY。而後,在執行過程中呼叫該陣列後透過指令將對該限值進行計算。限值可變陣列屬於一種特殊的引數資料型別,在宣告FC塊的IN,OUT,IN/OUT引數以及FB塊的IN/OUT引數時,可以將引數的資料型別宣告為限值可變陣列型別。

記住,此型別只適應於FC塊的IN,OUT,IN/OUT引數以及FB塊的IN/OUT引數。

在為引數賦值實參的過程中,只要確保實引數組元素的資料型別與限值可變陣列元素的資料型別相同,就可以向被調程式塊傳遞陣列型別實參。進一步,在被調程式塊內部,可以結合陣列指標,對實引數組元素進行訪問。

2)限值可變陣列ARRAY【*】專有指令

博圖學習---間接定址(2)___PEEK&POKE &陣列指標

SCL編輯器為限值可變陣列提供了兩個專用的指令:

LOWER_BOUND讀取ARRAY的下限:讀取陣列索引範圍的下限值;

UPPER_BOUND讀取ARRAY的上限:讀取陣列索引範圍的上限值;

這兩個專用指令可用於韌體版本為V4。2及以上版本的S71200系列的CPU和韌體版本為V2。0及以上版本的S&1500系列CPU。

這樣,就可以在程式中使用可變陣列之前確定陣列中元素的數量。比如在與FOR迴圈語句結合使用時,可以明確迴圈次數。

3)ARRAY 訪問的錯誤處理

在執行時訪問超出所宣告 ARRAY 限值的元素時,將導致訪問錯誤。不同 CPU 系列對超出 ARRAY 限值的反應各不相同:

S7-300/400

CPU 切換為“STOP”模式。

為此,可以編寫程式執行錯誤 OB (OB 85) 防止這一狀況。

在 SCL 中,還可以啟用塊屬性中的“檢查 ARRAY 限值”(Check ARRAY limits) 屬性。這將導致在發生 ARRAY 訪問錯誤時將使能輸出 ENO 設定為 FALSE。

S7-1200

CPU 將生成診斷緩衝條目,並保持為“RUN”模式。

S7-1500

CPU 切換為“STOP”模式。

為此,可以編寫程式錯誤 OB (OB 121) 防止這一狀況。

也可以透過指令“GET_ERROR:獲取本地錯誤資訊”或“GET_ERROR_ID:獲取本地錯誤 ID”編寫本地錯誤處理方式。

4、官方例子

透過 ARRAY[*] 計算兩個向量標積的示例

說明

標積是為兩個向量進行賦值的一種數學運算(標量)。

兩個向量的標積將得到一個標量變數,且定義如下:

博圖學習---間接定址(2)___PEEK&POKE &陣列指標

這裡,∝ 是兩個向量之間的角度。

標積的計算示例:

博圖學習---間接定址(2)___PEEK&POKE &陣列指標

在該程式設計示例中,需要具有以下物件:

兩個資料塊和一個 PLC 資料型別 (UDT),用於管理向量資料。

函式,包含計算標積的程式程式碼。

指令“LOWER_BOUND”和“UPPER_BOUND”,用於讀取 ARRAY 的邊界。

組織塊,用於計算標積

博圖學習---間接定址(2)___PEEK&POKE &陣列指標

博圖學習---間接定址(2)___PEEK&POKE &陣列指標

博圖學習---間接定址(2)___PEEK&POKE &陣列指標

博圖學習---間接定址(2)___PEEK&POKE &陣列指標

博圖學習---間接定址(2)___PEEK&POKE &陣列指標

博圖學習---間接定址(2)___PEEK&POKE &陣列指標

博圖學習---間接定址(2)___PEEK&POKE &陣列指標