Red de conocimiento informático - Conocimiento informático - Cómo conectarse a un servidor OPC remoto mediante código

Cómo conectarse a un servidor OPC remoto mediante código

El código en la línea 62, dado que DCOM es un servidor remoto, debería poder ejecutarse en otra máquina y luego ser utilizado por clientes en otras máquinas. Entonces, en el código del cliente C++, puede especificar el nombre del servidor mediante programación, pero para C#, debido a que el CLR completa la operación de conectarse al servidor DCOM y activar el objeto COM, no hay forma de especificarlo en el código. .

Pero no se preocupe, hay otra forma de especificar el servidor DCOM, que es modificar el valor clave del registro e indicarle al tiempo de ejecución COM local que el servidor está en otra máquina. Agregue el siguiente valor clave al registro de. la máquina cliente Tabla:

HKEY_CLASSES_ROOT\APPID\{5e9ddec7-5767-11cf-beab-00aa006c3606}\RemoteServerName=

El siguiente es mi código

public void ListAll(Guid catid, out OpcServers[] lista de servidores)

{

lista de servidores = null;

Dispose();

Guid guid = new Guid("13486D51-4821-11D2-A494-3CB306C10000");

Tipo typeoflist = Type.GetTypeFromCLSID(guid);

OPCListObj = Activador .CreateInstance (typeoflist);

ifList = (IOPCServerList)OPCListObj;

if (ifList == null)

Marshal.ThrowExceptionForHR(HRESULTS.E_ABORT);

p>

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, recuento de salida);

if (count < 1)

{ Marshal.FreeCoTaskMem(ptrGuid }

lista de servidores = nuevos OpcServers[count];

byte[] guidbin = nuevo byte[16];

int runGuid = (int)ptrGuid;

for (int i = 0; i < count; i++)

{

lista de servidores[i] = new OpcServers();

Marshal.Copy((IntPtr )runGuid, guidbin , 0, 16);

lista de servidores[i].ClsID = new Guid(guidbin);

ifList.GetClassDetails(ref lista de servidores[i].ClsID,

salir lista de servidores

[i].ProgID, out serverslist[i].ServerName);

runGuid += 16;

}

Marshal.FreeCoTaskMem(ptrGuid);

Dispose();

}

No hay ningún problema con el uso de este código para conectarse al servidor OPC local, pero al editar el registro anterior, cambie el server to Si se convierte en un servidor remoto, no se puede acceder a él. Cuando el código se está ejecutando, todavía está conectado al servidor OPC local. Por favor dígame cómo configurar para conectarme al servidor OPC remoto