|
|
发表于 2008-8-1 16:28:18
|
显示全部楼层
来自: 中国河南新乡
转载 (飘在北京的云~~)8 j1 R8 r7 |5 ^* n4 D V. g2 Q; I7 ]
/ t* _% u7 [6 O( z# P) q我从北京买了一本《OPC应用程序入门》,在此之前基本上只是知道有OPC,在五月四日开始,我学了七天。其中有苦有甜。我写下来,权做休息或是练练打字。, O5 H2 Z9 H# \
( v8 |7 x* X' p/ V" p9 ~; C8 K 第一天4 m6 C! A* W, {: x1 i) X
2 t6 r$ t1 I1 F5 D5 _
安装了《入门》提供的东西,包括是下面几个文件。还有个批处理文件,是一个注册过程。 a2 F6 Y. O* U7 @' Z
opccomn_ps.dll/ Y8 r3 c/ x. W
opcproxy.dll5 d, E3 R9 }/ l7 ?
opcdaauto.dll
* U }3 ~5 Q' u* y; F$ d2 r/ k2 c2 u1 H OPCTrend.ocx# ^* D$ z f" l4 [+ o
OPCBar.ocx
2 z# {- ~. g3 n8 r: V OpcServer.exe + t! v7 l- ?. Z. t
OPCJDADemoServer.exe
) O( G, R5 c d8 a2 I % y c; {" f" H2 \
看了一阵书,知道了前三个是:通用接口,PROXY-STUB,自动化接口。不明白。
" F6 @$ T* n' O( N0 }2 G* A 后面两个是demo 服务器。
7 K: S: J' J- w& o% \ # w5 c9 @' E1 j5 c& d6 m1 l" ~. X
上网,用GOOGLE,查OPC,很自然就找到了www.opcconnect.com.,又下了个free" e1 a* y6 |: |3 P+ m7 g
服务器。安装了(注册)。
/ l& k# k+ ^2 L: U) ]1 ~* `
0 x1 w4 F% ~! O# ~, L l4 z2 y) l 到了工控网,看到有人在推荐clienttools,就下了一个,叫WXOPC。运行一下,+ r# H1 P; Z- @9 t$ p+ H l9 F* c5 | h, K6 y
8 d! f( A! w S8 t8 { 点击连接服务器图标,立即出现了三个:8 W+ B# ?" o9 }+ g7 T' O/ `6 R; `
OPCJ.SAMPLESERVER.1: S* n' p1 Z7 e! f7 M. o5 F
OPCJ.DADEMOSERVER.1
6 r0 J- R' E& n8 F& \4 i HEXATEC.PCDATA* H/ X/ V! u B) w6 J
$ X5 e+ O! Y- |1 c) j. C% l9 G& E! x 第三个是opcconnect上download的计算机基本情况的简单程序。
+ b) a3 Y9 |' Q- r& ` 0 {$ o- z7 {0 r1 i) {
点击他们,还出现了一些“item”,“value"的内容还在变,有意思。我就想这
% w1 a+ [" n4 @5 U6 n 工具还真不错,不知我能不能做到,但一想,如果这些功能都做不到,这OPC就没多少
" ^. F' G& ^2 c7 X7 q* `! \/ K* [ 人敢学,也就没有市场。
/ Y) x5 D6 a+ k* \& M2 f
. R+ m8 k7 Q; Y: h1 o1 e& [ 有一段时间没用VB了,先热了热身,看了自己过去编过的code。
) R( J# ]. t- z: R 第二日
" j t8 O0 Y0 _# p/ z 今天先看书。# M. F' x1 t5 R- _* M r
《OPC应用程序入门》,40元,我花了48元,从汇款到收到用了12天,拿到手上,感觉很单薄。我的看书观点是:在看的过程中迷信书,看完后怀疑书,然后忘记书。尽管这本书上我立即就发现有错误。我还是仔细地看下去。
$ p% f6 D3 Q/ t6 H; R( Z# ] / e) G% G x6 A. X+ \
这是一本教人们用VB编应用客户端程序的书,希望让一般工控技术员认识OPC其实不复杂,最起码编用户程序(客户端)不难。
2 x) M% Q& ~$ k) @* [) Q2 Q" }; m* W
) o) E& p- y2 ~; T6 u/ s% j9 B 在这之前,我对COM和DCOM技术有所了解,也是很模糊的,OPC以COM和DCOM技术为基础,主要是在服务器端(server),而在用户端并不要很在意它们。
) {/ g- G; U$ g3 o2 z 7 }" p8 R) U+ ~ s- ~
书上对OPC体系有描述,我画了个图。- V+ |9 O6 y( i6 t8 |
/ p( c p. J% I" R, m& U) ~. T! S1 \/ e( n
4 r* N( G5 P1 P( E$ j
OPCserver是COM组件,如果安装(注册了)一个OPCserver后,利用WINDOWS的组件工具可以看到,如果这个server安装在别的计算机上,不是本地机,那它就是个DCOM组件(分布式)。: [0 i& E% e6 P
: C- k, V3 h! o6 Z; Y5 V9 n
OPC基金会公布了通用接口(用户接口),用C++访问OPCserver只要通过这个接口就可以,并没有必要了解OPCserver是怎么工作的。
6 @6 k% e0 T: F( r, N# z 1 w) T9 T( L& t% \; y% K6 p b
对于VB、VBA、EXCEL、DELPHI等编程软件或工具,不能直接访问通用接口,而要通过所谓的自动化接口(automation interface),OPC组织发布了 DATA ACESS 2.0,实际上已经有了3.0版。' s+ O+ T' f/ P. B" } d
8 ~. ^5 [+ {1 O1 X* s. y5 o
而在通用接口和自动化接口之间还有一个东西,是成对使用的,有点象MODEM,在两个接口之间起数据传输作用,有个名字叫PROXY_STUB(代理—占位,翻译还不如不翻译,反正不懂)。
1 G( \1 L' x+ y8 O
5 ?3 I0 `- q q9 n1 `/ n. s 我在第一天中安装的几个DLL中:
5 N0 ~) T1 T4 `0 } OPCcomn_ps.dll 通用接口% L- j( O$ ]5 N
OPCdaAuto.dll 自动化接口/ M& f2 F7 h4 n' I, j1 h2 o% r
OPCProxy.dll PROXY-STUB
0 J2 c2 K$ n; t% E" B& ~ 9 Y6 I" L! d" ~! X1 R( F
我们的任务是用VB编写客户端程序,只要知道怎样用自动化接口就行了。其他的不去钻了,要不一年也搞不明白。
% r5 ]; Z& r2 O7 l , {4 S d3 U# Y: W0 J! V& ^
我运行VB6.0,新建一个新工程,点击菜单中的“工程”.“引用”,选择”OPC AUTOMATION 2.0”,就可以利用自动化接口。+ K7 }' _! K ~( E4 h. u
* ~9 x/ e6 X, {0 \6 Z# w& n 《入门》没有建议将这些DLL安装在什么目录,我觉得放在WINDOWS的SYSTEM下是比较好的。5 f9 b0 l4 p, h
# [' S" M( T" F* @ ]( T
按照书上的顺序,先了解OPC的数据组织。我也画了图。, e* ?# T# O6 M/ F
* A7 J' u" k# _! n; V
3 `: o) ?2 M. d/ k
$ r i3 \, {2 ?6 P1 v6 k! k: E/ U0 w
" L5 ]: [4 L" `+ L `4 x 我们要的就是item,翻译成标签,这就是点,我们所谓的点,比如PLC的I/O点,仪表的数值等。编客户端的开始就是找出数据。
& d& @# j+ _5 o' M0 _3 ?
+ P# x- @' c; ?: B( S; K7 q7 X 根据书的介绍,要访问标签,还有其他工作要做。! [% O3 V2 V6 [/ r z
我累了。明天再说。
: a. A5 [! P% g' d ]6 J : a) D$ y a/ K+ v' G0 i% \, I
第三天/ U# e ^5 h, x4 ~8 }; L. q
昨天说到访问标签先要做些事。
: s1 u Z. T+ I: K) {- G* Y* J
; H& H, H( W1 P& [ 首先要找出你要访问的OPC服务器的名字,连接它,建立一个组( GROUP)的集合,在下面建立一个具体的GROUP,在这个组中添加一个或多个标签。才可以访问。
! \8 Z) p' X) g! }6 L
6 f4 \3 Q4 p7 C/ z1 e! g, L# F 我用第一天下载的WXOPC工具,看到了三个服务器,我选择了其中一个
* k) l1 t! ]+ x hexatec.pcdata.1,是一个计算机基本情况的DEMO服务器,我发现服务器的名字都是这种格式。
4 b& z+ H, x, C1 ` w+ i; S 1 G9 ^% w/ e+ o4 v
按《入门》的样子,做了个客户端的架子,一个小时后完成了服务器的连接,新建组集合,建立一个具体的组。下面有些不清楚。干脆拿《入门》的演示程序打开来研究。
, Y7 ?" I( b0 ] a 直接运行,没问题,看到了数据的变化,决定看其原代码。! e1 A, M, ~- N% b5 ~" m
5 S# ]$ S& C0 z R6 W 它用的是OPCJ.SAMPLESERVER.1这个服务器,没有实际意义,每个数据都可以读写。) i1 S T; F+ Y% M, P" h9 ^$ Z
我发现标签名可以任意编,好奇怪。但是我用WXOPC看到的标签,数据却不一样。
- f& q* H- G7 [9 r$ I9 |
! m' }, |2 @+ c, U4 ~ 我在FORM上加了个text 控件,叫text1,我让服务器名等于text1.text,这样我可以自由换服务器,还不错,几个服务器都可以连接上。但是只有它自己的服务器才可以读出数据。是不是骗人。- L( t6 l$ R2 d" m4 {1 T0 E3 I' [3 ~
/ F! e- u: K8 N- _0 d4 i 试一下按服务器自己的ItemID去访问,我用WXOPC找出hexatec.pcdata.1的标签名,比如“version”,发现还是出错。
3 S& t. ?5 g0 z$ g6 g1 { 我又到工控论坛上,问已知标签怎样才可以读出数据。没有人回答。
+ _ d. O# _# T: E
# @0 _9 v2 Q+ p8 n0 ~ 我给自己留下了两个问题:. Q) u* H. O7 n
1÷怎样获得本机上得所有OPCserver,获得正确的名字。我看到WXOPC可以。论坛上也很多人在问。% N2 b% j/ I) _1 n( {9 W3 y
2÷如何访问ITEM,取得其数据等。
k6 U/ }+ X% y$ b8 ^/ i 3 l6 w8 Q& P! e w% Q* w3 m
又看了一会书,看了有关OPCSERVERBROWSER的内容,好像是有用。
; s% r+ {" Y% \+ l 今天到此为止,$ O" v4 t1 K4 _; E% |2 d$ u
休息
, H. @& }$ J) g l9 s6 w, y5 {$ a
. Q: g- w% h2 D4 k9 E2 M 第四天4 d" z: W- R* `* ?
熟悉OPCSERVERBROWSER的用法。主要有showbranchs,showleafs,movedown,movetoroot% O2 ?5 {; k, o/ [+ ~& m# b+ `
等等。OPC服务器,实际上是一棵树,有brahchs和leafs组成。我编了一个简单的SUB,实现了两层的树的ITEM的枚举,实现不了第三层。这实际上是树的遍历算法问题。我不知怎么做。我准备去问别人。2 J7 x/ F$ g1 a8 ]" C* ?
# K+ j% d6 y7 K3 Z% b 从形式上所谓的GROUP/ITEM 和branch/leaf是一样的,实际上并不是。GROUP是用户自己添加的,并不一定要和OPC服务器Branchs一样,每个LEAF是一个 Item,它们可以有用户任意放在哪个组中,不必考虑在服务器中是在哪个branch下,也不必考虑在第几层。4 `+ c5 S' _4 j- @0 m# ?5 {5 v3 G
6 H, x# k$ m# D. W, {
既然我知道了每个ITEM的ID,我想我可以得到各自的SEEVERHANDLE(句柄),从而访问到实际的数据。3 M4 h% Y. Z# i# y }
! i* C" h% O5 h/ `9 A
我添加一个组,在其下面建立标签集合,然后用:
, Z; G1 K! H, p1 e% g 标签组的ADDITEM方法获得句柄。7 D: h% I d& [' J6 O. a
用同步读方法就可以得到每个标签的数据。1 w0 I% s9 S6 C# Z1 i$ {% Y
p6 X7 _. {7 r( y) h: c
我发现有问题。昨天我就发现有问题。
5 S D$ F) c5 f/ M 今天论坛上没有人给我回答,去国外网站看看,www.opcfoundation.org上有个FORUM,内容很多,有真正的专家,其中一个是OPC基金会的技术代表。FAQ上还保留了从1998-2001年的问题及回答。
; D3 S, S3 M8 z" s/ s$ z2 [0 I
, B0 u( P- o/ d4 O 你相信吗,我真的找到了。有一个叫fullqulifity ItemID的说法,比如下面的情况
5 Q' V8 U; e, M! a- S! d/ k; p bch1(树枝)
/ ?- ~% w) i$ R6 D2 X8 R tag11(叶子)
$ d5 b5 m2 f, E* { g5 ] tag12 (叶子)# I& d4 k0 S' j, e) ~
bch2
( u# k6 E5 o8 Q2 M# P tag21 (叶子)
1 J' I* A. J6 g: `5 P1 i* [ bch22 (树枝)# B- ^( a; D" E) u
tag221 (叶子)' m& l2 J7 _$ q: ~5 s; R
tag222 (叶子)
( G2 U1 H8 y" R; y% b+ x ! h* t2 @7 y& Q% X
" g$ B6 x: B7 Z0 D. ^
通常的ITEMID是tag11,tag12,tag21,tag221,tag222这样的( `, a: Z, r) C% {7 z
而Fullqulifity ItemID是bch1.tag11,bcg1.tag12,bch2.bch22.tag221,bch2.bch22.tag222* S8 f1 b# } Q2 ]
应该用OPCSERVERBROWSER的GetItemId()获得。 G. B- X9 P$ f7 D3 N& I3 F; m0 I( A
0 x6 s& r- }* w. V
修改程序,OK。% O6 k3 E5 \2 `: X! o8 F8 n r4 p
1 @. d! b# \. Y2 E
还有什么问题,本机服务器的枚举。
0 k* c/ m! r* @8 A3 o* \ \6 h: Y2 E 明天再说吧。ZZZzzz( w) t% q0 @9 Q2 D+ W f
5 C5 R: A* i6 Y) ]0 s
第五天% M# k0 Q& ]8 s/ B4 ]
. A% f0 K* [$ X$ B) f; _ 国外网站上真是有很多有用的东西,不象我们的论坛,原创的少,转载的多,内容也太少了。今天我直奔主题。% _ T4 f, N/ V/ P! [ U
5 f3 ? e% U5 G8 B9 Q6 s 上GOOGLE,输入OPC VB SAMPLE CODE ,GO!。很多。
" G1 |7 n: m) U: Y0 ~- Z 我选择了一个网站:- u4 x: h/ o9 W6 D
www.kepware.com
1 }# X) l9 c# [# y9 w 下载一个叫KEPSERVEREX-OPC-EXAMPLE的东东,21M。哈哈,带原代码的OPC客户端工具。运行,很不错,那个WXOPC和它比较一下,简直......- L* O9 n* J3 J' c5 |' e4 ?( c8 `1 q
' r! c9 ?: M5 C" w8 r 枚举OPCServer的法子:
5 n% [/ I, s+ W" ]* P Dim ServerList as Variant
1 ]2 h% O. n7 q; B* D Dim i as Integer8 m' i6 S9 A% g }$ y
Serverlist=anOPCServer.getOPcServer(node)
, p0 W. d* c9 i8 w. p List1.clear
" F J; M' m- @. L& Q, T FOR i=lbound(Serverlist) to ubound(Serverlist): n7 G) M, I4 `8 q5 K. U; i, C2 U
List1.additem serverlist(i)
5 [4 n. ~4 P9 Q: v- \' y. p# ] NEXT I4 _4 ?% N; v4 Z, T
2 C G: g! G/ U4 L& I2 x8 r 就这么简单,为什么在论坛上有这么多人在问,而我也没搞懂。7 y J- k) [; p8 e
找到了枚举服务器的办法,在单机上成功。
9 t6 M6 T4 E3 @( Q* r+ f5 [ 其实《入门》也提供了一个DOC文档,是OPC提供的:
2 V0 `& n7 `& X4 r4 O6 i Data Access Automation Interface Standard Version 2.02
9 [; g+ V2 l$ n8 t7 T \ 9 s v8 b/ T6 F& i, k0 k% M; m, G8 [4 a
是一个必须的手册,只是有一些错误。错误总是难免的。
" z7 W5 `% G6 _& d7 l$ n( y6 p 入门如果有人指点,实际上不难,没有指点,实际不容易。好在有网络。
) s+ |" x- S4 \5 W( {/ Q U/ Y, F! y5 Y1 ~# {
上班时,我借了本《数据结构》,里面有算法,不知为什么,我却没找到未知层树的遍历算法。上班可能脑袋不清楚吧。* V7 h0 a( S0 e8 j% C8 j) r
, M) s. C4 t9 B; J% {$ Y( L
第六天6 j0 |. C9 Z' b4 d* i1 \
( M/ d4 c( g v5 N% F) z4 o% Q" y6 ~3 o
上午,想解决树的问题。昨天的KEPWARE的例子,用了TREEVIEW控件和OPCSERVERBROWSER。1 F9 ] B% ?: A6 Q; \
3 e3 i) D A+ X) ?- t
我用GOOGLE查找“treeview” “树的遍历”,有了答案,好几个地方。仔细一看都是一个。是利用TREEVIEW和递归算法实现计算机文件目录系统的展开。递归,怎么忘记了。# y7 c' ^ h: m: f
" o l/ W( m* w9 A; ~ 采用递归算法实现了枚举所有ITEM的过程。用了3个小时。! ~+ @, R0 f& x3 h
2 Z' O/ M! ]7 M6 e
下午休息。* k8 }- T- g+ M6 u- O* C1 c
4 e- c2 a8 Y% \4 M! c, e1 H4 |% p9 z. I 第七天) p. X" b( |8 p# W8 r
3 H* Q& m u" E/ X- u) Q: W
将自己的第一个程序,转成EXE文件,在不同的地方试运行,都正常。
( U. R; P9 g+ p$ |* ?
: ~; c2 s7 o, K 我想起了第一天安装的那些DLL,还要么。试一下
& i' E9 P+ A5 r. J7 x. x 将一个改名,运行,出错。再试另一个,出错。一个都不能少。记住。& d4 f8 L& t4 k/ w. n3 N4 E6 q
OPCcom_pas.dll 通用接口
/ I0 ]& l4 N3 N2 X. ] OPCAutoda.dll 自动化接口
8 E+ J7 l6 K" H$ S! e OPCProxy.dll PROXY-STUB [: P* {; q; q$ t7 ?% S4 c
& P r/ T3 m0 D( M9 w) P9 F 想起组态软件支持OPC,就用组态王试了一下,发现用OPC和用其他方式没有什么两样。一般设备是先找硬件端口,找设备,找I/O点。而OPC是先找OPC服务器,在找出标签(也是点)。真正的组态没有什么两样。
A1 f: P3 w) f$ d8 D0 ]% `
$ }8 d2 r6 c' o- ]' D, n4 [ r 下午,想做个总结。更想休息,七天了,每天6小时以上。好累。) Q4 A9 g& \ Q! n4 I0 j6 h& C
4 _, ?1 ~7 T) Z* a7 P 后记+ I# Z- t( s5 d& X
这是一次入门的学习,本身没有什么。我却有些感想。$ Y& m7 j! E8 S% b. U+ i
! v. u* B9 {. x# H# N& T( r; J6 T
OPC还是很难的,最起码,要自己编客户端已经不易,何况还有
( [/ R( G j5 O) N# m OPC ALARM & EVENT 报警和事件
6 n- g2 N' w( T4 E# b$ h& s8 r4 B8 z OPC DX 服务器间数据交换
5 c- m' ?, Z: N9 z# G" ?* D9 T OPC SECURITY 安全
4 w0 ]7 N+ B- E% k OPC HISTIRDATA 历史数据库+ B7 ]$ s" E- D" P5 K
OPC XML XML9 m6 n$ X# Z' O( u! s# ^+ ~. ^$ y
OPC .NET FOR .net
5 @% y, A. B- y' m8 t, [ 这些对于一种工控软件是比不可少的。
. i6 j: {4 K5 l6 n7 B l , @. v) @) b7 X8 j& K, M
工控行业的发展日新月异,我们这个专业要不断学习。真羡慕医生,白头发代表经验,代表水平。我们呢,白头发代表落后。苦。; c/ v1 V+ L7 q* @. G: }
中国工控落后,我们用的95%以上都是外国货,说明书都是外文。还要学好外文。苦。
6 M2 i& v- }! Q. \: P( l% D Y 2 f! N* _) W2 Z4 K o. ~7 D3 H
这次有多问题的解决都是在国外网站上找到办法的。有种感觉,在网上什么都可以找到,只要你知道你到底要什么。甜。
N# ?, @- I: P X ; H5 Z) l- s. R: v% b( K4 K
总算对OPC有了些感觉,累,也甜。 |
|