OPC七日谈 点击:25715 | 回复:102



qzhang2

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 28回
  • 年度积分:0
  • 历史总积分:73
  • 注册:2003年3月31日
发表于:2004-02-25 10:45:00
楼主
我从北京买了一本《OPC应用程序入门》,在此之前基本上只是知道有OPC,在五月四日开始,我学了七天。其中有苦有甜。我写下来,权做休息或是练练打字。 第一天 安装了《入门》提供的东西,包括是下面几个文件。还有个批处理文件,是一个注册过程。 opccomn_ps.dll opcproxy.dll opcdaauto.dll OPCTrend.ocx OPCBar.ocx OpcServer.exe OPCJDADemoServer.exe 看了一阵书,知道了前三个是:通用接口,PROXY-STUB,自动化接口。不明白。 后面两个是demo 服务器。 上网,用GOOGLE,查OPC,很自然就找到了www.opcconnect.com.,又下了个free 服务器。安装了(注册)。 到了工控网,看到有人在推荐clienttools,就下了一个,叫WXOPC。运行一下, 点击连接服务器图标,立即出现了三个: OPCJ.SAMPLESERVER.1 OPCJ.DADEMOSERVER.1 HEXATEC.PCDATA 第三个是opcconnect上download的计算机基本情况的简单程序。 点击他们,还出现了一些“item”,“value"的内容还在变,有意思。我就想这 工具还真不错,不知我能不能做到,但一想,如果这些功能都做不到,这OPC就没多少 人敢学,也就没有市场。 有一段时间没用VB了,先热了热身,看了自己过去编过的code。 第二日 今天先看书。 《OPC应用程序入门》,40元,我花了48元,从汇款到收到用了12天,拿到手上,感觉很单薄。我的看书观点是:在看的过程中迷信书,看完后怀疑书,然后忘记书。尽管这本书上我立即就发现有错误。我还是仔细地看下去。 这是一本教人们用VB编应用客户端程序的书,希望让一般工控技术员认识OPC其实不复杂,最起码编用户程序(客户端)不难。 在这之前,我对COM和DCOM技术有所了解,也是很模糊的,OPC以COM和DCOM技术为基础,主要是在服务器端(server),而在用户端并不要很在意它们。 书上对OPC体系有描述,我画了个图。
OPCserver是COM组件,如果安装(注册了)一个OPCserver后,利用WINDOWS的组件工具可以看到,如果这个server安装在别的计算机上,不是本地机,那它就是个DCOM组件(分布式)。 OPC基金会公布了通用接口(用户接口),用C++访问OPCserver只要通过这个接口就可以,并没有必要了解OPCserver是怎么工作的。 对于VB、VBA、EXCEL、DELPHI等编程软件或工具,不能直接访问通用接口,而要通过所谓的自动化接口(automation interface),OPC组织发布了 DATA ACESS 2.0,实际上已经有了3.0版。 而在通用接口和自动化接口之间还有一个东西,是成对使用的,有点象MODEM,在两个接口之间起数据传输作用,有个名字叫PROXY_STUB(代理—占位,翻译还不如不翻译,反正不懂)。 我在第一天中安装的几个DLL中: OPCcomn_ps.dll 通用接口 OPCdaAuto.dll 自动化接口 OPCProxy.dll PROXY-STUB 我们的任务是用VB编写客户端程序,只要知道怎样用自动化接口就行了。其他的不去钻了,要不一年也搞不明白。 我运行VB6.0,新建一个新工程,点击菜单中的“工程”.“引用”,选择”OPC AUTOMATION 2.0”,就可以利用自动化接口。 《入门》没有建议将这些DLL安装在什么目录,我觉得放在WINDOWS的SYSTEM下是比较好的。 按照书上的顺序,先了解OPC的数据组织。我也画了图。
我们要的就是item,翻译成标签,这就是点,我们所谓的点,比如PLC的I/O点,仪表的数值等。编客户端的开始就是找出数据。 根据书的介绍,要访问标签,还有其他工作要做。 我累了。明天再说。 第三天 昨天说到访问标签先要做些事。 首先要找出你要访问的OPC服务器的名字,连接它,建立一个组( GROUP)的集合,在下面建立一个具体的GROUP,在这个组中添加一个或多个标签。才可以访问。 我用第一天下载的WXOPC工具,看到了三个服务器,我选择了其中一个 hexatec.pcdata.1,是一个计算机基本情况的DEMO服务器,我发现服务器的名字都是这种格式。 按《入门》的样子,做了个客户端的架子,一个小时后完成了服务器的连接,新建组集合,建立一个具体的组。下面有些不清楚。干脆拿《入门》的演示程序打开来研究。 直接运行,没问题,看到了数据的变化,决定看其原代码。 它用的是OPCJ.SAMPLESERVER.1这个服务器,没有实际意义,每个数据都可以读写。 我发现标签名可以任意编,好奇怪。但是我用WXOPC看到的标签,数据却不一样。 我在FORM上加了个text 控件,叫text1,我让服务器名等于text1.text,这样我可以自由换服务器,还不错,几个服务器都可以连接上。但是只有它自己的服务器才可以读出数据。是不是骗人。 试一下按服务器自己的ItemID去访问,我用WXOPC找出hexatec.pcdata.1的标签名,比如“version”,发现还是出错。 我又到工控论坛上,问已知标签怎样才可以读出数据。没有人回答。 我给自己留下了两个问题: 1÷怎样获得本机上得所有OPCserver,获得正确的名字。我看到WXOPC可以。论坛上也很多人在问。 2÷如何访问ITEM,取得其数据等。 又看了一会书,看了有关OPCSERVERBROWSER的内容,好像是有用。 今天到此为止, 休息 第四天 熟悉OPCSERVERBROWSER的用法。主要有showbranchs,showleafs,movedown,movetoroot 等等。OPC服务器,实际上是一棵树,有brahchs和leafs组成。我编了一个简单的SUB,实现了两层的树的ITEM的枚举,实现不了第三层。这实际上是树的遍历算法问题。我不知怎么做。我准备去问别人。 从形式上所谓的GROUP/ITEM 和branch/leaf是一样的,实际上并不是。GROUP是用户自己添加的,并不一定要和OPC服务器Branchs一样,每个LEAF是一个Item,它们可以有用户任意放在哪个组中,不必考虑在服务器中是在哪个branch下,也不必考虑在第几层。 既然我知道了每个ITEM的ID,我想我可以得到各自的SEEVERHANDLE(句柄),从而访问到实际的数据。 我添加一个组,在其下面建立标签集合,然后用: 标签组的ADDITEM方法获得句柄。 用同步读方法就可以得到每个标签的数据。 我发现有问题。昨天我就发现有问题。 今天论坛上没有人给我回答,去国外网站看看,www.opcfoundation.org上有个FORUM,内容很多,有真正的专家,其中一个是OPC基金会的技术代表。FAQ上还保留了从1998-2001年的问题及回答。 你相信吗,我真的找到了。有一个叫fullqulifity ItemID的说法,比如下面的情况 bch1(树枝) tag11(叶子) tag12 (叶子) bch2 tag21 (叶子) bch22 (树枝) tag221 (叶子) tag222 (叶子) 通常的ITEMID是tag11,tag12,tag21,tag221,tag222这样的 而Fullqulifity ItemID是bch1.tag11,bcg1.tag12,bch2.bch22.tag221,bch2.bch22.tag222 应该用OPCSERVERBROWSER的GetItemId()获得。 修改程序,OK。 还有什么问题,本机服务器的枚举。 明天再说吧。ZZZzzz 第五天 国外网站上真是有很多有用的东西,不象我们的论坛,原创的少,转载的多,内容也太少了。今天我直奔主题。 上GOOGLE,输入OPC VB SAMPLE CODE ,GO!。很多。 我选择了一个网站: www.kepware.com 下载一个叫KEPSERVEREX-OPC-EXAMPLE的东东,21M。哈哈,带原代码的OPC客户端工具。运行,很不错,那个WXOPC和它比较一下,简直...... 枚举OPCServer的法子: Dim ServerList as Variant Dim i as Integer Serverlist=anOPCServer.getOPcServer(node) List1.clear FOR i=lbound(Serverlist) to ubound(Serverlist) List1.additem serverlist(i) NEXT I 就这么简单,为什么在论坛上有这么多人在问,而我也没搞懂。 找到了枚举服务器的办法,在单机上成功。 其实《入门》也提供了一个DOC文档,



