從TIA V13SP1 開(kāi)始,,S7-1200 V4.0開(kāi)始,,支持以下處理Variant類(lèi)型的變量的指令,如圖1-2所示,。 圖1 LAD中Variant類(lèi)型的變量比較操作指令 圖2 SCL中Variant類(lèi)型的變量比較操作指令 EQ_Type,、NE_Type,、TypeOf LAD指令詳情 SCL指令:TypeOf(操作數(shù)),操作數(shù)是FC/FB的Input/Output/InOut/Temp中定義為Variant類(lèi)型的參數(shù),,該語(yǔ)句輸出是數(shù)據(jù)類(lèi)型,,在程序中只能用在IF與CASE進(jìn)行比較。 用法1:IF指令,,操作數(shù)對(duì)應(yīng)的實(shí)參的類(lèi)型與一個(gè)變量類(lèi)型的比較,,例如: IF (TypeOf(操作數(shù)1) = 變量類(lèi)型(例如Byte)) ... END_IF; 用法2:IF指令,兩個(gè)操作數(shù)對(duì)應(yīng)的實(shí)參的類(lèi)型比較,,例如: IF (TypeOf(操作數(shù)1) = TypeOf(操作數(shù)2)) ... END_IF; 用法3:CASE OF指令,,操作數(shù)對(duì)應(yīng)的實(shí)參的類(lèi)型與多個(gè)變量類(lèi)型的比較,例如: CASE (TypeOf(操作數(shù))) OF Byte: ... Int: ... ELSE ... END_CASE; 使用舉例: 編寫(xiě)FC,,檢查輸入Variant變量類(lèi)型,,Byte則輸出True,其它則輸出False,,如圖3-6所示,。 圖3 FC6參數(shù)定義 圖4 程序詳情 SCL的版本程序,如圖5所示,。 圖5 SCL版本的程序 OB1多次調(diào)用該FC6,,可以看到結(jié)果,'DB16'.Static_1是Byte類(lèi)型,,'DB16'.Static_3不是Byte類(lèi)型,。 圖6 OB1多次調(diào)用FC6 EQ_ElemType、NE_ElemType,、TypeOfElements SCL指令:TypeOfElements(操作數(shù)),,操作數(shù)是FC/FB的Input/Output/InOut/Temp中定義為Variant類(lèi)型的參數(shù),該語(yǔ)句輸出是數(shù)據(jù)類(lèi)型,,在程序中只能用在IF與CASE進(jìn)行比較,。 比較之前,通常先使用IS_ARRAY檢查操作數(shù)對(duì)應(yīng)的實(shí)參是否是數(shù)組類(lèi)型,。 用法1:IF指令,,操作數(shù)對(duì)應(yīng)的實(shí)參為數(shù)組類(lèi)型,對(duì)該數(shù)組元素的類(lèi)型與一個(gè)變量類(lèi)型的比較,,例如: IF (TypeOfElements(操作數(shù)1) = 變量類(lèi)型(例如Byte)) ... END_IF; 用法2:IF指令,,兩個(gè)操作數(shù)對(duì)應(yīng)的實(shí)參均為數(shù)組類(lèi)型的類(lèi)型,比較它們數(shù)組元素的類(lèi)型,,例如: IF (TypeOfElements(操作數(shù)1) = TypeOfElements(操作數(shù)2)) ... END_IF; 用法3:CASE OF指令,,操作數(shù)對(duì)應(yīng)的實(shí)參為數(shù)組類(lèi)型,對(duì)該數(shù)組元素的類(lèi)型與多個(gè)變量類(lèi)型的比較,例如: CASE (TypeOfElements(操作數(shù))) OF Byte: ... Int: ... ELSE ... END_CASE; 注意 1.如果上述三種用法操作數(shù)不是數(shù)組類(lèi)型,,但是數(shù)據(jù)類(lèi)型和比較對(duì)象的數(shù)據(jù)類(lèi)型相同,,也會(huì)當(dāng)做該數(shù)據(jù)類(lèi)型的數(shù)組進(jìn)行處理,相當(dāng)于執(zhí)行的TypeOf指令,。 2.用法2,,也可以是這樣的: IF (TypeOfElements(操作數(shù)1) = TypeOf(操作數(shù)2)) ... END_IF; 或者 IF (TypeOf(操作數(shù)1) = TypeOfElements(操作數(shù)2)) ... END_IF; 即一邊是數(shù)組,一邊不是數(shù)組的比較,。 使用舉例: 編寫(xiě)FC,,檢查輸入Variant變量類(lèi)型,數(shù)組元素如果是Byte則輸出1為T(mén)rue,,輸出2為False,,數(shù)組元素如果是Int則輸出1為False,輸出2為T(mén)rue,,其余情況輸出1為False,輸出2為False,,如圖7-10所示,。 圖7 FC7參數(shù)定義 圖8 程序詳情 SCL的版本程序,如圖9所示,。 圖9 SCL版本的程序 OB1多次調(diào)用該FC7,,可以看到結(jié)果,'DB17'.Static_1是Byte數(shù)組,,'DB17'.Static_4是Int數(shù)組,,'DB17'.Static_7不是以上兩種類(lèi)型。 圖10 OB1多次調(diào)用FC7 IS_NULL,、NOT_NULL 對(duì)于SCL,,雖然沒(méi)有相對(duì)應(yīng)指令,但是可以在IF指令中,,將Variant變量與NULL比較 IF (操作數(shù) = NULL) ... END_IF; 理論上來(lái)說(shuō),,對(duì)于每個(gè)參數(shù)出現(xiàn)了Variant的FC/FB,都應(yīng)該檢查該Variant變量是否指向了空指針,,此處的空指針不一定是形參填寫(xiě)NULL,,也有可能填寫(xiě)沒(méi)有初始化的Temp中的Variant。 對(duì)于最新的S7-1200 V4.2版本,,只有一種情況可以初始化Temp中的Variant,,就是指令DB_ANY_TO_VARIANT(參見(jiàn)DB_ANY),同時(shí)運(yùn)行沒(méi)有錯(cuò)誤,,否則Temp中的Variant就相當(dāng)于NULL,。 使用舉例: 程序架構(gòu):OB1調(diào)用FC9,F(xiàn)C9調(diào)用FC8,,F(xiàn)C8中檢查3個(gè)輸入是否是NULL,,是則輸出True,,不是則輸出False,F(xiàn)C9的3個(gè)Temp變量作為FC8的3個(gè)輸入,,Temp_1是不賦值的Int變量,,Temp_2和Temp_3是通過(guò)DB_ANY_TO_VARIANT初始化的Variant變量,其中為T(mén)emp_2初始化的DB1是不滿(mǎn)足DB_ANY_TO_VARIANT條件的DB塊,,為T(mén)emp_3初始化的DB19是不滿(mǎn)足DB_ANY_TO_VARIANT條件的DB塊,,最終將FC8的3個(gè)輸出關(guān)聯(lián)FC9的3個(gè)輸出至OB1中顯示,如圖11-13所示,。 圖11 FC8程序詳情 圖12 FC9程序詳情 OB1調(diào)用FC9 圖13 OB1調(diào)用FC9 從圖13中可知,,不滿(mǎn)足DB_ANY_TO_VARIANT條件的DB1初始化的Temp_2相當(dāng)于NULL,其余兩個(gè)都可以視作有明確指向,。 IS_ARRAY SCL指令: IS_ARRAY(操作數(shù)),,操作數(shù)是FC/FB的Input/Output/InOut/Temp中定義為Variant類(lèi)型的參數(shù),當(dāng)操作數(shù)對(duì)應(yīng)的實(shí)參為數(shù)組或者P#指針格式,,IS_ARRAY(操作數(shù)) 為T(mén)rue,,否則IS_ARRAY(操作數(shù)) 為False。 使用方法: IF IS_ARRAY(操作數(shù)) THEN ... END_IF; |
|