2024年1月31日发(作者:)

1. 介绍

大部分的 DCS(集散控制系统)和很多新的设备(比如分析仪表)支持OPC(OLE

for Process Control)。OPC是数据历史存储的一个可选项,作为处理数据的一种工具。从另外一个电脑的第三方软件来通过OPC进行链接是一个很痛苦的过程。 OPC使用微软的protocols COM(本地访问)和DCOM(远程访问)作为通讯手段,从而使得从其他操作系统,比如Linux访问很困难。远程访问通常要更改DCOM权限设置。 Matrikon的网站上有文档来解释怎么来设置DCOM,但实际上,远程访问OPC链接的过程有诸多抱怨,特别是XP SP2的用户。

OpenOPC 就尝试改善这个情况,使用OpenOpc你可以从其他平台访问OPC服务器。OpcOpen通过安装一个服务,允许远程的 TCP/IP链接传输OPC数据,从而越过DCOM来访问远程OPC服务器。这个网关协议将会安装在OPC服务器上,只要确保网关协议拥有正确的权限来访 问本机上的OPC服务器就可以了。这个网关协议同样可以用在非windowns操作系统上,当然也就不支持DCOM。软件可以从下面的网址下载:

这篇文档主要是站在用户的角度,来使用例子尽可能的解释OpenOPc软件是如何工作的。

2. 测试机上的安装

在 真实的产品环境下使用软件之前,在一个测试的机器上先实验是一个比较好的习惯。下面假设一个OPC软件已经安装到了一个windows机器上,而 且运行良好,没有任何的故障和bug,接下来讲述一个OPC 服务器和一个OpenOPC网关协议的安装,从而让远程计算机(可能非non-wooindow系统)来接收数据。下文中我们会把这台电脑叫 做:server

2.1 安装OPC服务器

如果要测试OpenOPC软件,就需要一个OPC服务器。Matrikon有免费的一个测试服务器,可以从下面的网址下载:

另外的一个获得Martrikon OPC服务器的地方是Kinetica:

/

这里还有很多的免费OPC服务器可供下载:

/

OpenOPC工具已经在MarkOPC仿真服务器上进行了重度测试,默认的设定也都是连接到MarktrikonOPC服务器。毕竟这篇文档也是只要讲述怎么连接到MatrikonOPC服务器。

两 个不同的OPC服务器功能上也会有轻微的不同。在一台服务器上的所有功能并不能适用到另外一台服务器上。所有的OPC服务器一般都支持读和写,但 是浏览(使用OPC服务器来查看在服务器上的变量)则一般都执行的不一样,甚至并非所有的OPC服务器都支持。相对于写入一个OPC服务器到DCS来说, 这可能是(处于明显的原因)是附加的权限。

2.2 安装OpenOPC软件

要安装OpenOPC软件,只要运行安装文件就可以了。当安装文件询问要安装哪些组件时:

命令行客户端:这将安装命令行客户端(),这也是一个功能很强大的命令行工具

OPC网管协议:这个协议允许非windows机器来访问OPC数据,基本来说,这个协议获得OPC的数据,然后传送给需求数据的客户端。这个协议也允许避过DCOM的设置来获得数据。

开发库:当你开发你自己的OPC应用的时候,你需要这个库。例子将会放在第四节。

源代码:这个选项将会安装源代码,在客户端和网关服务器上。注意这个安装器将会警告,如果你没有安装Python的话。但是你的文件仍然会放在SRC文件夹中。这个文档并不讨论源代码。源代码仅仅占很小的空间。

安 装完毕之后不需要重启,但是如果你实在NT4.0上安装,最好重启一下。OpenOPC软件一般会安装在``C:OpenOPC。如果你是在 NT4.0上安装,安装器将会将(微软运行库)放在C:WINNTSYSTEM32文件夹。如果是XP的话,这个文件就已经有 了。在Windows2000上,可能默认不会有,但是一般安装其他软件的时候,会被安装上。

2.3 本地快速测试

软件的一些默认设置已经通过环境变量设置完毕,你可以通过在命令行中输入“SET”来看到设置:

OPC_CLASS=tion;per;tion;

OPC_CLIENT=OpenOPC

OPC_GATE HOST=localhost

