Showing posts with label Industrial Automation. Show all posts
Showing posts with label Industrial Automation. Show all posts

Saturday, 26 June 2010

Zaluum : The first open source platform for industrial automation part I

Zaluum is the first open source platform end-to-end for Industrial Automation. This solution is brought up by Frederic Perez who I was honoured to work with. This disruptive idea wants to move the industry in a radical new direction: the public domain, community driven and the free automation software. For many years I have been working with endless and incompatible PLCs (Programmable Logic Controller) and DCSs (Distributed Control Systems) from proprietary vendors like Siemens, Schneider Electric, ABB, etc., and with the growth of these new and free technologies, the overview will change within a few years. Zaluum is based on Java with plug-in architecture. Despite being in an early stage of development, the design allows quick customization and implementation. This multi OS platform framework aims to create an open-source PLC alternative that runs on a standard Industrial PC RT with tools for FSM (Finite State Machine), logic (with Boxes), scripting with Groovy and Ethernet communication drivers like: modbus TCP.
This alternative will enable engineers to build control systems with a free, growing knowledge base, and to receive support from and contribute to improvements in the Open Source community. The project is hosted on Launchpad and uses bazaar as a version control software. The IDE is based on the very well known Eclipse RCP (Rich Client Platform) and Frederic has come up with the idea of using the power of the Object Oriented Programming in order to create a more scalable and maintainable code.
Frederic says: "This solution will have knock-on effects and will revolutionize the industrial automation world." and I totally agree with him that if this idea reaches to the right targets and spreads throughout the planet, we will change the Industrial automation world. I have seen a lot of people who doubt about the reliability of PC-based control, but they will not resist the attractiveness of Zaluum.

Frederic invites readers, vendors, and OEMs to jump in, saying that when you contribute to an open source community, parallel teamwork drives improvement and comes right back to you. "Our next steps are trying to expand our community, recruiting more developers and putting forward the idea to spread the message."
"Only those who attempt the absurd will achieve the impossible."
M.C. ESCHER.
Jordi Coll.

Feel free to give it a try and give feedback: http://www.zaluum.com/download or https://launchpad.net/zaluum/+download.

Sunday, 1 November 2009

Cálculo de rutas de transporte parte V

En éste artículo os entrego la última versión de la aplicación con mejoras adicionales sobre la selección de caminos. Continuando con la IV parte, he modificado ligeramente el algoritmo para identificar y marcar diferentes destinos en función de un parámetro situado en la propia conexión. Por ejemplo, si nos encontramos en un ítem que tiene 2 caminos a seguir, éstos deben estar numerados para indicar cual tomar.

Si éste elemento es un dispositivo físico, de alguna manera deberá posicionarse para dirigirse hacia un sitio u otro. De ésta manera si nos encontramos con la siguiente situación:

Indicamos numéricamente que si queremos ir del dispositivo 40 al 11, éste debe estar en su posición '2' y si quiere dirigirse hacia el 39, en la posición '1'. Físicamente representaría que por ejemplo una válvula debe estar posicionada en un sentido (abierta) para acceder a 11 y cerrada para 39 por ejemplo. De éstos ejemplos encontraremos muchísimos en la selección de caminos, y es interesante pararse un momento y pensar sobre éstos y buscar una solución elegante.

De momento he hecho que el nombramiento de las conexiones sea automático y sin ningún orden. Camino que selecciono, camino que marco. Ahora el cálculo es más eficiente, más rápido y con mejor disponibilidad a la hora de hacer pequeños cálculos para obtener éstos parámetros.

Si nos fijamos en el siguiente ejemplo:

Veréis que cada enlace está marcado y cuando generamos la salida para el cálculo de rutas, podemos ver como identifica cada uno de los nodos:

En verde se marcan los orígenes, en azul los elementos bloqueados y en fucsia los destinos. Además ésta versión dispone de las siguientes mejoras:
  • Selección total de los nodos
  • Movimiento total de los nodos mediante botones
  • Enlaces de bloqueo identificados en azul (no se editarán)