文子他爹

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 4回
  • 年度积分:0
  • 历史总积分:0
  • 注册:2004年7月29日
发表于:2005-05-13 11:42:00
81楼
谢谢楼主无私的奉献 利用楼主的所学的 我快速地入了门, 用DELPHI做了下实验 果然不错 实现了服务端所有ITEM的枚举 嗯很有用 准备作一个远程监控相关的项目 并且用P2P实现 还没有实施 这里把我用DELPHI做的实验代码附上 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, OleServer, OPCSiemensDAAutomation_TLB, ExtCtrls, ComCtrls; type TForm1 = class(TForm) OPCServer1: TOPCServer; Panel1: TPanel; Button1: TButton; StatusBar1: TStatusBar; Timer1: TTimer; Panel2: TPanel; Splitter1: TSplitter; Button2: TButton; Edit1: TEdit; Button3: TButton; ListBox2: TListBox; CheckBox1: TCheckBox; tvOPCServers: TTreeView; procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button3Click(Sender: TObject); procedure ListBox1Click(Sender: TObject); procedure CheckBox1Click(Sender: TObject); procedure tvOPCServersDblClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var ig: IOPCGroup; vs: OleVariant; i: integer; tnTmp: TTreeNode; begin vs := OPCServer1.GetOPCServers; for i := VarArrayLowBound(vs, 1) to VarArrayHighBound(vs, 1) do begin tnTmp := TTreeNode.Create(tvOPCServers.Items); tnTmp.Text := vs[i]; tvOPCServers.Items.Add(tnTmp, vs[i]); // listbox1.Items.Add(vs[i]); end; end; procedure TForm1.Timer1Timer(Sender: TObject); begin StatusBar1.Panels[0].Text := DateTimeToStr(now); end; procedure TForm1.FormCreate(Sender: TObject); begin Timer1Timer(nil); end; procedure TForm1.Button3Click(Sender: TObject); var og: IOPCGroup; begin OPCServer1.OPCGroups.Add(edit1.Text); end; procedure TForm1.ListBox1Click(Sender: TObject); var ig: IOPCGroup; vs: OleVariant; i: integer; begin if (tvOPCServers.SelectionCount <= 0) or (not Checkbox1.Checked) then exit; end; procedure TForm1.CheckBox1Click(Sender: TObject); begin if CheckBox1.Checked and (tvOPCServers.SelectionCount > 0)then begin OPCServer1.Connect1(tvOPCServers.Selected.Text); Caption := Format('Connect to OPC Server %s...', [tvOPCServers.Selected.Text]); end else begin OPCServer1.Disconnect; Caption := Format('Disconnect OPC Server %s...', [tvOPCServers.Selected.Text]); end; end; procedure TForm1.tvOPCServersDblClick(Sender: TObject); var br: OPCBROWSER; lf: OleVariant; i: integer; strTmp: string; curNode, tnParent: TTreeNode; function ExplandOPCServer(ABr: OPCBROWSER): boolean; var j: integer; tnP1: TTreeNode; begin try ABr.ShowBranches; if ABr.Count > 0 then for j := 1 to ABr.Count do begin tnP1 := curNode; curNode := tvOPCServers.Items.AddChild(curNode, ABr.Item(j)); ABr.MoveDown(ABr.Item(j)); ExplandOPCServer(Abr); curNode := tnP1; end else begin // 如果没有 Branch 了,先看有没有 Leaf // 如果有也加到 treeview 中。 ABr.ShowLeafs(lf); for j := 1 to ABr.Count do begin tvOPCServers.Items.AddChild(curNode, ABr.Item(j)); end; // 就应该返回上一级 // ABr.ShowBranches; ABr.MoveUp; ABr.ShowBranches; end; finally // end; end; begin // 展开相应的OPCSERVER。 tvOPCServers.Selected.DeleteChildren; OPCServer1.Connect1(tvOPCServers.Selected.Text); br := OPCServer1.CreateBrowser; curNode := tvOPCServers.Selected; tnParent := curNode; ExplandOPCServer(br); end; end.

