Modbus Protocol

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 24

Machine Translated by Google

1108 CAPÍTULO 15. ADQUISICIÓN DE DATOS DIGITALES Y REDES

el maestro solicita datos y el esclavo responde. Si configuramos un transmisor de proceso para comunicar en ráfaga tres
variables diferentes, por ejemplo, la velocidad de actualización para cada una de esas variables será aproximadamente una vez
por segundo (tres variables comunicadas a una velocidad total de tres telegramas HART por segundo), lo cual es simplemente
demasiado lento para muchas aplicaciones industriales (por ejemplo, control de flujo de líquido de circuito cerrado). Sin embargo,
en aplicaciones donde la velocidad no es una preocupación, la comunicación HART es una solución muy práctica para adquirir
múltiples canales de datos de un instrumento a través de un solo par de cables.

15.11 Modbus
Desarrollado por la empresa Modicon (el fabricante original del controlador lógico programable o PLC) en 1979 para su uso en
sus productos de control industrial, Modbus es un protocolo diseñado específicamente para intercambiar datos de proceso entre
dispositivos de control industrial. El estándar Modbus no especifica ningún detalle de red física y, por lo tanto, puede implementarse
en muchos tipos diferentes de redes físicas. En otras palabras, Modbus se encuentra principalmente dentro de la capa 7 del
modelo de referencia OSI (la llamada "capa de aplicación") y, por lo tanto, es compatible77 con cualquier protocolo de
comunicación de nivel inferior, incluidos EIA/TIA­232, EIA/TIA­485, Ethernet (este último a través de TCP/IP) y una red especial
de transferencia de tokens también desarrollada por Modicon llamada Modbus Plus.

El estándar Modbus define principalmente el significado de varios comandos Modbus, el esquema de direccionamiento utilizado
para colocar datos dentro de los dispositivos y el formato de los datos.
Modbus consta de un conjunto de códigos digitales estandarizados destinados a leer y escribir datos en dispositivos
industriales. Se ha programado un dispositivo industrial compatible con Modbus para comprender estos códigos y responder
adecuadamente cuando los reciba. Los códigos Modbus más simples leen y escriben bits individuales de datos en la memoria del
dispositivo, por ejemplo, el estado de un canal de entrada de PLC, un canal de salida de PLC o un bit de estado dentro de un
programa de PLC. Otros códigos Modbus operan con palabras de datos de 16 bits, útiles para leer y escribir valores acumulados
de contadores y temporizadores, operandos para instrucciones matemáticas, señales analógicas convertidas, etc.

Las primeras implementaciones de Modbus utilizaron EIA/TIA­485 como capa física de red, que es estrictamente un protocolo
de capa 1. Esto significaba que Modbus necesitaba especificar un esquema de arbitraje de canales para poder negociar las
comunicaciones con múltiples dispositivos en una red. El arbitraje elegido fue maestro/esclavo, donde un PLC funcionaba como
dispositivo Modbus maestro y todos los demás dispositivos funcionaban como esclavos Modbus.

Curiosamente, este vestigio de arbitraje maestro/esclavo sobrevive hasta el día de hoy, incluso cuando los comandos Modbus
se comunican a través de redes con sus propios métodos de arbitraje diferentes. Por ejemplo, los comandos Modbus comunicados
a través de Ethernet todavía hacen referencia a direcciones "esclavas" aunque la red Ethernet a través de la cual se envían esos
mensajes utiliza arbitraje CSMA/CD. En otras palabras, hay un indicio de OSI capa 2 integrado en los mensajes Modbus que aún
dicta qué dispositivos Modbus pueden emitir comandos y cuáles deben obedecer comandos.

77Estas tramas de datos Modbus pueden comunicarse directamente en forma de serie, o “envolverse” en segmentos TCP y paquetes IP y tramas Ethernet, o
contenerse de otro modo en cualquier forma de protocolo basado en paquetes según sea necesario para transportar los datos de un dispositivo a otro. Por lo
tanto, a Modbus no le “importa” cómo se comunican los datos, solo lo que significan para el dispositivo final.
Machine Translated by Google

15.11. MODBUS 1109

15.11.1 Descripción general de Modbus

Podemos comenzar nuestra exploración de Modbus considerando primero un ejemplo de un sistema de


motor controlado por PLC que no emplea Modbus. Aquí, el PLC envía señales de comando de control de
velocidad y avance, retroceso y parada cableadas individualmente a un variador de frecuencia (VFD) que
luego envía energía trifásica de frecuencia variable a un motor eléctrico para realizar alguna tarea útil:

24V I/3 CC I/4 I/5


A una fuente de
corriente continua yo/0 yo/1 yo/2 Salida
COM COM analógica
SALIDA CC alimentación
trifásica de 480 VCA

Fuerza

Correr

SOCIEDAD ANÓNIMA
Falla

Fuerza

85­264 VCA
Modbus
L1 L2/N
VACACIONES

VCC
O/0
VACACIONES

VCC
O/1
VACACIONES

VCC
O/2
VACACIONES

VCC O/3 RS­485

motor de inducción de CA
L1 L2 L3
Detener

adelante

vehículos recreativos

avance hacia adelante

Com
VFD

Modbus
RS­485

Comando T1 T2 T3
de
velocidad analógico

Los comandos discretos (por ejemplo, Parar, Adelante, Revertir) no son más que cierres de contacto de
encendido/apagado proporcionados por los canales de salida del PLC a los terminales de entrada del VFD.
Cuando el PLC ordena al VFD que funcione en dirección inversa, simplemente activa el canal de salida O/1
que cierra un contacto de relé dentro del PLC para conectar el terminal “Rvs” del VFD al terminal “Com” del
VFD. El VFD detecta esta continuidad eléctrica y responde haciendo funcionar el motor en dirección inversa.
La velocidad del motor está comandada por una señal de voltaje analógica (normalmente de 0 a 10 voltios
CC) emitida por el PLC, donde 0 voltios representan velocidad cero y 10 voltios representan velocidad máxima.
El VFD recibe esta señal de voltaje analógico y responde enviando la frecuencia apropiada de energía CA
trifásica al motor de inducción.

Si bien este sistema es ciertamente funcional, se puede mejorar mediante el uso de Modbus.
Machine Translated by Google

1110 CAPÍTULO 15. ADQUISICIÓN DE DATOS DIGITALES Y REDES

Ahora considere este sistema de control de motor actualizado, donde los únicos cables de conexión entre el PLC y el
VFD es un único cable de dos conductores entre los terminales Modbus/RS­485 de ambos dispositivos.
El PLC funciona como un dispositivo maestro Modbus mientras que el VFD funciona como esclavo Modbus:

24V yo/0 yo/1 yo/2 I/3 CC I/4 I/5


A una fuente de
corriente continua
Cosa análoga
COM COM producción
SALIDA CC alimentación
trifásica de 480 VCA

Fuerza

Correr

SOCIEDAD ANÓNIMA
Falla

Fuerza

85­264 VCA
Modbus
RS­485
VACACIONES VACACIONES VACACIONES VACACIONES

