任 强(沈阳延锋江森座椅有限责任公司,沈阳 110000)
使用VB语言编程OPC通信技术
任强
(沈阳延锋江森座椅有限责任公司,沈阳110000)
传统的PLC上位通信程序由于各品牌PLC有着不同的通信协议与接口方式,设计前需要花费一定时间熟悉各品牌的通信协议与特性,设计难度很大。并且设计出的程序在更换PLC品牌后根本无法兼容,造成程序的灵活性较差。OPC技术由于其兼容广泛、开发简单的特点,让上位程序设计起来简单灵活。本文通过讲解如何使用VB语言编写OPC上位机程序,使广大电气设计人员了解到该技术实现PLC上位通信是非常简单的。
PLC;上位机;OPC技术
OPC技术是(OLEforprocesscontrol)的简称,是基于微软Windows系统的OLE/COM技术开发的一项应用技术。COM技术提供了一个标准化的平台,各个设备厂商基于这个平台开发符合标准化COM接口的PLC产品。OPC技术基于这一平台,整合各品牌PLC产品COM组件接口,输出一个标准化数据接口。这样无论应用程序开发人员使用何种语言,只需要调用这个数据接口,即可访问到所连接的PLC数据,而不用考虑PLC的品牌,以及底层协议。
标准化的OPC系统包括4个部分:
(1)OPC服务器:为上位机与PLC提供过程数据。
(2)OPC代理占位DLL:为VB或者VBA开发的OPC应用程序提供OPC服务器接口数据格式交换服务。
(3)OPC自动化包装DLL:提供OPC服务器的自动化接口变换服务。VB或者VBA开发的上位机应用程序需要通过该接口访问OPC服务器。
(4)OPC应用程序:设计人员使用VB等语言设计的提供给用户的人机界面程序,含有用户要求的所有功能。
上述中OPC服务器、OPC占位代理DLL、OPC自动化包装DLL这三部分是由第三方开发的DLL文件。本文以KEPWARE公司的OPC软件产品为例,介绍如何编程VB与OPC数据通讯。在KEPWARE中所连接的设备以通道(CHANNEL)的形式描述,每连接一个设备就使用一个CHANNEL,同时每一个CHANNEL对应OPC服务器一个OPC组(下面会介绍到)。在对应的CHANNEL里面设置好通信端口即可。以串口1为例是COM 1,也支持以太网通信。
通过VB访问OPC服务器主要有三种对象,这三种对象有各自的参数、属性、方法。
(1)OPC服务器。
(2)OPC组(OPC组集合)。
(3)OPC标签(OPC标签集合)。
OPC组、OPC标签在访问之前需要在KEPWARE一侧建立,并配置好标签的对应PLC内部地址。下面分步介绍如何编程访问OPC服务器,以操作PLC数据的。
在使用VB编程OPC访问程序的时候,首先建立OPC服务器名并建立连接。
声明OPC服务器:
Publicopc_ServerObjAsOPCServer//声明全局OPC服务器,变量名opc_ServerObj
Setopc_ServerObj=NewOPCServer//建立OPC服务器
连接OPC服务器可以显式访问也可以隐式访问。
连接服务器:
opc_ServerObj.Connect(myOPCInfor.OPC_Server)//隐式访问,使用myOPCinfor.OPC子过程返回的值作为访问参数。这样可以灵活指定所访问的OPC服务器。
在OPC服务器中OPC组集合是自动包含的,可以使用OPC组集合的Add方法在里面添加OPC组。代码示例:
Publicopc_G roupObjAsOPCG roup//全局声明opc_GrouopObj变量作为OPC组属性
Setopc_G roupObj=opc_ServerObj.OPCG roups.Add(myOPCInfor. OPC_G roup)//添加OPC组名称,同样使用隐式访问,添加的组名称为变量”myOPCInfor.OPC_G roup”中内容。
SetmyGroup1=opc_ServerObj.OPCG roups.Add("G roup1")//显式声明一个名称为G roup1的OPC组
在KEPWARE中配置的OPC标签集合名称在编程时要一致,OPC组的名称也要一致,否则无法通讯。下面是使用变量间接指定的例子。代码示例:myOPCInfor.OPC_Item=myConfig.GetStringValue("OP CInfo","OPCItem","",m_strConfigurationFileName)//同样通过Land文件当中的“OPCinfo”字段中的“OPCItem”项内容来指定OPC组集合字符串。
OPC项是指定访问OPC服务器数据的名称,其通过OPC服务器与PLC相关联,指向要访问的PLC某个数据地址。编程OPC服务器之前,先在KEPWAR软件当中配置好需要访问的OPC项,将其与PLC内部的某个地址相关联,软件中称为“TAG”。比如:新建项并命名TAG 1,配置地址为D200。那么在设计应用程序访问地址D 200的数据时,就指定访问名TAG 1就可以了。但是在使用OPC项之前,先进行添加,取得相应的句柄并妥善保存。如果要对OPC组内大量项标签进行读写操作的时,这个句柄就非常有用。
Fori= 1 To 10
Setopc_ItemObj=opc_G roupObj.OPCItems.Add Item(m yOPCInfor.OPC_ G roup+myOPCInfor.OPC_Item + "TestMax"+CStr(i),1)//在OPC组中的项标签集合里面添加10个名称从TestMax(1)到TestMax(10)的OPC项标签(item)。
Serverhandles(i)=opc_ItemObj.ServerHand le//通过数组取得项标签的句柄。
Nexti
在应用程序设计中,如果需要读写项集合内的某个项数据,需要取得标签集合中该项标签的符号,这就需要用到枚举方法。就是在标签集合中进行项标签枚举,直到找到指定的的项。
在程序代码中编写子过程用以实现枚举标签集合中所有的项标签功能。这个子过程可以作为一个功能块在所有读写项标签的语句中调用。在调用过程中只需要通过传值的形式传递项标签标识符,子过程就可以完成查找、返回项符号,进而进行读写操作。
代码示例:
iCount=myGroup1.OPCItems.Count//取得OPC组中所有项的数目。IfiCount>0Then//下面是枚举过程
For i =1 ToiCount
Set opc_ItemObj = myGroup1.OPCItems.Item(i) //取得每一项标签的标识符
str = opc_ItemObj.Item ID //中间变量赋值
If (str = strItem)Then // 通过比较中间变量,找到与传递过来的项标识符一致的项
Set opc_ItemObj = myGroup1.OPCItems.Item(i) //将找到的项符号赋值给指定变量,该变量用于项标签的读写操作。
gAddItem_PLC = True
End If
Next
End If
返回的项标签符号存入变量OPC_ItemObj中,可以方便的进行读写操作。
代码示例:
If my PubclsOPC.gAddItem_PLC(myOPCInfor.OPC_Group + myOPCInfor.OPC_Item + "Group1." + strBitItem)=TrueThen//将需要写入的项标签标示符(ItemID)传值的形式传递到myPubclsOPC. gAddItem子过程。
opc_ItemObj.Write(True)//返回项标签符号写入变量OPC_ItemObj中,使用项标签的写方法赋值1(True)。
End If
OPC服务器支持同步与异步的读写方式。同步方式是指在应用程序发出读写请求之后,直到OPC服务器操作结束后继续程序执行。异步方式是在应用程序发出读写请求之后,应用程序继续执行,在OPC服务器数据处理结束后,告之应用程序处理完毕。在数据同步性要求不高的情况下两者区别不大。
同步读取代码示例:
iCount = opc_GroupObj.OPCItems.Count //取得OPC组里面的项标签数目。
If iCount> 0 Then
Call opc_GroupObj.SyncRead(OPCDevice, iCount, Serverhandles, plcVal, MyErrors, myQuality, myTimeStamp) //读取由数组Serverhandles指定句柄的项标签,将其内容存放入数组PlcVal里面。
End If
上面的代码示例适合于批量读取PLC内部数据,如果需要单独读写某个项标签的数据,可以使用项标签的Read与Write方法。
代码示例:opc_ItemObj.Write (True) //对变量OPC_ItemObj赋值的OPC项标签进行写操作。
OPC技术有很高的灵活性,同一OPC应用程序可以集成不同种类的PLC设备。由于基于标准化COM接口技术,在切换不同种类的PLC设备时,上位机的应用程序不需要重新开发,可以直接切换,这也是OPC技术得以广泛应用的原因之一。本文通过介绍使用VB语言实现上位机程序访问OPC数据,让广大设备开发人员了解OPC技术,使大家认识到使用这项技术可以方便的实现PLC设备上位机通讯。
任强,男,辽宁沈阳人,大专,助理设备工程师,研究方向:电气设备管理。