|
发表于 2008-8-1 16:28:18
|
显示全部楼层
来自: 中国河南新乡
转载 (飘在北京的云~~)
2 W, B2 P3 C: q$ x" D6 l
7 K' N; I4 r- C6 h1 Z* h我从北京买了一本《OPC应用程序入门》,在此之前基本上只是知道有OPC,在五月四日开始,我学了七天。其中有苦有甜。我写下来,权做休息或是练练打字。6 d4 C" w2 g' B5 ^6 k( Y
; U9 d+ d" c& D3 J! q$ k( R9 o 第一天; e* R; X' Z- Q8 U- w$ T9 {& A x
. B+ q- O+ c2 Z+ S, J, ^' [
安装了《入门》提供的东西,包括是下面几个文件。还有个批处理文件,是一个注册过程。3 |# _4 \) c7 A0 h" ^) j
opccomn_ps.dll
' U9 Y0 J( _6 t! @ opcproxy.dll7 m6 @& f* X$ x5 ?* c; \" a
opcdaauto.dll
3 k" d" A( y# X0 f8 y9 |# ]+ Y OPCTrend.ocx
5 `* [' @) W+ m+ H! D: f OPCBar.ocx
" R- Z0 Y- g- S; e0 k OpcServer.exe
4 v) F" I0 X7 Y n/ K4 { OPCJDADemoServer.exe
8 o+ q4 k0 w. i( t% E& W- p6 a7 N
5 x P% U5 h, R5 |4 z: p 看了一阵书,知道了前三个是:通用接口,PROXY-STUB,自动化接口。不明白。
0 |6 E1 z* w: o 后面两个是demo 服务器。3 j8 ^4 A6 x3 O4 n
* X u; W2 `6 E3 m
上网,用GOOGLE,查OPC,很自然就找到了www.opcconnect.com.,又下了个free3 N: c% ~) L! ~3 C) T6 o; X
服务器。安装了(注册)。. t3 O2 `7 d( t3 F/ [- x
8 b4 o& A0 L2 f2 B
到了工控网,看到有人在推荐clienttools,就下了一个,叫WXOPC。运行一下,
1 s* a) e4 I% n % S. m- q: l4 E F# z
点击连接服务器图标,立即出现了三个:
0 l9 C3 P Z3 t* W, e9 H OPCJ.SAMPLESERVER.17 F! {% L I* `# S1 W/ J5 D
OPCJ.DADEMOSERVER.1
. X f3 m. {8 U/ o; s HEXATEC.PCDATA7 O% |; e, q+ n6 M @" k' @
2 Q: g$ d; G' [! @% V
第三个是opcconnect上download的计算机基本情况的简单程序。 g! i$ O& z1 ?* v
) V0 s4 {' Z, E) W 点击他们,还出现了一些“item”,“value"的内容还在变,有意思。我就想这; J! X0 N$ o. o% a1 Y
工具还真不错,不知我能不能做到,但一想,如果这些功能都做不到,这OPC就没多少8 ?+ Y! B# k( F, u' J# }1 Z
人敢学,也就没有市场。) I5 ~7 K5 g7 m: f E
0 g, s) {* z2 z$ W" w! P5 @ 有一段时间没用VB了,先热了热身,看了自己过去编过的code。
: @, d& _2 D' ^/ m# Z# E! F. z+ w 第二日8 Z# T! O. {5 Z }6 R8 s( i5 @
今天先看书。
, D( k( k6 d0 g, \9 \* _4 r 《OPC应用程序入门》,40元,我花了48元,从汇款到收到用了12天,拿到手上,感觉很单薄。我的看书观点是:在看的过程中迷信书,看完后怀疑书,然后忘记书。尽管这本书上我立即就发现有错误。我还是仔细地看下去。! C _5 ?% {0 W$ b5 U7 _# [
5 e, F! ~* g6 L3 k- p* [ 这是一本教人们用VB编应用客户端程序的书,希望让一般工控技术员认识OPC其实不复杂,最起码编用户程序(客户端)不难。" ^) @8 V7 \6 B7 s) o/ D
/ c- {! @. I/ t1 E1 _
在这之前,我对COM和DCOM技术有所了解,也是很模糊的,OPC以COM和DCOM技术为基础,主要是在服务器端(server),而在用户端并不要很在意它们。6 {. Y8 l+ x- z: b
) ~ G. `- g2 t+ t+ u 书上对OPC体系有描述,我画了个图。
7 h/ F$ p1 K/ n* ?( y9 v) X/ p' o - U4 C k8 K# M# j7 t. X
' C! E9 \! w2 W3 M
6 Z3 o. K/ t1 _) S" L
OPCserver是COM组件,如果安装(注册了)一个OPCserver后,利用WINDOWS的组件工具可以看到,如果这个server安装在别的计算机上,不是本地机,那它就是个DCOM组件(分布式)。
$ A3 Y# S7 K9 r6 W0 k. ~
2 A4 M$ |/ ?! D2 J OPC基金会公布了通用接口(用户接口),用C++访问OPCserver只要通过这个接口就可以,并没有必要了解OPCserver是怎么工作的。+ Y R ^' O, n+ ~3 E+ z; U( Y: A# O
/ n1 `8 E6 }. b5 b8 k6 e7 M 对于VB、VBA、EXCEL、DELPHI等编程软件或工具,不能直接访问通用接口,而要通过所谓的自动化接口(automation interface),OPC组织发布了 DATA ACESS 2.0,实际上已经有了3.0版。
' L3 V; c+ H4 @, b; d) c + o2 ?( p4 d1 u5 n
而在通用接口和自动化接口之间还有一个东西,是成对使用的,有点象MODEM,在两个接口之间起数据传输作用,有个名字叫PROXY_STUB(代理—占位,翻译还不如不翻译,反正不懂)。
2 f1 a7 i/ n1 R6 ^% D
- F& k/ \: j$ Q 我在第一天中安装的几个DLL中:$ ], J, S2 j0 r3 _( ?
OPCcomn_ps.dll 通用接口: p0 T$ ^; p4 K$ k' v9 W* \3 \
OPCdaAuto.dll 自动化接口
3 _1 x) N/ `4 D OPCProxy.dll PROXY-STUB1 M9 `( m2 }; a
9 h+ I6 H" l7 t3 G# [
我们的任务是用VB编写客户端程序,只要知道怎样用自动化接口就行了。其他的不去钻了,要不一年也搞不明白。' N4 ]8 s! N U) X* f
) f4 l; D0 c" S3 \. U0 |# w
我运行VB6.0,新建一个新工程,点击菜单中的“工程”.“引用”,选择”OPC AUTOMATION 2.0”,就可以利用自动化接口。
0 t2 m& l, \7 x* ]' t/ B6 t$ e6 k
3 P8 C x) O7 t! [1 i' } 《入门》没有建议将这些DLL安装在什么目录,我觉得放在WINDOWS的SYSTEM下是比较好的。
# A; O, q! j2 O: z
E5 {0 c# l$ i/ r 按照书上的顺序,先了解OPC的数据组织。我也画了图。; z! _/ O6 C K$ A, i3 z9 s! |
Z3 I4 \$ {& ^; r; n2 v
" [9 U+ w( \+ i4 b. _% m5 m
8 j1 ?) c/ T5 w6 r5 X4 K" q; M7 N6 c7 J) ^" f# f b2 l
我们要的就是item,翻译成标签,这就是点,我们所谓的点,比如PLC的I/O点,仪表的数值等。编客户端的开始就是找出数据。0 S/ y$ U; U; _5 r7 Q$ v
" P W/ I9 u5 d2 B 根据书的介绍,要访问标签,还有其他工作要做。5 L' O2 w+ }. s$ q( r4 e
我累了。明天再说。
y, q: @, J/ _7 m
4 y9 a- t6 |+ U% w) K7 E k( p 第三天
9 c. M$ S/ w4 `7 w2 ]9 I 昨天说到访问标签先要做些事。
! K t3 E" M. D2 [5 `" _+ T5 F % y7 E" E3 k8 z8 \3 W/ a7 @. P0 n) D
首先要找出你要访问的OPC服务器的名字,连接它,建立一个组( GROUP)的集合,在下面建立一个具体的GROUP,在这个组中添加一个或多个标签。才可以访问。0 V) G# t- g4 | G) ]+ r* f
/ ?8 A/ m; g6 h/ p, J
我用第一天下载的WXOPC工具,看到了三个服务器,我选择了其中一个
* v: p" i/ Q1 u% ~8 T hexatec.pcdata.1,是一个计算机基本情况的DEMO服务器,我发现服务器的名字都是这种格式。
" y' K* \! v' C0 O! |7 v 6 w1 v4 t. {- H9 I; Y C9 D
按《入门》的样子,做了个客户端的架子,一个小时后完成了服务器的连接,新建组集合,建立一个具体的组。下面有些不清楚。干脆拿《入门》的演示程序打开来研究。
* [2 ~ C# @, X, [- J 直接运行,没问题,看到了数据的变化,决定看其原代码。0 h! n; x, V% v) u" L
: ~% f0 ?/ \. F 它用的是OPCJ.SAMPLESERVER.1这个服务器,没有实际意义,每个数据都可以读写。, p+ }* v5 O( c' W: I+ A& j
我发现标签名可以任意编,好奇怪。但是我用WXOPC看到的标签,数据却不一样。' p' w! u9 M: R1 B ~
& Z" V: c6 q2 w1 V% | h: ] 我在FORM上加了个text 控件,叫text1,我让服务器名等于text1.text,这样我可以自由换服务器,还不错,几个服务器都可以连接上。但是只有它自己的服务器才可以读出数据。是不是骗人。
, D/ e; T% G4 |3 e2 g
, S! E& V) k% ~1 C* { S) X 试一下按服务器自己的ItemID去访问,我用WXOPC找出hexatec.pcdata.1的标签名,比如“version”,发现还是出错。1 W( X3 Q/ j8 Y6 i0 v% ]
我又到工控论坛上,问已知标签怎样才可以读出数据。没有人回答。
: }- k! {) W6 |& l# B
G# [" g4 u; J$ d U 我给自己留下了两个问题:
# ^- X# h1 j+ O& ?# C* Q2 v/ l% A4 g 1÷怎样获得本机上得所有OPCserver,获得正确的名字。我看到WXOPC可以。论坛上也很多人在问。$ R# e8 E; z1 ]! E- b5 h# J
2÷如何访问ITEM,取得其数据等。
" q) [4 S, b0 ]+ E
$ O; ]. P6 F2 U \0 n' l- u 又看了一会书,看了有关OPCSERVERBROWSER的内容,好像是有用。
+ v5 n5 @. g9 e9 u* T 今天到此为止,0 A H- ?; U4 }6 S4 p/ X6 ^% r0 K
休息
4 c% F8 }* Y7 |" j+ k8 s
) I4 p4 Z! E- M3 G: i 第四天# y" j' g( p( U0 P% I
熟悉OPCSERVERBROWSER的用法。主要有showbranchs,showleafs,movedown,movetoroot7 ~6 j6 E! m1 k& M
等等。OPC服务器,实际上是一棵树,有brahchs和leafs组成。我编了一个简单的SUB,实现了两层的树的ITEM的枚举,实现不了第三层。这实际上是树的遍历算法问题。我不知怎么做。我准备去问别人。2 V3 u# j; J$ c: R3 o+ g3 [
9 R4 y& R! O: ?3 y/ R) f* q
从形式上所谓的GROUP/ITEM 和branch/leaf是一样的,实际上并不是。GROUP是用户自己添加的,并不一定要和OPC服务器Branchs一样,每个LEAF是一个 Item,它们可以有用户任意放在哪个组中,不必考虑在服务器中是在哪个branch下,也不必考虑在第几层。
* U- k) ~4 U5 X: y' S$ h- W : f& V! t+ o" h2 z
既然我知道了每个ITEM的ID,我想我可以得到各自的SEEVERHANDLE(句柄),从而访问到实际的数据。& c- ?/ F/ |2 i2 ]
6 D# Y/ R! p9 p) P 我添加一个组,在其下面建立标签集合,然后用:& N6 _. Z+ |' E& S
标签组的ADDITEM方法获得句柄。" [4 M' y' d. p' w h' C
用同步读方法就可以得到每个标签的数据。
- q- y6 E% W# F
- x1 P( V* O5 e 我发现有问题。昨天我就发现有问题。
6 G2 k" O. e' L 今天论坛上没有人给我回答,去国外网站看看,www.opcfoundation.org上有个FORUM,内容很多,有真正的专家,其中一个是OPC基金会的技术代表。FAQ上还保留了从1998-2001年的问题及回答。
! @" i: h" e5 s
; g( D& X+ z$ I: J. x/ [. g- B3 I 你相信吗,我真的找到了。有一个叫fullqulifity ItemID的说法,比如下面的情况4 J, }+ {% c4 E
bch1(树枝)
* _& R0 ~9 D! J" D ^ tag11(叶子)$ p' [0 m. Q/ i5 _/ @) v7 p% f
tag12 (叶子)
2 U* R3 B( j* G1 z bch2 W/ F. ^- _6 g9 |
tag21 (叶子)
9 I0 Z; F9 ]2 t: U2 f, I3 k bch22 (树枝)
% j" D+ I; m: y2 k tag221 (叶子)
$ Q6 L5 U0 }* d ?. _6 r tag222 (叶子)4 x1 Q8 q, X i' m, z' R# [
4 R; J6 d/ h; j$ _) l# d E. K! v- u( b, k/ J% Z6 g, g$ C
通常的ITEMID是tag11,tag12,tag21,tag221,tag222这样的0 t: U& f/ H8 Z' g' y6 d0 l
而Fullqulifity ItemID是bch1.tag11,bcg1.tag12,bch2.bch22.tag221,bch2.bch22.tag222% z- C% `. @; e
应该用OPCSERVERBROWSER的GetItemId()获得。
7 R; v5 ]& G3 \2 N' i% N
7 J# o0 X% I; W; `$ n) o- Y2 d* c: Z 修改程序,OK。
9 B$ n5 K; b( O* u4 k) U( y& D 2 x3 P' [ K( b6 ?5 ~. K( z
还有什么问题,本机服务器的枚举。
' z7 \) H! c/ C1 e% w$ ^ 明天再说吧。ZZZzzz# A$ I7 ^; z/ P! l
( @5 @1 j0 U$ Q: b: T+ `! U
第五天
) }) F; J5 w, |" I2 ^
9 t4 g; W2 v; N0 c7 E1 @3 L 国外网站上真是有很多有用的东西,不象我们的论坛,原创的少,转载的多,内容也太少了。今天我直奔主题。" s7 w' U* s+ `9 b j( O5 x
: U0 P+ ]4 o! h' g! g
上GOOGLE,输入OPC VB SAMPLE CODE ,GO!。很多。! O+ }8 t5 i+ \+ D, U" y9 v& d' [
我选择了一个网站:7 S6 |0 E4 F+ V, M
www.kepware.com' G6 t) w- {) O# H" ] I1 o
下载一个叫KEPSERVEREX-OPC-EXAMPLE的东东,21M。哈哈,带原代码的OPC客户端工具。运行,很不错,那个WXOPC和它比较一下,简直......# B1 Y0 _5 z6 _$ n- c
4 _. P& l3 R; C4 e/ z! U 枚举OPCServer的法子:
2 I' ~1 c; H& Q% c# G Dim ServerList as Variant: u* Q# Q4 z0 Z, Q7 g0 V, y! G6 Y
Dim i as Integer
9 Z1 R, N0 a" X+ C* r( s Serverlist=anOPCServer.getOPcServer(node)
' V. t4 N$ c4 S& D List1.clear) i. f( }8 A2 t1 F$ t+ L. l v: B) ]
FOR i=lbound(Serverlist) to ubound(Serverlist)3 O5 U/ q1 Y5 v' V$ X: S5 |
List1.additem serverlist(i)
6 G( B. o% _ z7 Z! o$ j" e: T NEXT I
( V5 M; a) ?$ v, m $ ~2 p+ q7 M; ^5 W# l7 k0 d
就这么简单,为什么在论坛上有这么多人在问,而我也没搞懂。/ P0 p! r# |, v
找到了枚举服务器的办法,在单机上成功。7 l I$ z& Y7 q. \0 `
其实《入门》也提供了一个DOC文档,是OPC提供的:
$ w+ `& N! s/ K g& x/ x! E9 L Data Access Automation Interface Standard Version 2.020 s( y+ K% L F% u* {+ ?
3 F& a# P A) U: W: P 是一个必须的手册,只是有一些错误。错误总是难免的。, c' _, ^! y# N1 ?3 _4 X/ l
入门如果有人指点,实际上不难,没有指点,实际不容易。好在有网络。
: w Z* N& W5 u9 i4 n2 | 5 I1 Y8 C& |6 Z/ g
上班时,我借了本《数据结构》,里面有算法,不知为什么,我却没找到未知层树的遍历算法。上班可能脑袋不清楚吧。, m: s3 m0 K6 `" R
7 v% [1 m7 \5 m$ H
第六天, n$ v8 E4 z% b7 q* o0 l
8 B1 `$ O3 L2 J 上午,想解决树的问题。昨天的KEPWARE的例子,用了TREEVIEW控件和OPCSERVERBROWSER。. {: n8 i) ]+ q' G5 `0 y( [
+ H+ Q2 |' w& g! p3 U 我用GOOGLE查找“treeview” “树的遍历”,有了答案,好几个地方。仔细一看都是一个。是利用TREEVIEW和递归算法实现计算机文件目录系统的展开。递归,怎么忘记了。 O; q, [& `2 {$ Y( I- O0 t' o
3 @1 q) h4 S: |% r- g 采用递归算法实现了枚举所有ITEM的过程。用了3个小时。/ r3 E5 M5 j. g
" x& L0 J% U. v" \% B
下午休息。6 N* x5 M8 f/ d; z( h, ]
; J6 x8 {( x4 P6 Q- r
第七天) i1 O" Z7 L5 K: S5 Q- e4 g6 w3 v
; }7 ~' x; X: } G, c' |+ H 将自己的第一个程序,转成EXE文件,在不同的地方试运行,都正常。
8 d. [* _& V% g7 D
7 U) t7 e$ f# Q0 K( I8 Q& T 我想起了第一天安装的那些DLL,还要么。试一下4 l0 [% n9 f+ d6 z3 q8 `4 q0 I
将一个改名,运行,出错。再试另一个,出错。一个都不能少。记住。
# ?/ v( [9 i# K2 V) b; ] OPCcom_pas.dll 通用接口
/ N; ~, C; x( }% @6 ]# E7 H OPCAutoda.dll 自动化接口1 k6 b8 m. B% y; C
OPCProxy.dll PROXY-STUB
: A4 g' F2 {# o5 {& j5 }. b $ a1 a" P: C6 B& n
想起组态软件支持OPC,就用组态王试了一下,发现用OPC和用其他方式没有什么两样。一般设备是先找硬件端口,找设备,找I/O点。而OPC是先找OPC服务器,在找出标签(也是点)。真正的组态没有什么两样。
4 c1 @0 b' t6 C* A
3 E3 o" ?1 M9 I, n9 K: c 下午,想做个总结。更想休息,七天了,每天6小时以上。好累。' c7 Y8 ~9 n d
. T& v7 d& P' T6 V" [8 V6 Z 后记
! P+ Z- H4 h4 Q8 P 这是一次入门的学习,本身没有什么。我却有些感想。. V$ Y9 M6 E, a8 X$ v
) Q6 f' d/ `, G/ Q
OPC还是很难的,最起码,要自己编客户端已经不易,何况还有: B3 R: ]/ a% l d' W. S5 b0 s
OPC ALARM & EVENT 报警和事件: q. L1 l0 D( c0 H! _7 J( v
OPC DX 服务器间数据交换' W d2 J3 m' g8 t
OPC SECURITY 安全$ `, a) E5 N: ~
OPC HISTIRDATA 历史数据库5 A# n& k8 ]" ~, K
OPC XML XML6 Y% n$ L: D3 A. T3 f) \: V' f9 e
OPC .NET FOR .net: h7 m1 @2 W( W5 {) w2 S
这些对于一种工控软件是比不可少的。' A3 t( e; S3 U8 Z3 }# l
" f! n$ [; l2 B( f. i
工控行业的发展日新月异,我们这个专业要不断学习。真羡慕医生,白头发代表经验,代表水平。我们呢,白头发代表落后。苦。
5 ` G! ]# E8 v' h( z 中国工控落后,我们用的95%以上都是外国货,说明书都是外文。还要学好外文。苦。7 x; R& Z6 F+ }9 R% Z
, {0 z' q+ O0 t) g 这次有多问题的解决都是在国外网站上找到办法的。有种感觉,在网上什么都可以找到,只要你知道你到底要什么。甜。! n n/ Y7 ?: C; R% L
/ W) X) k/ B5 V- s. c4 O 总算对OPC有了些感觉,累,也甜。 |
|