說明
VARIANT 數(shù)據(jù)類型的參數(shù)是一個(gè)指針或引用,可指向各種不同數(shù)據(jù)類型的變量。VARIANT 指針無法指向?qū)嵗?,因此不能指向多重?shí)例或多重實(shí)例的 ARRAY。VARIANT 指針可以是基本數(shù)據(jù)類型(例如,INT 或 REAL)的對象。還可以是 STRING、DTL、STRUCT 類型的 ARRAY、UDT、UDT 類型的 ARRAY。VARIANT 指針可以識別結(jié)構(gòu),并指向各個(gè)結(jié)構(gòu)元素。VARIANT 數(shù)據(jù)類型的操作數(shù)不占用背景數(shù)據(jù)塊或工作存儲器中的空間。但是,將占用 CPU 上的存儲空間。
VARIANT 類型的變量不是一個(gè)對象,而是對另一個(gè)對象的引用。在函數(shù)的塊接口中的 VAR_IN、VAR_IN_OUT 和 VAR_TEMP 部分中,VARIANT 類型的單個(gè)元素只能聲明為形參。因此,不能在數(shù)據(jù)塊或函數(shù)塊的塊接口靜態(tài)部分中聲明,例如,因?yàn)楦髟氐拇笮∥粗?。所引用對象的大小可以更改?/p>
使用 VARIANT 數(shù)據(jù)類型時(shí),可為各種數(shù)據(jù)類型創(chuàng)建通用的標(biāo)準(zhǔn)函數(shù)塊 (FB) 或函數(shù) (FC)。為此,可使用所有編程語言中的各種指令。在程序創(chuàng)建過程中,可指定該塊可處理數(shù)據(jù)類型。在此,可使用 VARIANT 數(shù)據(jù)類型對各種變量進(jìn)行互連。之后,再根據(jù)這些變量在塊中的數(shù)據(jù)類型進(jìn)行響應(yīng)。調(diào)用某個(gè)塊時(shí),可以將該塊的參數(shù)連接到任何數(shù)據(jù)類型的變量。調(diào)用某個(gè)塊時(shí),除了傳遞變量的指針外,還會傳遞變量的類型信息。塊代碼隨后可以根據(jù)運(yùn)行期間傳遞的變量類型來執(zhí)行。
例如,如果函數(shù)的塊參數(shù)為 VARIANT 數(shù)據(jù)類型,那么整數(shù)數(shù)據(jù)類型的變量可以在程序中的一個(gè)點(diǎn)處傳遞,而 PLC 數(shù)據(jù)類型的變量可以在程序中的另一個(gè)點(diǎn)處傳遞。借助 VARIANT 指令,函數(shù)隨后可以正確響應(yīng)這種情況,而不會出錯(cuò)。
說明 如果一個(gè)數(shù)據(jù)塊最初的數(shù)據(jù)類型為用戶自定義的數(shù)據(jù)類型 (UDT),那么只能指向完整的數(shù)據(jù)塊。 |
說明 訪問 I/O 只有 S7-1500 模塊的 CPU 才能直接讀寫 I/O 輸出或輸出中的信號。(<操作數(shù)>:P) |
下表列出了 VARIANT 指針的屬性:
長度(字節(jié)) | 表示法 | 格式 | 輸入值示例 |
---|---|---|---|
0 | 符號 | 操作數(shù) | "TagResult" |
數(shù)據(jù)塊名稱.操作數(shù)名稱.元素 | "Data_TIA_Portal".StructVariable.FirstComponent | ||
絕對 | 操作數(shù) | %MW10 | |
數(shù)據(jù)塊編號.操作數(shù) 類型長度 (僅對可標(biāo)準(zhǔn)訪問的塊有效) |
P#DB10.DBX10.0 INT 12 1) | ||
NULL 指針 | NULL | ||
1) 如果使用前綴 P#,則只能指向“標(biāo)準(zhǔn)”訪問模式的存儲區(qū)。 |
數(shù)據(jù)類型的編碼
如果通過 P# 使用絕對尋址,則允許使用以下數(shù)據(jù)類型:
十六進(jìn)制代碼 | 數(shù)據(jù)類型 | 說明 |
---|---|---|
B#16#00 | NIL | Null 指針 |
B#16#01 | BOOL | 位 |
B#16#02 | BYTE | 字節(jié),8 位 |
B#16#03 | CHAR | 8 位字符 |
B#16#04 | WORD | 16 位字 |
B#16#05 | INT | 16 位整數(shù) |
B#16#06 | DWORD | 32 位字 |
B#16#07 | DINT | 32 位整數(shù) |
B#16#08 | REAL | 32 位浮點(diǎn)數(shù) |
B#16#0B | TIME | 持續(xù)時(shí)間 |
B#16#0C | S5TIME | 持續(xù)時(shí)間 |
B#16#09 | DATE | 日期 |
B#16#0A | TOD | 日期和時(shí)間 |
B#16#0E | DT | 日期和時(shí)間 |
B#16#13 | STRING | 字符串 |
B#16#17 | BLOCK_FB | 函數(shù)塊 |
B#16#18 | BLOCK_FC | 函數(shù) |
B#16#19 | BLOCK_DB | 數(shù)據(jù)塊 |
B#16#1A | BLOCK_SDB | 系統(tǒng)數(shù)據(jù)塊 |
B#16#1C | COUNTER | 計(jì)數(shù)器 |
B#16#1D | TIMER | 定時(shí)器 |
示例
以下示例說明了 VARIANT 使用 STL 指令“MOVE:移動(dòng)值”的工作原理:
STL | 說明 |
---|---|
CALL MOVE | // 調(diào)用指令。 |
value_type := VARIANT | // 參數(shù) IN 和 OUT 的數(shù)據(jù)類型 |
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ù)中。 |
編程示例
在此編程示例中,將移動(dòng)在生產(chǎn)班次期間為示例收集的數(shù)據(jù)值以作進(jìn)一步處理。收集的數(shù)據(jù)放在 ARRAY 中。通過“MOVE_BLK_VARIANT:移動(dòng)塊”(Move block) 指令,可以動(dòng)態(tài)或以類型安全方式移動(dòng)整個(gè) ARRAY 或個(gè)別 ARRAY 元素??梢詾樵春湍繕?biāo) ARRAY 自由選擇 ARRAY 限值,這些限值不必匹配。但是,要移動(dòng)的數(shù)據(jù)值的數(shù)據(jù)類型必須匹配。該指令在所有編程語言中都可用。
通過 VARIANT 數(shù)據(jù)類型,也可以使用已創(chuàng)建的程序代碼并通過在塊調(diào)用中指定不同的源和目標(biāo)區(qū)域來移動(dòng)另一個(gè)生產(chǎn)班次的數(shù)據(jù)。
驟
使用 SCL 編程語言創(chuàng)建函數(shù)并將其命名為“FC_PartialArrayCopy”。 按如下方式聲明塊接口: ![]() ![]() 按如下方式創(chuàng)建 SCL 程序代碼: 可以找到以下程序代碼作為模板。 ![]() ![]() 創(chuàng)建 PLC 數(shù)據(jù)類型“UDT_MyStruct”: ![]() ![]() 創(chuàng)建全局?jǐn)?shù)據(jù)塊“DB_WithArrays”: ![]() ![]() 在組織塊(例如 OB1)中調(diào)用“FC_PartialArrayCopy”函數(shù),并使用 DB_WithArrays 數(shù)據(jù)塊初始化參數(shù)。輸入指定的常量: ![]() ![]() 也可以使用第三個(gè)和第四個(gè) ARRAY(數(shù)據(jù)類型為 REAL)來代替使用前兩個(gè) ARRAY (數(shù)據(jù)類型為 UDT_MyStruct)。 ![]() ![]() |
結(jié)果
在程序周期中調(diào)用“FC_PartialArrayCopy”塊后,會將從第四個(gè)元素開始的兩個(gè)數(shù)據(jù)值立即從“DB_WithArrays”全局?jǐn)?shù)據(jù)塊的第一個(gè) ARRAY 復(fù)制到該數(shù)據(jù)塊的第二個(gè) ARRAY 中。復(fù)制的數(shù)據(jù)值將插入到第二個(gè) ARRAY 中(從第四個(gè)元素開始)。
用于復(fù)制的 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; |
-
存儲器
+關(guān)注
關(guān)注
38文章
7653瀏覽量
167414 -
西門子
+關(guān)注
關(guān)注
98文章
3173瀏覽量
118278 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4381瀏覽量
64895 -
SCL
+關(guān)注
關(guān)注
1文章
243瀏覽量
17558
原文標(biāo)題:西門子博途:有關(guān) VARIANT 的基本信息
文章出處:【微信號:gh_a8b121171b08,微信公眾號:機(jī)器人及PLC自動(dòng)化應(yīng)用】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
西門子博途1200碼垛機(jī)程序應(yīng)用
暢銷西門子助聽器價(jià)格表_西門子助聽器價(jià)格大全

博世和西門子哪個(gè)好_博世和西門子的關(guān)系
詳解博途編程實(shí)現(xiàn)S7300與西門子觸摸屏通訊
西門子PLC編程軟件博途下載
Unity3D與西門子PLC通訊

如何在博途平臺調(diào)試西門子G120變頻器

博途新變量:有關(guān)VARIANT的基本信息
西門子博途有關(guān)STRUCT的基本信息

西門子plc單按鈕啟停的十種方法(博途1200/1500PLC)

如何在博途平臺調(diào)試西門子G120變頻器

評論