Para las funciones creadas por el usuario en el proyecto o en la librería de usuario, en la compilación del programa se crea un subprograma. Cada vez que se llama, lo primero que se transfieren son los parámetros de entrada de las clases VAR_INPUT y VAR_IN_OUT. Después se salta dentro del subprograma correspondiente. Finalmente, se leen de nuevo los parámetros de salida VAR_OUTPUT y VAR_IN_OUT. El número de subprogramas o de bloques de función que se pueden definir depende del tipo de controlador.
Los bloques de función están equipados con una "memoria", es decir, cuando se llaman, se asigna a cada entidad del bloque de función, un área de datos y un subprograma. Todas las entidades de un bloque de función utilizan, por tanto, el mismo subprograma. Gracias a los registros índice, se accede al área de datos válido para la entidad correspondiente.
Esta implementación ayuda a ahorrar gran parte de espacio útil en la memoria de programa, especialmente cuando se usa con frecuencia el mismo bloque de función de usuario. Sin embargo, el acceso al área de datos vía registros índice puede alargar el ciclo de scan.
Con algunos controladores, se puede activar la opción Llamadas a bloques de funciones indexados en .
Con la indexación de FBs, algunas funciones básicas no funcionan correctamente cuando se llaman varias veces dentro de un mismo ciclo de scan. Se recibirá un mensaje de error con las siguientes instrucciones:
Contadores: F118_UDC, F166_HighSpeedCounter_Set, F167_HighSpeedCounter_Reset, F168_PulseOutput_Home
Instrucciones de Desplazamiento: F119_LRSR