OPC_GATE PORT=7766

OPC_HOST=localhost

OPC_MODE=dcom

OPC_SERVER=ver;tion;tion

使用默认的设置来从MatrikonOPC服务器来读取数据,只要输入: opc

4 你可以获得默认OPC服务器的一下信息:

opc -i

你也可以列出本机上的OPC服务器的列表:

opc -q

如果OPC服务器支持浏览(比如MartrikonOPC服务器),你也可以搜索匹配的变量,使用通配符的形式:

opc -f *.Real8

然后就会从Martrikon仿真服务器获得一个列表:

Bucket 8

8

Read 8

Saw-toothed 8

Square 8

Triangle 8

Write 8

Write 8

对于管道有很好的支持,可以这样子命令行中读取OPC的值:

opc -f *.Real8 | opc -

返回结果列表为

Bucket 8

8

0.0000

16499.4963

Good 22:41:16

Good 22:41:16

Read 8

Saw-toothed 8

Square 8

Triangle 8

Write 8

3.1416

0.0000

3.1416

0.0000

-1073479676

Good 22:41:16

Good 22:41:16

Good 22:41:16

Good 22:41:16

Good 22:41:16

2.4 核查网关协议的安装

网关服务器用于远程的客户端来获得OPC数据。接下来的小节介绍了怎么样来检查一个网关服务器通过远程客户端访问之前,是工作在正确的状态。

首先检查任务管理器,看看进程“openopcservice”是否正在运行,如果没有,输入以下的命令来开启:

NET START zzzopenopcservice

如果发生了像这样的错误“the service name is invalid”,说明协议没有正确的安装,检查“”在C:OpenOPCbin,然后安装协议:

openopcservice -install -auto

NET STAER zzzopenopcservice

尝试着去列出网关服务器上的当前链接:

opc -S

尝试去使用网关服务器来读取一个变量:

opc -m open 4

接下来你可以坚信你的网关服务器正在处理数据了。关闭网关服务器然后再读取数据,你将会得到一条错误信息。

3 在客户端机器上的手动安装

这 个小节介绍了在一个独立的机器上(客户端)来手动安装OpenOPC软件。手动安装的目的是让用户有一个更清晰的认识,知道这个软件是怎么工作 的。数据将会通过远程计算机上的网管协议进行处理,这将会绕开DCOM设置。客户端机器上不用安装OPC服务器。安装过程没有什么复杂的,只要复制 “”到新的机器上就可以了。复制的路径由你说了算,如果你使用的是NT4.0的话,你就需要把复制到 C:WINNTSYSTEM32文件夹中。

3.1 使用网关从远程主机上读取一个值

环境变量不会自动设置,如果我们没有运行安装程序的花,这意味着调用要指定一些选项。假设我们安装MatrikonOPC仿真和OpenOPC软件的机器(服务器)叫做“TESTBOX”。

快速测试的话,opc .exe会告诉服务器上的网关协议,在客户端上执行下面的语句:

opc -S -H TESTBOX

这条命令将会显示连接到网关协议的远程连接,实际上现在还没有远程连接。如果有错误发生,就要确保远程机器上的网关协议正在运行。如果使用名字不能起作用的话,可以使用IP地址:

opc -S -H 10.36.16.100 (replace with IP address of TESTBOX)

尝试从TESTBOX的MatrikonOPC服务器上读取一个值,使用下面的命令:

opc -m open -H TESTBOX -h TESTBOX -s tion -r

4

“-H”选项意思是我们要使用TESTBOX上的网关协议。“-h”选项制定远程主机的名字,“-s”选项指定OPC服务器的名字,“-r”选项意思是读,但这是可选的。

你可以设定下面的环境变量来避免输入这么长的命令行,只要从命令行里面输入下面的命令就可以了:

SET OPC_GATE_HOST=TESTBOX

SET OPC_OST=TESTBOX

SET OPC_MODE=open

SET OPC_SERVER=tion

设置完成之后,接下来的命令就简单多了:

opc -r 4(注意“-r”是可选项)。

网关端口。

网管协议使用端口7766作为默认的TCP/IP通讯。如果你更改这个端口数(设置环境变量OPC _GATE_PORT),你需要同时在服务器上和客户端上进行更改。无论是远程还是本地的电脑上面的防火墙都会造成链接问题,要确保网关端口在服务器和客户端上都是开放的。

