关于XML-DA客户端和.net平台下访问OPC DA服务器的见解 点击:954 | 回复:1



opcfan

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:62帖 | 58回
  • 年度积分:0
  • 历史总积分:667
  • 注册:2004年9月29日
发表于:2007-12-04 20:05:00
楼主
在这里主要想说的就是:

开发XML-DA客户端实际上和开发普通Web的客户端没有多大区别,不需要借助其它工具就可以开发。在这里打上OPC的烙印,是因为您要了解提供那些Web服务(一共8个),您可以看OPC XML-DA 1.0的规范,而且您在访问这些Web服务的时候,实际上通过XML-DA GateWay会访问到具体的DA服务器(包括1.0、2.0和3.0)。开发客户端的人员不需要了解XML-DA GateWay的机理,您只要知道这个是提供Web服务的东西就可以了。
    稍微解释一下:OPC XML-DA GateWay实际上就是WebService,只是开发的WebService是按照OPC基金会规定的8个服务:GetStatus 、Read 、Write、GetProperties 、Subscribe 、SubscriptionPolledRefresh 、SubscriptionCancel 和Browse 。 

    开发Web的客户端的方法有多少种,那么开发XML-DA的方法就有多少种。您可以使用VB、Java脚本、ASP、ASP.net、也可以使用VC++(前面这些实际上都最终调用SoapToolkit)和C#等等。大家不要怕,微软的东西就是概念多,概念理一理就好了。下面分别举例:

本来想都贴出来,东西太多,看来只能给VC++和C#的了。(呵呵,掉一下大家胃口,需要的话给我要,告诉单位和名字,发邮件到OPCFan@163.com)

1、C++的情况: 

a、在stdafx.h头文件中添加下面代码: 
#include <afxsock.h>  // MFC socket extensions 
#import "C:\\WINDOWS\\system32\\msxml.dll" rename("XMLHTTPRequest","MyXMLHTTPRequest") 

b、在InitInstance虚函数下初始化Socket 
BOOL CVC_PP_XML_OPCClientApp::InitInstance() 

if (!AfxSocketInit()) 

  AfxMessageBox("Windows sockets initialization failed!"); 
  return FALSE; 

...... 
} 

C、使用命名空间 
using namespace MSXML; 

D、具体代码: 

构造函数里初始化COM库,指定WebService的网址,在这里是本机建立的一个Web服务,并且指定访问Web服务的方法是POST,而不是Get。提个问题:Get和Post的方法的区别在哪里呢?另外指定本机的用户名和密码。 

客户端通过这个WebService到底访问了本机的哪个服务器程序呢?这个服务器的ProgID是ICONICS.ModbusOPCServer3。假如,需要访问其它的服务器,就通过修改asmx文件的名称即可。这个属于部署OPC Web Service的范畴,有些跑题了。(本人已经开发好了XML-GateWay,等着给公司用呀,还不知道什么时候能发挥一下,我慢慢等着吧)

CVC_PP_XML_OPCClientDlg::CVC_PP_XML_OPCClientDlg(CWnd* pParent /*=NULL*/) 
: CDialog(CVC_PP_XML_OPCClientDlg::IDD, pParent) 

//{{AFX_DATA_INIT(CVC_PP_XML_OPCClientDlg) 
m_strWebService = _T("http://localhost/ZGJCC/ICONICS.ModbusOPCServer3.asmx"); 
m_strResult = _T(""); 
m_strRequest = _T(""); 
//}}AFX_DATA_INIT 
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
    ::CoInitialize(NULL); 
    m_strUserName = "Administrator"; 
m_vUser.vt = VT_BSTR; 
m_vUser.bstrVal = m_strUserName.AllocSysString(); ; 
m_strPass = "pass"; 
m_vPassword.vt = VT_BSTR; 
m_vPassword.bstrVal = m_strPass.AllocSysString(); 
m_HTTPMethod = _bstr_t( "POST" ); 

m_noAsync = _variant_t( (bool)false ); 


通过下面的函数把一个GetStatus的Soap协议发出去,并且接收返回来的文本。在这里并没有解析回来的内容。 

void CVC_PP_XML_OPCClientDlg::OnGetStatus() 

UpdateData(TRUE); 
    IXMLHttpRequestPtr m_httpReq( _uuidof(MyXMLHTTPRequest)); 
m_httpReq->open(m_HTTPMethod ,m_strWebService.AllocSysString(),m_noAsync,m_vUser,m_vPassword); 
m_httpReq->setRequestHeader("SOAPAction", "http://opcfoundation.org/webservices/XMLDA/1.0/GetStatus"); 
m_httpReq->setRequestHeader("Content-Type", "text/xml"); 

CString szRequest; 
szRequest = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\ 
<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\&



工控帮

  • 精华:0帖
  • 求助:0帖
  • 帖子:63帖 | 675回
  • 年度积分:0
  • 历史总积分:1418
  • 注册:2001年7月06日
发表于:2007-12-04 21:43:00
1楼
你是越来越精通OPC了,我啥也不会了。呵呵

热门招聘
相关主题

官方公众号

智造工程师