MOVE 系列指令
本文檔將介紹幾個(gè)常用 MOVE 系列指令,鏈接如下:
MOVE
(U)MOVE_BLK
MOVE_BLK_VARIANT
MOVE
LAD為MOVE指令,SCL使用":="表達(dá)式可以完成MOVE的功能(“:=”還可以有其他功能)。
MOVE指令是當(dāng)EN條件滿足時(shí),實(shí)現(xiàn)相同數(shù)據(jù)類型(不包括位、字符串、Variant類型)的變量間的傳送。
圖1 指令位置
注意:
(1)LAD傳送字符串需要使用S_MOVE指令(SCL使用“:=”),但是傳送字符串中的字符需要使用MOVE指令。
(2)支持通過(guò)一個(gè)MOVE指令將一個(gè)變量傳送到多個(gè)變量,但是該功能不支持傳送復(fù)雜數(shù)據(jù)類型(DTL、結(jié)構(gòu)、數(shù)組等)或字符串中的字符。
(3)傳送數(shù)組時(shí),要求元素?cái)?shù)據(jù)類型以及元素個(gè)數(shù)必須完全一樣,數(shù)組限值可以不同,例如Array[0..1] of Byte可以MOVE到Array[1..2] of Byte。
(4)如果MOVE兩邊是基本數(shù)據(jù)類型,則可以在滿足以下兼容條件時(shí)傳送,參見表1。
表1 MOVE的傳送條件
傳送源 (IN) | 傳送目標(biāo) (OUT1) | |
---|---|---|
進(jìn)行 IEC 檢查 | 不進(jìn)行 IEC 檢查 | |
BYTE | BYTE、WORD、DWORD | BYTE、WORD、DWORD、SINT、USINT、INT、UINT、DINT、UDINT、TIME、DATE、TOD、CHAR |
WORD | WORD、DWORD | BYTE、WORD、DWORD、SINT、USINT、INT、UINT、DINT、UDINT、TIME、DATE、TOD、CHAR |
DWORD | DWORD | BYTE、WORD、DWORD、SINT、USINT、INT、UINT、DINT、UDINT、REAL、TIME、DATE、TOD、CHAR |
SINT | SINT | BYTE, WORD, DWORD, SINT, USINT, INT, UINT, DINT, UDINT, TIME, DATE, TOD |
USINT | USINT, UINT, UDINT | BYTE, WORD, DWORD, SINT, USINT, INT, UINT, DINT, UDINT, TIME, DATE, TOD |
INT | INT | BYTE, WORD, DWORD, SINT, USINT, INT, UINT, DINT, UDINT, TIME, DATE, TOD |
UINT | USINT, UINT | BYTE, WORD, DWORD, SINT, USINT, INT, UINT, DINT, UDINT, TIME, DATE, TOD |
DINT | DINT | BYTE, WORD, DWORD, SINT, USINT, INT, UINT, DINT, UDINT, TIME, DATE, TOD |
UDINT | UDINT | BYTE, WORD, DWORD, SINT, USINT, INT, UINT, DINT, UDINT, TIME, DATE, TOD |
REAL | REAL | DWORD, REAL |
LREAL | LREAL | LREAL |
TIME | TIME | BYTE, WORD, DWORD, SINT, USINT, INT, UINT, DINT, UDINT, TIME |
DATE | DATE | BYTE, WORD, DWORD, SINT, USINT, INT, UINT, DINT, UDINT, DATE |
TOD | TOD | BYTE, WORD, DWORD, SINT, USINT, INT, UINT, DINT, UDINT, TOD |
CHAR | CHAR, String中的字符 | BYTE, WORD, DWORD,CHAR,String中的字符 |
WCHAR | WCHAR, WString中的字符 | BYTE,WORD,DWORD,CHAR,WCHAR,WString中的字符 |
String中的字符 | CHAR, String中的字符 | CHAR, String中的字符 |
WString中的字符 | WCHAR, WString中的字符 | WCHAR, WString中的字符 |
注意:
1.如果輸入 IN 數(shù)據(jù)類型的位長(zhǎng)度超出輸出 OUT 數(shù)據(jù)類型的位長(zhǎng)度,則源值的高位會(huì)丟失。如果輸入 IN 數(shù)據(jù)類型的位長(zhǎng)度低于輸出 OUT 數(shù)據(jù)類型的位長(zhǎng)度,則目標(biāo)值的高位會(huì)被改寫為 0。
2.REAL傳送至DWORD時(shí)是按位傳送,不是取整。如果需要取整,可以使用ROUND、CONVERT_REAL_TO_DINT等指令。
3.(不)進(jìn)行IEC檢查是指,在MOVE指令所在的OB/FC/FB屬性中的"IEC檢查"選項(xiàng),僅在此塊中生效。默認(rèn)的"IEC檢查"不激活。設(shè)置如圖2所示。
圖2 IEC檢查的設(shè)置
MOVE的使用
圖3 DB25
1. 單個(gè)基本類型變量的傳送
圖4 單個(gè)基本類型變量的傳送
2. 數(shù)組的傳送
圖5 數(shù)組的傳送
3. UDT的傳送
圖6 UDT的傳送
4. String中的字符的傳送
圖7 String中的字符的傳送
5. DTL中的變量的傳送
圖8 DTL中的變量的傳送
6. DB整體之間的傳送
條件:DB塊為非優(yōu)化塊,或者將優(yōu)化DB塊的存儲(chǔ)器預(yù)留區(qū)域與預(yù)留可保持性存儲(chǔ)器設(shè)置為0字節(jié)(如圖9所示),并且兩個(gè)DB塊結(jié)構(gòu)完全相同。
1. IN和OUT的DB必須同時(shí)為優(yōu)化DB或者非優(yōu)化DB。
2. 不允許同時(shí)輸出到多個(gè)DB,即圖4的形式。
圖9 存儲(chǔ)器預(yù)留區(qū)域設(shè)置
圖10 DB整體傳送
圖11 DB整體傳送程序
(U)MOVE_BLK
LAD和SCL均為(U)MOVE_BLK指令。
(U)MOVE_BLK指令是當(dāng)EN條件滿足時(shí),實(shí)現(xiàn)相同數(shù)組之間部分元素的傳送。MOVE_BLK和UMOVE_BLK的區(qū)別是UMOVE_BLK不會(huì)被中斷打斷,并且最多16kB的數(shù)據(jù)量。
圖12 程序位置
圖13 指令詳情
注意:
1. IN和OUT必須是數(shù)組的一個(gè)元素,例如"DB26".Static_1[0],不能是常數(shù)、常量、普通變量,也不能是數(shù)組名。
2. IN和OUT類型必須完全相同,并且必須是基本數(shù)據(jù)類型,不能是UDT、Struct等的數(shù)組。
3. IN是源數(shù)組中傳送的起始元素,OUT是目的數(shù)組中接收的起始元素。
4. COUNT是傳輸個(gè)數(shù),可以是正整數(shù)的常數(shù),如果是變量,數(shù)據(jù)類型支持USINT、UINT、UDINT。
5. 如果目的數(shù)組接收區(qū)域小于源數(shù)組的傳送區(qū)域,則只傳送目的數(shù)組可接收的區(qū)域的數(shù)據(jù)。如果激活指令的ENO功能,則ENO=False。
(U)MOVE_BLK的使用
實(shí)現(xiàn)功能:將"DB26".Static_1[0]開始的4個(gè)元素傳送至"DB26".Static_2[4]開始的數(shù)組中。
圖14 程序使用
圖15 運(yùn)行結(jié)果
MOVE_BLK_VARIANT
LAD和SCL均為MOVE_BLK_VARIANT指令。
MOVE_BLK_VARIANT的基本功能是數(shù)組之間部分元素的傳送,并且是可以處理Variant類型的變量的指令之一,適合處理Variant指向的變長(zhǎng)數(shù)組。
從TIA V13SP1,S7-1200 V4.0開始支持該指令。
圖16 指令位置
圖17 指令詳情
表2 參數(shù)說(shuō)明
參數(shù) | 聲明 | 數(shù)據(jù)類型 |
---|---|---|
SRC | Input | Variant、Array、其他(不包括Bool,Array of Bool) |
COUNT | Input | UDINT |
SRC_INDEX | Input | DINT |
DEST_INDEX | Input | DINT |
DEST | Output | Variant、Array、其他(不包括Bool,Array of Bool) |
RET_VAL | Return | INT |
MOVE_BLK_VARIANT指令通常用于將源數(shù)組SRC的部分元素傳送至目的數(shù)組DEST的部分元素中,SRC與DEST數(shù)組元素必須完全相同。COUNT是傳送的元素個(gè)數(shù),SRC_INDEX是待傳送的源數(shù)組的起始編號(hào),DEST_INDEX是目的數(shù)組接收的起始編號(hào),此處用編號(hào)不是下標(biāo)的意思是,SRC_INDEX和DEST_INDEX都從0開始,對(duì)應(yīng)SRC和DEST的第一個(gè)元素。
同樣是傳送部分?jǐn)?shù)組元素的指令,MOVE_BLK_VARIANT相對(duì)MOVE_BLK有以下優(yōu)點(diǎn):
1. SRC和DEST不可以是Bool數(shù)組,但可以是Struct、UDT等復(fù)雜數(shù)據(jù)類型數(shù)組
2. SRC和DEST都可以是普通的單個(gè)變量,例如SRC為一個(gè)INT變量,DEST作為一個(gè)INT數(shù)組,此時(shí)需要設(shè)置COUNT=1,SRC_INDEX=0,然后根據(jù)DEST_INDEX的值,傳入DEST的指定位置。
3. SRC和DEST填寫的通常是數(shù)組名,也可以是普通的單個(gè)變量,或者數(shù)組的一個(gè)元素,后兩種情況都需要像(2)一樣處理。
4. SRC和DEST可以是參數(shù)類型Variant的變量,也就是可以直接填寫P#指針的格式,指令將會(huì)把P#指針看做數(shù)組處理(原因)。即使是SRC和DEST都指向Variant類型,其指向的形參的數(shù)組元素?cái)?shù)據(jù)類型也需要相同,所以通常需要在使用指令之前用EQ_ElemType檢查其中元素的數(shù)據(jù)類型。
使用MOVE_BLK_VARIANT指令的注意:
(1)COUNT>=1,否則報(bào)錯(cuò)并且不傳送任何數(shù)據(jù)。
(2) COUNT+SRC_INDEX與COUNT+DEST_INDEX決定了SRC與DEST數(shù)組元素編號(hào)上限,超出范圍將報(bào)錯(cuò)并且不傳送任何數(shù)據(jù)。
使用舉例:
1. 實(shí)現(xiàn)功能將結(jié)構(gòu)完全一樣的M區(qū)數(shù)據(jù)送入DB區(qū)
圖18 運(yùn)行結(jié)果
需要注意的是將DB塊改為非優(yōu)化,M區(qū)和DB區(qū)均是16Byte,SRC和DEST可以是P#BYTE 16,P#WORD 8,P#DWORD 4等都可以,但是要注意COUNT和元素?cái)?shù)相同(P#BYTE 16,COUNT=16;P#WORD 8,COUNT=8;P#DWORD 4,COUNT=4),SRC和DEST結(jié)構(gòu)一致即可。
圖19 程序詳情
2. 實(shí)現(xiàn)變長(zhǎng)數(shù)組的處理
功能:FC15處理MBV類型變量,該變量作為InOut,F(xiàn)C14中輸入MBV類型變量的變長(zhǎng)數(shù)組,在其內(nèi)部判斷數(shù)組大小,然后數(shù)組元素逐個(gè)執(zhí)行FC15指令,最后送回變長(zhǎng)數(shù)組。
圖20 指令詳情
------------------------END-----------------------
審核編輯 :李倩
-
變量
+關(guān)注
關(guān)注
0文章
613瀏覽量
28306 -
move
+關(guān)注
關(guān)注
0文章
12瀏覽量
7453 -
SCL
+關(guān)注
關(guān)注
1文章
239瀏覽量
17025
原文標(biāo)題:博途: MOVE 系列指令
文章出處:【微信號(hào):gh_a8b121171b08,微信公眾號(hào):機(jī)器人及PLC自動(dòng)化應(yīng)用】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論