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.
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>
| 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. Le seguenti parole chiave non sono valide per i nomi: |
| 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. |
| Per motivi di compatibilità, le parentesi graffe vengono utilizzate al posto delle parentesi nelle impostazioni predefinite per Il blocco funzione |
| 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
| La lunghezza del nome può essere un massimo di 80 caratteri (escluso il prefisso |
| 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):
I seguenti stati modali non vengono ripristinati:
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.
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.