首页 理论教育 数据传送指令详解:MOVE指令

数据传送指令详解:MOVE指令

时间:2023-06-29 理论教育 版权反馈
【摘要】:图5.20数据块传送指令除了IN不能取常数外,指令MOVE_BLK和FILL_BLK的参数的数据类型和存储区基本上相同。图5.21数据块中的部分数据接通I0.3的常开触点MOVE_BLK与UMOVE_BLK指令被执行,DB3中的数组Source的前40个元素被传送给符号名为DB_2的DB4中的数组Distin的前40个元素。

数据传送指令详解:MOVE指令

1.MOVE指令

MOVE指令(见图5.17)用于将IN输入端的源数据复制给OUT1输出的目的地址,并且转换为OUT1指定的数据类型,源数据保持不变。IN和OUTl可以是Bool之外的所有的基本数据类型,和数据类型DTL、Struct和Array。IN还可以是常数。

图5.17 MOVE与SWAP指令

同一条指令的输入参数和输出参数的数据类型可以不相同,例如,可以将MB0中的数据传送到MW2。如果将MW4中超过255的数据传送到MB6,则只是将MW4的低位字节(MB5)中的数据传送到MB6,应避免出现这种情况。

2.SWAP指令

IN和OUT为数据类型Word时,SWAP指令交换输入IN的高、低字节后,保存到OUT指定的地址。

IN和OUT为数据类型Dword时,交换4个字节中数据的顺序,交换后保存到OUT指定的地址(见图5.17)。

3.全局数据块与数组

块传送指令用于传送数据块中的数组的多个元素。为此,首先应生成全局数据块和数组。数组由相同数据类型的多个元素组成,数组元素的数据类型可以是所有的基本数据类型。

点击项目树中PLC的“程序块”文件夹中的“添加新块”,添加一个新的块。在打开的对话框中(见图5.18),点击“数据块”按钮,生成一个数据块,可以修改其名称或采用默认的名称,其类型为默认的“全局 DB”,生成方式为默认的“自动”。点击“确认”按钮后自动生成数据块。

图5.18 添加数据块与数据块中的数组

如果用单选框选中“手动”,可以修改块的编号。在属性中,选中复选框优化的块访问”,只能用符号地址访问生成的块中的变量,不能使用绝对地址。这种访问方式可以提高存储器的利用率。

选中下面的复选框“添加新对象并打开”,生成新的块之后,它将会被自动打开。

在数据块的第 2 行的“名称”列(见图 5.18),输入数组(Array)的名称“Source”,点击“数据类型”列中的按钮,选中下拉式列表中的数据类型“Array[lo..hi] of type”。其中的“lo(low)”和“hi(high)”分别是数组元素的编号(下标)的上限值和下限值,最大范围为[-32768..32767],下限值应小于等于上限值。

将“Array[lo..hi] of type”修改为“Array[0..39] of Int”(见图5.18),其元素的数据类型为Int,元素的编号为0~39。S7-1200只能生成一维数组。

用同样的方法生成数据块DB4,在DB4中生成有40个Int元素的数组Distin。

在用户程序中,可以用符号地址“数据_块_1”.Source[2]或绝对地址DB3.DBW4访问数组中下标为2的元素。

4.FILL_BLK与UFILL_BLK指令

FILL_BLK指令将输入参数IN设置的值填充到输出参数OUT指定起始地址的目标数据区(见图5.19),IN和OUT必须是D、L(数据块或块的局部数据区)中的数组元素,IN还可以是常数。COUNT为填充的数组元素的个数,数据类型为DInt或常数。图5.19中I0.4的常开触点接通时,常数3527被填充到DB3的DBW0开始的20个字中。

FILL_BLK与UFILL_BLK指令的功能基本上相同,其区别在于后面的填充操作不会被其他操作系统的任务打断。当执行该指令时,CPU的报警响应时间将会增大。

值得注意的是,指令UFILL_BLK的起始地址DB3.DBW40中的40是数据块中字节的编号,而输入参数COUNT是以字为单位的数组元素的个数。指令FILL_BLK已占用了 40B(即20个字)的数据,因此UFILL_BLK指令的输出OUT指令的地址区从DBW40开始。

图5.19 数据填充指令

5.MOVE_BLK与UMOVE_BLK指令

图5.20中的MOVE_BLK指令用于将数据块DB3中的数组Source的0号元素开始的20个Int元素的值,复制给数据块DB4的数组Distin的0号元素开始的20个元素。COUNT为要传送的数组元素的个数,复制操作按地址增大的方向进行。

图5.20 数据块传送指令

