Skip to main content

sottoprogrammi

Funzione: Richiamo di un sottoprogramma

Le attività ricorrenti, come la fresatura di tasche, la foratura e il cambio utensile, possono essere scambiate in sottoprogrammi in codice G e richiamate da lì. Durante una chiamata, i parametri possono essere passati al sottoprogramma. I tipi di dati BOOL, LREAL, e STRING sono consentiti a tale scopo.

Suggerimento

Se usi sottoprogrammi, allora devi usare i blocchi funzione SMC_ReadNCFile2 e SMC_NCInterpreter invece di SMC_ReadNCFile e SMC_NCDecoder.

Suggerimento

I sottoprogrammi funzionano solo nel decoder online (non nell'editor CNC).

Ogni sottoprogramma è memorizzato in un file separato. Questi file vengono salvati in una o più sottodirectory del controller. Devono avere l'estensione del file .cnc. Il nome del file deve corrispondere al nome del sottoprogramma ed essere minuscolo. Esempio: nome del sottoprogramma "Drill" -> nome file drill.cnc.

Importante

Si noti che il nome del file del sottoprogramma deve essere scritto in minuscolo.

il POU SMC_ReadNCFile2 ha un ingresso aSubProgramDirs : ARRAY[0..4] OF STRING(174). È possibile specificare fino a cinque sottodirectory oltre a questa. Vengono scansionati nell'ordine indicato. Se sono presenti sottoprogrammi con lo stesso nome in più directory, viene trovato il sottoprogramma con la directory con l'indice più basso nell'array. Il nome del sottoprogramma viene convertito in minuscolo.

Esempio 47. Esempio
aSubProgramDirs = ['subprograms/user', 'subprograms/system', '']

Il sottoprogramma DrillA1 viene scansionato per primo nel file subprograms/user/drilla1.cnc. Se questo file non esiste, la ricerca continua in subprograms/system/drilla1.cnc.



È possibile richiamare i sottoprogrammi indirettamente tramite una variabile (più precisamente tramite un'espressione di tipo STRING). L'espressione (e quindi anche l'eventuale ricerca di variabili) viene valutata – generalmente nel caso di utilizzo di variabili nel codice G – al momento della preelaborazione quando l'interprete raggiunge la riga. In questo caso il controllo del tipo degli argomenti viene effettuato solo quando l'interprete ha raggiunto la linea e non già durante l'analisi, come nel caso delle chiamate statiche.

Suggerimento

I sottoprogrammi non possono essere creati offline nell'editor CNC.

Profondità massima di annidamento delle chiamate ai sottoprogrammi

  • Prima della versione 4.18.0.0: la profondità massima di annidamento delle chiamate ai sottoprogrammi è limitata a 14.

  • Versione 4.18.0.0 e successive: la profondità di annidamento è ora limitata solo dalla memoria. Il valore massimo può essere modificato SMC_CNC_LIBPARAMS.MAX_SUBPROGRAM_NESTING_DEPTH.

Sintassi per la chiamata

I richiami di sottoprogrammi sono blocchi speciali nel codice G che consistono in un numero di blocco e solo in un richiamo. Non sono consentite parole aggiuntive.

N<SentenceNo> <Name> <BracketOpen> <ActualParamList> <BracketClosed>
N<SentenceNo> DYNCALL <BracketOpen> <SubNameExp> [, <ActualParamListNotEmpty]  <BracketClosed>

<SubNameExp> : An expression with exactly one value of type STRING
<ActualParamList> ::= Empty | <ActualParamListNotEmpty>
<ActualParamListNotEmpty> ::= <ActualParamValue> | <ActualParamValue>, <ActualParamListNotEmpty>

<Name>

Identificatore IEC valido con un minimo di 3 e un massimo di 80 caratteri. Deve corrispondere al nome del file (senza estensione) in cui è definito il sottoprogramma. Le lettere maiuscole o minuscole non sono importanti per i nomi dei sottoprogrammi. [a-zA-Z0-9_] sono consentiti.

Le seguenti parole chiave non sono valide per i nomi: RETURN,\\ IF,\\ ELSE,\\ END_IF,\\ CASE,\\ END_CASE,\\ FOR,\\ END_FOR,\\ WHILE,\\ END_WHILE, REPEAT,\\ UNTIL,\\ END_REPEAT.

<ActualParamList>

Deve essere specificato esattamente lo stesso numero di valori dei parametri definiti dal sottoprogramma (vedere "Sintassi per la dichiarazione"). Il tipo di ogni valore di parametro deve concordare con la dichiarazione.

<BracketOpen>/<BracketClosed>

Per motivi di compatibilità, le parentesi graffe vengono utilizzate al posto delle parentesi nelle impostazioni predefinite per SMC_ReadNCFile2 e chiamate e dichiarazioni di sottoprogrammi. Le parentesi sono valide nel codice G per i commenti.

Il blocco funzione SMC_ReadNCFile2 ha una modalità (bParenthesesAsComments input) dove le parentesi non sono commenti. Invece, i commenti su più righe vengono aperti con (* e chiuso con *). In questa nuova modalità, è possibile utilizzare sia le parentesi graffe che le parentesi per le chiamate e le dichiarazioni di sottoprogrammi.

<ActualParamValue>

Variabile, letterale o qualsiasi espressione

Esempio

N10 SUB1()
N20 DRILL(10.0)
N30 SUB2(5, "Text", 2.5)
N40 G36 O#SUBNAME  D'DRILL'    % Indirect call via local variable
N40 DYNCALL(#SUBNAME, 2)       % equivalent to N40 DRILL(2)
N50 DYNCALL($SUBNAME$, 2, 4)   % Indirect call via IEC variable

Sintassi per la dichiarazione

Un sottoprogramma deve essere salvato in un file separato. La prima riga (né vuota né riga di commento) deve contenere la dichiarazione del sottoprogramma. Si applica la seguente sintassi:

SUBPROGRAM <Name> <BracketOpen> <FormalParamList> <BracketClosed> <RESTORE_OPT>
<Inhalt Unterprogramm>
END_SUBPROGRAM

<FormalParamList> ::= Empty | <FormalParamListNotEmpty>
<FormalParamListNoEmpty> ::= <FormalParam> | <FormalParam> , <FormalParamListNotEmpty>
<FormalParam> ::= <ParamName> : <ParamType>
<ParamName>   ::= #[a-zA-Z0-9_]+

<ParamType> ::= LREAL | BOOL | STRING ; String with a maximum length of 255 bytes
<RESTORE_OPT> ::= RESTORE_MODES

<ParamName>

La lunghezza del nome può essere un massimo di 80 caratteri (escluso il prefisso #).

RESTORE_MODES

Se viene specificata questa parola chiave, vengono ripristinati i seguenti stati modali quando si torna al programma chiamante (impostato sul valore che aveva alla chiamata):

  • Codice G attivo

  • Modalità relativa/assoluta (G90/G91, G98/G99)

  • Piano circolare e modalità 2D/3D

  • Sistema di coordinate del decodificatore (incluso il ridimensionamento)

  • Avanzamenti (assi traiettoria e aggiuntivi), velocità di traslazione rapida, accelerazioni e decelerazioni massime (assi traiettoria e aggiuntivi)

  • Flag di feature e parametri generali (G38)

  • Raggio utensile (parola D)

  • Correzioni utensile (G43)

  • Profilo S (parola S)

I seguenti stati modali non vengono ripristinati:

  • Posizione attuale del decoder/interprete e stato attuale della spline cardinale La posizione include l'intera struttura SMC_POSINFO (ad esempio, X, Y, Z, l'orientamento e tutti gli assi aggiuntivi).

  • Stato (on/off) delle POU di preelaborazione del percorso (G40-G43, G50-G52, G60-G61, G70-G71)

  • Impostazione modulo degli assi aggiuntivi (PA, PB, …)

Nota: indipendentemente da questa parola chiave, le variabili di conteggio implicite (G36, G37) vengono ripristinate al ritorno dal sottoprogramma al programma chiamante.

Esempi

SUBPROGRAM SUB1()                 ; no formal parameters
SUBPROGRAM DRILL(#depth : LREAL)
SUBPROGRAM SUB2(#a : LREAL, #b : STRING, #c : LREAL)
SUBPROGRAM SRM1() RESTORE_MODES

Sintassi per il ritorno

Il ritorno avviene sia alla fine del testo del sottoprogramma (prima del END_SUBPROGRAM) o esplicitamente con la seguente sintassi: N<block number> RETURN.

Utilizzo dei parametri formali nel sottoprogramma

I valori dei parametri formali sono accessibili nel sottoprogramma tramite #<ParamName>.

Il numero di parametri formali è limitato a 21.

Esempio 48. Esempio
SUBPROGRAM SUB(#Param1 : LREAL)
N10 G01 X#Param1


Visualizzazione dello stack di chiamate

L'interprete (SMC_NCInterpreter) ha un output che contiene i primi 10 programmi/sottoprogrammi attivi: aActivePrograms : ARRAY[0..9] OF STRING. La prima voce (aActivePrograms[0]) è il programma/sottoprogramma attualmente interpretato. La seconda voce (aActivePrograms[1]) è il programma/sottoprogramma chiamante e così via. Se non esiste un programma chiamante, la stringa corrispondente è vuota.

Lo stack di chiamate può essere visualizzato anche durante l'interpolazione. Il SMC_DisplayNCCallstack La POU mostra i programmi/sottoprogrammi attivi nello stesso formato dell'interprete, solo in un secondo momento (cioè quando viene eseguito il movimento). In tal modo, l'output dell'interprete CallstackInfo (SMC_NCCallstackInfo) e l'interpolatore gli viene passato come VAR_IN_OUT variabili. SMC_NCCallstackInfo memorizza tutte le modifiche allo stack di chiamate, incluso il corrispondente SMC_GeoInfo numero oggetto, in un buffer circolare. Al momento, questo limita a 128 il numero di modifiche dello stack di chiamate memorizzabili tra il tempo di interpretazione e il tempo di interpolazione. Poiché il buffer circolare non soddisfa i criteri di multitasking, SMC_DisplayNCCallstack deve essere chiamato dal compito di interprete.

Il programma di esempioEsempio CNC 07: Uso di espressioni e sottoprogrammimostra un esempio di visualizzazione dello stack di chiamate al momento dell'interpolazione.