wmmm2001

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 3回
  • 年度积分:0
  • 历史总积分:3
  • 注册:2005年6月09日
发表于:2005-06-13 10:11:00
82楼
楼上的能否把.dfm文件及控件给一份,让我学习学习。 Email:wmmm2001@163.com

牧虫人

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 17回
  • 年度积分:0
  • 历史总积分:105
  • 注册:2002年12月25日
发表于:2005-06-16 23:33:00
83楼
8错

我是啊铎

  • 精华:0帖
  • 求助:0帖
  • 帖子:7帖 | 33回
  • 年度积分:0
  • 历史总积分:55
  • 注册:2005年5月02日
发表于:2005-09-28 12:04:00
84楼
流浪的蝴蝶 我不同意你的理解,你用的是控件,在里面他是已经有引用了的,我现在用VB开发控件,然后放到DELPHI里面,用控件的时候当然不用引用了,因为开发时包含了,会带过去的。ALERM和EVENT我具体也不清楚,只是了解字面意思,你知道好还麻烦你也告诉我一声。

大漠孤烟_

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 24回
  • 年度积分:0
  • 历史总积分:35
  • 注册:2002年3月20日
发表于:2005-09-29 14:37:00
85楼
感谢楼主的分享!!!! 我在opcfoundation.com没找到可以下载的那几个.dll文件啊! 楼主能不能把它们发给我? 再次感谢!!! 我的邮箱是: jiang.david@163.com