L1 L2/N O/0 O/1 O/2 O/3


VCC VCC VCC VCC

motor de inducción de CA
L1 L2 L3
Detener

adelante

vehículos recreativos

avance hacia adelante

Com
VFD

Modbus
RS­485

Comando T1 T2 T3
de
velocidad analógico

Al utilizar comandos Modbus apropiados transmitidos al VFD, el PLC puede emitir los mismos comandos (por ejemplo,
Parar, Avance, Retroceso, control de velocidad) que antes, pero usando muchos menos cables.
Por ejemplo, el código de comando Modbus 05 escribe un solo bit de datos en el dispositivo receptor, lo que permite que el
PLC envíe comandos de señales discretas al VFD de uno en uno. Cuando el PLC ordena al VFD que funcione en dirección
inversa, emite un comando 05 seguido de un bit de datos "1" dirigido a la ubicación de memoria adecuada dentro del VFD
reservada para el bit de comando "Inversa". Cuando el PLC ordena al VFD que cambie la velocidad del motor, emite un código
Modbus 06 (“registro de escritura”) seguido de un número de 16 bits que representa la velocidad deseada del motor y la
dirección apropiada dentro del VFD reservada para el comando de velocidad.

El PLC no sólo puede emitir los mismos comandos que antes, sino que también puede leer datos del VFD que no podía
hacer antes. Por ejemplo, si el VFD proporciona una ubicación de memoria para almacenar códigos de falla (por ejemplo,
sobrecorriente del motor, subtensión del bus, etc.), el PLC puede programarse para emitir un código Modbus 03 para leer un
solo registro (número binario de 16 bits) de ese ubicación de la memoria dentro del VFD y, por lo tanto, monitorear el estado
del VFD para alertar a los técnicos humanos de posibles problemas y/o modificar su propio control del motor.
Machine Translated by Google

15.11. MODBUS 1111

Otra ventaja del estándar de comunicación Modbus es que está diseñado para direccionar múltiples
dispositivos en la misma red. Esto significa que nuestro PLC hipotético no se limita a controlar y monitorear
solo un motor, sino hasta 247 dispositivos esclavos Modbus separados en el mismo cable de comunicación
de dos hilos. La siguiente ilustración muestra cómo esto podría funcionar para varios motores:

24V yo/0 yo/1 yo/2 I/3 CC I/4 I/5


A una fuente de
corriente continua
Cosa análoga
COM COM producción
SALIDA CC alimentación
trifásica de 480 VCA

Fuerza

Correr

Falla SOCIEDAD ANÓNIMA

Fuerza

85­264 VCA
Modbus
L1 L2/N
VACACIONES

VCC
O/0
VACACIONES

VCC
O/1
VACACIONES

VCC
O/2
VACACIONES

VCC
O/3 RS­485

motor de inducción de CA
L1 L2 L3
Detener

adelante

vehículos recreativos

avance hacia adelante

Com
VFD

Modbus #1
RS­485

Comando T1 T2 T3
de
velocidad analógico

A una fuente de

alimentación
trifásica de 480 VCA

motor de inducción de CA
L1 L2 L3
Detener

adelante

vehículos recreativos

avance hacia adelante

Com
VFD

Modbus #2
RS­485

Comando T1 T2 T3
de
velocidad analógico

A cada VFD se le asigna su propia dirección esclava de red Modbus, de modo que el PLC pueda
distinguir entre los dos variadores cuando se comunican por el mismo par de cables. Cada código Modbus
transmitido por el PLC contiene esta dirección como un solo byte (8 bits) de datos para que el VFD receptor
sepa que el código se aplica a él y no a ningún otro dispositivo Modbus en la red. En
Machine Translated by Google

1112 CAPÍTULO 15. ADQUISICIÓN DE DATOS DIGITALES Y REDES

En este ejemplo, es posible que deseemos direccionar el VFD #1 con la dirección Modbus 1 y el VFD #2 con la dirección Modbus 2.
El estándar Modbus proporciona una "dirección de transmisión" de 0 que aborda todos los dispositivos en la red simultáneamente.
Por ejemplo, si el PLC necesitara arrancar todos los motores en la misma dirección a la vez, podría emitir un código Modbus 05
(escribir un solo bit) a la misma dirección dentro de cada VFD que represente el bit de comando para la dirección correcta de rotación
del motor. Siempre que los VFD estén configurados de manera idéntica, los datos serán recibidos e interpretados por cada VFD de
manera idéntica, lo que hará que ambos se inicien en la misma dirección.

Las únicas desventajas de utilizar Modbus en lugar de cables dedicados para cada función de detección y control son la
velocidad y la confiabilidad. Modbus es necesariamente más lento que el control por cable dedicado porque el PLC no puede emitir
simultáneamente diferentes comandos en la red. Por ejemplo, si el PLC necesitara indicarle a un VFD que comience a girar su motor
en dirección de avance a 1050 RPM, el sistema basado en Modbus necesitaría emitir dos códigos Modbus separados, mientras que
el sistema cableado individualmente podría emitir estos comandos todos a la vez. . Sin embargo, no vale la pena considerar esta
desventaja si la red Modbus se comunica a una velocidad razonablemente alta (miles de bits por segundo). La desventaja de la
confiabilidad puede percibirse fácilmente si consideramos cómo respondería cada sistema a una falla en un cable (por ejemplo, un
cable que se suelta y se desconecta de un terminal de tornillo).

En el sistema cableado individualmente, una falla en un cable desactiva esa función de control del motor, pero no necesariamente
ninguna de las otras funciones. En el sistema basado en Modbus, la falla de un cable desactiva todo porque cualquier comunicación
Modbus requiere el funcionamiento completo de ese cable de comunicación de dos conductores. El problema es aún mayor cuando
se controlan varios dispositivos mediante el mismo cable Modbus: si ocurre una falla entre el PLC controlador y todos los dispositivos
de campo, el PLC perderá el control (y el monitoreo) de cada uno de esos dispositivos de campo. Este es un factor que vale la pena
considerar al decidir si utilizar o no algún método de comunicación digital para monitorear y controlar múltiples dispositivos.

Modbus, especialmente cuando se implementa a través de redes seriales simples como EIA/TIA­232 y EIA/TIA­485, es un
protocolo bastante primitivo. Los códigos decimales aparentemente arbitrarios utilizados para emitir comandos y especificar
direcciones están anticuados según los estándares modernos. Sin embargo, para bien o para mal, muchos dispositivos industriales
digitales “hablan” Modbus, incluso si también son capaces de comunicarse a través de otros protocolos de red. El uso de Modbus
para comunicarse con equipos de control modernos es, por lo tanto, un acto de homenaje a las telecomunicaciones de la década de
1970: todos los dispositivos que participan en una red Modbus se comportan esencialmente igual que un antiguo PLC Modicon de
los años 70 con el fin de intercambiar información, incluso si sus capacidades de procesamiento lo permiten. Comunicaciones mucho
más sofisticadas que el protocolo Modbus. Un dispositivo Modbus que consulta a otro dispositivo Modbus no “sabe” qué tan moderno
o anticuado es ese otro dispositivo, porque el estándar Modbus básico ha permanecido fijo durante todo este tiempo.

