IA中數(shù)據(jù)塊如何實(shí)現(xiàn)清零?
在TIA指令集內(nèi)有多個(gè)移動(dòng)指令可對(duì)DB塊內(nèi)數(shù)據(jù)進(jìn)行清零處理。對(duì)于S7-1500 CPU或ET200SP CPU來(lái)說(shuō),可使用BLKMOV、FILL以及SCL的POKE_BLK指令。但是這些指令對(duì)DB塊清零時(shí),要求DB塊必需為非優(yōu)化DB。
對(duì)于優(yōu)化的DB塊,可使用FILL_BLK指令或創(chuàng)建相同的UDT結(jié)構(gòu)類(lèi)型的DB塊,使用MOVE指令清零DB塊數(shù)據(jù)。使用FILL_BLK指令處理時(shí),對(duì)DB塊數(shù)據(jù)類(lèi)型有要求,需要?jiǎng)?chuàng)建數(shù)組類(lèi)型,相對(duì)非優(yōu)化DB的處理多了數(shù)據(jù)類(lèi)型的限制。
當(dāng)然對(duì)DB塊數(shù)據(jù)的清零操作根據(jù)DB塊內(nèi)數(shù)據(jù)類(lèi)型的不同方式有多種多樣,本文介紹部分TIA集成指令處理的方法作為編程參考。
測(cè)試環(huán)境
軟件:TIA V17 Professional
硬件:CPU1512C-1 PN V2.9
對(duì)非優(yōu)化DB塊內(nèi)數(shù)據(jù)清零
在S7-1500CPU內(nèi)添加非優(yōu)化DB塊 "DST_Data" DB1(目標(biāo)DB),數(shù)據(jù)類(lèi)型任意創(chuàng)建,如圖1所示。
圖1. 創(chuàng)建非優(yōu)化DB塊(目標(biāo)DB)
方法1. 使用BLKMOVE指令
(1) BLK_MOV指令,可將數(shù)據(jù)從一個(gè)存儲(chǔ)區(qū)(源區(qū)域)移動(dòng)到另一存儲(chǔ)區(qū)(目標(biāo)區(qū)域)。
使用該指令要求,創(chuàng)建一個(gè)跟目標(biāo)區(qū)域DB一樣數(shù)據(jù)長(zhǎng)度的源區(qū)域DB。對(duì)于源區(qū)域DB只要和目標(biāo)區(qū)域DB數(shù)據(jù)長(zhǎng)度一致即可,如圖2所示,創(chuàng)建非優(yōu)化DB塊 "SRC_Data" DB2(源DB)。
圖2. 創(chuàng)建非優(yōu)化DB塊(源DB)
(2) 在OB1內(nèi),從"指令">"基本指令">"移動(dòng)操作">"原有"下,調(diào)用BLKMOV指令,如圖3所示。
圖3. OB1內(nèi)調(diào)用BLKMOV指令
指令管腳參數(shù)說(shuō)明:
?
SRCBLK | :=P#DB2.DBX0.0 BYTE 58 | //源DB塊 |
RET_VAL | :%MW2 | //返回值 |
DSTBLK | :=P#DB1.DBX0.0 BYTE 58 | //目標(biāo)DB塊 |
?
(3) 指令執(zhí)行結(jié)果,如圖4所示。"DST_Data" DB1(目標(biāo)DB)內(nèi)數(shù)據(jù)全部清零。
圖4. BLKMOV指令執(zhí)行結(jié)果
方法2. 使用SCL中的POKE_BLK指令
在OB1內(nèi)添加一個(gè)SCL程序段,然后在"指令">"基本指令">"移動(dòng)操作">"讀/寫(xiě)存儲(chǔ)器"下,調(diào)用POKE_BLK指令,如圖5所示。
圖5. OB1內(nèi)調(diào)用POKE_BLK指令
POKE_BLK指令管腳參數(shù)定義,如下圖6所示。
圖6. POKE_BLK指令管腳參數(shù)
方法2和方法1原理類(lèi)似,區(qū)別后者為SCL指令。此兩種方法都需要?jiǎng)?chuàng)建一個(gè)源DB來(lái)覆蓋目標(biāo)DB內(nèi)數(shù)據(jù)實(shí)現(xiàn)清零。
方法3. 使用FILL指令
在OB1內(nèi),從"指令">"基本指令">"移動(dòng)操作">"原有"下,調(diào)用FILL指令,如圖7所示。
圖7. OB1內(nèi)調(diào)用FILL指令
指令管腳參數(shù)說(shuō)明:
?
BVAL | :MB1 | //源數(shù)據(jù) |
RET_VAL | :%MW4 | //返回值 |
BLK | :=P#DB1.DBX0.0 BYTE 58 | //目標(biāo)DB塊 |
?
相比前兩種方法,方法3不需要?jiǎng)?chuàng)建整個(gè)源DB來(lái)覆蓋目標(biāo)DB,最小只需創(chuàng)建一個(gè)Byte類(lèi)型的數(shù)據(jù)即可,如上圖7中 %MB1。
對(duì)優(yōu)化DB塊內(nèi)數(shù)據(jù)清零
方法1. 使用FILL_BLK指令
使用FILL_BLK指令對(duì)優(yōu)化DB塊清零,對(duì)DB塊的數(shù)據(jù)類(lèi)型有要求,需要?jiǎng)?chuàng)建為ARRAY數(shù)組類(lèi)型或相同基本數(shù)據(jù)類(lèi)型的UDT或相同基本數(shù)據(jù)類(lèi)型的STRUCT才行。
在S7-1500CPU內(nèi)添加優(yōu)化DB塊 "DST_Data2" DB3(目標(biāo)DB),如圖8所示。
圖8. 創(chuàng)建優(yōu)化DB塊(目標(biāo)DB)
在OB1內(nèi),從"指令">"基本指令">"移動(dòng)操作"下,調(diào)用FILL_BLK指令,如圖9所示。
圖9. OB1內(nèi)調(diào)用FILL_BLK指令
指令管腳參數(shù)說(shuō)明:
?
IN | :MB1 | //源數(shù)據(jù);數(shù)據(jù)長(zhǎng)度跟數(shù)組內(nèi)基本數(shù)據(jù)類(lèi)型一致 |
COUNT | - | //需要覆蓋的長(zhǎng)度 |
OUT | :"DST_Data2".Static_1[0] | //目標(biāo)結(jié)構(gòu)的起始地址 |
?
指令執(zhí)行結(jié)果,如圖10所示。"DST_Data2" DB3(目標(biāo)DB)內(nèi)指定長(zhǎng)度的數(shù)組或STRUCT數(shù)據(jù)全部清零。
圖10. FILL_BLK指令執(zhí)行結(jié)果
方法2. 創(chuàng)建相同的UDT結(jié)構(gòu)使用MOVE指令清零DB塊數(shù)據(jù)
使用UDT數(shù)據(jù)類(lèi)型創(chuàng)建源和目標(biāo)優(yōu)化DB塊,如圖11所示。
圖11. 使用UDT數(shù)據(jù)類(lèi)型創(chuàng)建優(yōu)化DB塊
在OB1內(nèi),從"指令">"基本指令">"移動(dòng)操作"下,調(diào)用MOVE指令,如圖12所示。
圖12. 調(diào)用MOVE指令
指令執(zhí)行結(jié)果,如圖13所示。
圖13. MOVE指令執(zhí)行結(jié)果
審核編輯:黃飛
?
評(píng)論
查看更多