Glosario de Automatización • Código de función Modbus

¿Qué es un código de función Modbus?

Ingeniería Merobix • • 8 min de lectura

Cada petición Modbus lleva un solo byte que le dice al dispositivo qué hacer - leer un conjunto de bits, leer un conjunto de registros, escribir un valor, escribir muchos. Ese byte es el código de función, el verbo de la oración Modbus, y es inseparable de la dirección sobre la que actúa. Esta guía recorre los códigos de función comunes, muestra cuál lee un transmisor de nivel frente a cuál escribe un comando de válvula, y explica por qué una petición con el código de función equivocado regresa vacía aunque la dirección del registro sea perfectamente correcta.

Volver al glosario

Código de función Modbus en una línea: Un código de función Modbus es el valor de un byte en una petición que especifica la operación a realizar - qué tabla de datos acceder y si leerla o escribirla. Los códigos comunes son 01 leer bobinas, 02 leer entradas discretas, 03 leer registros de retención, 04 leer registros de entrada, 05 escribir una sola bobina, 06 escribir un solo registro de retención, 15 escribir múltiples bobinas, y 16 escribir múltiples registros de retención. Como cada código está atado a una tabla específica, usar el código equivocado apunta a la tabla equivocada, así que una petición puede nombrar una dirección válida y aun así no devolver nada útil.

Los códigos de función comunes y qué hacen

Los códigos de lectura vienen en cuatro sabores, uno por tabla de datos. El código de función 01 lee bobinas, los bits individuales de lectura y escritura. El código de función 02 lee entradas discretas, los bits individuales de solo lectura. El código de función 03 lee registros de retención, las palabras de dieciséis bits de lectura y escritura. El código de función 04 lee registros de entrada, las palabras de dieciséis bits de solo lectura. Cada uno de estos toma una dirección de inicio y una cantidad, y devuelve esa cantidad de bits o registros de la única tabla a la que está atado - el código 03 solo leerá registros de retención, nunca bobinas ni registros de entrada.

Los códigos de escritura cubren las dos tablas escribibles. El código de función 05 escribe una sola bobina, forzando un bit encendido o apagado. El código de función 06 escribe un solo registro de retención, fijando un valor de dieciséis bits. Cuando más de un valor debe cambiar a la vez, el código de función 15 escribe múltiples bobinas y el código de función 16 escribe múltiples registros de retención, cada uno tomando una dirección de inicio, un conteo y el bloque de datos a escribir. No hay códigos de escritura para entradas discretas ni registros de entrada, porque esas tablas son de solo lectura por definición - lo cual se hace cumplir precisamente por la ausencia de cualquier código de función que pudiera escribirlas.

El emparejamiento de códigos con tablas es el punto entero del diseño. Leer y escribir son verbos separados, y cada verbo se especializa además según qué tabla toca, así que un maestro Modbus construye una petición decidiendo primero qué quiere - leer una medición, escribir un setpoint, forzar una salida - y luego seleccionando el único código de función que expresa exactamente eso. Un dispositivo anuncia qué códigos de función soporta, y un maestro bien portado solo emite códigos que el dispositivo implementa, ya que un código no soportado provoca un error en lugar de una acción.

Cuál código lee un sensor frente a cuál escribe un comando

Leer un transmisor de nivel significa leer un número que el dispositivo mide, así que los códigos relevantes son 04 para un registro de entrada o 03 para un registro de retención, según dónde exponga el dispositivo la medición. Un maestro que sondea una RTU de sitio de pozo por nivel de tanque, caudal y presión casi siempre está emitiendo el código 03 o 04, recuperando bloques de registros de dieciséis bits que luego escala a unidades de ingeniería. Si en cambio necesita leerse un bit de estado como un contacto de bomba en marcha, ese es el código 02 para una entrada discreta, o el código 01 si el dispositivo por casualidad lo expone como una bobina.

Escribir un comando de válvula es la dirección opuesta, y el código depende de si el objetivo es un bit o un registro. Comandar una salida discreta - abrir o cerrar, arrancar o parar - es el código 05 para escribir una sola bobina, o el código 15 para fijar varias salidas a la vez. Empujar un setpoint numérico hacia el dispositivo, como un nuevo nivel objetivo o un preset de temporizador, es el código 06 para escribir un solo registro de retención, o el código 16 para escribir un bloque de ellos. El maestro elige el código de escritura para coincidir tanto con la dirección como con el tamaño del dato, así que un comando de un bit y un comando de un registro usan códigos distintos aunque ambos sean escrituras.