El resto de esta sección explora detalles del estándar Modbus: su vocabulario de comandos,
esquema de direccionamiento y algunos ejemplos de operaciones de lectura/escritura.
Machine Translated by Google

15.11. MODBUS 1113

15.11.2 Tramas de datos Modbus


El estándar de comunicación Modbus define un conjunto de comandos para leer (recibir) y escribir (transmitir) datos entre un
dispositivo maestro y uno o más dispositivos esclavos conectados a la red.
Cada uno de estos comandos está referenciado por un código numérico, con direcciones de los registros internos de los
dispositivos maestro y esclavo (fuentes de datos y destinos de datos) especificadas junto con el código de función en el marco
Modbus.
En el estándar Modbus se especifican dos formatos diferentes: ASCII y RTU. La diferencia entre estos dos modos es cómo
se representan las direcciones, códigos de función, datos y bits de verificación de errores. En el modo Modbus ASCII, todas las
direcciones de dispositivos esclavos, códigos de función y datos se representan en forma de caracteres ASCII (7 bits cada uno),
que pueden ser leídos directamente por cualquier programa de terminal (por ejemplo, minicom, Hyperterminal, kermit, etc.) que
intercepte. el flujo de datos en serie.
Esto facilita la resolución de problemas: poder ver directamente los marcos de datos Modbus en un formato legible por humanos.
En el modo Modbus RTU, todas las direcciones de dispositivos esclavos, códigos de función y datos se expresan en formato
binario sin formato. También se utilizan diferentes técnicas de verificación de errores para los modos ASCII y RTU. El siguiente
diagrama compara tramas de datos para los dos modos Modbus:

Trama de mensaje Modbus ASCII

1 carácter 2 caracteres 2 caracteres (varios personajes) 2 personajes 2 personajes

dirección Código de cheque Fin


Comenzar
Datos (retorno de carro
de esclavo función LRC +
(:)
salto de línea)

Comenzar Detener

Trama de mensaje Modbus RTU

8 bits 8 bits (múltiplo de 8 bits) 16 bits

Inicio dirección Código de Fin


Datos
(pausa) de esclavo función verificación CRC
(pausa)

Comenzar Detener

Como puede ver en una comparación de las dos tramas, las tramas ASCII requieren casi el doble78 de bits que las tramas
RTU, lo que hace que Modbus ASCII sea más lento que Modbus RTU para cualquier dato determinado.

78Recuerde que cada carácter ASCII requiere 7 bits para codificarse. Esto afecta a casi todas las partes de la trama de datos Modbus.
Las porciones de dirección de esclavo y código de función, por ejemplo, requieren 14 bits cada una en ASCII pero sólo 8 bits cada una en
RTU. La porción de datos de una trama Modbus ASCII requiere un carácter ASCII (7 bits) para representar cada símbolo hexadecimal que
a su vez representa solo 4 bits de datos reales. La porción de datos de una trama Modbus RTU, por el contrario, codifica los bits de datos
directamente (es decir, 8 bits de datos aparecen como 8 bits dentro de esa porción de la trama). Además, las tramas de datos RTU utilizan
períodos de silencio (pausas) como delimitadores, mientras que las tramas de datos ASCII utilizan tres caracteres ASCII en total para
marcar el inicio y la parada de cada trama, a un "coste" de 21 bits adicionales. Sin embargo, estos bits delimitadores adicionales tienen un
propósito práctico: formatean cada trama de datos Modbus ASCII como su propia línea en la pantalla de un terminal.
programa.
Machine Translated by Google

1114 CAPÍTULO 15. ADQUISICIÓN DE DATOS DIGITALES Y REDES

velocidad (bits por segundo).


El contenido del campo "Datos" varía mucho según la función que se invoque y si la trama es emitida o no por el dispositivo
maestro o desde un dispositivo esclavo. Más detalles sobre el contenido del campo "Datos" de Modbus aparecerán en una
subsección posterior.
Dado que Modbus es estrictamente un protocolo de “capa 7”, estos marcos de mensajes generalmente están integrados
dentro de otros marcos de datos especificados por protocolos de nivel inferior. Por ejemplo, el estándar Modbus TCP encapsula
tramas de datos Modbus individuales como paquetes TCP/IP, que luego (generalmente) se encapsulan nuevamente como
paquetes Ethernet para llegar al dispositivo de destino. Este enfoque de "múltiples capas" inherente al hecho de que Modbus sea
un protocolo de tan alto nivel puede parecer engorroso, pero ofrece una gran flexibilidad en el sentido de que las tramas Modbus
pueden comunicarse a través de casi cualquier tipo de red física y virtual.
Machine Translated by Google

15.11. MODBUS 1115

15.11.3 Códigos y direcciones de función Modbus

En la siguiente tabla aparece una lista de códigos de función Modbus de uso común:

Código Modbus Función

(decimal)
01 Leer una o más “bobinas” de salida del PLC (1 bit cada una)
02 Leer uno o más “contactos” de entrada del PLC (1 bit cada uno)
03 Leer uno o más registros de “retención” del PLC (16 bits cada uno)
04 Leer uno o más registros de entrada analógica de PLC (16 bits cada uno)
05 Escribir (forzar) una única “bobina” de salida de PLC (1 bit)
06 Escribir (preestablecer) un único registro de “retención” de PLC (16 bits)
15 Escribir (forzar) múltiples “bobinas” de salida de PLC (1 bit cada una)
16 Escribir (preestablecer) múltiples registros de “retención” de PLC (16 bits cada uno)

Los datos en vivo dentro de cualquier dispositivo digital siempre se encuentran en alguna dirección dentro de la red de ese dispositivo.
memoria de acceso aleatorio (RAM). El estándar de direccionamiento Modbus “984” define conjuntos de
Direcciones numéricas donde se pueden encontrar varios tipos de datos en un PLC u otro dispositivo de control.
Los rangos de direcciones absolutas (según el esquema Modbus 984) se muestran en esta tabla, con
cada dirección contiene 16 bits de datos:

Códigos Modbus Rango de direcciones (decimal) Objetivo


(decimal)
01, 05, 15 00001 a 09999 02 Salidas discretas (“bobinas”), lectura/escritura
10001 a 19999 Entradas discretas (“contactos”), de sólo lectura
04 30001 a 39999 Registros de entrada analógica, de solo lectura
03, 06, 16 40001 a 49999 Registros “holding”, lectura/escritura

Observe cómo todos los rangos de direcciones Modbus comienzan en el número uno, no en cero como es habitual en este caso.
muchos sistemas digitales. Por ejemplo, un PLC con dieciséis canales de entrada analógica numerados del 0 al
15 por el fabricante puede "asignar" esos registros de entrada a las direcciones Modbus 30001 a 30016,
respectivamente.
Machine Translated by Google

