1 引言
随着工业生产的不断发展以及自动化系统集成度的不断提高,工业自动化系统软件取得了长足的发展与进步。然而,工业系统中设备数量的不断增加和现场信息交互共享能力要求的不断提高,传统的智能设备之间及智能设备与控制系统之间采用专门驱动程序实现信息共享的通讯方式已不能满足工业控制系统的发展需要。因此,为了能够解决工业系统硬件设备的升级改变为软件系统带来的不便,更好的实现不同设备厂家硬件产品的集成互连,增强系统的稳定性与可靠性,工业自动化软件接口的标准化、统一化成为工业控制领域必须面临的一个问题。
为了能够使得自动化软件的开发具有统一的接口标准,dde(动态数据交换:dynamic data exchan-ge)、opc(基于过程控制的链接与嵌入:ole for process control)技术的出现和应用为不同的自动化程序系统之间能够实现简单交互、无缝互连做出了巨大的贡献。
2 dde与opc技术的工作机制
2.1 dde技术的工作机制
dde是为在同一台计算机或不同计算机上运行的程序提供动态数据交换,最早由microsoft 公司提出的。动态数据交换(dde)技术由于其具有实时性好、网络通信连接实现方便等特点,在控制软件与信息网络集成中得到了广泛应用。
动态数据交换基于windows消息机制,各应用程序间通过传递消息进行对话交换信息。windows dde消息传递采用client/server模式,客户(client)是数据的请求和接受者,而服务器(server)是数据的提供者,两者之间通过请求、应答、传输三个步骤来完成数据的传送。dde协议使用服务(service)、主题(topic)和数据项(item)三级命名来标识dde所传递的数据单元。一般情况下,服务(service)就是应用程序的文件名,主题是对服务器有意义的信息单元。每次dde客户与服务程序之间的对话都是先由客户启动的,所以在每次客户启动之前,dde服务器应当首先投入运行。
当客户程序需要向服务器程序请求数据时,客户程序发送一条wm-dde-initiate消息给当前运行的所有windows应用程序,这条消息不但包含了它所需要的服务器名(service)和主题名(topic),而且指明了它所希望的数据类型,收到wm-dde-initiate消息的应用程序通过判别服务器名和会话主题决定是否应答,一旦dde服务器响应了这条被传播的消息,dde会话就开始了。
dde的工作方式有冷连接(cool link)、温连接(warm link)和热连接(hot link)等3种。在冷连接方式下,当server中的数据发生变化后不主动通知client,但client可以随时从server读写数据;在温连接方式下,当server中的数据发生变化后马上通知client,client得到通知后将数据取回;在热连接方式下,当server中的数据发生变化后马上通知client,同时将变化的数据直接送给client。
dde的网络形式称为netdde,它包含了dde的全部特征,是动态数据交换(dde)的扩充,可以在跨越网络的计算机之间使用。采用netdde后,两个或更多网络上的应用能够通过dde共享来建立网络上不同工作站之间的连接,从而实现站站之间的动态信息共享。
2.2 opc技术的工作机制
在opc技术出现以前,dde技术是绝大多数控制系统都支持和采用的数据交换方式。但是,由于dde是基于windows信息传递而建立的技术,因此,当通信量较大时,就会出现数据刷新速度慢、安全性管理机制差、可靠性能低等现象,从而就有可能致使dde客户程序在较长时间内得不到回应。和dde 技术相比,基于com和dcom技术的opc技术具有数据传送性能高、 安全性管理性能好、开发成本低等特点。
最初阶段的opc规范是由opc基金会的先驱fisher-rosemount、rockwell、opto 22、intellution、intuitive technology公司于1996年8月发布的,目前opc基金会成员在全球已超过300多个,其中包括世界上几乎所有主要的控制系统、仪器仪表、过程控制系统生产厂家。
opc以ole/com/dcom技术为基础,是ole(object linking and embedding)for process control的缩写,是微软公司的对象链接和嵌入技术在过程控制方面的应用。与dde一样,opc也采用client/server模式。opc服务器是数据源的提供者,数据源可以是plc、dcs、条形码读取器等控制设备,随控制系统的构成不同,作为数据源的opc服务器既可以是和opc应用程序在同一台计算机上运行的本地opc服务器,也可以是在另外计算机上运行的远程opc服务器。opc客户是数据的使用者,它按照opc接口规范从opc服务器获取所需要的数据。
opc服务器主要包括三部分:服务器(server)、组(group)和数据项(item)。服务器对象保存服务器和服务器作为opc组对象容器的所有信息。opc组对象包括公共组和局部组(私有组)两种,公共组由多个客户共享,局部组只隶属于一个opc客户。一个组可能代表一个特殊设备的数据项,opc 客户可以通过组对象来读写数据,并可以设定opc服务器应该提供给opc client数据的更新速率。opc 数据项是读写数据的最小逻辑单位(在实际应用中,可能是物理设备的寄存器或寄存器的某一位),其数据值以variant形式表示,每个数据项包括值(value)、品质(quality)和时间戳(time stamp)3个变量。在一个组对象中,opc 客户可以加入多个opc数据项。
opc客户与opc服务器的接口有自定义接口(custom interface)和自动化接口(automation interface)两种形式。自定义接口是一组com接口,主要用于采用c++语言的应用程序开发;自动化接口是自动化的ole接口,主要用于采用vb,delphi等基于脚本编程语言的应用程序开发。对于客户端应用程序的开发,采用自定义接口的方式运行效率高,但开发难度较大;采用自动化接口的方式运行效率低,但开发简单。这两种接口与opc服务器的通信方式可用1图所示。
图1 自定义接口和自动化接口与opc服务器通信方式示意图
对于分布式计算机上的opc客户程序的开发,opc标准采用dcom技术实现服务器和客户程序的通讯。
opc的数据访问主要有同步数据访问和异步数据访问两种方式。同步数据访问时,opc服务器在将按照opc应用程序要求的数据返回之前,opc应用程序一直处于等待状态,也就是说,同步方式的数据访问在要求的动作没有完成前不能执行任何opc应用程序侧的处理。与之相比,异步方式的数据访问在对opc服务器提出数据访问要求后,立即返回到opc应用程序侧的主处理程序中,opc服务器完成数据访问时通知opc应用程序,opc应用程序从而得到数据访问结果。当opc应用程序采用自动化接口访问opc服务器时,同步和异步数据操作分别由syncread、syncwrite和asyncread、asyncwrite四个opc组对象的方法函数来实现。
3 dde与opc技术应用
当前,dde、opc技术在许多世界著名的自动化厂家的i/o通讯服务器、scada等自动化软件中都得到了体现。例如wonderware 公司的daserver和intouch、siemens公司的simatic net和wincc、 rockwell-ab公司的rslinx和rsview32等。其中daserver和rslinx既可作为opc server,又可作为dde server;wincc和rsview32则既可以作为opc client,又可作为dde client。同时,由于各家的软件接口都合乎dde、opc接口规范标准,所以,不同厂家的i/o通讯、scada等软件产品也可以很方便的实现互连。
下面分别以wonderware 公司的intouch与daserver(dassidirect)、intouch与rockwell-ab公司的rslinx进行dde通讯,siemens 公司的wincc 与simatic net 、wincc 与rslinx进行opc通讯的方法为例说明dde、opc技术在工业自动化软件的应用情况。
dassidirect是wonderware 公司开发用于对siemens s7 200/300/400系列plc进行以太网数据访问的服务器软件,支持dde、opc、suitlink、fastdde等通讯方式。当客户程序通讯接口与dassidirect的连接采用dde方式时,dassidirect 的数据访问采用了节点名(node name)、应用程序名(application name,此处为dassidirect)、主题名(topic name)和项目名(item name)的层次结构。而当通讯接口以opc方式与dassidirect连接时,dassidirect 的数据访问则采用了节点名(node name)、服务器名(program name,此处为archestra.dassidirect.1)、组名(group name)、设备组名(device group)、连接名(link name)和项目名(item name)的层次结构。各层次项可在dassidirect软件界面中配置实现。
工程应用时,需要在dassidirect管理界面smc archestra.dassidirect.1目录下根据需要依次添加接口类型(tcp/ip)、接口处理器类型(s7 plc),并进行必要的参数设置,然后还要为device groups添加不同的topic以方便对不同变量的归类管理。intouch标签变量对dassidirect的访问是通过“访问名”的设置来实现的,所以intouch中“访问名”的设置必须和dassidirect软件中的设置一一对应,例如,“访问名”中“应用程序名”应设置为dassidirect,“访问名”中“主题名”的设置应和dassidirect中所添加的topic名称完全一致。此外,intouch标签变量“项目名”的填写也必须遵从dassidirect中item name的定义形式,例如对s7 plc数据块地址word的访问形如db11.w80,对数据块地址dword的访问形如db11.d80,对输入/输出位的访问形式分别为i5.2/q7.5等。
和wonderware公司的dassid
-irect一样,rslinx也支持opc/dde两种通讯方式。当intouch和rslinx以dde方式进行通讯时,首先需要在rslinx“dde/opc topic configuration ”对话框中添加新的topic,并建立该topic与要连接rslogix plc cpu之间的对应关系,然后再对intouch中“访问名”做相应的配置。不过,此时“访问名”中“应用程序名”应设置为rslinx,“访问名”中的“主题名”则应和在rslinx中所添加的topic名称完全一致。而intouch标签变量“项目名”的填写也应遵从rslinx中item name的定义形式,例如对rslogix plc cpu中全局变量controller tags地址的访问即为 plc变量地址的tag name,而对cpu中程序变量program tags地址的访问则为program:<program_name>.<tag_name>的形式。
当采用siemens 公司的wincc作为opc client与opc服务器进行opc方式连接时,首先需要在wincc资源管理器中添加opc通讯驱动程序opc.chn,然后在出现的opc通道单元的“连接属性”和所建变量的“变量地址属性”对话框中分别填写“opc服务器名称”和“变量地址名称”,这样便可建立该变量到opc服务器的连接。需要说明的是,不同的opc服务器,其opc服务器名称和地址格式是不尽相同的,例如siemens simatic net opc服务器的名称和地址访问格式(以按s7协议对s7系列 plc数据访问为例)分别是“opc.simaticnet”和“s7:[<连接名称>]<plc变量地址>”,而rockwell rslinx opc服务器的名称和对rslogix 系列plc数据访问的地址格式分别是“rsllinx opc server”和“[<opc group名称>]<plc变量名>”。
同样,其它scada软件与相关dde、opc服务器软件通讯的实现方法与此类似,不再赘述。
此外,由于dde、opc都是标准规范,所以也可以根据需要来实现dde、opc之间的接口转换来满足实际需求,例如wonderware公司的opclink便是实现opc、dde接口转换的专用软件。
4 利用vb开发dde与opc客户端
如上所述,目前许多scada软件都采用了dde、opc技术规范作为其软件接口,而scada监控软件在实际工程应用中则扮演了dde、opc客户端的角色。另外,wonderware公司的wwclient,siemens公司的simatic net opc scout和rockwell-ab公司的opc test client等测试软件也都是dde、opc客户端软件的实例。
dde、opc客户端软件可采用visual c++、visual basic、delphi等编程软件实现,这里主要对如何用visual basic 6.0编写dde、opc 客户端实现和dde、opc 服务器通讯的方法分别予以介绍。
4.1 利用vb开发dde 客户端
作为microsoft 公司软件产品的重要一员,visual basic理所当然的对windows操作系统的下的dde技术给予支持。visual basic为一些控件提供了用于dde动态数据交换的linktopic、linkitem、linktimeout、linkmode等属性,以及linkrequest、linkpoke、linkexecute、linksend等方法。其中,linktopic、linkitem两项属性分别对应于dde通讯架构中的主题名和数据项名,linktimeout、linkmode分别表示dde 客户端与dde服务器的尝试连接时间和连接模式(数据交换方式),linkmode有manual、notify、automatic三种方式,而automatic方式最为常用,它主要用于和dde server建立“热连接(hot link)”,即在dde服务器数据发生变化时主动发送数据给客户端。linkrequest、linkpoke分别用于dde 客户端对dde服务器数据的读写操作。
根据应用程序与服务器程序dde方式通讯机制,可以在visual basic编程环境下开发适合实际需要的dde客户端应用程序。例如,visual basic访问intouch 程序变量“intouchtag”时,其代码为label1.linktopic= "view|tagn-ame"
label1.linkitem= "intouchtag"
label1.linkmode=1
label1.linkrequest
其中,代码中的“view”和“tagname”分别表示intouch windowviewer的应用程序名和主题名,“linkmode”值为1表示该应用程序与windowviewer的连接方式为automatic(即“热连接”)方式。这样,当该应用代码被执行时,label1的值便随intouch windowviewer“intouchtag”变量的变化而变化。
同样可以在visual basic中添加label2、label3,并建立和dassidirect、rsllinx的dde通讯连接,使其分别随所连接s7-300 plc数据db5.dbw20、controllogix 1756-l55 plc全局变量“linxlogixtag”数值的变化而变化,其代码分别如下:
label2.linktopic = "dassidire
-ct|dasvrtopic"
label2.linkitem = "db5.w20"
label2.linkmode = 1
label2.linkrequest
label3.linktopic = "rslinx|" & “rslinxtopic”
label3.linkitem= "linxlogixtag"
label3.linkmode = 1
label3.linkrequest
其中,“dassidirect”和“dasvrtopic”、“rslinx”和“rslinxtopic”分别为dassidirect和rslinx的应用程序名以及在dassidirect和rslinx dde服务器中建立的主题名。而“db5.w20”和“linxlogixtag”则分别对应于s7-300 plc数据db5.dbw20和controllogix 1756-l55 plc全局变量linxlogixtag,这样,该段代码被执行时,label2和label3的数值将随plc中数据db5.dbw20与linxlogixtag变量值的变化而变化。
netdde是dde的网络扩展形式,主要为网络上不同计算机之间的动态数据交换提供方便。在visual basic编程环境下,也可以开发基于netdde的客户端应用程序。与开发dde客户端不同的是,网络上作为dde服务器和客户端的计算机都要启动netdde.exe服务,并在作为dde服务器的计算机上同时启动ddeshare.exe程序,对新建的dde共享进行必要的设置。如下代码的功能为计算机pc02读取pc01计算机上rslinx dde服务器所采集的"linxlogixtag" plc变量的值。
label4.linktopic= "\pc01
ndde$|pc01shrnm"
label4.linkitem= "linxlogixtag"
label4.linkmode=1
label4.linkrequest
由于netdde的访问采用了“\<计算机名><ndde$>|<共享名>!<变量名>”的形式,所以,上述代码中的“pc01”、“pc01shrnm”分别为dde服务器的计算机名和ddeshare.exe程序中的新建共享名,而dde访问所需要的应用程序名rslinx和主题名rslinxtopic则在新建共享“pc01shrnm”的属性对话框中进行了设置。
此外,由于excel也支持dde技术,所以pc01计算机上rslinx dde服务器plc变量linxlogixtag的变化也可以在pc02计算机excel表格中得到体现,只需要在需要显示该值的单元格中填写如下代码=‘\pc01ndde$‘|pc01shrnm!linxlogixtag
4.2 利用vb开发opc 客户端
利用visual basic所开发的opc客户端应用程序主要采用自动化通信接口和opc服务器程序实施通信。而opc基金会提供的opc自动化接口 opcdaauto.dll动态链接库集成了所有用于对opc服务器进行访问的对象、属性和方法,为利用visual basic开发opc客户端应用程序提供了极大方便。程序设计时,opc客户程序应当首先生成opc服务器支持的opc对象,然后再使用opc对象支持的属性和方法,实现对opc服务器的操作和访问。
opc数据访问对象主要包括opc服务器(opcserver)、opc组集合(opcgroups)、opc组(opcgroup)、opc标签集合(opcitems)、opc标签(opcitem)、opc浏览器(opcbrowser)等几个部分。程序设计时,要首先在visual basic环境下选择对opc automation 2.0接口的引用,此时,opc对象会被自动添加到正在开发的工程项目中,然后,再根据需要建立这些对象的实例并利用其属性和方法来实现对opc服务器的访问。对opc服务器的访问主要包括声明opc对象实例、连接opc server、添加标签变量、读写opc服务器(同步/异步)、断开连接等几个步骤。
opc对象实例的声明主要包括对opc服务器、opc组集合、opc组、opc标签集合、opc服务器句柄的声明及程序所需要的其它实例的声明。opc客户端和opc server的连接主要靠调用opc服务器对象实例的connect方法函数来完成,例如,连接本地计算机dassidirect和rslinx opc server 的代码分别为connect("archestra.dassidirect.1")和connect("rslinx opc server")
连接网络远程计算机(ip地址为10.144.45.45)上dassidirect和rslinx opc server 的代码分别为connect("archestra.dassidirect.1", "\10.144.45.45")和connect("rslinx opc server", "\10.144.45.45")
需要说明的是当进行远程opc连接时,必须在远程计算机上运行dcomcnfg程序,并启动该计算机opc服务器的dcom服务。
标签变量的添加主要由opc标签集合的additems方法函数实现,该函数定义了添加的标签数量、标签变量名(数组)、应用程序句柄(数组)、opc服务器句柄(数组)、错误代码(数组)等方面的信息。例如,为dassidirect和rslinx opc服务器添加标签变量的代码为tagnms(1)=”portcps7.jsbf.db2,x48.0”或者tagnms(1)=”linxlogixtag”
my_items.additems itmnum, tagnms, clienthdls, svrhandles, err
其中,my_items为opc标签集合的一个实例。标签变量添加完成后,可通过syncread、syncwrite和asyncread、asyncwrite四个函数实现对opc服务器中相应数据的读写操作。在读写操作完成后,程序将会自动执行syncreadcomplete、syncwritecomplete和asyncread-complete、asyncwritecomple-te等过程,opc客户端应用程序的数据显示、故障诊断等功能可在该段程序代码中实现。
此外,在对opc服务器完成读写后,可以调用opc服务器的disconnect方法来断开与相应opc服务器的连接。不过,为了节省系统开支,增加程序稳定性,通常要在断开和opc服务器连接前先移除opc服务器中的opc标签和opc组,并将opc集合对象都置为nothing,然后再执行disconnect操作并将opc server对象实例置为nothing。
5 结束语
dde、opc技术的出现与发展已经在包括工业自动控制在内的诸多领域得到了广泛的应用。dde作为一种较成熟的数据交换方式已拥有最全面的支持,而opc技术也越来越受众多自动化软硬件企业的支持与青睐,所以,在将来很长的一段时间里,dde与opc将继续在各自的应用领域发挥重要作用,dde、opc技术的出现和发展为我们提供了一个方便的数据访问接口,从而使控制系统进一步走向开放,用户系统因此受益。