El mapeo es por lo tanto mecánico una vez que se conoce la tabla: elija leer o escribir, elija bit o registro, y el código de función se sigue. Por eso el mapa de registros del que trabaja un integrador lista no solo la dirección de cada valor sino también la tabla en que vive - la tabla dicta los códigos legales. Un valor en un registro de entrada solo se puede leer con el código 04, un valor en una bobina se puede leer con 01 y escribir con 05 o 15, y conocer la tabla elimina toda adivinanza sobre qué código debe enviar el maestro.

Por qué el código de función equivocado no devuelve nada

Una falla frecuente y confusa es un sondeo que no devuelve nada aunque la dirección del registro sea correcta, y la causa muchas veces es el código de función en lugar de la dirección. Como cada código está atado a una tabla específica, enviar el código 04 para leer un registro de entrada en el desplazamiento 100 le pide al dispositivo el registro de entrada 100 - y si el valor en realidad vive en el registro de retención 100, el dispositivo o devuelve datos no relacionados que están en el registro de entrada 100 o, si ese desplazamiento no existe en la tabla de registros de entrada, responde con una excepción. La dirección coincidió con una tabla en la que el valor nunca estuvo.

La trampa es que el mismo desplazamiento numérico existe de forma independiente en varias tablas, así que un código equivocado no siempre falla en voz alta. Si tanto la tabla de registros de entrada como la de registros de retención tienen un desplazamiento 100, un código equivocado devuelve bytes reales que decodifican a un valor plausible pero incorrecto, que es más difícil de diagnosticar que un error directo. Por eso un integrador que depura un sondeo muerto o equivocado revisa el código de función y la tabla objetivo juntos: la dirección correcta en la tabla equivocada sigue siendo el dato equivocado.

En un contexto de SCADA en la nube, esto aparece cada vez que un tag recién agregado lee cero, basura o un valor congelado mientras la dirección en el mapa de registros luce correcta. Una plataforma como Merobix construye cada sondeo Modbus a partir de un código de función más una dirección, y lograr que un tag vivo lea correctamente significa coincidir el código con la tabla que el fabricante documentó, no solo copiar el desplazamiento. Una vez que el código y la tabla concuerdan, la misma dirección que no devolvía nada empieza a devolver la medición real - la solución casi siempre es alinear el verbo, no la dirección.

Preguntas frecuentes

¿Qué código de función lee un registro de retención?

El código de función 03 lee registros de retención, las palabras de dieciséis bits de lectura y escritura que comúnmente contienen mediciones y setpoints. Toma una dirección de inicio y una cantidad y devuelve esa cantidad de registros de retención. Si el valor que quiere vive en un registro de entrada en su lugar, usa el código de función 04, ya que el código 03 solo lee la tabla de registros de retención.

¿Cuál es la diferencia entre el código de función 06 y el 16?

Ambos escriben registros de retención, pero el código 06 escribe un solo registro - un valor de dieciséis bits - mientras que el código 16 escribe múltiples registros en una sola petición, tomando una dirección de inicio, un conteo y un bloque de datos. Usa el código 06 para cambiar un setpoint y el código 16 para actualizar varios registros consecutivos a la vez, como escribir ambas palabras de un valor de 32 bits en una sola transacción.

¿Por qué mi sondeo Modbus no devuelve nada cuando la dirección es correcta?

Por lo general porque el código de función apunta a la tabla equivocada. Cada código está atado a una tabla, así que leer un valor de registro de retención con el código 04, que lee registros de entrada, pide un dato distinto en ese desplazamiento, y el dispositivo devuelve bytes no relacionados o una excepción. Revise que el código de función coincida con la tabla en que el valor en realidad vive - la dirección correcta en la tabla equivocada aun así falla.

Más en Protocolos industriales
Excepcion Modbus de funcion ilegal (codigo 01)  •  Código de función DNP3  •  Excepcion Modbus de valor de datos ilegal (codigo 03)  •  Código de excepción Modbus  •  Función de transporte DNP3  •  Todo en Protocolos industriales →
Capacitación SCADA gratuita para operadores
Merobix University - 70 lecciones en video y 261 preguntas de examen, del primer inicio de sesión a los reportes de cumplimiento (contenido en inglés). Sin llamada de ventas.
Comenzar gratis →