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