1116 CAPÍTULO 15. ADQUISICIÓN DE DATOS DIGITALES Y REDES

Si bien este esquema de direccionamiento fijo era correcto para los PLC originales desarrollados por Modicon, casi nunca
corresponde directamente a las direcciones dentro de un dispositivo maestro o esclavo Modbus moderno.
La documentación del fabricante de dispositivos compatibles con Modbus normalmente proporciona referencias de “mapeo”
de Modbus para que tanto los técnicos como los ingenieros puedan determinar qué direcciones Modbus se refieren a registros
de palabras o bits específicos en el dispositivo. En algunos casos, el software de configuración para un dispositivo compatible
con Modbus proporciona una utilidad donde puede asignar variables de dispositivo específicas a números de registro Modbus
estándar. En esta captura de pantalla aparece un ejemplo de una página de mapeo de variables Modbus tomada de la utilidad
de configuración para una puerta de enlace Smart Wireless de Emerson, utilizada para "asignar" datos de variables dentro de
instrumentos de campo basados en radio WirelessHART a registros Modbus dentro del dispositivo de puerta de enlace donde
otros dispositivos están conectados. una red cableada puede leer esos datos:

Como puede ver aquí, la variable principal dentro del transmisor de temperatura TT­101 (TT­101.PV) se ha asignado al
registro Modbus 30001, donde cualquier dispositivo maestro Modbus en la red cableada podrá leerla. Asimismo, la variable
secundaria dentro del interruptor de nivel LSL­78 (LSL­78.SV) se ha asignado al registro Modbus 30041.

Es importante tener en cuenta que los registros Modbus son de 16 bits cada uno, lo que puede o no ajustarse exactamente
al ancho de bits de la variable del dispositivo en cuestión. Si la variable del dispositivo resulta ser un número de punto flotante
de 32 bits, entonces se deben usar dos registros Modbus contiguos para contener esa variable, de los cuales solo el primero
probablemente aparecerá en la página de mapeo Modbus (es decir, el mapa Modbus solo mostrará el primer registro Modbus
de ese par). Si la variable del dispositivo resulta ser booleana (un solo bit), entonces es probable que solo se utilice un bit
dentro del registro Modbus de 16 bits y que los otros 15 bits se “desperdicien” (no estén disponibles) para otros fines. Detalles
como este pueden estar documentados en el manual del dispositivo que realiza el mapeo Modbus (en este caso, el Emerson
Smart Wireless Gateway), o es posible que usted se vea obligado a descubrirlos mediante experimentación.
Machine Translated by Google

15.11. MODBUS 1117

15.11.4 Direccionamiento relativo Modbus


Una particularidad interesante de la comunicación Modbus es que los valores de dirección especificados dentro de las tramas
de datos Modbus son relativos en lugar de absolutos. Dado que cada función de lectura o escritura Modbus solo opera en un
rango limitado de direcciones de registro, no es necesario especificar la dirección completa en el marco de datos. Por ejemplo,
el código de función Modbus 02 lee registros de entrada discreta en el dispositivo con un rango de direcciones absolutas de
10001 a 19999 (es decir, todas las direcciones que comienzan con el dígito "1"). Por lo tanto, no es necesario que la función de
comando “lectura” 02 especifique el primer dígito de la dirección del registro. En cambio, el comando de lectura solo necesita
especificar una “dirección relativa” de cuatro dígitos que especifique qué tan lejos debe llegar desde el principio del rango de
direcciones (en este caso, desde 10001).
Una analogía que le ayudará a comprender el direccionamiento relativo es imaginar un edificio de hotel con varios pisos. El
primer dígito de cada número de habitación es el mismo que el número del piso, de modo que el primer piso solo contiene
habitaciones numeradas en centenas, el segundo piso solo contiene habitaciones numeradas en centenas, etc. Con este
sistema tan ordenado de números de habitaciones, Es posible especificar la ubicación de una habitación de más de una
manera. Por ejemplo, podría dar instrucciones para ir a la habitación 314 (un número de habitación absoluto) o, alternativamente,
podría especificar esa misma habitación como "número 14 (un número de habitación relativo) en el tercer piso". Para un
empleado de un hotel que sólo trabaja en el tercer piso, el número de habitación abreviado podría ser más fácil de recordar.

En Modbus, las direcciones relativas son un poco más complicadas que esto. Las direcciones relativas en realidad abarcan
un rango que comienza en cero, mientras que las direcciones absolutas comienzan con "1" como dígito menos significativo.
Esto significa que hay un desplazamiento adicional de 1 entre una dirección relativa Modbus y su dirección absoluta
correspondiente. Volviendo a la analogía del hotel, imagine que la primera habitación del tercer piso era la habitación 301 (es
decir, no había la habitación 300) y que la dirección relativa representaba el número de habitaciones después de esa primera
habitación. En este esquema poco intuitivo, la habitación 314 podría especificarse como “la habitación número 13 después de
la habitación inicial en el tercer piso”. Si esto le parece innecesariamente confuso, no está solo. Bienvenidos al Hotel Modbus.

A continuación se ofrecen algunos ejemplos a modo de ilustración:

• Leer el contenido del registro de contacto 12440: función de lectura Modbus 02; dirección relativa 2439

• Leer el contenido del registro de entrada analógica 30050: función de lectura Modbus 04; dirección relativa 49

• Leer el contenido del registro de retención 41000: función de lectura Modbus 03; dirección relativa 999

• Escriba múltiples bobinas de salida en el registro 00008: función de escritura Modbus 15; dirección relativa 7

En cada caso, el patrón es el mismo: la dirección relativa se agrega a la primera dirección de ese rango para llegar a la
dirección absoluta dentro del dispositivo Modbus. Haciendo referencia al primer ejemplo mostrado arriba: 2439 (dirección
relativa) + 10001 (primera dirección del rango de registros) = 12440 (dirección absoluta).

Afortunadamente, la única vez que probablemente tendrá que lidiar con el direccionamiento relativo es si programa una
computadora usando algún lenguaje de bajo nivel como ensamblador o C++. La mayoría de los lenguajes de programación
industrial de alto nivel, como el bloque de funciones o el diagrama de escalera, lo facilitan al usuario final al permitir que se
especifiquen direcciones absolutas directamente en los comandos de lectura y escritura. En un programa de PLC típico, por
ejemplo, se leería el registro de contacto 12440 simplemente especificando el número 12440 dentro del campo de dirección de
una instrucción "leer 02".
Machine Translated by Google

1118 CAPÍTULO 15. ADQUISICIÓN DE DATOS DIGITALES Y REDES

La siguiente lista muestra el código (escrito en lenguaje C) que utiliza libmodbus de código abierto.
biblioteca de funciones que indica a una computadora que acceda a datos enteros de 16 bits desde cuatro Modbus "holding"
registros (direcciones absolutas 49001 a 49004) a través de Modbus/TCP. La dirección IP del dispositivo es
192.169.0.10 y el puerto 502 se utiliza para la conexión TCP:

listado de código C

#incluye <stdio. h>


#incluir <modbus. h>

