版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 OPC工具箱作OPC客户端的应用研究邹绍云武汉理工大学湖北武汉430063e-mail: HYPERLINK mailto:Z Z摘要本文分析了OPC工具箱的工作原理,并利用OPC工具箱实现对OPC服务器包含项的值的读写操作。关键字:MATLABOPC服务器OPC工具箱AbstractThispaperanalyzestheworkingprincipleofOPCToolbox,andachievesreadingfromorwritingtoOPCserver.KeyWords:MATLABOPCServerOPCToolbox绪论OPC工具箱扩展了MATLAB工具箱仿真功能,使MATL
2、AB能够和OPC服务器相互交换数据。OPC工具箱可以从符合OPC基金会数据存取标准的设备中读、写、记录OPC数据,如分布式控制系统、监督控制系统和数据采集系统,以及可编程逻辑控制器(PLC)。OPC工具箱使MATLAB和仿真器(Simulink)相应OPC服务器或工具箱初始化事件,如关机、服务器错误或项值改变。化学、制药、发电及其它连续制造工业的工程师应用OPC工具箱输入设备数据到MATLAB里进行分析、可视化、仿真和快速原形算法。OPC工具箱使仿真模型能方便地应用于在线监控软件和控制器测试软件。本次仿真采用KEPWare.KEPServerEx.V4作为OPC服务器,模拟从编程逻辑控制器(P
3、LC)读取和写入数据,并通过返回的数据绘出图形。1OPC通讯技术简介OPC(用于过程控制的OLE)规范是由OPC基金会建立的硬件和软件接口标准,它基于现有的OLE、组件对象模型COM(ComponentObjectModel)和分布式组件对象模型DCOM(DistributedCOM)技术,已得到越来越多的硬件和软件制造商的承认和支持,成为事实上的国际标准。1OPC通讯技术免去了硬件生产厂家为各种应用软件编写单独的驱动程序的重复劳动,使各种软、硬件组成的复杂系统能够可靠地交换数据并稳定地运行。OPC采用客户端/服务器结构。OPC通讯包含三类对象:服务器(Server)、组(Group)和数据项
4、(Item),其层次模型如图1所示。图1OPC对象层次模型2OPC工具箱的基本工作原理(1)搜索可用的opc服务器为了建立与OPC服务器的连接,首先要知道OPC服务器的ID及其所在的主机名。1)在本地计算机上查询所有可用的OPC服务器。hostInfo=opcserverinfo(localhost)得到结果如下:hostInfo=Host:localhostServerID:1x4cellServerDescription:1x4cellOPCSpecification:DA2DA2DA2DA2ObjectConstructor:1x4cell其中,Host:localhost表明搜索到的O
5、PC服务器在本地计算机上;ServerID:1x4cell表明在本地计算机上搜索到四个OPC服务器。四个OPC服务器所遵循的OPC规范都是DA2.0。ObjectConstruetor是指四个OPC服务器的制造商。2)验证返回的OPC详细信息:将OPC服务器ID信息赋值给allSevers数组allServers=hostInfo.ServerID执行结果如下:allServers=Matrikon.OPC.TI5.1KEPware.KEPServerEx.V4Takebishi.Melsec.1OPC.SimaticHMI.HmiRTm.1本次仿真所用的OPC服务器是KEPware.KEPS
6、erverEx.V4。创建一个OPC数据访问客户端对象获得主机名称和OPC服务器ID后与OPC服务器进行连接,需要创建一个与服务器相对应的opcda(OPC数据访问)对象,其代码如下:da=opcda(localhost,KEPware.KEPServerEx.V4)这样就建立了一个与KEPware.KEPServerEx.V4对应的OPC数据访问对象。da=SummaryofOPCDataAccessClientObject:localhost/KEPware.KEPServerEx.V4ServerParametersHost:localhostServerID:KEPware.KEPSe
7、rverEx.V4Status:disconnectedTimeout:10seconds从上面执彳丁结果可以看到Status:disconnected,也就是还没有与OPC服务器建立连接。建立MATLAB与指定OPC服务器之间的连接连接服务器connect(da)显示客户端信息,确认客户端已经建立了连接da执丁结果如下:SummaryofOPCDataAccessClientObject:localhost/KEPware.KEPServerEx.V4ServerParametersHost:localhostServerID:KEPware.KEPServerEx.V4Status:con
8、nectedTimeout:10secondsObjectParametersGroup:0-by-1dagroupobjectEventLog:0of1000events从执彳丁结果Status:connected可以看出,OPC客户端,也就是matlab与服务器建立了连接。浏览服务器的命名空间1)依据KEPware.KEPServerEx.V4服务器中已经存在的项,通过部分匹配查找出所有需要的OPC项。KepItems=serveritems(da,*Channel_1.Device_1.Tag*)执丁结果如下:KepItems=Channel_1.Device_1.Tag_1Channe
9、l_1.Device_1.Tag_2Channel_1.Device_1.Tag_3执行结果显示了所有包含Channel_1.Device_1.Tag字符串的OPC变量。2)将需要的OPC项名存储到数组itmIDs中itmIDs=Channel_1.Device_1.Tag1,Channel_1.Device_1.Tag2,Channel_1.Device_1.Tag3;本次仿真的三个项模拟PLC的模拟量,是整型数据。创建一个OPC数据访问组对象grp=addgroup(da,Group1)将项添加到组对象中创建组后才能够添加项,下面将步骤四中定义的项(itmIDs)全部添加到创建的组对象(g
10、rp)中。itmCollection=additem(grp,itmIDs)执行后itmCollection数组中存放着Group1中所有项的集合。配置OPC工具箱的属性用SET命令配置OPC工具箱的属性,用GET命令取回其属性。下面的代码是在两分钟内,每隔0.2秒登入一次数据,numRecords是登入数据的次数。logDuration=2*60;logRate=0.2;numRecords=ceil(logDuration./logRate)配置组对象属性,使其能获取所有的数据。set(grp,UpdateRate,logRate,RecordsToAcquire,numRecords);
11、从OPC服务器中获取数据调用START函数获取数据。为了在程序继续往下执行前得到所有的数据,调用WAIT函数。start(grp)wait(grp)上面语句执行后,数据都登入到了内存里面,需要从OPC工具箱引擎里取回。因为读取上来的数据是时间序列数据,需要将读取上来的数据存储到各个独立的数组中。logIDs,logVal,logQual,logTime,logEvtTime=getdata(grp,double);查看工作区间中各个数据的大小whoslog*(9)绘制数据图形下列代码将数据图形绘制在一条坐标轴上,数据格式标记(DATETICK)函数将X轴标记转换成格式化数据字符串。plot(l
12、ogTime,logVal);axistightdatetick(x,keeplimits)legend(logIDs)图1模拟量数据绘制结果上图注释框控标出红线是Tag1的数据值变化曲线,绿线是Tag2的数据值变化曲线,蓝线是Tag3的数据值变化曲线。通过上图尚不能判断所得数据的品质,所以通过下面的一段代码将品质不好的数据点用红色标出,品质不确定的数据用橙色标出。holdonisBadQual=strncmp(logQual,Bad,3);isRepeatQual=strncmp(logQual,Repeat,6);fork=1:size(logQual,2)badInd=isBadQual
13、(:,k);plot(logTime(badInd,k),logVal(badInd,k),ro,.MarkerFaceColor,r,MarkerEdgeColor,k)repInd=isRepeatQual(:,k);plot(logTime(repInd,k),logVal(repInd,k),ro,.MarkerFaceColor,0.80.50,MarkerEdgeColor,k)endholdoff图2数据品质标志结果由于所有的数据品质良好,所以没有显示标识红点或橙色点。(10)清除结束OPC工具箱对象后必须将其从OPC工具箱引擎中删除,并自动删除组对象和项对象。disconnec
14、t(da)delete(da)清除组对象isvalid(grp)从工作区间清除项的集合cleardagrpitmCollection以上分析的是MATLAB从OPC服务器读取某个组中所有项的字段值,并用图形显示ItemID、Value、Quality、TimeStamp的全过程,及其使用的底层代码的分析。其M文件代码见附录1。3.OPC工具箱的数据交换同步读写用OPC工具箱的同步读写操作与OPC服务器交换数据。与OPC服务器建立连接并建立相关对象da=opcda(localhost,KEPware.KEPServerEx.V4);connect(da);grp=addgroup(da,Grou
15、p1);itmIDs=Channel_1.Device_1.Tag_1,.Channel_1.Device_1.Tag_2,.Channel_1.Device_1.Tag_3;itmCollection=additem(grp,itmIDs);执行同步读操作默认读操作从OPC服务器的高速缓存中获取数据。1)读一个值r=read(itmCollection(1)执行结果如下:r=ItemID:Channel_1.Device_1.Tag_1Value:1004Quality:Good:Non-specificTimeStamp:2010611184539.4680Error:2)读全部值r=re
16、ad(itmCollection)执行结果如下:r=3x1structarraywithfields:ItemIDValueQualityTimeStampError查看项的具体数值r(1).Value执行结果为:ans=3305当OPC服务器在网络上或不在本地上时,从设备读取数据将花费更多的时间。从设备被读取数据时,要将数据源指定为device。r=read(itm1,device)执行同步写操作1)给一个项赋值0write(itmCollection(1),0)再将数据读取回来r=read(itmCollection(1)执行结果:r=ItemID:Channel_1.Device_1.T
17、ag_1Value:6Quality:Good:Non-specificTimeStamp:201061184933.4060Error:从执行结果可以看到其Value值由3350这样的大数值变成了6,这是因为这个项的值是自动线性增长,当写入值0再读回来的间隙增长到6了,但是仍可判断出写操作是成功执行了的。2)给多个项赋值write(itmCollection,0,0,0)清除disconnect(da)delete(da)cleardagrpitmCollection3.2从OPC服务器采集数据创建OPC工具箱对象层次结构da=opcda(localhost,KEPware.KEPServe
18、rEx.V4);connect(da);itmIDs=Channel_1.Device_1.Tag_1,.Channel_1.Device_1.Tag_2,.Channel_1.Device_1.Tag_3;grp=addgroup(da,Group1);itmCollection=additem(grp,itmIDs);配置数据采集持续时间Set(grp,UpdateRate,0.2);Set(grp,RecordsToAcquire,40);配置数据采集目标数据被采集到磁盘和内存。磁盘文件名是LoggingExample.olf,如果该文件名已存在,那么该文件原有的数据会被OPC工具箱引擎
19、采集上来的数据覆盖。set(grp,LoggingMode,disk&memory);set(grp,LogFileName,LoggingExample.olf);set(grp,LogToDiskMode,overwrite);开始采集数据启动组对象,等待两秒钟,并显示最后获取的数据值。start(grp)pause(2)sPeek=peekdata(grp,1)显示项的ID和值disp(sPeek.Items.ItemID;sPeek.Items.Value);等待数据采集完成后,才继续执行后面的代码。wait(grp,inf)获取数据logIDs,logVal,logQual,logT
20、ime,logEvtTime=getdata(grp,double);whoslog*;清除disconnect(da)delete(da)cleardagrpitmCollection4OPC工具箱的事件查看事件创建OPC工具箱对象层次结构da=opcda(localhost,KEPware.KEPServerEx.V4);connect(da);itmIDs=Channel_1.Device_1.Tag_1,.Channel_1.Device_1.Tag_2,.Channel_1.Device_1.Tag_3;grp=addgroup(da,Group1);itmCollection=ad
21、ditem(grp,itmIDs);开始数据采集将数据采集数设定为10条,并开始采集grp.RecordsToAcquire=10;start(grp)等待数据采集完毕wait(grp)查看事件日志在组对象采集数据时产生了两个事件:开始和停止。客户端的时间日志属性值是一行二列的事件型数组。events=da.EventLog列出记录在事件日志中的事件类型events.Type使用事件结构中的字段获取特定事件的信息。下面代码显示了停止事件的信息。stopdata=events(2).Data用停止时间减去开始时间,得到采集数据用掉的时间。loggingDuration=datenum(event
22、s(2).Data.LocalEventTime)-.datenum(events(1).Data.LocalEventTime);loggingSeconds=loggingDuration*24*60*60清除disconnect(da)delete(da)cleardagrpitmCollection使用默认回传创建OPC工具箱对象层次结构da=opcda(localhost,KEPware.KEPServerEx.V4);connect(da);itmIDs=Channel_1.Device_1.Tag_1,.Channel_1.Device_1.Tag_2,.Channel_1.De
23、vice_1.Tag_3;grp=addgroup(da,Group1);itmCollection=additem(grp,itmIDs);配置数据采集参数grp.RecordsToAcquire=20;grp.UpdateRate=0.5;配置回传用默认数据回传显示在数据采集过程中的开始、数据获取、停止事件。grp.StartFcn=opccallback;grp.StopFcn=opccallback;grp.RecordsAcquiredFcn=opccallback;grp.RecordsAcquiredFcnCount=5;开始数据采集start(grp)执行结果:OPCStart
24、eventoccurredatlocaltime15:35:47GroupGroup1:0recordsacquired.等待数据采集完毕wait(grp)清除disconnect(da)delete(da)cleardagrpitmCollection4.3使用自定义回传使用自定义回传,用display_opcdata函数将获取的数据实时绘制在图形窗口中。创建OPC工具箱对象层次结构da=opcda(localhost,KEPware.KEPServerEx.V4);connect(da);itmIDs=Channel_1.Device_1.Tag_1,.Channel_1.Device_1
25、.Tag_2,.Channel_1.Device_1.Tag_3;grp=addgroup(da,Group1);itmCollection=additem(grp,itmIDs);设置相关参数值设置数据更新速率为0.2秒,要获取的数据为200条,每5秒钟执行一次回传。set(grp,UpdateRate,0.5);set(grp,RecordsToAcquire,200);set(grp,RecordsAcquiredFcnCount,5);set(grp,RecordsAcquiredFcn,display_opcdata);获取数据start(grp)wait(grp)执行结果为动态绘制
26、变量曲线的图形窗口,下图是执行结束时的图片。图3自定义数据回传结束时数据图(4)清除disconnect(da)delete(da)cleardagrpitmCollection5.使用OPC工具箱模块读写数据在MATLAB的Simulink工具箱中,已经有OPC配置模块、OPC读取数据模块、OPC写入数据模块。OPCWrite模块将输入信号写入到OPC服务器中,OPCRead模块将数据从OPC服务器中读取上来,并在Scope中显示。另外,数据品质显示在Display模块中,如果数值为192就说明数据品质好。只要建立适当的模型就可以完成对OPC服务器中数据的读写操作,并可以利用其他仿真工具完成
27、复杂的控制。本次仿真采用KEPWare.KEPServerEx.V4作为OPC服务器,模拟从编程逻辑控制器(PLC)读取和写入数据,并通过返回的数据绘出图形。首先设置“OPC配置模块参数”选择OPC服务器KEPWare.KEPServerEx.V4。OPCConfigReal-TimeOPCConfiguration图4OPC服务器配置(1)数字量写与读使用KEPWare.KEPServerEx.V4中的数字量Channel_1.Device_1.K0.0作为数字量变量。首先利用“OPC写模块”将数值在0、1间变换的方波信号写入OPC服务器中并赋值给Channel_l.Device_l.K0.
28、0,然后再将该变量的值从OPC服务器重读取出来,如图5所示。Cisplsyl图5数字量写与读运行图5所示模型后会得到图6所示结果。图6显示,OPC服务器中的变量值随着方波信号改变了,并且写进去1后,变量值变为-1。其中,0值表示False,-1表示True。(2)短整型数据写与读首先在OPC服务器中建立一个Short型变量Channel_l.Device_l.TagK2。然后将一个整型常量20写入给该项,再将该项的值读取出来。图7短整型数据写与读图8短整型数据读取结果运行后,可以从图8中看到该整型变量的值已经变成了20。浮点型数据写与读首先在OPC服务器中建立一个浮点型变量Channel_l.
29、Device_l.TagK4Float。然后将一个正弦信号写入到该项,再将该项的值读取上来,并将原正弦信号与采集上来的数据同时输出给Scope3。Ch3nne.K4Fl2-3tQTScDpeB152|OPCRead2Display图9浮点型数据写与读图10浮点型数据读取结果运行后,黄色光滑连续曲线是原正弦信号,紫色不光滑曲线是读取上来的数值。从图中可以看到,紫色曲线滞后黄色曲线一个固定的相位差,说明读取上来的是先前写下去的某个值。参考文献胡剑行,陈冲,基于OPC技术的MATLAB实时过程控制系统J.福州大学学报,2008-9,36:36张昆,段其昌,张从力MATLAB与PLC之间的通讯技术J.自动化技术与应用,2005,24(12):54-55郭发军,邹丽,王艳娟基于OPCActiveX组件MATLAB作为客户端应用研究J.科技资讯,2006:52刘志鸿,杨传颖利用OPC+Toolbox在Matlab中实现实时数据的获取J.附录%在本地计算机上查询所欲可用的OPC服务器hostInfo=opcserverinfo(localhost);%将OPC服务器ID
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025万华化学(福建)有限公司招聘实习生20人笔试参考题库附带答案详解
- 智能仓储物流管理操作手册
- 体育运动设施管理与维护手册
- 企业安全生产管理与隐患排查治理手册(标准版)
- 航空运输货物处理流程手册
- 普及电脑知识的
- 2026云南临沧沧源佤族自治县勐省中心卫生院招聘村卫生室工作人员5人备考题库及参考答案详解(新)
- 普及儿童生理知识
- 2026上半年贵州事业单位联考百里杜鹃管理区招聘56人备考题库带答案详解(满分必刷)
- 2026云南临沧沧源佤族自治县勐省中心卫生院招聘村卫生室工作人员5人备考题库带答案详解ab卷
- 2026 年初中英语《状语从句》专项练习与答案 (100 题)
- 2026年辽宁省盘锦市高职单招语文真题及参考答案
- 农投集团安全生产制度
- 近五年贵州中考物理真题及答案2025
- 2025年黑龙江省大庆市中考数学试卷
- 2025年国补自查自纠报告
- 山东烟草2026年招聘(197人)考试备考试题及答案解析
- 二级医院的DRGs培训课件
- 空芯光纤行业分析报告
- 2026年湖南中医药高等专科学校单招职业倾向性测试题库及答案详解一套
- 置业顾问岗位招聘考试试卷及答案
评论
0/150
提交评论