Explicación detallada del protocolo Modbus

Explicación detallada del protocolo Modbus

Los protocolos de comunicación se refieren a las reglas y acuerdos que las entidades de ambas partes deben seguir para completar las comunicaciones o servicios. Por ejemplo, para lograr la comunicación entre personas, debemos acordar un idioma unificado, un texto unificado, una velocidad de habla específica, etc.

Para los dispositivos, el protocolo define el formato utilizado por la unidad de datos (como los modos big-endian y little-endian, métodos de codificación y decodificación, reglas de cifrado y descifrado), la información y el significado que debe contener la unidad de información, el método de conexión. y el momento de la transmisión y recepción de la información, lo que garantiza una transmisión fluida de los datos a la otra parte.

1. Introducción

Modbus es un protocolo de comunicación en serie. Fue publicado por Modicon (ahora Schneider) en 1979 para la comunicación de PLC con controladores lógicos programables, así que ahora sabes por qué comienza con Mod. No solo lo utilizan los PLC, sino que en realidad se ha convertido en un campo industrial. El estándar de protocolo de comunicación es un método de conexión comúnmente utilizado entre equipos electrónicos industriales modernos. Modbus está disponible públicamente y no tiene derechos de autor, lo que facilita su implementación y mantenimiento.

Echemos un vistazo a los detalles relacionados con el protocolo Modbus y cómo se aplica el protocolo Modbus.

Comunicación paralela: los datos se transmiten simultáneamente.

Comunicación en serie: los datos se transmiten bit a bit en secuencia.

2. Interfaz física

El protocolo Modbus es un protocolo de capa de aplicación.El protocolo en sí no SPIdefine la capa física I2C, TCP/IPsolo define el formato común de la estructura y el contenido de la organización del paquete de datos. Por lo tanto, no tiene su propia capa de enlace de datos y capa física dedicadas, por lo que necesita depender de otras capas físicas y capas de enlace de datos disponibles para transmitir datos.

Por ejemplo, puede elegir un puerto serie (como RS232, RS485 y RS422) o un puerto Ethernet, pero la mayoría de las aplicaciones actuales utilizan el puerto serie RS-485 como capa física, como se muestra en la siguiente figura.

Por favor agregue la descripción de la imagen.

De hecho, no se limita a las interfaces físicas anteriores: dado que Modbus es un protocolo de capa de aplicación, el protocolo en sí se comunica independientemente de la red a través de la cual se comunican los datos. Por lo tanto, los datos también se pueden transmitir mediante USB, Bluetooth, WiFi y otros buses que pueden transmitir datos en serie como capa física y capa de enlace de datos.

El puerto Modbus estándar utiliza una interfaz serie compatible con RS-232C, que define los pines, cables, bits de señal, velocidad de transmisión en baudios y paridad del puerto de conexión, de modo que el controlador se puede conectar en red directamente o mediante un módem.

3. Versión del protocolo

Actualmente, el protocolo Modbus define reglas para la transmisión de datos basadas en puertos serie y Ethernet, entre ellas, existen dos tipos de reglas de puerto serie: Modbus RTU y Modbus ASCII, y un tipo de regla Ethernet es Modbus TCP/IP.

Para enlaces serie se utilizan los protocolos Modbus RTU y Modbus ASCII (RS232, RS485, RS422, fibra óptica, inalámbricos) y para enlaces Ethernet se utiliza el protocolo Modbus TCP/IP.


Modbus también tiene una versión extendida, Modbus PLUS (también llamada Modbus+ o MB+), pero este protocolo es propiedad de Modicon y es diferente de Modbus. Requiere un coprocesador especializado para manejar la rotación de tokens de alta velocidad como HDLC.

No usamos MB +, por lo que no lo entendemos en profundidad, solo necesitamos comprender los tres modos Modbus-TCP/IP, Modbus-RTU y Modbus-ASCII.

4. Modo de trabajo

El protocolo Modbus es un protocolo de comunicación maestro-esclavo (Maestro/Esclavo). Entre todos los nodos uno es el nodo Maestro y el resto son nodos Esclavos, existiendo al menos y solo un nodo Maestro en toda la red de comunicación.

La comunicación maestro-esclavo se basa principalmente en solicitud/respuesta . En cada comunicación, la estación maestra primero envía una instrucción (puede ser una instrucción de transmisión o una instrucción de unidifusión a una estación esclava específica). La estación esclava responde a la instrucción y responde según sea necesario, o informes anormales. Cuando la estación maestra no envía una solicitud, la estación esclava no enviará datos por sí misma y las estaciones esclavas no pueden comunicarse directamente entre sí (es decir, las estaciones esclavas no pueden enviar instrucciones ni acceder entre sí).

