如何通过代码连接远程OPC服务器?

wangji666666 2011-12-14 03:20:18
根据这个文章http://www.cnblogs.com/killmyday/archive/2010/07/04/1770717.html

第62行的代码,DCOM既然是远程服务器,那它就应该是可以运行在另外一台机器上,然后被其他机器的客户端所使用。所以C++的客户端代码里,你可以通过编程的方式指定服务器的名称,但是对于C#来说,因为连接到DCOM服务器并激活COM对象的操作是由CLR完成的,没有办法在代码里指定。不过不用着急,指定DCOM服务器还有另外一个方式,就是修改注册表的键值,告诉本机的COM运行库,服务器在另外一台机器上,请把下面的键值添加到客户端机器的注册表里:

HKEY_CLASSES_ROOT\APPID\{5e9ddec7-5767-11cf-beab-00aa006c3606}\RemoteServerName=<机器名>

下面的是我的代码
public void ListAll(Guid catid, out OpcServers[] serverslist)
{
serverslist = null;
Dispose();
Guid guid = new Guid("13486D51-4821-11D2-A494-3CB306C10000");
Type typeoflist = Type.GetTypeFromCLSID(guid);
OPCListObj = Activator.CreateInstance(typeoflist);
ifList = (IOPCServerList)OPCListObj;
if (ifList == null)
Marshal.ThrowExceptionForHR(HRESULTS.E_ABORT);

ifList.EnumClassesOfCategories(1, ref catid, 0, ref catid, out EnumObj);
if (EnumObj == null)
Marshal.ThrowExceptionForHR(HRESULTS.E_ABORT);

ifEnum = (IEnumGUID)EnumObj;
if (ifEnum == null)
Marshal.ThrowExceptionForHR(HRESULTS.E_ABORT);

int maxcount = 300;
IntPtr ptrGuid = Marshal.AllocCoTaskMem(maxcount * 16);
int count = 0;
ifEnum.Next(maxcount, ptrGuid, out count);
if (count < 1)
{ Marshal.FreeCoTaskMem(ptrGuid); return; }

serverslist = new OpcServers[count];

byte[] guidbin = new byte[16];
int runGuid = (int)ptrGuid;
for (int i = 0; i < count; i++)
{
serverslist[i] = new OpcServers();
Marshal.Copy((IntPtr)runGuid, guidbin, 0, 16);
serverslist[i].ClsID = new Guid(guidbin);
ifList.GetClassDetails(ref serverslist[i].ClsID,
out serverslist[i].ProgID, out serverslist[i].ServerName);
runGuid += 16;
}

Marshal.FreeCoTaskMem(ptrGuid);
Dispose();
}

用此代码连接本地OPC服务器是没有问题的,但是通过上面对注册表的编辑,将服务器换成远程服务器,就不能访问,代码运行起来还是连接的是本地OPC服务器。请教各位我该如何设置才能连接远程OPC服务器
...全文
563 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
maiker 2013-05-29
  • 打赏
  • 举报
回复
我现在不考虑远程连接了,感觉配置起来很麻烦,如是使用一个WCF服务器连接本地OPC Server,然后远程客户端都来访问WCF,这样实现了远程访问,并且WCF服务的构建非常简单。
Mr-Wanter 2013-05-06
  • 打赏
  • 举报
回复
引用 楼主 wangji666666 的回复:
根据这个文章http://www.cnblogs.com/killmyday/archive/2010/07/04/1770717.html 第62行的代码,DCOM既然是远程服务器,那它就应该是可以运行在另外一台机器上,然后被其他机器的客户端所使用。所以C++的客户端代码里,你可以通过编程的方式指定服务器的名称,但是对于C#来说,因为连接到DCOM服务器并激活COM对象的操作是由CLR完成的,没有办法在代码里指定。不过不用着急,指定DCOM服务器还有另外一个方式,就是修改注册表的键值,告诉本机的COM运行库,服务器在另外一台机器上,请把下面的键值添加到客户端机器的注册表里: HKEY_CLASSES_ROOT\APPID\{5e9ddec7-5767-11cf-beab-00aa006c3606}\RemoteServerName=<机器名> 下面的是我的代码 public void ListAll(Guid catid, out OpcServers[] serverslist) { serverslist = null; Dispose(); Guid guid = new Guid("13486D51-4821-11D2-A494-3CB306C10000"); Type typeoflist = Type.GetTypeFromCLSID(guid); OPCListObj = Activator.CreateInstance(typeoflist); ifList = (IOPCServerList)OPCListObj; if (ifList == null) Marshal.ThrowExceptionForHR(HRESULTS.E_ABORT); ifList.EnumClassesOfCategories(1, ref catid, 0, ref catid, out EnumObj); if (EnumObj == null) Marshal.ThrowExceptionForHR(HRESULTS.E_ABORT); ifEnum = (IEnumGUID)EnumObj; if (ifEnum == null) Marshal.ThrowExceptionForHR(HRESULTS.E_ABORT); int maxcount = 300; IntPtr ptrGuid = Marshal.AllocCoTaskMem(maxcount * 16); int count = 0; ifEnum.Next(maxcount, ptrGuid, out count); if (count < 1) { Marshal.FreeCoTaskMem(ptrGuid); return; } serverslist = new OpcServers[count]; byte[] guidbin = new byte[16]; int runGuid = (int)ptrGuid; for (int i = 0; i < count; i++) { serverslist[i] = new OpcServers(); Marshal.Copy((IntPtr)runGuid, guidbin, 0, 16); serverslist[i].ClsID = new Guid(guidbin); ifList.GetClassDetails(ref serverslist[i].ClsID, out serverslist[i].ProgID, out serverslist[i].ServerName); runGuid += 16; } Marshal.FreeCoTaskMem(ptrGuid); Dispose(); } 用此代码连接本地OPC服务器是没有问题的,但是通过上面对注册表的编辑,将服务器换成远程服务器,就不能访问,代码运行起来还是连接的是本地OPC服务器。请教各位我该如何设置才能连接远程OPC服务器
可以交流下 我的QQ 991446772 我也在做这个
Mr-Wanter 2013-05-06
  • 打赏
  • 举报
回复
搞这个的真的好少呀!!我也在弄 远程连接问题好多啊
wangji666666 2011-12-15
  • 打赏
  • 举报
回复
在顶一下,看看有没有高手贡献一下做OPC客户端的经验
wangji666666 2011-12-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jmlovews 的回复:]
没接触过,帮顶~~~~~~~~~
[/Quote]
谢谢帮顶
我2我骄傲 2011-12-14
  • 打赏
  • 举报
回复
没接触过,帮顶~~~~~~~~~

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