3.3 数据处理指令

本节的程序在项目“数据处理指令应用”的OB1中。

3.3.1 比较器操作指令

1.比较指令

比较指令用来比较数据类型相同的两个数IN1与IN2的大小(见图3-33),IN1和IN2分别在触点的上面和下面。操作数可以是I、Q、M、L、D存储区中的变量或常数。比较两个字符串是否相等时,实际上比较的是它们各对应字符的ASCII码的大小,第一个不相同的字符决定了比较的结果。

可以将比较指令视为一个等效的触点,比较符号可以是“==”(等于)、“<>”(不等于)、“>”“>=”“<”和“<=”。满足比较关系式给出的条件时,等效触点接通。例如当MW8的值等于-24732时,图3-33第一行左边的比较触点接通。

生成比较指令后,双击触点中间比较符号下面的问号,单击出现的978-7-111-57703-4-Chapter03-43.jpg按钮,用下拉式列表设置要比较的数的数据类型。数据类型可以是位字符串、整数、浮点数、字符串、TIME、DATE、TOD和DLT。比较指令的比较符号也可以修改,双击比较符号,单击出现的978-7-111-57703-4-Chapter03-44.jpg按钮,可以用下拉式列表修改比较符号。

978-7-111-57703-4-Chapter03-45.jpg

图3-33 比较指令

2.值在范围内与值超出范围指令

“值在范围内”指令INRANGE与“值超出范围”指令OUT RANGE可以等效为一个触点。如果有能流流入指令方框,执行比较,反之不执行比较。图3-33中INRANGE指令的参数VAL满足MIN≤VAL≤MAX(-3752≤MW22≤27535),或OUTRANGE指令的参数VAL满足VAL<MIN或VAL>MAX(MB20<24或MB20>124)时,等效触点闭合,指令框为绿色。不满足比较条件则等效触点断开,指令框为蓝色的虚线。

这两条指令的MIN、MAX和VAL的数据类型必须相同,可选整数和实数,可以是I、Q、M、L、D存储区中的变量或常数。

例3-3】用接通延时定时器和比较指令组成占空比可调的脉冲发生器。

T1是接通延时定时器TON的背景数据块的符号地址。"T1".Q是TON的位输出。PLC进入RUN模式时,TON的IN输入端为1状态,定时器的当前值从0开始不断增大。当前值等于预设值时,"T1".Q变为1状态,其常闭触点断开,定时器被复位,"T1".Q变为0状态。下一扫描周期其常闭触点接通,定时器又开始定时。

TON和它的Q输出"T1".Q的常闭触点组成了一个脉冲发生器,使TON的当前时间"T1".ET按图3-34所示的锯齿波形变化。比较指令用来产生脉冲宽度可调的方波,"T1".ET小于1000ms时,Q1.0为0状态,反之为1状态。比较指令上面的操作数"T1".ET的数据类型为Time,输入该操作数后,指令中“>=”符号下面的数据类型自动变为“Time”。

978-7-111-57703-4-Chapter03-46.jpg

图3-34 占空比可调的脉冲发生器

3.3.2 使能输入与使能输出

在梯形图中,用方框表示某些指令、函数(FC)和函数块(FB),输入信号和输入/输出(InOut)信号均在方框的左边,输出信号均在方框的右边。梯形图中有一条提供“能流”的左侧垂直母线,图3-35中I0.0的常开触点接通时,能流流到方框指令CONV的使能输入端EN(Enable input),方框指令才能执行。“使能”有允许的意思。

如果方框指令的EN端有能流流入,而且执行时无错误,则使能输出ENO(Enable Output)端将能流传递给下一个元件(见图3-35的左图)。如果执行过程中有错误,能流在出现错误的方框指令终止(见图3-35的右图)。

978-7-111-57703-4-Chapter03-47.jpg

图3-35 EN与ENO

“转换值”指令CONVERT在指令方框中的标示符为CONV。将指令列表中的CONVERT指令拖放到梯形图中时,CONV下面的“to”两边分别有3个红色的问号,用来设置转换前后的数据的数据类型。单击“to”前面或后面的3个问号,再单击问号右边出现的978-7-111-57703-4-Chapter03-48.jpg按钮,用下拉式列表设置转换前的数据的数据类型为16位BCD码(Bcd16),用同样的方法设置转换后的数据的数据类型为Int(有符号整数)。

在程序中用十六进制格式显示BCD码。在RUN模式用程序状态功能监视程序的运行情况。如果用监控表设置转换前MW24的值为16#F234(见图3-35的左图),最高位的“F”对应于2#1111,表示负数。转换以后的十进制数为-234,因为程序执行成功,有能流从ENO输出端流出。指令框和ENO输出线均为绿色的连续线。

