现代工业控制系统通常以pc机为上位机,通过与现场工控设备如plc的数据交换与处理,实现对生产过程的自动控制。对于小型控制系统,采用专门的组态软件成本太高,用vb设计监控系统则可以降低成本,但首先要解决上位机与plc之间通信问题。以往使用较多的进程间通信方式是dde(动态数据交换)方式,随着opc技术的发展和普及,它已成为工业过程控制的通信标准。opc服务器有两类接口,其中自动化接口主要用于vb、delphi等开发工具。本文利用罗克韦尔公司提供的opc接口,用vb编写了客户端应用程序,实现了上位机与ab可编程控制器之间的数据交换。
2 opc技术简介
opc(ole for process control—用于过程控制的对象连接与嵌入)是一套以微软对象连接与嵌入ole、组件对象模型com、分布式组件对象模型dcom(distributed com)技术为基础,基于windows操作平台,为工业应用程序之间提供高效的信息集成和交互功能的组件对象模型接口标准。opc实际上是提供了一种机制,通过这种机制,系统能够以服务器/客户端标准方式从服务器获取数据并将其传递给任何客户应用程序。这样,只要生产商开发一套遵循opc规范的服务器与数据进行通信,其他任何客户应用程序便能通过服务器访问设备。
opc服务器有两类接口:定制接口和自动化接口。定制接口为c++程序服务,自动化接口为vb这一类可使用自动化对象的程序服务。定制接口是服务商必须提供的,而自动化接口则是可选的,不过opc基金会提供了一个叫做“自动化包装器”的动态连接库,用于在两者间转换。
opc数据存取规范规定的基本对象有三类:服务器(server)、组(group)和数据项(item)。服务器对象包含服务器的所有信息,也是组对象的容器,一个服务器对应于一个opc server,即一种设备的驱动程序。组对象除了包含它自身信息外,还负责管理数据项。每一个数据项代表到数据源的一个连接,但它没有提供外部接口,客户端程序无法对数据项直接进行操作,应用程序必须依靠数据项的容器组对象来对它进行操作。
3 通信实现
3.1 rslinx的配置
rslinx是ab可编程控制器在windows环境下建立工厂所用通信方案的工具,它不仅提供了多种网络驱动程序,而且提供了最快速的opc、dde和custom c/c++接口。本设计中上位机与logix5550控制器采用rs-232串口方式连接,在rslinx中要对df1网络驱动程序组态,设置串口特性:com1、波特率19200bps、一个停止位、无奇偶校验、全双工、bcc校验码。此外要使用rslinx的opc接口作为服务器,还要在rslinx中对opc进行配置。
3.2 安装opc自动化接口服务
若要用vb开发opc应用程序,必须安装opc自动化接口服务,保证计算机系统目录下有opcdaauto.dll。opc基金会提供了一个叫做“自动化包装器”的动态连接库,从opc基金会的网站(www.opcfoundation.org)可下载。在vb环境中,按“工程”的子菜单“引用…”后,弹出对话框,选择其中的“rslinx opc automation 2.0”项,这样才能使用自动化接口。
3.3 程序设计
用vb编写了opc客户端应用程序,实现了上位机与logix5550控制器之间的通信。主要程序代码如下:
(1) 连接opc服务器
dim withevents myopcserver as opcserver ‘定义服务器对象变量myopcserver
dim withevents myopcgroup as opcgroup ‘定义opc组对象变量myopcgroup
set myopcserver = new opcserver
myopcserver.connect "rslinx opc server" ‘连接rslinx 的opc服务器
(2) 添加opc组对象
set myopcgroup=myopcserver.opcgroups.add("group1")
‘添加opc组对象myopcgroup.issubscribed= true
‘设置该组数据为后台刷新
myopcgroup.isactive = true
‘设置该组为激活状态
myopcgroup.updaterate=1000
‘设置数据刷新时间为1000
(3) 添加数据项
dim abitemids() as string
‘项标识符
dim abclienthandles() as long
‘客户端句柄
dim abserverhandles() as long
‘服务器端句柄
dim aberrors() as long
dim i as long
itemcount=5
dim oopcitem as rslinxopcautomation.opcitem
for i = 1 to 5
abitemids(i) = "[" & txttopic & "]" & txtitem(i) ‘将topic名和标签名赋给项标识符
abclienthandles(i) = i
‘给客户端句柄赋值
next i
myopcgroup.opcitems.additems itemcount, abitemids, abclienthandles, abserverhandles, aberrors
‘添加数据项操作
(4) 同步数据读写
opc数据存取有同步方式和异步方式两种。异步读写数据复杂,需要与事件结合使用,与同步相比速度慢但准确性高。同步读写数据简单,直接使用opcitem的方法即可。
dim one as opcitem
dim index as long
‘index为标签顺序号
dim oneread as string
dim xie as string
set one = myopcgroup.opcitems(index)
one.read opccache
oneread = one.value
‘读数据
one.write (xie)
‘写数据
若只读取数据,可以使用datachange事件,当控制器中所要访问的数据一旦发生改变时将会触发该事件,并将该数据自动读到txtvalue文本框。
private sub myopcgroup_datachange(byval transactionid as long, byval numitems as long, clienthandles() as long, itemvalues() as variant, qualities() as long, timestamps() as date)
‘自动刷新数据
dim i as long
for i = 1 to numitems
txtvalue(clienthandles(i)) = itemvalues(i)
‘获取项的值
txttime(clienthandles(i)) = timestamps(i)
‘获取项的时间戳
txtquantity(clienthandles(i))=getqualitystring(qualities(i))
‘获取项的品质
next i
end sub
(5) 断开opc服务器
myopcserver.opcgroups.removeall
‘移除所有opc group,空出资源
set myopcgroup = nothing
myopcserver.disconnect
‘断开连接
4 结束语
利用本文介绍的方法,在实验室实现了上位机和plc之间的通信,图1是opc客户端设置界面。此外我们还设计了城市供水监控系统,鉴于篇幅,监控界面不再一一列出。