¿Cuál es el protocolo estándar del protocolo de comunicación MODBUS?
El protocolo Modbus es un lenguaje universal aplicado a los controladores electrónicos. A través de este protocolo, los controladores pueden comunicarse entre sí, con controladores y otros dispositivos a través de una red (como Ethernet). Se ha convertido en un estándar común de la industria. Con él, los equipos de control producidos por diferentes fabricantes se pueden conectar a una red industrial para un monitoreo centralizado. Este protocolo define una estructura de mensajes que los controladores entienden utilizar, independientemente de la red a través de la cual se comunican. Describe el proceso de un controlador que solicita acceso a otros dispositivos, cómo responder a las solicitudes de otros dispositivos y cómo detectar y registrar errores. Establece un formato público para el diseño y el contenido del dominio de mensajes.
Al comunicarse en una red Modbus, este protocolo determina que cada controlador necesita conocer la dirección de su dispositivo, identificar los mensajes enviados por dirección y decidir qué acciones tomar. Si se requiere una respuesta, el controlador generará información de retroalimentación y la enviará mediante el protocolo Modbus. En otras redes, los mensajes que contienen el protocolo Modbus se convierten en la estructura de trama o paquete utilizada en esa red. Esta transformación también amplía el método de resolución de direcciones de estrofa, rutas de enrutamiento y detección de errores en una red específica.
Modbus tiene las siguientes características:
(1) Estándar y abierto Los usuarios pueden utilizar el protocolo Modbus de forma gratuita y con confianza. No es necesario pagar tarifas de licencia. no infringir el conocimiento. Actualmente, hay más de 400 fabricantes que admiten Modbus y más de 600 productos que admiten Modbus.
(2) Modbus puede admitir una variedad de interfaces eléctricas, como RS-232, RS-485, etc., y también puede transmitirse en varios medios, como par trenzado, fibra óptica, inalámbrico. , etc.
(3) El formato de trama de Modbus es simple, compacto y fácil de entender. Es fácil de usar para los usuarios y fácil de desarrollar para los fabricantes.
Transmisión en red Modbus:
El puerto Modbus estándar utiliza una interfaz serie compatible con RS-232C, que define los pines, cables, bits de señal y ondas de transmisión del puerto de conexión. tasa de bits, paridad. El controlador se puede conectar en red directamente o mediante un módem.
La comunicación del controlador utiliza tecnología maestro-esclavo, es decir, solo un dispositivo (dispositivo maestro) puede iniciar la transmisión (consulta). Otros dispositivos (dispositivos esclavos) responden en consecuencia según los datos proporcionados por la consulta del dispositivo maestro. Dispositivos principales típicos: computadora host e instrumento programable. Dispositivo esclavo típico: controlador programable.
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 devuelve un mensaje como respuesta. Si la consulta se transmite, no se realiza ninguna respuesta. El protocolo Modbus establece el formato para la consulta del dispositivo maestro: dirección del dispositivo (o transmisión), código de función, todos los datos que se enviarán y un campo de detección de errores.
El mensaje de respuesta del dispositivo esclavo también se compone del protocolo Modbus, que incluye un campo que confirma la acción a realizar, los datos que se devolverán y un campo de detección de errores. Si ocurre un error durante la recepción del mensaje, o el dispositivo esclavo no puede ejecutar su comando, el dispositivo esclavo creará un mensaje de error y lo enviará como respuesta.
Transmisión en otros tipos de redes:
En otras redes, los controladores se comunican mediante tecnología peer-to-peer, por lo que cualquier control puede iniciar la comunicación con otros controladores. De esta forma, el controlador puede actuar como maestro y esclavo en un único proceso de comunicación. Se proporcionan múltiples canales internos para permitir procesos de transferencia simultáneos.
En el bit de mensaje, el protocolo Modbus todavía proporciona el principio maestro-esclavo, aunque el método de comunicación de red es "peer-to-peer". Si un controlador envía un mensaje, simplemente actúa como maestro y espera una respuesta de un dispositivo esclavo. Asimismo, cuando el controlador recibe un mensaje, crea un formato de respuesta esclavo y lo devuelve al controlador emisor.
Ciclo de consulta-respuesta
(1) Consulta
El código de función en el mensaje de consulta le dice al dispositivo esclavo seleccionado qué función realizar. El segmento de datos contiene cualquier información adicional requerida por el dispositivo esclavo para realizar la función. Por ejemplo, el código de función 03 requiere que el dispositivo esclavo lea los registros de retención y devuelva su contenido. El segmento de datos debe contener información para indicarle al dispositivo esclavo: qué registro comenzar a leer y el número de registros a leer. El campo de detección de errores proporciona una forma para que el dispositivo esclavo verifique que el contenido del mensaje sea correcto.
(2) Respuesta
Si el dispositivo esclavo genera una respuesta normal, el código de función en el mensaje de respuesta es la respuesta al código de función en el mensaje de consulta. El segmento de datos contiene datos recopilados del dispositivo: como valores de registro o estado. Si ocurre un error, el código de función se modificará para indicar que el mensaje de respuesta es un error y el segmento de datos contendrá un código que describe el mensaje de error. El campo de detección de errores permite que el dispositivo maestro confirme si el contenido del mensaje está disponible.
Dos modos de transmisión:
El controlador se puede configurar en cualquiera de los dos modos de transmisión (ASCII o RTU) para comunicarse en una red Modbus estándar. El usuario selecciona el modo deseado, incluidos los parámetros de comunicación serie (velocidad en baudios, método de verificación, etc.). Al configurar cada controlador, todos los dispositivos en una red Modbus deben seleccionar el mismo modo de transmisión y parámetros del puerto serie.
El método ASCII o RTU seleccionado solo es aplicable a redes Modbus estándar. Define cada bit del segmento de mensaje que se transmite continuamente en estas redes y determina cómo empaquetar la información en campos de mensaje y cómo. descodificación.
En otras redes (como MAP y Modbus Plus) los mensajes Modbus se convierten en tramas independientes de la transmisión en serie.
1. Modo ASCII
Cuando el controlador está configurado para comunicarse en modo ASCII (Código estándar americano para el intercambio de información) en la red Modbus, cada byte de 8 bits en el mensaje se trata como un código ASCII (dos caracteres hexadecimales ) se envían. La principal ventaja de este método es que el intervalo de tiempo entre transmisiones de caracteres puede alcanzar 1 segundo sin provocar errores.
Sistema de codificación
· Hexadecimal, caracteres ASCII 0...9,A...F
· Cada carácter ASCII del mensaje Están todos compuestos de un carácter hexadecimal
Los bits de cada byte
· 1 bit de inicio
· 7 bits de datos, los bits válidos más pequeños se envían primero
· 1 bit de paridad, si no hay paridad, entonces ninguna
1 bit de parada (cuando hay paridad), 2 Bits (cuando no hay paridad) )
Dominio de detección de errores
· LRC (Detección de redundancia longitudinal)
2. Modo RTU
Cuando el controlador está configurado en comunicación Modbus en RTU (Unidad terminal remota) modo en la red, cada byte de 8 bits en el mensaje contiene dos caracteres hexadecimales de 4 bits. La principal ventaja de este método es que a la misma velocidad en baudios se pueden transmitir más datos que ASCII.
Sistema de codificación
Binario de 8 bits, número hexadecimal 0...9, A...F
Cada número de 8 bits en los campos del mensaje se componen de dos caracteres hexadecimales
Bits en cada byte
1 bit de inicio
8 bits de datos, mínimo El bit válido se envía primero
1 bit de paridad, si no hay paridad
1 bit de parada (cuando hay paridad), 2 Bits (cuando no hay paridad)
Campo de detección de errores p>
CRC (detección de detalle cíclico)
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 recibido. Si los dos valores son diferentes, hay un error.
El CRC consiste en cargar primero un registro de 16 bits cuyo valor es todo "1" y luego llamar a un proceso para procesar los valores en cada registro actual de bytes consecutivos de 8 bits en el mensaje. . Sólo los datos de 8 bits en cada carácter son válidos para CRC, el bit de inicio, el bit de parada y el bit de paridad no son válidos.
Durante el proceso de generación de CRC, a cada carácter de 8 bits se le aplica una operación OR (XOR) de forma independiente con el contenido del registro. El resultado se mueve en la dirección del bit menos significativo y el bit más significativo se rellena. 0s. El LSB se extrae y se detecta. Si el LSB es 1, el registro se aplica individualmente con el valor preestablecido. Si el LSB es 0, no se realiza. Todo el proceso se repite 8 veces. Una vez completado el último bit (bit 8), al siguiente byte de 8 bits se le aplica una operación OR individualmente con el valor actual del registro. El valor en el registro final es el valor CRC después de que se hayan ejecutado todos los bytes del mensaje.
Cuando se agrega el CRC al mensaje, primero se agrega el byte bajo y luego el byte alto.
La función CRC simple es la siguiente:
unsigned short CRC16(puchMsg,usDataLen)
unsigned char *puchMsg /* Mensaje a ser verificado por CRC; */
unsigned short usDataLen /* Número de bytes en el mensaje*/
{
unsigned char uchCRCHi = 0xFF /* Inicialización de bytes CRC alto; */
unsigned char uchCRCLo = 0xFF /* Inicialización de bytes CRC baja*/
unsigned uIndex /* Índice en bucle CRC*/
while ( usDataLen--) /* Transmitir buffer de mensajes*/
{
uIndex = uchCRCHi ^ *puchMsgg++ /* Calcular CRC */
uchCRCHi = uchCRCLo ^; auchCRCHi[uIndex] ;
uchCRCLo = auchCRCLo[uIndex] ;
}
return ((uchCRCHi << 8) | uchCRCLo) ;
}
/* Tabla de valores de bytes altos CRC*/
carácter estático sin firmar auchCRCHi[] = {
0x00,0xC1,0x81, 0x40, 0x01,0xC0,0x80,0x41,0x01,0xC0,
0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
0x00, 0xC1, 0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,
0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,
0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,
0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41 ,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,
0x80,0x41,0x00,0xC1,0x81,0x40,0x00 ,0xC1 ,0x81,0x40,
0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,
0x81,0x40,0x01,0xC0,0x80 ,0x41 ,0x00,0xC1,0x81,0x40,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,
0x80,0x41,0x00 ,0xC1 ,0x81,0x40,0x00,0xC1,0x81,0x40,
0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x
40,0x01,0xC0,
0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
0x00,0xC1,0x81,0x40,0x01, 0xC0,0x80,0x41,0x01,0xC0,
0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
0x00,0xC1,0x81, 0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,
0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
0x01, 0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,
0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,
0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,
0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,
0x80,0x41,0x00,0xC1,0x81,0x40
};
/* Tabla de valores de bytes bajos de CRC*/
carácter estático auchCRCLo[] = {
0x00,0xC0,0xC1,0x01,0xC3, 0x03,0x02,0xC2,0xC6,0x06,
0x07,0xC7,0x05,0xC5,0xC4,0x04,0xCC,0x0C,0x0D,0xCD,
0x0F,0xCF,0xCE, 0x0E,0x0A,0xCA,0xCB,0x0B,0xC9,0x09,
0x08,0xC8,0xD8,0x18,0x19,0xD9,0x1B,0xDB,0xDA,0x1A,
0x1E, 0xDE,0xDF,0x1F,0xDD,0x1D,0x1C,0xDC,0x14,0xD4,
0xD5,0x15,0xD7,0x17,0x16,0xD6,0xD2,0x12,0x13,0xD3,
<0x3C,0xFC,0xFD,0x3D,0xFF,0x3F,0x3E,0xFE,0xFA,0x3A,
0x3B,0xFB,0x39,0xF9,0xF8,0x38,0x28,0xE8, 0xE9 ,0x29,
0xEB,0x2B,0x2A,0xEA,0xEE,0x2E,0x2F,0xEF,0x2D,0xED,
0xEC,0x2C,0xE4,0x24,0x25,0xE5, 0x27 ,0xE7,0xE6,0x26,
0x22,0xE2,0xE3,0x23,0xE1,0x21,0x20,0xE0,0xA0,0x60,
0x61,0xA1,0x63,0xA3, 0xA2 ,0x62,0x66,0xA6,
0xA7,0x67,
0xA5,0x65,0x64,0xA4,0x6C,0xAC,0xAD,0x6D,0xAF,0x6F,
0x6E,0xAE,0xAA,0x6A,0x6B,0xAB, 0x69,0xA9,0xA8,0x68,
0x78,0xB8,0xB9,0x79,0xBB,0x7B,0x7A,0xBA,0xBE,0x7E,
0x7F,0xBF,0x7D,0xBD, 0xBC,0x7C,0xB4,0x74,0x75,0xB5,
0x77,0xB7,0xB6,0x76,0x72,0xB2,0xB3,0x73,0xB1,0x71,
0x70,0xB0, 0x50,0x90,0x91,0x51,0x93,0x53,0x52,0x92,
0x96,0x56,0x57,0x97,0x55,0x95,0x94,0x54,0x9C,0x5C,
0x5D,0x9D,0x5F,0x9F,0x9E,0x5E,0x5A,0x9A,0x9B,0x5B,
0x99,0x59,0x58,0x98,0x88,0x48,0x49,0x89,0x4B,0x8B,
0x8A,0x4A,0x4E,0x8E,0x8F,0x4F,0x8D,0x4D,0x4C,0x8C,
0x44,0x84,0x85,0x45,0x87,0x47,0x46,0x86,0x82,0x42 ,
0x43,0x83,0x41,0x81,0x80,0x40
};
La red ModBus es un sistema de comunicación industrial formado por terminales programables con terminales inteligentes El controlador del programa y la computadora están conectados a través de líneas públicas o líneas dedicadas locales. La estructura de su sistema incluye tanto hardware como software. Se puede aplicar a diversas aplicaciones de recopilación de datos y monitoreo de procesos. La Tabla 1 a continuación es la definición del código de función de ModBus.
Tabla 1 Códigos de función ModBus
01 LEER ESTADO BOBINA
02 LEER ESTADO ENTRADA
03 LEER REGISTRO DE RETENCIÓN
04 LEER REGISTRO DE ENTRADA
05 ESCRIBIR BOBINA ÚNICA
06 ESCRIBIR REGISTRO ÚNICO
15 ESCRIBIR BOBINA MÚLTIPLE
16 ESCRIBIR REGISTRO MÚLTIPLE
La red ModBus es sólo un host, y todas las comunicaciones son enviadas por él. La red puede admitir hasta 247 controladores esclavos remotos, pero la cantidad real de esclavos admitidos está determinada por el equipo de comunicación utilizado. Usando este sistema, cada PC puede intercambiar información con el host central sin afectar la ejecución de cada PC de sus propias tareas de control.
(1) Modo de transmisión ModBus
Hay 2 modos de transmisión para elegir en el sistema ModBus. Estos dos modos de transmisión tienen las mismas capacidades de comunicación que la PC esclava. La selección debe depender del host ModBus utilizado. Cada sistema ModBus solo puede utilizar un modo y no se permite mezclar los dos modos. Un modo es ASCII (Código americano de intercambio de información) y el otro modo es RTU (Equipo terminal remoto). Las definiciones de estos dos modos se muestran en la Tabla 3.
Tabla 3 Características de los modos de transmisión ASCII y RTU.
p>Los caracteres imprimibles ASCII facilitan la detección de fallas y son adecuados para computadoras host y PC host programadas en lenguajes de alto nivel (como Fortan). RTU es adecuado para computadoras y hosts de PC programados en lenguaje de máquina.
Los datos transmitidos en modo RTU son caracteres binarios de 8 bits.
Si desea convertir al modo ASCII, cada carácter RTU debe dividirse primero en dos partes, alta y baja, cada una con 4 bits, y luego convertirse en un valor hexadecimal equivalente. Los caracteres ASCII utilizados para formar mensajes son todos caracteres hexadecimales. Aunque el modo ASCII utiliza el doble de caracteres que el modo RTU, la decodificación y el procesamiento de datos ASCII son más fáciles. Además, cuando se utiliza el modo RTU, los caracteres del mensaje deben transmitirse en forma de un flujo de datos continuo, entre caracteres. Puede generar intervalos de hasta 1 segundo para adaptarse a máquinas más lentas.
(2) Método de verificación de datos ModBus
CRC-16 (verificación de errores de redundancia cíclica)
El procedimiento de verificación de errores CRC-16 es el siguiente: El mensaje (aquí solo intervienen bits de datos, no el bit de inicio, el bit de parada y el bit de paridad opcional) se consideran un binario continuo y su bit más significativo (MSB) se envía primero. El mensaje se multiplica primero por X ↑ 16 (desplazado a la izquierda en 16 bits) y luego se divide por X ↑ 16 + X ↑ 15 + X ↑ 2 + 1. El número es 11000000000000101. El cociente entero se ignora y el resto de 16 bits se agrega al mensaje (el MSB se envía primero) para convertirse en 2 bytes de verificación CRC. Todos los unos del resto se inicializan para evitar que todos los ceros se reciban como un solo mensaje. Si no hay ningún error en el mensaje que contiene el byte CRC después del procesamiento anterior, se dividirá por el mismo polinomio (X ↑ 16 + X ↑ 15 + X ↑ 2 + 1) después de llegar al dispositivo receptor y un resto cero. se obtendrá (dispositivo receptor Verifique este byte CRC y compárelo con el CRC transmitido). Todas las operaciones se realizan en módulo 2 (sin acarreo).
Los dispositivos que están acostumbrados a enviar datos en serie enviarán primero el bit más a la derecha (LSB-bit menos significativo) del carácter. En el caso de generar CRC, el primer bit enviado debe ser el bit MSB más significativo del dividendo. Dado que no se utiliza acarreo en la operación, para facilitar la operación, el MSB se establece en el bit más a la derecha al calcular el CRC. El orden de los bits de los polinomios generadores también debe invertirse para que sea coherente. El MSB del polinomio se omite porque sólo afecta al cociente y no al resto.
Los pasos para generar un byte de verificación CRC-16 son los siguientes:
①Montar un registro de 16 bits, con todos los dígitos iguales a 1.
②El byte de orden superior del registro de 16 bits se aplica XOR con el primer byte de 8 bits. El resultado de la operación se coloca en este registro de 16 bits.
③ Desplaza este registro 16 un bit hacia la derecha.
④ Si el dígito desplazado hacia la derecha (bit de marca) es 1, se genera el polinomio 10100000000000001 y el registro se utiliza para una operación "XOR" si el dígito desplazado hacia la derecha es 0; ③ se devuelve.
⑤ Repetir ③ y ④ hasta eliminar 8 bits.
⑥Los otros 8 bits realizan una operación "XOR" con el registro de 16 bits.
⑦Repita ③~⑥ hasta que todos los bytes del mensaje sean XOR con el registro de 16 bits y desplazados 8 veces.
⑧El contenido de este registro de 16 bits, que es la verificación de errores CRC de 2 bytes, se agrega al bit más significativo del mensaje.
Además, CRC16 se utiliza a menudo como método de verificación en algunos protocolos de comunicación que no son ModBus, y se han producido algunas variantes de CRC16 que utilizan el polinomio CRC16 X ↑16 + X ↑ 15 + X ↑. 2 +1, el primer registro de 16 bits cargado es 0000; usando el orden inverso de CRC16 X ↑ 16 + X ↑ 14 + X ↑ 1 + 1, el primer valor de registro cargado es 0000 o FFFFH.
LRC (Comprobación de errores de redundancia longitudinal)
La comprobación de errores LRC se utiliza en modo ASCII. Esta verificación de errores es un número binario de 8 bits transmitido como 2 bytes hexadecimales ASCII. Convierta caracteres hexadecimales a binarios, agregue caracteres binarios sin acarreo cíclico y el resultado del complemento a dos para generar una verificación de errores LRC (ver figura). Este LRC se verifica en el dispositivo receptor y se compara con el LRC transmitido, y los dos puntos (:), el retorno de carro (CR), el carácter de avance de línea (LF) y cualquier otro carácter hexadecimal no ASCII insertado se evalúan durante la operación Ignorar. .