请教:有关OPC客户端读写问题 点击:6953 | 回复:16



思索

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 21回
  • 年度积分:0
  • 历史总积分:114
  • 注册:2001年7月30日
发表于:2004-09-24 20:16:00
楼主
可否请版主或哪位大侠解释一下OPCGroup的ASyncWrite、ASyncRead、SyncWrite、SyncRead四个函数的用法? 尤其是ASyncWrite中 TransactionID及CancelID两个参数的含义及设置方法。 我编写客户端程序是通过一个简单的例程上路的,很多地方都不太明白。 (1)我在创建服务器对象,并添加完Group及Item后,只需要定期查看各Item项的Value值就可以读取服务器内的数据了,这样读取数据与调用ASyncRead或SyncRead函数来读取数据有什么优缺点吗? (2)我在调用ASyncWrite时,参数设置如下:mygroup.AsyncWrite(MyItemNum, ServerHandle, Itemvalue, ItemError, 1, 12), 最后两个参数因不知何用,只简单设置为1和12,程序执行时并不报错,但数据却无法写入到服务器内的变量里。 (3)mygroup.OPCItems(ItemSpecifier)也有Write和Read函数,似乎是只读写有关Item,用法较简单,Write只需要Value参数,但我如下调用后:MyOPCGroupIn.OPCItems(1).Write (3) 却有如下错误显示:Automation error. 不知何故。 以上问题已经困扰多时,还请指教。



思索

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 21回
  • 年度积分:0
  • 历史总积分:114
  • 注册:2001年7月30日
发表于:2004-09-26 09:08:00
1楼
怎么没人回答呢? 经过一天的摸索,好象是我用的仿真软件的变量只能读不能写,但不是很确定,各位谁用过ABB CBF 系统的EMULATOR,不知可指点一、二。 又,现在对上面几个函数的参数还不是很清楚,还请各位大侠不吝指教!

思索

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 21回
  • 年度积分:0
  • 历史总积分:114
  • 注册:2001年7月30日
发表于:2004-09-26 18:54:00
2楼
哎,还是自问自答。 写不进数的原因基本可以肯定是所用EMULATOR的缺陷所致。 刚找到的资料:TransactionID——The client specified transaction ID. This is included in the‘completion’ information provided in the Corresponding Event. CancelID——A Server generated transaction ID. This is provided to enable the client to cancel the “transaction”. 就我的理解,一个是用来标志启动写操作的Client的ID,一个是用来标志取消写操作的SERVER的ID。 这两个参数是必须有的,但不论我怎么设置这两个的值,AsynWrite操作都能正确执行,感觉不出有什么不同,还请哪位高手指点一下。 第三个问题也是因为仿真软件仿真的变量只能读的缘故,才造成的AUTOMATION ERROR。用其他的仿真软件,都读写正常,看起来这两个函数的确是只针对ITEM的读写操作。 第一个问题还没怎么摸索清楚,反正值都能读出,只是操作麻烦程度不太一样,估计跟订阅方式有关,如果哪位清楚还请指点!

思索

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 21回
  • 年度积分:0
  • 历史总积分:114
  • 注册:2001年7月30日
发表于:2004-09-28 09:37:00
3楼
还是自问自答: TransactionID:在客户端程序内指定,用来标志此次调用操作 CancelID:只需在客户端程序声明,赋值则在调用时由服务器端自动完成,据说可用来取消操作,但不知道该怎么用。 顺便说一句:OPCGroup的syncread , syncwrite及OPCItem的write,read均需等到调用结束才返回主程序,容易造成程序堵塞。 asnyread及asncwrite则不必。 再问一个: 是不是各家公司的OPC AUTOMATION都添加了自己的东西呢?在调试中,感觉各家都有点不太一样。 如果是这样的话,那怎么还能称之为标准呢? 不太明白,还请大侠指教。 如果引用的是opc automation 2.0,是不是理论上各家的都应该能连通呢? 但用这个引用后,调用OPCItems.Setactive设置kepware的仿真SERVER就没动静(并不报错),如果引用他们公司自己的AUTOMATION就可以。 奇怪,是不是也是因为是仿真软件的缘故的啊?

高海

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 40回
  • 年度积分:0
  • 历史总积分:92
  • 注册:2004年9月01日
发表于:2004-09-29 08:38:00
4楼
顶一下!这种学习精神值得表扬! 大家来点掌声!!!!!!!

woodysummer

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 13回
  • 年度积分:0
  • 历史总积分:16
  • 注册:2003年7月04日
发表于:2004-10-07 21:47:00
5楼
你是用的VB写的吗? OPC基金会提供的Data access automation Interface Standard V2.01里面有这几个函数的使用方法和例子。 我在应用的时候 有一个OPCItemServerHandle出了问题,我不知道服务器句柄是什么意思,你试过否? 我也正在用VB做Client的开发,有问题可以讨论一下 我的邮件xiatianhust@sohu.com

思索

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 21回
  • 年度积分:0
  • 历史总积分:114
  • 注册:2001年7月30日
