opc客户端与服务器建立连接

opc客户端与服务器建立连接,第1张

服务器的话要看,如果是client-server结构的DCS,服务器位于上位和控制器之间,他将你的指令和现场数据通过服务器来经过交换,服务器一般是冗余配置,如果是并行结构来说没有所谓服务器的概念,只有个工程师站,程序的下装通过工程师站,但是数据的获取和指令的下达通过 *** 作员站就行,这个好处就是当工程师站坏了的话 *** 作员站可以正常工作
OPC服务器的作用是通过OPC协议将DCS的数据取出,并开放,一般一个OPC服务器下面连接一个或多个客户端,客户端通过安装相应的软件(也支持OPC协议),来取得DCS的协议

第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 = TypeGetTypeFromCLSID(guid);
OPCListObj = ActivatorCreateInstance(typeoflist);
ifList = (IOPCServerList)OPCListObj;
if (ifList == null)
MarshalThrowExceptionForHR(HRESULTSE_ABORT);
ifListEnumClassesOfCategories(1, ref catid, 0, ref catid, out EnumObj);
if (EnumObj == null)
MarshalThrowExceptionForHR(HRESULTSE_ABORT);
ifEnum = (IEnumGUID)EnumObj;
if (ifEnum == null)
MarshalThrowExceptionForHR(HRESULTSE_ABORT);
int maxcount = 300;
IntPtr ptrGuid = MarshalAllocCoTaskMem(maxcount 16);
int count = 0;
ifEnumNext(maxcount, ptrGuid, out count);
if (count < 1)
{ MarshalFreeCoTaskMem(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();
MarshalCopy((IntPtr)runGuid, guidbin, 0, 16);
serverslist[i]ClsID = new Guid(guidbin);
ifListGetClassDetails(ref serverslist[i]ClsID,
out serverslist[i]ProgID, out serverslist[i]ServerName);
runGuid += 16;
}
MarshalFreeCoTaskMem(ptrGuid);
Dispose();
}
用此代码连接本地OPC服务器是没有问题的,但是通过上面对注册表的编辑,将服务器换成远程服务器,就不能访问,代码运行起来还是连接的是本地OPC服务器。请教各位我该如何设置才能连接远程OPC服务器

OPC服务器的功能就是与下位机进行数据的交换,其中包含了大量的通讯程序和数据存贮程序。然后提供标准的OPC接口,供其它软件使用。程序标准化以后,其他的软件商只需开发面对服务器的程序即可,不用对不同的硬件设备开发不同的硬件驱动程序。减小了工作量,也方便了使用。

OPC是OLE for Process Control的缩写,即把OLE应用于工业控制领域。OLE原意是对象链接和嵌入,随着OLE 2的发行,其范围已远远超出了这个概念。现在的OLE包容了许多新的特征,如统一数据传输、结构化存储和自动化,已经成为独立于计算机语言、 *** 作系统甚至硬件平台的一种规范,是面向对象程序设计概念的进一步推广。OPC建立OLE规范之上,它为工业控制领域提供了一种标准的数据访问机制。

WINCC60安装好后激活组态程序,客户端就可以直接访问了
客户端测试的话 SimaticNET安装好以后就可以做为客户端了
另外,Wincc也可以作为客户端 直接添加本身激活的项目里面的OPC变量 作为测试也算是可以的

OPC采样频率是在OPC服务器端进行设定的。OPC服务器会附带一个配置程序,在配置程序中设置通讯协议、设备,变量组、变量等,在进行变量组合变量设定时,就会看到数据更新时间的变量属性,更新时间越短,刷新率越高。

WINCC60安装好后激活组态程序,客户端就可以直接访问了
客户端测试的话
SimaticNET安装好以后就可以做为客户端了
另外,Wincc也可以作为客户端
直接添加本身激活的项目里面的OPC变量
作为测试也算是可以的

软件问题或者是设置了密码。
无法访问所选的opc服务器有可能是软件出现了问题,检查下检查软件的兼容性。或者是你设置了密码,你可以用odbc测试一下链接OPCserver,如果可以了,你wincc中访问odbc。
可以将OPC服务器看做是协定转换器,OPC服务器运用装备的专用协定与装备通讯,然后运用OPCClassic和OPCUA范例定义的范例化花样供应对该数据的接见。

我用过kepware写过,没用过组态王,不太明白你说的主动与被动。客户端添加Group的时候,你只要把IsSubscribed设置为true,服务器端就会在数据发生变化时,触发客户端的DataChange事件,这应该就是你说的主动;而客户端的异步读、写事件AsyncRead、AsyncWrite,则是主动向服务器请求,这应该就是你说的被动。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/13415916.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-31
下一篇 2023-07-31

发表评论

登录后才能评论

评论列表(0条)

保存