從TIA 博途 V12,S7-1200 V2.0開始,支持DB_ANY類型。
DB_ANY 數(shù)據(jù)類型用來標(biāo)識任意數(shù)據(jù)塊。對于 S7-1200,可以選擇訪問編程期間尚不可用的數(shù)據(jù)塊。為此,在訪問塊的塊接口中創(chuàng)建一個 DB_ANY 數(shù)據(jù)類型的塊參數(shù)。數(shù)據(jù)塊名稱或先前分配給數(shù)據(jù)塊名稱的 DB_ANY 數(shù)據(jù)類型的變量將在運行期間傳送到此參數(shù)。
DB_ANY目前有4種用法以及2個隱藏指令:
1. DB_ANY指向非優(yōu)化DB塊,可以在程序中使用DB_ANY.%絕對地址。
這種方法LAD和SCL都可以使用,這種使用方式類似于S7-300/S7-400的BLOCK_DB,如圖1-2所示。
圖1 指令詳情
SCL的版本,如圖2所示。
圖2 指令SCL版本
使用這種方式時注意:
(1) CPU編譯時不檢查數(shù)據(jù)類型,可能會出現(xiàn)如圖3所示的錯誤。所以請一定核實數(shù)據(jù)類型。
圖3 錯誤的數(shù)據(jù)類型
(2)不檢查地址存在與否。如果調(diào)用不存在的地址,CPU會報錯如圖4所示的區(qū)域長度錯誤,所以敬請注意。
圖4 區(qū)域長度錯誤
(3)這種絕對地址是不支持變址,例如%DBW[x]不支持。
(4)不支持對符號名的訪問,例如Input_1.Static_1不支持。
DB_ANY作為輸入形參,調(diào)用參數(shù)的時候三種方式:
(1)在DB_ANY參數(shù)引腳填寫DB塊號,如圖5所示
圖5 參數(shù)為DB塊號
(2)在DB_ANY參數(shù)引腳填寫DB塊符號名,如圖6所示
圖6 參數(shù)為DB塊符號名
(3)在DB_ANY參數(shù)引腳填寫DB_ANY類型的變量,如圖7-8所示
圖7 參數(shù)為DB_ANY類型變量
圖8 DB_ANY類型變量的定義
DB_ANY作為輸出、輸入輸出形參,調(diào)用參數(shù)的時候只能參考圖7的方式。
根據(jù)(1)中的程序,計算結(jié)果都是一樣的,如圖9所示。
圖9 計算結(jié)果
2. TIA 博途 V13SP1,S7-1200 V4.0開始,如果DB_ANY指向通過PLC數(shù)據(jù)類型(UDT)或者系統(tǒng)數(shù)據(jù)類型(例如IEC_TIMER等)建立的DB塊
此時S7-1200在SCL中提供了兩個指令用于DB_ANY和Variant類型之間進行轉(zhuǎn)化,如圖10所示,如圖11-12所示為指令參數(shù):
圖10 指令位置
參數(shù) | 聲明 | 數(shù)據(jù)類型 | 說明 |
---|---|---|---|
in | Input | DB_ANY | 待讀取的數(shù)據(jù)塊 |
err | Output | Int | 錯誤信息 |
Ret_val | Return | Variant | Variant類型參數(shù) |
圖11 DB_ANY_TO_VARIANT參數(shù)
參數(shù) | 聲明 | 數(shù)據(jù)類型 | 說明 |
---|---|---|---|
in | Input | Variant | Variant類型參數(shù) |
err | Output | Int | 錯誤信息 |
Ret_val | Return | DB_ANY | 待寫入的數(shù)據(jù)塊 |
圖12 VARIANT_TO_DB_ANY指令參數(shù)
對于這兩個指令,注意:
1. DB_ANY類型實參一定是通過PLC數(shù)據(jù)類型(UDT)或者系統(tǒng)數(shù)據(jù)類型建立的DB塊,否則指令會報錯。
2. Variant類型指向的變量類型,一定要和DB_ANY指向的建立DB塊的數(shù)據(jù)類型相同,否則指令會報錯。
3. DB_ANY_TO_VARIANT是目前S7-1200唯一可以初始化FC/FB/OB的Temp中的Variant變量的指令,如果運行正確,則可以使用后續(xù)Variant處理指令,例如VariantGet,MOVE_BLK_VARIANT,Serialize等。
4. 同(3),VARIANT_TO_DB_ANY所使用的Variant輸入,如果來自于FC/FB/OB的Temp中的Variant變量,也一定是通過DB_ANY_TO_VARIANT初始化過的才可以。
5. 如果形參類型是Variant的FC/FB/指令,在實參填寫了DB塊,要求該DB一定是基于UDT或者系統(tǒng)數(shù)據(jù)類型建立,并且FC/FB/指令將按照UDT或者系統(tǒng)數(shù)據(jù)類型來處理該變量,例如:
這種用法是正確的,輸入是UDT_1類型建的DB,右邊是UDT_1類型的變量,如圖13所示。
圖13 正確使用
這種用法是不正確的,輸入是UDT_1類型建的DB,右邊是DB_ANY類型的變量,如圖14所示。
圖14 錯誤使用
這種方法的使用場合:
如果每種產(chǎn)品有大量數(shù)據(jù),有很多種產(chǎn)品,每種產(chǎn)品的數(shù)據(jù)都是相同結(jié)構(gòu)??梢曰谙嗤Y(jié)構(gòu)建立UDT,每一種產(chǎn)品基于UDT建立DB(也可以在一個DB中建立UDT的數(shù)組,但是從變量名處就無法分清哪種變量對應(yīng)哪種產(chǎn)品)。然后在一個DB塊內(nèi)建立DB_ANY的數(shù)組,在每個DB_ANY變量的起始值處填寫需要指向的DB塊號??梢酝ㄟ^循環(huán)的方式訪問每個DB_ANY,將其轉(zhuǎn)化為UDT,處理后再送回該DB_ANY。
例子1:DB37-DB40均為基于UDT1建立的DB,如圖15所示。DB36建立數(shù)據(jù)類型為Array[0..3] of DB_ANY的變量,如圖16所示,起始值分別是DB37,DB38,DB39,DB40。FC22的參數(shù)InOut為UDT_1類型變量,用于數(shù)據(jù)處理,如圖17所示。FC21多次調(diào)用FC22,如圖18所示。
圖15 待使用的DB_ANY引用的數(shù)據(jù)塊
圖16 DB_ANY數(shù)組及起始值
圖17 用于處理UDT_1類型變量的FC22(程序略)
圖18 程序詳情
圖19 FC21在OB1的調(diào)用
例子2:使用在Modbus上的一個例子。
Modbus輪詢時,通常多次調(diào)用Modbus_Master(或者MB_MASTER),每個Modbus_Maste使用不同的參數(shù)。也可以寫成一個Modbus_Master,這需要在參數(shù)中采取變量的形式,但DATA_PTR這個變量只能采取一種結(jié)構(gòu)、UDT的數(shù)組,或者二維數(shù)組。這種方法可以,但不夠靈活,因為每個站點變量大小結(jié)構(gòu)可能各不相同。現(xiàn)在的話可以通過DB_ANY的方式來做到一個完全通用的Modbus輪詢程序。
前提:TIA 博途 V15,S7-1200 V4.2 版本MODBUS(RTU) V4.0版本,如果不是這些版本,某些功能需要被簡化。
1. TIA 博途 V14,S7-1200 V4.2 ,則Modbus_Master的DATA_PTR只能是非優(yōu)化塊,程序中的Static_2只能作為InOut。
2. S7-1200 V4.0/V4.1,則Array [*] of Struct也將不支持,程序中的InOut_1需要改為Variant,處理程序需要使用MOVE_BLK_VARIANT。
例如:
每個Modbus_Master的站點,需要將其要讀/寫的數(shù)據(jù)結(jié)構(gòu)做成UDT,并生成對應(yīng)DB塊。這里DB42是基于modbus_Instu 這個UDT建立,如圖20所示。
圖20 modbus從站數(shù)據(jù)
DB43建立Struct的數(shù)組(最好是UDT的數(shù)組),其元素包含實際的DATA_PTR所在DB塊(參考圖20),以及相關(guān)的Modbus_Master參數(shù)。這個數(shù)組作為FB2的InOut,如圖21所示。該數(shù)組可以根據(jù)站點個數(shù)決定數(shù)組元素個數(shù)。
圖21 所有從站的參數(shù)
FB2為modbus具體程序,InOut_1為變長數(shù)組,指向圖21的數(shù)組,如圖22-24所示。
圖22 FB2參數(shù)
圖23 程序詳情1
圖24 程序詳情2
圖25 程序在OB1中的調(diào)用
需要注意的是,例子中使用CB1241,因為是RS485模式,所以下面MODE起始值是4,如圖26所示。
圖26 修改MODE
3. TIA 博途 V15開始,S7-1200 V4.2開始,增加以下指令,用于DB_ANY變量與數(shù)據(jù)類型的比較,見表1。
表1 TypeOfDB指令
LAD | SCL | 位置 |
---|---|---|
EQ_TypeOfDB | TypeOfDB | 基本指令 -- 比較操作 -- 變量 |
NE_TypeOfDB |
DB_ANY指向的數(shù)據(jù)塊不限于PLC數(shù)據(jù)類型(UDT)或者系統(tǒng)數(shù)據(jù)類型建立的DB塊,還可以是TO軸的DB塊,以及FB的背景數(shù)據(jù)塊,見表2。
表2 指令參數(shù)
LAD指令 | 操作數(shù)1 | 操作數(shù)2 | 說明 |
---|---|---|---|
操作數(shù)1 ┫EQ_TypeOfDB┣ 操作數(shù)2 |
DB_ANY | 數(shù)據(jù)類型 | 比較操作數(shù)1對應(yīng)的DB是不是基于操作數(shù)2的數(shù)據(jù)類型建立的,是則該指令返回邏輯運算結(jié)果 (RLO)“1”。如果不是則該指令返回 RLO“0”。操作數(shù)2的數(shù)據(jù)類型包括PLC數(shù)據(jù)類型(UDT)、系統(tǒng)數(shù)據(jù)類型、TO軸、FB。 |
操作數(shù)1 ┫NE_TypeOfDB┣ 操作數(shù)2 |
DB_ANY | 數(shù)據(jù)類型 | 較操作數(shù)1對應(yīng)的DB是不是基于操作數(shù)2的數(shù)據(jù)類型建立的,不是則該指令返回邏輯運算結(jié)果 (RLO)“1”。如果是則該指令返回 RLO“0”。操作數(shù)2的數(shù)據(jù)類型包括PLC數(shù)據(jù)類型(UDT)、系統(tǒng)數(shù)據(jù)類型、TO軸、FB。 |
SCL指令:TypeOfDB(操作數(shù)),操作數(shù)是DB_ANY類型的參數(shù),該語句輸出是數(shù)據(jù)類型,在程序中只能用在IF與CASE進行比較。
用法1:IF指令,操作數(shù)對應(yīng)的類型與一個變量類型的比較,例如:
IF (TypeOfDB(操作數(shù)1) = 變量類型(例如"UDT_1"))
...
END_IF;
用法2:IF指令,兩個操作數(shù)對應(yīng)的類型比較,例如:
IF (TypeOfDB(操作數(shù)1) = TypeOfDB(操作數(shù)2))
...
END_IF;
用法3:CASE OF指令,操作數(shù)對應(yīng)的實參的類型與多個變量類型的比較,例如:
CASE (TypeOfDB(操作數(shù))) OF
UDT_1:
...
UDT_2:
...
ELSE
...
END_CASE;
使用舉例:
編寫FC,檢查輸入DB_ANY變量類型,UDT_1則輸出True,其它則輸出False,如圖27-28所示。
圖27 程序詳情
SCL版本程序,如圖28所示。
圖28 SCL版本程序
4. S7-1200 V4.2開始,DB_ANY可以開始在運動控制中使用
可以使用在形參為TO_PositioningAxis和TO_CommandTable類型的實參處,包括以下幾種:
(1) 當(dāng)FC/FB的輸入形參數(shù)據(jù)類型為TO_PositioningAxis時,外部實參可以使用DB_ANY數(shù)據(jù)類型的變量。
(2) 在MC_MoveAbsolute/MC_MoveRelative指令的參數(shù)Axis處,實參可以直接使用DB_ANY數(shù)據(jù)類型的變量。
(3) 當(dāng)FC/FB的輸入形參數(shù)據(jù)類型為TO_CommandTable時,外部實參可以使用DB_ANY數(shù)據(jù)類型的變量。
(4) 在MC_CommandTable指令的參數(shù)CommandTable處,實參可以直接使用DB_ANY數(shù)據(jù)類型的變量。
與第2條對應(yīng)的是其他運動控制指令的參數(shù)Axis,直接使用DB_ANY數(shù)據(jù)類型的變量,這種用法會報錯誤,如圖29-30所示。
原因是MC_Power/MC_Reset/MC_Home指令的參數(shù)Axis,類型為TO_Axis。而MC_Halt/MC_MoveVelocity/MC_MoveJog/MC_ChangeDynamic指令的參數(shù)Axis,類型為TO_SpeedAxis。
圖29 程序詳情
圖30 程序在OB1中的調(diào)用
診斷緩沖區(qū)的報錯如圖31所示:
圖31 報錯信息
例子,以(1)和(3)為例,實現(xiàn)功能:FB6判斷軸使用的命令表,F(xiàn)B7包含多個軸的FB6功能,如圖32-34所示。
圖32 FB6的參數(shù)設(shè)置
圖33 程序詳情
圖34 FB7中循環(huán)調(diào)用FB6
最后在OB1調(diào)用FB7即可
優(yōu)勢:
1. 以往和軸有關(guān)的塊都需要逐個調(diào)用,現(xiàn)在利用DB_ANY和FB的數(shù)組,可以用一個循環(huán)完成。
2.命令表的類型 TO_CommandTable只能在Input,Output以及InOut這種外部引腳上,對于需要切換命令表很麻煩,現(xiàn)在用DB_ANY直接在程序內(nèi)部解決。
5. 隱藏指令
在SCL中有兩個用于轉(zhuǎn)化的指令,沒有放在指令列表中:
DB_ANY_TO_UINT以及UINT_TO_DB_ANY,這是DB_ANY和UINT類型之間的轉(zhuǎn)化。使用":="同樣可以完成它們之間的轉(zhuǎn)化。
在LAD中,如果IEC檢查沒有激活,用MOVE指令也可實現(xiàn)DB_ANY和UINT類型之間的轉(zhuǎn)化。
這2個指令對DB_ANY指向的DB塊沒有特殊要求。
審核編輯 :李倩
-
plc
+關(guān)注
關(guān)注
5011文章
13297瀏覽量
463374 -
數(shù)據(jù)類型
+關(guān)注
關(guān)注
0文章
236瀏覽量
13624
原文標(biāo)題:S7-1200:DB_ANY類型
文章出處:【微信號:gh_a8b121171b08,微信公眾號:機器人及PLC自動化應(yīng)用】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論