2. OPC La idea principal, sobre la que se construye todo el sistema, es el aprovechamiento del estándar OPC, como sistema abierto, para asegurar la normalización de nuestro sistema y su aprovechamiento para un amplio rango de software de control (todos aquellos que compartan interfaz como clientes OPC). OPC nos permite establecer una comunicación estandarizada entre clientes y servidores OPC. Todos los estándares OPC deben tener un conjunto básico de interfaces, de manera que cualquier cliente desarrollado bajo este estándar se pueda comunicar con servidores de distintos fabricantes sin problemas. Esto se consigue gracias a estar desarrollado sobre las librerías COM (Component Object Model). Función CoInitializeEx CoRegisterClassObject Resultado Initializes the COM library for use by the calling thread, sets the thread's concurrency model, and creates a new apartment for the thread if one is required. Registers an EXE class object with OLE so other applications can connect to it. CoAddRefServerProcess Informs OLE that a class object, previously registered with the CoRegisterClassObject function, is no longer available for use. Decrements the global per-process reference count CoReleaseServerProcess Decrements the global per-process reference count CoRevokeClassObject CoUninitialize Closes the COM library on the current thread, unloads all DLLs loaded by the thread, frees any other resources that the thread maintains, and forces all RPC connections on the thread to close. Tabla 1. Funciones de interés de librería COM COM es una tecnología desarrollada por Microsoft basada en una interacción cliente-servidor, con el objetivo de la reutilización de software. Un software que soporte COM podrá ser reutilizado desde otra aplicación a través de una serie de funciones o interfaces. Como extensión de COM para su uso a través de una red es Distributed COM (DCOM). COM es un estándar binario que permite el desarrollo de clientes y servidores sobre Visual Basic y C/C++. COM esta basado en objetos. Entendemos por objeto COM, a una pieza de código, perfectamente encapsulada en Componentes/Servidores, de manera que tan solo son accesibles a través de interfaces. La comunicación entre los objetos y los clientes COM se hará tan solo utilizando estos interfaces. La definición de los interfaces se debe hacer en lenguaje IDL (Interface Definition Language), pero la implementación de los métodos de este se puede hacer en cualquier lenguaje de programación. Comunicación entre Simulink y Sistemas de control Simulink OPC Server 11 Figura 5. Estructura de objetos sobre tecnología COM Todos los objetos e interfaces COM son identificados con el GUID (Globally Unique Identifier). Llamaremos CLSID a los identificadores para los objetos y IID para los interfaces. De esta manera aseguramos que sea perfectamente inequívoco identificar cualquier objeto COM en el mundo suponiendo un “nombre” para llamar a cualquier interfaz y por tanto a cualquier servidor COM. Cada vez que un cliente intenta acceder a un método perteneciente a un interfaz, el servidor crea un nuevo objeto COM, de esta manera podrían conectarse varios clientes a un mismo interfaz, cada uno establecería la comunicación con un objeto distinto. Cuando un cliente se desconecta del objeto, el servidor debe eliminarlo. Una vez es publicado a los usuarios un nuevo interfaz, sus métodos no pueden cambiarse, si fuera así debería de crearse un nuevo interfaz con un nuevo nombre, de esta manera no se interfiere con clientes que estuvieran utilizando los métodos antiguos del interfaz. El interfaz IUnknown debe de encontrarse en todos los objetos COM y contiene 3 métodos: • QueryInterface, toma como parámetro un IID, devolviendo un puntero al interfaz. • AddRef, incrementa el número de objetos COM • Release, decrementa el número de objetos COM Finalmente destacar la necesidad de las DLL que llamaremos Proxy y stub que se encargarán de la “conversión” entre los espacios de direcciones de cliente y servidor para el correcto uso de métodos en aplicaciones remotas. Figura 6. Comunicación a través de Proxy y stub. Comunicación entre Simulink y Sistemas de control Simulink OPC Server 12 Tanto el cliente como el servidor OPC son objetos COM. 2.1. Arquitectura básica OPC Las especificaciones OPC definen 3 tipos de servidores OPC: • Data Access, define interfaces para la lectura y escritura de datos en el sistema de control. • Alarms and Events, permite mantener vigilancia sobre posibles condiciones anormales en el sistema. • Historical Data Access, mantiene una base de datos sobre un servidor OPC DA En nuestro caso desarrollaremos el trabajo sobre un servidor OPC DA, para el intercambio de datos con un sistema SCADA. OPC también define dos series de interfaces: • Custom • Automation Figura 7. Tipos de interfaces OPC Sobre C++ se usa el interfaz Custom y por tanto este será sobre el que trabajaremos. 2.2. OPC DA El estandar define 3 tipos de objetos COM: Comunicación entre Simulink y Sistemas de control Simulink OPC Server 13 • OPC Server, es el primer objeto al que se conecta el cliente. Mantiene información sobre el propio servidor, servidores del entorno y contenedores para los objetos OPC Group. • OPC Group, proporciona una manera de organizar los datos. Hay dos tipos: públicos (accesibles por todos los clientes), y locales (solo accesible por el cliente que lo creo). En nuestro caso el objetivo del cliente no será crear grupos, será el propio servidor el encargado de crear grupos públicos. • OPC Item, representa una conexión con los datos físicos, no son fuentes de datos. No tiene realmente un interfaz hacia los clientes, siendo accesibles tan solo a través de los grupos que lo contienen. Cada item lleva asociado el valor, el tipo VARIANT, la calidad y el tiempo de la ultima actualización, además del identificador ID a través del cual el cliente accede de manera indirecta a los anteriores campos. Figura 8. Estructura de objetos OPC Todos estos valores se actualizan también en la cache, para su lectura por la propia fuente emisora y receptora de señales físicas. Comunicación entre Simulink y Sistemas de control Simulink OPC Server 14