|
发表于 2008-8-1 16:28:18
|
显示全部楼层
来自: 中国河南新乡
转载 (飘在北京的云~~)
& @# {' ?) j% I, S( P, ^/ x
6 T$ ^" o4 H* T/ T2 a& |; ?我从北京买了一本《OPC应用程序入门》,在此之前基本上只是知道有OPC,在五月四日开始,我学了七天。其中有苦有甜。我写下来,权做休息或是练练打字。
& `2 _+ F0 U% {) O ; K; [. e/ d, a
第一天
3 V- Z2 h' \& e: _/ s2 F8 c; a; v- P
) I# h: ~4 F* p- H0 h 安装了《入门》提供的东西,包括是下面几个文件。还有个批处理文件,是一个注册过程。
( o c8 m+ b; Q0 f* g/ o* L opccomn_ps.dll, b4 M) |' c6 H" s8 }& X6 N8 _
opcproxy.dll
! G. C7 X" V3 Y0 y1 q l( I. h( f" b opcdaauto.dll9 b6 l# R" o+ N/ T7 W# S+ V2 i" i0 b
OPCTrend.ocx+ b) t3 s6 O& r4 N" Z
OPCBar.ocx
) R! r( z2 s: f5 u0 \ OpcServer.exe 4 D2 U) ^7 }9 V0 i" v
OPCJDADemoServer.exe
3 ^9 O; N8 N; W. ]; e- T 4 U$ a c/ X% o; P @
看了一阵书,知道了前三个是:通用接口,PROXY-STUB,自动化接口。不明白。# T/ l' C* @ |8 H- R
后面两个是demo 服务器。
; B" w& ^) O0 ^ o 6 J- z# Y7 a. Q' t8 @1 U* _
上网,用GOOGLE,查OPC,很自然就找到了www.opcconnect.com.,又下了个free) b d" ^& B- P
服务器。安装了(注册)。/ }3 n; P$ u( ~: i2 J9 b/ r) L& Q
) y, C" Z Z/ @* r9 N& U+ c! E* @* o$ V
到了工控网,看到有人在推荐clienttools,就下了一个,叫WXOPC。运行一下,
0 }( U8 y9 S G5 J0 O1 Z$ K 1 O1 p8 C2 h0 @" R- @
点击连接服务器图标,立即出现了三个:; j. v4 U# F! F$ V& t
OPCJ.SAMPLESERVER.1' J+ ]0 n( |+ v. r: v
OPCJ.DADEMOSERVER.1$ {) p/ r5 u: \: y. H
HEXATEC.PCDATA+ X. T3 L: X. u1 b
6 T. ~9 N' p& r 第三个是opcconnect上download的计算机基本情况的简单程序。" h3 D6 y# k' Z
[% U' p* v% M- n& g' D 点击他们,还出现了一些“item”,“value"的内容还在变,有意思。我就想这& I2 u5 R# B$ q
工具还真不错,不知我能不能做到,但一想,如果这些功能都做不到,这OPC就没多少0 O9 O3 a2 ?( a
人敢学,也就没有市场。
' W) F/ M, ^3 c: ?5 g- f6 I # F. T N6 B% k9 u9 E) v: L
有一段时间没用VB了,先热了热身,看了自己过去编过的code。
9 K' u* w/ _9 x4 F2 A 第二日( b% Z) D+ F4 I$ f; O/ D
今天先看书。9 f5 Z/ M, |: k9 S
《OPC应用程序入门》,40元,我花了48元,从汇款到收到用了12天,拿到手上,感觉很单薄。我的看书观点是:在看的过程中迷信书,看完后怀疑书,然后忘记书。尽管这本书上我立即就发现有错误。我还是仔细地看下去。- S6 D5 b/ X* M/ a; ?, S& l1 V
% ^9 G7 |; S9 u+ b 这是一本教人们用VB编应用客户端程序的书,希望让一般工控技术员认识OPC其实不复杂,最起码编用户程序(客户端)不难。! c" q* `- ^1 i& X& b9 J
" T$ o% o: g4 r5 V2 x: p9 f
在这之前,我对COM和DCOM技术有所了解,也是很模糊的,OPC以COM和DCOM技术为基础,主要是在服务器端(server),而在用户端并不要很在意它们。
- P, n( ~8 h" b$ c) H+ A M' K- C* I" P" O$ l: Y/ u7 t; T
书上对OPC体系有描述,我画了个图。
% a: ~' I, ~& U5 K* Z K
" |. @% z5 D S, [
) O: F, S/ C4 s" z% J: U6 Q; Z* j, t; K; @6 Y9 v6 \
OPCserver是COM组件,如果安装(注册了)一个OPCserver后,利用WINDOWS的组件工具可以看到,如果这个server安装在别的计算机上,不是本地机,那它就是个DCOM组件(分布式)。
3 m w" `- q: R2 ^ H& u % A3 \; D3 `' Z$ ~
OPC基金会公布了通用接口(用户接口),用C++访问OPCserver只要通过这个接口就可以,并没有必要了解OPCserver是怎么工作的。
0 X, E6 a7 @+ c! g' s
. ~) p, z& }! H, s 对于VB、VBA、EXCEL、DELPHI等编程软件或工具,不能直接访问通用接口,而要通过所谓的自动化接口(automation interface),OPC组织发布了 DATA ACESS 2.0,实际上已经有了3.0版。9 a1 P0 N% q8 A7 c1 z
' T5 f9 e2 ` O- y8 w 而在通用接口和自动化接口之间还有一个东西,是成对使用的,有点象MODEM,在两个接口之间起数据传输作用,有个名字叫PROXY_STUB(代理—占位,翻译还不如不翻译,反正不懂)。* \/ x @% B6 Y" f2 W
2 @0 K7 W) F: H& p+ `: q, Q
我在第一天中安装的几个DLL中:8 d* c$ j- P7 E2 z! b( I
OPCcomn_ps.dll 通用接口6 q2 w; K" z8 h, Y! U$ b( g7 M+ u
OPCdaAuto.dll 自动化接口0 R: f2 N& b8 t6 @
OPCProxy.dll PROXY-STUB8 [! s' W: u. t1 c, l" C
s5 h' |6 @4 U& g7 h6 J/ l
我们的任务是用VB编写客户端程序,只要知道怎样用自动化接口就行了。其他的不去钻了,要不一年也搞不明白。" R- q _& ?* u! ~2 z
% J8 ^" U, G7 V! H, |9 Q
我运行VB6.0,新建一个新工程,点击菜单中的“工程”.“引用”,选择”OPC AUTOMATION 2.0”,就可以利用自动化接口。
8 `8 S/ @7 Z5 o% l7 X' P1 Q2 A- X ( ^; b0 e/ ^ Y8 B' c) E; x2 a
《入门》没有建议将这些DLL安装在什么目录,我觉得放在WINDOWS的SYSTEM下是比较好的。 \2 u. |3 x1 \8 k. K2 a
# L t+ Z" K; [
按照书上的顺序,先了解OPC的数据组织。我也画了图。
% f/ N) C' u2 L / ]" D2 k: H3 c: ^, ?* Z: j
# s2 D* _1 B8 E' @& f2 K! g# N% N: r V3 U' Y
/ x1 C3 I7 c9 p4 a6 j2 c* b 我们要的就是item,翻译成标签,这就是点,我们所谓的点,比如PLC的I/O点,仪表的数值等。编客户端的开始就是找出数据。
8 J$ Z/ m/ {: ? j1 G7 t/ {
0 j0 ]; J0 F" }9 O9 ]7 M 根据书的介绍,要访问标签,还有其他工作要做。
7 y4 z! G1 B6 P" J 我累了。明天再说。
/ q: }* g" J) [2 }
/ c$ ^+ ?8 h. I- @7 S& H$ r 第三天
/ ~% B* O: Y7 g& n. b K7 J 昨天说到访问标签先要做些事。 g! ^, t2 H( G
0 P: h" c+ g1 ~, _5 I: }+ t. g' U$ u
首先要找出你要访问的OPC服务器的名字,连接它,建立一个组( GROUP)的集合,在下面建立一个具体的GROUP,在这个组中添加一个或多个标签。才可以访问。0 R7 B9 V1 b/ ]" `6 e6 A4 y3 M
' ]' I- _3 t M7 @2 E# [3 m
我用第一天下载的WXOPC工具,看到了三个服务器,我选择了其中一个
( D/ k1 x; t7 N, T7 j hexatec.pcdata.1,是一个计算机基本情况的DEMO服务器,我发现服务器的名字都是这种格式。% i8 J& |" T, o) t0 s8 H$ Y& a! K
- M5 u. Q$ F# c
按《入门》的样子,做了个客户端的架子,一个小时后完成了服务器的连接,新建组集合,建立一个具体的组。下面有些不清楚。干脆拿《入门》的演示程序打开来研究。
( d2 @& O5 k, H; f" t0 Q0 J 直接运行,没问题,看到了数据的变化,决定看其原代码。
+ S6 v7 Q4 c/ |
% f A" H( m0 c$ N' O. m$ ^$ F 它用的是OPCJ.SAMPLESERVER.1这个服务器,没有实际意义,每个数据都可以读写。
4 X/ c% X6 K, U" B: Z2 a) B 我发现标签名可以任意编,好奇怪。但是我用WXOPC看到的标签,数据却不一样。
, o& U4 N! I- J. B4 `( V . B0 r" p$ r+ R* L1 s, y
我在FORM上加了个text 控件,叫text1,我让服务器名等于text1.text,这样我可以自由换服务器,还不错,几个服务器都可以连接上。但是只有它自己的服务器才可以读出数据。是不是骗人。& T3 z& L$ H+ o
/ h3 f d D8 M( Z6 R! r; X0 E
试一下按服务器自己的ItemID去访问,我用WXOPC找出hexatec.pcdata.1的标签名,比如“version”,发现还是出错。
1 I* U1 h9 c) ^/ y5 I8 Q 我又到工控论坛上,问已知标签怎样才可以读出数据。没有人回答。
# D& [3 q5 ]/ K; C: d' h
4 P6 E+ u0 e- o) o 我给自己留下了两个问题:( ~. I& h% c) A) H* x( d+ P4 B" a" s
1÷怎样获得本机上得所有OPCserver,获得正确的名字。我看到WXOPC可以。论坛上也很多人在问。
" a, U3 A Y1 L. r- L! O 2÷如何访问ITEM,取得其数据等。
% c+ G: U P1 n! y$ z, M / Z- k/ k0 O2 ]& `9 c4 T
又看了一会书,看了有关OPCSERVERBROWSER的内容,好像是有用。" f: |, T1 Y4 ?8 X
今天到此为止,
- r1 [) W! p) j& b* T 休息
9 F6 N( C; V0 N4 }% T7 n, p
1 m% L! x# Q0 z, G6 y" x7 g 第四天! w& u1 i, l1 x" c) z
熟悉OPCSERVERBROWSER的用法。主要有showbranchs,showleafs,movedown,movetoroot5 G p2 }) t& E
等等。OPC服务器,实际上是一棵树,有brahchs和leafs组成。我编了一个简单的SUB,实现了两层的树的ITEM的枚举,实现不了第三层。这实际上是树的遍历算法问题。我不知怎么做。我准备去问别人。1 Z2 ^5 O/ C M+ b1 P
/ d: f7 U6 J4 R* d0 G 从形式上所谓的GROUP/ITEM 和branch/leaf是一样的,实际上并不是。GROUP是用户自己添加的,并不一定要和OPC服务器Branchs一样,每个LEAF是一个 Item,它们可以有用户任意放在哪个组中,不必考虑在服务器中是在哪个branch下,也不必考虑在第几层。8 s) ?- g) R8 ^0 S: `: k) Q
. a2 C! v, p6 @6 E
既然我知道了每个ITEM的ID,我想我可以得到各自的SEEVERHANDLE(句柄),从而访问到实际的数据。
4 t0 v: O9 u/ J, ^& A 3 J8 b) Z, P! p5 r0 E
我添加一个组,在其下面建立标签集合,然后用:5 B7 ^. I! S+ O" `
标签组的ADDITEM方法获得句柄。
8 _* ^* v0 r/ x( T7 J 用同步读方法就可以得到每个标签的数据。, A1 C: S0 ]" t2 J" _3 _
# t4 f- p$ z; q0 j6 P
我发现有问题。昨天我就发现有问题。, a# v; X4 s4 d- w% \9 @ M7 q
今天论坛上没有人给我回答,去国外网站看看,www.opcfoundation.org上有个FORUM,内容很多,有真正的专家,其中一个是OPC基金会的技术代表。FAQ上还保留了从1998-2001年的问题及回答。1 e1 L: q3 J: ?' ?- }
% f- E! C9 C0 m3 }
你相信吗,我真的找到了。有一个叫fullqulifity ItemID的说法,比如下面的情况
& M; I9 H% b3 c( n/ b) B bch1(树枝)) V" @& C- z: o% E! S. `/ V( {
tag11(叶子)
4 r- E" }! ?# M, [ tag12 (叶子) V/ e1 r3 E i2 b2 R
bch2. O. q, d$ O. J( Y) F: k! F5 ^; X
tag21 (叶子). i" a S' t/ l) l
bch22 (树枝) q- K; L0 M' d8 y; b
tag221 (叶子)
% b* h2 r. v p# B" s tag222 (叶子)
/ G5 M; i2 n7 ]* L) U " {; ?% ] X! U8 O6 ?
. J+ r8 h' Q9 r1 _ 通常的ITEMID是tag11,tag12,tag21,tag221,tag222这样的/ a: `2 {) _( z. ]3 R; N/ F& P
而Fullqulifity ItemID是bch1.tag11,bcg1.tag12,bch2.bch22.tag221,bch2.bch22.tag222
, k" g/ \& H, P 应该用OPCSERVERBROWSER的GetItemId()获得。
6 i( ^- F d- o( |0 T
4 H A8 E( ^4 F3 G# V; Y 修改程序,OK。
/ s# ~9 g. ?0 z; U& Z5 Z
0 i. @0 [4 V" w 还有什么问题,本机服务器的枚举。# Q/ s+ I, P" ], e* W+ ?+ r) a
明天再说吧。ZZZzzz
! u* X' Q; x" f3 S& K* u6 A# w& C R# E 9 z( o9 T5 u- h, H. P8 M6 X
第五天9 Q" R9 W! u( C+ M
( o* a9 O4 V" M; @
国外网站上真是有很多有用的东西,不象我们的论坛,原创的少,转载的多,内容也太少了。今天我直奔主题。
# c3 o6 b! P5 k3 b: d9 A0 \. d
+ @2 W* b: Z# n. ~ 上GOOGLE,输入OPC VB SAMPLE CODE ,GO!。很多。# f5 `" q, f! Q. x% w5 A1 H: g7 K
我选择了一个网站:
; h0 I2 u( w. `7 R4 M6 I" O: M www.kepware.com
% Q7 i5 ~' Z; S# A0 a; r2 p1 N 下载一个叫KEPSERVEREX-OPC-EXAMPLE的东东,21M。哈哈,带原代码的OPC客户端工具。运行,很不错,那个WXOPC和它比较一下,简直......, k. I' R& T) q) L
7 l1 B, L+ y( P) P3 m+ Q 枚举OPCServer的法子:* S* W) c$ F/ ~) K0 `4 A Q( Z+ L
Dim ServerList as Variant& @ N; E9 [' S" r+ \" j7 R
Dim i as Integer
K% G; D# ?- b2 l+ b o' v; ?- r Serverlist=anOPCServer.getOPcServer(node)- h; s$ `/ Q- W1 t! W
List1.clear
: V' i2 b# K$ A( C: A9 A FOR i=lbound(Serverlist) to ubound(Serverlist)
9 |# l. a) v1 e) X5 t$ v* Y: M0 M List1.additem serverlist(i)
1 @( r; P9 a% C" ]0 S+ |7 S% c NEXT I3 y6 j" u* I, S8 ?
- N1 }( z/ P* E. q, H2 Q
就这么简单,为什么在论坛上有这么多人在问,而我也没搞懂。/ L& j5 k8 a+ ~; t
找到了枚举服务器的办法,在单机上成功。2 t+ C/ r2 {! J9 ~, a: B* N
其实《入门》也提供了一个DOC文档,是OPC提供的:
1 U3 E/ r3 F' h3 A, [ Data Access Automation Interface Standard Version 2.02' g# }8 u: R6 ~4 U
. {, x+ U$ T/ m" ]- x- q 是一个必须的手册,只是有一些错误。错误总是难免的。1 w* i% {# t! ^. ^0 {2 t2 X
入门如果有人指点,实际上不难,没有指点,实际不容易。好在有网络。& e, I5 Z8 d% v
* f# a6 n1 L2 a6 S w( M: Y6 B
上班时,我借了本《数据结构》,里面有算法,不知为什么,我却没找到未知层树的遍历算法。上班可能脑袋不清楚吧。
2 ]$ I3 i( \/ L1 d6 j+ {- `+ p2 _ 9 C$ z a1 W$ L k" [
第六天9 d* s; ?; S+ r& l3 |& P
% {0 h$ P% y2 V+ q, E7 A 上午,想解决树的问题。昨天的KEPWARE的例子,用了TREEVIEW控件和OPCSERVERBROWSER。
2 P- C" N, Q4 A, \9 B# s 6 J% o# D: t+ k7 l% C7 A8 c2 N7 W
我用GOOGLE查找“treeview” “树的遍历”,有了答案,好几个地方。仔细一看都是一个。是利用TREEVIEW和递归算法实现计算机文件目录系统的展开。递归,怎么忘记了。
9 b0 S9 L6 x/ G* ^- B; k+ k
% u9 U6 L1 O! i3 a 采用递归算法实现了枚举所有ITEM的过程。用了3个小时。
8 T$ f+ p2 V% M9 c* D
: J6 ~2 f& Z% E' `* a 下午休息。0 Y; M4 E+ W+ p* z# K* K1 }
& G s6 Y* E! [9 ?. G8 Q. [ 第七天
# P. w, k% v. h4 A' y- S9 r 7 X# b) p3 {( Z; _: @
将自己的第一个程序,转成EXE文件,在不同的地方试运行,都正常。
9 I; _; j: ?" _* l ; ^2 k( z7 m8 X/ T8 }7 K2 {
我想起了第一天安装的那些DLL,还要么。试一下
. I) j/ Z, [. L. C0 ~% O3 p1 K 将一个改名,运行,出错。再试另一个,出错。一个都不能少。记住。
: D1 k H* X1 I7 q OPCcom_pas.dll 通用接口3 }0 ?+ e" V' G; _9 {# y6 o5 M; T2 P
OPCAutoda.dll 自动化接口, p; m/ C7 W6 e
OPCProxy.dll PROXY-STUB
. ?8 \% p% \) u$ f1 A 0 W5 U ?, {9 h3 ?: A
想起组态软件支持OPC,就用组态王试了一下,发现用OPC和用其他方式没有什么两样。一般设备是先找硬件端口,找设备,找I/O点。而OPC是先找OPC服务器,在找出标签(也是点)。真正的组态没有什么两样。/ {- m8 Z' o& c- U6 H! [
& R k) y: P/ N3 H
下午,想做个总结。更想休息,七天了,每天6小时以上。好累。# J7 ]( X* E$ y
& i2 ^; ~/ l3 z' [
后记+ K# b6 }) N- k1 f" K5 P. A3 U
这是一次入门的学习,本身没有什么。我却有些感想。8 X+ s8 n* y5 c* G
" X- S5 m" @. ]: W OPC还是很难的,最起码,要自己编客户端已经不易,何况还有
' b5 ?$ |) Z7 H7 y9 [ OPC ALARM & EVENT 报警和事件
5 C4 y& j) }; h# [3 | k3 a OPC DX 服务器间数据交换
6 c3 C2 I1 e% B. V OPC SECURITY 安全
2 b2 |1 M' C+ d8 i) A, ? OPC HISTIRDATA 历史数据库$ V+ k+ h* g. y
OPC XML XML; c. q$ @0 F, X: [/ K1 [* Z
OPC .NET FOR .net7 f# V; y+ T6 w5 U7 \4 y
这些对于一种工控软件是比不可少的。, ~9 g- D$ O. ~* a0 @' Z
% z6 q5 E. @2 `, U5 [; R8 z
工控行业的发展日新月异,我们这个专业要不断学习。真羡慕医生,白头发代表经验,代表水平。我们呢,白头发代表落后。苦。! H* J1 O, q i4 J. D0 q, z( ^
中国工控落后,我们用的95%以上都是外国货,说明书都是外文。还要学好外文。苦。
; E$ P3 |8 L( G : {; H' [( x, p# _0 T" K4 h2 _
这次有多问题的解决都是在国外网站上找到办法的。有种感觉,在网上什么都可以找到,只要你知道你到底要什么。甜。
2 f6 Q6 v2 x# U9 p! e; Z6 j" E3 k
4 F! f9 s1 [- t4 [, Z 总算对OPC有了些感觉,累,也甜。 |
|