Independientemente de si la estación maestra envía un comando de transmisión o un comando de unidifusión, de hecho, todos los dispositivos esclavos recibirán el comando por completo. Sin embargo, el dispositivo ejecutará y responderá al comando de unidifusión solo si el número/dirección especificado en el comando es el mismo que el número/dirección del dispositivo. Si el número/ dirección es diferente del número/dirección especificado en el comando, el El esclavo descartará todo el contenido recibido. Todos los dispositivos que reciban el comando de transmisión ejecutarán el comando, pero no responderán al host.

comunicación semidúplex

Modbus no puede comunicarse sincrónicamente debido al mecanismo de solicitud/respuesta (la comunicación síncrona requiere que tanto el remitente como el receptor envíen y reciban datos al mismo ritmo). Solo se transmite una trama de datos en el bus a la vez, que es la mitad de comunicación dúplex.

Modbus no admite el procesamiento del mecanismo ocupado. Por ejemplo, el host envía un comando al esclavo. Si el esclavo está procesando otras tareas, el esclavo no podrá responder al host en este momento, por lo que es necesario utilizar software para determinar si se recibe normalmente.

5. Descripción general del acuerdo

(1) La comunicación del controlador utiliza el modo maestro/esclavo, es decir, solo el dispositivo maestro puede enviar comandos de consulta y operación, y otros dispositivos esclavos responden en consecuencia de acuerdo con los comandos de consulta/operación del dispositivo maestro.

(2) El dispositivo maestro puede comunicarse con los dispositivos esclavos individualmente o con todos los dispositivos esclavos en forma de transmisión. Si se comunica solo, el dispositivo esclavo debe devolver un mensaje como respuesta al host. Si la consulta se transmite, el dispositivo esclavo no responderá.

(3) El protocolo Modbus establece un formato de protocolo para la consulta del dispositivo maestro, que incluye: dirección del dispositivo esclavo (o transmisión), código de función, todos los datos que se enviarán y campo de detección de errores (código de verificación de protocolo).

(4) El mensaje de respuesta del dispositivo también debe seguir el protocolo Modbus, incluido el campo para confirmar la acción, los datos que se devolverán y el campo de detección de errores (código de verificación de protocolo). Si ocurre un error durante la recepción del mensaje, o el dispositivo esclavo no puede ejecutar su comando, el dispositivo esclavo necesita generar un mensaje de error y enviarlo al dispositivo maestro como respuesta. Después de que el dispositivo maestro lo reciba, sabrá que se produjo un error. ha ocurrido en el dispositivo esclavo y puede saber qué error ocurrió.

6. Formato del mensaje

El formato básico del mensaje (o trama) del protocolo Modbus es:

协议头(Header) + 功能码(Function Code) + 数据区(Data) + 校验码(Checksum)

El código de función (Código de función) y el área de datos (Datos) están fijos en diferentes tipos de redes.

El encabezado del protocolo (encabezado) y la suma de verificación (suma de verificación) difieren según la implementación de la red subyacente. El encabezado del protocolo contiene la dirección de la estación esclava, el código de función le dice a la estación esclava qué función realizar y el área de datos es el contenido de datos específico.

El mensaje define una unidad de datos de protocolo (PDU para abreviar) que es independiente de la capa física. Los campos del protocolo de la PDU se componen de la siguiente manera:

PDU = 功能码(Function Code) + 数据域(Data)(功能码 1 Byte,数据域不确定)

Para diferentes tipos de redes, la implementación de la capa de protocolo Modbus es la misma, la diferencia radica en la implementación de la capa inferior, las dos más comunes son TCP/IP y comunicación serie .

Por favor agregue la descripción de la imagen.

Como se muestra en la figura anterior, la capa física de la transmisión en serie Modbus es RS-485/422 o RS-232, y la capa de enlace de datos es el protocolo de transmisión en serie de Modbus.

Las 1-4capas de transmisión de Modbus TCP son las mismas que las de Ethernet e Internet que utilizamos a diario, que son capa física, capa de enlace de datos, capa de red y capa de transporte. Al mismo tiempo, el estándar estipula que el número de puerto TCP predeterminado utilizado por Modbus-TCP es 502.

6.1 Modbus-TCP/IP

En el modo Modbus TCP, la estación maestra se llama cliente y la estación esclava se llama servidor (Servidor) porque la estación maestra Modbus siempre consulta a la estación esclava Modbus para obtener datos operativos, que es el mismo que el modo de operación del cliente y servidor idéntico.

6.1.1 Marco de datos

Para la comunicación TCP/IP, el protocolo Modbus introduce algunos campos adicionales asignados a unidades de datos de aplicación (ADU), y la ADU se puede dividir en dos partes: MBAP y PDU. La relación entre las dos partes es la siguiente:

PDU = 功能码(Function Code) + 数据域(Data)(功能码 1 Byte,数据域长度不确定)。
ADU = MBAP+PDU

El marco de datos consta de la siguiente figura:

Por favor agregue la descripción de la imagen.

