在s7-1200/1500的數(shù)據(jù)類型中,variant是不太好理解的。請看它的在線幫助:
“variant 類型的參數(shù)是一個可以指向不同數(shù)據(jù)類型變量(而不是實例)的指針。 variant 指針可以是基本數(shù)據(jù)類型(例如,int 或 real)的對象。 還可以是 string、dtl、struct 類型的 array、udt、udt 類型的 array。 variant 指針可以識別結(jié)構(gòu),并指向各個結(jié)構(gòu)元素。variant 數(shù)據(jù)類型的操作數(shù)不占用背景數(shù)據(jù)塊或工作存儲器中的空間。但是,將占用 cpu 上的存儲空間?!?br>“variant 類型的變量不是一個對象,而是對另一個對象的引用。 在函數(shù)的塊接口中的 var_in、var_in_out 和 var_temp 部分中,variant 類型的單個元素只能聲明為形參。 因此,不能在數(shù)據(jù)塊或函數(shù)塊的塊接口靜態(tài)部分中聲明,例如,因為各元素的大小未知。 所引用對象的大小可以更改。”
“可使用 variant 來生成常規(guī)函數(shù)塊或函數(shù)。 調(diào)用某個塊時,可以將該塊的參數(shù)連接到任何數(shù)據(jù)類型的變量。 調(diào)用某個塊時,除了傳遞變量的指針外,還會傳遞變量的類型信息。 塊代碼隨后可以根據(jù)運(yùn)行期間傳遞的變量類型來執(zhí)行?!?
英語詞典對variant的解釋:變體、多樣的。
百度中的解釋:“在vb中,variant 數(shù)據(jù)類型是所有沒被顯式聲明(例如 dim、private、public 或 static等語句)為其他類型變量的數(shù)據(jù)類型?!?br>下面是我做的實驗:
在一個項目中生成一個全局?jǐn)?shù)據(jù)塊“數(shù)據(jù)塊_1”,在數(shù)據(jù)塊中生成一些復(fù)合數(shù)據(jù)類型的變量(見下圖)。
生成fb1,其輸入?yún)?shù)“變體”的數(shù)據(jù)類型為variant。在ob1中調(diào)用fb1,實驗表明,可以將輸入?yún)?shù)“變體”的實參設(shè)置為簡單數(shù)據(jù)類型的變量,還可以設(shè)置為數(shù)據(jù)塊_1中的字符串、數(shù)組1、結(jié)構(gòu)1、結(jié)構(gòu)1中的元素,結(jié)構(gòu)1.數(shù)組2和它的元素,數(shù)據(jù)類型為dtl的“日時”和它的元素,結(jié)構(gòu)1.時間和它的元素,但是不能將“變體”的實參設(shè)置為字符串“串1”中的元素。
實驗可知,在fb的接口區(qū),可以生成input、inout和temp類型的variant變量,但是不能生成output和static類型的variant變量。
做過實驗后,就比較好理解在線幫助中的話了。下面是我對variant的理解:
1)variant是可以指向不同數(shù)據(jù)類型的變量的指針。它幾乎可以指向所有的變量。數(shù)據(jù)類型any的功能夠強(qiáng)大了,它可以指向幾乎所有的簡單數(shù)據(jù)類型,和連續(xù)的地址區(qū),但是不能像variant一樣,指向復(fù)合數(shù)據(jù)類型。variant比any(任意)還要any,簡直就是一個七十二變的孫悟空!
2)因為variant 數(shù)據(jù)類型的操作數(shù)的“實際”數(shù)據(jù)類型是可變的,甚至其實參“各元素的大小未知。所引用對象的大小可以更改?!彼兴幌駊ointer和any那樣,其實參有固定的字節(jié)數(shù),所以“variant 數(shù)據(jù)類型的操作數(shù)不占用背景數(shù)據(jù)塊或工作存儲器中的空間。”
3)“除了傳遞變量的指針外,(variant)還會傳遞變量的類型信息?!?br>以variant變量“百變”的實參“數(shù)據(jù)塊_1.結(jié)構(gòu)1.時間.hour”(db2.dbb53)為例,它包含了變量的地址和各級的數(shù)據(jù)類型。
4)如果變量的實參是復(fù)合數(shù)據(jù)類型(包括多層嵌套的復(fù)合數(shù)據(jù)類型)或它的元素,或者變量或元素的大小可變,必須使用variant指針。
在s7-1500硬件平臺下,variant 已經(jīng)完全可以替代any的功能了。
variant 常用相關(guān)指令有
1;檢查數(shù)據(jù)類型
typeof,typeofelements,eq_type,ne_type,eq_elemtype,ne_elemtype
2:數(shù)組相關(guān)指令
is_array,countofelements
3 讀寫variant指向的數(shù)據(jù)
variantget,variantput
4:數(shù)據(jù)傳送
move_blk_variant
5:和db_any數(shù)據(jù)類型的轉(zhuǎn)換
variant_to_db_any,db_any_to_variant