modbus t Dispositivo;

int principal ( vacío)


{
int readcount;
uint 1 6 tinregpalabra [ 4 ] ;
"
Dispositivo = modbus nuevo tcp (” 5 0 21);9 2 . 1 6 8 . 0. 1 0 ,
,
modbusseterrorrecover y (ENLACE DE RECUPERACIÓN DE ERROR MODBUS del dispositivo);

readcount = modbusreadre gi sters ( Dispositivo , 9 0 0 0 , 4 , palabra inreg);

printf(”Número de registros leídos = %i \n”, recuento de lecturas);


printf(”Valor del registro 49001 = %i\n”, inregword[0]);
printf(”Valor del registro 49002 = %i\n”, inregword[1]);
printf(”Valor del registro 49003 = %i\n”, inregword[2]);
printf(”Valor del registro 49004 = %i\n”, inregword[3]);

modbus close (Dispositivo);


modbusf ree (Dispositivo);

volver a contar;
}

Observe cómo la dirección inicial pasada a la función de lectura se especifica en forma relativa (9000),
cuando en realidad la dirección inicial absoluta deseada dentro del dispositivo es 49001. El resultado de ejecutar
este código se muestra aquí, siendo el dispositivo Modbus en cuestión un Emerson Smart Wireless Gateway
a las 4:00 p.m. (es decir, 16:00 hora militar) el 22 de marzo de 2016. Estos cuatro registros (49001 a 49004)
contiene información de fecha y hora (año, mes, día y hora) almacenada en el dispositivo:

Número de registros leídos = 4


Valor del registro 49001 = 2016
Valor del registro 49002 = 3
Valor del registro 49003 = 22
Valor del registro 49004 = 16
Machine Translated by Google

15.11. MODBUS 1119

El siguiente listado muestra un código similar (también escrito en lenguaje C79) que accede a números enteros de 16 bits.
datos de tres registros de “entrada analógica” Modbus (direcciones absolutas 30015 a 30017) a través de
Modbus/TCP desde el mismo dispositivo que antes:

listado de código C

#incluye <stdio. h>


#incluir <modbus. h>

modbus t Dispositivo;

int principal ( vacío)


{
int readcount;
uint 1 6 tinregpalabra [ 3 ] ;
"
Dispositivo = modbus nuevo tcp (” 5 0 2 1);9 2 . 1 6 8 . 0. 1 0 ,
,
modbusseterrorrecover y (ENLACE DE RECUPERACIÓN DE ERROR MODBUS del dispositivo);

readcount = modbusreadinputre gi sters ( Dispositivo , 14, 3 , palabra inreg);

printf(”Número de registros leídos = %i \n”, recuento de lecturas);


printf(”Valor del registro 30015 = %i\n”, inregword[0]);
printf(”Valor del registro 30016 = %i\n”, inregword[1]);
printf(”Valor del registro 30017 = %i\n”, inregword[2]);

modbus close (Dispositivo);


modbusf ree (Dispositivo);

volver a contar;
}

Observe una vez más cómo la dirección inicial relativa especificada en el código (14) se asigna a la dirección absoluta
Dirección de registro Modbus 30015, ya que los registros de entrada analógica comienzan con la dirección 30001 y relativa
Las direcciones comienzan en 0.

79Este código en lenguaje C se escribe y se guarda como un archivo de texto sin formato en la computadora, y luego se ejecuta un programa compilador.
ejecute para convertir este código "fuente" en un archivo "ejecutable" que luego la computadora pueda ejecutar. El compilador que uso
Mi sistema basado en Linux es gcc (el compilador GNU C). Si guardo el código fuente de mi programa Modbus en un archivo llamado
tony modbus.c, entonces la instrucción de línea de comandos que tendré que enviar a mi computadora indicando a GCC que compile
este código fuente será gcc tony modbus.c ­lmodbus. El argumento ­lmodbus le dice a GCC que "vincule" mi código al
código de la biblioteca libmodbus preinstalada para compilar un archivo ejecutable que funcione. Por defecto, las salidas de GCC
el ejecutable como un archivo llamado a.out. Si deseo cambiar el nombre del ejecutable a algo más significativo, puedo hacerlo
hágalo manualmente después de la compilación, o invoque la opción “outfile” de gcc y especifique el nombre del archivo ejecutable deseado:
(por ejemplo, gcc ­o tony.exe tony modbus ­lmodbus). Una vez compilado, el archivo ejecutable se puede ejecutar y los resultados de
la consulta Modbus visualizada en la pantalla del ordenador.
Machine Translated by Google

1120 CAPÍTULO 15. ADQUISICIÓN DE DATOS DIGITALES Y REDES

Cuando se utiliza la biblioteca libmodbus C/C++, la distinción entre leer registros de “entrada analógica”
(rango de direcciones 30001 a 39999) y registros “de retención” (rango de direcciones 40001 a 49999) se realiza
mediante la función libmodbus particular llamada. Para leer registros de “entrada analógica” en el rango de
direcciones 3XXXX, utilice la función modbus leer registros de entrada(). Para leer registros de “retención” en el
rango de direcciones 4XXXX, se utiliza la función de lectura de registros modbus(). Esta sutil diferencia en los
nombres de las funciones es importante. Consulte los dos ejemplos de código anteriores para verificar usted
mismo qué llamada de función se utiliza en cada una de las aplicaciones de lectura de registros.

15.11.5 Formatos de comando de función Modbus


Cada trama de datos Modbus, ya sea en modo ASCII o RTU, tiene un campo designado para "datos". Para cada
función Modbus, el contenido de este campo de “datos” sigue un formato específico. El propósito de esta
subsección es documentar los formatos de datos requeridos para las funciones Modbus comunes, tanto el
mensaje de "Consulta" transmitido por el dispositivo maestro Modbus a un dispositivo esclavo, como el mensaje
de "Respuesta" correspondiente transmitido al dispositivo maestro por el dispositivo esclavo consultado.
Dado que cada trama de datos Modbus está empaquetada en múltiplos de 8 bits (RTU), generalmente se
representan en texto como bytes individuales (dos caracteres hexadecimales). Por ejemplo, una “palabra” de 16
bits de datos Modbus como 1100100101011011 normalmente se documentaría como C9 5B con un espacio
deliberado que separa los bytes “alto” (C9) y “bajo” (5B).
Machine Translated by Google

15.11. MODBUS 1121

Código de función 01 – Leer bobina(s)

Esta función Modbus lee los estados de las salidas discretas del dispositivo esclavo (“bobinas”) dentro del dispositivo
esclavo y devuelve esos estados en bloques de ocho (¡incluso si el “número de bobinas” especificado en la consulta no es
múltiplo de ocho!). Las direcciones Modbus relevantes para esta función varían de 00001 a 09999 (decimal), pero la
dirección inicial es un número hexadecimal que representa el (n−1)ésimo registro desde el principio de este rango (por
ejemplo, la dirección decimal 00100 se especificaría como hexadecimal 00 63). .

Mensaje de consulta (Código de función 01)

dirección Código de Datos