Entre ellos, MBAP (encabezado de mensaje) ocupa 7 bytes, el código de función 1 byte y la longitud del campo de datos es incierta y está determinada por la función específica, como se muestra a continuación:

ID de transacción identificador de protocolo longitud identificador de unidad
2 bytes 2 bytes 2 bytes 1 byte

El identificador de transacción puede entenderse como el número de secuencia del mensaje. Generalmente se agrega 1 después de cada comunicación para distinguir diferentes mensajes de datos de comunicación.

Identificador de protocolo , por ejemplo, 00 00representa el protocolo Modbus-TCP/IP.

Longitud , que indica la longitud del siguiente dato, en bytes.

El identificador de la unidad puede entenderse como la dirección del dispositivo.

El mensaje de ADU se amplía en detalle como se muestra a continuación:

Por favor agregue la descripción de la imagen.

6.1.2 Cambios en el marco de datos

Por favor agregue la descripción de la imagen.

(1) Se cancela el dígito de control y se realiza la verificación CRC-32 en la capa de enlace de datos del protocolo TCP/IP. Al mismo tiempo, TCP/IP es un protocolo de confiabilidad orientado a la conexión, por lo que no es necesario para que la capa de aplicación agregue el dígito de control.

(2) La dirección del esclavo se convierte en un identificador de unidad. Cuando todos los dispositivos en la red usan el protocolo TCP/IP, la dirección no tiene sentido, porque la dirección IP se puede usar para enrutamiento y direccionamiento. Si hay comunicación en serie en el equipo de red , necesita usar una puerta de enlace para implementar la conversión de protocolo de Modbus-TCP/IP a Modbus-RTU/ASCII. En este momento, use el Identificador de unidad para identificar cada dispositivo de comunicación serial detrás de la puerta de enlace.

(3) La longitud se refiere al número total de bytes siguientes. De hecho, se puede determinar la longitud del área de datos. Algunos códigos de función pueden determinar la longitud del área de datos (como el código de función de lectura de registro). Algunos códigos de función no pueden determinar la longitud del área de datos, pero el área de datos del protocolo Modbus contiene un recuento de bytes (esto se explicará más adelante). La longitud aumentada del encabezado es para hacer frente a escenarios en los que el protocolo TCP/IP descomprime y transmite datos de la capa de aplicación.

(4) El identificador de transacción y el identificador de protocolo son generados por el Cliente, y la respuesta del Servidor copiará estos parámetros.

6.1.3 Número de puerto

La Autoridad de Números Asignados de Internet (IANA) asigna el número de puerto TCP al protocolo Modbus 502. Este es actualmente el único número de puerto asignado a Modbus en la industria de instrumentación y automatización.

6.1.4 Proceso de comunicación

Cuando se utiliza la comunicación TCP/IP, la estación maestra es el Cliente y establece activamente una conexión con el servidor. La estación esclava está en el lado del servidor, esperando que el cliente se conecte.

Tenga en cuenta que es necesario establecer una conexión TCP antes de utilizar la comunicación Modbus. Cuando se completa la tarea de comunicación, es necesario cerrar la conexión TCP. Esta es la misma regla que el cliente de PC que se conecta al servidor.

6.2 Modbus serie

Cuando Modbus utiliza transmisión de enlace serie asíncrona, puede elegir cualquiera de los dos modos de transmisión: ASCII o RTU. Cuando utilice la transmisión en serie asíncrona, debe asegurarse de que los parámetros de configuración del hardware de comunicación en serie (velocidad en baudios, método de verificación, etc.) de cada dispositivo sean los mismos.

6.2.1 Modbus-ASCII

En modo Modbus ASCII, la estación maestra es Maestra y la estación esclava es Esclava.

bit de inicio Dirección del dispositivo Código de función Cantidad de datos datos Byte alto LRC Byte bajo de LRC terminador
: 2*8 bits 2*8 bits norte n*8 bits 8 bits 8 bits CR, LF (retorno de carro, avance de línea)

Modbus se comunica en modo ASCII y cada byte de 8 bits del mensaje se envía como dos caracteres ASCII, es decir, se utilizan dos caracteres para representar el valor hexadecimal de 1 byte, por lo que lo que ves es lo que obtienes.

Por ejemplo, para representar hexadecimal, 35necesita usar los dos caracteres 3y 5, y cada carácter ocupa 1 byte. El 3valor real del carácter es hexadecimal 33, y el 5valor real del carácter es 35, por lo que para representarlo, 3016 Bits Es necesario usar datos, por lo que el valor real Los datos enviados son 00110011, 00110101, pero estos no son los datos finales utilizados. El extremo receptor debe convertirlos al valor original antes de poder usarlos.

Intervalo de cuadros ASCII

Usando el modo ASCII, el mensaje comienza con :dos puntos (código ASCII 3A) y termina con un retorno de carro y un carácter de avance de línea 0D,.0A

