- S7-1200 PLC应用教程
- 廖常初
- 4552字
- 2021-03-25 02:09:33
3.3 数据处理指令
本节的程序在项目“数据处理指令应用”的OB1中。
3.3.1 比较器操作指令
1.比较指令
比较指令用来比较数据类型相同的两个数IN1与IN2的大小(见图3-33),IN1和IN2分别在触点的上面和下面。操作数可以是I、Q、M、L、D存储区中的变量或常数。比较两个字符串是否相等时,实际上比较的是它们各对应字符的ASCII码的大小,第一个不相同的字符决定了比较的结果。
可以将比较指令视为一个等效的触点,比较符号可以是“==”(等于)、“<>”(不等于)、“>”“>=”“<”和“<=”。满足比较关系式给出的条件时,等效触点接通。例如当MW8的值等于-24732时,图3-33第一行左边的比较触点接通。
生成比较指令后,双击触点中间比较符号下面的问号,单击出现的按钮,用下拉式列表设置要比较的数的数据类型。数据类型可以是位字符串、整数、浮点数、字符串、TIME、DATE、TOD和DLT。比较指令的比较符号也可以修改,双击比较符号,单击出现的按钮,可以用下拉式列表修改比较符号。
图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”。
图3-34 占空比可调的脉冲发生器
3.3.2 使能输入与使能输出
在梯形图中,用方框表示某些指令、函数(FC)和函数块(FB),输入信号和输入/输出(InOut)信号均在方框的左边,输出信号均在方框的右边。梯形图中有一条提供“能流”的左侧垂直母线,图3-35中I0.0的常开触点接通时,能流流到方框指令CONV的使能输入端EN(Enable input),方框指令才能执行。“使能”有允许的意思。
如果方框指令的EN端有能流流入,而且执行时无错误,则使能输出ENO(Enable Output)端将能流传递给下一个元件(见图3-35的左图)。如果执行过程中有错误,能流在出现错误的方框指令终止(见图3-35的右图)。
图3-35 EN与ENO
“转换值”指令CONVERT在指令方框中的标示符为CONV。将指令列表中的CONVERT指令拖放到梯形图中时,CONV下面的“to”两边分别有3个红色的问号,用来设置转换前后的数据的数据类型。单击“to”前面或后面的3个问号,再单击问号右边出现的按钮,用下拉式列表设置转换前的数据的数据类型为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。
图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
图3-37 NORMX指令与SCALEX指令
图3-38 NORMX指令的线性关系
图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。
图3-40 MOVE与SWAP指令
MOVE指令允许有多个输出,单击“OUT1”前面的,将会增加一个输出,增加的输出的名称为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指令的功能相同,其区别在于前者的填充操作不会被操作系统的其他任务打断。
图3-41 填充存储区指令
4.存储区移动指令
图3-42中的I0.3(Tag 12)的常开触点接通时,“存储区移动”指令MOVE BLK将源区域数据块1的数组Source的0号元素开始的20个Int元素的值,复制给目标区域数据块2的数组Distin的0号元素开始的20个元素。COUNT为要传送的数组元素的个数,复制操作按地址增大的方向进行。
IN和OUT是待复制的源区域和目标区域中的首个元素,并不要求是数组的第一个元素。
图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)。
图3-43 移位指令
图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(发光二极管),观察彩灯的运行效果。
图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循环移位前后的数据