急,求助OPC客户端读取DAserver的问题 点击:2589 | 回复:10



panjf840515

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 12回
  • 年度积分:0
  • 历史总积分:69
  • 注册:2006年5月16日
发表于:2010-06-13 16:42:59
楼主
各位高人,我用VB写的OPC客户端读取DAserver中的标签,DAserver中各个标签对应各个仪表的读数,共有50个标签。当仪表都上电且正常工作时,我的客户端也读数正常,当个别仪表断电以后我的客户端程序就什么也读不出来了,请问各位大侠可遇到过这中问题?补充:我采用异步读方式。谢谢了!



tomyi

  • 精华:0帖
  • 求助:1帖
  • 帖子:21帖 | 233回
  • 年度积分:0
  • 历史总积分:598
  • 注册:2002年10月30日
发表于:2010-06-13 20:00:59
1楼

应该是DAServer有问题?

panjf840515

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 12回
  • 年度积分:0
  • 历史总积分:69
  • 注册:2006年5月16日
发表于:2010-06-13 21:42:17
2楼
具体我也不清楚,DAserver是别的单位已经配置好的,我们只是负责读取数据

tomyi

  • 精华:0帖
  • 求助:1帖
  • 帖子:21帖 | 233回
  • 年度积分:0
  • 历史总积分:598
  • 注册:2002年10月30日
发表于:2010-06-15 17:22:14
3楼

简单查看一下,当个别仪表断电以后DAserver是否刷新正常,就是数据是否变化,如果不变化,则肯定是DAServer有问题?

 

如果数据变化,则使用一个标准的OPC Client 读取数据看看,是否能够读取到,如果读取不到,则DAServer有问题?

 

如果正常,则需要查看你的OPC Client程序了,建议安装一个OPC Server 测试一下你的程序看看,是否有问题?

不知道你的DAServer仪表采用的通讯协议是啥,如果别的IOPC Server能够替代,用别的OPC Server替代试试

panjf840515

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 12回
  • 年度积分:0
  • 历史总积分:69
  • 注册:2006年5月16日
发表于:2010-06-15 17:51:28
4楼
谢谢tomyi的解答,OPC SERVER是业主已经配好的,我只负责编写客户端。仪表采用MODBUS通讯协议。今天我注意了一下,业主给了50个标签名,我用OPCITEMS.ADDITEMS 50, 添加后,OPCITEMS.COUNT只有45个,也就是还有5个没有添加成功。我想问一下这种情况下采用异步读的方式group.asyncread 50..(后面的参数省略)是不是肯定读不出来?因为只添加成功了45个,而serverhandles()却有50个数。另外,为什么只有45个添加成功了呢?是不是业主提供的另外5个的标签地址有错误,或者是DAserver里面配的跟业主提供的标签地址不一样呀?谢谢了

tomyi

  • 精华:0帖
  • 求助:1帖
  • 帖子:21帖 | 233回
  • 年度积分:0
  • 历史总积分:598
  • 注册:2002年10月30日
发表于:2010-06-15 21:08:54
5楼

1、如果没有添加成功,如你所说一般是出在标签地址不一样。

2、如果没有添加成功,是读取不到的。OPC是通过句柄进行传递通讯的。

建议你用第三方的OPC Client读取看看。

如果有兴趣到下面的贴下载里面的软件看看,内含OPC Client和OPC Server

欢迎ModbusOPCServer2.0测试

panjf840515

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 12回
  • 年度积分:0
  • 历史总积分:69
  • 注册:2006年5月16日
发表于:2010-06-15 21:49:42
6楼
再次谢谢tomyi。再确认一下,如果50个标签里面有一个地址不对时,采用异步读时50个标签值应该没有一个能读出来吧?我采用的处理方法是如果发现有哪个标签添加错误时从标签数组中剔除该标签,并且重构其clienthandels,serverhandles和itemservererrors,这种方法应该可行吧,我用matrikon opc simulation 模拟了一下可以,但不知道去现场好不好用。希望过完节后现场调试一切顺利。谢谢各位的帮忙了,祝大家端午节快乐!

tomyi

  • 精华:0帖
  • 求助:1帖
  • 帖子:21帖 | 233回
  • 年度积分:0
  • 历史总积分:598
  • 注册:2002年10月30日
发表于:2010-06-16 09:41:53
7楼

我不知道你的VB客户端采用那种方式来编写OPC Client的:

1、采用OPCDAAuto.dll

2、采用第三方的dll

3、自己直接实现Data Access Custom Interface

Data Access Custom Interface Standard 文档中

4.5.6.1 IOPCAsyncIO2::Read
HRESULT Read(
[in] DWORD dwCount,
[in, size_is(dwCount)] OPCHANDLE * phServer,
[in] DWORD dwTransactionID,
[out] DWORD *pdwCancelID,
[out, size_is(,dwCount)] HRESULT ** ppErrors
);

ppErrors 数组会反映哪项错误。

你目前出现两个问题:

1、数据项只能成功增加45个,另外5个错误是谁呢?

2、当有仪表出现通讯错误时,数据不刷新

首先先锁定一下错误在什么地方:

问题1:其实你可以把50数据项拆分为10个一组,看看是否能够都正常,或采用第三方OPC Client工具看看,是否是一样的现象。

问题2:同样,采用第三方OPC Client工具看看,是否是一样的现象。 如果当仪表出现通讯错误时,第三方OPC Client工具数据刷新有问题,则说明是DA Server的问题,直接告诉业主就是了,让业主自己解决,或你提供一个解决方案,对于采用异步调用,这种可能性要多一些。

panjf840515

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 12回
  • 年度积分:0
  • 历史总积分:69
  • 注册:2006年5月16日
发表于:2010-06-16 10:20:38
8楼

我调用采用OPCDAAuto.dll来实现的,我定义了Error_Num变量,如果ppErrors数组有错误时,Error_NUM+1.最后Error_Num的值就是添加错误的标签的个数。最后我用group.asyncread ID_NUM-Error_num这样就可以读已经添加成功的标签的值了。否则,如果采用group.asyncread ID_Num程序就会报错自己退出了。

tomyi

  • 精华:0帖
  • 求助:1帖
  • 帖子:21帖 | 233回
  • 年度积分:0
  • 历史总积分:598
  • 注册:2002年10月30日
发表于:2010-06-16 13:20:25
9楼

据说老版本的OPCDAAuto.dll有些错误,建议你核实一下,同时采用我建议的方法试试,现把问题锁定,看看出错在那里。

panjf840515

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 12回
  • 年度积分:0
  • 历史总积分:69
  • 注册:2006年5月16日
发表于:2010-06-16 13:30:34
10楼
好的,谢谢tomyi的建议,等我到现场了按您说的方法查一下原因。

热门招聘
相关主题

官方公众号

智造工程师