Otros caracteres que el campo puede utilizar para expresar valores hexadecimales son 0-9, A-F. Los dispositivos en la red detectan continuamente :caracteres de dos puntos. Cuando cada dispositivo de nodo recibe dos :puntos, cada dispositivo decodifica el siguiente campo (el campo de dirección del dispositivo) para determinar si está dirigido a sí mismo.

El intervalo de tiempo máximo entre caracteres en el mensaje enviado no puede exceder 1 segundo, de lo contrario el dispositivo receptor considerará el error de transmisión. Un marco de mensaje ASCII típico es el siguiente:

bit de inicio Dirección del dispositivo Código de función datos cheque LRC terminador
1 personaje 2 personajes 2 personajes n caracteres 2 personajes 2 personajes
6.2.2 Modbus RTU

En el modo Modbus RTU, la estación maestra es Maestra y la estación esclava es Esclava.

bit de inicio Dirección del dispositivo Código de función Cantidad de datos datos Byte bajo CRC Byte alto CRC terminador
ninguno 8 bits 8 bits norte n*8 bits 8 bits 8 bits ninguno

Modbus se comunica en modo RTU y los datos de bytes que envía son los datos de bytes originales, y el extremo receptor no necesita convertirlos nuevamente después de recibirlos.

Por ejemplo, para transferir hexadecimal 35, los datos reales enviados son el valor sin procesar 0011, 0101.

Intervalo de trama RTU

Usando el modo RTU, el envío de mensajes debe comenzar con un intervalo de pausa de al menos 3,5 caracteres. Esto es más fácil de lograr con varios tiempos de caracteres a velocidades en baudios de la red (como se muestra en la siguiente figura T1-T2-T3-T4). El primer campo transferido es la dirección del dispositivo. Los caracteres de transmisión que se pueden utilizar son hexadecimales 0-9, A-F. Los dispositivos de red monitorean continuamente el bus de red, incluso durante los intervalos de pausa. Cuando se recibe el primer campo (el campo de dirección), cada dispositivo lo decodifica para ver si está destinado a sí mismo. Después del último carácter transmitido, una pausa de al menos 3,5 caracteres marca el final del mensaje. Se puede iniciar un nuevo mensaje después de esta pausa.

Todo el telegrama debe transmitirse como un flujo continuo. Si hay una pausa de más de 1,5 caracteres antes de que se complete la trama, el dispositivo receptor eliminará el mensaje incompleto y asumirá que el siguiente byte es el campo de dirección de un nuevo mensaje. Asimismo, si un nuevo mensaje comienza con menos de 3,5 caracteres del mensaje anterior, el dispositivo receptor lo considerará una continuación del mensaje anterior. Esto causará un error porque el valor en el último campo CRC no puede ser correcto. Un marco de mensaje RTU típico se ve así:

bit de inicio Dirección del dispositivo Código de función datos verificación CRC terminador
T1-T2-T3-T4 8 bits 8 bits n 8 bits 16 bits T1-T2-T3-T4
tiempo del personaje

El llamado tiempo de transmisión de caracteres se refiere al tiempo que lleva transmitir un carácter ASCII. Un carácter ASCII contiene 1 byte (8 bits), por lo que se necesitan 8 bits de datos para transmitir un carácter (por lo que el tiempo de transmisión de caracteres aquí no es realmente literalmente significa transmitir caracteres, pero se refiere a transmitir bytes).

Sin embargo, en realidad se necesitan más de 8 bits para transmitir 1 byte de datos, porque además de transmitir los datos inherentes de 1 byte, también es necesario transmitir algunos bits de funciones auxiliares. Por ejemplo, para enviar 1 byte, necesita arreglar 1 bit de inicio, 8 bits de datos, 1 bit de paridad (opcional) y 1 bit de parada. Entre ellos, 8 bits de datos son los datos realmente válidos, por lo que la siguiente fórmula para calcular el tiempo del personaje.

Tiempo de carácter = 1 s de velocidad en baudios × número total de caracteres. Tiempo de carácter = \frac{1s}{velocidad en baudios} \veces el número total de caracteres.tiempo del personaje=tasa de baudios1 segundo×Número total de caracteres.

Por ejemplo: 1 bit de inicio fijo, 8 bits de datos, 1 bit de paridad par/impar, 1 bit de parada, la velocidad en baudios es 9600 bps, calcule el tiempo de transmisión de un solo carácter como:

Tiempo de carácter = 1000 ms 9600 × ( 1 + 8 + 1 + 1 ) = 1,145833 ms Tiempo de carácter = \frac{1000ms}{9600} \times (1+8+1+1)=1,145833mstiempo del personaje=96001000ms _ _×( 1+8+1+1 )=1,145833 m s

7. Análisis del campo del marco.

7.1 Campo de dirección

Las posibles direcciones de dispositivos esclavos en el campo de dirección del telegrama son 0-247. El rango de direcciones para un solo dispositivo es 1-247.

