Introduction: Programar PAC Opto22 Usando FORTH En Linux

About: Proyectos, articulos, y opiniones tecnologicas para el hogar y la industria

CONTROLADORES INDUSTRIALES PAC,PLC Y LINUX

This article is also available in English clicking here


El soporte para linux que se ofrece a hardware industrial tipo PAC y/o PLC, por lo menos en el caso de los fabricantes mas grandes y conocidos es practicamente nulo. Lo mas ironico del caso es que si bien algunos fabricantes han adoptado estandares desarrollados en el mundo de los computadores como procesadores x86 yARM (Arquitecturas bastante amigables con Linux) las herramientas de desarrollo y gestion de estos siguen siendo para sistemas operativos Windows!.

Existen todo tipo de razones (comerciales, tecnicas, ideologicas) para que esta situacion se siga perpetuando. La mayoria de desarrollos que existen para Linux se centran en drivers y protocolos de comunicacion desarrollados por terceros, usalmente para protocolos abiertos y bien documentados.

Para mas informacion visita: Automatizanos.com

Step 1: OPTO22, FORTH

OPTO22, FORTH


Cuando se estaba creando una pequeña implementacion del protocolo RFB en un controlador PAC Opto22, durante una sesion de wireshark dejada abierta intencionalmente por descuido cuando se cargaba un programa nuevo, se podian percibir cadenas de texto claras, que probablemente corresponderian a comandos y/o instrucciones del programa descargado en si.

Indagando un poco mas en la herramienta para cargar programas, se descubre que hay una opcion "cargar archivo FORTH". Al hacer una busqueda en internet con los terminos "Opto22 y FORTH" se encontraron algunos papiros documentos antiguos, escaneados correspondientes a un manual para programar unos contoladores LC2/LC4 ya bastante desactualizados, mediante FORT.

Teniendo este documento como base, se prosigue al siguiente paso natural: Abrir todos los archivos que genera la aplicacion mediante un editor HEX y buscar algun indicio de comandos FORTH en ellos. Los resultados del analisis fueron los siguientes:

  • La aplicacion del fabricante, genera varios tipos de archivo (configuraciones, inicializaciones, codigo del programa)

  • Todos los archivos estaban en formato texto claro

  • El lenguaje usado no es estrictamente FORTH

Si bien, descubrir que no se utiliza en su totalidad un lengua Estandar para programacion del PAC, el descubrir que los archivos estan en texto claro, es una buena notica para la creacion de programas para estos dispositivos, desde otros sistemas operativos no soportados por el fabricante como podrian ser Linux, Mac, Etc.

Step 2: DESCARGANDO EL PROGRAMA.

DESCARGANDO EL PROGRAMA.


El primer paso para llegar a una aproximacion alternativa a las herramientas del fabricante, es ver como se envia una programa ya creado. Se uso un simple programa como ejemplo y se analizo la forma en que le aplicacion nativa lo enviaba al PAC. Mediante wireshark y realizando diferentes programas de ejemplo, se llego a la conclusion que la secuencia de eventos que realiza la aplicacion que descarga un programa es la siguiente:

  • Envio de comandos de "handsake"

  • Envio de comando de bloqueo de sesion (probablemente para que otra aplicacion no pueda acceder al PAC mientras se descarga)

  • Envio de archivo .crn1 linea por linea

  • Envio de archivo .crn2 linea por linea

  • Envio de archivos de tareas .ccd linea por linea

  • Envio de archivo .crn3 linea por linea

  • Envio de DATESTAMP

  • Envio de TIMESTAMP

  • Envio de comandos de "finales"

  • Envio de comando de desbloqueo de sesion

Ademas, existen otra serie de comandos adicionales, como por ejemplo, traer informacion actual del PAC ( memoria disponible, errores, etc), detener programa, iniciar programa, borrar programa, etc, que tambien debieron ser investigados y replicados.

Se desarrollo una aplicacion en python llamada O22termesp, la cual permite enviar un programa al PAC, y demas comandos mencionados anteriormente.

Step 3: ESTRUCTURA GENERAL DE UN PROGRAMA

ESTRUCTURA GENERAL DE UN PROGRAMA


Ya teniendo una herramienta basica para gestion del PAC, se procedio a indagar un poco mas en como es la estructura de un programa para PAC de Opto22.La informacion obtenida fue la siguiente:

  • Los archivos con extension .crn1, .crn2, .crn3, deben tener todos como
    nombre como se "bautizo" el programa. * El archivo .crn1 contiene una linea : FILENAME ." PNAME " ; donde PNAME es el nombre con que se "bautizo el programa. Las otras lineas de este archivo no cambiaron nunca con diferentes programas que se crearon

  • El archivo .crn2 contiene los nombres de las "tareas" que conforman un
    programa, las variables que se utilizan, y la asignacion de pines I/O

  • El archvo .crn3 inicializa las tareas, las variables y el hardware de I/0

  • Debera existir un archivo con extension .ccd para cada una de las tareas
    que conforman el programa, cuyo nombre es el que aparece en el archivo .crn2

