|
|
发表于 2008-8-1 16:28:18
|
显示全部楼层
来自: 中国河南新乡
转载 (飘在北京的云~~)
7 p! [8 X- f* L- x1 F' _! T8 K* s9 D8 C j9 e+ J: C9 H
我从北京买了一本《OPC应用程序入门》,在此之前基本上只是知道有OPC,在五月四日开始,我学了七天。其中有苦有甜。我写下来,权做休息或是练练打字。5 h! z% D! j7 K2 Z. n
4 e4 N: ~/ E! O 第一天" S+ P' R9 ?" @4 q9 ~* n- ~
% f7 F9 o, c9 d) ]3 o1 u4 X
安装了《入门》提供的东西,包括是下面几个文件。还有个批处理文件,是一个注册过程。
9 I: E9 `. L( B opccomn_ps.dll) U- ? ~( E( U3 c- V
opcproxy.dll
/ Q* Q5 V; ~7 s/ X9 j: n opcdaauto.dll
3 Q0 @+ ]7 a* G" q2 l OPCTrend.ocx
- P8 ?6 ` {% d7 Q OPCBar.ocx
! n% p2 C$ I* R0 n% ^2 O OpcServer.exe ) d3 t1 C/ l* N
OPCJDADemoServer.exe
# a6 V% B/ H( b8 n$ w7 m, E# w
9 u0 ^& m" U; a! V# C1 @ 看了一阵书,知道了前三个是:通用接口,PROXY-STUB,自动化接口。不明白。
, \( V' M+ W8 {" F" w4 s+ \; l ?# a 后面两个是demo 服务器。
" R8 b4 ]% B8 {! ^6 k, y- y ) I8 k) H' Z% D B' J
上网,用GOOGLE,查OPC,很自然就找到了www.opcconnect.com.,又下了个free( o* `3 A2 v, {
服务器。安装了(注册)。8 B' u* r& h/ T# q1 M& S
4 R& p; S6 P7 z3 S- d5 \! N& p" j
到了工控网,看到有人在推荐clienttools,就下了一个,叫WXOPC。运行一下,. k9 P" t! @9 d5 K; H$ n1 ]
- |+ \ m: r; O; R X
点击连接服务器图标,立即出现了三个:
6 r' r7 q p3 h8 j# E OPCJ.SAMPLESERVER.1
5 a1 t$ A4 _! `7 Q OPCJ.DADEMOSERVER.1
, C8 r, B2 X: E7 R7 d5 Q HEXATEC.PCDATA
9 j0 u/ X1 X' v3 O8 Q
# l# S+ \5 z& E1 t: H& I 第三个是opcconnect上download的计算机基本情况的简单程序。6 z/ a( A( V$ J9 w
) I0 d2 e# P$ k0 Y+ L: J' Y+ |
点击他们,还出现了一些“item”,“value"的内容还在变,有意思。我就想这8 `* _& ]4 k1 ^" J
工具还真不错,不知我能不能做到,但一想,如果这些功能都做不到,这OPC就没多少
4 m+ o5 S: ~( V 人敢学,也就没有市场。( ^( E. \; X0 ?* }5 U2 F
, f3 F2 t& ^! w0 L8 f 有一段时间没用VB了,先热了热身,看了自己过去编过的code。2 c' f0 S$ j% y( S8 @$ j
第二日
' l& X) h/ U. j 今天先看书。) Y% _7 U, b1 d' l# O( ~3 Y
《OPC应用程序入门》,40元,我花了48元,从汇款到收到用了12天,拿到手上,感觉很单薄。我的看书观点是:在看的过程中迷信书,看完后怀疑书,然后忘记书。尽管这本书上我立即就发现有错误。我还是仔细地看下去。' B1 p& ^# k( K1 T
3 O: v/ C, g# z 这是一本教人们用VB编应用客户端程序的书,希望让一般工控技术员认识OPC其实不复杂,最起码编用户程序(客户端)不难。
5 d/ h( g$ W3 m % \9 C9 _8 u" A( ^ o
在这之前,我对COM和DCOM技术有所了解,也是很模糊的,OPC以COM和DCOM技术为基础,主要是在服务器端(server),而在用户端并不要很在意它们。, ^" c* L! T5 K' m; C
7 B7 B0 q, W3 c' d 书上对OPC体系有描述,我画了个图。
$ I! L; T, I& H: F. g/ N5 r - q$ S8 p/ R. i/ K5 G Y1 c( i
& N/ p$ n9 D6 f
+ ~/ k0 q7 }( b; a, M
OPCserver是COM组件,如果安装(注册了)一个OPCserver后,利用WINDOWS的组件工具可以看到,如果这个server安装在别的计算机上,不是本地机,那它就是个DCOM组件(分布式)。: h9 t3 [& G4 ~% M* l2 `& B
. c: I- t) ^7 @2 X: C @; I OPC基金会公布了通用接口(用户接口),用C++访问OPCserver只要通过这个接口就可以,并没有必要了解OPCserver是怎么工作的。3 D/ b6 a( {) ]" @; s A5 Z/ U8 A
( a$ q% P* [+ W- Y+ f 对于VB、VBA、EXCEL、DELPHI等编程软件或工具,不能直接访问通用接口,而要通过所谓的自动化接口(automation interface),OPC组织发布了 DATA ACESS 2.0,实际上已经有了3.0版。4 F+ q" f+ }5 j
' F/ X2 @# U2 e4 C& b: y% q 而在通用接口和自动化接口之间还有一个东西,是成对使用的,有点象MODEM,在两个接口之间起数据传输作用,有个名字叫PROXY_STUB(代理—占位,翻译还不如不翻译,反正不懂)。
- T0 H. P: l- q% a6 U0 e1 A U - S3 t* H7 ~" ]$ p" X' F, L- y
我在第一天中安装的几个DLL中:1 |+ I+ B% D3 F7 I6 o C9 R
OPCcomn_ps.dll 通用接口/ M9 ~: q8 b) \3 e( \5 |5 m( S& v
OPCdaAuto.dll 自动化接口
/ R, g' N7 |- W8 T5 P1 ^9 x OPCProxy.dll PROXY-STUB$ T/ v2 t9 I7 m' M) X$ ]- M
6 g' n! q. h0 X 我们的任务是用VB编写客户端程序,只要知道怎样用自动化接口就行了。其他的不去钻了,要不一年也搞不明白。
, ~! o$ Q J9 g8 N
. K* M1 w9 ^, j 我运行VB6.0,新建一个新工程,点击菜单中的“工程”.“引用”,选择”OPC AUTOMATION 2.0”,就可以利用自动化接口。
/ L5 c; }# X' T2 J; D
9 _9 z) }1 w* W/ _, j 《入门》没有建议将这些DLL安装在什么目录,我觉得放在WINDOWS的SYSTEM下是比较好的。
7 ~& x, H, `9 {0 h
9 V$ K% c. f* J9 x% [7 l 按照书上的顺序,先了解OPC的数据组织。我也画了图。3 r+ S. y8 D* S- B k/ A% c
" J6 W! r {$ v5 {* t0 y1 n6 x
# V3 L! A4 I. ^
* J7 R9 g+ w; ?
X( G! |& v6 G- D W 我们要的就是item,翻译成标签,这就是点,我们所谓的点,比如PLC的I/O点,仪表的数值等。编客户端的开始就是找出数据。6 m2 y& ]( y8 t C( o& t
3 H: M1 E% J& { W 根据书的介绍,要访问标签,还有其他工作要做。
; k, K' N8 R" F! J+ y) @ 我累了。明天再说。
" I, ?8 E7 ^0 ~( b. i
+ i3 M% e6 T5 s9 D& e 第三天
8 N! Y% t7 u: Z0 A 昨天说到访问标签先要做些事。
, U% y5 C! O0 t% Q1 V
# Y0 D* K* R; r; @: N 首先要找出你要访问的OPC服务器的名字,连接它,建立一个组( GROUP)的集合,在下面建立一个具体的GROUP,在这个组中添加一个或多个标签。才可以访问。% }7 z% F, H0 a T: F" k5 Q8 o1 |
4 d1 ~) f6 [& s) M, [, F- a 我用第一天下载的WXOPC工具,看到了三个服务器,我选择了其中一个$ e( g3 {% R X% g
hexatec.pcdata.1,是一个计算机基本情况的DEMO服务器,我发现服务器的名字都是这种格式。
5 X( w5 ~3 R/ F- A5 z+ v # [3 K( }; [8 {3 v9 b" A" g
按《入门》的样子,做了个客户端的架子,一个小时后完成了服务器的连接,新建组集合,建立一个具体的组。下面有些不清楚。干脆拿《入门》的演示程序打开来研究。
! Z6 x8 _0 }. i F, I; X" J2 ` 直接运行,没问题,看到了数据的变化,决定看其原代码。
& y% X3 P; J- K6 O ( z- H9 u6 x+ Q" r& G
它用的是OPCJ.SAMPLESERVER.1这个服务器,没有实际意义,每个数据都可以读写。
' y" {# C3 q q7 s5 H4 k/ H 我发现标签名可以任意编,好奇怪。但是我用WXOPC看到的标签,数据却不一样。
2 m( ^$ E( Z/ r9 W6 Y, Q - T3 }0 U# h" U4 n; ?/ ]6 @
我在FORM上加了个text 控件,叫text1,我让服务器名等于text1.text,这样我可以自由换服务器,还不错,几个服务器都可以连接上。但是只有它自己的服务器才可以读出数据。是不是骗人。
& t9 K4 O# [1 b0 X5 d1 k
6 P l X2 K6 X# c8 a: v! U g 试一下按服务器自己的ItemID去访问,我用WXOPC找出hexatec.pcdata.1的标签名,比如“version”,发现还是出错。7 j; S( n' j! ]
我又到工控论坛上,问已知标签怎样才可以读出数据。没有人回答。
; m8 h1 H# j' F! |/ w# F2 O- L
: ?* N O( {7 b 我给自己留下了两个问题:% x! |$ u7 `+ h- b* w* z
1÷怎样获得本机上得所有OPCserver,获得正确的名字。我看到WXOPC可以。论坛上也很多人在问。% ^+ L& m' P# ?" E" p; A
2÷如何访问ITEM,取得其数据等。
' d) `, E' M) U, Z9 a - l+ }" K9 L, g0 i% t7 c
又看了一会书,看了有关OPCSERVERBROWSER的内容,好像是有用。% V+ ^# c7 S" z* ]& l; j' g
今天到此为止,
# a' x$ c/ J6 X* z. Y- ?9 t 休息
0 ~5 p3 w" w! v: C
! N$ x0 S6 W7 k. X8 g 第四天
; G. G/ l0 v9 b/ E/ P 熟悉OPCSERVERBROWSER的用法。主要有showbranchs,showleafs,movedown,movetoroot& W1 r5 l7 \7 E8 ?& c# o
等等。OPC服务器,实际上是一棵树,有brahchs和leafs组成。我编了一个简单的SUB,实现了两层的树的ITEM的枚举,实现不了第三层。这实际上是树的遍历算法问题。我不知怎么做。我准备去问别人。# s4 r$ n8 `9 _+ L/ J2 Z4 S& G
2 K; q6 T L8 _8 S 从形式上所谓的GROUP/ITEM 和branch/leaf是一样的,实际上并不是。GROUP是用户自己添加的,并不一定要和OPC服务器Branchs一样,每个LEAF是一个 Item,它们可以有用户任意放在哪个组中,不必考虑在服务器中是在哪个branch下,也不必考虑在第几层。7 {. a: c' f- n; U
# ]( |6 S% M2 t+ |" b! }: r& ~7 O
既然我知道了每个ITEM的ID,我想我可以得到各自的SEEVERHANDLE(句柄),从而访问到实际的数据。( a" i3 N( a0 J; k4 A; R
: p. T, S. ?2 l; F 我添加一个组,在其下面建立标签集合,然后用:2 N9 z8 i* P4 B' W6 ?6 M) e
标签组的ADDITEM方法获得句柄。% s5 \0 c2 ?5 ]( c5 L
用同步读方法就可以得到每个标签的数据。6 a, e5 Q* `7 z+ p$ E g2 }5 n
b8 D. M9 V+ E& @, R5 S, T
我发现有问题。昨天我就发现有问题。
. |: m [( T1 V3 i1 f; ~ 今天论坛上没有人给我回答,去国外网站看看,www.opcfoundation.org上有个FORUM,内容很多,有真正的专家,其中一个是OPC基金会的技术代表。FAQ上还保留了从1998-2001年的问题及回答。' Q# F# |; H7 p8 R) l5 L
7 i7 ^* a2 \. F" q) u; ~ 你相信吗,我真的找到了。有一个叫fullqulifity ItemID的说法,比如下面的情况3 R/ h" Y9 g' k% @+ L! a6 W
bch1(树枝)- |# O2 b2 W+ N2 w* U& h
tag11(叶子)% L, ~) ^0 ]' d
tag12 (叶子)' v6 O. q$ o8 y3 v/ Q* X
bch2
4 f' ^4 M. Q6 T1 T, i' ^ tag21 (叶子)9 b0 N/ p! n# D: _$ i" v% B8 B) `, l! c
bch22 (树枝)
2 b- J6 Q0 p }: D tag221 (叶子)
7 A0 g9 p9 T! R tag222 (叶子)7 T1 N2 d8 V! y, U
6 W$ o9 }0 g6 @ & |' h T5 x, y+ I* m4 R4 g
通常的ITEMID是tag11,tag12,tag21,tag221,tag222这样的5 D. r @$ m3 K- e
而Fullqulifity ItemID是bch1.tag11,bcg1.tag12,bch2.bch22.tag221,bch2.bch22.tag222) d* p, u) n. v* f7 j& P
应该用OPCSERVERBROWSER的GetItemId()获得。8 N( T0 V2 D/ E) J# D( r) u" x9 Y
2 M) B( Z ?0 w A! _0 V
修改程序,OK。
+ V# D& [. d/ a4 r5 p8 Q% o
' s2 S: M' k# a) _ 还有什么问题,本机服务器的枚举。
; b Q7 P7 i2 @6 l W$ k- W4 r2 L% N1 c 明天再说吧。ZZZzzz
& W4 E# k! o: a$ U0 u* N0 x
& _# b2 @9 ] ?1 Q0 J# x9 O 第五天1 @$ V ?7 X$ Q
f( z: `. C) j9 X. i# `2 b: Z5 S( l 国外网站上真是有很多有用的东西,不象我们的论坛,原创的少,转载的多,内容也太少了。今天我直奔主题。( V& h. c8 w, o4 P5 O( x
5 T) t" o+ C5 |
上GOOGLE,输入OPC VB SAMPLE CODE ,GO!。很多。5 U4 K$ v" w. w
我选择了一个网站:
- z' T+ o5 Z% A' `6 R/ n www.kepware.com W9 {& ]5 p9 d6 i% u7 @' i
下载一个叫KEPSERVEREX-OPC-EXAMPLE的东东,21M。哈哈,带原代码的OPC客户端工具。运行,很不错,那个WXOPC和它比较一下,简直......8 E8 ~9 H D, `% Q& x
# e5 W3 x8 ?5 X6 S+ q 枚举OPCServer的法子:+ _3 d5 Y# K( M9 a9 j3 U
Dim ServerList as Variant, s9 i$ \8 F2 s8 h! w, A4 w* o
Dim i as Integer- q9 s3 A5 q2 x# l7 q. {8 O
Serverlist=anOPCServer.getOPcServer(node)
! G5 ^' D$ {% w: A& N5 p List1.clear( d: i" r' H8 C$ n1 L2 e
FOR i=lbound(Serverlist) to ubound(Serverlist)
j [( y# f7 s+ V7 N List1.additem serverlist(i)# ~4 G7 [4 t7 { w
NEXT I- U2 D% q8 {# g# o* u5 m
" y: p; ]" o0 ]! J! z5 i- J( I8 c
就这么简单,为什么在论坛上有这么多人在问,而我也没搞懂。
" ]8 r% I& u1 e" w( H" G# f 找到了枚举服务器的办法,在单机上成功。+ i' R- Y2 o- y. d- I9 p( _/ a3 E6 e
其实《入门》也提供了一个DOC文档,是OPC提供的:
4 k( F1 c+ e; q! j+ ~9 e; M" z [ Data Access Automation Interface Standard Version 2.02
1 M' p6 @# g1 s; b4 G- c- e B, j+ ?7 x# x. W
是一个必须的手册,只是有一些错误。错误总是难免的。
8 c3 f# A- p1 U. P1 r* @ 入门如果有人指点,实际上不难,没有指点,实际不容易。好在有网络。
$ m/ F. }3 ^/ y2 c3 w ! X$ o& Q5 K; d# P
上班时,我借了本《数据结构》,里面有算法,不知为什么,我却没找到未知层树的遍历算法。上班可能脑袋不清楚吧。
6 X' N# K( n ~/ T " x% V3 R, N H+ U
第六天
$ I7 o. a/ ~9 Y0 m - |' u7 R' |# N4 l b. A# k
上午,想解决树的问题。昨天的KEPWARE的例子,用了TREEVIEW控件和OPCSERVERBROWSER。2 y' k7 ]; c S2 g% P
1 U; C% t, [! u* |0 `
我用GOOGLE查找“treeview” “树的遍历”,有了答案,好几个地方。仔细一看都是一个。是利用TREEVIEW和递归算法实现计算机文件目录系统的展开。递归,怎么忘记了。
$ c/ Q% W, U: f' D8 b
2 R. a! l- c, F& [: z 采用递归算法实现了枚举所有ITEM的过程。用了3个小时。5 x6 V3 Q' Q# V) i: m( f
5 R2 T9 B5 ?7 d. l0 u
下午休息。
, {( r2 T' Q! y! b( ?
* K+ r0 ]0 Q; y3 F& d W/ ]% H 第七天
& ^# X- p9 c% ?- |
/ }1 i% ]3 s1 q4 [# C6 l 将自己的第一个程序,转成EXE文件,在不同的地方试运行,都正常。
3 k. b* m' _$ T# O
# [3 K0 c) C* H3 U# Y1 i0 v 我想起了第一天安装的那些DLL,还要么。试一下
k3 z& @! X x( b: k/ Q" r, k 将一个改名,运行,出错。再试另一个,出错。一个都不能少。记住。( w& U1 k4 x) h, k
OPCcom_pas.dll 通用接口( B+ l, i# g$ F6 `" Z$ i2 ]8 e# o5 B% t
OPCAutoda.dll 自动化接口8 ^5 g: v8 r% }" @7 l6 h
OPCProxy.dll PROXY-STUB' X3 s; t: A# I3 f
* r# Z/ B9 z+ D1 M' h7 U' q
想起组态软件支持OPC,就用组态王试了一下,发现用OPC和用其他方式没有什么两样。一般设备是先找硬件端口,找设备,找I/O点。而OPC是先找OPC服务器,在找出标签(也是点)。真正的组态没有什么两样。
# x$ D* A$ M; E) Z6 \ \ % ~( m- u3 ^5 |
下午,想做个总结。更想休息,七天了,每天6小时以上。好累。
2 t, ~% Q2 R- k, n * b1 Z3 R6 N" X1 v7 a- z4 `2 c( i8 E
后记
, ]: w4 S% t$ e+ R" Z 这是一次入门的学习,本身没有什么。我却有些感想。6 `; E7 X6 ]% A5 @! a) T
- s* K) z) |3 W) j; e
OPC还是很难的,最起码,要自己编客户端已经不易,何况还有 _) J- J& p x; p& i
OPC ALARM & EVENT 报警和事件
, K5 `9 a9 u" G5 x4 K! E OPC DX 服务器间数据交换5 z" D* g; ^2 F, R0 y6 e
OPC SECURITY 安全
( A+ ^ x% X3 {2 ~) ^ OPC HISTIRDATA 历史数据库8 F9 D- A% j7 |' g; a
OPC XML XML4 V9 \! y0 ^' m7 E8 [9 W J L
OPC .NET FOR .net: c: y5 U- [8 F1 ?6 _) Y# u
这些对于一种工控软件是比不可少的。
2 _3 u0 `$ w2 M, j/ x% F! b
; r1 P+ l; p5 N B. g 工控行业的发展日新月异,我们这个专业要不断学习。真羡慕医生,白头发代表经验,代表水平。我们呢,白头发代表落后。苦。0 P( x7 P) C% ^9 S5 b" d* O5 d
中国工控落后,我们用的95%以上都是外国货,说明书都是外文。还要学好外文。苦。/ E7 @ z- ?: L, Y( u
+ ^) p& q' f5 H$ M; o4 U" \ 这次有多问题的解决都是在国外网站上找到办法的。有种感觉,在网上什么都可以找到,只要你知道你到底要什么。甜。
- Z6 W5 s5 z& y( p / t5 B6 A' k* m: ~; y, y" O- D" |
总算对OPC有了些感觉,累,也甜。 |
|