El dispositivo maestro controla el dispositivo esclavo colocando la dirección del dispositivo esclavo con el que desea contactar en el campo de dirección del mensaje. Cuando el dispositivo esclavo envía un mensaje de respuesta, debe ingresar su propia dirección en el campo de dirección de la respuesta para que el dispositivo maestro sepa qué dispositivo está respondiendo.

La dirección 0se utiliza como dirección de difusión para que todos los dispositivos esclavos la conozcan. Cuando se utiliza el protocolo Modbus en redes de nivel superior, es posible que no se permita ni se reemplace la transmisión.

7.2 Dominio funcional

El rango de código posible del campo de código de función en el marco del mensaje es decimal 1-255. Por supuesto, algunos códigos se aplican a todos los controladores, otros se aplican a ciertos controladores y otros están reservados para su uso posterior.

Cuando se envía un mensaje desde el dispositivo maestro al dispositivo esclavo, el campo de código de función le indica al dispositivo esclavo qué acciones debe realizar. Por ejemplo, para leer el estado del interruptor de entrada, leer el contenido de datos de un conjunto de registros, leer el estado de diagnóstico del dispositivo esclavo, permitir llamar, grabar y verificar el programa en el dispositivo esclavo, etc.

Cuando el dispositivo esclavo responde, utiliza el campo del código de función para indicar si respondió normalmente (sin error) o si ocurrió algún tipo de error (llamado respuesta de excepción). Para respuestas normales, el dispositivo esclavo solo responde con el código de función correspondiente. En respuesta a la objeción, el dispositivo esclavo devuelve un código equivalente al código normal, pero el bit más significativo (el bit más alto del código de función) está configurado en lógica 1.
Por ejemplo: un mensaje enviado desde el dispositivo maestro al dispositivo esclavo requiere leer un conjunto de registros de retención y se generará el siguiente código de función: (Hex 0000, 0011) 03Para una respuesta normal, el dispositivo esclavo solo responde con el mismo código de función. En respuesta a las objeciones, devuelve: 1000, 0011(hexadecimal 83).

Además de que el código de función se modifica debido al error de objeción, el dispositivo esclavo coloca un código único en el campo de datos del mensaje de respuesta, que puede indicarle al dispositivo maestro qué error ocurrió.

Después de que la aplicación del dispositivo maestro reciba una respuesta a la objeción, reenviará el mensaje o diagnosticará el mensaje enviado al dispositivo esclavo y lo informará al administrador del dispositivo.

7.3 Campo de datos

El campo de datos se compone de dos conjuntos de números hexadecimales y el rango de valores de cada byte de datos es 00-FF.

El campo de datos del mensaje del maestro al esclavo contiene información adicional: el esclavo debe usarse para realizar lo definido por el código de función. Esto incluye cosas como direcciones de registros discretos, la cantidad de elementos que se procesarán y la cantidad real de bytes de datos en el campo.

ejemplo

Si el dispositivo maestro necesita leer un conjunto de registros de retención (código de función 03) del dispositivo, el campo de datos especifica el registro inicial y la cantidad de registros que se leerán (aquí no es equivalente a la cantidad de bytes).

Si el dispositivo maestro escribe un conjunto de registros del dispositivo esclavo (código de función 10), el campo de datos especifica el registro inicial que se escribirá y el número de registros que se escribirán (esto no es equivalente al número de bytes). bytes en el campo de datos, Los datos que se escribirán en el registro.

Si no se produce ningún error, el campo de datos devuelto por el dispositivo esclavo contiene los datos solicitados. Si se produce un error, este campo contiene un código de excepción que la aplicación del dispositivo host puede utilizar para determinar el problema y seguir los siguientes pasos.

El campo de datos puede estar ausente (es decir, longitud 0) en ciertos mensajes. Por ejemplo, el dispositivo maestro requiere que el dispositivo esclavo responda al registro de evento de comunicación (código de función 0B), y el dispositivo esclavo no requiere que el dispositivo maestro proporcione ninguna información adicional.

7.4 Dominio de detección de errores

La red Modbus estándar tiene dos métodos de detección de errores y el contenido del campo de detección de errores depende del método de detección seleccionado.

Modo ASCII, el campo de detección de errores contiene dos caracteres ASCII. Esto se calcula utilizando el método LRC (detección de verbosidad longitudinal) en el contenido del mensaje, excluyendo los dos puntos iniciales y los caracteres de retorno de carro y avance de línea. El carácter LRC se añade al carácter de retorno de carro y de avance de línea.

En el modo RTU, el campo de detección de errores contiene un valor de 16 bits y se divide en dos bytes, divididos en byte alto y byte bajo. El contenido del campo de detección de errores se obtiene realizando un método de detección de detalle cíclico en el contenido del mensaje. El campo CRC se añade al final del mensaje, primero el byte bajo y luego el byte alto. Por lo tanto, el byte de orden superior del CRC es el último byte del mensaje enviado.

7.4.1 Verificación del LRC

