Introduction: Programar PAC Opto22 Usando FORTH En Linux
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 crearonEl archivo .crn2 contiene los nombres de las "tareas" que conforman un
programa, las variables que se utilizan, y la asignacion de pines I/OEl 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