說明
VARIANT 數據類型的參數是一個指針或引用,可指向各種不同數據類型的變量。VARIANT 指針無法指向實例,因此不能指向多重實例或多重實例的 ARRAY。VARIANT 指針可以是基本數據類型(例如,INT 或 REAL)的對象。還可以是 STRING、DTL、STRUCT 類型的 ARRAY、UDT、UDT 類型的 ARRAY。VARIANT 指針可以識別結構,并指向各個結構元素。VARIANT 數據類型的操作數不占用背景數據塊或工作存儲器中的空間。但是,將占用 CPU 上的存儲空間。
VARIANT 類型的變量不是一個對象,而是對另一個對象的引用。在函數的塊接口中的 VAR_IN、VAR_IN_OUT 和 VAR_TEMP 部分中,VARIANT 類型的單個元素只能聲明為形參。因此,不能在數據塊或函數塊的塊接口靜態部分中聲明,例如,因為各元素的大小未知。所引用對象的大小可以更改。
使用 VARIANT 數據類型時,可為各種數據類型創建通用的標準函數塊 (FB) 或函數 (FC)。為此,可使用所有編程語言中的各種指令。在程序創建過程中,可指定該塊可處理數據類型。在此,可使用 VARIANT 數據類型對各種變量進行互連。之后,再根據這些變量在塊中的數據類型進行響應。調用某個塊時,可以將該塊的參數連接到任何數據類型的變量。調用某個塊時,除了傳遞變量的指針外,還會傳遞變量的類型信息。塊代碼隨后可以根據運行期間傳遞的變量類型來執行。
例如,如果函數的塊參數為 VARIANT 數據類型,那么整數數據類型的變量可以在程序中的一個點處傳遞,而 PLC 數據類型的變量可以在程序中的另一個點處傳遞。借助 VARIANT 指令,函數隨后可以正確響應這種情況,而不會出錯。
說明 如果一個數據塊最初的數據類型為用戶自定義的數據類型 (UDT),那么只能指向完整的數據塊。 |
說明 訪問 I/O 只有 S7-1500 模塊的 CPU 才能直接讀寫 I/O 輸出或輸出中的信號。(<操作數>:P) |
下表列出了 VARIANT 指針的屬性:
長度(字節) | 表示法 | 格式 | 輸入值示例 |
---|---|---|---|
0 | 符號 | 操作數 | "TagResult" |
數據塊名稱.操作數名稱.元素 | "Data_TIA_Portal".StructVariable.FirstComponent | ||
絕對 | 操作數 | %MW10 | |
數據塊編號.操作數 類型長度 (僅對可標準訪問的塊有效) |
P#DB10.DBX10.0 INT 12 1) | ||
NULL 指針 | NULL | ||
1) 如果使用前綴 P#,則只能指向“標準”訪問模式的存儲區。 |
數據類型的編碼
如果通過 P# 使用絕對尋址,則允許使用以下數據類型:
十六進制代碼 | 數據類型 | 說明 |
---|---|---|
B#16#00 | NIL | Null 指針 |
B#16#01 | BOOL | 位 |
B#16#02 | BYTE | 字節,8 位 |
B#16#03 | CHAR | 8 位字符 |
B#16#04 | WORD | 16 位字 |
B#16#05 | INT | 16 位整數 |
B#16#06 | DWORD | 32 位字 |
B#16#07 | DINT | 32 位整數 |
B#16#08 | REAL | 32 位浮點數 |
B#16#0B | TIME | 持續時間 |
B#16#0C | S5TIME | 持續時間 |
B#16#09 | DATE | 日期 |
B#16#0A | TOD | 日期和時間 |
B#16#0E | DT | 日期和時間 |
B#16#13 | STRING | 字符串 |
B#16#17 | BLOCK_FB | 函數塊 |
B#16#18 | BLOCK_FC | 函數 |
B#16#19 | BLOCK_DB | 數據塊 |
B#16#1A | BLOCK_SDB | 系統數據塊 |
B#16#1C | COUNTER | 計數器 |
B#16#1D | TIMER | 定時器 |
示例
以下示例說明了 VARIANT 使用 STL 指令“MOVE:移動值”的工作原理:
STL | 說明 |
---|---|
CALL MOVE | // 調用指令。 |
value_type := VARIANT | // 參數 IN 和 OUT 的數據類型 |
IN := "Data_TIA_Portal".StructVariable.FirstComponent | // 從“Data_TIA_Portal”數據塊移動操作數“FirstComponent”中的數據。 |
OUT := "MotorDB".StructResult.TagResult | // 從“MotorDB”數據塊傳送到“TagResult”操作數中。 |
編程示例
在此編程示例中,將移動在生產班次期間為示例收集的數據值以作進一步處理。收集的數據放在 ARRAY 中。通過“MOVE_BLK_VARIANT:移動塊”(Move block) 指令,可以動態或以類型安全方式移動整個 ARRAY 或個別 ARRAY 元素。可以為源和目標 ARRAY 自由選擇 ARRAY 限值,這些限值不必匹配。但是,要移動的數據值的數據類型必須匹配。該指令在所有編程語言中都可用。
通過 VARIANT 數據類型,也可以使用已創建的程序代碼并通過在塊調用中指定不同的源和目標區域來移動另一個生產班次的數據。
驟
使用 SCL 編程語言創建函數并將其命名為“FC_PartialArrayCopy”。 按如下方式聲明塊接口: 按如下方式創建 SCL 程序代碼: 可以找到以下程序代碼作為模板。 創建 PLC 數據類型“UDT_MyStruct”: 創建全局數據塊“DB_WithArrays”: 在組織塊(例如 OB1)中調用“FC_PartialArrayCopy”函數,并使用 DB_WithArrays 數據塊初始化參數。輸入指定的常量: 也可以使用第三個和第四個 ARRAY(數據類型為 REAL)來代替使用前兩個 ARRAY (數據類型為 UDT_MyStruct)。 |
結果
在程序周期中調用“FC_PartialArrayCopy”塊后,會將從第四個元素開始的兩個數據值立即從“DB_WithArrays”全局數據塊的第一個 ARRAY 復制到該數據塊的第二個 ARRAY 中。復制的數據值將插入到第二個 ARRAY 中(從第四個元素開始)。
用于復制的 SCL 程序代碼:
SCL |
---|
IF IS_ARRAY(#SourceArray) AND TypeOfElements(#SourceArray) = TypeOfElements(#DestinationArray) THEN |
#Error := MOVE_BLK_VARIANT(COUNT := #Count, SRC := #SourceArray, SRC_INDEX := #SourceIndex, |
DEST => #DestinationArray, DEST_INDEX := #DestinationIndex); |
END_IF; |
#FC_PartialArrayCopy := #Error; |
-
存儲器
+關注
關注
38文章
7494瀏覽量
163914 -
西門子
+關注
關注
94文章
3041瀏覽量
115958 -
函數
+關注
關注
3文章
4333瀏覽量
62686 -
SCL
+關注
關注
1文章
239瀏覽量
17100
原文標題:西門子博途:有關 VARIANT 的基本信息
文章出處:【微信號:gh_a8b121171b08,微信公眾號:機器人及PLC自動化應用】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論