要检查网管协议正在使用的端口号可以使用下面的命令:

opc -r 4 -L1

这条命令假设你的环境变量已经设置过了。“-L1”选项告诉程序来处理数据,每隔一秒的间隔。现在接着输入“netstat”来看看TCP/IP的链接,你可以清晰的看到端口7766已经被TCP/IP使用。

服务器上的网管协议也可以被用来显示链接信息。执行下面的语句就可以了:

opc -S -H TESTBOX

输出将会是下面的这个样子的:

Remote Client

10.36.16.58 (labtop)

Start Time

06/27/08 14:53:01

Last Transaction

06/27/08 14:53:07

4 使用python开发OPC应用程序

OpenOPC 的真正强大之处是在于能够使用python来进行编程。Python提供了非常轻松的链接到许多数据库,也很轻松开发网络应用。 python可以运行在很多平台上,包括Windows,Linux,也许PDA上也可以。为了进行下面的学习,一些Python的插件包是需要的(看看 包含在OpenOPC 包中的readme .txt文件):

Python Romote Objects(Pyro)

Python for Windows Extensions(pywin32)

这篇文档并不介绍怎么使用Python来处理OpenOPC,仅仅是知道可以使用python来编写强大的应用程序来访问OPC数据。

4.1 简单的例子

下面是一个简单的代码列表,来展示下从远程的网关服务器上来读取两个OPC的值:

import OpenOPC

gateway=’testbox’

opchost=’testbox’

opcserv=’tion’

taglist =[’4’,’4’]

print ’Connecting to Gateway Server on: ’,gateway

opc = _client(gateway)

t(opcserv,opchost)

v = (taglist)

()

for i in range(len(v)):

(name, val, qual, time) = v[i]

print ’%-15s %-15s %-15s %-15s’%(name,val,qual,time)

这段python程序将会得到下面的结果:

Connecting to Gateway server on:testbox 4 9961.0 Good 10/29/07

04:23:52 4 491.0 Good 10/29/07 04:23:52

4.2 写入OPC数据到数据库

下面是一个简单的例子,将OPC数据写入到SQLite数据库。这个程序很简单,没有做什么数据检查。一个真正的程序将会做很多的工作,比如处理链接错误等等。

如果知道这一点,接下来开发一个网络使用,将存储在数据库上数据显示出来。

# OpenOPC and SQLite Python example

import sqlite3

import os

import time

import OpenOPC

dbfile=’’

remotehost=’testbox’

opcserver=’tion’

tagname=’4’

sampletime = 2

dbexist = (dbfile)

db = t(dbfile)

cur = ()

# create table first time new database is accessed

if not dbexist:

sqlstring = ’CREATE TABLE opcdata

(id INTEGER PRIMARY KEY, tag TEXT,

val TEXT, stat TEXT, datetime TEXT, atime TEXT)’

e(sqlstring)

()

while 1>0: # infinite loop kill with Ctrl-C

opc=()

t(opcserver,remotehost)

(opcvalue,opcstat,opctime) = (tagname)

()

atime = e() # current computer time as float

sqlstring = ’INSERT INTO opcdata (id, tag, val, stat, datetime, atime)

VALUES(NULL, "%s", "%f", "%s", "%s", "%s")’

%(tagname,opcvalue,opcstat,opctime,atime)

e(sqlstring)

()

e(’SELECT * FROM opcdata’)

dbvalues = ll()

dblen = len(dbvalues)

print dbvalues[dblen-1] # print newest value in database

(sampletime)

# end of while loop

5 DCOM模式下使用OPC客户端

如果OpenOPC命令行客户端用来读取本地数据,这没什么问 题,但是如果要远程读取的话,可能问题就比较麻烦了。首先DCOM权限必须要要设置, 一个比较好的方式是两个电脑上安装相同的账户,然后都拥有管理员权限,每当一个链接被创建之后,拥有管理员权限的账户也同样就被茶u了。

为了说明其中的一些问题,首先在一个干净的客户端机器上安装一个代理OPC服务器(参加第六章)。这将会安装下面的功能文件,在SYSTEM32文件夹下,来创建OPC链接:

05-11-05 11:44a 61,440 opccomn 05-11-05 11:44a 98,304

05-11-05 11:44a 102,400

尝试着去列出本地机器上的服务器:

opc -h laptop -q

这将会列出代理OPC服务器:tion.尝试列出远程机器上的服务器(假设名字是TESTBOX而且已经安装了Matrikon仿真服务器):

opc -h TESTBOX -q

从本地读取数据:

opc -m dcom -s tion -r t1

但是从远程主机上的MatrikonOPC服务器上读取数据就会失败:

opc -m dcom -h TESTBOX -s tion.1 -r 4

这可能是因为DCOM没有被理解,一个接囧办法是将Matrikon方针服务器安装在本地机器上,接下来OpenOPC 将会使用 matrikonOPC服务器提供的OPC类(tion)来创建远程的OPC链接,因为在环境变量

OPC_CLASS中,自动化类Matrikon .tion被列在Graybox(per)提供的OPC类的前面。接下来的命令是会有用的:

opc -m dcom -h TESTBOX -s tion.1 -r 4

安装了Matrikon仿真服务器之后,强制opc .exe使用GrayBoxDLL提供的自动化类也会有用这是因为Matrikon方针服务器改变了DCOM的设定。

opc -m dcom -C per -h TESTBOX -s

tion.1 -r 4

6 特殊的OPC服务器

这个段落主要讲述使用几个别的OPC服务器的情况,希望能够对读者有帮助。

6.1 代理OPC服务器

Prosys有一个OPC测试服务器,在下面的网址:

/

假设这个服务器已经安装在了TESTBOX上,列出列表:

opc -h TESTBOX -q

如果Matrikon方针服务器也安装的话,就会使用opc类trion(通过opc -i可以检查),然后上面的命令就只会列出Matrikon OPC服务器,但这不会影响读数据:

opc -h TESTBOX -s tion -r t1

如果Graybox DLL被使用你哦过的花,opc -q将会显示这两个OPC服务器:

opc -C per -h TESTBOX -q

当然,也可以使用通配符。

6.1 使用ProsysOPC服务器来监视OPC调用

ProsysOPC服务器中一个比较好的功能时可以看到OPC调用。当一个指向Prosys服务器的链接被创建的时候,一个小的弹出窗口就会让你监视OPC链接。当你开发自己的OPC客户端的时候,这非常的有用。

注意ProsysOPC服务器可能不会一直运行在一个可见的程序中。为了强制ProsysyOPC服务器可以总是可见,使用来强制Prosys服务器作为一个The interactive user运行。

使用ProsysOPC服务器非常容易来看到当被强制使用“async”模式的时候,OPC函数“***h”被使用:

opc -F sync -s tion -r t1 -L5

同样也可以看到在async模式下,OPC的更新速率被设置为5000ms(5妙)

6.2 HoneywellTDC3000 OPC服务器

Honeywell TDC3000是一个集散控制系统(DCS),在2008年的时候广泛应用,通过一个honeywell支持的OPC服务器来从TDC3000获取OPC 数据也是可行的。OPC服务器运行在一个windowns电脑上,连接到LCN。Honeywell卖这种电脑,被叫做一个APP节点。OPC服务器被叫 做TPN服务器,TPN OPC服务器非常像上面讲的OPC服务器。TPN服务器不支持浏览,但是要小心不要使用大的通配符范围。

6.2.1 在APP节点上安装OpenOPC

在Honeywell APP节点上安装OpenOPC是可行的。服务器的名字就叫ver,所以默认的OPC服务器应该被更改:

OPC SERVER=ver

从DCS上读取一个简单的变量来测试连接:

opc -h APPNODE -s ver

如果不工作,考虑测试是不是登陆到APP的帐号没有读取OPC数据的权限。这可以使用很多的免费OPC客户端来完成。,参见第七章。

穷人数据可以通过网关协议读取:

opc -m open -H APPNODE -h APPNODE -s ver

如果不工作,请确认网关协议正在运行,默认网关协议作为SYSTEM运行。

6.2.2 在GUS节点上安装OpenOPC