Aquí os dejo la última versión:


Thursday, 29 October 2009

Cálculo de rutas de transporte parte IV

En ésta entrega, hago el primer desarrollo profesional de mi framework VLO sobre un ejemplo real para el cálculo de rutas. Como ya sabéis, el VLO framework es una plataforma de desarrollo desarrollada en Delphi 2010 que pretende obtener un vínculo gráfico con un Objeto. De ésta manera esa porción de memoria que estamos utilizando se está representado en pantalla utilizando una serie de conceptos gráficos. Llevo trabajando en éste proyecto unos 2 meses y medio y como podéis ver, si se planifica bien el trabajo, se tienen las ideas claras y partimos con un buen background en orientación a objetos y diseño utilizando patrones podemos crear herramientas increíbles.

Luego vino la implementación de la plataforma sobre ejemplos reales, al principio podía crear diagramas de grafos y calcular la ruta más corta utilizando Dijkstra. Después le di una parte mucha más gráfica y implementé un sistema multi capas para poder disponer de texto, imagen y caja en el mismo componente. A partir de ahí y con otras muchas ideas (gracias a los morning pages) apareció el cálculo de rutas. Hace ya bastantes años que me dedico al sector de la automatización industrial y la mayoría de aplicaciones que desarrollo son para cumplir los requisitos que necesitan éste tipo de industria.

Por lo tanto, continuando con ésta última versión de la aplicación, veréis que hay un pequeño cambio y es que ahora ya tengo implementado el algoritmo para reconocer scada's (Vijeo Citect) utilizando la Graphics Builder Automation Interface, y aquí ya vi un filón.

¿En qué consiste ésta última versión?. Pues bien, si disponemos de un diagrama real de Scada, por ejemplo como el siguiente:

Podemos ver una configuración típica donde se transporta el producto desde unos silos de origen a unos recipientes destino. Ahora lo que hay que hacer, es escanear la librería de "Genies" (Objetos del Vijeo Citect) con Thundax Genies Scanner y volcar los datos en la ubicación de los resources de Thundax Box Manager (para que disponga de todas las imagenes de la librería y así poder representar las boxes con la imagen correcta).

Una vez escaneada una librería como la presentada en la imagen, ya podemos iniciar Thundax Box Manager y escanear la pantalla del Scada con la aplicación utilizando la librería de automatización. Sobretodo antes, visualizar en las opciones de la aplicación Thundax Genies Scanner la ubicación de los resources:


Ahora, iniciamos Thundax Box Manager, y con la pantalla seleccionada del Scada, nos dirigimos al menú Citect -> Load Page Diagram, y en pocos segundos, tendremos cargada la misma estructura en mi aplicación (solo las genies, los símbolos no, porque no representan ninguna estructura de control, es decir, no tienen ninguna lógica dentro del proceso):

Ahora solo tenemos que perder 15 segundos en realizar las conexiones lógicas entre elementos o ítems y luego calcularemos las rutas:

Tenemos que acordarnos de marcar cuales son los orígenes y cuales los destinos:

Ahora entenderéis el concepto de "Bloqueo o Interlock" con la siguiente imagen:

Si os fijáis el producto pasa por la cinta superior, y hay 2 válvulas que sacan el producto. Pero tenemos que tener en cuenta que solo se puede abrir 1 a la vez, ya que sinó enviariamos producto a un destino diferente al requerido. Por lo tanto debe estar bloqueada la otra válvula y no abrirse durante la ejecución de la ruta seleccionada. De ahí que exista el objeto "interlock", y que se gestione en el cálculo de la ruta de transporte.

Ahora solo tenemos que ejecutar "Citect -> Calc Transport Routes" et voilà!, ya tenemos generadas las 100 rutas disponibles que hay en menos de 100 ms.


