首页 上一页 1 2 3 下一页 尾页

请教OPC XML DA Gateway的开发 点击:7027 | 回复:50



寒酸

    
  • 精华:1帖
  • 求助:0帖
  • 帖子:5帖 | 34回
  • 年度积分:0
  • 历史总积分:54
  • 注册:2002年9月15日
发表于:2004-02-22 15:45:00
楼主
本人想设计一个OPCXMLDA网关来实现OPC XML Client对远程OPC-DA Server的访问,开发平台初选C#.NET,可是具体的解决方案还比较模糊,请各位OPC Fans提供一些这方面的建议。谢谢!!!



gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2003-11-15 11:36:00
1楼
你的确想法不错,实现自己的OPCXMLDA网关,可以做个webservice 的中间件来实现XML到OPC DA的路由,平台最好不要定死,XML本身的出发点就是跨平台的 只是浅见.

寒酸

  • 精华:1帖
  • 求助:0帖
  • 帖子:5帖 | 34回
  • 年度积分:0
  • 历史总积分:54
  • 注册:2002年9月15日
发表于:2003-11-15 20:24:00
2楼
谢谢 sunrisea!我的课题是《基于XML的OPC数据集成中间件研究》。资料也看得不少,思路方法也有(主要是参考的 technosoftware公司的产品),可是要自己去实现时,却感到无从下手。 今后还请Sunrisea和其他OPC人多多帮助。

寒酸

  • 精华:1帖
  • 求助:0帖
  • 帖子:5帖 | 34回
  • 年度积分:0
  • 历史总积分:54
  • 注册:2002年9月15日
发表于:2003-11-15 20:25:00
3楼
谢谢 sunrisea!我的课题是《基于XML的OPC数据集成中间件研究》。资料也看得不少,思路方法也有(主要是参考的 technosoftware公司的产品),可是要自己去实现时,却感到无从下手。 今后还请Sunrisea和其他OPC人多多帮助。

zhangchaoyu

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 59回
  • 年度积分:0
  • 历史总积分:88
  • 注册:2003年9月03日
发表于:2003-12-31 14:06:00
4楼
我也有兴趣。我试过technosoftware提供的东西。提供的客户端可以使用,但提供的服务器端不能使用(不知道是否是vs.net)的问题。 现在我自己在编些 WEB SERVICE,实现了GetStatus等基本功能,但还有很多事情要做。以后编完后可以和大家分享。但现在希望能和各位一起进行开发,欢迎各有兴趣的中国同胞。

寒酸

  • 精华:1帖
  • 求助:0帖
  • 帖子:5帖 | 34回
  • 年度积分:0
  • 历史总积分:54
  • 注册:2002年9月15日
发表于:2004-01-02 11:11:00
5楼
to zhangchaoyu : 能否请教一下GetStatus的具体实现过程,我也正在开发,可是有些问题!!!

寒酸

  • 精华:1帖
  • 求助:0帖
  • 帖子:5帖 | 34回
  • 年度积分:0
  • 历史总积分:54
  • 注册:2002年9月15日
发表于:2004-01-02 11:23:00
6楼
我的EMAIL:njiczxm@163.com 谢谢!!!

zhangchaoyu

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 59回
  • 年度积分:0
  • 历史总积分:88
  • 注册:2003年9月03日
发表于:2004-01-02 15:38:00
7楼
这是服务器端代码,但还没完全完成。 [WebMethod] public ReplyBase GetStatus(string LocaleID,string ClientRequestHandle,out ServerStatus Status) { Status=new ServerStatus(); Status.VendorInfo="This is the demo version V1.0"; ReplyBase ReturnResult=new ReplyBase(); ReturnResult.RcvTime=System.DateTime.Now; ReturnResult.RevisedLocaleID=LocaleID; ReturnResult.ClientRequestHandle=ClientRequestHandle; ReturnResult.ReplyTime=System.DateTime.Now; return ReturnResult; } 首先要定义好ReplyBase等数据类型,VS.NET导入OPC FOUNDATION提供的WSDL会节省很多工作。 服务器端编号后,客户端获取WSDL,直接调用就行了。

寒酸

  • 精华:1帖
  • 求助:0帖
  • 帖子:5帖 | 34回
  • 年度积分:0
  • 历史总积分:54
  • 注册:2002年9月15日