除了IN不能取常数外,指令MOVE_BLK和FILL_BLK的参数的数据类型和存储区基本上相同。

指令UMOVE_BLK与MOVE_BLK的功能基本上相同(见图5.20),区别在于前者的复制操作不会被其他操作系统的任务打断。执行该指令时,CPU的报警响应时间将会增大。(www.xing528.com)

6.块填充与块传送指令的实验

将图5.19和图5.20中的程序下载到CPU,切换到RUN模式后,双击打开指令树中的DB3和DB4。单击工具栏上的按钮,启动扩展模式,显示各数组元素。点击按钮,启动监视,“监视值”列是CPU中的变量值。

因为没有设置保持(Retain)功能,数组元素的初始值均为0,此时DB3和DB4的各数组元素的值均为0。

接通I0.4的常开触点,FILL_BLK与UFILL_BLK指令被执行,DB3中的数组元素Source[0] ~Source[19]被填充数据3527,Source[20] ~Source[39]被填充数据32153,如图5.21所示为传送给DB3的部分数据。

图5.21 数据块中的部分数据

接通I0.3的常开触点MOVE_BLK与UMOVE_BLK指令被执行,DB3中的数组Source的前40个元素被传送给符号名为DB_2的DB4中的数组Distin的前40个元素。

5.2.5 移位与循环移位指令

1.移位指令

移位指令SHR和SHL将输入参数IN指定的存储单元的整个内容逐位右移或左移若干位,移位的位数用输入参数N来定义,移位的结果保存在输出参数OUT指定的地址。

无符号数移位和有符号数左移后空出来的位用0填充。有符号数右移后空出来的位用符号位(原来的最高位)填充,正数的符号位为0。负数的符号位为l。

移位位数N为0时不会移位,但是IN指定的输入值被复制给OUT指定的地址。如果N大于被移位存储单元的位数,所有原来的位部被移出后,全部被0或符号位取代。移位操作的ENO总是为1状态。

将指令列表中的移位指令拖放到梯形图后,点击方框内指令名称下面的问号。用下拉式列表设置变量的数据类型。

如果移位后的数据要送回原地址,应将图5.22中I0.5的常开触点改为I0.5的上升沿检测触点(P触点),否则在I0.5为l的每个扫描周期都要移位一次。

右移n位相当于除以2n,例如,将十进制数-200对应的二进制数2#1111 1111 0011 1000右移2位(见图5.22和图5.23),相当于除以4,右移后得到的二进制数2#1111 1111 1100 1110对应于十进制数-50。

图5.22 移位与循环指令

图5.23 数据的右移

左移n位相当于乘以2n,例如将16#20左移2位,相当于乘以4,左移后得到的十六进制数为 16#80(见图5.22)。此结论只适用于该数左移时被溢出舍弃的高位中不包含 1 的情况。

2.循环移位指令

循环移位指令ROR和ROL将输入参数IN指定的存储单元的整个内容逐位循环右移或循环左移若干位,即移出来的位又送回存储单元另一端空出来的位,原始的位不会丢失。移位的结果保存在输出参数OUT指定的地址。n为0时不会移位,但是IN指定的输入值复制给OUT指定的地址。移位位数n可以大于被移位存储单元的位数,执行指令后,ENO总是为l状态。

3.使用循环移位指令的彩灯控制器

在如图5.24所示的8位循环移位彩灯控制程序中,QB0是否移位用I0.6来控制,移位的方向用I0.7来控制。为了获得移位用的时钟脉冲和首次扫描脉冲,在组态CPU的属性时,设置系统存储器字节地址和时钟脉冲地址分别是默认的MB1和MB0,时钟脉冲位M0.5的频率为1 Hz。

PLC首次扫描时Ml.0的常开触点接通,MOVE指令给QB0(Q0.0~Q0.7)置初值7,其低3位被置为1。

输入、下载和运行彩灯控制程序,通过观察CPU模块上与Q0.0~Q0.7对应的LED(发光二极管),观察彩灯的运行效果。

I0.6为l状态时,在时钟脉冲位M0.5的上升沿,指令P_TRIG输出一个扫描周期的脉冲。如果此时I0.7为1状态,执行一次ROR指令,QB0的值循环右移1位。如果I0.7为0状态,执行一次ROL指令,QB0的值循环左移l位。表5.4是QB0循环移位前后的数据。因为QB0循环移位后的值又送回QB0,循环移位指令的前面必须使用P_TRIG指令,否则每个扫描循环周期都要执行一次循环移位指令,而不是每秒移位一次。

图5.24 使用循环移位指令的彩灯控制器

表5.4 QBO循环移位前后的数据

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