在非優化塊中,ARRAY 變量不得在字限值處開始。即,在偶數地址的字節處開始。ARRAY 變量將使用該存儲空間,直到下一個字限值處。
在優化塊中,ARRAY 所需的空間與結構中最寬元素所需的空間相同。例如,ARRAY of BYTE 位于一個字節的限值處,而 ARRAY of LREAL 則位于一個 8 字節的限值處。
一維數組中 ARRAY 變量的結構:
數據類型為 BOOL 的元素從最低有效位處開始。數據類型為 BYTE 和 CHAR 的元素從右側字節處開始。各元素按順序排列。
多維數組中 ARRAY 變量的結構:
在多維數組中,各元素從第一個維度開始,逐行(逐維)存儲。在位和字節元素中,新維度通常從下一個字節處開始。在其它數據類型的元素中,新維度通常從在非優化塊中的下一個字(下一個偶數字節)開始。
在優化塊中,每個維度所需的空間大小與第一維度的相同。
尋址 ARRAY 元素
ARRAY 元素是使用固定可變下標進行尋址。ARRAY 變量的元素的處理方式與相同數據類型的變量相同。
元素的下標在方括號中指定。該下標包含 ARRAY 各維度的一個整數值(固定下標)或一個變量(可變下標)。
使用固定下標尋址 ARRAY 元素
使用固定下標尋址 ARRAY 元素的具體方式如下所示:
使用可變下標尋址 ARRAY 元素 也通過一個變量對 ARRAY 元素進行尋址,變量的值僅在運行過程計算。該變量可以是采用絕對地址或符號地址尋址的整型數據類型的全局或局部變量。這種尋址方式也支持多維 ARRAY 和子數組尋址方式。(<數組名>[i, j, k...]) 被調用塊中的變量發生更改時,不會影響 in/out 參數處作為實參創建并使用可變下標尋址的 ARRAY 元素。該值將寫回與讀取時相同的 ARRAY 元素中,并在調用過程中進行傳遞。 使用下標變量尋址 ARRAY 元素,如下所示: ? 傳遞 ARRAY 數據類型的變量 如果 ARRAY 中各元素的數據類型與形參的數據類型相同,則可將其作為實參進行傳遞 ARRAY 數據類型的變量可作為參數進行傳遞。如果塊中的輸入參數為 ARRAY 數據類型,則傳遞 ARRAY 時的結構必須與實參的相同。即,數據類型、維數和域元素的個數都必須相同。 如果 ARRAY 的結構完全相同,則可相互分配。即,數據類型、維數和數組元素的個數都必須相同。ARRAY 的名稱不必相同。
傳遞 ARRAY [*] 數據類型的變量
ARRAY[*] 可用于聲明函數或函數塊參數中限值可變的 ARRAY。創建塊時,可定義 ARRAY 的限值。之后,在運行過程中調用該數組后之后將對該限值進行傳遞。
下圖顯示了使用 ARRAY[*] 數據類型輸入參數的兩次塊調用。在這兩次調用中,傳遞的 ARRAY 長度不同。
傳遞靈活限值 ARRAY 時的應用規則 在本示例中,將創建函數“BlockWithArrayStarIn_FC”,從而可在后期進行調用: 如果維數與數據類型都匹配,則可將 ARRAY[*] 指定給 ARRAY[*]。但在此過程中,不能傳遞單個 ARRAY 元素:
聲明函數塊“BlockCaller_FB”,并調用函數“BlockWithArrayStarIn_FC”:
如果維數與數據類型匹配,則可將已知限值的 ARRAY 指定給 ARRAY[*]。在此過程中,也可指定單個的 ARRAY 元素。
聲明函數塊“BlockCallerFixLimits_FB”,并調用函數“BlockWithArrayStarIn_FC”兩次:
可將 ARRAY[*] 指定給 VARIANT。在此過程中,也可指定單個的 ARRAY 元素。 ? 多維數組的尋址示例:
說明
ARRAY 數據類型的變量最多支持 6 維。該規則與一維數組的規則相同。數組維數將寫入聲明中的方括號內,并使用逗號進行分隔。在多維數組中,各元素從第一維度開始存儲。
下表列出了二維 ARRAY 數據類型的變量聲明:
名稱 | 數據類型 | 值 | 注釋 |
---|---|---|---|
Betr_Temp | ARRAY[1..2, 1..3] of INT | 1,1,4(0) | 數據類型為 ARRAY 的二維變量包含有 6 個元素。前兩個元素的值為“1”,其余四個元素的值為“0”。 |
下圖顯示了聲明為 ARRAY 數據類型的變量結構:
訪問元素
通過下標,可訪問各元素的值。可使用常量或變量作為下標。例如,第一個元素的下標為 [1,1],第四個數組元素的下標為 [2,1]。例如,訪問第四個元素的值時,需要在程序中聲明“Station[2,1]”。
通過 ARRAY[*] 計算兩個矢量標積的示例 明 標積是為兩個矢量進行賦值的一種數學運算(標量)。 兩個矢量的標積將得到一個標量變量,且定義如下: 這里,∝ 是矢量 和 之間的角度。
標積的計算示例:
在本示例中,結果為數字 22。
在以下編程示例中,可確定如何使用 ARRAY[*] 以及 ARRAY 的靈活邊界值計算兩個矢量的標積。此處,函數“ScalarProduct_FC”將用作具體標積的計算模板。
在該編程示例中,需要具有以下對象:
兩個數據塊和和一個 PLC 數據類型 (UDT),用于管理矢量數據。
函數,包含計算標積的程序代碼。
指令“LOWER_BOUND”和“UPPER_BOUND”,用于讀取 ARRAY 的邊界。
組織塊,用于計算標積
操作步驟
在本示例中,使用了多個矢量(即,1 維數組)。當然,其它計算(如,矩陣乘法)可使用多維數組。
要計算標積,請執行以下操作步驟:
創建 PLC 數據類型 (UDT)“VectorArrays_UDT”: 兩個數組“VectorD5Coordinates”和“VectorE13Coordinates”提供計算標積所需的數據。 基于PLC 數據類型“VectorArrays_UDT”PLC 數據類型創建數據塊“VectorArrays1_DB”: 創建第二個“VectorArrays2_DB”數據塊。除“VectorArrays_UDT”PLC 數據類型的矢量外,該數據塊中還包含兩個其它矢量: 現已創建了計算標積所需的數據。 創建函數“ScalarProduct_FC”,作為創建計算標積時計算操作步驟的模板: 塊接口: 程序代碼: 在第 1 到 4 行中,查詢矢量 1 和矢量 2 的 ARRAY 上/下邊界。之后,即可確定兩個矢量 ARRAY 的關聯數。由于僅當待相乘的兩個矢量關聯數相等時,才能建立標積,因此需使用第 6 行到第 9 行。 如果 ARRAY 的上/下邊界不同,則函數“ScalarProduct_FC”將生成函數值“-1”并退出程序塊 (RETURN)。 如果 ARRAY 的上/下邊界相同,則變量 #Sum 將初始化為值“0”(第 10 行),并執行標積計算操作(第 11 到 13 行)。 使用事件類“Program cycle”,創建“Main_OB”組織塊。在第 4 步中創建的函數“ScalarProduct_FC”將作為標積計算“Main_OB”中的模板: 塊接口: 程序代碼: |
? ? ?
創建函數“BlockWithVariantIn_FC”,從而可在后期調用:
聲明函數“BlockWithArrayStarInVariant_FC”,并調用函數“BlockWithVariantIn_FC”:
審核編輯:湯梓紅
-
西門子
+關注
關注
94文章
3039瀏覽量
115881 -
存儲
+關注
關注
13文章
4314瀏覽量
85851 -
變量
+關注
關注
0文章
613瀏覽量
28371
原文標題:西門子博途 :ARRAY 變量的結構
文章出處:【微信號:gh_a8b121171b08,微信公眾號:機器人及PLC自動化應用】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論