Además podemos ver la ruta seleccionada haciendo click en la ruta:

Aún quede mucho trabajo por delante, pero me lo tomo con mucha ilusión al ver que por fin el programa tiene una meta asequible: Crear rutas de transporte para que otro programa pueda trabajar con éstas y ejecutarlas. Lo interesante de todo ésto es que podemos ahorrar un montón de tiempo intentando averiguar la cantidad de rutas que tenemos y sobretodo intentar el poderlas implementar gráficamente manteniendo como expliqué hace 2 meses un mapa lógico sobre una estructura que carece de inteligencia.

Aquí os dejo las últimas versiones de mi aplicación:
He cambiado la privacidad de la aplicación y de momento la he hecho "trial de 30 días" esperando crear un paquete más completo con sus diferentes opciones. Espero que la lectura haya sido entretenida!.

Friday, 9 October 2009

Automation Object Library para Vijeo Citect con Delphi parte III

Aquí os dejo una aplicación interesante utilizando la Graphic Builder Automation Interface que trae Vijeo Citect. Ésta aplicación que he creado la utilizaré posteriormente con Thundax Box Manager para gestionar la librería que trae Citect. Mi idea es poder leer toda la librería de nuestro proyecto de citect y guardar también su imagen en la librería de imagenes de Thundax Box Manager. De ésta manera, al crear el mapa mental de la aplicación, podré incrustar la imagen que toque de la librería con ésta nueva aplicación que he creado. La aplicación se llama Thundax Genies Scanner y permite escanear una pantalla de vijeo citect, y a la vez permite incrustar una imagen del clipboard para ir recortando las diferentes imagenes de la librería e ir guardandolas en formato .bmp dentro de la librería de Thundax Box Manager. La cosa funciona de la siguiente manera, primero si disponemos de una pantalla con todos los elementos de nuestra librería emplastados en la página activa (Citect Graphic Builder):

Ahora solo tenemos que marcar la ventana activa y hacer ALT + PRINT SCREEN y se bolcará una copia de la imagen en el clipboard. Ahora iniciamos la aplicación Thundax Genies Scanner, y en el menú "Clipboard" hacemos "paste", y aparecerá la imagen de la aplicación Graphic builder dentro de Thundax Genies Scanner.

Ahora, desde la opción de menú File -> Scan Objects, veremos como el algoritmo busca el objeto en la pantalla del Vijeo Citect (Citect Graphic Builder) y extrae todas sus propiedades que se listarán en el árbol de la izquierda, y además se copiará el símbolo de la propia imagen incrustada en la aplicación, para crear una librería gráfica de símbolos.

Si ejecutamos, el resultado es el siguiente:

Ahora podemos disponer de toda nuestra librería de objetos de citect exportada para que la aplicación Thundax Box Manager con el VLO Framework pueda trabajar con ésta. En los siguientes artículos las cosas se irán poniendo mucho más interesantes ya que empezaré a implementar los algoritmos para trabajar con todos éstos datos.


Monday, 5 October 2009

Automation Object Library para Vijeo Citect con Delphi parte II

Continuando con la primera parte de éste artículo, voy a seguir con la explicación dada en esa entrega y ver como va evolucionando la integración de la idea comentada en ese artículo sobre el nuevo framework VLO. Ésta parte es muy interesante y llevo trabajando en ésto casi todo el fin de semana, incluso ahora estoy dedicando un rato en crear unos vídeos para mostrar lo interesante de la aplicación, pero aún se me encallan un poquito.

En éste artículo voy a comentar los siguientes pasos que ha realizado mi aplicación "Thundax Box manager" para implementar el nuevo framework VLO (Visually Linked Objects) para poder escanear una pantalla del Scada (Vijeo Citect 7.0) y generar su símil en la aplicación Thundax Box Manager y así como dije en su día, crear un mapa mental de lo que realmente hay en la aplicación. Ésto nos servirá más adelante para hacer cosas mucho más potentes que ya os iré explicando.