合肥水泥研究设计院电气二部设计人员

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 5回
  • 年度积分:0
  • 历史总积分:6
  • 注册:2005年9月28日
发表于:2005-09-29 16:14:00
86楼
本人是搞工程的,也干了几个opc通讯上下位的工程,一般来说ABB,西门子,施耐得的产品等公司下位都有opc server,而上位本人一般使用ifix3.5,也有opc 的驱动,只需要设置一下ifix中标签的路径和下位ABB opc server 对应现场控制站的ip,并在ifix opc server中建立一个server,然后在ifix数据库中把标签变量,全部导入一遍,opc 中的group,item全部自动生成,当然每个group的item有数量限制,我一般定义变量时就分组分好了。各位高手真是认真专研的人,文章给我启发很多,我没有时间做下来专这么多东西,希望以后各位多发些这样的文章,让大家都提高提高。

mofason

  • 精华:0帖
  • 求助:0帖
  • 帖子:7帖 | 87回
  • 年度积分:0
  • 历史总积分:137
  • 注册:2002年10月02日
发表于:2005-10-02 13:44:00
87楼
好文章

健力宝

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 7回
  • 年度积分:0
  • 历史总积分:7
  • 注册:2004年12月12日
发表于:2006-03-01 10:15:00
88楼
请问楼主:OPC体系图哪里来?怎么可能用Java Applet实现客户端?Java 怎么实现opc需要的com?退一步说,怎么在ie上实现opc client?

hill

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 20回
  • 年度积分:0
  • 历史总积分:10
  • 注册:2007年6月11日
发表于:2006-04-02 19:21:00
89楼
请问KEPSERVEREX-OPC-EXAMPLE怎么下载?

njl2006

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 3回
  • 年度积分:0
  • 历史总积分:2
  • 注册:2008年6月13日
发表于:2010-01-11 09:58:47
90楼

写的不错,支持一下!

zx20009up

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 4回
  • 年度积分:0
  • 历史总积分:6
  • 注册:2010年4月15日
发表于:2010-04-15 14:31:07
91楼
很佩服楼主的学习精神

rk542190440

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 9回
  • 年度积分:0
  • 历史总积分:22
  • 注册:2009年12月09日
发表于:2011-11-15 09:20:04
92楼
哪位大哥有OPCcom_pas.dll、OPCProxy.dll、OPCAutoda.dll这几个文件啊!给小弟发一份吧!352345703@163.com,小弟在此谢过咯!

andlu

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 107回
  • 年度积分:0
  • 历史总积分:333
  • 注册:2004年9月03日
发表于:2011-12-27 10:08:16
93楼


工程项目监控软件源码集合

1.vb6开发的锅炉监控软件完整源码,有登陆界面、操作界面、历史数据记录和查询界面、报警数据记录

和查询界面及相关报表功能,历史曲线查询。(下位机是西门子S7-200,以太网通讯)

2.delphi7开发的回转窑监控软件完整源码,有登陆界面、操作界面、历史数据记录和查询界面、报警数