发表于:2004-10-08 11:22:00
6楼
呵呵,终于有人回答了,谢谢二位。 是有说明。 但好多还是不明白,帖子里提到的英文解释就是STANDARD里的,也不知道是它写的过于简单,还是我的理解能力有问题,但还是不懂。只能是做了实验后才能有些了解。确实以后需要常探讨! 你说的OPCItemServerHandle是指的在给ITEMS添加项时用到的参数数组吧? 如果是的话,按我的理解,好象就是指的是这个项在SERVER里的句柄。 它好象是由在调用时,由SERVER自动赋值的。

woodysummer

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 13回
  • 年度积分:0
  • 历史总积分:16
  • 注册:2003年7月04日
发表于:2004-10-08 21:16:00
7楼
问一下,你是如何实现遍历opc server中的Item的,我总是不能成功。我现在准备用一个list把server中所有的标签显示出来,想循环调用GetOPCItem,但是实现不了,你用过吗?

思索

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 21回
  • 年度积分:0
  • 历史总积分:114
  • 注册:2001年7月30日
发表于:2004-10-10 10:41:00
8楼
呵呵,抱歉,我恐怕不能对你有什么实际的帮助。 我刚刚上路,截止目前,我的CLIENT只是用来显示我所想要显示的数据,并不需要遍历。 我正在看说明,好象SERVER有CREATBROWSER,BROWSER又有SHOWBRACH,SHOWLEAF,及GETITEMID,感觉是可以通过这几个得到所有ITEM的ID的。 不过,BROWSER是可选的,不知道你用的SERVER支不支持? 如果你解决了这个问题,是否能也贴到这儿来呢? 那将十分感谢

JNfirst

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 45回
  • 年度积分:0
  • 历史总积分:179
  • 注册:2002年9月04日
发表于:2004-10-10 15:56:00
9楼
我用DELPHI做的,可以交流一下,正在试服务器端

cubebox

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 17回
  • 年度积分:0
  • 历史总积分:23
  • 注册:2002年11月06日
发表于:2004-11-16 15:31:00
10楼
//写点的部分代码 OPCAsyncIO2 opcAsyncIO2; if( opcAsyncIO2.Attach( opcGroup ) == S_OK ) { transactionID = 2; // any number the client wants COleVariant vt( dlg.m_value ); // initialize as a string vt.ChangeType( pCurrentItem->value.vt ); // let COleVariant convert! HRESULT hr = opcAsyncIO2.Write(1, &pCurrentItem->hServerHandle, vt, transactionID, &transactionID, &pErrors); if( SUCCEEDED(hr) ) { if( FAILED(pErrors[0]) ) { ReportError( _T("ASync Write: "), pErrors[0] ); } CoTaskMemFree( pErrors ); } else { ReportError( _T("ASync Write: "), hr ); } }

黄土地

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 1回
  • 年度积分:0
  • 历史总积分:7
  • 注册:2004年7月25日
发表于:2004-11-21 20:00:00
11楼
Private Sub additem_Click() Dim Browser As OPCBrowser Dim SomeName As Variant Dim i As Integer Dim flat As Boolean flat = True ARealOPCServer = servername Call connect(ARealOPCServer, ARealOPCNodeName) Set Browser = AnOPCServer.CreateBrowser Set AnOPCServerBrowser = Browser AnOPCServerBrowser.ShowLeafs (flat) '显示叶 'AnOPCServerBrowser.ShowBranches'显示枝 For i = 1 To AnOPCServerBrowser.Count SomeName = AnOPCServerBrowser.Item(i) List4.additem SomeName Next i End Sub 可以实现遍历opc server中的Item

旭日2005

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 11回
  • 年度积分:0
  • 历史总积分:30
  • 注册:2005年5月09日
发表于:2005-05-23 12:12:00
12楼
Good!

netst

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 1回
  • 年度积分:0
  • 历史总积分:1
  • 注册:2006年8月26日
发表于:2007-02-07 17:52:00
13楼
黄土地,我用ABB的AC800实现不了你的代码的showleafs功能,而枝显示正常。

学海无边

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 4回
  • 年度积分:0
  • 历史总积分:57
  • 注册:2002年12月19日
发表于:2008-08-27 14:43:45
14楼

你好 ,花了 好长的 时间来 找这方面的资料,今天看到了 这个 贴,很是 高兴,想和你 联系,请求一些帮助啊 。希望得到你的 联系方式!

sl013

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 3回
  • 年度积分:0
  • 历史总积分:0
  • 注册:2007年4月10日
发表于:2008-08-29 10:04:26
15楼
有的值属性就是只读的
你想写肯定不行了

二十四桥明月夜

  • 精华:3帖
  • 求助:0帖
  • 帖子:114帖 | 3593回
  • 年度积分:0
  • 历史总积分:7688
  • 注册:2008年3月16日
发表于:2008-08-29 10:41:53
16楼
哪一年的旧贴子又被提了出来

热门招聘
相关主题

官方公众号

智造工程师