El campo LRC detecta el contenido en el campo del mensaje, excepto los dos puntos iniciales y el retorno de carro final y el avance de línea. El campo LRC es un byte que contiene un valor binario de 8 bits. El valor LRC es calculado por el dispositivo transmisor y colocado en el marco del mensaje. El dispositivo receptor calcula el LRC durante el proceso de recepción del mensaje y lo compara con el valor LRC en el mensaje recibido. Si los dos valores no son iguales , significa que hay un error.

El método LRC consiste en acumular continuamente los bytes de 8 bits en el mensaje y descartar el bit de acarreo acumulado durante la acumulación.

unsigned char LRC(unsigned char * auchMsg, unsigned short dataLen)
{
    
    
    unsigned char authLRC = 0; /* LRC 字节初始化 */

    while (dataLen--) {
    
     /* 传送消息 */
        authLRC += (*auchMsg)++; /* 累加 */
    }
    return ((unsigned char)(-authLRC));
}
7.4.2 Verificación CRC

El campo CRC detecta el contenido de todo el mensaje. El campo CRC tiene dos bytes y contiene un valor binario de 16 bits. Lo calcula el dispositivo transmisor y lo agrega al mensaje. El dispositivo receptor vuelve a calcular el CRC del mensaje recibido y lo compara con el valor en el campo CRC del mensaje recibido. Si los dos valores son diferentes, hay un error.

Cuando se agrega el CRC a un mensaje, primero se agrega el byte bajo al mensaje y luego el byte alto.

8. modelo de datos

El protocolo Modbus se utilizó por primera vez en la comunicación PLC. Para abstraer los datos accesibles en el PLC, el protocolo Modbus define el concepto de modelo de datos . El modelo de datos define cuatro tipos de datos accesibles, que son:

(1) Bobinas de salida (bobinas), el tamaño es de solo 1 bit, pertenecen al valor de conmutación, el rango de valores es ONo OFF, la autoridad es 可读可写, puede ser un punto de salida o un punto de entrada digital.

(2) Ingrese una cantidad discreta (entrada discreta), es una cantidad discreta, el tamaño es de solo 1 bit, el rango de valores es ONo OFF, la autoridad es 只读, es decir, el punto de salida digital.

(3) Los registros de entrada (registros de entrada) son registros de 16 bits con permisos que 只读se pueden utilizar como cantidades analógicas o puntos de entrada empaquetados de 16 bits.

(4) Registros de retención (Registros de retención), registros de 16 bits, permisos 可读可写, pueden ser puntos de entrada analógicos o empaquetados de 16 bits, o puntos de salida analógicos o empaquetados de 16 bits.

De hecho, todos los tipos de datos anteriores pertenecen a la terminología del controlador lógico programable (PLC), por lo que la expresión siempre es inconsistente con nuestra intuición, lo que dificulta la comprensión cuando usamos el pensamiento del microcontrolador MCU.

9. Modelo de dirección de datos

El modelo de datos es una abstracción que debe asignarse a un almacenamiento físico real antes de poder acceder a él.

El protocolo Modbus permite que el dispositivo asigne cuatro tipos de datos a diferentes bloques de almacenamiento. Cada bloque es independiente entre sí. Se pueden leer diferentes valores usando diferentes códigos de función, como se muestra en la siguiente figura:

Por favor agregue la descripción de la imagen.

Cada tipo de datos en el modelo de datos permite un máximo de 65536 elementos (números 1-65536). Los números de dirección de los elementos 0comienzan desde, por lo que el rango de direcciones es 0-65535:.

Cabe señalar que: 65536 es el rango máximo de elementos que permite el protocolo Modbus, pero no requiere que los implementemos todos. El protocolo Modbus permite que el dispositivo implemente algunos elementos de acuerdo con su situación real y ni siquiera requiere la implementación de los cuatro tipos de datos en el modelo (por ejemplo, solo la lectura y escritura de datos de tipo registro de retención).

Para simplificar la correspondencia entre el modelo de datos y el área de almacenamiento del dispositivo, se introduce un modelo de dirección. Este modelo distingue diferentes tipos de datos mediante numeración, consulte la siguiente tabla para conocer el número de dirección de cada dato:

modelo de dirección Número de dirección Modbus
Bobinas 0
Entrada discreta 1
Registros de entrada 3
Registros de tenencia 4

El número del modelo de dirección Modbus comienza desde 1. Dado que cada tipo de datos admite un máximo de 65536 elementos, podemos obtener el rango de direcciones de los siguientes cuatro tipos de datos (el primero es el número de dirección) 0:

(1) Bobinas de salida (Bobinas), su rango de direcciones es: 000001-065536.

(2) Entrada Discreta, su rango de direcciones es: 100001-165536.

(3) Registros de entrada (Registros de entrada), su rango de direcciones es: 300001-365536.

(4) Registros de Tenencia, cuyo rango de direcciones es: 400001-465536.