也可以用鼠标右键单击图3-35中的MW24,执行出现的快捷菜单中的“修改”→“修改值”命令,在出现的“修改”对话框中设置变量的值。单击“确定”按钮确认。

设置转换前的数值为16#23F(见图3-35的右图),BCD码每一位的有效数字应为0~9,16#F是非法的数字,因此指令执行出错,没有能流从ENO流出,指令框和ENO输出线均为蓝色的虚线。可以在指令的在线帮助中找到使ENO为0状态的原因。

ENO可以作为下一个方框的EN输入,即几个方框可以串联,只有前一个方框被正确执行,与它连接的后面的程序才能被执行。EN和ENO的操作数均为能流,数据类型为Bool。

下列指令使用EN/ENO:数学运算指令、传送与转换指令、移位与循环指令、字逻辑运算指令等。

下列指令不使用EN/ENO:位逻辑指令、比较指令、计数器指令、定时器指令和部分程序控制指令。这些指令不会在执行时出现需要程序中止的错误,因此不需要使用EN/ENO。

退出程序状态监控,用鼠标右键单击带ENO的指令框,执行快捷菜单中相应的命令,可以生成ENO或不生成ENO。执行“不生成ENO”命令后,ENO变为灰色(见图3-36),表示它不起作用,不论指令执行是否成功,ENO端均有能流输出。ENO默认的状态是“不生成”。

3.3.3 转换操作指令

1.转换值指令

“转换值”指令CONVERT(CONV)的参数IN、OUT可以设置为十多种数据类型,IN还可以是常数。

EN输入端有能流流入时,CONV指令将输入IN指定的数据转换为OUT指定的数据类型。转换前后的数据类型可以是位字符串、整数、浮点数、CHAR、WCHAR和BCD码等。

图3-36中I0.3的常开触点接通时,执行CONV指令,将MD42中的32位BCD码转换为双整数后送MD46。如果执行时没有出错,有能流从CONV指令的ENO端流出。ROUND指令将MD50中的实数四舍五入转换为双整数后保存在MD54。

978-7-111-57703-4-Chapter03-49.jpg

图3-36 数据转换指令

2.浮点数转换为双整数的指令

浮点数转换为双整数有4条指令,“取整”指令ROUND用得最多,它将浮点数转换为四舍五入的双整数。“截尾取整”指令TRUNC仅保留浮点数的整数部分,去掉其小数部分。

“浮点数向上取整”指令CEIL和“浮点数向下取整”指令FLOOR极少使用。

如果被转换的浮点数超出了32位整数的表示范围,得不到有效的结果,ENO为0状态。

3.标准化指令

图3-37中的“标准化”指令NORM X的整数输入值VALUE(MIN≤VALUE≤MAX)被线性转换(标准化,或称归一化)为0.0~1.0之间的浮点数,转换结果用OUT指定的地址保存。

NORMX的输出OUT的数据类型可选Real或LReal,单击方框内指令名称下面的问号,用下拉式列表设置输入VALUE和输出OUT的数据类型。输入、输出之间的线性关系如下(见图3-38):

OUT=(VALUE-MIN)/(MAX-MIN)

4.缩放指令

图3-37中的“缩放”(或称“标定”)指令SCALEX的浮点数输入值VALUE(0.0≤VALUE≤1.0)被线性转换(映射)为参数MIN(下限)和MAX(上限)定义的范围之间的数值。转换结果用OUT指定的地址保存。

单击方框内指令名称下面的问号,用下拉式列表设置变量的数据类型。参数MIN、MAX和OUT的数据类型应相同,VALUE、MIN和MAX可以是常数。输入、输出之间的线性关系如下(见图3-39):

OUT=VALUE×(MAX-MIN)+MIN

978-7-111-57703-4-Chapter03-50.jpg

图3-37 NORMX指令与SCALEX指令

978-7-111-57703-4-Chapter03-51.jpg

图3-38 NORMX指令的线性关系

978-7-111-57703-4-Chapter03-52.jpg

图3-39 SCALEX指令的线性关系

例3-4】某温度变送器的量程为-200~850℃,输出信号为4~20mA,符号地址为“模拟值”的IW96将0~20mA的电流信号转换为数字0~27648,求以℃为单位的浮点数温度值。

4mA对应的模拟值为5530,IW96将-200~850℃的温度转换为模拟值5530~27648,用“标准化”指令NORMX将5530~27648的模拟值归一化为0.0~1.0之间的浮点数(见图3-37上面的图),然后用“缩放”指令SCALEX将归一化后的数字转换为-200~850℃的浮点数温度值,用变量“温度值”保存。

例3-5】地址为QW96的整型变量“AQ输入”转换后的DC0~10V电压作为变频器的模拟量输入值,通过变频器内部参数的设置,0~10V的电压对应的转速为0~1800rpm。求以rpm为单位的整型变量“转速”对应的AQ模块的输入值“AQ输入”。

