块移动指令包括两个:MOVE_BLK和MOVE_BLK_VARIANT,实际项目中都经常被用到。比如设备作业结果的存储及显示功能就需要用到块移动指令。通常采用这种逻辑:首先创建一个数据块,在其中创建一个定长数组(比如可存放100条记录)。每次设备作业流程结束后,将流程结果的数据作为一条记录存放到数组中。当需要查看某次作业结果的数据时,从数组中读取相关的数据拷贝到临时变量或某个特定变量中即可。这类存储功能一般使用MOVE_BLK_VARIANT指令,因为它可以拷贝结构体数据类型(设备流程结果一般内容比较多,比如包括压力、温度、时间等等,多数采用结构体变量存储),而MOVE_BLK指令只能拷贝基础数据类型(整数、实数等)。数据的写入及读取要设定相应的指针变量,实际应用中经常因为指针错误导致读写错误。今天这篇文章我们介绍一下MOVE_BLK_VARIANT指令在使用中应注意的问题。
MOVE_BLK_VARIANT指令位于【指令】任务卡的【基本指令】→【移动操作】中,使用梯形图或功能块图编程时可以在这个位置将其拖放到函数或函数块中。使用SCL语言编程时,可以直接输入"MOVE"编辑器会自动提示,如下图所示:
指令添加后的初始状态如下图所示:
指令参数含义如下:
- SRC:可变(Variant)数据类型。源数据,可以是数组或结构体复杂数据类型;
- COUNT:无符号双整数(UDINT),要拷贝的记录条数;
- SRC_INDEX:双整数(DINT),源数据的索引;
- DEST_INDEX:双整数(DINT),目标数据的索引;
- DEST:可变(Variant)数据类型。目标数据,即源数据要拷贝到的目标区域;
说明:
- 无论数组的上、下限是如何定义,源数据和目标数据的索引都是从0开始计算的;
- 如果源数据或目标参数不是数组,则其相应的索引值应为0;
举个例子:
假设存储数组data的定义如下:
data[1..100] of typeResult//typeResult是用户自定义数据类型假设过程结果存放在变量tmpResult中。第一次将过程结果存放到存储区数组中的代码如下:
#return_value:=MOVE_BLK_VARIANT(SRC := #tmpResult, COUNT := 1, SRC_INDEX := 0, DEST_INDEX := 0, DEST => "db_storage".data);注意这里“DEST_INDEX”的值为0,而数据则存放在数组的第一个元素中。由于该数组的下限为1,所以存放在data[1]中。假设定义的存放数据为data[10..110],则存放第一条记录的“DEST_INDEX”的值仍然为0,由于该数组的下限为10,因此数据存放在data[10]中。
实际应用中需要定义写指针变量,随着存入次数的变化修改写指针的值,从而存放到数组的不同位置中。为了防止数据重复写入,存储应在沿信号时进行。
基于上述描述我写了一个简单的数据写入代码,变量定义如下图所示:
代码如下图所示:
这段代码我已经测试过了,包括数据写满后的情况,如下图所示:
这篇文章最核心的内容就是大家在使用MOVE_BLK_VARIANT指令时要记住其SRC_INDEX和DEST_INDEX的计算是从0开始的。感兴趣的小伙伴可以把上述的代码进行完善,然后完成数据读取的代码。
|