En definitiva, la primera propuesta era encontrar la manera de obtener todos los objetos y sus propiedades utilizando la librería de automatización que lleva el Vijeo Citect que además es un TLB (type library Borland), por lo tanto si tengo una pantalla típica hecha con Vijeo Citect:

Puedo ver las genies "engine" y "valve" y el símbolo "tank". Pues bien, he creado un pequeño algoritmo que se encarga de escanear éstos objetos y devolverme sus propiedades (nombre, librería, tags, posición, etc).

El resultado de ejecutar éste algoritmo es lo siguiente:

Se muestra en éste formulario la información referente a cada genie, más la información de sus propiedades. Si consultamos en el Scada el punto de animación 35, podemos ver que es el motor y que las propiedades capturadas coinciden con las de la pantalla:


Aquí podréis descargar la aplicación utilizada para el escaneado de propiedades. Podéis comprobar vuestras aplicaciones y ver si devuelve bien o no los parámetros:
Lo más interesante ahora, es que puedo perfeccionar éste algoritmo y utilizar mi framework VLO para representar la información de la siguiente manera:

Y ahora que tengo los mismos objetos que en el Scada, puedo hacer lo siguiente:

¿Veis por dónde van los tiros, no?. Ahora puedo dar una cierta inteligencia a éstos objetos y empezar a generar mucha más información porqué de empezar siendo una imagen (elementos posicionados en un diagrama para simular algo), acaba siendo un diagrama en una plataforma que me permite crear un mapa mental de lo que existe.

¿Y ahora que?. Pues a seguir perfeccionadolo. Al final hay que conseguir poder dibujar ciertos procesos dentro de mi framework y luego empezar a generar diversa información más sutil, como rutas de transporte, enclavamientos entre equipos, etc, etc, etc. Todo ésto con la ayuda de Delphi, una buena base de OO y un buen diseño de patrones.

En mi opinión ésto es algo que creo yo que tendrá tirada. Aún no he visto nada de ésto en el mercado (que yo conozca), ya que no es como un control distribuido, sino que es algo más personalizable. Poco a poco iré implementando más funcionalidades hasta poder disponer de algo un poco global y que no cueste mucho su implementación y que sea muy escalable.




Thursday, 27 August 2009

Automation Object Library para Vijeo Citect con Delphi parte I


Después de éstos días de descanso y reflexión, aún estoy de vacaciones y me he parado un momento para publicar algo en lo que he estado trabajando éstos últimos días. Aquí os hago un pequeño adelanto de una de mis próximas aplicaciones utilizando todas las aplicaciones explicadas anteriormente. (sobre geometría computacional, utilización del canvas, etc.) Ésta idea bastante innovadora se utilizará para generar pantallas SCADA con mucha más facilidad utilizando las herramientas de las que dispone Vijeo Citect para la automatización de sus pantallas. Hace mucho tiempo que me dedico al sector de la Automatización Industrial y he desarrollado varios programas para la manipulación de Scada's de Vijeo Citect. Pues bien, he desarrollado un pequeño programa que permite utilizar la Automation Object Library (ctdraw32.tlb) para hacer la manipulación mediante delphi, y así aprovechar toda su potencia. Mediante la utilización de un patrón IoC y objetos COM, creo una jerarquía de clases idónea para la manipulación de ésta librería y así interaccionar con las pantallas de Citect. Ésta librería no tiene ningún secreto, es más en la ayuda de la misma aplicación aparece descrito cómo utilizarla mediante Visual basic:

Aunque es un poco ortodoxo (utilizando un lenguaje sin OO..puf!) lo bueno es poder utilizar Delphi para jugar con ésta librería gráfica. Lo primero que tenemos que hacer es importar el fichero TLB (Borland type Library) a nuestro proyecto. La instalación de éstos tipos de ficheros están explicados en algunos de mis artículos, aunque aquí os lo vuelvo a explicar:

  • Importando el componente ctdraw32.tlb:
Una vez tenemos creado nuestro proyecto, solo tenemos que ir a Component -> Import Component, y una vez dentro del asistente, tenemos que importar una Type Library:

Ésta librería viene por defecto con la instalación de Vijeo Citect 7.0, y es la Graphic Library 6.1. Yo la tengo ubicada en la ruta C:\Program Files\Citect\CitectSCADA 7\Bin para mayor comodidad por tema del sistema operativo, ya que trabajo con windows vista y aún hay alguna cosa que se le resiste. Una vez generado el fichero GraphicsBuilder_TLB.pas, lo importamos a nuestro proyecto para poder manipular sus interfaces y automatizar las pantallas del Scada.

Ahora, podemos jugar con ésta librería y diseñar las pantallas como queramos utilizando nuestro propio canvas para ir manipulando las genies del SCADA. Aquí os dejo una muestra de una pantalla de la web de Schneider Automation, para que veáis como queda una pantalla típica:


Los que ya han tocado éste SCADA, saben que la implementación de sus objetos se hace mediante genies y supergenies. Pues bien, utilizando ésta librería podemos insertar un objeto en pantalla haciendo una llamada por su nombre a una genie y emplastarla en la pantalla en la ubicación que queramos. Luego podemos ir modificando sus posiciones e incluso utilizar pipes de conexión para simular un enlace físico. Mi objetivo es utilizar la POO mediante Delphi para crear enlaces inteligentes entre los objetos insertados en la pantalla. De ésta manera la aplicación tiene un mapa mental de cómo están ubicados los objetos y de ésta manera llegar a hacer diversas cosas con ellos (ya os lo explicaré más adelante).
  • Creación de la jerarquía de clases:
Como os he explicado en el inicio de mi artículo, he utilizado un patrón IoC (Inversion Of Control) porque he creado diversas clases para manejar la creación de éstos objetos. Utilizando éste patrón consigo que la llamada de los eventos de dibujo no los haga el propio componente, sino que delego ésta responsabilidad a un gestor que se encargará de realizar la llamada del objeto y de su pintado en pantalla. Es el mismo principio que el de Hollywood (No me llames tú, ya te llamaremos nosotros).

Aquí os dejo el primer diseño de la aplicación:


Mediante ésta configuración, podremos generar los diferentes objetos (motores, válvulas, etc) y asignarles propiedades (Nombre, Identificador, tag, etc). Luego el dispatcher se encarga de envolver los componentes del TLB (hace de Wrapper class). Luego toda la gestión de los objetos la hace el Painter que es el que se encarga de hacer las llamadas a los diferentes objetos y realizar el dibujado en la pantalla del Scada.

Luego mediante la llamada de éstos objetos, podemos crear las pantallas automáticamente:

procedure TMyApp.DrawItems(Sender: TObject);
var
    MyComObject: IGraphicsBuilder2;
    myCitectPainter: TCitectPainter;
    myElement : TCitectElement;
begin
    MyComObject := TCitectDispatcher.Create;
    myCitectPainter := TCitectPainter.Create(MyComObject, 'include','standard', 'normal');

    myElement := TCitectElement.create('motor_1_east', 'motors', Point(300, 300));
    myElement.AddParam('Tag', 'Test_Tag');
    myElement.InitLine := Point(myElement.position.x + 71, myElement.position.y + 18);

    myCitectPainter.Draw(myElement);
    myCitectPainter.InsertProperties(myElement);

    FreeAndNil(myElement);

    myCitectPainter.Save();

    FreeAndNil(myCitectPainter);
    MyComObject := nil;
end;


Aquí os dejo la versión beta de la aplicación ImportCitectObjectsTHDX.exe, descargarla y probarla para que veáis lo que hace sobre la aplicación. Mediante el botón de test, veréis que realiza la inserción de 2 motores, 2 válvulas y realiza la conexión entre ellos utilizando 2 pipes:

Como podéis ver, la codificación mediante mi jerarquía de clases difiere bastante de su actual codificación utilizando visual basic:

Dim GraphicsBuilder As IGraphicsBuilder2
Set GraphicsBuilder = New GraphicsBuilder.GraphicsBuilder
With GraphicsBuilder
 .Visible = True
 .PageNew "include", "standard", "normal", 0, True, True
 .LibraryObjectPlace "include", "motors", "motor_1_east", 0,
True
 .PositionAt 300, 500
 .LibraryObjectPutProperty "Tag", "Test_Tag"
 .DrawLine 100, 100, 300, 300
 .AttributeLineColour = 120
 .PageSaveAs "Example", "TEST"
 .PageClose
 .Visible = False
End With

Set GraphicsBuilder = Nothing


Utilizando mi aplicación, podremos realizar llamadas a diversos objetos, realizar la persisténcia de éstos para la siguiente ejecución de la aplicación, parametrizar los parámetros de las genies y realizar conexiones mediante un mapa mental. La siguiente codificación nos permite dibujar lo que véis en en dibujo anterior:

uses
    CitectElement, CitectPainter, CitectDispatcher, GraphicsBuilder_TLB;

procedure TMyApp.test1(Sender: TObject);
var
    MyComObject: IGraphicsBuilder2;
    myCitectPainter: TCitectPainter;
    myElement, myElement2, myElement3, myElement4: TCitectElement;
begin
    MyComObject := TCitectDispatcher.Create;

    myElement := TCitectElement.create('motor_1_east', 'motors', Point(300, 500));
    myElement.AddParam('Tag', 'Test_Tag');
    myElement.InitLine := Point(myElement.position.x + 71,myElement.position.y + 18);

    myElement2 := TCitectElement.create('motor_1_east', 'motors', Point(400, 500));
    myElement2.AddParam('Tag', 'Test_Tag2');
    myElement2.InitLine := Point(myElement2.position.x + 71,myElement2.position.y + 18);

    myElement3 := TCitectElement.create('valve1_e', 'valves', Point(378, 561));
    myElement3.AddParam('Tag', 'Test_Tag2');
    myElement3.EndLine := Point(myElement3.position.x + 5,myElement3.position.y);

    myElement4 := TCitectElement.create('valve1_e', 'valves', Point(478, 561));
    myElement4.AddParam('Tag', 'Test_Tag2');
    myElement4.EndLine := Point(myElement4.position.x + 5,myElement4.position.y);

    myCitectPainter := TCitectPainter.Create(MyComObject, 'include','standard', 'normal');

    myCitectPainter.Draw(myElement);
    myCitectPainter.InsertProperties(myElement);

    myCitectPainter.Draw(myElement2);
    myCitectPainter.InsertProperties(myElement2);

    myCitectPainter.Draw(myElement3);
    myCitectPainter.InsertProperties(myElement3);

    myCitectPainter.Draw(myElement4);
    myCitectPainter.InsertProperties(myElement4);

    myCitectPainter.DrawPipe(myElement, myElement3);
    myCitectPainter.DrawPipe(myElement2, myElement4);

    myCitectPainter.Save();

    FreeAndNil(myElement);
    FreeAndNil(myElement2);
    FreeAndNil(myCitectPainter);
    MyComObject := nil;

end;

Ahora, solo queda trabajar e ir mejorando la aplicación para llegar a tenen una aplicación que cumpla con las necesidades descritas y que permita una escalabilidad a la hora de ir añadiendo nuevas genies.

En mi opinión, la aplicación tiene mucho futuro, y hay mucho mercado que está utilizando éste SCADA para la visualización y control en las fábricas. De ésta manera, podemos automatizar la creación de nuestras pantallas simplemente configurando los objetos sobre un lienzo y luego lanzandolos hacia citect para que los dibuje.