Encuentre un ejemplo de comunicación entre un PLC y un microcontrolador.

La mayoría de los PLC proporcionan instrucciones convenientes MODBUS, que se pueden llamar directamente. Solo necesita configurar algunos registros especiales y todo estará bien. La mayor parte del trabajo de compilación todavía se realiza en el microcontrolador. Hay dos formatos de comunicación para la comunicación MODBUS: 1) ASCII 2) RTU.

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 una red Modbus, cada byte de 8 bits en el mensaje se representa como un código ASCII (dos se envían decenas de caracteres hexadecimales). La principal ventaja de este método es que el intervalo de tiempo entre transmisiones de caracteres puede alcanzar 1 segundo sin error. Sistema de código hexadecimal, caracteres ASCII 0...9, a...f Cada carácter ASCII del mensaje es un carácter hexadecimal que consta de bits para cada byte, 1 bit de inicio y 7 bits compuestos de datos. El bit menos significativo se envía primero junto con 1 bit de paridad y no hay bit de parada sin verificación (cuando hay verificación). Campo de detección de errores de 2 bits (sin paridad) LRC (detección de redundancia vertical) 2. Modo RTU Cuando el controlador está configurado para comunicarse en modo RTU (Unidad terminal remota) en una red Modbus, cada byte de 8 bits en el mensaje contiene dos caracteres hexadecimales de 4 bits. La principal ventaja de este método es que se pueden transferir más datos que ASCII a la misma velocidad en baudios. Cada campo de 8 bits en el sistema de código binario de 8 bits, número hexadecimal 0...9,...f mensaje es 1 bit de inicio y 8 bits de datos por byte. Primero se envía el bit menos significativo, 1 bit de paridad, si no hay paridad, luego 1 bit de parada (cuando hay paridad) y 2 bits (cuando no hay paridad), los cuales son calculados por el dispositivo transmisor y sumados al mensaje . El dispositivo receptor vuelve a calcular el CRC del mensaje recibido y lo compara con el valor en el campo CRC de recepción. Si los dos valores son diferentes, hay un error. CRC primero llama a un registro de 16 bits cuyo valor es todo "1" y luego llama a un proceso para procesar el valor en cada registro actual de bytes consecutivos de 8 bits en el mensaje. Sólo 8-8 bits de datos en cada carácter son válidos para CRC, y 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 XOR con el contenido del registro, el resultado se desplaza hacia el bit menos significativo y el bit más significativo se llena con ceros. Extraer y detectar LSB. Si el LSB es 1, el registro se restablecerá individualmente al valor preestablecido. Si el LSB es 0, no se ejecutará. Todo el proceso se repite ocho veces. Una vez completado el último bit (bit 8), el siguiente byte de 8 bits se agrega solo o 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. Al agregar un CRC a un mensaje, primero se agrega el byte de orden inferior, seguido del byte de orden superior. La función simple de CRC es la siguiente: unsigned short CRC 16 (puch msg, US data len) unsigned char * puch msg /*Mensaje a verificar CRC*/unsigned short us datalen /*Número de bytes en el mensaje* / { unsigned charuchchi = 0x ff; /* Inicialización de bytes CRC alto */ unsigned charuchrclo = 0x ff; /* Inicialización de bytes CRC bajo */ uIndex sin firmar /* Índice en bucle CRC * */ while (usDataLen - ) / * * Transmitir búfer de mensajes*/{ uindex = uchirchi * puchmsgg++ /* Calcular CRC */uchirchi = uchirchi auchrchi[ui index]; Tabla de valores de bytes altos de CRC */ static unsigned char auchcchi [] = {0x00, 0xc1, 0x81, 0x40, 0x 01, 0xc0, 0x80, 0x41.

0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0x0, 0x80, 0x41, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x81, 0x40, 0x00/* Tabla de valores de bytes bajos CRC */carácter estático [] = { 0x 00, 0xc0, 0xc1, 0x01, 0xc3, 0x03, 0x02, 0xc2, 0xc6, 0x06, 0x07, 0xc7, 0x05, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0. A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x 654444