在Honeywell GUS或者任何在相同域内的电脑上都是可行的,在这种情况下,GUS上的OpenOPC网关协议将会使用DCOM读取APP节点上的数据,一个必须的条件是OPC函数文件要被放置在正确的地方,参见第五章。

然后设置环境变量:

OPC_MODE=dcom

OPC_HOST=APPNODE

OPC_CLASS=tion

OPC_SERVER=ver

使用上面的环境变量设置,非常容易的从在APP节点上的OPC服务器来读取数据。

opc -h APPNODE -s ver

非常重要的是登陆到GUS的账户要有用读取APP节点上OPC数据的权限。

6.2.3. 在GUS节点上安装OpenOPC网关协议

在GUS上运行网关协议来读取APP节点上的数据也是可以的。在这种情况下,走的是DCOM模式,网络上的其他电脑从GUS上似乎网关协议来获取OPC数据。

首先确保APP上的OPC服务器上的数据是可读的:

opc -m open -H GUSNAME -h APPNODE -s ver

6.2.4 构建缓存

Honeywell TPN服务器使用缓存来加速数据传输,第一次访问一个变量的时候,可能要花一个很长的时间来得到响应,当变量被请求过一次后,下面的请求将会变的快多了,读取所有的变量到一个列表里面是可行的:

opc - < (Do not do this first time!)

相对于尝试一次读取所有的新变量,一次读取一些变量也是可行的:

opc -g 3 -z 500 - <

“-g”属性指定了组的大小,“-z”选项指定了两次读取之间的等待时间,“-”属性表示输入将来自于一个管道。如果第一次读取一个长的列表,这里有一次小改变:

opc -g 3 -z 500 - < >

注意,如果变量列表很长(比如2000个变量),这将会花费一个可怕的时间(2000*500/3=3333333毫 秒=5.5分钟),一旦变量列 表经过确认,而且拼写

错误或者丢失的变量已经被修改过,就没有必要使用“-z“属性,而组的大小”-g“属性就可以设置非常大了。

一旦变量被读到至少一次,读取一个大的列表就非常快了(100-200毫秒甚至更快)

6.3 Honeywell PKS Experion OPC 服务器

Honeywell PKS Experion拥有一个非常快的OPC服务器。OPC服务器对于所有常规的PKS变量都工作的非常好,如果PKS OPC服务器要求从LCN获取变量,OPC服务器就不一定好使了。 连接到PKS OPC服务器的OPC连接数量,按照我的理解,应该是有授权协议的。因此如果你连接到PKS OPC 服务器存在问题是,检查下授权的数目。

OpenOPC软件已经在PKS系统上测试过,工作很好。PKS OPC服务器一般命名为C环境变量应该设置为:

OPC SERVER=ver

OpenOPC安装了免费软件Graybox DLL(在in C:OpenOPClib),包括了类per,默认OpenOPC尝试使用它访问到的第一个Automation

DLL,在下面的文件夹中(制定在环境变量OPC CLASS)中,

1. tion

2. per

3. tion

4. omation

5. tion

确认使用了哪个Automation类,可以输入:

opc -i

通过更改环境变量,将Automation DLL更改到PKS OPC Server:

OPC CLASS=tion

7 OPC客户端

当使用OPC连接出现问题的时候,最好使用不同的OPC客户端来确保问题不是出在客 户端本身身上。Matrikon OPC服务器内涵了一个OPC测试客户端,因此如果你安装了仿真服务器,你就拥有了一个客户端。Matrikon OPC服务器的安装文件也可以仅仅安装一个客户端。

另外一个比较好的客户端是Prosys OPC 客户端:

/

8. 网关协议特殊变量

网管协议的一个强力的特点就是来监视它自己和服务器上其他进程。典型情况下OpenOPC网管协议安装在我们想要读取数据的OPC服务器上。网关协议可以监视系统参数,包括它自己的内容情况,特殊变量如下:

@SineWave

@SawWave

@MemFree

@MemUsed

@MemPercent

@DiskFree

@CpuUsage

@TaskMem(name)

@TaskExists(name)

如果要读取当前的CPU使用率,可以输入:

opc -H TESTBOX -m open @CpuUsage

读取网管协议的内存情况,可以输入:

opc -H TESTBOX -m open @TaskMem()