|
发表于 2008-8-1 16:28:18
|
显示全部楼层
来自: 中国河南新乡
转载 (飘在北京的云~~)' H7 H. T& ?, e
9 M0 O* [9 Y. q
我从北京买了一本《OPC应用程序入门》,在此之前基本上只是知道有OPC,在五月四日开始,我学了七天。其中有苦有甜。我写下来,权做休息或是练练打字。
; M3 b( f' l9 r2 {+ o
1 v6 b! p! {& ^, j0 [$ d% m O 第一天
, E P8 }9 y; q1 L$ n, b- q! t9 S
) ^' j: k0 Q+ v/ Y 安装了《入门》提供的东西,包括是下面几个文件。还有个批处理文件,是一个注册过程。
$ r! i5 a4 J' g opccomn_ps.dll
+ T" p9 ~9 u( Y. Y1 L( Q# b, t1 ^ opcproxy.dll
3 c, }" V2 v5 F* v; c: y i2 a+ R5 { opcdaauto.dll
8 {3 N6 r' X; t6 M7 `( w OPCTrend.ocx) [. q: k& C! ^8 M8 W
OPCBar.ocx, v+ f2 H1 u$ Y# H) f4 W1 b
OpcServer.exe
, {3 I! `3 e8 T6 _ OPCJDADemoServer.exe
3 S3 ~! ^0 I7 g, d( z# t 0 h% h+ d7 c( w% e5 p1 c* c6 m
看了一阵书,知道了前三个是:通用接口,PROXY-STUB,自动化接口。不明白。
' W- R' J$ ^9 ?$ y W9 D: A" ^ 后面两个是demo 服务器。' G6 H# o! s5 Q7 w$ j+ ]! G3 f8 d
- u/ A& i9 \! o" W- { 上网,用GOOGLE,查OPC,很自然就找到了www.opcconnect.com.,又下了个free
9 N+ D, e5 F1 X1 _0 ]4 L 服务器。安装了(注册)。
' ]- f, F( K4 j( K2 L5 p7 R5 k+ D . @* C3 M2 X, w- q( m( O( @
到了工控网,看到有人在推荐clienttools,就下了一个,叫WXOPC。运行一下," w8 i( N, Y6 r& b
# ?% a% `% b7 `4 t; K5 h8 C7 _) f 点击连接服务器图标,立即出现了三个:# t' F4 }# H! W% ^
OPCJ.SAMPLESERVER.19 T# ?% S5 x+ E$ W% F7 E! G
OPCJ.DADEMOSERVER.1: L& p$ I$ \- Q3 t \$ c
HEXATEC.PCDATA
4 K0 M: G7 C+ H }3 e5 {9 r0 d
% V$ G2 D) F" o8 x* F 第三个是opcconnect上download的计算机基本情况的简单程序。! F N# {& I. _* c8 \# f
0 m: S/ v4 z, ^" s* l1 @ 点击他们,还出现了一些“item”,“value"的内容还在变,有意思。我就想这
: f9 Z% L$ o, u! x6 l 工具还真不错,不知我能不能做到,但一想,如果这些功能都做不到,这OPC就没多少
. t# f* a& T' t8 m8 S1 y 人敢学,也就没有市场。
! }4 E9 {6 ?% a' I# U& h 5 g& ^) f# `0 f" w# {
有一段时间没用VB了,先热了热身,看了自己过去编过的code。
- w1 ^4 k( W% e0 F# R 第二日
5 K2 Q1 \/ ]) |8 N& u- ]* p$ F 今天先看书。1 U6 d* S5 L2 r' z" ]; {$ J
《OPC应用程序入门》,40元,我花了48元,从汇款到收到用了12天,拿到手上,感觉很单薄。我的看书观点是:在看的过程中迷信书,看完后怀疑书,然后忘记书。尽管这本书上我立即就发现有错误。我还是仔细地看下去。' l. l- k$ ~9 ` X+ ?, f
0 r L: a/ s" ^2 ~# _: } 这是一本教人们用VB编应用客户端程序的书,希望让一般工控技术员认识OPC其实不复杂,最起码编用户程序(客户端)不难。
! S# X N' s- y9 n* Q0 J
; G+ o" F- @3 z2 F) r% F4 h$ l. Z4 x 在这之前,我对COM和DCOM技术有所了解,也是很模糊的,OPC以COM和DCOM技术为基础,主要是在服务器端(server),而在用户端并不要很在意它们。7 E8 u. g/ L" u8 m1 w
' o1 t6 s. @" L7 W* j% @8 S( c 书上对OPC体系有描述,我画了个图。
: ~5 ?; }; R9 |5 F7 q7 [ 7 D s- ?8 m+ k( n8 Z# `
7 E. Z9 v- C( K
; P6 o- n# t8 R F OPCserver是COM组件,如果安装(注册了)一个OPCserver后,利用WINDOWS的组件工具可以看到,如果这个server安装在别的计算机上,不是本地机,那它就是个DCOM组件(分布式)。. t* G* c- @! n( ?$ q# Z7 o3 x
- J! t% R* I6 `' x' n+ r, E
OPC基金会公布了通用接口(用户接口),用C++访问OPCserver只要通过这个接口就可以,并没有必要了解OPCserver是怎么工作的。
. U( e- u, O4 T7 Y6 Q
g& j% I% v4 y+ I" F4 l 对于VB、VBA、EXCEL、DELPHI等编程软件或工具,不能直接访问通用接口,而要通过所谓的自动化接口(automation interface),OPC组织发布了 DATA ACESS 2.0,实际上已经有了3.0版。
. s r. o3 T( w" d8 V + q$ }- d* d6 X4 t5 l
而在通用接口和自动化接口之间还有一个东西,是成对使用的,有点象MODEM,在两个接口之间起数据传输作用,有个名字叫PROXY_STUB(代理—占位,翻译还不如不翻译,反正不懂)。9 q3 p* X8 }! t: f
0 l2 e# h- j' J% d6 O
我在第一天中安装的几个DLL中:
. d# }' j$ {' B OPCcomn_ps.dll 通用接口9 H/ h" U1 w+ g& F6 ]% S' i6 B
OPCdaAuto.dll 自动化接口
' y4 J# G, k9 v7 C2 P: X OPCProxy.dll PROXY-STUB" s4 G. H- d: V" r# G* Q3 S3 l
" M0 J( Y1 _9 \# _
我们的任务是用VB编写客户端程序,只要知道怎样用自动化接口就行了。其他的不去钻了,要不一年也搞不明白。0 z) S/ c1 \* c$ g- ^/ R
$ S+ z7 E) ^3 t 我运行VB6.0,新建一个新工程,点击菜单中的“工程”.“引用”,选择”OPC AUTOMATION 2.0”,就可以利用自动化接口。
& g8 e' w% ]! d( c
, Q: u' a2 \; ]5 P0 B 《入门》没有建议将这些DLL安装在什么目录,我觉得放在WINDOWS的SYSTEM下是比较好的。
2 T* }3 c$ { ]& p2 r- \. M
8 Q: s1 C' o7 n! A/ R7 Y 按照书上的顺序,先了解OPC的数据组织。我也画了图。
2 L' d r& c, }# k( |9 z5 l 1 g+ Q1 w% x( }. }
' l2 \* H6 ]7 B2 t: @: c9 f
7 ?" l9 y# }. q# I
C* C* V* ]6 j/ Q0 V4 Y0 G 我们要的就是item,翻译成标签,这就是点,我们所谓的点,比如PLC的I/O点,仪表的数值等。编客户端的开始就是找出数据。
! ^7 I& p. ]+ F# p8 i1 j$ }; ~
8 N9 e' \9 J3 f6 w- Q; O1 g/ D( l 根据书的介绍,要访问标签,还有其他工作要做。
' O5 ]1 _/ X- ^: ]& h 我累了。明天再说。" j+ S1 c& d. x* \5 y
* ?, S6 |+ A0 ?% p. ^ 第三天# l' {& y7 `+ w, j8 | L- ` \; j1 } H
昨天说到访问标签先要做些事。+ a) ^5 B' M5 @1 Q: d8 ]
* k0 O9 Y& @0 s. o k 首先要找出你要访问的OPC服务器的名字,连接它,建立一个组( GROUP)的集合,在下面建立一个具体的GROUP,在这个组中添加一个或多个标签。才可以访问。5 i. S( H$ I* c; Q: n& B3 L+ e
# R" W9 B8 ]( n+ K2 u 我用第一天下载的WXOPC工具,看到了三个服务器,我选择了其中一个
2 S; {% o1 I0 W1 a* W R hexatec.pcdata.1,是一个计算机基本情况的DEMO服务器,我发现服务器的名字都是这种格式。$ W5 p8 B8 {& \) h! U3 ]
8 [: [! x F9 z3 p 按《入门》的样子,做了个客户端的架子,一个小时后完成了服务器的连接,新建组集合,建立一个具体的组。下面有些不清楚。干脆拿《入门》的演示程序打开来研究。3 j% f* W- N0 z" S6 p, h
直接运行,没问题,看到了数据的变化,决定看其原代码。
. Y0 T* U9 f* J4 A: H5 n
$ p6 ]/ V3 L& d 它用的是OPCJ.SAMPLESERVER.1这个服务器,没有实际意义,每个数据都可以读写。- v8 E' [0 [' a0 R) T
我发现标签名可以任意编,好奇怪。但是我用WXOPC看到的标签,数据却不一样。
; H4 q; p- c' u2 i & W& d7 \, i0 a( f4 W( x
我在FORM上加了个text 控件,叫text1,我让服务器名等于text1.text,这样我可以自由换服务器,还不错,几个服务器都可以连接上。但是只有它自己的服务器才可以读出数据。是不是骗人。
2 U z l8 b1 |" D5 u
2 ^# M2 d6 d( Z9 h 试一下按服务器自己的ItemID去访问,我用WXOPC找出hexatec.pcdata.1的标签名,比如“version”,发现还是出错。
: t5 s% X7 G1 I% Z5 k 我又到工控论坛上,问已知标签怎样才可以读出数据。没有人回答。9 t1 ?3 ?+ B$ O4 F2 H0 B: n
+ N$ h- A( z, |& U1 T" h
我给自己留下了两个问题:1 u4 j a0 U' O2 H7 m& h* y; c9 u# V
1÷怎样获得本机上得所有OPCserver,获得正确的名字。我看到WXOPC可以。论坛上也很多人在问。, a9 I. D1 T# z, d' E' d' F
2÷如何访问ITEM,取得其数据等。
8 {# g8 P9 L5 l- |! E / b# l; D) |5 s7 L5 {0 C4 _
又看了一会书,看了有关OPCSERVERBROWSER的内容,好像是有用。
+ A P) P* W: {# O: Q- l. ?; H 今天到此为止,1 J0 J5 t8 G: ~& s
休息
0 F) H3 W) v, I8 b/ m7 n0 U, x6 j, A
% y- ?- N- V: u, y 第四天
. J- u& h$ L0 E# ~9 P, }7 a# a 熟悉OPCSERVERBROWSER的用法。主要有showbranchs,showleafs,movedown,movetoroot
4 g. ?% R, U1 o: U 等等。OPC服务器,实际上是一棵树,有brahchs和leafs组成。我编了一个简单的SUB,实现了两层的树的ITEM的枚举,实现不了第三层。这实际上是树的遍历算法问题。我不知怎么做。我准备去问别人。
2 @, ]1 ~9 v1 L7 I H% k! U ( D9 S' Q3 m' V7 @4 w, |% l
从形式上所谓的GROUP/ITEM 和branch/leaf是一样的,实际上并不是。GROUP是用户自己添加的,并不一定要和OPC服务器Branchs一样,每个LEAF是一个 Item,它们可以有用户任意放在哪个组中,不必考虑在服务器中是在哪个branch下,也不必考虑在第几层。
9 u! [ H I! B) Q: { ' B. \7 x" p! c1 p% w
既然我知道了每个ITEM的ID,我想我可以得到各自的SEEVERHANDLE(句柄),从而访问到实际的数据。
* w2 W+ F7 _# e8 O# W/ { s& _: a! J
: C# ^5 D4 s0 h 我添加一个组,在其下面建立标签集合,然后用:
' {8 S6 m. ~! [ 标签组的ADDITEM方法获得句柄。
2 |8 y2 m- O" f2 d) j, E, h 用同步读方法就可以得到每个标签的数据。0 p* y8 x1 B2 }, ~/ z
5 ?- c1 ^& ~0 { 我发现有问题。昨天我就发现有问题。, _2 l8 Z2 u+ I: k* {& W! F7 ]
今天论坛上没有人给我回答,去国外网站看看,www.opcfoundation.org上有个FORUM,内容很多,有真正的专家,其中一个是OPC基金会的技术代表。FAQ上还保留了从1998-2001年的问题及回答。
+ L3 `3 ~' j4 N9 Z
5 W& U7 n# \8 @ 你相信吗,我真的找到了。有一个叫fullqulifity ItemID的说法,比如下面的情况, t9 P! T K. q! o
bch1(树枝)6 z4 B" I2 a* b- W0 U: o$ \' q, h6 l
tag11(叶子)
$ G6 u% d3 @) k& A$ T. N, | G tag12 (叶子)2 ^' Y! k2 q. x+ s/ Q, U4 k0 T2 f0 O
bch29 f& _( r5 o9 {
tag21 (叶子)( @/ m+ E+ d- k3 a' l! h: u
bch22 (树枝)3 \5 D9 f) y" f% K
tag221 (叶子)
3 m8 X2 T! Z6 r9 u, m6 y tag222 (叶子)8 q, O+ W4 N0 b9 S
8 G$ Z$ `. \: v6 i o
9 e) Z+ q0 y4 b2 Y7 Y2 s 通常的ITEMID是tag11,tag12,tag21,tag221,tag222这样的8 L) F- p! ?/ N8 F2 I1 K2 z) o7 V8 Q
而Fullqulifity ItemID是bch1.tag11,bcg1.tag12,bch2.bch22.tag221,bch2.bch22.tag222$ X( l) G+ K# _- R9 @' v" y
应该用OPCSERVERBROWSER的GetItemId()获得。
. i* s! ?7 f* e
' F3 V. D3 Z+ D: w7 T7 c0 C 修改程序,OK。% O( T" }, ]8 q4 ~. d* M1 F
+ E$ Q( L$ f- I2 | 还有什么问题,本机服务器的枚举。
& f! A$ f5 T! O: C% W' ` 明天再说吧。ZZZzzz
9 `! {& m* v2 X* ^7 w! ^
& }3 l: V/ V4 i 第五天
+ D5 U0 H$ c; P/ f2 e7 \+ H6 M. M5 s* q8 \
8 o9 J! W3 i( i! Q% W3 _ 国外网站上真是有很多有用的东西,不象我们的论坛,原创的少,转载的多,内容也太少了。今天我直奔主题。
4 `6 F i% Q7 D" Q/ O9 W) B
4 ^. k! S" ~8 k) F" ? 上GOOGLE,输入OPC VB SAMPLE CODE ,GO!。很多。( F+ E# R. o5 Y* T( l
我选择了一个网站: a- C3 D2 E5 b' T8 | O* J' ]4 q3 t
www.kepware.com5 Z2 f) X. o. K: k2 x
下载一个叫KEPSERVEREX-OPC-EXAMPLE的东东,21M。哈哈,带原代码的OPC客户端工具。运行,很不错,那个WXOPC和它比较一下,简直......
8 L7 }4 \* Y8 I. ~# x " P @5 |9 L+ g7 R/ T# }8 L
枚举OPCServer的法子:
, l" \0 T* ]# z5 A Dim ServerList as Variant2 r$ l" u6 g4 O
Dim i as Integer
! Q& P( i/ |# N# d7 G/ ] Serverlist=anOPCServer.getOPcServer(node)1 m0 R, c& n5 J5 G- _- s t
List1.clear8 O. f& s- }% ^7 @3 U4 @3 F/ l+ }
FOR i=lbound(Serverlist) to ubound(Serverlist)
; G+ ^3 ^. e. K. J7 A List1.additem serverlist(i)
7 c; z) s7 x' a3 a( Z NEXT I
7 Q9 q( F v+ ~4 o1 @) O! x
- L& A6 X$ f. d# K 就这么简单,为什么在论坛上有这么多人在问,而我也没搞懂。
6 d5 a1 @2 Q- I2 O C9 _# Y+ B5 z 找到了枚举服务器的办法,在单机上成功。
3 T1 A3 b8 _) i; {/ Z 其实《入门》也提供了一个DOC文档,是OPC提供的:
+ R3 y6 T6 S( C Data Access Automation Interface Standard Version 2.029 ^5 _" I" v ?. G! z
1 K; o4 ]1 m; X
是一个必须的手册,只是有一些错误。错误总是难免的。- V% q3 a1 e8 g9 t) P- D2 H+ Q
入门如果有人指点,实际上不难,没有指点,实际不容易。好在有网络。1 W! L2 B$ R, @
. k% w7 B: U& R. {! J 上班时,我借了本《数据结构》,里面有算法,不知为什么,我却没找到未知层树的遍历算法。上班可能脑袋不清楚吧。" ]8 e0 H3 X+ d! z! x! n
1 ^ O1 E G) i7 }! {* J 第六天
7 D1 s4 C+ M& _7 @# f9 T
9 a. v2 _8 X1 O4 E F 上午,想解决树的问题。昨天的KEPWARE的例子,用了TREEVIEW控件和OPCSERVERBROWSER。
' P3 v0 S Q: }$ Y: v6 ~
$ t4 \# M; `1 \ {, F4 s2 I 我用GOOGLE查找“treeview” “树的遍历”,有了答案,好几个地方。仔细一看都是一个。是利用TREEVIEW和递归算法实现计算机文件目录系统的展开。递归,怎么忘记了。
* t/ O+ t; s5 @$ q3 l
. `- Q& y" o. E' a 采用递归算法实现了枚举所有ITEM的过程。用了3个小时。$ G @; B! J. }7 t* O2 E3 R
2 l; ~: V6 S, t* E% R
下午休息。
1 g/ z$ a1 R5 s6 F ' `9 I2 H% [! v1 ~! _9 }
第七天
& e6 M6 I; B7 K
% R4 a: d( V5 z+ {: c! O! W5 a 将自己的第一个程序,转成EXE文件,在不同的地方试运行,都正常。
6 N# C. m* E# C( Q- R
2 a: q2 A) W) [5 q' y, V 我想起了第一天安装的那些DLL,还要么。试一下0 }% ^0 M. y, J8 ?
将一个改名,运行,出错。再试另一个,出错。一个都不能少。记住。3 T, }$ l0 n/ E
OPCcom_pas.dll 通用接口, t% [5 s# N* w: m* S- [
OPCAutoda.dll 自动化接口- ]: R* J$ I" @! r
OPCProxy.dll PROXY-STUB+ t& s: }3 X& O ]! J
6 Q) T( ^$ k- v
想起组态软件支持OPC,就用组态王试了一下,发现用OPC和用其他方式没有什么两样。一般设备是先找硬件端口,找设备,找I/O点。而OPC是先找OPC服务器,在找出标签(也是点)。真正的组态没有什么两样。
4 |% r8 ^- O ~& K3 j + P @& c( P: g# g; ~' B, c
下午,想做个总结。更想休息,七天了,每天6小时以上。好累。1 y7 G# o9 J* B# M8 m
' m }% y& [. X' D& s1 Z 后记/ W- Q8 ?0 q2 ]1 N/ V
这是一次入门的学习,本身没有什么。我却有些感想。
7 A5 N4 A6 Z) b. Q9 F- ` ( F1 I/ N+ y) i0 {( y* b5 D/ _
OPC还是很难的,最起码,要自己编客户端已经不易,何况还有' d! E5 _: B+ l4 N- K+ ?
OPC ALARM & EVENT 报警和事件
4 u8 s: f7 y. j OPC DX 服务器间数据交换5 D2 J+ H7 B2 g# q1 Q+ Y
OPC SECURITY 安全
2 P3 ~% H& Y8 u+ J& C v) Q OPC HISTIRDATA 历史数据库
' R* C6 j& E K% V* Y" C1 C OPC XML XML! [' X/ M. Q$ p& O& L C
OPC .NET FOR .net' x; U' E+ m) H+ i! O: p z
这些对于一种工控软件是比不可少的。 g1 h0 I0 {4 G( Z4 }
. V5 w/ E1 Y0 n 工控行业的发展日新月异,我们这个专业要不断学习。真羡慕医生,白头发代表经验,代表水平。我们呢,白头发代表落后。苦。
' j6 Y/ A g9 G: H8 D' C B 中国工控落后,我们用的95%以上都是外国货,说明书都是外文。还要学好外文。苦。( w, w; Q1 `( x
+ q- d8 I- ]5 F j9 B, X& N* B) C
这次有多问题的解决都是在国外网站上找到办法的。有种感觉,在网上什么都可以找到,只要你知道你到底要什么。甜。/ A' q7 L6 M) j) l4 y
5 e1 u* V, J+ q5 }, j+ u
总算对OPC有了些感觉,累,也甜。 |
|