Sin embargo, dado que 65536es un valor relativamente grande, generalmente no se necesita un área de almacenamiento tan grande en aplicaciones prácticas. Por lo tanto, los fabricantes de PLC generalmente usan un 10000rango de direcciones dentro de , por lo que podemos obtener los rangos de direcciones de los siguientes cuatro tipos de datos:

(1) Bobinas de salida (Bobinas), su rango de direcciones es: 00001-09999.

(2) El rango de direcciones de la entrada discreta (Entrada discreta) es: 10001-19999.

(3) El rango de direcciones de los registros de entrada (Registros de entrada) es: 30001-39999.

(4) El rango de direcciones de los Registros tenedores es: 40001-49999.

Método de mapeo del microcontrolador

Para el microcontrolador que utilizamos, podemos asignar la dirección virtual Modbus de la siguiente manera, definir una matriz, definir la dirección inicial del registro, la cantidad de registros, la cantidad de registros puede ser hasta uno, pero en nuestra situación real Por lo general, no tenemos tantos. Según el número real 9999utilizado Para definir, por ejemplo, definí 9 aquí (es decir, 9999 - 9000).

#define COILS_ADDR_START             (1)
#define COILS_COUNT                  (9999 - 9000)

#define DISCRETE_INPUT_ADDR_START    (10001)
#define DISCRETE_INPUT_COUNT         (9999 - 9000)

#define INPUT_REGISTERS_ADDR_START   (30001)
#define INPUT_REGISTERS_COUNT        (9999 - 9000)

#define HOLDING_REGISTERS_ADDR_START (40001)
#define HOLDING_REGISTERS_COUNT      (9999 - 9000)

bool coilsBuf[COILS_COUNT];
bool discreteInputBuf[COILS_COUNT];
unsigned short inputRegistersBuf[COILS_COUNT];
unsigned short holdingRegistersBuf[COILS_COUNT];