de esclavo función Comprobación de errores
Comenzar dirección
inicial
Número de
bobinas
Fin
XX 01 XX
hola lo hola lo
Comenzar Detener

Mensaje de respuesta (Código de función 01)

dirección Código de Datos


de esclavo función Comprobación de errores
Comenzar
Número Primer byte (8 Segundo byte Tercer byte (8 bobinas) (8 Fin
de bytes
bobinas) bobinas)
XX 01 XX
Comenzar Detener

Tenga en cuenta que el segundo y tercer bytes que representan el estado de la bobina se muestran en gris, porque sus
La existencia supone que se ha solicitado más de un byte de bobinas en la consulta.
Machine Translated by Google

1122 CAPÍTULO 15. ADQUISICIÓN DE DATOS DIGITALES Y REDES

Código de función 02 – Leer contacto(s)

Esta función Modbus lee los estados de las entradas discretas ("contactos") del dispositivo esclavo dentro del
dispositivo esclavo y devuelve esos estados en bloques de ocho (¡incluso si el "número de contactos"
especificado en la consulta no es un múltiplo de ocho!). Las direcciones Modbus relevantes para esta función
van de 10001 a 19999 (decimal), pero la dirección inicial es un número hexadecimal que representa el
(n−1)ésimo registro desde el principio de este rango (por ejemplo, la dirección decimal 10256 se especificaría
como hexadecimal 00 FF ).

Mensaje de consulta (Código de función 02)

dirección Código de Datos


de esclavo función Comprobación de errores
Comenzar dirección
inicial
Número de
contactos
Fin
XX 02 XX
hola lo hola lo
Comenzar Detener

Mensaje de respuesta (Código de función 02)

dirección Código de Datos


de esclavo función Comprobación de errores
Comenzar
Número Primer byte Segundo byte Tercer byte (8 contactos) (8 Fin
de bytes
contactos) (8 contactos)
XX 02 XX
Comenzar Detener
Machine Translated by Google

15.11. MODBUS 1123

Código de función 03 – Leer registro(s) de retención

Esta función Modbus lee los estados de los registros "retenidos" dentro del dispositivo esclavo, y se supone que el
tamaño de cada registro es de dos bytes (16 bits). Las direcciones Modbus relevantes para esta función van de 40001
a 49999 (decimal), pero la dirección inicial es un número hexadecimal que representa el (n−1)ésimo registro desde el
principio de este rango (por ejemplo, la dirección decimal 40980 se especificaría como hexadecimal 03 D3 ).

Mensaje de consulta (Código de función 03)

dirección Código de Datos


de esclavo función Número Comprobación de errores
Comenzar dirección
inicial
Fin
de registros

XX 03 XX
hola lo hola lo
Comenzar Detener

Mensaje de respuesta (Código de función 03)

dirección Código de Datos


de esclavo función Número Primer Segundo Tercer Comprobación de errores
Comenzar registro registro registro Fin
de bytes

XX 03 XX
hola lo hola lo hola lo
Comenzar Detener

Tenga en cuenta que dado que el mensaje de consulta especifica el número de registros (cada registro tiene un
tamaño de dos bytes) y el mensaje de respuesta responde con el número de bytes, el campo "número de bytes" del
mensaje de respuesta tendrá un valor dos veces mayor que el de la consulta. campo “número de registros” del
mensaje. Tenga en cuenta también que el número máximo de registros que se pueden solicitar en el mensaje de
consulta (65536) con valores de bytes "altos" y "bajos" excede ampliamente el número de bytes que el mensaje de
respuesta puede informar (255) con su valor de un solo byte.
Machine Translated by Google

1124 CAPÍTULO 15. ADQUISICIÓN DE DATOS DIGITALES Y REDES

Código de función 04 – Leer registro(s) de entrada analógica

Esta función Modbus es prácticamente idéntica a 03 (Leer registros de retención), excepto que en su lugar lee
registros de “entrada”: direcciones 30001 a 39999 (decimal). Como ocurre con todas las direcciones relativas de
Modbus, la dirección inicial especificada en ambos mensajes es un número hexadecimal que representa el (n −
1)ésimo registro desde el principio de este rango (por ejemplo, la dirección decimal 32893 se especificaría como
hexadecimal 0B 4C).

Mensaje de consulta (Código de función 04)

dirección Código de Datos


de esclavo función Número Comprobación de errores
Comenzar dirección
inicial
Fin
de registros

XX 04 XX
hola lo hola lo
Comenzar Detener

Mensaje de respuesta (Código de función 04)

dirección Código de Datos


de esclavo función Número Primer Segundo Tercer Comprobación de errores
Comenzar registro registro registro Fin
de bytes

XX 04 XX
hola lo hola lo hola lo
Comenzar Detener

Tenga en cuenta que dado que el mensaje de consulta especifica el número de registros (cada registro tiene un
tamaño de dos bytes) y el mensaje de respuesta responde con el número de bytes, el campo "número de bytes" del
mensaje de respuesta tendrá un valor dos veces mayor que el de la consulta. campo “número de registros” del
mensaje. Tenga en cuenta también que el número máximo de registros que se pueden solicitar en el mensaje de
consulta (65536) con valores de bytes "altos" y "bajos" excede ampliamente el número de bytes que el mensaje de
respuesta puede informar (255) con su valor de un solo byte.
Machine Translated by Google

15.11. MODBUS 1125

Código de función 05 – Escritura (forzar) bobina única Esta función

Modbus escribe un solo bit de datos en una salida discreta (“bobina”) dentro del dispositivo esclavo.
Las direcciones Modbus relevantes para esta función varían de 00001 a 09999 (decimal), pero la dirección inicial es un número
hexadecimal que representa el (n−1)ésimo registro desde el principio de este rango (por ejemplo, la dirección decimal 07200 se
especificaría como hexadecimal 1C 1F). .

Mensaje de consulta/respuesta (Código de función 05)

dirección Función Datos


de esclavo código Comprobación de errores
Comenzar
dirección de la bobina
Forzar datos Fin
XX 05 XX
hola hola hola
Comenzar Detener

Los “datos de fuerza” para una bobina simple constan de 00 00 (bobina de fuerza apagada) o FF 00 (bobina de fuerza encendida).
Ningún otro valor de datos será suficiente; el dispositivo esclavo ignorará cualquier valor que no sea 00 00 o FF 00.

Un mensaje de respuesta normal será un simple eco (repetición textual) del mensaje de consulta.

Código de función 06 – Escribir (preestablecido) registro de retención único

Esta función Modbus escribe datos en un único registro "de retención" dentro del dispositivo esclavo. Las direcciones Modbus
relevantes para esta función varían de 40001 a 49999 (decimal), pero la dirección inicial es un número hexadecimal que representa el
(n − 1)ésimo registro desde el principio de este rango (por ejemplo, la dirección decimal 40034 se especificaría como hexadecimal 00
21). .

Mensaje de consulta/respuesta (Código de función 06)

dirección Código de Datos


