|
|
发表于 2008-8-1 16:28:18
|
显示全部楼层
来自: 中国河南新乡
转载 (飘在北京的云~~)
& x' {/ D4 x; L: ?- t; @
2 T1 r* o. v4 `. N& ~/ h; b/ r9 Y* c我从北京买了一本《OPC应用程序入门》,在此之前基本上只是知道有OPC,在五月四日开始,我学了七天。其中有苦有甜。我写下来,权做休息或是练练打字。
% G) Z! F8 Y5 k- X* P- P `3 A7 C4 d: d! R3 _
第一天
- c; s: [) K* Z" M + q% ~/ P2 ?. G/ V f; Y' T
安装了《入门》提供的东西,包括是下面几个文件。还有个批处理文件,是一个注册过程。% G+ U: g9 r3 L
opccomn_ps.dll# O6 k y0 E6 J7 ?
opcproxy.dll
+ E- A! N! _) ~ R6 {" U! H3 c opcdaauto.dll
7 s0 u! Q$ w/ z$ ?8 E; C8 G3 \ OPCTrend.ocx
7 M8 g/ h+ \- N4 e. ?/ |& I! l OPCBar.ocx
1 r4 {7 _4 d& C OpcServer.exe $ k7 w2 X# X$ y6 }
OPCJDADemoServer.exe0 t4 m( m; Y+ h
1 k1 K0 ?* [2 c! r( T$ f
看了一阵书,知道了前三个是:通用接口,PROXY-STUB,自动化接口。不明白。
7 |3 b! Z8 q- ^- K+ z' m9 b9 p 后面两个是demo 服务器。2 d2 F' I* p+ w: N4 H2 v3 X% Y
% {! d# r7 `) ]4 t" y
上网,用GOOGLE,查OPC,很自然就找到了www.opcconnect.com.,又下了个free
. y3 L, V: U/ G+ S4 f$ F 服务器。安装了(注册)。' h3 i4 N% e2 S7 |3 G
0 m. s# t7 {& E3 I _1 v2 n7 l
到了工控网,看到有人在推荐clienttools,就下了一个,叫WXOPC。运行一下,
. } |% F9 o6 a" `8 H& B6 m
4 y5 h- \: b! d/ D 点击连接服务器图标,立即出现了三个:
) u) J& w9 h' Q- S+ j. R OPCJ.SAMPLESERVER.1
6 q1 B$ [( ^8 ~2 V( z; Y OPCJ.DADEMOSERVER.10 C ^# |, n: v5 N- z7 \
HEXATEC.PCDATA1 o0 o! j# b4 t- ~3 \* ^
) e- b2 Q* f Q8 w
第三个是opcconnect上download的计算机基本情况的简单程序。/ t. K7 w6 ?5 `0 L% J( G
$ q- {! i2 S9 ` 点击他们,还出现了一些“item”,“value"的内容还在变,有意思。我就想这
% V4 M. }+ k! H' D 工具还真不错,不知我能不能做到,但一想,如果这些功能都做不到,这OPC就没多少
% C; X2 w# r8 t) ?) T 人敢学,也就没有市场。
{, j) \( |/ m - l; l5 b5 E' V) J; U% j8 W
有一段时间没用VB了,先热了热身,看了自己过去编过的code。
1 t# r+ c' }$ P9 g- l9 z 第二日
0 t8 l% z& D4 M" a1 i 今天先看书。
3 }0 ?, Y) C- y/ A: T 《OPC应用程序入门》,40元,我花了48元,从汇款到收到用了12天,拿到手上,感觉很单薄。我的看书观点是:在看的过程中迷信书,看完后怀疑书,然后忘记书。尽管这本书上我立即就发现有错误。我还是仔细地看下去。' ^5 Y# G+ b6 e$ ]# l3 X
0 I N: O2 G7 ^% n ?& T; Q- M 这是一本教人们用VB编应用客户端程序的书,希望让一般工控技术员认识OPC其实不复杂,最起码编用户程序(客户端)不难。. j. ?6 a$ |0 \0 e( ~
! t! X& U, E" @
在这之前,我对COM和DCOM技术有所了解,也是很模糊的,OPC以COM和DCOM技术为基础,主要是在服务器端(server),而在用户端并不要很在意它们。: S8 ?7 v& @' Z# l O( \
$ J- t" S4 M7 O3 y 书上对OPC体系有描述,我画了个图。
Q, G7 g2 Q3 }/ ? 3 o0 g7 E: e" X( l3 c8 D# j/ ?
$ ]$ W1 r/ g) t' d1 A& O) F) _$ m$ P0 ~5 F/ N
OPCserver是COM组件,如果安装(注册了)一个OPCserver后,利用WINDOWS的组件工具可以看到,如果这个server安装在别的计算机上,不是本地机,那它就是个DCOM组件(分布式)。
+ W* Q3 R. `, M t: V: M+ Y3 X
% T8 x+ t: M4 |8 P/ Y. y/ s6 e OPC基金会公布了通用接口(用户接口),用C++访问OPCserver只要通过这个接口就可以,并没有必要了解OPCserver是怎么工作的。
( w# K. ]2 h9 n1 l- J
' w% e1 r. X. X5 m% j 对于VB、VBA、EXCEL、DELPHI等编程软件或工具,不能直接访问通用接口,而要通过所谓的自动化接口(automation interface),OPC组织发布了 DATA ACESS 2.0,实际上已经有了3.0版。7 x1 w* W4 D3 [
1 N0 f6 X' _7 z z1 L/ t6 H
而在通用接口和自动化接口之间还有一个东西,是成对使用的,有点象MODEM,在两个接口之间起数据传输作用,有个名字叫PROXY_STUB(代理—占位,翻译还不如不翻译,反正不懂)。
4 g) [& T" k8 _$ |* \ X; E, r
# z" P" U7 Z8 n+ M6 W 我在第一天中安装的几个DLL中:
- c* F3 W! V& a9 B5 i" M0 S3 T( [ OPCcomn_ps.dll 通用接口% K" P( z: l* Q" ^( x3 `
OPCdaAuto.dll 自动化接口6 V; v- g6 l* O7 ?: ?( c5 [. ?
OPCProxy.dll PROXY-STUB
4 h3 t! p4 C) X
8 U) y8 \, J3 ?- E) v 我们的任务是用VB编写客户端程序,只要知道怎样用自动化接口就行了。其他的不去钻了,要不一年也搞不明白。
8 t! L1 o# R! V l; p1 X# m ( K. z$ v& o- m" O% [/ l
我运行VB6.0,新建一个新工程,点击菜单中的“工程”.“引用”,选择”OPC AUTOMATION 2.0”,就可以利用自动化接口。
, H2 c! I/ Y3 _# s ' h) E3 c6 @; i/ I8 C0 `
《入门》没有建议将这些DLL安装在什么目录,我觉得放在WINDOWS的SYSTEM下是比较好的。" J5 x, g$ b0 s' _+ T" e0 m
, i) H; ?( G) r' t! U 按照书上的顺序,先了解OPC的数据组织。我也画了图。
3 F& S. u4 H$ Q8 {
* c F9 @7 p2 m2 Q( n/ m
" r% b6 i8 {* l$ @% e! G; d5 e9 j: M/ J8 l/ }& C$ S5 t/ u
, V% {/ r8 Y7 }/ Y+ [ 我们要的就是item,翻译成标签,这就是点,我们所谓的点,比如PLC的I/O点,仪表的数值等。编客户端的开始就是找出数据。( N3 l. h# i c1 h) M
. U* g# U U2 g# E1 i y0 y
根据书的介绍,要访问标签,还有其他工作要做。
5 D9 b2 v% E5 V7 ?) K 我累了。明天再说。" b( m4 K# L% b1 c
% s n. w& m5 Q L& g" b
第三天1 `+ x' V" a- {$ P" x0 A* r
昨天说到访问标签先要做些事。4 ]4 l& J* J" V
& b1 _6 [) N( i" ]! n 首先要找出你要访问的OPC服务器的名字,连接它,建立一个组( GROUP)的集合,在下面建立一个具体的GROUP,在这个组中添加一个或多个标签。才可以访问。" I. _+ b' b3 f8 d
- R3 @) W) b a3 X, n
我用第一天下载的WXOPC工具,看到了三个服务器,我选择了其中一个2 x+ j' z/ x" l" o
hexatec.pcdata.1,是一个计算机基本情况的DEMO服务器,我发现服务器的名字都是这种格式。
" S" H* ?0 P# Y3 u7 {7 ]4 F
9 N0 E& c* S$ |. s3 M+ c6 \ 按《入门》的样子,做了个客户端的架子,一个小时后完成了服务器的连接,新建组集合,建立一个具体的组。下面有些不清楚。干脆拿《入门》的演示程序打开来研究。
. h7 A& e3 f7 `/ w& N% x 直接运行,没问题,看到了数据的变化,决定看其原代码。. x* y- Q3 E" t7 M
7 ?4 [& f5 s' n+ s: M
它用的是OPCJ.SAMPLESERVER.1这个服务器,没有实际意义,每个数据都可以读写。8 h+ D. z8 k5 K* Q7 i5 \% P4 Z
我发现标签名可以任意编,好奇怪。但是我用WXOPC看到的标签,数据却不一样。
) H* N* c* ]0 D
6 T" w9 }2 s3 f5 C3 n6 a1 s, O ` 我在FORM上加了个text 控件,叫text1,我让服务器名等于text1.text,这样我可以自由换服务器,还不错,几个服务器都可以连接上。但是只有它自己的服务器才可以读出数据。是不是骗人。+ X: R. V. S, W8 Q5 t
" u4 I/ V: y9 ?+ G* m' o, I2 J 试一下按服务器自己的ItemID去访问,我用WXOPC找出hexatec.pcdata.1的标签名,比如“version”,发现还是出错。
$ d9 t4 n s4 ?, h8 c/ K- |# C 我又到工控论坛上,问已知标签怎样才可以读出数据。没有人回答。
8 p( J) Y/ \/ g. {6 R9 G) P( H % J4 Z/ c" i; \ c v
我给自己留下了两个问题:3 l6 i' n% ~( m' S: r; H8 F
1÷怎样获得本机上得所有OPCserver,获得正确的名字。我看到WXOPC可以。论坛上也很多人在问。
, t8 _# P4 {' [% K 2÷如何访问ITEM,取得其数据等。, z5 `9 Z3 z1 b. o+ Y
; v+ w. d; o- x' C& B4 b 又看了一会书,看了有关OPCSERVERBROWSER的内容,好像是有用。2 o% U+ y+ F, K) o: d$ Q
今天到此为止,6 H: ~6 H% j! R
休息. p. c* i8 G: e b4 O8 Q$ k! d" @
5 k$ f+ A! @2 _' H# m 第四天
c7 A" N* o, p5 \" h6 |5 O 熟悉OPCSERVERBROWSER的用法。主要有showbranchs,showleafs,movedown,movetoroot
. x2 U; v: ]& Q$ n4 \' ]' J/ L 等等。OPC服务器,实际上是一棵树,有brahchs和leafs组成。我编了一个简单的SUB,实现了两层的树的ITEM的枚举,实现不了第三层。这实际上是树的遍历算法问题。我不知怎么做。我准备去问别人。
0 j4 ]7 q7 ~" X" b( A& Z
, y# H" ]3 V) C% A 从形式上所谓的GROUP/ITEM 和branch/leaf是一样的,实际上并不是。GROUP是用户自己添加的,并不一定要和OPC服务器Branchs一样,每个LEAF是一个 Item,它们可以有用户任意放在哪个组中,不必考虑在服务器中是在哪个branch下,也不必考虑在第几层。
: `/ v( d& w- o& n3 Z
! X& d( f/ b7 c0 O 既然我知道了每个ITEM的ID,我想我可以得到各自的SEEVERHANDLE(句柄),从而访问到实际的数据。: K" L x; H7 P5 [
& U0 H$ e; C* h% y; ]8 L# T# @% W
我添加一个组,在其下面建立标签集合,然后用:
( |7 j" Y0 O/ u$ E2 f 标签组的ADDITEM方法获得句柄。8 Y5 g: m+ q; V
用同步读方法就可以得到每个标签的数据。- D" ]4 f7 [/ ^9 {5 ?% A: h
' H( l0 `) [" y0 m 我发现有问题。昨天我就发现有问题。+ M, V- e) R0 t! V
今天论坛上没有人给我回答,去国外网站看看,www.opcfoundation.org上有个FORUM,内容很多,有真正的专家,其中一个是OPC基金会的技术代表。FAQ上还保留了从1998-2001年的问题及回答。
1 {% g$ x% k4 b9 H! q/ D& D( ] 9 O J8 f; V+ O1 W# b2 M
你相信吗,我真的找到了。有一个叫fullqulifity ItemID的说法,比如下面的情况% r) c: |3 u' M* P. C. Y/ t6 O' _. z* S, Z
bch1(树枝)# ?/ R- G; F! }2 b0 d
tag11(叶子) @3 G. e9 [5 P3 l
tag12 (叶子)( R7 P2 y$ o K- L' i1 {
bch2" M# f9 G8 _ n
tag21 (叶子)
/ R% u: p1 `. P+ M- U* c* V bch22 (树枝)3 S7 N( L: y0 P" X9 L+ L. X
tag221 (叶子)8 p( R2 ?( F$ z8 t0 B9 S
tag222 (叶子)
, u: d# W( z* H# j3 w
) q8 ]' u) E8 |* ]8 m# A. Y Q ' A0 [0 y' J' I; _$ q
通常的ITEMID是tag11,tag12,tag21,tag221,tag222这样的
- r: U8 @4 S: f+ x! t 而Fullqulifity ItemID是bch1.tag11,bcg1.tag12,bch2.bch22.tag221,bch2.bch22.tag222/ H/ ^. ]3 r5 c4 u6 m& |. {
应该用OPCSERVERBROWSER的GetItemId()获得。$ h* D: p5 {# G2 d( Y
: N1 O9 k" ]. D" Q8 D$ {. |1 x7 \ 修改程序,OK。
/ e9 F+ z" a1 s6 l0 {( e
! c( @: D- G1 M6 o# g$ H; Q 还有什么问题,本机服务器的枚举。, R8 {/ J! ?- M" C2 P
明天再说吧。ZZZzzz) z* V% y1 n) D0 D/ N" J) O, m
4 m2 V6 O4 M6 x6 U! }. I! m$ w
第五天
! U+ G/ p- f$ ?, I7 X6 O9 T
, `' n& a! |9 i5 E) d 国外网站上真是有很多有用的东西,不象我们的论坛,原创的少,转载的多,内容也太少了。今天我直奔主题。
9 Q& e+ G+ D4 w3 A# s8 y; v/ d + X3 k, Y4 d9 r. h7 @0 k
上GOOGLE,输入OPC VB SAMPLE CODE ,GO!。很多。
5 H" Y4 c" R0 G, J9 n+ @' h 我选择了一个网站:
' B$ R0 G/ n; c% R6 u4 i7 p www.kepware.com
# Q) f. i) [: V/ R L6 O- F8 r 下载一个叫KEPSERVEREX-OPC-EXAMPLE的东东,21M。哈哈,带原代码的OPC客户端工具。运行,很不错,那个WXOPC和它比较一下,简直......
! P$ X" ^1 G1 @3 y
5 L& @% E' @# ^7 a2 r; O 枚举OPCServer的法子:
% E* L4 p G9 p Dim ServerList as Variant; J. N$ t. v) G/ j/ R# S1 I
Dim i as Integer
8 e, ?/ j/ @1 B Serverlist=anOPCServer.getOPcServer(node)% Y5 d, |& G8 P0 z3 {( w
List1.clear1 X: }8 j! R* @ M0 b- M5 J2 Z9 R
FOR i=lbound(Serverlist) to ubound(Serverlist)9 Y4 ~/ A2 F( r+ z+ \% w
List1.additem serverlist(i)% v, S% {4 H: \2 F. W- C
NEXT I
% i! e8 |6 J, k9 G( x9 V# O # g# `* ^0 _: n% }. {4 _
就这么简单,为什么在论坛上有这么多人在问,而我也没搞懂。 o$ U. C. h, g/ P. x' `
找到了枚举服务器的办法,在单机上成功。
: ]4 Y6 x+ y9 W' \& @- L& [0 W 其实《入门》也提供了一个DOC文档,是OPC提供的:
( Y) R2 m# D/ j) _ A8 c Data Access Automation Interface Standard Version 2.02
# P7 f& r) W5 p; ?# ^5 [# C' z* I
|8 H# c4 ?6 k# e1 W 是一个必须的手册,只是有一些错误。错误总是难免的。
p+ g6 o& h* v' L 入门如果有人指点,实际上不难,没有指点,实际不容易。好在有网络。% p0 L0 b# _: X6 D9 {
) K8 L0 X2 H) B6 x0 ~2 \ 上班时,我借了本《数据结构》,里面有算法,不知为什么,我却没找到未知层树的遍历算法。上班可能脑袋不清楚吧。! J8 } u1 f' Z/ H' F5 L
; `& U: ?1 ]2 H0 g) P% B9 P. _ 第六天
, M* g# F" X3 H
* p6 l: l- y6 q4 z6 y 上午,想解决树的问题。昨天的KEPWARE的例子,用了TREEVIEW控件和OPCSERVERBROWSER。# e" R4 Y) H5 c9 ?
! \+ ^& x4 o; U" j6 l0 w# Z0 ^0 J
我用GOOGLE查找“treeview” “树的遍历”,有了答案,好几个地方。仔细一看都是一个。是利用TREEVIEW和递归算法实现计算机文件目录系统的展开。递归,怎么忘记了。
) q4 v8 B9 a8 l p# B5 S5 W
0 Q3 l2 H X0 ] 采用递归算法实现了枚举所有ITEM的过程。用了3个小时。
; | C0 L4 t# X2 t9 b9 w( H) o" e
4 Y; U0 a9 X. _; I 下午休息。
# T) m N0 e6 }6 ]5 S + _- c' ]$ ~# Z; V% F+ Q
第七天1 I8 S: T$ c9 D9 ~8 F+ Y
, j3 D1 J; f" Y# V9 D' q4 [& f 将自己的第一个程序,转成EXE文件,在不同的地方试运行,都正常。
+ s5 Z, l. M- ?, X k + m; |+ r4 u) Y# Y& n3 c" h4 B% b
我想起了第一天安装的那些DLL,还要么。试一下# _# ~; d, a* R7 C0 f! l+ }
将一个改名,运行,出错。再试另一个,出错。一个都不能少。记住。, ]9 G8 Y9 ]0 c9 k
OPCcom_pas.dll 通用接口
+ c& O6 {( V+ T( r' Z. M R8 W) n OPCAutoda.dll 自动化接口" B E* i4 ~$ Y% d: @2 b# O
OPCProxy.dll PROXY-STUB! d8 R1 b# g; R* {" c/ ~/ I* n
; E/ z' G! a/ C+ S5 o% N$ c3 h
想起组态软件支持OPC,就用组态王试了一下,发现用OPC和用其他方式没有什么两样。一般设备是先找硬件端口,找设备,找I/O点。而OPC是先找OPC服务器,在找出标签(也是点)。真正的组态没有什么两样。
0 n& Y! ~0 X) W3 ]# W J R' V) e- j / c. H l( T& b9 N- e; D, _6 r, [& Z
下午,想做个总结。更想休息,七天了,每天6小时以上。好累。( j6 F; V q7 R& q8 f9 N
0 T) V4 T+ L, y4 W0 L& y# H+ ?+ e4 e
后记3 z; a3 _9 v* w6 y0 o: N/ @% b
这是一次入门的学习,本身没有什么。我却有些感想。1 V( ?3 R4 A8 c$ {
5 j7 K |# v! [* |% g }. N R OPC还是很难的,最起码,要自己编客户端已经不易,何况还有: ] N& o/ `9 Q
OPC ALARM & EVENT 报警和事件; K; ^5 H9 r+ {; \6 \' D5 I/ L
OPC DX 服务器间数据交换
" V7 R- F1 _) N5 g1 R3 c1 v' X6 g3 u OPC SECURITY 安全6 W" V6 O T6 q" P7 x- k2 P2 L) v
OPC HISTIRDATA 历史数据库
2 c7 r' C, _" S2 x5 F. I OPC XML XML
; C: s( l$ ~$ _/ P9 ?) h$ Z- a OPC .NET FOR .net( O! r3 p9 S3 A- \/ [! R8 e
这些对于一种工控软件是比不可少的。& w; N4 K. M! q0 W: Z
& b4 }$ h( ?2 _4 J L1 R- k( e
工控行业的发展日新月异,我们这个专业要不断学习。真羡慕医生,白头发代表经验,代表水平。我们呢,白头发代表落后。苦。
1 k7 J9 e$ T' Q6 X: c 中国工控落后,我们用的95%以上都是外国货,说明书都是外文。还要学好外文。苦。, }1 _" A% p2 B9 {; z
7 |, t9 a1 s% H# U9 u
这次有多问题的解决都是在国外网站上找到办法的。有种感觉,在网上什么都可以找到,只要你知道你到底要什么。甜。" o; o/ a) M4 G/ |
! G: l' }7 p9 [$ \) }; L1 W 总算对OPC有了些感觉,累,也甜。 |
|