Los códigos O proporcionan control de flujo en programas NC. Cada bloque tiene un número asociado, que es el número utilizado después de O. Se debe tener cuidado para que coincidan adecuadamente los números O. Los códigos O usan la letra O no el número cero como el primer carácter en el número como O100 u o100.
1. Numeración
Los códigos O numerados deben tener un número único para cada subrutina, .Ejemplo de numeración
(el comienzo de o100)
o100 sub
(observe que el bloque if-endif usa un número diferente)
(el comienzo de o110)
o110 if [#2 GT 5]
(algún código aquí)
(el final de o110)
o110 endif
(un poco más de código aquí)
(el final de o100)
o100 endsub
2. Comentarios
No deben usarse comentarios en la misma línea que la palabra O, ya que el comportamiento puede cambiar en el futuro.
El comportamiento es indefinido si:
-
Se utiliza el mismo número para más de un bloque.
-
Se usan otras palabras en una línea con una palabra O
-
Se usan comentarios en una línea con una palabra O
Nota
|
El uso de minúsculas o hace que sea más fácil distinguir de un 0 que podría haber sido mal escrito. Por ejemplo, que no es un 0 es más fácil de ver en o100 que en O100. |
3. Subrutinas
Las subrutinas comienzan en Onnn sub y terminan en Onnn endsub. Las líneas entre Onnn sub y Onnn endsub no se ejecutan hasta que se llama a la subrutina con Onnn call. Cada subrutina debe usar un número único.
Ejemplo de subrutina
o100 sub
G53 G0 X0 Y0 Z0 (rápido al home de la máquina)
o100 endsub
(se llama la subrutina)
o100 call
M2
Dentro de una subrutina, se puede ejecutar O- return. Esto vuelve al código de llamada inmediatamente, como si se encontrara O-endsub.
o100 sub
(prueba si el parámetro #2 es mayor que 5)
o110 if [#2 GT 5]
(regrese al inicio de la subrutina si la prueba es verdadera)
o100 return
o110 endif
(esto solo se ejecuta si el parámetro #2 no es mayor que 5)
(DEBUG, el parámetro 2 es [#1])
o100 endsub
Consulte las secciones operadores binarios y parámetros para obtener más información.
O- Call toma hasta 30 argumentos opcionales, que se pasan a la subrutina como #1, #2, …, #N. Los parámetros de #N+1 a #30 tienen el mismo valor como en el contexto de llamada. Al regresar de la subrutina, los valores de los parámetros del 1 al 30 (independientemente del número de argumentos) serán restaurados a los valores que tenían antes de la llamada. Los parámetros #1 - #30 son locales a la subrutina.
Como 1 2 3 se analiza como el número 123, los parámetros deben estar entre corchetes. Lo siguiente llama a una subrutina con 3 argumentos:
o100 sub
(prueba si el parámetro #2 es mayor que 5)
o110 if [#2 GT 5]
(regresa al inicio de la subrutina si la prueba es verdadera)
o100 return
o110 endif
(esto solo se ejecuta si el parámetro #2 no es mayor que 5)
(DEBUG, el parámetro 1 es [#1])
(DEBUG, el parámetro 3 es [#3])
o100 endsub
o100 call [100] [2] [325]
Los cuerpos de subrutina no pueden estar anidados. Solo pueden llamarse después de ser definidos. Pueden ser llamados desde otras funciones, y pueden llamarse a sí mismos recursivamente si tiene sentido hacerlo. El maximo nivel de anidación de subrutinas es 10.
Las subrutinas pueden cambiar el valor de los parámetros por encima de #30 y esos cambios serán visible para el código de llamada. Las subrutinas también pueden cambiar el valor de parámetros globales con nombre.
3.1. Programas numerados al estilo Fanuc
Programas numerados (tanto principales como subprogramas), la llamada M98 y M99 devuelven códigos M, y sus respectivas diferencias semánticas son un alternativa a las subrutinas rs274ngc descritas anteriormente, proporcionadas para compatibilidad con Fanuc y otros controladores de máquina.
Los programas numerados están habilitados de manera predeterminada y pueden deshabilitarse
colocando DISABLE_FANUC_STYLE_SUB = 1
en la sección [RS274NGC]
del archivo .ini
.
Nota
|
Las definiciones y llamadas principales y subprogramas numerados difieren de rs274ngc tradicional tanto en sintaxis como en ejecución. Para reducir la posibilidad de confusión, el intérprete generará un error si las definiciones de un estilo se mezclan con las llamadas de otro. |
Ejemplo simple de subprograma numerado
o1 (Ejemplo 1) ; Programa principal 1, "Ejemplo 1"
M98 P100 ; Llama al subprograma 100
M30 ; Fin del programa principal
o100 ; Comienzo del subprograma 100
G53 G0 X0 Y0 Z0 ; Rápido a home máquina
M99 ; Regresar del subprograma 100
o1 (Título)
El bloque inicial opcional del programa principal le da al programa principal
el número 1
. Algunos controladores tratan un seguiente
comentario opcional entre paréntesis como título del programa, Ejemplo 1
en este ejemplo,
pero esto no tiene un significado especial en el intérprete rs274ngc.
M98 P- <L\->
Llama a un subprograma numerado. El bloque M98 P100
es análogo a la
sintaxis tradicional o100 call
, pero solo se puede usar para llamar a un
subprograma numerado definido con o100
…` M99`. Una palabra
opcional L- especifica un recuento de bucles.
M30
El programa principal debe terminarse con M02
o M30
(o M99
; consulte
abajo).
O-
Inicio de definición de subprogramaMarca el inicio de una definición de subprograma numerado. El bloque O100
es similar a o100 sub
, excepto que debe colocarse más adelante en el
archivo que el bloque de llamada M98 P100
.
M99
Return de la subrutina numeradaEl bloque M99
es análogo a la sintaxis tradicional` o100 endsub`,
pero solo puede terminar un programa numerado (o100
en este ejemplo),
y no puede terminar una subrutina que comience con sintaxis o100 sub
.
La llamada de subprograma M98
difiere de rs274ngc O call
en lo
siguiente:
-
El subprograma numerado debe seguir la llamada
M98
en el archivo de programa. El intérprete arrojará un error si el subprograma precede al bloque de llamada. -
Los parámetros
#1
,` #2`, …,#30
son globales y accesibles en subprogramas numerados, similares a los parámetros numerados más altos en llamadas de estilo tradicional. Modificaciones a estos parámetros dentro de un el subprograma son modificaciones globales y persistirán después del retorno de subprograma. -
Las llamadas
M98
a subprograma no tienen valor de retorno. -
Los bloques de llamadas del subprograma
M98
pueden contener una palabra L opcional especificando un recuento de repetición de bucle. Sin la palabra L, el subprograma se ejecutará solo una vez (equivalente aM98 L1
). Un bloqueM98 L0
no ejecutará el subprograma.
En casos raros, el código M99
puede usarse para terminar el programa principal,
donde indica un programa sin fin. Cuando el
el intérprete alcanza un M99
en el programa principal, saltará de nuevo al
comienzo del archivo y reanudara la ejecución en la primera línea.
Un ejemplo de un programa sin fin es en un ciclo de calentamiento de la máquina; una
bloque final de programa con eliminacion /M30
puede usarse para detener el ciclo
en un punto ordenado cuando el operador está listo.
O1 ; Programa principal 1
#1 = 0
(PRINT,X MAIN BEGIN: 1=#1)
M98 P100 L5 ; Llame al subprograma 100
(PRINT,X MAIN END: 1=#1)
M30 ; Fin del programa principal
O100 ; Subprograma 100
#1 = [#1 + 1]
M98 P200 L5 ; Llamada a subprograma 200
(PRINT,>> O100: #1)
M99 ; Return desde Subprograma 100
O200 ; Subprograma 200
#1 = [#1 + 0.01]
(PRINT,>>>> O200: #1)
M99 ; Return desde Subprograma 200
En este ejemplo, el parámetro #1
se inicializa a 0
. El subprograma
O100
se llama cinco veces en un bucle. Anidado dentro de cada llamada a
O100
, el subprograma O200
se llama cinco veces en un ciclo; 25 veces en
total.
Tenga en cuenta que el parámetro #1
es global. Al final del programa principal,
después de las actualizaciones dentro de O100
y` O200`, su valor será igual a 5.25
.
4. Bucles
El bucle while tiene dos estructuras: while/endwhile y do/while. En cada caso, el ciclo se cierra cuando la condición while se evalúa como falso. La diferencia es cuando se realiza la condición de prueba. El bucle do/while ejecuta el código en el bucle y luego verifica la condición de prueba. El bucle while/endwhile hace la prueba primero.
(dibuja una forma de diente de sierra)
G0 X1 Y0 (mover a la posición inicial)
#1 = 0 (asigne al parámetro # 1 el valor de 0)
F25 (establecer una velocidad de alimentación)
o101 while [#1 LT 10]
G1 X0
G1 Y[#1/10] X1
#1 = [#1+1] (incrementar el contador de prueba)
o101 endwhile
M2 (final del programa)
#1 = 0 (asigne al parámetro # 1 el valor de 0)
o100 do
(debug, parámetro 1 = #1)
o110 if [#1 EQ 2]
#1 = 3 (asigne el valor de 3 al parámetro #1)
(msg, #1 se le ha asignado el valor de 3)
o100 continue (saltar al inicio del bucle)
o110 endif
(algún código aquí)
#1 = [#1+1] (incrementar el contador de prueba)
o100 while [#1 LT 3]
(msg, bucle hecho!)
M2
Dentro de un ciclo while, O- break sale inmediatamente del ciclo, y O- continue salta inmediatamente a la próxima evaluación de la condición while. Si aún es cierta, el ciclo comienza nuevamente en la parte superior. Si es falsa, sale del bucle.
5. Condicionales
El condicional if consiste en un grupo de declaraciones con el mismo número o que comienzan con if y terminan con endif. Condiciones opcionales elseif y else puede estar entre el inicio if y el final endif.
Si el condicional if se evalúa como verdadero, entonces se ejecuta el grupo de declaraciones siguiendo al if hasta la siguiente línea condicional.
Si el condicional if se evalúa como falso, entonces las condiciones elseif son evaluadas en orden hasta que una evalúa como verdadera. Si la condición elseif es cierta entonces se ejecutan las declaraciones que siguen al elseif hasta el próximo condicional. Si ninguna de las condiciones if o elseif se evalúa como verdadera, entonces se ejecutan las declaraciones que siguen al else. Cuando una condición es evaluada como verdadero, no se evalúan más condiciones en el grupo.
(si el parámetro #31 es igual a 3, configure S2000)
o101 if [#31 EQ 3]
S2000
o101 endif
(si el parámetro #2 es mayor que 5, configure F100)
o102 if [#2 GT 5]
F100
o102 elseif [#2 LT 2]
(de lo contrario, si el parámetro #2 es menor que 2, configure F200)
F200
(de lo contrario, si el parámetro #2 es de 2 al 5, configure F150)
o102 else
F150
o102 endif
Se pueden probar varias condiciones mediante declaraciones elseif hasta que la ruta else finalmente se ejecuta si todas las condiciones anteriores son falsas:
(si el parámetro #2 es mayor que 5, configure F100)
O102 if [#2 GT 5]
F100
(de lo contrario, si el parámetro #2 es inferior a 2, configure F200)
O102 elseif [#2 LT 2]
F20
(el parámetro #2 está entre 2 y 5)
O102 else
F200
O102 endif
6. Repeat
repeat ejecutará las declaraciones dentro de repeat/endrepeat el número especificado de veces. El ejemplo muestra cómo puede fresar una serie diagonal de formas a partir de la presente posición.
(Fresar 5 formas diagonales)
G91 (modo incremental)
o103 repeat [5]
... (inserte el código de fresado aquí)
G0 X1 Y1 (movimiento diagonal a la siguiente posición)
o103 endrepeat
G90 (modo absoluto)
7. Indirección
El O-número puede ser dado por un parámetro y/o cálculo.
Ejemplo de Indirección
o[#101+2] call
Para obtener más información sobre los valores, consulte las siguientes secciones
8. Llamando a archivos
Para llamar a un archivo separado con una subrutina, nombre el archivo igual que su llamada e incluya un sub y endub en el archivo. El archivo debe estar en el directorio señalado por PROGRAM_PREFIX o SUBROUTINE_PATH en el archivo ini. El nombre del archivo puede incluir letras minúsculas, números, guiones y guiones bajos solamente. Un archivo de subrutina con nombre solo puede contener una única definición de subrutina.
Ejemplo de archivo con nombre
o<myfile> call
Ejemplo de archivo numerado
o123 call
En el archivo llamado, debe incluir el sub y el endsub oxxx y el archivo debe ser un archivo válido.
Ejemplo de archivo llamado
(nombre de archivo myfile.ngc)
o<myfile> sub
(código aquí)
o<myfile> endsub
M2
Nota
|
Los nombres de los archivos son solo letras minúsculas, por lo que o <MyFile> se convierte en o <myfile> por el intérprete. Más información sobre la ruta de búsqueda y las opciones para la ruta de búsqueda se encuentra en la sección de configuración INI. |
9. Valores de retorno de subrutina
Las subrutinas pueden devolver opcionalmente un valor mediante una expresión opcional en una declaración endsub o return.
Ejemplo de valor de retorno
o123 return [#2 *5]
...
o123 endub [3 * 4]
Un valor de retorno de subrutina se almacena en el parámetro con nombre predefinido <_value> y el parámetro predefinido <_value_returned> se establece en 1, para indicar que se ha devuelto un valor. Ambos parámetros son globales y se borran solo antes de la próxima llamada de subrutina.
10. Errores
Las siguientes declaraciones provocan un mensaje de error y abortan el interprete:
- un return
o` endsub` no dentro de una subdefinición
- una etiqueta en repeat que se define en otra parte
- una etiqueta en while
que se define en otro lugar y no se refiere a un` do`
- una etiqueta en if
definida en otra parte
- una etiqueta indefinida en else
o` elseif`
- una etiqueta en else
,` elseif` o endif
no apunta a un` if` coincidente
- una etiqueta en break
o` continue` que no apunta a una coincidencia while
o` do`
- una etiqueta en endrepeat
o` endwhile` sin hacer referencia a un while
o` repeat` correspondiente
Para hacer estos errores advertencias no fatales en stderr, establezca el bit 0x20 en
la opción mask [[RS274NGC]FEATURE=` del .ini.