MOVE
LAD为MOVE指令,SCL使用":="表达式可以完成MOVE的功能(“:=”还可以有其他功能)。
MOVE指令是当EN条件满足时,实现相同数据类型(不包括位、字符串、Variant类型)的变量间的传送。
图1指令位置
注意:
(1)LAD传送字符串需要使用S_MOVE指令(SCL使用“:=”),但是传送字符串中的字符需要使用MOVE指令。
(2)支持通过一个MOVE指令将一个变量传送到多个变量,但是该功能不支持传送复杂数据类型(DTL、结构、数组等)或字符串中的字符。
(3)传送数组时,要求元素数据类型以及元素个数必须完全一样,数组限值可以不同,例如Array[0..1] of Byte可以MOVE到Array[1..2] of Byte。
(4)如果MOVE两边是基本数据类型,则可以在满足以下兼容条件时传送,参见表1。
表1 MOVE的传送条件
传送源 (IN)
传送目标(OUT1)
进行 IEC 检查不进行 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 UIN
字符串长度超出T 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
注意:
1.如果输入 IN 数据类型的位长度超出输出 OUT 数据类型的位长度,则源值的高位会丢失。如果输入 IN 数据类型的位长度低于输出 OUT 数据类型的位长度,则目标值的高位会被改写为0。
2.REAL传送至DWORD时是按位传送,不是取整。如果需要取整,可以使用ROUND、CONVERT_REAL_TO_DINT等指令。
3.(不)进行IEC检查是指,在MOVE指令所在的OB/FC/FB属性中的"IEC检查"选项,仅在此块中生效。默认的"IEC检查"不激活。设置如图2所示。
图2 IEC检查的设置
MOVE的使用
图3 DB25
1. 单个基本类型变量的传送
图4单个基本类型变量的传送
2. 数组的传送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中的字符
图5 数组的传送
3. UDT的传送
图6 UDT的传送
4. String中的字符的传送
图7 String中的字符的传送
5. DTL中的变量的传送
图8 DTL中的变量的传送
6. DB整体之间的传送
条件:DB块为非优化块,或者将优化DB块的存储器预留区域与预留可保持性存储器设置为0字节(如图9所示),并且两个DB块结构完全相同。
图9存储器预留区域设置
图10 DB整体传送
图11 DB整体传送程序
(U)MOVE_BLK
LAD和SCL均为(U)MOVE_BLK指令。
(U)MOVE_BLK指令是当EN条件满足时,实现相同数组之间部分元素的传送。MOVE_BLK和UMOVE_BLK的区别是UMOVE_BLK不会被中断打断,并且最多16kB的数据量。
图12 程序位置
图13指令详情
注意:
1. IN和OUT必须是数组的一个元素,例如"DB26".Static_1[0],不能是常数、常量、普通变量,也不能是数组名。
2. IN和OUT类型必须完全相同,并且必须是基本数据类型,不能是UDT、Struct等的数组。
3. IN是源数组中传送的起始元素,OUT是目的数组中接收的起始元素。
4. COUNT是传输个数,可以是正整数的常数,如果是变量,数据类型支持USINT、UINT、UDINT。
5.如果目的数组接收区域小于源数组的传送区域,则只传送目的数组可接收的区域的数据。如果激活指令的ENO功能,则ENO=False。
(U)MOVE_BLK的使用
实现功能:将"DB26".Static_1[0]开始的4个元素传送至"DB26".Static_2[4]开始的数组中。
图14 程序使用
图15 运行结果
MOVE_BLK_VARIANT
LAD和SCL均为MOVE_BLK_VARIANT指令。
MOVE_BLK_VARIANT的基本功能是数组之间部分元素的传送,并且是可以处理Variant类型的变量的指令之一,适合处理Variant 指向的变长数组。
从TIA V13SP1,S7-1200 V4.0开始支持该指令。
图16 指令位置

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。