說(shuō)明
VARIANT 數(shù)據(jù)類(lèi)型的參數(shù)是一個(gè)指針或引用,可指向各種不同數(shù)據(jù)類(lèi)型的變量。VARIANT 指針無(wú)法指向?qū)嵗?,因此不能指向多重?shí)例或多重實(shí)例的 ARRAY。VARIANT 指針可以是基本數(shù)據(jù)類(lèi)型(例如,INT 或 REAL)的對(duì)象。還可以是 STRING、DTL、STRUCT 類(lèi)型的 ARRAY、UDT、UDT 類(lèi)型的 ARRAY。VARIANT 指針可以識(shí)別結(jié)構(gòu),并指向各個(gè)結(jié)構(gòu)元素。VARIANT 數(shù)據(jù)類(lèi)型的操作數(shù)不占用背景數(shù)據(jù)塊或工作存儲(chǔ)器中的空間。但是,將占用 CPU 上的存儲(chǔ)空間。
VARIANT 類(lèi)型的變量不是一個(gè)對(duì)象,而是對(duì)另一個(gè)對(duì)象的引用。在函數(shù)的塊接口中的 VAR_IN、VAR_IN_OUT 和 VAR_TEMP 部分中,VARIANT 類(lèi)型的單個(gè)元素只能聲明為形參。因此,不能在數(shù)據(jù)塊或函數(shù)塊的塊接口靜態(tài)部分中聲明,例如,因?yàn)楦髟氐拇笮∥粗K脤?duì)象的大小可以更改。
使用 VARIANT 數(shù)據(jù)類(lèi)型時(shí),可為各種數(shù)據(jù)類(lèi)型創(chuàng)建通用的標(biāo)準(zhǔn)函數(shù)塊 (FB) 或函數(shù) (FC)。為此,可使用所有編程語(yǔ)言中的各種指令。在程序創(chuàng)建過(guò)程中,可指定該塊可處理數(shù)據(jù)類(lèi)型。在此,可使用 VARIANT 數(shù)據(jù)類(lèi)型對(duì)各種變量進(jìn)行互連。之后,再根據(jù)這些變量在塊中的數(shù)據(jù)類(lèi)型進(jìn)行響應(yīng)。調(diào)用某個(gè)塊時(shí),可以將該塊的參數(shù)連接到任何數(shù)據(jù)類(lèi)型的變量。調(diào)用某個(gè)塊時(shí),除了傳遞變量的指針外,還會(huì)傳遞變量的類(lèi)型信息。塊代碼隨后可以根據(jù)運(yùn)行期間傳遞的變量類(lèi)型來(lái)執(zhí)行。
例如,如果函數(shù)的塊參數(shù)為 VARIANT 數(shù)據(jù)類(lèi)型,那么整數(shù)數(shù)據(jù)類(lèi)型的變量可以在程序中的一個(gè)點(diǎn)處傳遞,而 PLC 數(shù)據(jù)類(lèi)型的變量可以在程序中的另一個(gè)點(diǎn)處傳遞。借助 VARIANT 指令,函數(shù)隨后可以正確響應(yīng)這種情況,而不會(huì)出錯(cuò)。
說(shuō)明 如果一個(gè)數(shù)據(jù)塊最初的數(shù)據(jù)類(lèi)型為用戶自定義的數(shù)據(jù)類(lèi)型 (UDT),那么只能指向完整的數(shù)據(jù)塊。 |
說(shuō)明 訪問(wèn) I/O 只有 S7-1500 模塊的 CPU 才能直接讀寫(xiě) I/O 輸出或輸出中的信號(hào)。(<操作數(shù)>:P) |
長(zhǎng)度(字節(jié)) | 表示法 | 格式 | 輸入值示例 |
---|---|---|---|
0 | 符號(hào) | 操作數(shù) | "TagResult" |
數(shù)據(jù)塊名稱(chēng).操作數(shù)名稱(chēng).元素 | "Data_TIA_Portal".StructVariable.FirstComponent | ||
絕對(duì) | 操作數(shù) | %MW10 | |
數(shù)據(jù)塊編號(hào).操作數(shù) 類(lèi)型長(zhǎng)度 | P#DB10.DBX10.0 INT 12 1) | ||
NULL 指針 | NULL |
數(shù)據(jù)類(lèi)型的編碼
如果通過(guò) P# 使用絕對(duì)尋址,則允許使用以下數(shù)據(jù)類(lèi)型:
BOOL
BYTE
CHAR
WORD
INT
DWORD
DINT
REAL
TIME
S5TIME
DATE
TOD
DT
示例
以下示例說(shuō)明了 VARIANT 使用 STL 指令“MOVE:移動(dòng)值”的工作原理:
STL | 說(shuō)明 |
---|---|
CALL MOVE | // 調(diào)用指令。 |
value_type := VARIANT | // 參數(shù) IN 和 OUT 的數(shù)據(jù)類(lèi)型 |
IN := "Data_TIA_Portal".StructVariable.FirstComponent | // 從“Data_TIA_Portal”數(shù)據(jù)塊移動(dòng)操作數(shù)“FirstComponent”中的數(shù)據(jù)。 |
OUT := "MotorDB".StructResult.TagResult | // 從“MotorDB”數(shù)據(jù)塊傳送到“TagResult”操作數(shù)中。 |
VARIANT 指令的應(yīng)用方式
簡(jiǎn)介
在下一章中,您將了解可用于 VARIANT 指令的應(yīng)用選項(xiàng)。
對(duì) VARIANT 指向的變量的數(shù)據(jù)類(lèi)型求值
在下表中,您將看到可使用哪些指令來(lái)對(duì) VARIANT 指向的變量的數(shù)據(jù)類(lèi)型求值:
函數(shù) | 指令 | 說(shuō)明 |
---|---|---|
確定數(shù)據(jù)類(lèi)型 |
TypeOf():檢查 VARIANT 變量的數(shù)據(jù)類(lèi)型 (該指令僅適用于 SCL,且只能與 IF 或 CASE 指令一起使用。) |
可使用該指令將 VARIANT 變量指向的數(shù)據(jù)類(lèi)型與任何其它變量的數(shù)據(jù)類(lèi)型進(jìn)行比較。也可以與 PLC 數(shù)據(jù)類(lèi)型作比較。 |
TypeOfElements():掃描 VARIANT 變量 ARRAY 元素的數(shù)據(jù)類(lèi)型 (該指令僅適用于 SCL,且只能與 IF 或 CASE 指令一起使用。) |
可使用該指令將 VARIANT 變量指向的數(shù)據(jù)類(lèi)型與任何其它變量的數(shù)據(jù)類(lèi)型進(jìn)行比較。也可以與 PLC 數(shù)據(jù)類(lèi)型作比較。如果 VARIANT 變量的數(shù)據(jù)類(lèi)型為 ARRAY,則將比較 ARRAY 元素的數(shù)據(jù)類(lèi)型。 | |
EQ_Type:比較數(shù)據(jù)類(lèi)型與變量數(shù)據(jù)類(lèi)型是否“相等” NE_Type:比較數(shù)據(jù)類(lèi)型與變量數(shù)據(jù)類(lèi)型是否“不相等” |
可使用該指令將 VARIANT 變量指向的數(shù)據(jù)類(lèi)型與任何其它變量的數(shù)據(jù)類(lèi)型進(jìn)行比較。也可以與 PLC 數(shù)據(jù)類(lèi)型作比較。 | |
EQ_ElemType:比較 ARRAY 元素?cái)?shù)據(jù)類(lèi)型與變量數(shù)據(jù)類(lèi)型是否“相等” NE_ElemType:比較 ARRAY 元素?cái)?shù)據(jù)類(lèi)型與變量數(shù)據(jù)類(lèi)型是否“不相等” |
可使用該指令將 VARIANT 變量指向的數(shù)據(jù)類(lèi)型與任何其它變量的數(shù)據(jù)類(lèi)型進(jìn)行比較。也可以與 PLC 數(shù)據(jù)類(lèi)型作比較。如果 VARIANT 變量的數(shù)據(jù)類(lèi)型為 ARRAY,則將比較 ARRAY 元素的數(shù)據(jù)類(lèi)型。 | |
對(duì) ARRAY 元素求值 | IS_ARRAY:檢查 ARRAY | 可使用該指令檢查 VARIANT 變量指向的數(shù)據(jù)類(lèi)型是否為 ARRAY。 |
CountOfElements:獲取 ARRAY 元素個(gè)數(shù) | 可使用該指令讀出該變量中 VARIANT 變量指向了多少個(gè) ARRAY 元素。 |
可以在信息系統(tǒng)的“基本指令 > 對(duì)應(yīng)編程語(yǔ)言”(Basic instructions > Respective programming language) 下找到有關(guān)各種指令的其它信息。
讀取 VARIANT 指向的數(shù)據(jù)
為了能夠使用數(shù)據(jù),您必須在一個(gè)中間步驟中將該數(shù)據(jù)移到變量中,因?yàn)闊o(wú)法直接處理該數(shù)據(jù)。
指令 | 說(shuō)明 | 示例 | 結(jié)果 | |
---|---|---|---|---|
VARIANT 指向 | 目標(biāo)數(shù)據(jù)類(lèi)型 | |||
VariantGet:讀取 VARIANT 變量值 | 可使用該指令將單個(gè)變量的值移到另一個(gè)變量中。這兩個(gè)變量的數(shù)據(jù)類(lèi)型必須匹配。 | UDT_1 | UDT_1 | 已執(zhí)行該指令。 |
REAL | REAL | |||
DINT | DWORD | 該指令未執(zhí)行。 |
將數(shù)據(jù)分配給 VARIANT 變量
無(wú)法使用該指令來(lái)初始化 VARIANT 變量。因此,在將數(shù)據(jù)返回到變量時(shí)必須已經(jīng)初始化 VARIANT 變量。請(qǐng)勿使用未初始化的臨時(shí) VARIANT 變量。
指令 | 說(shuō)明 | 示例 | 結(jié)果 | |
---|---|---|---|---|
源數(shù)據(jù)類(lèi)型 | VARIANT 指向: | |||
VariantPut:寫(xiě)入 VARIANT 變量值 | 可使用該指令將單個(gè)變量的值移到另一個(gè)變量中。這兩個(gè)變量的數(shù)據(jù)類(lèi)型必須匹配。 | UDT_1 | UDT_1 | 已執(zhí)行該指令。 |
REAL | REAL | |||
DINT | DWORD | 將不執(zhí)行該指令,因?yàn)閿?shù)據(jù)類(lèi)型不同。 |
處理動(dòng)態(tài) ARRAY 結(jié)構(gòu)
對(duì) ARRAY 元素求值 |
TypeOfElements():掃描 VARIANT 變量 ARRAY 元素的數(shù)據(jù)類(lèi)型 (該指令僅適用于 SCL,且只能與 IF 或 CASE 指令一起使用。) |
可使用該指令將 VARIANT 變量指向的數(shù)據(jù)類(lèi)型與任何其它變量的數(shù)據(jù)類(lèi)型進(jìn)行比較。也可以與 PLC 數(shù)據(jù)類(lèi)型作比較。如果 VARIANT 變量的數(shù)據(jù)類(lèi)型為 ARRAY,則將比較 ARRAY 元素的數(shù)據(jù)類(lèi)型。 |
IS_ARRAY:檢查 ARRAY | 可使用該指令檢查 VARIANT 變量指向的數(shù)據(jù)類(lèi)型是否為 ARRAY。 | |
CountOfElements:獲取 ARRAY 元素個(gè)數(shù) | 可使用該指令讀出該變量中 VARIANT 變量指向了多少個(gè) ARRAY 元素。 | |
MOVE_BLK_VARIANT:塊移動(dòng) | 可使用該指令移動(dòng)動(dòng)態(tài)和類(lèi)型安全(集成類(lèi)型測(cè)試)ARRAY。可以為源和目標(biāo) ARRAY 自由選擇限值。ARRAY 元素的數(shù)據(jù)類(lèi)型必須匹配。 |
說(shuō)明 MOVE、MOVE_BLK 和 MOVE_BLK_VARIANT 之間的區(qū)別 可使用“MOVE”指令來(lái)復(fù)制完整的結(jié)構(gòu)。 可使用“MOVE_BLK”指令來(lái)移動(dòng)具有已知數(shù)據(jù)類(lèi)型的 ARRAY 的部分。 僅在您想要移動(dòng)其數(shù)據(jù)類(lèi)型僅在程序運(yùn)行時(shí)期間已知的 ARRAY 的部分時(shí),才需要使用 MOVE_BLK_VARIANT 指令。 |
審核編輯:湯梓紅
-
plc
+關(guān)注
關(guān)注
5012文章
13304瀏覽量
463592 -
cpu
+關(guān)注
關(guān)注
68文章
10870瀏覽量
211899 -
變量
+關(guān)注
關(guān)注
0文章
613瀏覽量
28388 -
數(shù)據(jù)類(lèi)型
+關(guān)注
關(guān)注
0文章
236瀏覽量
13624 -
S7-1500
+關(guān)注
關(guān)注
3文章
300瀏覽量
6419
原文標(biāo)題:博途新變量: 有關(guān) VARIANT 的基本信息
文章出處:【微信號(hào):gh_a8b121171b08,微信公眾號(hào):機(jī)器人及PLC自動(dòng)化應(yīng)用】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論