1. TWOPASS

Desde LinuxCNC 2.5 se admite el procesamiento TWOPASS de archivos de configuración hal. Esto puede ayudar a la modularización y legibilidad de los archivos hal. (Los archivos Hal se especifican en un archivo ini en la sección HAL como [HAL]HALFILE = nombre de archivo).

Normalmente, un conjunto de uno o más archivos de configuración hal deben usar una única línea, en uno de los archivos, para cargar un módulo de kernel que puede manejar múltiples instancias de un componente. Por ejemplo, si usted usa tres componentes AND de dos entradas (and2) en tres lugares diferentes en su configuración, bastará una sola línea en algún lugar para especificarlo:

loadrt and2 count=3

resultando los componentes and2.0, and2.1 y and2.2.

Las configuraciones son más legibles si especifican con names=opción en aquellos componentes donde se admita, por ejemplo:

loadrt and2 names=aa,ab,ac

dando como resultado las instancias de componente aa, ab y ac.

Al realizar un seguimiento de los componentes y sus nombres, puede darse un problema de mantenimiento cuando agrega (o elimina) un componente. Debe encontrar y actualizar la directiva loadrt única aplicable al componente.

El procesamiento TWOPASS se habilita al incluir un parámetro de archivo ini en la sección [HAL]:

[HAL]

TWOPASS = cualquier-cadena

Donde "cualquier-cadena" puede ser cualquier cadena que no sea nula. Con esta configuración, puede tener múltiples especificaciones como:

loadrt and2 names = aa
...
loadrt and2 names = ab, ac
...
loadrt and2 names = ad

Estos comandos pueden aparecer en HALFILES diferentes. Los HALFILES se procesan en el orden de su aparición en el archivo ini.

La opción TWOPASS se puede especificar con opciones para ampliar la salida para depuración (verbose) o para evitar la eliminación de archivos temporales (nodelete). Las opciones están separadas por comas.

Ejemplo:

[HAL]

TWOPASS = on, verbose, nodelete

Con el procesamiento de TWOPASS, todos los [HAL]HALFILES se leen primero y se acumulan las apariciones múltiples de las directivas loadrt para cada módulo. No se ejecutan comandos hal en esta pasada inicial.

Después de la pasada inicial, los módulos se cargan automáticamente con un número de instancias igual al número total, resultado de la opcion count =, o con todos los nombres individuales especificados al usar la opcion names =.

Luego se hace una segunda pasada para ejecutar todas las demás instrucciones HAL especificadas en los HALFILES. Los comandos addf que asocian las funciones de un componente con los hilos de ejecución, son ejecutadas en el orden de aparición con otros comandos durante esta segunda pasada.

Si bien puede usar las opciones count = o names =, éstas son mutuamente excluyentes - solo se puede especificar un tipo para un módulo dado.

El procesamiento TWOPASS es más efectivo cuando se usan opciones names =. Esta opción le permite proporcionar nombres únicos que son mnemotécnicos o relevantes para la configuración. Por ejemplo, si utiliza un componente derivativo para estimar la velocidades y aceleraciones en cada coordenada (x, y, z), usando el método count = dará nombres de componentes poco significativos, como ddt.0, ddt.1, ddt.2, etc.

Alternativamente, usando los names =, como:

loadrt dd names = xvel, yvel, zvel
...
loadrt dd names = xacel, yacel, zacel

resultan componentes llamados xvel, yvel, zvel, xacel, yacel, zacel.

Muchos componentes suministrados con la distribución se crean con una utilidad de creacion de componentes y soportan la opción names =. Estos incluyen los componentes lógicos comunes que son el "pegamento" de muchas configuraciones hal.

Los componentes creados por el usuario que usan la utilidad soportan automáticamente la opción names =. Además de los componentes generados con la utilidad, muchos otros componentes admiten la opción names =, entre ellos:at_pid, encoder, encoder_ratio, pid, siggen, y sim_encoder.

El procesamiento en dos pasos ocurre antes de la carga de la interfaz gráfica de usuario. Cuando se utiliza un [HAL]POSTGUI_HALFILE, es conveniente colocar todo las declaraciones loadrt para los componentes necesarios en un halfile que se carge con anterioridad.

Ejemplo de una sección HAL cuando se usa un POSTGUI_HALFILE:

[HAL]

TWOPASS = on
HALFILE = core_sim.hal
HALFILE = sim_spindle_encoder.hal
HALFILE = axis_manualtoolchange.hal
HALFILE = simulated_home.hal
HALFILE = load_for_postgui.hal <- líneas loadrt para componentes en postgui.hal

POSTGUI_HALFILE = postgui.hal
HALUI = halui

2. Excluyendo archivos .hal

El procesamiento TWOPASS convierte los archivos .hal en archivos .tcl equivalentes y utiliza haltcl para encontrar los comandos loadrt y addf para acumularlos y consolidar su uso. Se esperan parámetros de loadrt que se ajustan a los parámetros nombres = (o count =) aceptados por el generador de componentes HAL (halcompile). Los elementos de parámetros más complejos incluidos en componentes hal especializados
no puede ser manejado adecuadamente.

Un archivo .hal puede ser excluido del procesamiento TWOPASS incluyendo una línea de comentarios especial en cualquier lugar del archivo. La línea de comentario debe comenzar con la cadena: #NOTWOPASS. Los archivos especificados con este comentario son tratados por halcmd usando las opciones -k (seguir adelante en caso de fallo) y -v (verbose).

Esta disposición de exclusión se puede utilizar para aislar problemas o para cargar cualquier componente hal que no requiere o no se beneficia del procesamiento TWOPASS que maneja múltiples instancias de componentes loadrt.

Ejemplo de archivo .hal excluido:

$ cat twopass_excluded.hal
# El siguiente 'comentario mágico' hace que este archivo
# sea excluido del procesamiento de dos fases:
# NOTWOPASS

loadrt mycomponent parm1="abc def" parm2=ghi
show pin mycomponent
Nota
El caso y los espacios en blanco dentro de # NOTWOPASS se ignoran.

3. Post GUI

Algunas GUIs soportan halfiles que se procesan después de que se inicie la GUI, permitiendo conectar los pines hal que son creados por la propia GUI. Cuando se utiliza un halfile postgui con el procesamiento TWOPASS, incluya todos los elementos loadrt para los componentes agregados por los halfiles postgui en un halfile separado que se procese antes que la GUI. Los comandos addf también pueden ser incluido en el archivo. Ejemplo:

[HAL]
HALFILE = file_1.hal
...
HALFILE = file_n.hal
HALFILE = file_with_all_loads_for_postgui.hal
...
POSTGUI_HALFILE = the_postgui_file.hal

4. Ejemplos

Se incluyen ejemplos de uso de TWOPASS para simulador en los directorios:

configs/sim/axis/twopass/
configs/sim/axis/simtcl/