|
|
发表于 2008-8-1 16:28:18
|
显示全部楼层
来自: 中国河南新乡
转载 (飘在北京的云~~)$ W( o1 G" v% P( e9 s; W; I
& A# `: v6 e, Y6 J/ U/ m) Q! f6 B我从北京买了一本《OPC应用程序入门》,在此之前基本上只是知道有OPC,在五月四日开始,我学了七天。其中有苦有甜。我写下来,权做休息或是练练打字。* \8 {0 x2 P8 [: }! R7 u/ M/ y: o
. C3 I1 Q% ]( h) s3 p0 `# d2 d" a
第一天
: F0 z ]7 V( e' o9 O/ R/ I) m- s
( T5 A9 ?( Y$ T/ x9 e& m 安装了《入门》提供的东西,包括是下面几个文件。还有个批处理文件,是一个注册过程。
; }7 b4 b: \2 V# o opccomn_ps.dll
; w% x2 t$ b7 O opcproxy.dll
9 J* Q% M8 ^* I4 o opcdaauto.dll
$ I% k! y! \/ T1 g2 q/ I) {1 v OPCTrend.ocx
y2 L: ^3 r. g o# N/ _+ w OPCBar.ocx
" ^9 W( f8 S. [* S8 m OpcServer.exe 4 S/ I& v2 u: F. ]8 n0 d
OPCJDADemoServer.exe$ r+ q6 A. P! e) C5 j& D
/ x0 [# X( G% I$ s C' k2 @; X 看了一阵书,知道了前三个是:通用接口,PROXY-STUB,自动化接口。不明白。
2 @0 N; N& j4 |1 ?/ ] 后面两个是demo 服务器。
* n$ P# D6 c6 z 8 v; x8 h, u3 @' o. g3 D% O
上网,用GOOGLE,查OPC,很自然就找到了www.opcconnect.com.,又下了个free
r4 y8 `& {; @" L/ Z4 W: s 服务器。安装了(注册)。
. r, H" r1 K. U2 V0 v0 d% g k
+ g% `: V- ~& l* i! D5 L7 W 到了工控网,看到有人在推荐clienttools,就下了一个,叫WXOPC。运行一下,
/ l, w( t) Q2 P8 A+ x K2 O
! Y. O2 t! t, i 点击连接服务器图标,立即出现了三个:
1 A8 R" T, l; x3 V- F) E( V" ?$ ] D OPCJ.SAMPLESERVER.1
5 U- g0 J& c2 }9 S: o$ { OPCJ.DADEMOSERVER.1
" H5 e4 Q# B" y4 n HEXATEC.PCDATA
^, r' X+ Q( P 3 N8 `& O) S; W) _2 f
第三个是opcconnect上download的计算机基本情况的简单程序。* a) v) m! m' c/ u* Y
% H; O) S' P8 S5 k4 c7 Z1 r8 ^ 点击他们,还出现了一些“item”,“value"的内容还在变,有意思。我就想这
4 o* T9 L1 |/ ~9 {; `9 {+ s 工具还真不错,不知我能不能做到,但一想,如果这些功能都做不到,这OPC就没多少
4 e7 ?" T+ E- n 人敢学,也就没有市场。- |8 l* w: Z7 t1 I
) T7 l4 B3 F! E4 y {
有一段时间没用VB了,先热了热身,看了自己过去编过的code。8 F9 w% s( f$ e5 s5 z
第二日
. h, d% I6 G6 f 今天先看书。, k1 e* D; W* k2 @) z* T
《OPC应用程序入门》,40元,我花了48元,从汇款到收到用了12天,拿到手上,感觉很单薄。我的看书观点是:在看的过程中迷信书,看完后怀疑书,然后忘记书。尽管这本书上我立即就发现有错误。我还是仔细地看下去。6 b/ K6 r8 f2 @- T) W3 |3 {
) r/ I# x# q8 M- u! k/ v* M* f5 f% c 这是一本教人们用VB编应用客户端程序的书,希望让一般工控技术员认识OPC其实不复杂,最起码编用户程序(客户端)不难。8 s& w, x0 {9 q$ g+ a
5 j7 e5 [: H) c, n6 _ 在这之前,我对COM和DCOM技术有所了解,也是很模糊的,OPC以COM和DCOM技术为基础,主要是在服务器端(server),而在用户端并不要很在意它们。5 Y9 ^" D% H! ^" u/ o2 _
4 ^6 k$ I6 W2 _& ~1 p6 W4 Q) _ 书上对OPC体系有描述,我画了个图。- _8 a; U# H6 r I+ a5 A2 W7 H) G: i
9 |: O5 M6 X8 A1 A
6 H0 Z( y: ~7 E8 R. n+ {% p) n
. I B# @" q$ s# X) z
OPCserver是COM组件,如果安装(注册了)一个OPCserver后,利用WINDOWS的组件工具可以看到,如果这个server安装在别的计算机上,不是本地机,那它就是个DCOM组件(分布式)。
0 a2 m7 P' b( Y& T7 T
6 o: @9 w; s; I4 L) R OPC基金会公布了通用接口(用户接口),用C++访问OPCserver只要通过这个接口就可以,并没有必要了解OPCserver是怎么工作的。
* e& N8 I. k/ o8 m. M V , |. \4 p1 Q7 i" ?
对于VB、VBA、EXCEL、DELPHI等编程软件或工具,不能直接访问通用接口,而要通过所谓的自动化接口(automation interface),OPC组织发布了 DATA ACESS 2.0,实际上已经有了3.0版。+ u9 f4 w4 M2 w3 m( i! O
# M6 |, d7 h$ Q, C/ s8 u
而在通用接口和自动化接口之间还有一个东西,是成对使用的,有点象MODEM,在两个接口之间起数据传输作用,有个名字叫PROXY_STUB(代理—占位,翻译还不如不翻译,反正不懂)。
% Q9 I7 h. p' v9 b8 U; z+ P7 L5 x 9 v! G) q0 |- N e. b, e
我在第一天中安装的几个DLL中:% p! D) G+ _4 S K1 o* V" Q' z
OPCcomn_ps.dll 通用接口
, W" K) y5 M% o, _, T% z& V OPCdaAuto.dll 自动化接口0 ]9 L. T1 \4 F. \: m
OPCProxy.dll PROXY-STUB
1 a9 X8 A$ {0 m9 N P * }% P- t" E* ~7 O
我们的任务是用VB编写客户端程序,只要知道怎样用自动化接口就行了。其他的不去钻了,要不一年也搞不明白。1 n( z) c- K4 D) n; Y) l# I0 [
9 x5 ^/ }# V( H# y( F
我运行VB6.0,新建一个新工程,点击菜单中的“工程”.“引用”,选择”OPC AUTOMATION 2.0”,就可以利用自动化接口。' z# M' j3 H5 m# L; W
" X( H& ]* `: ^1 A( g% Q 《入门》没有建议将这些DLL安装在什么目录,我觉得放在WINDOWS的SYSTEM下是比较好的。
, t# }- h% L+ n! h
" [: D' b3 m+ U7 u7 }' M0 w) K 按照书上的顺序,先了解OPC的数据组织。我也画了图。6 {, {6 E3 d8 d
5 Z3 [% J: \ ]% e0 X$ M- n- x
2 r0 ^ e; a. c& R' N6 V8 w4 I1 y) }
, \! b& ]/ `$ \: K( |( A* p% F( l
0 T; m j8 R a
我们要的就是item,翻译成标签,这就是点,我们所谓的点,比如PLC的I/O点,仪表的数值等。编客户端的开始就是找出数据。& {9 i/ F, g& T. `- ~* H/ q
: j& a/ A: B7 E6 l
根据书的介绍,要访问标签,还有其他工作要做。
/ Z$ B) H3 n* H/ ^. s# d2 [ 我累了。明天再说。8 m8 `& C" u2 j/ m. l) m1 s
, K! m. q: V' z% } 第三天! d& J# F- Y- E2 R+ ^
昨天说到访问标签先要做些事。) [" x# T4 j6 {
/ N% }5 A( Z1 u, Y% i* o 首先要找出你要访问的OPC服务器的名字,连接它,建立一个组( GROUP)的集合,在下面建立一个具体的GROUP,在这个组中添加一个或多个标签。才可以访问。
Q% Y, @. U; `5 l 9 v8 h/ Z' A; P5 l3 ]5 c6 ^
我用第一天下载的WXOPC工具,看到了三个服务器,我选择了其中一个
8 p) _8 g9 V' _9 N+ v hexatec.pcdata.1,是一个计算机基本情况的DEMO服务器,我发现服务器的名字都是这种格式。
5 W, k- W- `5 X; i2 t 4 Z# d/ l. | R% G; K7 D2 k
按《入门》的样子,做了个客户端的架子,一个小时后完成了服务器的连接,新建组集合,建立一个具体的组。下面有些不清楚。干脆拿《入门》的演示程序打开来研究。
! K7 T% w, b/ z2 d: @& A* R 直接运行,没问题,看到了数据的变化,决定看其原代码。5 V2 N( }. D0 ]3 y; y
. o) A9 L8 h# |$ N! d 它用的是OPCJ.SAMPLESERVER.1这个服务器,没有实际意义,每个数据都可以读写。
; P. E3 F9 `6 \) C 我发现标签名可以任意编,好奇怪。但是我用WXOPC看到的标签,数据却不一样。+ S$ H0 i- j) I. P, ~ f; H
/ Z/ w% l- \+ @# \3 \- Y" d
我在FORM上加了个text 控件,叫text1,我让服务器名等于text1.text,这样我可以自由换服务器,还不错,几个服务器都可以连接上。但是只有它自己的服务器才可以读出数据。是不是骗人。
/ r: q* N8 b1 g 6 W0 n, M! ]3 V3 S1 F
试一下按服务器自己的ItemID去访问,我用WXOPC找出hexatec.pcdata.1的标签名,比如“version”,发现还是出错。
$ R) h/ Z$ B. E7 S7 K. w% R1 r 我又到工控论坛上,问已知标签怎样才可以读出数据。没有人回答。
6 x4 h* o! b/ D7 `7 X 2 p2 _* v/ L5 e6 Z6 }% s7 C
我给自己留下了两个问题:
/ [, {) N+ i8 k6 L6 m; o/ i 1÷怎样获得本机上得所有OPCserver,获得正确的名字。我看到WXOPC可以。论坛上也很多人在问。' G% i4 Y2 z( R
2÷如何访问ITEM,取得其数据等。, t2 M" n( p* Z3 ~/ S
2 `% F# U% j8 B0 _. J; E
又看了一会书,看了有关OPCSERVERBROWSER的内容,好像是有用。5 |0 ~4 U( G$ ` {9 V9 j! P" L
今天到此为止,
- ]4 z- P) ?) E 休息9 [: f& k6 Y3 {0 N- r5 H
) K* s4 S4 b. Z3 `
第四天
6 v1 F& E+ f1 g/ b; K' W! g 熟悉OPCSERVERBROWSER的用法。主要有showbranchs,showleafs,movedown,movetoroot( ~# H* M7 ]! h- f+ T% R
等等。OPC服务器,实际上是一棵树,有brahchs和leafs组成。我编了一个简单的SUB,实现了两层的树的ITEM的枚举,实现不了第三层。这实际上是树的遍历算法问题。我不知怎么做。我准备去问别人。7 o' G: |0 a, u- h
" Q% ^ Q, C% p1 q" b3 H
从形式上所谓的GROUP/ITEM 和branch/leaf是一样的,实际上并不是。GROUP是用户自己添加的,并不一定要和OPC服务器Branchs一样,每个LEAF是一个 Item,它们可以有用户任意放在哪个组中,不必考虑在服务器中是在哪个branch下,也不必考虑在第几层。1 P# K4 G5 i8 |8 o- R6 n$ V9 E
7 m) {$ w$ o. O3 j$ d" e* O" ~2 B 既然我知道了每个ITEM的ID,我想我可以得到各自的SEEVERHANDLE(句柄),从而访问到实际的数据。
- t8 n( _0 M U- [* q% [ ( P% q3 K( A- Q! ]& N) w9 |# k8 D, o
我添加一个组,在其下面建立标签集合,然后用:
3 P9 m! I. @3 q$ s" v s% Y: P 标签组的ADDITEM方法获得句柄。' P/ c; P( O' h& ~- d8 _
用同步读方法就可以得到每个标签的数据。8 ^% M9 I3 C+ G0 i( [1 n8 P
+ [9 ~. n' P E" R( D# i
我发现有问题。昨天我就发现有问题。
* C* o. }1 ~6 l P4 E4 t- U 今天论坛上没有人给我回答,去国外网站看看,www.opcfoundation.org上有个FORUM,内容很多,有真正的专家,其中一个是OPC基金会的技术代表。FAQ上还保留了从1998-2001年的问题及回答。
/ c& b9 Z8 Z; I W
4 x0 S0 J& i0 V1 }! b 你相信吗,我真的找到了。有一个叫fullqulifity ItemID的说法,比如下面的情况, o& g1 T/ u) `7 k4 l$ m
bch1(树枝)9 w" i9 E2 a9 ~9 n, ^
tag11(叶子): Z* H, n$ Q2 x, ]/ }: Z
tag12 (叶子)" k* j( k' g) ~4 n% K' O: q, f( Z
bch22 e- w- G9 O" a5 _9 `% @2 G! m( X
tag21 (叶子)9 A4 Q9 @( B4 x! a: A p2 J
bch22 (树枝)( W# Q0 G, T0 A
tag221 (叶子)
, a+ \" K; z7 r/ g tag222 (叶子), u; A! k* Q4 c! O) a
3 O& y! R$ o* |4 _) m: q " u ~% a5 N: F7 S) ^
通常的ITEMID是tag11,tag12,tag21,tag221,tag222这样的
" {) Y+ ?; ^1 l( ] 而Fullqulifity ItemID是bch1.tag11,bcg1.tag12,bch2.bch22.tag221,bch2.bch22.tag222
" N/ P+ ?% p$ e0 {- ^- f# E 应该用OPCSERVERBROWSER的GetItemId()获得。
4 j* W" |/ F. y' P. w8 H
; ]7 P1 \" r( V 修改程序,OK。0 E3 h& B; ~5 s( \$ ~# r. O
* o, J `& ]3 t: m$ G1 ~! D4 _
还有什么问题,本机服务器的枚举。
8 `* X" b" w4 ^4 G2 h. a 明天再说吧。ZZZzzz
8 \4 m- i0 h9 ]/ Q4 M, r* d: N
' F$ u( {- K P 第五天' K/ z% ^, Y& T
5 O. `& ~3 } {. E. X( O
国外网站上真是有很多有用的东西,不象我们的论坛,原创的少,转载的多,内容也太少了。今天我直奔主题。
3 Z9 I- U) W( G7 e3 D- G
, \2 q2 W6 g n, ?0 D5 z 上GOOGLE,输入OPC VB SAMPLE CODE ,GO!。很多。' @- T' s$ z0 m" Y$ ^, u
我选择了一个网站:5 m9 n. W/ ^. a0 ^: c
www.kepware.com
5 P. M+ S# F; f8 M 下载一个叫KEPSERVEREX-OPC-EXAMPLE的东东,21M。哈哈,带原代码的OPC客户端工具。运行,很不错,那个WXOPC和它比较一下,简直......9 h3 c- k% N! I$ ~3 I: N
# e9 x2 Q# F' x8 [' x; a b
枚举OPCServer的法子:
! o4 h r* s9 R$ @ Dim ServerList as Variant
! ]( }9 X8 G% c! j2 ^ Dim i as Integer# g% Z, H: k& j7 L4 J" r3 \
Serverlist=anOPCServer.getOPcServer(node)
# }' N% Y( a T3 S; s) M List1.clear
9 A* X d% {% ]% a$ u$ T8 M) b FOR i=lbound(Serverlist) to ubound(Serverlist)
8 H7 h$ u, H& V$ Z U List1.additem serverlist(i); s/ _+ i7 P* o( X
NEXT I
m0 S% C1 L9 y5 y1 o
& W9 C8 T' ?! W9 l. ^. E% f( g 就这么简单,为什么在论坛上有这么多人在问,而我也没搞懂。
q% \* M& u& e" e 找到了枚举服务器的办法,在单机上成功。
8 a b% r3 S% k; o 其实《入门》也提供了一个DOC文档,是OPC提供的:
: e. P W8 |- ^6 [ Data Access Automation Interface Standard Version 2.02- i" _3 ?- f( ~4 z0 c5 l$ O
# n; i( n& i) P9 z+ M 是一个必须的手册,只是有一些错误。错误总是难免的。. Y3 N3 Z$ U- v3 b9 ^
入门如果有人指点,实际上不难,没有指点,实际不容易。好在有网络。0 R( P% y' @/ h# Y. p+ Z' g. c
1 ~+ U# |$ n: g& n7 |9 _
上班时,我借了本《数据结构》,里面有算法,不知为什么,我却没找到未知层树的遍历算法。上班可能脑袋不清楚吧。, \( w& _, G# x2 o# r' e
4 y/ E$ @3 F/ A* M9 \ 第六天* M8 S. _9 P% a) h. v, }/ d1 j
F7 @, ~0 \( M% y3 L3 l 上午,想解决树的问题。昨天的KEPWARE的例子,用了TREEVIEW控件和OPCSERVERBROWSER。
9 X& O2 n k8 S. j' l) j+ s
' T0 u7 m3 C5 J, B" V 我用GOOGLE查找“treeview” “树的遍历”,有了答案,好几个地方。仔细一看都是一个。是利用TREEVIEW和递归算法实现计算机文件目录系统的展开。递归,怎么忘记了。! P: C) d, w: A; }- {
0 W! b H, G& |; T3 C+ R0 |
采用递归算法实现了枚举所有ITEM的过程。用了3个小时。
( W0 q, W H9 `" J u# U
! s2 b. I" S8 M( J 下午休息。8 \; V) Y3 p) s1 N4 R8 D
: k( g/ T8 k" R" V4 a o7 {
第七天
! j1 _$ }) V0 s5 }) x
2 J" [- g" [& C4 ]. r* k4 t" t) u9 j 将自己的第一个程序,转成EXE文件,在不同的地方试运行,都正常。
2 _& e% P6 a) V
3 i- N3 t( Q$ O# H2 q/ K; m/ a ^ 我想起了第一天安装的那些DLL,还要么。试一下+ _" q; e5 m. O8 S. J( V C
将一个改名,运行,出错。再试另一个,出错。一个都不能少。记住。
/ D* O( e2 w/ ~2 I B7 t OPCcom_pas.dll 通用接口2 `! M* _2 m5 U% }/ a
OPCAutoda.dll 自动化接口7 u# @5 r& j2 S
OPCProxy.dll PROXY-STUB
0 ~/ a7 Z/ g0 E3 F
( }" {! b0 P& b) i' B! }2 \ 想起组态软件支持OPC,就用组态王试了一下,发现用OPC和用其他方式没有什么两样。一般设备是先找硬件端口,找设备,找I/O点。而OPC是先找OPC服务器,在找出标签(也是点)。真正的组态没有什么两样。
; ~9 U* z M# T; n n+ g ; G! t. Z3 C e8 j
下午,想做个总结。更想休息,七天了,每天6小时以上。好累。
7 T# E* R% L% V5 N5 x. h : l3 c8 d1 W1 o$ p, z# a. s: e* i
后记5 U @* a) d% L% I( H; n/ L
这是一次入门的学习,本身没有什么。我却有些感想。
7 y. ^ j0 D' X8 ~8 S' o - h' r! _3 U8 `: ]& ]9 G. `4 Z
OPC还是很难的,最起码,要自己编客户端已经不易,何况还有- h/ u r; A3 L: B/ D5 r" ~
OPC ALARM & EVENT 报警和事件
/ b- T0 W ~- y OPC DX 服务器间数据交换
& O3 l7 l+ J5 P OPC SECURITY 安全0 |2 D, \' N, C5 p
OPC HISTIRDATA 历史数据库
" s' e8 }# l9 N8 T OPC XML XML+ a. r5 j$ |/ i5 ~0 U
OPC .NET FOR .net5 M8 [3 }/ A+ P: t5 g- s+ h" l! G
这些对于一种工控软件是比不可少的。
: H- Q* _0 W3 {; e/ h
4 @# c3 q3 x$ W- B' \$ x# q 工控行业的发展日新月异,我们这个专业要不断学习。真羡慕医生,白头发代表经验,代表水平。我们呢,白头发代表落后。苦。/ g; [' Z" W* G F4 v" W9 P
中国工控落后,我们用的95%以上都是外国货,说明书都是外文。还要学好外文。苦。; L s# a1 s6 P+ S+ }7 ^- W
( d0 I7 B2 f. K! k 这次有多问题的解决都是在国外网站上找到办法的。有种感觉,在网上什么都可以找到,只要你知道你到底要什么。甜。
& l. c, d# Z3 R0 u; x
% [* U. f4 z6 U9 b% v1 F4 R* W; q o 总算对OPC有了些感觉,累,也甜。 |
|