HAL significa capa de abstracción de hardware. Al más alto nivel, es simplemente una manera de permitir que una serie de bloques de construcción sean cargados e interconectados para ensamblar un sistema complejo. El termino hardware es porque HAL fue diseñado originalmente para que fuese fácil configurar LinuxCNC para una amplia variedad de dispositivos de hardware. Mucho de los bloques de construcción son controladores de dispositivos hardware. Sin embargo, HAL puede hacer más que configurar controladores hardware.

1. HAL se basa en técnicas de diseño de sistemas tradicionales

HAL se basa en los mismos principios que se utilizan para diseñar circuitos y sistemas hardware, por lo que es útil examinar primero esos principios.

Cualquier sistema (incluida una máquina CNC, consiste en componentes interconectados. Para una máquina CNC, esos componentes podrían ser el controlador principal, servoamplificadores o drivers de pasos, motores, codificadores, interruptores de límite, volantes con pulsadores (los populares MPG), quizás un VFD para el husillo, un PLC para manejar un cambiador de herramientas, etc. El creador de la máquina debe seleccionar, montar y conectar estas piezas para formar un sistema completo.

HAL Circuit Concept
Figura 1. Concepto HAL - Conexiones como en un circuito electrico.

La figura se transcribe a codigo HAL de esta manera:

net signal-blue    component.0.pin1-in      component.1.pin1-out
net signal-red     component.0.pin3-out     component.1.pin3-in     component.1.pin4-in

1.1. Selección de componentes

El constructor de una máquina no necesita preocuparse de cómo funciona cada componente individualmente. Se tratan como cajas negras. Durante la etapa de diseño, se decide qué componentes se usarán: steppers o servos, que marca de servo-amplificador, qué tipo de interruptores de límite y cuántos, etc. Las decisiones del integrador sobre qué componentes específicos usar se basaran en lo que hace ese componente y las especificaciones suministradas por el fabricante del mismo. El tamaño de un motor y la carga que debe mover afectará a la elección del amplificador necesario para manejarlo. La elección del amplificador puede afectar al tipo de retroalimentación necesario y a las señales de velocidad o posición que deben enviarse al propio amplificador desde el controlador.

De igual forma, en el mundo HAL el integrador debe decidir qué componentes HAL son necesarios. Por lo general, cada tarjeta de interfaz requerirá un controlador. Pueden ser necesarios componentes adicionales para la generación de pulsos de pasos por software, funcionalidad PLC, y una amplia variedad de otras tareas.

1.2. Diseño de interconexiones

El diseñador de un sistema hardware no solo selecciona los componentes; también decide cómo interconectarlos. Cada caja negra tiene terminales, quizás solo dos como en un simple interruptor, o docenas para una unidad servo o un PLC. Los componentes necesitan estar interconectados. Los motores se conectan a los servo-amplificadores, los interruptores de límite se conectan al controlador, y así sucesivamente. Conforme el constructor de la máquina trabaja en el diseño, crea un diagrama de cableado completo que muestra cómo deben estar interconectados todos los componentes.

En HAL, los cables son las "señales". Cuando se usa HAL, los componentes software están interconectados por señales. El diseñador debe decidir qué señales son necesarias y como deben conectarse.

1.3. Implementación

Una vez que se completa el diagrama de cableado, es hora de construir la máquina. Las piezas deben ser adquiridas y montadas, y luego son interconectadas de acuerdo con el diagrama de cableado. En un sistema físico, cada interconexión es una trozo de cable, con unas caracteristicas determinadas, que deben conectarse a los terminales apropiados.

HAL proporciona una serie de herramientas para ayudar a construir un sistema HAL. Algunas de las herramientas le permiten conectar (o desconectar) un solo cable. Otras herramientas le permiten guardar una lista completa de todos los componentes, cables y otra información sobre el sistema, para que pueda ser reconstruido con un solo comando.

1.4. Pruebas

Muy pocas máquinas funcionan bien la primera vez. Mientras hace las pruebas pertinentes, el constructor puede usar un tester para ver si un interruptor de límite está funcionando o para medir la tensión de CC que va a un servomotor. Puede conectar un osciloscopio para verificar la sintonización de un driver, o para buscar ruido electrico. Puede encontrar un problema que requiera cambios en el diagrama de cableado; tal vez un componente debe estar conectado de manera diferente o ser reemplazado con otro completamente diferente.

HAL proporciona los equivalentes software de un voltímetro, un osciloscopio, un generador de señales y otras herramientas necesarias para probar y ajustar un sistema. Los mismos comandos utilizados para construir el sistema se pueden usar para hacer cambios según sea necesario.

1.5. Resumen

Este documento está dirigido a personas que ya saben cómo hacer este tipo de integración de sistemas hardware, pero que no saben cómo conectar el hardware a LinuxCNC. Vea la sección Ejemplo de Arranque remoto en la documentación de Ejemplos UI HAL.

Ejemplo de inicio remoto

El diseño de hardware tradicional, como se ha descrito arriba, termina en el limite del control principal. Fuera del control (el pc) hay un grupo relativamente simple de cajas, conectadas entre sí para hacer lo que se ha previsto que hagan. En el interior (el pc), el control es un gran misterio; una enorme caja negra que esperamos funcione.

HAL extiende este método de diseño de hardware tradicional al interior de la gran caja negra. Hace de los controladores de dispositivos, e incluso algunas partes internas del controlador, cajas negras más pequeñas que se pueden interconectar, e incluso reemplazar al igual que el hardware externo. HAL permite un diagrama de cableado del sistema que mostrará parte del controlador interno, en lugar de una gran caja negra. Y lo más importante; permite que el integrador pruebe y modifique el controlador utilizando los mismos métodos que usaría en el resto del hardware.

Para la mayoría de los integradores son familiares términos como motores, amplificadores y codificadores. Cuando hablamos de usar ocho conductores extraflexibles de cable blindado para conectar un codificador a la placa de entrada del servo en la computadora, el lector comprende de inmediato lo que es y le lleva a preguntas del tipo ¿qué tipo de conectores necesitaré en cada extremo?. El mismo tipo de pensamiento es esencial para HAL, pero ese hilo de pensamiento específico puede tardar un poco en ponerse en marcha. Usando HAL, las palabras pueden parecer un poco extrañas al principio, pero el concepto de trabajar desde una conexión a la siguiente es el mismo.

Esta idea de extender el diagrama de cableado al interior del controlador es la adoptada por HAL. Si se siente cómodo con la idea de interconectar cajas negras de hardware, es probable que tenga pocos problemas al utilizar HAL para interconectar cajas negras software.

2. Conceptos HAL

Esta sección es un glosario que define los términos clave HAL, aunque es un poco diferente de un glosario tradicional porque estos términos no estan ordenados alfabéticamente sino por su relación o flujo dentro de la manera de hacer las cosas con HAL.

Componente

Cuando hablamos de diseño de hardware, nos referimos a las piezas individuales como partes, bloques de construcción, cajas negras, etc. El equivalente HAL es un componente o componente HAL. (Esta documento utiliza componente HAL cuando es posible que haya confusión con otros tipos de componentes, pero normalmente solo usa la palabra componente.) Un componente HAL es una pieza de software con entradas, salidas y comportamiento definido, que se puede instalar e interconectar según sea necesario.

Parámetro

Muchos componentes de hardware tienen mandos de ajustes que no están conectados a ningún otro componente, pero que deben tener alguna forma de acceso. Por ejemplo, los servoamplificadores a menudo tienen potenciometros, para permitir el afinado de su ajuste, y puntos de prueba donde puede ser conectado un medidor u osciloscopio para ver los resultados del ajuste. Los componentes HAL también pueden tener tales cosas, que se conocen como parámetros. Hay dos tipos de parámetros: los parámetros de entrada son equivalentes a potenciometros; son valores que pueden ser ajustados por el usuario, y permanecen fijos si no son ajustados de nuevo. Los parámetros de salida no pueden ser ajustados por el usuario; son equivalente a los puntos de prueba que permiten monitorizar las señales internas.

Pin

Los componentes hardware tienen terminales que se utilizan para interconectarlos. El equivalente HAL es un "pin" o "pin HAL" (se usara pin HAL cuando sea necesario para evitar confusiones). Todos los pines HAL tienen nombre y esos nombres de pines se usan para interconectarlos. Los pines HAL son entidades de software que existen solo dentro de la computadora.

Pin fisico

Muchos dispositivos de E/S tienen pines físicos reales o terminales que se conectan a hardware externo. Por ejemplo, los pines del conector de puerto paralelo. Para evitar confusiones, estos se conocen como Pines físicos. Son esas cosas que se "enchufan" en el mundo real.

Señal

En una máquina física, los terminales reales de los componentes de hardware están interconectados por cables. El equivalente HAL de un cable es una señal o señal HAL. Las señales HAL conectan los pines HAL según lo requiera el constructor de la máquina. Las señales HAL pueden ser desconectadas y reconectadas a voluntad (incluso cuando la máquina está funcionando).

Tipo

Cuando se usa hardware real, no se conectaría una salida de relé de 24 volt a una entrada analógica +/-10V de un servoamplificador. Los pines HAL tienen las mismas restricciones, que se basan en su tipo. Tanto los pines como las señales tienen tipos, y las señales solo se pueden conectar a pines del mismo tipo. Actualmente hay 4 tipos, que son los siguientes:

  • bit - un único valor, VERDADERO/FALSO o ENCENDIDO/APAGADO o 1/0

  • float - un valor de punto flotante de 64 bits, con aproximadamente 53 bits de resolución y más de 1000 bits de rango dinámico.

  • u32 - un entero sin signo de 32 bits, los valores legales son de 0 a 4.294.967.295

  • s32 - un entero de 32 bits con signo, los valores legales son de -2.147.483.647 a +2.147.483.647

Función

Los componentes de hardware reales tienden a actuar de inmediato ante una entrada. Por ejemplo, si el voltaje de entrada a un servoamplificador cambia, la salida también cambia automáticamente. Sin embargo, los componentes de software no pueden actuar "automáticamente". Cada componente tiene un código específico que se debe ejecutar para hacer lo que ese componente se supone debe hacer. En algunos casos, ese código simplemente se ejecuta como parte del componente. Por otra parte, en la mayoría de los casos, especialmente en componentes en tiempo real, el código debe ejecutarse en una secuencia específica y en intervalos específicos. Por ejemplo, las entradas deben leerse antes de realizar los cálculos con los datos de entrada, y las salidas no deben escribirse hasta que los cálculos esten hechos. En estos casos, el código está disponible para el sistema en la forma de una o más funciones. Cada función es un bloque de código que realiza una acción específica. El integrador de sistema puede usar hilos para programar una serie de funciones que serán ejecutadas en un orden particular y en intervalos de tiempo específicos.

Hilo

Un hilo es una lista de funciones que se ejecuta en intervalos específicos como parte de una tarea en tiempo real. Cuando un hilo es creado por primera vez, tiene un intervalo de tiempo específico (período), pero no tiene funciones. Las funciones se pueden agregar al hilo, y se ejecutarán en orden cada vez que se ejecuta el hilo.

Como ejemplo, supongamos que tenemos un componente de puerto paralelo llamado hal_parport. Ese componente define uno o más pines HAL para cada pin físico. Los pines se describen en la sección de documentación de ese componente: sus nombres, cómo se relaciona cada pin HAL con pines físicos, si están invertidos, etc. Eso por si solo no hace que los datos de los pines HAL lleguen a los pines físicos. Se necesita código para hacer eso, y ahí es donde entran en escena las funciones. El componente hal_parport necesita al menos dos funciones: una para leer los pines de entrada física y actualizar los pines HAL, y otra para tomar datos de los pines HAL y escribirlo en pines de salida física. Ambas funciones son parte del driver parport.

3. Componentes HAL

Cada componente HAL es una pieza de software con entradas, salidas y comportamiento bien definidos, que se pueden instalar e interconectar como sea necesario. Esta sección enumera algunos de los componentes disponibles y una breve descripción de lo que hace cada uno. Los detalles completos para cada componente estan disponible más adelante en este documento.

3.1. Programas externos con "enganches" HAL

Nota
Un enganche, o "hook", es la parte de codigo de un programa destinada a interceptar llamadas de función, mensajes o eventos pasados entre componentes de software.
motion

Un módulo en tiempo real que acepta mensajes NML
[El Language Neutral de Mensajes NML proporciona un mecanismo para el manejo de múltiples tipos de mensajes en el mismo búfer, así como simplifica la interfaz para codificar y decodificar memorias intermedias en formato neutral y su mecanismo de configuración.]
de comandos de movimiento e interactúa con HAL

iocontrol

Un módulo de espacio de usuario que acepta comandos de E/S NML e interactúa con HAL

classicladder

Un PLC que usa HAL para todas sus E/S

halui

Un programa de espacio de usuario que interactúa con HAL y envía comandos NML, que está destinado a funcionar como una interfaz de usuario completa utilizando botones e interruptores externos.

3.2. Componentes internos

stepgen

Generador software de impulsos de pasos, con lazo de posición. Ver la sección stepgen

encoder

Contador codificador basado en software. Ver la sección encoder

pid

Bucle de control Proporcional/Integral/Derivativo. Ver la sección pid

siggen

Un generador de ondas seno/coseno/triángular/cuadrada para pruebas. Ver la sección siggen

supply

una fuente simple para pruebas

3.3. Controladores de hardware

hal_ax5214h

Un controlador para la tarjeta de E/S digital Axiom Measurement & Control AX5241H

hal_gm

Placa General Mechatronics GM6-PCI

hal_m5i20

Placa Mesa Electronics 5i20

hal_motenc

Placa Vital Systems MOTENC-100

hal_parport

Puerto paralelo de PC.

hal_ppmc

Familia de controladores de la familia Pico (PPMC, USC y UPC)

hal_stg

Tarjeta Servo To Go (versión 1 y 2)

hal_vti

Controlador Vigilant Technologies PCI ENCDAC-4

3.4. Herramientas y utilidades

Halcmd

Herramienta de línea de comandos para configuración y ajuste. Ver sección halcmd

halgui

Herramienta GUI para configuración y ajuste (aún no implementada).

halmeter

Un práctico multímetro para señales HAL. Ver la sección halmeter.

halscope

Un osciloscopio de almacenamiento digital completo para señales HAL. Ver la sección halscope.

Cada uno de estos bloques de construcción se describe en detalle en capítulos posteriores.

4. Problemas de sincronización en HAL

A diferencia de los modelos de cableado físico entre cajas negras en el que se dijo que está basado HAL, la simple conexion de dos pines con una señal HAL queda aun lejos de la acción del caso físico.

La lógica de relés consiste en relés conectados entre sí, y cuando el contacto se abre o se cierra, la corriente fluye (o se detiene) inmediatamente. Otras bobinas pueden cambiar de estado, etc., y todo simplemente ocurre. Pero un PLC de lógica de escalera no funciona de esa manera. Usualmente, en un solo pase a través de la escalera, cada escalón se evalúa en el orden en que aparece, y solo una vez por pase. Un ejemplo perfecto es una escalera de un solo escalón, con un contacto NC en serie con una bobina. El contacto y la bobina pertenecen al mismo rele

Si se tratara de un relé convencional, tan pronto como se active la bobina, los contactos comienzan a abrirse y a desenergizarlo. Eso significa que los contactos cerraran de nuevo, etc, etc. El rele se convierte en un zumbador.

Con un PLC, si la bobina está DESACTIVADA y el contacto está cerrado cuando el PLC comienza a evaluar el peldaño, cuando termina ese pase, la bobina estára encendida. El hecho de que al encender la bobina se abre el contacto alimentado es ignorado hasta el próximo pase. En la siguiente pasada, el PLC ve que el el contacto está abierto y desenergiza la bobina. Entonces el rele sigue cambiando rápidamente entre encendido y apagado, pero a un ritmo determinado por la frecuencia con que el PLC evalúa el escalon.

En HAL, la función es el código que evalúa el(los) escalón(es). De hecho, la versión en tiempo real HAL de ClassicLadder exporta una función que hace exactamente eso. Por otra parte, un hilo es lo que permite la ejecución de la función en intervalos de tiempo específicos. Al igual que puede elegir tener un PLC evalúando todos sus escalones cada 10 ms, o cada segundo, puede definir hilos HAL con diferentes períodos.

Lo que distingue a un hilo de otro no es lo que el hilo hace - eso está determinado por las funciones que son conectadas a el. La distinción real es simplemente la frecuencia con la que un hilo corre.

En LinuxCNC, puede tener un hilo de 50 us y un hilo de 1 ms. Estos se crearían en base a BASE_PERIOD y SERVO_PERIOD; los tiempos exactos dependeran de los valores en su archivo ini.

El siguiente paso es decidir qué debe hacer cada hilo. Algunas de estas decisiones son las mismas en (casi) cualquier sistema LinuxCNC - Por ejemplo, la funcion motion-command-handler siempre se agrega al hilo servo.

Otras conexiones seran hechas por el integrador. Estas pueden incluir conectar las funciones de lectura de codificador de un controlador STG y las de escritura de un DAC al hilo servo, o enganchar la función stepgen al hilo base, junto con con la(s) función(es) parport para escribir pasos en el puerto paralelo.