de esclavo función Comprobación de errores
Comenzar Dirección de
registro
Datos
preestablecidos
Fin
XX 06 XX
hola hola hola
Comenzar Detener

Un mensaje de respuesta normal será un simple eco (repetición textual) del mensaje de consulta.
Machine Translated by Google

1126 CAPÍTULO 15. ADQUISICIÓN DE DATOS DIGITALES Y REDES

Código de función 15 – Escribir (forzar) múltiples bobinas Esta

función Modbus escribe múltiples bits de datos en un conjunto de salidas discretas (“bobinas”) dentro del dispositivo
esclavo. Las direcciones Modbus relevantes para esta función van de 00001 a 09999 (decimal), pero la dirección inicial
es un número hexadecimal que representa el (n − 1)ésimo registro desde el principio de este rango (por ejemplo, la
dirección decimal 03207 se especificaría como hexadecimal 0C 86). .

Mensaje de consulta (Código de función 15)

dirección Código de Datos


de esclavo función Comprobación de errores
Comenzar Número inicial de bobinas de dirección Número de Forzar la primera
palabra de datos
Forzar segunda
palabra de datos
Fin
bytes

XX 0F XX
hola hola hola hola lo hola lo
Comenzar Detener

Mensaje de respuesta (Código de función 15)

dirección Código de Datos


de esclavo función Comprobación de errores
Comenzar Número inicial de bobinas de dirección Fin
XX 0F XX
hola hola hola
Comenzar Detener

Tenga en cuenta que el mensaje de consulta especifica tanto el número de bobinas (bits) como el número de bytes.
Machine Translated by Google

15.11. MODBUS 1127

Código de función 16 – Escribir (preestablecido) registro de retención múltiple

Esta función Modbus escribe varias palabras de datos en un conjunto de registros "de retención" dentro del
dispositivo esclavo. Las direcciones Modbus relevantes para esta función varían de 40001 a 49999 (decimal), pero
la dirección inicial es un número hexadecimal que representa el (n − 1)ésimo registro desde el principio de este
rango (por ejemplo, la dirección decimal 47441 se especificaría como hexadecimal 1D 10) .

Mensaje de consulta (Código de función 16)

dirección Código de Datos


de esclavo función Datos Comprobación de errores
Comenzar Número inicial de Número de bytes de registros de direcciones Datos preestablecidos
preestablecidos primer registro segundo registro
Fin
XX 10 XX
hola hola hola hola hola hola
Comenzar Detener

Mensaje de respuesta (Código de función 16)

dirección Código de Datos


de esclavo función Comprobación de errores
Comenzar Número inicial de registros de direcciones Fin
XX 10 XX
hola hola hola
Comenzar Detener

Tenga en cuenta que el mensaje de consulta especifica tanto el número de registros (palabras de 16 bits)
como el número de bytes, que es redundante (el número de bytes siempre debe ser el doble del número de
registros, dado que cada registro tiene un tamaño de dos bytes80) . Tenga en cuenta también que el número
máximo de registros que se pueden solicitar en el mensaje de consulta (65536) con valores de bytes "altos" y
"bajos" excede ampliamente el número de bytes que el mensaje de respuesta puede informar (255) con su valor de un solo byte.

80Incluso para dispositivos donde el tamaño del registro es inferior a dos bytes (por ejemplo, los controladores modelo Modicon M84 y 484 tienen
10 bits dentro de cada registro), los datos aún se abordan como dos bytes por registro, con los bits iniciales simplemente establecidos en cero para
actuar. como marcadores de posición.
Machine Translated by Google

1128 CAPÍTULO 15. ADQUISICIÓN DE DATOS DIGITALES Y REDES

15.11.6 Valores de coma flotante en Modbus


El estándar ANSI/IEEE 754­1985 para la representación de datos de punto flotante especifica 32 bits para la forma más básica
(“precisión simple”) de número de punto flotante. Sin embargo, el estándar Modbus especifica que los registros de entrada y
retención de Modbus sean de 16 bits cada uno. Por lo tanto, si deseamos leer o escribir un valor de punto flotante dentro de un
dispositivo esclavo Modbus, debemos emitir un comando Modbus para leer o escribir dos registros de 16 bits que representen un
valor de punto flotante de 32 bits. La tarea de unir dos números de 16 bits en un único número de 32 bits, o dividir un número de
32 bits en dos números de 16 bits, se deja en manos del dispositivo maestro. Si el dispositivo maestro en cuestión es una unidad
PLC o HMI moderna, lo más probable es que esta conversión de 16/32 bits sea manejada por la instrucción de lectura/escritura
Modbus, de modo que todo lo que debe hacer es especificar la primera dirección Modbus para el par de registros y la instrucción
de lectura/escritura se encarga de todos los demás detalles. Sin embargo, si está programando una computadora usando un
lenguaje de bajo nivel, debe lidiar con estos detalles en su propio código.

Un problema importante aquí es la falta de estandarización entre los fabricantes de dispositivos Modbus con respecto a cómo
se deben dividir exactamente los números de punto flotante de 32 bits en dos valores de registro de 16 bits.
Algunos fabricantes simplemente toman los 32 bits del número de punto flotante y los dividen en dos números secuenciales de
16 bits en orden (denominado orden "ABCD", donde cada letra representa un byte del número de punto flotante original de 32
bits). . Otros invierten el orden de la primera y segunda pieza de 16 bits (es decir, ordenamiento de bytes “CDAB”). Otros aún
tratan el valor de coma flotante de 32 bits como un conjunto de cuatro bytes independientes que pueden mezclarse en cualquiera
de varios ordenamientos diferentes (por ejemplo, “BADC”, “DCBA”, etc.). El estándar Modbus no ofrece ninguna orientación al
respecto, dejando la elección a los fabricantes de dispositivos.

Al programar en los lenguajes informáticos C o C++, una estrategia conveniente para empalmar o dividir estos números de
diferentes longitudes de bits es utilizar la estructura de unión. Una “unión” en estos lenguajes es un espacio reservado en la
memoria de la computadora al que pueden acceder elementos de diferente longitud de bits. Por ejemplo, el siguiente fragmento
de código C muestra cómo declarar una unión llamada basura que tiene un tamaño de 32 bits y que puede abordarse como un
único valor de punto flotante de 32 bits llamado junk.fp, o como dos valores de 16 bits. valores enteros llamados junk.intg[0] y
junk.intg[1], o como cuatro valores de 8 bits llamados junk.by[0] hasta junk.by[3]:

listado de código C

unión
{ flotador fp ;
uint 1 6 tinte [ 2 ] ; uint 8t por
[4]; } basura ;

Esta unión podría escribirse con 32 bits de datos (en un paso, como un valor de punto flotante) y luego leerse como dos
valores de 16 bits y/o como cuatro valores de 8 bits. La estructura de unión brinda a cualquier desarrollador de software la
capacidad de hacer referencia a un área común de la memoria de la computadora como diferentes tipos de números.
Machine Translated by Google

15.11. MODBUS 1129