Se desarrollo un programa ejemplo "PARPADEO", que cuenta con dos tareas: una enciende y apaga una salida digital e incrementa una variable contador, la otra tarea revisa si la variable es divisible exactamente entre 5 (modulo 5) y enciende el led cuando esta condicion es valida, de lo contrario, lo apagara.


PARPADEO.crn1

En este archivo puede notarse la linea de codigo donde esta el nombre del programa, " PARPADEO". Las demas lineas parecen algun tipo de asignacion de espacios de memoria para el hardware, variables e I/O. No se notaron cambios en estas lineas para diferentes programas hechos y analizados.

_END NEW $$$.RUN

: FILENAME ." PARPADEO " ;

1 0 $VAR *_HSV_SEMA

1024 0 $VAR *_HSV_TEMP

200 0 $VAR *_HSV_INIT_IO

0 IVAR ^_HNV_INIT_IO

PARPADEO.crn2

En este archivo se encontraron tres cosas:

- Tareas que conforman el programa: Powerup, parpadeolento, _INI_IO. Powerup es una tarea que viene por defecto, no puede ser renombrada, ni borrada. parpadeolento fue una tarea creada en el programa e _INIT_IO probablemente es una tarea interna encargada de inicializar el hardware automaticamente al iniciar un programa

- Variables que se utilizaron en el programa: variablecontador y variablemodulo

- Alias de los pines del hardware a nombres mas amigables en el programa, en este caso los pines digitales 0 y 7 fueron asignados a los alias: SALIDA_DIGITAL_1 y SALIDA_DIGITAL_4

0 TASK &_INIT_IO

0 TASK &Powerup

0 TASK &parpadeolento

0 IVAR ^variablecontador

0 IVAR ^variablemodulo

$0000000000000000.. 32769 1.000000 0.010000 0.000000 2001 $7F000001 0 MBOARD %RACK_PROPIO SPOINT 0.0 OUTPUT 0 %RACK_PROPIO

0 POINT ~SALIDA_DIGITAL_1

SPOINT 0.0 OUTPUT 7 %RACK_PROPIO

0 POINT ~SALIDA_DIGITAL_4

PARPADEO.crn3

Este archivo es un poco mas largo. Al parecer en la parte inicial se crean se agrupan las tareas, los diferentes tipos de variables, en arreglos y hacia el final se puede ver la inicializacion de las variables variablecontador y variablemodulo a 0. Tambien puede notarse que por defecto los pines digitales estan configurados como entrada "0" , y los que seran usados como salida debera escribirse un "1" ($..0081 pines 0 y 7)

: W_INIT_IO

CONFIG_PORTS

$0000000000000081.. %RACK_PROPIO ENABLES!

" %RACK_PROPIO (1/1)" *_HSV_INIT_IO $MOVE 0 ^_HNV_INIT_IO @!

%RACK_PROPIO ENABLE

" Initializing variables" *_HSV_INIT_IO $MOVE

0 ^variablecontador @!

0 ^variablemodulo @!

" " *_HSV_INIT_IO $MOVE

Archivos de tareas (powerup.ccd, parpadeo.ccd)

En estos archivos se encuentra el codigo del programa, para cada una de las tareas programadas. En cada archivo se encuentra dos tipos de cosas, hacia el final pueden verse el listado de cada uno de los "bloques" de codigo:

T: T0

DUMMY

0_0

0_1

0_3

0_5

0_7

0_10

T;

&Powerup ' T0 SETTASK

Cada uno de estos "bloques" de codigo se encuentra numerado a_b donde a, es el numero de la tarea y b el "id" de dicho bloque de codigo dentro de esta tarea. Estos numeros de bloques corresponden con los numeros de los bloques mostrados en la aplicacion nativa y probablemente son usados para realizar tareas de depuracion paso a paso por bloques. Un ejemplo de un bloque de codigo es el siguiente

: 1_1

TRUE

1 LINE.NUM

^variablemodulo @@

1 <

LAND

IF -4 ELSE -3 THEN JUMP ;

Puede notarse al comienzo la numeracion del bloque antecedida por : (dos puntos). Luego se ve la instruccion LINE.NUM antecedida por un numero de linea. Estos numeros de linea corresponde con los numeros de linea de la aplicacion nativa y probablemente son usados para realizar tareas de depuracion paso a paso por lineas.

Puede notarse que parte del codigo se asemeja a FORTH en donde primero se nombran los operandos y finalmente se opera con ellos.

El bloque finaliza siempre con una instruccion JUMP precedida de ; (punto y coma). Estos JUMP no son saltos absolutos, sino relativos.

Step 4: CONCLUSIONES:

CONCLUSIONES:

  • Se demostro que posible realizar una aplicacion para programar PAC Opto22 en sistemas operativos alternativos!

  • El fabricante no utilizo un unico lenguaje estandar, para generar sus archivos de estrategia, lo que hace un poco mas tediosa la tarea de crear una herramienta alternativa

  • Se puede partir de un archivo basico como esqueleto y modificrlo poco a poco para crear aplicaciones mas complejas

  • Aun hay mucha informacion faltante!

Para mas informacion visita: Automatizanos.com