程序见图3-37下面的图,应去掉OB1属性中的“IEC检查”复选框中的勾,否则不能将SCALE X指令输出参数OUT的数据类型设置为Int。

3.3.4 移动操作指令

1.移动值指令

“移动值”指令MOVE(见图3-40)用于将IN输入端的源数据传送给OUT1输出的目的地址,并且转换为OUT1允许的数据类型(与是否进行IEC检查有关),源数据保持不变。IN和OUT1的数据类型可以是位字符串、整数、浮点数、定时器、日期时间、CHAR、WCHAR、STRUCT、ARRAY、IEC定时器/计数器数据类型、PLC数据类型,IN还可以是常数。

可用于S7-1200 CPU的不同数据类型之间的数据传送见MOVE指令的在线帮助。如果输入IN数据类型的位长度超出输出OUT1数据类型的位长度,则源值的高位会丢失。如果输入IN数据类型的位长度小于输出OUT1数据类型的位长度,目标值的高位会被改写为0。

978-7-111-57703-4-Chapter03-53.jpg

图3-40 MOVE与SWAP指令

MOVE指令允许有多个输出,单击“OUT1”前面的978-7-111-57703-4-Chapter03-54.jpg,将会增加一个输出,增加的输出的名称为OUT2,以后增加的输出的编号按顺序排列。用鼠标右键单击某个输出的短线,执行快捷菜单中的“删除”命令,将会删除该输出参数。删除后自动调整剩下的输出的编号。

2.交换指令

IN和OUT为数据类型Word时,“交换”指令SWAP交换输入IN的高、低字节后,保存到OUT指定的地址。IN和OUT为数据类型Dword时,交换4个字节中数据的顺序,交换后保存到OUT指定的地址(见图3-40)。

3.填充存储区指令

生成“数据块1”(DB3)和“数据块2”(DB4),在DB3中创建有40个Int元素的数组Source,在DB4中创建有40个Int元素的数组Distin。

图3-41中的“Tag 13”(I0.4)的常开触点接通时,“填充存储区”指令FILL BLK将常数3527填充到数据块1中的数组Source的前20个整数元素中。

“不可中断的存储区填充”指令UFILL BLK与FILL BLK指令的功能相同,其区别在于前者的填充操作不会被操作系统的其他任务打断。

978-7-111-57703-4-Chapter03-55.jpg

图3-41 填充存储区指令

4.存储区移动指令

图3-42中的I0.3(Tag 12)的常开触点接通时,“存储区移动”指令MOVE BLK将源区域数据块1的数组Source的0号元素开始的20个Int元素的值,复制给目标区域数据块2的数组Distin的0号元素开始的20个元素。COUNT为要传送的数组元素的个数,复制操作按地址增大的方向进行。

IN和OUT是待复制的源区域和目标区域中的首个元素,并不要求是数组的第一个元素。

978-7-111-57703-4-Chapter03-56.jpg

图3-42 存储区移动指令

“不可中断的存储区移动”指令UMOVEBLK(见图3-42)与MOVEBLK指令的功能基本上相同,其区别在于前者的复制操作不会被操作系统的其他任务打断。

3.3.5 移位与循环移位指令

1.移位指令

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

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

移位位数N为0时不会移位,但是IN指定的输入值被复制给OUT指定的地址。

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

如果移位后的数据要送回原地址,应将图3-43中I0.5的常开触点改为I0.5的扫描操作数的信号上升沿指令(P触点),否则在I0.5为1状态的每个扫描周期都要移位一次。

右移n位相当于除以2n,将十进制数-200对应的二进制数2#1111111100111000右移2位(见图3-43和图3-44),相当于除以4,右移后的数为-50。

左移n位相当于乘以2n,将16#20左移2位,相当于乘以4,左移后得到的十六进制数为16#80(见图3-43)。

978-7-111-57703-4-Chapter03-57.jpg

图3-43 移位指令

978-7-111-57703-4-Chapter03-58.jpg

图3-44 数据的右移

2.循环移位指令

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

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

在图3-45的8位循环移位彩灯控制程序中,QB0是否移位用I0.6来控制,移位的方向用I0.7来控制。为了获得移位用的时钟脉冲和首次扫描脉冲,在组态CPU的属性时,设置系统存储器字节和时钟存储器字节的地址分别为默认的MB1和MB0(见图1-17),时钟存储器位M0.5的频率为1Hz。PLC首次扫描时M1.0的常开触点接通,MOVE指令给QB0(Q0.0~Q0.7)置初始值7,其低3位被置为1。

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

978-7-111-57703-4-Chapter03-59.jpg

图3-45 使用循环移位指令的彩灯控制器

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

3-3QB0循环移位前后的数据

978-7-111-57703-4-Chapter03-60.jpg