|
|
发表于 2008-8-1 16:28:18
|
显示全部楼层
来自: 中国河南新乡
转载 (飘在北京的云~~)& ]# U' ?: Y6 M, Z) a6 f" N
0 f# ^3 W* W8 H2 r5 d0 t P
我从北京买了一本《OPC应用程序入门》,在此之前基本上只是知道有OPC,在五月四日开始,我学了七天。其中有苦有甜。我写下来,权做休息或是练练打字。
& W/ Q& F+ t# z' q: d! Z+ L) x) }& P
5 b0 Z# `' s. D: v6 L 第一天3 D) W6 v( D) O' ^! X! G( X
7 F1 N) H) f' q( t/ C o
安装了《入门》提供的东西,包括是下面几个文件。还有个批处理文件,是一个注册过程。
5 q/ d! x7 f+ K. a6 q* {: { opccomn_ps.dll
; s. k/ a' \- _. I1 d# T/ {0 m opcproxy.dll: [$ u7 G& N( }. H+ t) K6 L7 w
opcdaauto.dll# E) ]) O/ y; c3 y
OPCTrend.ocx9 i! h* _, b2 w$ d8 H3 D7 y0 B) r
OPCBar.ocx
- T' q7 R; Y+ S; g( \3 U. ? OpcServer.exe 1 L9 `, Z; M5 A& K) I) l
OPCJDADemoServer.exe& P" S" _5 f) F6 D& b8 u5 V& h
* a: B r! _8 s5 Q" j- e) _ 看了一阵书,知道了前三个是:通用接口,PROXY-STUB,自动化接口。不明白。 c+ X4 f) [+ \8 J4 N
后面两个是demo 服务器。
# b+ x. k% L V. Z
( a* E5 y. P5 i$ X7 b: A 上网,用GOOGLE,查OPC,很自然就找到了www.opcconnect.com.,又下了个free
* \' ~% c( U. i4 _ 服务器。安装了(注册)。1 h3 F% b' |- U! b( ~6 t8 N
) O! r' P7 }5 Y1 q2 k0 y
到了工控网,看到有人在推荐clienttools,就下了一个,叫WXOPC。运行一下,3 v$ b0 U5 M0 ]( z5 \- e
, C+ i( K) \4 V5 ]
点击连接服务器图标,立即出现了三个:
. ], Q: q0 I) l OPCJ.SAMPLESERVER.1
9 b7 K4 Z1 E5 h! e OPCJ.DADEMOSERVER.1
3 A% y) O/ M/ i) [! W# w; j HEXATEC.PCDATA# `* X: L8 D1 Y: D. R
5 j. q! T" | G3 p: F
第三个是opcconnect上download的计算机基本情况的简单程序。
) Z+ _7 u9 Q. y $ ]; k' E3 P& v+ y, w
点击他们,还出现了一些“item”,“value"的内容还在变,有意思。我就想这8 r8 ~) m8 X. R/ Q
工具还真不错,不知我能不能做到,但一想,如果这些功能都做不到,这OPC就没多少
5 R3 o/ [6 k: W1 w9 A) C9 `+ l" H: N 人敢学,也就没有市场。
, _- s }% ~' G `( R& S7 [, ~( b 7 T5 \0 _' g" ?2 m3 u
有一段时间没用VB了,先热了热身,看了自己过去编过的code。
# Q4 L5 u* W; B 第二日
0 o! i+ t9 I$ k 今天先看书。$ i& G; `$ B- N) m
《OPC应用程序入门》,40元,我花了48元,从汇款到收到用了12天,拿到手上,感觉很单薄。我的看书观点是:在看的过程中迷信书,看完后怀疑书,然后忘记书。尽管这本书上我立即就发现有错误。我还是仔细地看下去。
" v/ o4 w3 W3 @3 x& p1 ^8 \ . n3 g" g: I4 U- I2 L: i% t5 a; [
这是一本教人们用VB编应用客户端程序的书,希望让一般工控技术员认识OPC其实不复杂,最起码编用户程序(客户端)不难。
- k* T- ]- A5 k1 ?0 Q7 o& ^ 2 i8 w3 l/ B$ f$ e
在这之前,我对COM和DCOM技术有所了解,也是很模糊的,OPC以COM和DCOM技术为基础,主要是在服务器端(server),而在用户端并不要很在意它们。& W2 H; K3 n% m, q' T8 N
2 n$ w, ?& M. ^' @9 u$ C% q
书上对OPC体系有描述,我画了个图。/ n2 X' c1 E! q' y# [: Q
! x0 q$ z$ v ~& P* r k2 h' w! H
: D8 v6 `1 Z: |2 j+ T
P* t& G8 n k* J. g
OPCserver是COM组件,如果安装(注册了)一个OPCserver后,利用WINDOWS的组件工具可以看到,如果这个server安装在别的计算机上,不是本地机,那它就是个DCOM组件(分布式)。
# V, b; b* P* h: l& Y+ e# e1 D
4 L1 W7 S' V& I+ g1 y OPC基金会公布了通用接口(用户接口),用C++访问OPCserver只要通过这个接口就可以,并没有必要了解OPCserver是怎么工作的。% \/ V ~7 C; W5 m
2 W H X$ R3 {& q( Z: d. E 对于VB、VBA、EXCEL、DELPHI等编程软件或工具,不能直接访问通用接口,而要通过所谓的自动化接口(automation interface),OPC组织发布了 DATA ACESS 2.0,实际上已经有了3.0版。
5 X! a/ r9 ?8 F* l9 {8 X * s2 ~: m% ]: x' e4 [
而在通用接口和自动化接口之间还有一个东西,是成对使用的,有点象MODEM,在两个接口之间起数据传输作用,有个名字叫PROXY_STUB(代理—占位,翻译还不如不翻译,反正不懂)。' v' Q2 n+ B0 L8 V, m
3 }! i+ s' Z+ g8 q% o) d' K 我在第一天中安装的几个DLL中:
5 U* T3 d c7 k8 k s3 R# L- i OPCcomn_ps.dll 通用接口
0 {( ~ G0 W$ g( Z# e OPCdaAuto.dll 自动化接口
$ {; U# Y+ Q# @% k; U0 y OPCProxy.dll PROXY-STUB2 A4 y& ~( _9 A& d. x9 g0 F; X9 b
% N4 l) g& O2 X 我们的任务是用VB编写客户端程序,只要知道怎样用自动化接口就行了。其他的不去钻了,要不一年也搞不明白。
% H$ P! J" y# o! |: W9 E4 f" l
- y# @7 i* v2 N9 ?7 D- D 我运行VB6.0,新建一个新工程,点击菜单中的“工程”.“引用”,选择”OPC AUTOMATION 2.0”,就可以利用自动化接口。
& B/ u. C( d$ z" ?
! F8 c9 v |( y9 x; F 《入门》没有建议将这些DLL安装在什么目录,我觉得放在WINDOWS的SYSTEM下是比较好的。
% u! ]0 q! r2 L% R ) P% \9 f( z% t9 g+ \1 ]
按照书上的顺序,先了解OPC的数据组织。我也画了图。
; T) |8 ] u3 \* ?# E4 a
: s/ n4 z: Q" X1 w9 F7 d5 P) |' A/ B7 r- q$ X" A& Z. e
6 B2 P# t$ k( R q
6 P* u/ T; P/ Z8 b7 \- T/ N 我们要的就是item,翻译成标签,这就是点,我们所谓的点,比如PLC的I/O点,仪表的数值等。编客户端的开始就是找出数据。: f5 C' V2 j( s
5 j: Z& H4 q& n3 C3 l. r% ~& I
根据书的介绍,要访问标签,还有其他工作要做。0 B$ P* d7 h, c
我累了。明天再说。
; b! P j! t5 k( W- R5 ~7 Y m
4 z- ^* X4 m% d7 V( G 第三天: L" d7 Q$ w# N- x
昨天说到访问标签先要做些事。5 \! \. L% M5 K( P9 y
" G' y; b+ L$ D7 {$ i- S 首先要找出你要访问的OPC服务器的名字,连接它,建立一个组( GROUP)的集合,在下面建立一个具体的GROUP,在这个组中添加一个或多个标签。才可以访问。
" G$ N C X4 _. A- M$ p |" P Q- M
" s1 U. W2 p8 P 我用第一天下载的WXOPC工具,看到了三个服务器,我选择了其中一个
7 M. G2 O9 ]6 _ hexatec.pcdata.1,是一个计算机基本情况的DEMO服务器,我发现服务器的名字都是这种格式。
9 s5 B t+ u' m ; D, y4 m8 S+ W0 @) i) y
按《入门》的样子,做了个客户端的架子,一个小时后完成了服务器的连接,新建组集合,建立一个具体的组。下面有些不清楚。干脆拿《入门》的演示程序打开来研究。( w( ]3 R4 ^' k# W3 [" y' E2 Y
直接运行,没问题,看到了数据的变化,决定看其原代码。7 W1 a9 U) H+ f, F* c
! N3 N1 F3 x3 s' `! _4 M8 { 它用的是OPCJ.SAMPLESERVER.1这个服务器,没有实际意义,每个数据都可以读写。
% D) A* B+ e/ N& ?/ v0 w 我发现标签名可以任意编,好奇怪。但是我用WXOPC看到的标签,数据却不一样。
) j9 O9 b( l# N0 r/ V
% [( y+ \: q) G2 T0 p$ Y% | 我在FORM上加了个text 控件,叫text1,我让服务器名等于text1.text,这样我可以自由换服务器,还不错,几个服务器都可以连接上。但是只有它自己的服务器才可以读出数据。是不是骗人。
- R5 o3 x3 S% Q' z! q6 z7 U T1 _# T+ P) ^* D0 s' J9 t
试一下按服务器自己的ItemID去访问,我用WXOPC找出hexatec.pcdata.1的标签名,比如“version”,发现还是出错。4 a9 G( T* [; d$ n/ V
我又到工控论坛上,问已知标签怎样才可以读出数据。没有人回答。
. m" z% b! z& Y6 C+ | ' G+ v$ r* a0 h5 }0 `
我给自己留下了两个问题:; E5 c3 a8 @) H
1÷怎样获得本机上得所有OPCserver,获得正确的名字。我看到WXOPC可以。论坛上也很多人在问。5 {& v8 W( ~& k
2÷如何访问ITEM,取得其数据等。
- i* h0 q1 V4 P, ?4 l' v1 X ) n5 A5 }, x5 n! g& a$ A; a' b
又看了一会书,看了有关OPCSERVERBROWSER的内容,好像是有用。) C! O' C" m& C- S/ [
今天到此为止,( w; Y4 x% y/ A' ^
休息6 u$ z! I7 x% r/ w6 W
2 u8 Z$ s5 U9 w. r |. v8 k
第四天
" l) K* t1 {, r" H 熟悉OPCSERVERBROWSER的用法。主要有showbranchs,showleafs,movedown,movetoroot) ^! ^% P. z$ o y4 L* J0 p
等等。OPC服务器,实际上是一棵树,有brahchs和leafs组成。我编了一个简单的SUB,实现了两层的树的ITEM的枚举,实现不了第三层。这实际上是树的遍历算法问题。我不知怎么做。我准备去问别人。
4 Q2 s4 P1 _4 l3 a8 R5 L / q% ^# v6 w9 }6 w
从形式上所谓的GROUP/ITEM 和branch/leaf是一样的,实际上并不是。GROUP是用户自己添加的,并不一定要和OPC服务器Branchs一样,每个LEAF是一个 Item,它们可以有用户任意放在哪个组中,不必考虑在服务器中是在哪个branch下,也不必考虑在第几层。, s4 _; H6 `6 Z9 M/ A
! I, t3 b4 p8 L% h# [' }. P 既然我知道了每个ITEM的ID,我想我可以得到各自的SEEVERHANDLE(句柄),从而访问到实际的数据。7 m- i* I% o1 i" X- T) f5 D
9 h1 J0 O, S' D& u+ O
我添加一个组,在其下面建立标签集合,然后用:
% k5 z4 Z# D" w- ]) A6 C/ Y( j 标签组的ADDITEM方法获得句柄。
: Q: W4 a& w4 x, N* i 用同步读方法就可以得到每个标签的数据。9 [& Y: `+ C& m4 S+ O1 D
5 w* {) e+ h3 t' V: [# t
我发现有问题。昨天我就发现有问题。: y4 B8 z9 V6 }# i. P
今天论坛上没有人给我回答,去国外网站看看,www.opcfoundation.org上有个FORUM,内容很多,有真正的专家,其中一个是OPC基金会的技术代表。FAQ上还保留了从1998-2001年的问题及回答。
# [, p- h( \6 ^9 o- O4 e% M
% \) T9 `5 F' v8 m* H6 P 你相信吗,我真的找到了。有一个叫fullqulifity ItemID的说法,比如下面的情况
& {& q+ L# E: y4 L4 ^7 I bch1(树枝)
) G j. L1 S8 q tag11(叶子)
% h* s2 V# P: x( B. e tag12 (叶子)
4 O2 O' x9 L* y- I) M" Y- x bch2# Q9 g ~) o- r" V
tag21 (叶子)
) U, K8 S' O# q) w1 k+ V bch22 (树枝)
{- |7 J9 g# u7 N6 f- z3 d/ ^ tag221 (叶子)2 w$ X' z. I7 V- u! B3 ^
tag222 (叶子)
+ H+ K- F: v6 v2 g 6 W4 }+ G4 B& ~7 t0 V
/ R" ~3 T& [9 D
通常的ITEMID是tag11,tag12,tag21,tag221,tag222这样的
8 r+ W p: ^" x& s2 z9 _ N* T. t 而Fullqulifity ItemID是bch1.tag11,bcg1.tag12,bch2.bch22.tag221,bch2.bch22.tag222 V( m$ `1 Q7 {9 E5 V
应该用OPCSERVERBROWSER的GetItemId()获得。: D* W/ X, L6 z* m
6 A( A' |% }, g W& S, a 修改程序,OK。5 h, \5 E: ], T7 [: e# j. i# l
7 Q5 a @ M# U& O) y
还有什么问题,本机服务器的枚举。
3 D* z6 S o/ g5 D* ]) ?! _ 明天再说吧。ZZZzzz! r% Z+ ?/ x3 Y0 U" J) G
, [4 y+ O) Z, I, G 第五天, D$ f+ G/ W9 W$ C1 X; B, c- K
& m) n. m) Z5 D6 E# \ 国外网站上真是有很多有用的东西,不象我们的论坛,原创的少,转载的多,内容也太少了。今天我直奔主题。
0 g6 y7 I2 C( r" e6 v! d& O ) ` G. n% f$ u {+ ]
上GOOGLE,输入OPC VB SAMPLE CODE ,GO!。很多。; ~. [ k# |$ k
我选择了一个网站:
" _ ^ O( m) r4 c: P1 O www.kepware.com
9 A! _( T0 l% O" T 下载一个叫KEPSERVEREX-OPC-EXAMPLE的东东,21M。哈哈,带原代码的OPC客户端工具。运行,很不错,那个WXOPC和它比较一下,简直......7 A. K& M) G1 o5 M: Q( ^& B2 v, u
[- A9 `0 e7 G* F& T9 W4 D 枚举OPCServer的法子:& `8 q( [; d' F) A" n
Dim ServerList as Variant
# H( n7 x/ t" c! {# t# t Dim i as Integer) |6 Q, v7 n# R: d) M, X2 `" h
Serverlist=anOPCServer.getOPcServer(node)+ ?0 A4 U9 w* \
List1.clear4 j2 n7 j" C# q" y$ ^. n5 L
FOR i=lbound(Serverlist) to ubound(Serverlist)
D$ \- E+ M1 Y+ c% g) T% ~9 x List1.additem serverlist(i)
" ~2 R5 R8 P: M% ]6 g4 K7 V NEXT I+ v# N2 X( k! |7 Z$ N: G* A. P/ Z
" w! g9 p6 ]" Y% D1 F% U3 | 就这么简单,为什么在论坛上有这么多人在问,而我也没搞懂。8 [! E5 Y* F+ `; h
找到了枚举服务器的办法,在单机上成功。8 L9 o& |9 b e& j, T/ t* f
其实《入门》也提供了一个DOC文档,是OPC提供的:' m' P3 V4 Q3 e9 s# @0 n
Data Access Automation Interface Standard Version 2.02
! O* D3 E4 g* ]( t4 _) {$ V
% Y7 G9 m4 Q, `9 D/ ` 是一个必须的手册,只是有一些错误。错误总是难免的。 Q; ~ h& s& Q7 S5 |6 @* Q3 V
入门如果有人指点,实际上不难,没有指点,实际不容易。好在有网络。
& `9 K; c6 R' ^2 o- y' Y7 L6 _
7 }+ Z3 ?, S9 f! R/ M6 K6 S1 r 上班时,我借了本《数据结构》,里面有算法,不知为什么,我却没找到未知层树的遍历算法。上班可能脑袋不清楚吧。 M5 u, ]4 ]6 |
4 ]" a* {( i& a% h 第六天$ X& {6 I( o3 ?- b( D& q. m
0 ]% t m4 M; d: i9 X
上午,想解决树的问题。昨天的KEPWARE的例子,用了TREEVIEW控件和OPCSERVERBROWSER。
3 {* y6 F* G- @7 ~2 F, t2 ^
, H2 L0 ~3 \. N- k$ r- J; ~ j 我用GOOGLE查找“treeview” “树的遍历”,有了答案,好几个地方。仔细一看都是一个。是利用TREEVIEW和递归算法实现计算机文件目录系统的展开。递归,怎么忘记了。
4 t4 W7 E. S& [# G
8 ^( _0 c* z" r* z! t% S# Q 采用递归算法实现了枚举所有ITEM的过程。用了3个小时。0 g, O5 O, s1 V8 l8 Y7 H
, e2 D/ V5 H: J, P6 Q: l( j
下午休息。
% o0 d% H, Q- l
8 J5 r0 l" E2 C) e 第七天9 k3 Y2 ^5 Y( e5 ]' [) g- y
7 u" ^ J' K; J0 x4 [! C7 \2 L3 ? 将自己的第一个程序,转成EXE文件,在不同的地方试运行,都正常。. R) O1 H) {( ] L
. Y# E4 M% Y) w: k8 e9 ?9 Y+ A- v3 j8 X 我想起了第一天安装的那些DLL,还要么。试一下
7 N+ M; H/ N+ d6 m" [* P/ O6 U8 i 将一个改名,运行,出错。再试另一个,出错。一个都不能少。记住。. d4 }& Z j N: ~- l' p
OPCcom_pas.dll 通用接口: e- G4 o' a `1 ] T
OPCAutoda.dll 自动化接口
, P& M6 G$ S0 x OPCProxy.dll PROXY-STUB
q. F: D) I" q: R' f1 \; U
- Z) | V* t( s$ S; @, u7 r 想起组态软件支持OPC,就用组态王试了一下,发现用OPC和用其他方式没有什么两样。一般设备是先找硬件端口,找设备,找I/O点。而OPC是先找OPC服务器,在找出标签(也是点)。真正的组态没有什么两样。
+ ]1 c$ L/ j4 ^4 c( _
4 B3 |' X0 t6 \* c9 Y& s 下午,想做个总结。更想休息,七天了,每天6小时以上。好累。9 D. s! n9 o% }( X. G
, E$ b! V; F- u$ D7 t0 J/ C5 z3 k 后记6 |' v. Y2 q" q
这是一次入门的学习,本身没有什么。我却有些感想。
; K& U/ U5 {$ X, h- K
& Y+ z. Y! I- ?( M OPC还是很难的,最起码,要自己编客户端已经不易,何况还有; c) c/ ?$ R' B" n: y9 I- q
OPC ALARM & EVENT 报警和事件# H: l) v3 V# `' ?2 n1 I" u
OPC DX 服务器间数据交换
) v# P& ^: n+ Y, m OPC SECURITY 安全9 W8 t d* X; g
OPC HISTIRDATA 历史数据库
# x& v9 J7 z8 u% e0 L$ c; D3 @ OPC XML XML
! N8 ]7 Y: w) T7 L" v1 f- D, c OPC .NET FOR .net' B7 g, j! V! `" {3 o* t% w* H2 ?
这些对于一种工控软件是比不可少的。- K9 K4 z" C7 y2 X9 v/ e6 F
( X! ]% S5 j9 Z3 O5 B" U 工控行业的发展日新月异,我们这个专业要不断学习。真羡慕医生,白头发代表经验,代表水平。我们呢,白头发代表落后。苦。7 c8 m' D2 o* V4 E5 I7 K4 `
中国工控落后,我们用的95%以上都是外国货,说明书都是外文。还要学好外文。苦。
' U6 b H1 {3 G 4 p& l+ F' S# W
这次有多问题的解决都是在国外网站上找到办法的。有种感觉,在网上什么都可以找到,只要你知道你到底要什么。甜。! K) C9 H3 n" E1 i8 f; Z$ z
. `* G, w. t, o 总算对OPC有了些感觉,累,也甜。 |
|