Schneider-施耐德LEC使用技巧文集[第12讲]——施耐德电气XBTG系列触摸屏应用中大量采集位信号的技巧1.前言在工业控制的实际应用中,触摸屏可能需要监控大量的I/O点等开关量数据,如果使用低速通讯方式(RS232/RS485)时,在触摸屏的某一页面上有几十点以上的类似数据,因通讯速度的限制,此页面的数据刷新耗时较长,可能在几秒到十几秒之间,施耐德电气的XBTG系列触摸屏与Twido、Micro及Premium等系列PLC组成的控制系统应用本文介绍的方法可以比较完美地解决这一问题。使用到的功能施耐德电气XBTG系列触摸屏的变量数组功能及脚本语言,施耐德电气PLC(Twido/Micro/Premium)的字对象的抽取位。具体描述以施耐德电气的Twido系列PLC为例进行说明,在TwidoSoft软件中对硬件进行配置如图1。在触摸屏的某一页面需要监控PLC上的所有输入/输出点,在PLC的程序中加入相应的语句,如图2所示。在此段程序中完成将输入点I0.0~I0.15共16个输入点的状态赋值给MW200,使用的是Twido的结构化对象功能,同样操作,将要在触摸屏上监控的所有变量放在MW200~MW206共7个字变量中。在XBTG触摸屏一侧,因使用Modbus协议与PLC通讯,PLC中的I/O无法被直接访问到,使用这种方法可以解决这一问题。图1图2如果在程序中有中间位变量需要用这种方式送到触摸屏中,可以分为两种情况来考虑。首先,在做PLC的程序时,将相应的位信号放入到MW中,即使用MW字变量的位抽取功能,这样可以省去图2中的赋值语句部分,用法参考图3所示。其次,如果位变量用的是M,而M是连续的且符合以下规定:%Mx:y(x必须为8的整数倍),则可以用图4中的程序段完成。图3在上面的程序段中都使用了施耐德电气的PLC所特有的功能:字变量的位抽取功能(即所有的MW字变量均可按位寻址)及变量的结构化功能。关于这些功能的进一步信息,请参考相应的手册。图4在PLC的程序中完成相应的处理后,下面进入XBTG触摸屏程序中。在触摸屏的变量表中建立与PLC关联的外部数据,如图5。图5在这一步操作中需要建立7个来自PLC的变量40201~40208,命名为MW200~MW208。再在变量表中建立内部数组变量,数组变量中的数据会直接出现在屏幕上,如图6。共需要建立7个以上对应PLC的I/O点的数组I0~I3及Q0~Q3,其中I1的数组大小定义为8(原因见脚本部分注释),其余定义为16。建立好的数组如图7。所需变量建立完毕后,在Vejio-Designer编程环境中建立一个如图8程序脚本,相应属性设置为:周期性脚本,刷新周期1秒。脚本中写入内容://-------------------------------------//ScriptCreated:月16,2004//从PLC通讯的字(MW)分解出位信号//主要用于减轻XBTG屏与PLC通讯的压力//程序编制及测试:张福,LEC,AUT,IA,Schneider//-------------------------------------intPlcInPut0,PlcInPut1,PlcInPut2,PlcInPut3;intPlcOutPut0,PlcOutPut1,PlcOutPut2;inti,BitValue;inttmp0,tmp1,tmp2,tmp3,tmp4,tmp5,tmp6;PlcInPut0=PlcData.MW200.getIntValue();//得到PLC输入I0.0~I0.15状态字PlcInPut1=PlcData.MW201.getIntValue();//得到PLC输入I0.16~I0.23状态字PlcInPut2=PlcData.MW202.getIntValue();//得到PLC输入I1.0~I1.15状态字PlcInPut3=PlcData.MW203.getIntValue();//得到PLC输入I1.16~I1.31状态字PlcOutPut0=PlcData.MW204.getIntValue();//得到PLC输入Q0.0~Q0.15状态字PlcOutPut1=PlcData.MW205.getIntValue();//得到PLC输入Q2.0~Q2.15状态字PlcOutPut2=PlcData.MW206.getIntValue();//得到PLC输入Q2.16~Q2.31状态字BitValue=1;for(i=0;i16;i++)//一个做16次循环分解为位变量{if(i==0)BitValue=1;elseBitValue=2*BitValue;//第i位tmp0=PlcInPut0&BitValue;//PLC输入字I0状态字第i位的值tmp1=PlcInPut1&BitValue;//PLC输入字I1状态字第i位的值tmp2=PlcInPut2&BitValue;//PLC输入字I2状态字第i位的值tmp3=PlcInPut3&BitValue;//PLC输入字I3状态字第i位的值tmp4=PlcOutPut0&BitValue;//PLC输出字Q0状态字第i位的值tmp5=PlcOutPut1&BitValue;//PLC输出字Q1状态字第i位的值tmp6=PlcOutPut2&BitValue;//PLC输出字Q2状态字第i位的值I0[i].write(tmp0);//将得到的I0的位状态写入数组I0[i]I2[i].write(tmp2);//将得到的I2的位状态写入数组I2[i]I3[i].write(tmp3);//将得到的I3的位状态写入数组I3[i]Q0[i].write(tmp4);//将得到的Q0的位状态写入数组Q0[i]Q1[i].write(tmp5);//将得到的Q1的位状态写入数组Q1[i]Q2[i].write(tmp6);//将得到的Q2的位状态写入数组Q2[i]if(i9)//输入状态字I1只8位有效数据(I0.16~I0.23){I1[i].write(tmp1);//将得到的I1的位状态写入数组I1[i]}}在上面的脚本程序中主要完成将来自PLC的包含了IO状态的变量字拆分,拆分后得到每一个IO点的状态,将得到的IO状态值写入到建立好的数组中。假定在触摸屏的某一页面上需要监控来自PLC的所有IO数据,画面如图8。画面中的IO状态指示均按图设置为相应的数组变量。图7经过以上步骤,在触摸屏中采集PLC上的104个IO点的程序就全部做完,采集这104个IO数据占用的通讯内容只有7个字:40201~40208,比常规方式节约通讯内容:104/7»15倍,经过实际测试,用本文介绍的方法比用直接访问PLC的位地址方式,在画面的刷新上约快7~8倍。另外,使用这种方法采集PLC的状态还有一个优点,如在程序调试中因某种原因需要改变触摸与PLC关联的变量时,只需改变40201~40208共8个地址及脚本程序中的相应部分,改动的工作量非常小。