|
发表于 2008-8-1 16:28:18
|
显示全部楼层
来自: 中国河南新乡
转载 (飘在北京的云~~)9 e# j9 e$ O6 u
- d1 N$ | `$ x" O. r9 n
我从北京买了一本《OPC应用程序入门》,在此之前基本上只是知道有OPC,在五月四日开始,我学了七天。其中有苦有甜。我写下来,权做休息或是练练打字。- M0 n9 i& G& ^ W( H' x
7 Z5 k8 o! \* d) a. e4 \3 [
第一天
% Y( L+ {, L, J1 F: B
6 ]$ P8 G' q* q$ N$ [ 安装了《入门》提供的东西,包括是下面几个文件。还有个批处理文件,是一个注册过程。
M% d: p `0 l2 R" v( T, D opccomn_ps.dll
$ M3 N8 S) a/ L( a% r/ c opcproxy.dll
! e1 P# R+ O+ g1 w opcdaauto.dll5 j3 ^; r7 t3 J# P& }: A ~* b; {4 `
OPCTrend.ocx
( C8 }4 @/ c6 ?4 K% j- F+ f OPCBar.ocx. W/ j. m3 `+ W, |* G1 t
OpcServer.exe 7 W0 `; Z% O% c- W' P
OPCJDADemoServer.exe# e0 `4 q) R- {: P, ]2 \
+ D; Z- G2 ?( v
看了一阵书,知道了前三个是:通用接口,PROXY-STUB,自动化接口。不明白。, h4 ]# H& d$ H4 D! i
后面两个是demo 服务器。. Q+ T, `/ f5 P& O
0 @; N( z* i* G6 O8 S: t8 E
上网,用GOOGLE,查OPC,很自然就找到了www.opcconnect.com.,又下了个free: V# B& G8 `. q
服务器。安装了(注册)。5 g2 O9 C" y6 u- X
- D. x. E6 e; Y9 H 到了工控网,看到有人在推荐clienttools,就下了一个,叫WXOPC。运行一下,
8 ?* L& E- C" V, q# k
( b: _- d7 j$ Y5 h" e/ r 点击连接服务器图标,立即出现了三个:
" k; O- ^4 ]2 i: `. F4 B8 z/ v$ l& O OPCJ.SAMPLESERVER.1
3 z/ V5 G. m7 q2 ]5 T. k/ z; n OPCJ.DADEMOSERVER.1, w, C n' e, c5 ~! C3 o D; u+ s
HEXATEC.PCDATA
6 \( w4 A& R4 a2 d& K+ D' B
- l$ {, e- J) s- L' S 第三个是opcconnect上download的计算机基本情况的简单程序。9 S' N: `% h% W0 m! z# O
" B' D |- C! i/ o5 `1 c
点击他们,还出现了一些“item”,“value"的内容还在变,有意思。我就想这# f q! l+ E( l& q6 W }
工具还真不错,不知我能不能做到,但一想,如果这些功能都做不到,这OPC就没多少0 q3 d* f9 V0 L5 \9 d- O; H, F; S1 n( G
人敢学,也就没有市场。
; Q, @# C, e. B# D- g& ^ . N' D+ M& w$ s5 s, [
有一段时间没用VB了,先热了热身,看了自己过去编过的code。
- O& d9 w3 b# m0 i8 o. e1 O 第二日
; I" k, T6 `% b' Y3 t* X7 ~( ^. N6 ? 今天先看书。
9 L* b: g& Z$ @ 《OPC应用程序入门》,40元,我花了48元,从汇款到收到用了12天,拿到手上,感觉很单薄。我的看书观点是:在看的过程中迷信书,看完后怀疑书,然后忘记书。尽管这本书上我立即就发现有错误。我还是仔细地看下去。
7 R4 B$ P8 v8 j6 Z, \$ Y 9 l5 Y ~, d0 z) J
这是一本教人们用VB编应用客户端程序的书,希望让一般工控技术员认识OPC其实不复杂,最起码编用户程序(客户端)不难。& e s7 I" ]: U. s$ ], g4 F
3 z6 B% ]3 k9 Z 在这之前,我对COM和DCOM技术有所了解,也是很模糊的,OPC以COM和DCOM技术为基础,主要是在服务器端(server),而在用户端并不要很在意它们。 [9 o- `4 s; n' G
3 j f# j0 L2 y& ?( L) [7 @7 V
书上对OPC体系有描述,我画了个图。
" z8 ^; O ]4 i; k0 p
/ Q& b3 |1 y% s2 X. g. u" U: \& w2 Z& X3 L5 h$ P8 ?
0 C6 u o% o/ q" |5 O8 u/ I OPCserver是COM组件,如果安装(注册了)一个OPCserver后,利用WINDOWS的组件工具可以看到,如果这个server安装在别的计算机上,不是本地机,那它就是个DCOM组件(分布式)。
0 l" W7 U! ?9 z' l/ m
5 K3 K0 L7 \0 v, ^5 \ OPC基金会公布了通用接口(用户接口),用C++访问OPCserver只要通过这个接口就可以,并没有必要了解OPCserver是怎么工作的。
; T' G* T- x7 y: F+ s$ T( {
i0 l0 ~% v& @8 Q/ K 对于VB、VBA、EXCEL、DELPHI等编程软件或工具,不能直接访问通用接口,而要通过所谓的自动化接口(automation interface),OPC组织发布了 DATA ACESS 2.0,实际上已经有了3.0版。
$ N" O( I1 _! [$ l0 [1 v& _. I# a
+ P' K' x" D; c+ m# d3 k 而在通用接口和自动化接口之间还有一个东西,是成对使用的,有点象MODEM,在两个接口之间起数据传输作用,有个名字叫PROXY_STUB(代理—占位,翻译还不如不翻译,反正不懂)。
, ^ j, t* y" v, V' v1 ? % c/ ~. j3 ^! ?0 X: K
我在第一天中安装的几个DLL中:1 R* l2 v8 v& E
OPCcomn_ps.dll 通用接口
T! o; ~; f' B. e$ p: p+ a OPCdaAuto.dll 自动化接口
2 a/ T1 C, E! L9 }, F' w' \ OPCProxy.dll PROXY-STUB/ @$ n1 @; \9 d. ^# c9 \: z$ J
$ ^- i. P4 H. g! V2 j
我们的任务是用VB编写客户端程序,只要知道怎样用自动化接口就行了。其他的不去钻了,要不一年也搞不明白。; k* G0 K& ?$ g1 e: t+ J2 N
! ?5 J8 _& k0 ]9 ^# q# x3 y, w$ p' Y: G 我运行VB6.0,新建一个新工程,点击菜单中的“工程”.“引用”,选择”OPC AUTOMATION 2.0”,就可以利用自动化接口。
x5 }3 e1 {7 X0 q0 ~4 `0 m0 g* y " i% X6 ?3 H) J7 L
《入门》没有建议将这些DLL安装在什么目录,我觉得放在WINDOWS的SYSTEM下是比较好的。
/ G( I, o: G* D5 b& K6 R ! E, e6 r1 v: e; S" V
按照书上的顺序,先了解OPC的数据组织。我也画了图。
2 q7 G. ]1 n* ]9 W
9 Q# a: Z7 u. ]1 C7 d M2 V U, J- U; E3 r6 o) j
9 p5 H) Y' b$ x0 w% _- Y+ ?: T7 C) V( b' Z" X' T- N
我们要的就是item,翻译成标签,这就是点,我们所谓的点,比如PLC的I/O点,仪表的数值等。编客户端的开始就是找出数据。
5 j: f! {7 r3 o8 d, w
% b- ~( q" j+ S& S+ `5 } 根据书的介绍,要访问标签,还有其他工作要做。% [+ a9 _, Q6 M' d5 e* |; w
我累了。明天再说。: L/ D+ V( r' Z8 U, k- K
8 q6 D* u* A& U6 ?/ m& Q# o' {* i
第三天. K% `5 p# ]& s8 n0 m9 P
昨天说到访问标签先要做些事。
1 w. e1 |" E+ B" y3 M8 D u/ U `4 u
0 i, w2 ?# z0 W* V$ F 首先要找出你要访问的OPC服务器的名字,连接它,建立一个组( GROUP)的集合,在下面建立一个具体的GROUP,在这个组中添加一个或多个标签。才可以访问。
. o3 J5 \3 t1 T$ q [ : d2 D3 L! ^* b! J
我用第一天下载的WXOPC工具,看到了三个服务器,我选择了其中一个 p# g" |( `0 n8 ^. I3 N# K/ `+ [
hexatec.pcdata.1,是一个计算机基本情况的DEMO服务器,我发现服务器的名字都是这种格式。4 d2 u) e8 }! z7 Q
9 ? }$ _& f' r8 y5 L 按《入门》的样子,做了个客户端的架子,一个小时后完成了服务器的连接,新建组集合,建立一个具体的组。下面有些不清楚。干脆拿《入门》的演示程序打开来研究。, w9 i: x: V0 ]/ g2 |, s% }
直接运行,没问题,看到了数据的变化,决定看其原代码。! r2 G; g9 X# X) f: i
: w9 }0 u4 p6 b1 B
它用的是OPCJ.SAMPLESERVER.1这个服务器,没有实际意义,每个数据都可以读写。1 y$ N; b( X/ p- j* ]4 T
我发现标签名可以任意编,好奇怪。但是我用WXOPC看到的标签,数据却不一样。
4 D8 ?- X2 k8 C, c8 r L L a & H, a$ I$ X8 T8 ? i
我在FORM上加了个text 控件,叫text1,我让服务器名等于text1.text,这样我可以自由换服务器,还不错,几个服务器都可以连接上。但是只有它自己的服务器才可以读出数据。是不是骗人。
. V# ^9 |) v" M 5 m) G, C4 |7 _5 w9 N+ s0 V
试一下按服务器自己的ItemID去访问,我用WXOPC找出hexatec.pcdata.1的标签名,比如“version”,发现还是出错。. _* Q7 O6 P* J# D4 ?& H) L* o
我又到工控论坛上,问已知标签怎样才可以读出数据。没有人回答。
9 u9 ]; Y) a5 M: z. j0 V ( x! d, s& y5 Y! D: N
我给自己留下了两个问题:# F4 }$ Q, X: G$ i& o
1÷怎样获得本机上得所有OPCserver,获得正确的名字。我看到WXOPC可以。论坛上也很多人在问。
* p% ?) ~. @0 ~* B 2÷如何访问ITEM,取得其数据等。
4 o+ w7 \; R% Q3 Z% v' D; G! d8 S # w5 P8 U3 r$ z3 W, U$ X S
又看了一会书,看了有关OPCSERVERBROWSER的内容,好像是有用。
% g/ N) p+ b0 k9 ^ Q9 F1 | 今天到此为止,
" m) D& T( T+ y6 l! ? 休息3 L6 x) o; P3 A( u/ I5 B2 _ u
6 z, ]* [0 n2 k- N! q; o1 y
第四天
& g* H* D k6 C 熟悉OPCSERVERBROWSER的用法。主要有showbranchs,showleafs,movedown,movetoroot0 p, P+ j+ v/ o4 e, u3 S* I
等等。OPC服务器,实际上是一棵树,有brahchs和leafs组成。我编了一个简单的SUB,实现了两层的树的ITEM的枚举,实现不了第三层。这实际上是树的遍历算法问题。我不知怎么做。我准备去问别人。2 h- X* f& B, I$ Z& s$ D
; t+ V5 }9 a" m" f% m% n$ y
从形式上所谓的GROUP/ITEM 和branch/leaf是一样的,实际上并不是。GROUP是用户自己添加的,并不一定要和OPC服务器Branchs一样,每个LEAF是一个 Item,它们可以有用户任意放在哪个组中,不必考虑在服务器中是在哪个branch下,也不必考虑在第几层。
* `: h' S) B4 m9 P5 S/ s ! ]( S3 z+ W' l& N$ q( n
既然我知道了每个ITEM的ID,我想我可以得到各自的SEEVERHANDLE(句柄),从而访问到实际的数据。! _ y) r4 r: \8 Z7 H( ~' m
4 Q/ y" q! c0 I. B5 B w. q 我添加一个组,在其下面建立标签集合,然后用:
, u& E6 }( s! C5 g: T0 h 标签组的ADDITEM方法获得句柄。
0 q# m! q3 {$ v; }' [/ u/ D 用同步读方法就可以得到每个标签的数据。. f, A8 c4 {( R0 ]/ _
% h, ^! z- b" C# u, t* S0 Z; K
我发现有问题。昨天我就发现有问题。
/ ~* W ?9 U+ n8 n 今天论坛上没有人给我回答,去国外网站看看,www.opcfoundation.org上有个FORUM,内容很多,有真正的专家,其中一个是OPC基金会的技术代表。FAQ上还保留了从1998-2001年的问题及回答。/ G4 S; A1 [8 ~7 J
& p( Z8 D3 Q4 V6 m# K
你相信吗,我真的找到了。有一个叫fullqulifity ItemID的说法,比如下面的情况) L% `$ j* {& `- l; j1 g9 }
bch1(树枝) Q0 H6 L8 e( @/ D9 X
tag11(叶子) }) U+ B9 a/ a" H" `" t- w; Q' O
tag12 (叶子)! V8 r6 c0 {! S6 l5 Z$ T, ]
bch2# F3 k& W) t7 U1 e, F, S4 H
tag21 (叶子)
2 }0 [/ q- J! P7 l bch22 (树枝)
) t$ Y' Q) E$ ^ tag221 (叶子)
7 c4 ?2 G7 K8 @* L5 F6 u- I) {. @- B tag222 (叶子)9 j4 g7 T2 l$ n
; z$ {+ {' N0 h4 t2 u3 m
1 Q. D9 {2 n) t# |. Z" \2 g
通常的ITEMID是tag11,tag12,tag21,tag221,tag222这样的1 ^- e, l1 I. G: R! o. d
而Fullqulifity ItemID是bch1.tag11,bcg1.tag12,bch2.bch22.tag221,bch2.bch22.tag222
& s6 P; d+ @( ^- V$ I' x 应该用OPCSERVERBROWSER的GetItemId()获得。. i% ? j/ [; B' x/ u+ r
$ {# _* B4 {! Q- I% b
修改程序,OK。
+ R* K5 c: x F ]6 n) _ b* y/ Z" X' |
还有什么问题,本机服务器的枚举。: I' r9 _* b* T& o. o* B- J
明天再说吧。ZZZzzz1 y$ J5 X" J0 {
: t& [( X) e, T( T3 B, I I 第五天
- H% a/ q5 Y7 A, [ r9 u% ]! j/ f: N7 u1 \! U
国外网站上真是有很多有用的东西,不象我们的论坛,原创的少,转载的多,内容也太少了。今天我直奔主题。* ?8 l/ _, s! @& ?
5 l; `5 s4 _% a% h9 N9 Y7 F
上GOOGLE,输入OPC VB SAMPLE CODE ,GO!。很多。$ A5 a. u4 m5 f/ r. }/ P9 v
我选择了一个网站:2 p7 ]) L. p+ R8 _; [$ {: m' R
www.kepware.com( x5 Y7 I5 {6 S8 O; h3 g# b
下载一个叫KEPSERVEREX-OPC-EXAMPLE的东东,21M。哈哈,带原代码的OPC客户端工具。运行,很不错,那个WXOPC和它比较一下,简直......) |; J; ?) G P2 V g
; }$ b9 W4 P7 O" z
枚举OPCServer的法子:7 e; Z r5 d2 \6 J
Dim ServerList as Variant
* o9 k) u1 j! M6 ]8 h* H Dim i as Integer. u: n3 J$ U* f, T* a
Serverlist=anOPCServer.getOPcServer(node)+ [& W( G1 Z0 Z8 S
List1.clear
7 x3 C0 @5 h6 ?% I W9 p7 x FOR i=lbound(Serverlist) to ubound(Serverlist)
: T) x( V3 G4 \6 U# p! c! E List1.additem serverlist(i)
0 \7 D. w9 g2 q$ V/ G/ p NEXT I, M+ ?; _) M3 X
( k5 H X" p7 C 就这么简单,为什么在论坛上有这么多人在问,而我也没搞懂。: q; O H! Q0 _" E, K
找到了枚举服务器的办法,在单机上成功。! x4 z1 h6 k0 `9 o8 o# H! }7 `+ G
其实《入门》也提供了一个DOC文档,是OPC提供的:
2 H! w9 ]* n5 ~- _; _, J Data Access Automation Interface Standard Version 2.02! b6 n) x2 u" o3 u0 c7 F. f/ l" L
2 V2 A# A8 b8 G9 i6 [1 k
是一个必须的手册,只是有一些错误。错误总是难免的。
" F: N9 c2 d, Y; r 入门如果有人指点,实际上不难,没有指点,实际不容易。好在有网络。
& L5 w8 D4 [: O, d
9 i5 v7 R! `/ U+ E! Y# t 上班时,我借了本《数据结构》,里面有算法,不知为什么,我却没找到未知层树的遍历算法。上班可能脑袋不清楚吧。0 k7 C' D- [8 z& J- B& i' t
: `" Q( }2 O! s6 B
第六天
1 G9 \6 _/ S# q$ v5 O. ` * S0 ~) g( q. P, E0 f
上午,想解决树的问题。昨天的KEPWARE的例子,用了TREEVIEW控件和OPCSERVERBROWSER。: r% Y4 v1 K& S. J
. |/ i6 n) v" h& O) v 我用GOOGLE查找“treeview” “树的遍历”,有了答案,好几个地方。仔细一看都是一个。是利用TREEVIEW和递归算法实现计算机文件目录系统的展开。递归,怎么忘记了。2 T- A; K# N# B+ o. L4 j
! Y: g( J. e: a5 l, d/ V 采用递归算法实现了枚举所有ITEM的过程。用了3个小时。& {. U7 \; i: V7 d: D6 q/ p/ B
$ h# o7 K" ^5 Y9 I) _1 L& i1 M. s
下午休息。
4 |- f" [" Z9 ~) X
. s4 {" y, Z( ~; \ 第七天
0 E" l) T) h6 d. t p+ \& D3 W - H7 N! ?6 v+ S3 D
将自己的第一个程序,转成EXE文件,在不同的地方试运行,都正常。
B5 |% p" ]9 P( X0 r" [; } - }" ]1 q/ n# {" E3 z
我想起了第一天安装的那些DLL,还要么。试一下
2 r0 i7 _2 U% X& F( j4 I8 d 将一个改名,运行,出错。再试另一个,出错。一个都不能少。记住。! k8 J& @8 W3 ?- B
OPCcom_pas.dll 通用接口2 D) V2 K) S3 S! \# h" b
OPCAutoda.dll 自动化接口
& z6 x/ ^) _2 t5 h' R) t1 E OPCProxy.dll PROXY-STUB
8 L: O% `6 F u8 o, W: l0 k# Q ' Y+ u# A& j4 y: M1 a( M2 _: V
想起组态软件支持OPC,就用组态王试了一下,发现用OPC和用其他方式没有什么两样。一般设备是先找硬件端口,找设备,找I/O点。而OPC是先找OPC服务器,在找出标签(也是点)。真正的组态没有什么两样。
4 `9 M7 C9 Q# D" N8 x- P
R, K- _7 {9 o; X9 O 下午,想做个总结。更想休息,七天了,每天6小时以上。好累。
$ X }2 W3 i6 L- T; e! w2 U 2 I+ z7 {" A; C
后记
' H2 I+ x5 r3 L 这是一次入门的学习,本身没有什么。我却有些感想。
$ q, a& v" _/ L& `
- v l5 Y) E) k6 j+ J( C6 N+ e OPC还是很难的,最起码,要自己编客户端已经不易,何况还有
- a( p9 T" ~) @2 X/ k5 L OPC ALARM & EVENT 报警和事件
q2 N s% N: [, T OPC DX 服务器间数据交换3 n2 v0 x& y; @8 G( O3 ^
OPC SECURITY 安全
. C( F4 x _8 F9 Y& A7 a OPC HISTIRDATA 历史数据库+ S! l4 s ~1 s. H; K4 h
OPC XML XML' R* f4 y4 u K0 f% F# H4 f) [' v" \
OPC .NET FOR .net
# s% W5 E, x5 h; I( i% L 这些对于一种工控软件是比不可少的。4 m$ W: S0 x4 ^% H
. c1 w! W% t: ^1 v
工控行业的发展日新月异,我们这个专业要不断学习。真羡慕医生,白头发代表经验,代表水平。我们呢,白头发代表落后。苦。; e# ^( `/ o: e" }' ]: W7 g8 }5 d
中国工控落后,我们用的95%以上都是外国货,说明书都是外文。还要学好外文。苦。
' o1 \3 ]6 l6 ? Q7 j F
, r, ]5 P) Y; h1 d( A$ ? 这次有多问题的解决都是在国外网站上找到办法的。有种感觉,在网上什么都可以找到,只要你知道你到底要什么。甜。
4 d* k; X' ^) |5 h& g- h: n ) v2 R- N1 Z6 Q5 [4 ^4 y
总算对OPC有了些感觉,累,也甜。 |
|