Per i Function Block creati dall'utente nel progetto o nella libreria utente, viene creato un sottoprogramma nel programma compilato. Ogni volta che viene caricato, vengono trasferiti per primi i parametri di ingresso delle classi VAR_INPUT and VAR_IN_OUT. Poi avviene un salto nel sottoprogramma corrispondente. Infine sono letti nuovamente i parametri di uscita delle classi VAR_OUTPUT e VAR_IN_OUT. Il numero di sottoprogrammi o Function Block che potete definire dipende dal tipo di controllore.
I Function Block sono dotati di una "memoria", questo significa che ad ogni entità di tale Function Block sono allocati un'area dati e un sottoprogramma quando viene chiamata. Tutte le entità di un Function Block usano allora lo stesso sottoprogramma. Tramite registri indice avviene l'accesso all'area dati valida per la rispettiva entità.
In tal modo si può risparmiare molto spazio nella memoria programma, soprattutto se si usano frequentemente gli stessi Function Block definiti da utente. Gli accessi all'area dati tramite registri indice possono prolungare tuttavia il tempo di scan.
Utilizzando alcuni controllori è possibile attivare l’opzione Istanze function block indicizzate in .
Alcuni comandi FB non funzionano correttamente se vengono richiamati più volte all'interno di una trasmissione. In tal caso si riceve un messaggio di errore con i seguenti comandi:
Contatori: F118_UDC, F166_HighSpeedCounter_Set, F167_HighSpeedCounter_Reset, F168_PulseOutput_Home
Istruzioni di scorrimento: F119_LRSR