Protocolo chino AIBUS y reactor químico de laboratorio

Saludos Habr! Érase una vez que escribí un artículo sobre sabores de reacción. Pasó mucho tiempo, volví a esta pregunta.

En este artículo, no entraré en detalles de la tecnología para desarrollar sabores de reacción, pero hablaré sobre mi experiencia en la automatización de mis horas de trabajo y compartir un código que podría ser útil. Encontré un reactor químico de laboratorio de fabricación china y, desafortunadamente, carecía de herramientas para automatizar la refrigeración, la lectura y la escritura de datos, y los modos de programación, lo cual era muy importante. El reactor en sí era un blanco de metal ordinario sobre un trípode, con un calentador de hasta 350 grados. El controlador Yudian AI518 es responsable del control de temperatura.




La buena noticia para mí fue la presencia de un puerto RS-485 en él.

Sí, Yudian AI518 tiene temporizadores y algunos programas muy simples, pero en primer lugar, fue muy interesante hacer tu propio "blackjack" con ventanas y botones, y en segundo lugar, no es muy conveniente tocar un controlador normal, me gustaría que hacer en la computadora.

Como tenía experiencia trabajando con controladores Arduino, inicialmente decidí establecer comunicación y control a través de él, luego tuve la idea de escribir un programa Qt que se encargaría del control y la automatización, y Arduino Mega para la formación y decodificación de paquetes con AI518.

Dado que la válvula de habilitación de agua fría se puede ubicar a una distancia de la computadora y la instalación en sí, se decidió construir un controlador adicional que activará / desactivará la válvula de agua fría por orden y leerá y enviará la temperatura de enfriamiento. Sí, al final del proyecto, me di cuenta de que la construcción estaba apilada, sería posible deshacerse del silbato RS485 en una computadora y usar un programa, pero la ambición de crear su propio dispositivo despertó interés.

Total en nuestro grupo:

  1. Controlador nativo Yudian AI518.
  2. Convertidores Arduino Mega + 2 RS485 (MAX485)
  3. Arduino nano + 1 convertidor RS485 (MAX485) + termopar + transistor de 12V.
  4. Válvula de agua fría de 12V.

En primer lugar, se escribió la estructura de comunicación entre mega y nano.

struct packet_arduino_pomp // Arduino nano { byte start_byte_one;//    212 byte start_byte_two;//    211 byte temp_pomp;//  byte on_of_pomp;//on-off  (1  0) byte CRC8;//  /**/ void pask() { CRC8 = (start_byte_one + start_byte_two + temp_pomp + on_of_pomp + tmp) / 10; } /* */ bool test_pask() { if (CRC8 == (start_byte_one + start_byte_two + temp_pomp + on_of_pomp + tmp) / 10) return 0; // return 1; //  } }; 

Cuando todo funcionó de manera estable, comencé a leer mucho sobre los diferentes protocolos de transferencia de datos, pero no pude encontrar el que necesitaba. El hecho es que el controlador estándar Yudian AI518 se comunica con el mundo exterior a través del protocolo AIBUS, según tengo entendido, es el análogo chino de MODBUS. ( documentación ) Hice esto por primera vez y me concentré en la documentación y la ayuda de todos los foros posibles.

Estructura de paquetes salientes para Yudian AI518:

 struct tagREQ_FRM_T { uint8_t u8DevAddr1; uint8_t u8DevAddr2; uint8_t u8ReqType; uint8_t u8DevPara; uint8_t u8LoParam; uint8_t u8HiParam; uint8_t u8LoSumCheck; uint8_t u8HiSumCheck; } ; 

La estructura del paquete entrante para Yudian AI518:

 struct tagANS_FRM_T { uint8_t u8LoPV; uint8_t u8HiPV; uint8_t u8LoSV; uint8_t u8HiSV; uint8_t u8MV; uint8_t u8ALm; uint8_t u8LoParam; uint8_t u8HiParam; uint8_t u8LoSumCheck; uint8_t u8HiSumCheck; }; 

De hecho, resultó que los paquetes de todos los dispositivos llegan a Mega (desde nano con temperaturas de enfriamiento, desde AI518 con temperatura de reactor actualizada y otros valores y comandos de la computadora). Luego, Mega unió todo en un paquete y lo envió a una computadora, donde el programa QT lo leyó.

Estructura del paquete de megacomputadora:

 struct packet_big // PC { byte start_byte_one;//    254 byte start_byte_two;//    232 byte temp_pomp;//  byte on_of_pomp;//on-off  (1  0) byte ex_temp_reactor_one;//    1 byte ex_temp_reactor_two;//    2 byte current_temp_reactor;//    byte timer_ex;// byte tmp;//   byte CRC8;//   void pask() { CRC8 = (start_byte_one + start_byte_two + temp_pomp + on_of_pomp + ex_temp_reactor_one + ex_temp_reactor_two + current_temp_reactor + timer_ex + tmp) / 10; } /* */ bool test_pask() { if (CRC8 == ((start_byte_one + start_byte_two + temp_pomp + on_of_pomp + ex_temp_reactor_one + ex_temp_reactor_two + current_temp_reactor + timer_ex + tmp)) / 10) return 0; // return 1; //  } }; 

Dado que el protocolo chino es silencioso, si el paquete enviado no se ajusta a la descripción, seleccionando la estructura, generalmente comencé a pensar que estaba roto, pero al final todo funcionó. Cuando vi los primeros números correctos en el registro, había felicidad ...

Para proteger el controlador del Arduino nano de la humedad, decidí grabar mi propia placa y guardarla. No es complicado, hay muchas descripciones de cómo hacer esto, pero elegí la tecnología LUT. ( LUT ) Lo más difícil fue elegir un papel de inyección de tinta brillante adecuado, que normalmente imprime una impresora láser. Pero después de todo el proceso de prueba y error, obtuvimos ese dispositivo.



Pero qué pasa con el programa en la computadora, con botones y ventanas. Afortunadamente, estas cosas son muy fáciles de hacer en Qt. Podemos formular solicitudes y leerlas desde un dispositivo "Basurmanian", ahora es necesario que podamos establecer modos, trazar un gráfico de tiempo y temperatura, dar al final de la reacción un informe sobre la velocidad de calentamiento a la temperatura establecida, el tiempo de reacción en sí, la velocidad de enfriamiento a una temperatura determinada y etc. Combinando todo esto en una estructura separada, de acuerdo con QSerialPort, a través del puerto COM al que Arduinka se conecta, transmitimos y aceptamos valores.

Lo más difícil fue compilar el proyecto terminado en Windows XP. Desafortunadamente, estos sistemas funcionan y tuve que bailar con una pandereta durante un par de días para que funcionara. Como hice esto ya el segundo día, no presenté las instrucciones exactas sin deliberadamente y clasifiqué todas las opciones propuestas de los foros.

El resultado fue un programa que funciona y me ayuda en mi lugar de trabajo y ahorra mucho tiempo (no publicaré el proyecto QT, ya que no hay nada interesante allí. Transferencia de datos a través de QSerialPort, y luego lo que tu corazón desee).

Enlaces a firmware para Arduinok:

Para Nano
Para Mega

Source: https://habr.com/ru/post/448212/


All Articles