据记录和查询界面及相关报表功能。(下位机是OMRON CJ1G,以太网通讯)

3.VC++6.0开发的石灰窑监控软件完整源码,有登陆界面、操作界面、历史数据记录和查询界面、报警数
据记录和查询界面及相关报表功能,历史曲线查询。(数据源是OPC Server,报表纯手工编写,具有很大
的灵活性)。

目前都已经稳定运行在自控项目上了。这些源码稍作修改就可以应用在其他项目上。

有需要的请联系QQ:790013363

EMAIL:lgr980423@126.com  可以先运行打包安装文件,查看效果。有偿服务,非诚勿扰!

曹虎明

  • 精华:0帖
  • 求助:0帖
  • 帖子:26帖 | 923回
  • 年度积分:0
  • 历史总积分:4903
  • 注册:2004年7月07日
发表于:2011-12-27 21:27:25
94楼

走前辈走过的路 吃前辈啃过的馒头

andlu

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 107回
  • 年度积分:0
  • 历史总积分:333
  • 注册:2004年9月03日
发表于:2012-01-06 14:11:36
95楼
工程项目监控软件源码三合一

1.vb6开发的锅炉监控软件完整源码,有登陆界面、操作界面、历史数据记录和查询界面、报警数据记录

和查询界面及相关报表功能,历史曲线查询。(下位机是西门子S7-200,以太网通讯)

2.delphi7开发的回转窑监控软件完整源码,有登陆界面、操作界面、历史数据记录和查询界面、报警数

据记录和查询界面及相关报表功能。(下位机是OMRON CJ1G,以太网通讯)

3.VC++6.0开发的石灰窑监控软件完整源码,有登陆界面、操作界面、历史数据记录和查询界面、报警数
据记录和查询界面及相关报表功能,历史曲线查询。(数据源是OPC Server,报表纯手工编写,具有很大
的灵活性)。

目前都已经稳定运行在自控项目上了。这些源码稍作修改就可以应用在其他项目上。

有需要的请联系QQ:790013363

EMAIL:lgr980423@126.com  可以先运行打包安装文件,查看效果。有偿服务,非诚勿扰!

云竹

  • 精华:0帖
  • 求助:1帖
  • 帖子:17帖 | 326回
  • 年度积分:0
  • 历史总积分:500
  • 注册:2008年1月30日
发表于:2012-11-16 13:33:38
96楼

学习  谢谢 楼主 

muyi1971

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 2回
  • 年度积分:0
  • 历史总积分:2
  • 注册:2013年7月19日
发表于:2013-11-17 11:13:41
97楼

请问楼主,PLC这边的程序该怎么做?

iewgnos

  • 精华:0帖
  • 求助:2帖
  • 帖子:2帖 | 8回
  • 年度积分:0
  • 历史总积分:16
  • 注册:2014年7月27日
发表于:2015-05-20 10:36:42
98楼

有人说说UA的开发吗?谢谢!

13239795939

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 46回
  • 年度积分:9984
  • 历史总积分:10210
  • 注册:2016年5月31日
发表于:2017-11-17 12:13:43
99楼

大家可到 ftp://opc.vicp.net 下载OPC基金会官方文档及OPC的VB例程(写的不是很好) 用户名 opc  密码 opc 过几天有空我会放上我写的一个通用版OPC Client程序 该程序可枚举网络上指定计算机的OPC服务器及变量,并选择指定的变量进行实时采集、设定多种EXCEL报表的格式,并最终把采集到的变量按指定EXCEL报表格式输出。 上面的FTP“网站”是我家里的电脑,所以可能不是全天开机,但一般晚上19-23点会开机,白天就看运气了,不过最近我玩vmware 和NAT正起劲,往往在公司也远程控制家里的电脑,所以白天开机的时候也挺多的。 大家白天也可试试能不能上 另外,顺便讲一句我写OPC Client的经验教训:别用write 和read函数去读变量和写变量,这两个函数的容错性极差,一有个风吹草动,程序就死掉了。

公控鸡

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 28回
  • 年度积分:0
  • 历史总积分:102
  • 注册:2018年4月23日
发表于:2018-04-24 09:43:33
100楼
新人表示很懵,完全不知道从哪里入手。

热门招聘
相关主题

官方公众号

智造工程师