De acuerdo con la dirección de lectura o escritura proporcionada por el host menos la dirección inicial del registro que definimos, se puede convertir en un índice de matriz de los datos correspondientes, y luego de acuerdo con la cantidad de lecturas o escrituras proporcionadas por el host (tenga en cuenta que el número es el número de registros, no el número de palabras (número de secciones) para conocer el rango del índice de la matriz.

10. Código de función

Anteriormente aprendimos que el dispositivo maestro puede acceder o modificar los datos almacenados en el dispositivo esclavo. Para facilitar que el dispositivo maestro utilice el protocolo Modbus para acceder y modificar los datos almacenados en el dispositivo esclavo, el protocolo Modbus ha desarrollado una serie de códigos de función basados ​​en el modelo de datos y las funciones. , el código de función y la descripción se muestran en la siguiente tabla.

Código de función nombre Función descriptiva
01 Leer el estado de la bobina Leer bits (leer N bits) leer registro de bobina esclava, operación de bits
02 Leer cantidad discreta de entrada Leer bits (leer N bits) leer registro de entrada discreta, operación de bits
03 Leer múltiples registros Leer tipo entero, tipo de carácter, palabra de estado, tipo de punto flotante (leer N palabras), leer registro de retención, operación de bytes
04 Leer registro de entrada Leer tipo entero, palabra de estado, tipo de punto flotante (leer N palabras), leer registro de entrada, operación de bytes
05 Escribe una sola bobina Escribir bit (escribir 1 bit): escribir registro de bobina, operación de bit
06 Escribir en un único registro de tenencia Escritura de tipo entero, tipo de carácter, palabra de estado, tipo de coma flotante (escribir una palabra), escritura de registro de retención, operación de bytes
07 Leer estado de excepción Obtenga el estado de encendido y apagado de 8 bobinas internas. Las direcciones de estas 8 bobinas las determina el controlador. La lógica del usuario puede definir estas bobinas para indicar el estado del esclavo. Los mensajes cortos son adecuados para leer rápidamente el estado.
08 control de ecodiagnóstico Enviar el mensaje de verificación de diagnóstico a la máquina esclava para evaluar el procesamiento de la comunicación.
09 Programación (sólo 484) Haga que el host simule la función del programador y modifique la lógica esclava de la PC
0A Consulta de control (sólo para 484) Permite al host comunicarse con una máquina esclava que está ejecutando una tarea de programa larga y preguntar si la máquina esclava ha completado su tarea de operación. Este código de función solo se envía después de enviar el mensaje que contiene el código de función 9.
0B Leer recuento de eventos Permite al host emitir una única consulta y luego determinar si la operación fue exitosa, especialmente si el comando u otras respuestas causan un error de comunicación.
0C Leer registros de eventos de comunicación Sin embargo, el maestro recupera los registros de eventos de comunicación de transacciones ModBus para cada esclavo. Si se completa una transacción, se registrará el error.
0D Programación (184/384/484/584) La función del programador de simulación de host se puede utilizar para modificar la lógica esclava del PC.
0E Consulta (184/384/484/584) Permite que el host se comunique con el esclavo que está ejecutando la tarea y consulta periódicamente si el esclavo ha completado la operación del programa. Este código de función debe enviarse solo después de enviar el mensaje que contiene la función 13.
0F Escribe múltiples bobinas Puede escribir varias bobinas para forzar el encendido y apagado de una serie de bobinas lógicas continuas.
10 Escribir múltiples registros de tenencia Escriba varios registros de retención para cargar valores binarios específicos en una serie de registros de retención consecutivos.
11 Informar ID de esclavo 可使主机判断编址从机的类型及该从机运行指示灯的状态
12 (884 和 MICRO84) 可使主机模拟编程功能,修改 PC 状态逻辑
13 重置通信链路 发生非可修改错误后,是从机复位于已知状态,可重置顺序字节
14 读取通用参数(584L) 显示扩展存储文件中的数据信息
15 写入通用参数(584L) 把通用参数写入扩展存储文件
16~40 保留做扩展功能备用
41~48 保留以备用户功能所用 留作用户功能的扩展编码
49~77 非法功能
78~7F 保留 留作内部作用
80~FF 保留 用于异常应答

Modbus 定义了大量的功能代码,但是更为常用的功能代码只有如下部分功能代码。

功能码 名称 功能 对应的地址类型
01 读线圈状态 读位(读 N 个 bit)读从机线圈寄存器,位操作 0x
02 读输入离散量 读位(读 N 个 bit)读离散输入寄存器,位操作 1x
03 读多个寄存器 读整型,字符型,状态字,浮点型(读 N 个 word)读保持寄存器,字节操作 4X
04 读输入寄存器 读整型,状态字,浮点型(读 N 个word)读输入寄存器,字节操作 3x
05 写单个线圈 写位(写 1 个 bit)写线圈寄存器,位操作 0x
06 写单个保持寄存器 写整型,字符型,状态字,浮点型(写一个 word)写保持寄存器,字节操作 4x
0F 写多个线圈 写位(写 N 个 bit)强置一串连续逻辑线圈的通断 0x
10 写多个保持寄存器 写整形,字符型,状态字,浮点型(写 N 个 word)把具体的二进制值装入一串连续的保持寄存器 4x

11. 错误码

前面说过当主从设备通信出现错误后,从设备可以将一个独特的代码放入到回应消息帧的数据域中,主设备接收到消息后能够大致判断从设备发生了什么错误,Modbus 定义的常用错误代码如下表所示。

异常码 名称 描述
01 (01H) 非法功能 在请求中接收的功能代码不是从设备的一个授权操作。从设备可能处于错误状态,无法处理特定请求。
02 (02H) 非法数据地址 从设备接收的数据地址不是从设备的一个授权地址。
03 (03H) 非法数据值 指定的数据超过范围或者不允许使用。
04 (04H) 从站设备故障 El esclavo no pudo realizar una operación solicitada porque ocurrió un error irreparable.
05 (05H) confirmar El dispositivo esclavo ha aceptado la solicitud y está procesando la solicitud, pero requiere un tiempo prolongado para realizar estas operaciones. Devolver esta respuesta evita que se produzca un error de tiempo de espera en el cliente (o maestro). El cliente (o host) puede continuar enviando encuestas Mensaje de finalización del programa para confirmar si el procesamiento está completo.
06 (06H) dispositivo esclavo ocupado El dispositivo esclavo está ocupado procesando otro comando. El dispositivo maestro debe enviar la solicitud después de que el dispositivo esclavo esté inactivo.
07 (07H) confirmación negativa El dispositivo esclavo no puede ejecutar la solicitud enviada por el dispositivo maestro.
08 (08H) error de paridad de almacenamiento El dispositivo esclavo detectó un error de paridad de la memoria al intentar leer la memoria extendida.
10 (0AH) Ruta de puerta de enlace no disponible Se utiliza con una puerta de enlace para indicar que la puerta de enlace no puede asignar el valor del puerto de entrada a la ruta de comunicación interna del puerto de salida para procesar solicitudes. Generalmente significa que la puerta de enlace está mal configurada o sobrecargada.
11(0BH) El dispositivo de destino de la puerta de enlace no respondió Se utiliza con una puerta de enlace para indicar que no se obtuvo respuesta del dispositivo de destino, lo que generalmente significa que el dispositivo no está en la red.

Continuaremos actualizando y mejorando el contenido relacionado con el protocolo Modbus en el futuro. Este artículo es largo, por lo que otros contenidos, como cómo utilizar la herramienta de depuración Modbus, se ampliarán en el próximo artículo.

Si el contenido del artículo es útil, dame un me gusta y anímame. Si hay algún problema con el contenido, deja un mensaje.

Supongo que te gusta

Origin blog.csdn.net/jf_52001760/article/details/130192127
Recomendado
Clasificación