|
发表于 2008-8-1 16:28:18
|
显示全部楼层
来自: 中国河南新乡
转载 (飘在北京的云~~), k0 ]& g. W9 {. k D
. w7 g' e; R1 I1 L. J
我从北京买了一本《OPC应用程序入门》,在此之前基本上只是知道有OPC,在五月四日开始,我学了七天。其中有苦有甜。我写下来,权做休息或是练练打字。6 R5 F6 P N$ P$ }2 k
% R3 A; ]6 z7 [) }3 Z, ` 第一天& Z J# i! I$ S" ~& o2 N% W( x
! D4 H8 a" M. }9 ]1 A3 M7 @+ P
安装了《入门》提供的东西,包括是下面几个文件。还有个批处理文件,是一个注册过程。
7 R* R! F3 y+ `- o- Y- m$ D opccomn_ps.dll
# ~4 J; V9 g) S$ _+ h: T, T opcproxy.dll! Z- r2 D! y L% ^ s
opcdaauto.dll
4 Q. Y& Z( S& a; l/ ` OPCTrend.ocx
/ w5 ?- F6 g: J$ p( P OPCBar.ocx1 v. s; C! y5 Z
OpcServer.exe 2 |/ E! E. W3 ^- m
OPCJDADemoServer.exe7 e0 J' @* S! Y" q h, q
+ w0 G U0 U$ p! e/ c# L$ C 看了一阵书,知道了前三个是:通用接口,PROXY-STUB,自动化接口。不明白。. {! n2 l+ r# f& ?9 `
后面两个是demo 服务器。: y1 ?" x6 @6 l% u% T0 ~+ o
( ?5 a5 D+ R- ~, x3 x4 A; r9 y, W
上网,用GOOGLE,查OPC,很自然就找到了www.opcconnect.com.,又下了个free
8 u: T1 g Z+ T% R7 V 服务器。安装了(注册)。
% h' U7 G0 e, }) C7 \ 9 w; s# S3 t+ b
到了工控网,看到有人在推荐clienttools,就下了一个,叫WXOPC。运行一下,7 Y3 w, R H) |
, `: L/ E0 P5 k! z3 z' q. ?4 S/ U
点击连接服务器图标,立即出现了三个:. m6 n, _/ k/ G# F! ~% I u) n" `, |
OPCJ.SAMPLESERVER.1
$ ^- n1 L$ o/ ? OPCJ.DADEMOSERVER.16 t3 s& L/ ]% {! v
HEXATEC.PCDATA. m! a# P# o( Z- r; ~1 V
1 } n0 F3 J) J! ~6 i M$ s 第三个是opcconnect上download的计算机基本情况的简单程序。
# e' q+ a; T( G1 L, B; W
; y; ]/ w6 b+ j7 \8 A 点击他们,还出现了一些“item”,“value"的内容还在变,有意思。我就想这0 e' d& p1 U; `2 f: S
工具还真不错,不知我能不能做到,但一想,如果这些功能都做不到,这OPC就没多少
$ R- d( T- G. n+ O+ s 人敢学,也就没有市场。) F& i R. H v6 w. @7 k
0 r% A1 z) j# Z3 ?5 h 有一段时间没用VB了,先热了热身,看了自己过去编过的code。" L7 z8 o! \9 d% y/ M
第二日+ ~) C, w; D/ T' s* y
今天先看书。
! H* J% U( H2 h& q 《OPC应用程序入门》,40元,我花了48元,从汇款到收到用了12天,拿到手上,感觉很单薄。我的看书观点是:在看的过程中迷信书,看完后怀疑书,然后忘记书。尽管这本书上我立即就发现有错误。我还是仔细地看下去。
5 ]% u8 i& g0 p7 V. Q, ~ 8 N% k/ N |+ i. U- v
这是一本教人们用VB编应用客户端程序的书,希望让一般工控技术员认识OPC其实不复杂,最起码编用户程序(客户端)不难。
5 b/ _ U. p8 x( {7 \. y4 ?
~; Q2 F5 `) [8 t `9 c7 h+ _ 在这之前,我对COM和DCOM技术有所了解,也是很模糊的,OPC以COM和DCOM技术为基础,主要是在服务器端(server),而在用户端并不要很在意它们。& B* h8 ~ g, Q) V/ J
- z8 {# s1 j- T3 G: z; i3 c3 z 书上对OPC体系有描述,我画了个图。0 K7 p2 ?3 s( |/ s$ l; A
1 v, }4 F I" X* |+ c
) c/ J# O2 |! H4 Q& g' Q
" L! S+ W* _0 G OPCserver是COM组件,如果安装(注册了)一个OPCserver后,利用WINDOWS的组件工具可以看到,如果这个server安装在别的计算机上,不是本地机,那它就是个DCOM组件(分布式)。
7 c: J$ g* v! v
3 Q+ a! a, T" g OPC基金会公布了通用接口(用户接口),用C++访问OPCserver只要通过这个接口就可以,并没有必要了解OPCserver是怎么工作的。
! H- ^* F# X& D( n- [
" K: ]3 X9 O7 B% W: } @ 对于VB、VBA、EXCEL、DELPHI等编程软件或工具,不能直接访问通用接口,而要通过所谓的自动化接口(automation interface),OPC组织发布了 DATA ACESS 2.0,实际上已经有了3.0版。* \$ H% ^1 M P2 t5 G" T; v
' E7 W, o% H3 ]: O$ P6 F% Z 而在通用接口和自动化接口之间还有一个东西,是成对使用的,有点象MODEM,在两个接口之间起数据传输作用,有个名字叫PROXY_STUB(代理—占位,翻译还不如不翻译,反正不懂)。
9 | J0 n- |3 E; k3 E7 F ; P7 }/ C- ]" X! ?( |0 [
我在第一天中安装的几个DLL中:
; [8 Q' p4 }+ R. Q: n OPCcomn_ps.dll 通用接口
4 i5 U* {; r8 o) C3 X8 D OPCdaAuto.dll 自动化接口: V; Q5 w9 B- n$ D, U
OPCProxy.dll PROXY-STUB
, P0 L; y. h8 n . m; z* I) l( @
我们的任务是用VB编写客户端程序,只要知道怎样用自动化接口就行了。其他的不去钻了,要不一年也搞不明白。
/ t- N; N! x$ |3 E E
, Y3 g4 |% N3 t5 ] 我运行VB6.0,新建一个新工程,点击菜单中的“工程”.“引用”,选择”OPC AUTOMATION 2.0”,就可以利用自动化接口。
6 [' a; J+ P/ G- G' I! e) p * t+ l' J9 @' B8 \# A6 L& ~' C7 M
《入门》没有建议将这些DLL安装在什么目录,我觉得放在WINDOWS的SYSTEM下是比较好的。
% U4 s2 j% J" t' w ) i3 u6 \" G" o! Q
按照书上的顺序,先了解OPC的数据组织。我也画了图。
2 S& C0 I+ |1 S5 ~# R
8 C0 N3 n0 I( m, Z' C# K5 S, ^) \) N6 z
) n' G! d7 [% ]! W; h- {# \5 Y; x; C0 d& `$ D: t
我们要的就是item,翻译成标签,这就是点,我们所谓的点,比如PLC的I/O点,仪表的数值等。编客户端的开始就是找出数据。4 t9 z* \1 K3 T1 {% |
3 h$ J4 e$ B* M) H' O4 Y# k
根据书的介绍,要访问标签,还有其他工作要做。! d6 Q- t4 C0 t; U
我累了。明天再说。
- d5 E5 H: {8 e, H
+ C9 }+ e4 p3 m9 E- s; @ 第三天 M3 T" I f! ]% ~
昨天说到访问标签先要做些事。! i5 T- h" `7 H4 b* ~2 @
* M3 l( s9 }2 ?6 ~: F
首先要找出你要访问的OPC服务器的名字,连接它,建立一个组( GROUP)的集合,在下面建立一个具体的GROUP,在这个组中添加一个或多个标签。才可以访问。
8 S% G$ f# h" G3 X / N* k5 A2 a& @( ~- |
我用第一天下载的WXOPC工具,看到了三个服务器,我选择了其中一个
: z& z$ l# G, ]9 `0 |% P hexatec.pcdata.1,是一个计算机基本情况的DEMO服务器,我发现服务器的名字都是这种格式。
2 `, D7 v w. D9 M# z 1 h/ h0 @! o. y/ u9 s& L) b( Y
按《入门》的样子,做了个客户端的架子,一个小时后完成了服务器的连接,新建组集合,建立一个具体的组。下面有些不清楚。干脆拿《入门》的演示程序打开来研究。$ Y( |. j8 g$ Y% |0 S- i
直接运行,没问题,看到了数据的变化,决定看其原代码。
0 @! {9 r& Y! d% O9 `7 F* C % I) ^6 o2 V8 w( i1 D- K; ]8 D+ F
它用的是OPCJ.SAMPLESERVER.1这个服务器,没有实际意义,每个数据都可以读写。, V, z" @3 y; B
我发现标签名可以任意编,好奇怪。但是我用WXOPC看到的标签,数据却不一样。
5 v' K$ _$ j/ M9 R6 A- ] 9 l8 T7 M, w5 o! p: d$ W" N& S
我在FORM上加了个text 控件,叫text1,我让服务器名等于text1.text,这样我可以自由换服务器,还不错,几个服务器都可以连接上。但是只有它自己的服务器才可以读出数据。是不是骗人。1 |* |' X. \, l! Z {( z# D
. e3 A% x4 `+ ^$ h
试一下按服务器自己的ItemID去访问,我用WXOPC找出hexatec.pcdata.1的标签名,比如“version”,发现还是出错。
! H! ~# }0 y1 b. L5 z* {. t 我又到工控论坛上,问已知标签怎样才可以读出数据。没有人回答。
9 O) @$ e# l( V" F# r j + B3 h6 ?) S! b
我给自己留下了两个问题:+ W( g* a# T9 y9 X+ O6 d- N
1÷怎样获得本机上得所有OPCserver,获得正确的名字。我看到WXOPC可以。论坛上也很多人在问。/ |6 ?% f" E4 J
2÷如何访问ITEM,取得其数据等。) h+ O% C; U1 t7 a
$ Y7 l- h9 u8 H- t/ i% t% z 又看了一会书,看了有关OPCSERVERBROWSER的内容,好像是有用。
- v* ^, E! d6 U* g 今天到此为止,
* n l7 H7 Z2 S3 T r" J* H/ w4 w 休息, P/ t$ ^; y/ ?$ _8 b
! T' V2 N9 m9 P
第四天9 g$ h0 A% R, k) r; }8 a& \! }
熟悉OPCSERVERBROWSER的用法。主要有showbranchs,showleafs,movedown,movetoroot! O2 x' v* I& ]0 c- S9 t6 l& ]
等等。OPC服务器,实际上是一棵树,有brahchs和leafs组成。我编了一个简单的SUB,实现了两层的树的ITEM的枚举,实现不了第三层。这实际上是树的遍历算法问题。我不知怎么做。我准备去问别人。
% U9 P* o$ b# t/ C1 H* u% m7 `5 ^
9 W' P0 {* B0 Q2 I 从形式上所谓的GROUP/ITEM 和branch/leaf是一样的,实际上并不是。GROUP是用户自己添加的,并不一定要和OPC服务器Branchs一样,每个LEAF是一个 Item,它们可以有用户任意放在哪个组中,不必考虑在服务器中是在哪个branch下,也不必考虑在第几层。
: G+ b- f$ l, L m1 [) q
# M" x4 D* m. Z l 既然我知道了每个ITEM的ID,我想我可以得到各自的SEEVERHANDLE(句柄),从而访问到实际的数据。
3 q. j+ @2 {0 D2 y; a3 E s% g
2 M8 P1 r" K: V5 X: N0 J 我添加一个组,在其下面建立标签集合,然后用:7 B0 q( A; V Z7 F$ |* E, j, I* s8 d P
标签组的ADDITEM方法获得句柄。
( p) C7 {2 k) [" m) { n/ U 用同步读方法就可以得到每个标签的数据。8 c, Z, o7 v) T8 L
8 t% Y: h, Q2 Q$ C' p; B
我发现有问题。昨天我就发现有问题。& T: ?: p/ e# N
今天论坛上没有人给我回答,去国外网站看看,www.opcfoundation.org上有个FORUM,内容很多,有真正的专家,其中一个是OPC基金会的技术代表。FAQ上还保留了从1998-2001年的问题及回答。: |% C+ n4 B- w) N+ A |) y: j3 s
. d0 O6 x7 k8 C
你相信吗,我真的找到了。有一个叫fullqulifity ItemID的说法,比如下面的情况
8 Q& x' G! R, o2 g. R! r$ Z i- S3 G bch1(树枝): `' u# C' l$ [0 B- x; y) j. e
tag11(叶子)
, `1 k) b' l: A' h; w: K+ a tag12 (叶子)6 i! S7 R9 {4 O, f) D3 L
bch27 V7 a# \6 v5 y4 H
tag21 (叶子)
9 O4 L; J' v R6 s& W bch22 (树枝)7 V" s% a' o% L. ?+ n- s7 ]
tag221 (叶子)
, ~6 I% l& q" _7 ~ g9 i/ T tag222 (叶子)
- n4 G7 K- E; j, j) p# D) V
. j4 U/ j- M3 J( K& D* V 1 n/ H: L* r4 s7 l8 Z% n$ Y7 B
通常的ITEMID是tag11,tag12,tag21,tag221,tag222这样的; [9 s, m8 O3 c
而Fullqulifity ItemID是bch1.tag11,bcg1.tag12,bch2.bch22.tag221,bch2.bch22.tag222
p2 N! f4 S R7 ^ 应该用OPCSERVERBROWSER的GetItemId()获得。
) o+ F. f2 @: V- ~0 q1 R9 G2 v1 X; h
$ C) w* w' [0 ^1 u* K 修改程序,OK。/ T1 X: N$ ^$ C
+ n6 D f4 K9 p" q) M
还有什么问题,本机服务器的枚举。. a8 d+ z* J0 @2 w
明天再说吧。ZZZzzz. ?# V4 j3 w7 J: \7 B: R, _7 f
A* {0 Q( U$ d$ E( M$ |: W 第五天
& B5 X6 k/ @* n
k- W# t" c2 O) c W" m" n- N, n 国外网站上真是有很多有用的东西,不象我们的论坛,原创的少,转载的多,内容也太少了。今天我直奔主题。% m+ u7 p% n2 M _) e4 {
! K% j1 ?8 R; N" B5 J 上GOOGLE,输入OPC VB SAMPLE CODE ,GO!。很多。
* \- u2 e# g- q6 u0 I' ` 我选择了一个网站:/ g& P& }0 }/ c4 n. y
www.kepware.com
1 g! _/ X1 g$ k# C+ J' J 下载一个叫KEPSERVEREX-OPC-EXAMPLE的东东,21M。哈哈,带原代码的OPC客户端工具。运行,很不错,那个WXOPC和它比较一下,简直......5 X" k0 y5 M' F9 e/ W
" y# m3 F. T- V8 W; U 枚举OPCServer的法子:; R! c+ |5 i1 f' v
Dim ServerList as Variant8 r/ ]7 E1 i0 S9 u$ Z. s9 q
Dim i as Integer
" N# ?* w& C' q Serverlist=anOPCServer.getOPcServer(node)
$ t2 C2 S1 q9 P% k4 z, B" r List1.clear
- V: C* a& {, B i FOR i=lbound(Serverlist) to ubound(Serverlist)% w7 V* Q; z4 n7 Y% [ l
List1.additem serverlist(i), p H0 z& b1 }* q& X
NEXT I
; J, K/ T: O% c3 I. D- w ! {. l: {7 [# _# X
就这么简单,为什么在论坛上有这么多人在问,而我也没搞懂。5 m: c! M) P2 d
找到了枚举服务器的办法,在单机上成功。" f% M/ `# E' }
其实《入门》也提供了一个DOC文档,是OPC提供的:0 @0 x4 O1 A8 s, J! t2 v
Data Access Automation Interface Standard Version 2.02
2 A' y: H6 w/ ~9 n- m
9 Y! g8 j" a4 M, v0 x# }- m 是一个必须的手册,只是有一些错误。错误总是难免的。
( _, H- ^3 l' ^# F 入门如果有人指点,实际上不难,没有指点,实际不容易。好在有网络。
F! V4 `! A8 L8 ~5 O1 G6 p9 k ( T) j/ l _3 H/ L2 Y
上班时,我借了本《数据结构》,里面有算法,不知为什么,我却没找到未知层树的遍历算法。上班可能脑袋不清楚吧。 V* W6 v( ?4 b
U1 L# q3 b4 u1 Q
第六天* P; r9 ^& A2 T* p+ u2 L1 a
4 I7 m2 d3 H- h4 G) G9 p
上午,想解决树的问题。昨天的KEPWARE的例子,用了TREEVIEW控件和OPCSERVERBROWSER。" d& r! @$ @0 E' d" l& X
# f2 M' G; m& z; w' ` 我用GOOGLE查找“treeview” “树的遍历”,有了答案,好几个地方。仔细一看都是一个。是利用TREEVIEW和递归算法实现计算机文件目录系统的展开。递归,怎么忘记了。' S# I2 P5 E/ L$ y% N; L- j
$ f- |$ m0 t/ r
采用递归算法实现了枚举所有ITEM的过程。用了3个小时。
& o0 H( g$ Z+ P! K: I" ~$ ` * \8 F: \$ g9 C1 V( y
下午休息。/ C8 [9 b' ^$ O: G+ D! M6 @3 Z# I
z0 t/ U# @3 h( P
第七天
) x5 h3 f9 j/ u: [- M . ^4 c. |$ A7 _/ a. L) X3 M. f2 Y
将自己的第一个程序,转成EXE文件,在不同的地方试运行,都正常。0 P: p( j+ ]& t0 ]5 d
0 J( `, ?# W+ X( v 我想起了第一天安装的那些DLL,还要么。试一下
3 | D! p2 T* S' b 将一个改名,运行,出错。再试另一个,出错。一个都不能少。记住。
, g1 r1 W2 |1 K6 z OPCcom_pas.dll 通用接口
! v$ G+ [! p& Y9 [1 W OPCAutoda.dll 自动化接口
9 O! T" z: r, O* e OPCProxy.dll PROXY-STUB
" l" e- l3 ]) _. f
8 k# b( k/ b2 Y7 s( V. f2 U5 Z 想起组态软件支持OPC,就用组态王试了一下,发现用OPC和用其他方式没有什么两样。一般设备是先找硬件端口,找设备,找I/O点。而OPC是先找OPC服务器,在找出标签(也是点)。真正的组态没有什么两样。/ ^6 N5 ]+ ]& ]! E
( q! P. U5 b2 ^2 e/ O
下午,想做个总结。更想休息,七天了,每天6小时以上。好累。3 x8 o, A% n" v5 }
; g2 A3 Q' @# B+ C( D 后记" k! I0 [& D7 n. Z _
这是一次入门的学习,本身没有什么。我却有些感想。" t+ h: O% _$ z. M) r
. g2 H6 O: ~( n6 v! k
OPC还是很难的,最起码,要自己编客户端已经不易,何况还有5 N% ~1 f( s/ u7 ?; I y
OPC ALARM & EVENT 报警和事件+ U" t" h% l8 l8 h; x N1 O% a
OPC DX 服务器间数据交换; |$ b. _; ^* D
OPC SECURITY 安全8 s/ p3 Q; I/ T' Z: V9 ^0 F) k1 n
OPC HISTIRDATA 历史数据库
& D$ c1 f1 \- Y& a2 n OPC XML XML
. s y- J1 `8 O+ | OPC .NET FOR .net/ D% U9 n4 t5 |$ \8 C+ r
这些对于一种工控软件是比不可少的。
( u4 `) z7 g5 u# Y! z# o
) |( m2 w2 z1 u: u 工控行业的发展日新月异,我们这个专业要不断学习。真羡慕医生,白头发代表经验,代表水平。我们呢,白头发代表落后。苦。
$ ~ _1 I$ O2 r 中国工控落后,我们用的95%以上都是外国货,说明书都是外文。还要学好外文。苦。
$ |, T1 Y0 _9 f+ f $ C _3 d; i1 H9 r8 j- U' X# v- s
这次有多问题的解决都是在国外网站上找到办法的。有种感觉,在网上什么都可以找到,只要你知道你到底要什么。甜。# o6 T$ [2 R1 v6 u" P9 g: t! n
) M) |3 g7 c/ I
总算对OPC有了些感觉,累,也甜。 |
|