发表于:2004-01-02 19:40:00
8楼
请问VS.NET导入WSDL是不是采用WSDL.EXE工具生成某种语言(C#或VB)的代理类?

zhangchaoyu

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 59回
  • 年度积分:0
  • 历史总积分:88
  • 注册:2003年9月03日
发表于:2004-01-03 15:13:00
9楼
OPC FOUNDATION提供了标准的OPC XMLDA WSDL,可以使用微软的工具WSDL.EXE导入,生成PROXY。我试过的,可以生成C#,VB的。也可以直接在VS.NET里面添加 WEB引用,这两者是等效的。当然,用C# BUILDER导入,效果也差不多。 导入过后只是生成了一些供客户端使用的PROXY。不能完全用于服务器端。我经过了改动来作为服务器端使用(现在还不明确我这样做是否完全符合OPC XMLDA标准)。

寒酸

  • 精华:1帖
  • 求助:0帖
  • 帖子:5帖 | 34回
  • 年度积分:0
  • 历史总积分:54
  • 注册:2002年9月15日
发表于:2004-01-03 19:49:00
10楼
我现在的感觉就是盲人走路,每走完了一步心里就不踏实,不知前面是死胡同还是阳光大道,唉!

zhangchaoyu

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 59回
  • 年度积分:0
  • 历史总积分:88
  • 注册:2003年9月03日
发表于:2004-01-04 10:15:00
11楼
按照自己的想法去实现,即使失败了也是一种成功。我觉得有盲人走路的感觉,但前面肯定是阳光大道。往下走下去,会看到希望的。

寒酸

  • 精华:1帖
  • 求助:0帖
  • 帖子:5帖 | 34回
  • 年度积分:0
  • 历史总积分:54
  • 注册:2002年9月15日
发表于:2004-01-04 17:28:00
12楼
在zhangchaoyu的帮助下,我的OPC XML 服务的GetStatus方法终于大功告成了,下面是我写的部分代码,请zhangchaoyu和其他朋友批评指教! [WebMethod] public ReplyBase GetStatus([System.Xml.Serialization.XmlAttributeAttribute()]string LocaleID,[System.Xml.Serialization.XmlAttributeAttribute()]string ClientRequestHandle,out ServerStatus Status)    { string progid,nodename; progid="OPCJ.SampleServer.1"; nodename=""; OPCAutomation.OPCServerClass opcs=new OPCAutomation.OPCServerClass(); opcs.Connect(progid,nodename); Status=new ServerStatus();    Status.VendorInfo ="opc xml da server 1.0 by zxm"; Status.StartTime =opcs.StartTime ; Status.ProductVersion ="zxm 1.0"; switch (opcs.ServerState) { case 1: Status.StatusInfo="OPC server is running"; break; case 2: Status.StatusInfo="OPC server is failed"; break; case 3: Status.StatusInfo="OPC is noconfig"; break; case 4: Status.StatusInfo ="opc server is suspended"; break; case 5: Status.StatusInfo ="opc server is test"; break; case 6: Status.StatusInfo ="opc server is disconnected"; break; } Status.SupportedInterfaceVersions[0]=interfaceVersion.XML_DA_Version_1_0; Status.SupportedLocaleIDs[0]="en_us"; Status.SupportedLocaleIDs[1]="de";    ReplyBase ReturnResult=new ReplyBase();    ReturnResult.RcvTime=System.DateTime.Now;    ReturnResult.RevisedLocaleID=LocaleID;    ReturnResult.ClientRequestHandle=ClientRequestHandle;    ReturnResult.ReplyTime=System.DateTime.Now; switch(opcs.ServerState) { case 1: ReturnResult.ServerState=serverState.running; break; case 2: ReturnResult.ServerState=serverState.failed; break; case 3: ReturnResult.ServerState=serverState.noConfig; break; case 4: ReturnResult.ServerState=serverState.suspended; break; case 5: ReturnResult.ServerState=serverState.test; break; case 6: ReturnResult.ServerState=serverState.commFault; break; }    return ReturnResult;    } 程序运行通过,用OPC XML客户端测试能访问到正确结果。 与 OPC COM服务器的交互采用的是自动化接口,这样可能不太好,理想情况下应该是采用自定义接口,可是在用TLBIMP.EXE时出现了一些错误所以就引用了OPCAutomation组件,不知这样行不行。

寒酸

  • 精华:1帖
  • 求助:0帖
  • 帖子:5帖 | 34回
  • 年度积分:0
  • 历史总积分:54
  • 注册:2002年9月15日
发表于:2004-01-04 17:33:00
13楼
现在开始写Read代码了,可是感觉它比GetStatus难多了,一时还无从下手!!!请大家继续支持我,谢谢!!

zhangchaoyu

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 59回
  • 年度积分:0
  • 历史总积分:88
  • 注册:2003年9月03日
发表于:2004-01-04 19:32:00
14楼
Good job! GetStatus基本算完善了,但OPC XML DA中出现了一个GetStatusResponse,它到底有什么作用还不太明白,“寒酸”可知此为何意?你的代码中使用了OPCAutomation,我想知道用的是那一种,或那个公司的。我以前用的是RsiOPCAuto.DLL,现在觉得它的通用性不够好,能不能把你使用的那个OPCAutomation发给我?

zhangchaoyu

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 59回
  • 年度积分:0
  • 历史总积分:88
  • 注册:2003年9月03日
发表于:2004-01-04 19:37:00
15楼
我也编写了READ的部分代码,和GetStatus一样,还未完成,也没有和OPC DA进行连接。现贴出来: public ReplyBase Read(RequestOptions Options, ReadRequestItemList ItemList, out ReplyItemList RItemList,out OPCError[] Errors) { RItemList=new ReplyItemList(); Errors=new OPCError[10]; if(Options.ReturnErrorText) {} if(Options.ReturnDiagnosticInfo) {} if(Options.ReturnItemTime) {} if(Options.ReturnItemPath) {} if(Options.ReturnItemName) {} int ItemCount=ItemList.Items.Length; for(int i=0;i<=ItemCount;i++) { ItemValue MyItemValue=new ItemValue(); MyItemValue.DiagnosticInfo="There is no Diagnostic Information"; MyItemValue.Value="the value comes here"; OPCQuality MyOPCQuality=new OPCQuality(); MyOPCQuality.QualityField=qualityBits.good; System.Xml.XmlQualifiedName MyValueTypeQualifier=new System.Xml.XmlQualifiedName("string", "http://www.w3.org/2001/XMLSchema"); MyItemValue.ValueTypeQualifier=MyValueTypeQualifier; MyItemValue.ItemPath=ItemList.Items[i].ItemPath; MyItemValue.ItemName=ItemList.Items[i].ItemName; MyItemValue.Timestamp=System.DateTime.Now; MyItemValue.Quality=MyOPCQuality; RItemList.Items[i]=MyItemValue; RItemList.Reserved="www"; } ReplyBase ReturnResult=new ReplyBase(); ReturnResult.RcvTime=System.DateTime.Now; ReturnResult.ReplyTime=System.DateTime.Now; return ReturnResult; } 希望能有更多的人参与进来。

寒酸

  • 精华:1帖
  • 求助:0帖
  • 帖子:5帖 | 34回
  • 年度积分:0
  • 历史总积分:54
  • 注册:2002年9月15日
发表于:2004-01-04 20:59:00
16楼
OPC基金会提供了OPCXML1.0规范就是为建立OPCXML服务器提供统一的方法、参数标准,同时也让客户端以统一的方式去使用OPCXML服务器提供的服务。因为我们的服务接口都是从OPC基金会提供的WSDL转换得到的,所以所有支持OPC XML DA标准的客户端,应该都能够访问我们做的服务器,但在一些小的细节上由于实现的过程不同,可能会出现一些小的问题,比如LOCALEID规范上给出好几个,而这里我的代码中只提供了2个,所以当客户提出要求规范上其它的LOCALEID时我的服务器就不能满足。(不知你同不同意我的看法?)

寒酸

  • 精华:1帖
  • 求助:0帖
  • 帖子:5帖 | 34回
  • 年度积分:0
  • 历史总积分:54
  • 注册:2002年9月15日
发表于:2004-01-04 21:26:00
17楼
GetStatusResponse与GetStatusRequest(OPCXML规范里简称之为“GetStatus”,注意与”GetStatus“服务本身不同!)相对应,后者表示客户使用服务器的“GetStatus”服务时向服务器发送请求时的消息内容和数据类型;前者表示服务器响应请求后反馈给客户的消息内容和数据类型。在代码中我们都没有涉及到它们,这是因为.NET平台替我们做了这些工作。以上是我个人的理解,如有错误请指教!

zhangchaoyu

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 59回
  • 年度积分:0
  • 历史总积分:88
  • 注册:2003年9月03日
发表于:2004-01-05 09:11:00
18楼
我发现从WSDL中转换过来的类中,有BeginGetStatus,和EndGetStatus,BeginRead和EndRead函数...。在technosoftware提供的OPCXMLDA.DLL中我也发现了有Read,BeginRead和EndRead的函数...。他们之间的区别在于后面跟的参数不一样,描述的功能也基本一致。一直没有搞清楚为什么要给出三个这样的东西。是否有什么特殊用法。

zhangchaoyu

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 59回
  • 年度积分:0
  • 历史总积分:88
  • 注册:2003年9月03日
发表于:2004-01-05 09:19:00
19楼
认真读了一下编写的web服务产生的WSDL,好像它自己会在服务名XXX后产生一个XXXResponse,估计应该是用于服务器对客户端请求的响应。如 寒酸 分析的。 但还是不清楚technosoftware为什么在OPC XMLDA Client SDK中会给出Read,BeginRead和EndRead;GetStatus,BeginGetStatus和EndGetStatus。

zhangchaoyu

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 59回
  • 年度积分:0
  • 历史总积分:88
  • 注册:2003年9月03日
发表于:2004-01-05 09:21:00
20楼
在GetStatus,Browse,Read,Write...中都会使用到OPC DA Server的连接、读取、浏览等操作,建议将OPC DA Server相关操作写成相应的过程,以便在服务中直接调用。

热门招聘
相关主题

官方公众号

智造工程师
    首页 上一页 1 2 3 下一页 尾页