El siguiente código es un programa completo que lee dos registros consecutivos de “entrada analógica” de 16 bits.
en las direcciones 30020 y 30021 y combinándolas en un único valor de punto flotante de 32 bits con
Ordenamiento “CDBA”. Tanto los valores de registro originales de 16 bits como el valor final de punto flotante
se muestran en la pantalla de la computadora al momento de la ejecución:

listado de código C

#incluye <stdio. h>


#incluir <modbus. h>

modbus t Dispositivo;

int principal ( vacío)


{
int readcount;

unión {
uint 1 6 t palabra [2];
uint 8 t byte [4];
} en ;

unión {
flotar real;
uint 8 t byte [4];
} afuera ;

"
Dispositivo = modbus nuevo tcp (” 5 0 2 1);9 2 . 1 6 8 . 0. 1 0 ,
,
modbusseterrorrecover y (ENLACE DE RECUPERACIÓN DE ERROR MODBUS del dispositivo);

readcount = modbusreadinputre gi sters ( Dispositivo , 19, 2 , en . palabra ) ;

printf (”Valor del registro de 16 bits 30020 = %i \n”, printf (”Valor del en . palabra [0]);
registro de 16 bits 30021 = %i \n”, en . palabra [1]);

afuera . byte [ 0 ] = pulg . byte [2];


afuera . byte [ 1 ] = pulg . byte [3];
afuera . byte [ 2 ] = pulgadas . byte [0];
afuera . byte [ 3 ] = pulg . byte [1];

printf (”Valor del número de punto flotante de 32 bits = %f \n”, afuera . real ) ;

modbus close (Dispositivo);


modbusf ree (Dispositivo);

volver a contar;
}
Machine Translated by Google

1130 CAPÍTULO 15. ADQUISICIÓN DE DATOS DIGITALES Y REDES

Este programa utiliza un par de uniones de 32 bits (una llamada de entrada y la otra de salida) para hacer el
intercambio de bytes. Primero, los dos registros de 16 bits leídos por la función Modbus leen registros de entrada ()
se almacenan en la estructura in como dos “palabras” de 16 bits dirigidas en.palabra[0] y en.palabra[1]. Entonces,
Los datos de esas dos palabras se abordan como cuatro bytes, cada uno escrito en un lugar diferente.
dentro de la unión exterior por las cuatro declaraciones de asignación. Observe cómo a out.byte[0] se le asigna el
valor almacenado dentro de in.byte[2] y así sucesivamente: así es como se especifica el orden CDBA. uno podría
especifique el orden ABCD o el orden DCBA o cualquier otra combinación de esos cuatro bytes asignando
los cuatro bytes de salida a valores de diferentes bytes de entrada, y el código sería igual de sencillo de
entender.

Si tiene suerte, la biblioteca Modbus que está utilizando vendrá completa con funciones
diseñado para tomar pares de registros de 16 bits y convertirlos en números de punto flotante únicos. Al
Al momento de escribir este artículo (2016), la biblioteca gratuita libmodbus ofrece tales funciones. Una de esas funciones
(modbus get float()) se muestra aquí con fines ilustrativos, leyendo el contenido de la entrada analógica
registra 32999 y 33000 y muestra el valor de punto flotante convertido (ordenado "ABCD"):

listado de código C

#incluye <stdio. h>


#incluir <modbus. h>

modbus t Dispositivo;

int principal ( vacío)


{
int readcount;
uint 1 6 t palabra [2] float ;
real;

"
Dispositivo = modbus new tcp ( ” 1 9 2 . 6 8 . 0 . 1 0 , 5 0 2 );
modbusseterrorrecover y ( Dispositivo , ENLACE DE RECUPERACIÓN DE ERROR DE MODBUS);

readcount = modbusreadinputre gi sters ( Dispositivo , 2998 , 2 , palabra ) ;

printf(”Valor del registro de 16 bits 32999 = %i \n”, palabra [0]);


printf(”Valor del registro de 16 bits 33000 = %i \n”, palabra [1]);

real = modbusget float (palabra);

printf (”Valor del número de punto flotante de 32 bits = %f \n”, real ) ;

modbus close (Dispositivo);


modbusf ree (Dispositivo);

volver a contar;
}
Machine Translated by Google

15.12. REVISIÓN DE PRINCIPIOS FUNDAMENTALES 1131

Lamentablemente, a menudo encontrará que el orden arbitrario de bytes utilizado por cualquier fabricante de
dispositivo esclavo Modbus en particular está mal documentado, si es que lo está. Esto significa que es posible que tenga
que experimentar con diferentes ordenamientos de bytes antes de lograr leer o escribir datos de punto flotante
correctamente. Algunos fabricantes de dispositivos Modbus son lo suficientemente reflexivos como para ofrecer opciones
configurables sobre cómo se representarán sus valores de punto flotante de 32 bits dentro del dispositivo esclavo. Del
mismo modo, muchos fabricantes de dispositivos maestros Modbus (por ejemplo, PLC y HMI) ofrecen opciones sobre
cómo leer y escribir valores de punto flotante en sus instrucciones de lectura y escritura Modbus, porque no saben con
qué dispositivo esclavo Modbus se puede estar comunicando.

15.12 Revisión de principios fundamentales


Aquí se muestra una lista parcial de principios aplicados en el tema de este capítulo, con el propósito de ampliar la visión
del lector sobre los conceptos de este capítulo y de sus interrelaciones generales con conceptos de otras partes del libro.
Sus habilidades como solucionador de problemas y como aprendiz permanente mejorarán enormemente al dominar las
aplicaciones de estos principios a una amplia variedad de temas, cuanto más variados, mejor.

• Señales analógicas versus digitales: las señales analógicas tienen una resolución infinita pero son susceptibles a la
corrupción por el ruido. Las señales digitales tienen una resolución limitada pero toleran cualquier ruido que mida
menos que la diferencia de umbrales entre los estados alto y bajo.

• Teorema de superposición: cualquier red eléctrica bilateral lineal con múltiples fuentes se puede analizar tomando
una fuente a la vez (mientras se reemplazan todas las demás fuentes con sus valores de impedancia interna) y
analizando todos los voltajes y corrientes, luego superponiendo (sumando) esos voltajes y valores actuales para
obtener los voltajes y corrientes con todas las fuentes activas.
Relevante para analizar señales de CC y CA en circuitos de instrumentos HART.

• Líneas de transmisión: señales eléctricas de corta duración (pulsadas) viajan a lo largo de un cable casi a la
velocidad de la luz, reflejándose en el extremo de ese cable si no se termina adecuadamente. Relevante para
cables de señal que transportan señales de alta frecuencia.

• Circuitos opamp autoequilibrados: todos los circuitos amplificadores operacionales autoequilibrados funcionan según
el principio de retroalimentación negativa que mantiene un voltaje de entrada diferencial casi nulo al opamp. Hacer
la “suposición simplificadora” de que el voltaje de entrada diferencial del opamp es exactamente cero ayuda en el
análisis del circuito, al igual que la suposición de que los terminales de entrada consumen una corriente insignificante.

También podría gustarte