AIBUS Chinesisches Protokoll und chemischer Laborreaktor

Grüße Habr! Es war einmal ein Artikel über Reaktionsaromen. Es verging viel Zeit und ich kehrte zu dieser Frage zurück.

In diesem Artikel werde ich nicht auf Details der Technologie zur Entwicklung von Reaktionsgeschmacksrichtungen eingehen, sondern über meine Erfahrungen bei der Automatisierung meiner Arbeitszeiten und der Freigabe eines Codes sprechen, der möglicherweise nützlich ist. Ich stieß auf einen in China hergestellten chemischen Laborreaktor, dem leider Werkzeuge zur Automatisierung des Kühlens, Lesens und Schreibens von Daten sowie Programmiermodi fehlten, was sehr wichtig war. Der Reaktor selbst war ein gewöhnlicher Metallrohling auf einem Stativ mit einer Heizung von bis zu 350 Grad. Der Yudian AI518 Controller ist für die Temperaturregelung verantwortlich.




Die gute Nachricht für mich war das Vorhandensein eines RS-485-Anschlusses.

Ja, Yudian AI518 verfügt über Timer und einige sehr einfache Programme, aber erstens war es sehr interessant, einen eigenen „Blackjack“ mit Fenstern und Tasten zu erstellen, und zweitens ist es nicht sehr praktisch, einen normalen Controller zu verwenden. Das würde mir gefallen auf dem Computer tun.

Da ich Erfahrung mit Arduino-Controllern hatte, entschied ich mich zunächst für die Kommunikation und Steuerung über diese, dann hatte ich bereits die Idee, ein Programm auf Qt zu schreiben, das für die Steuerung und Automatisierung verantwortlich ist, und Arduino Mega für die Bildung und Entschlüsselung von Paketen mit AI518.

Da sich das Kaltwasser-Freigabeventil in einiger Entfernung vom Computer und der Installation selbst befinden kann, wurde beschlossen, eine zusätzliche Steuerung zu bauen, die das Kaltwasserventil ein- und ausschaltet und die Kühltemperatur liest und sendet. Ja, am Ende des Projekts wurde mir klar, dass die Konstruktion sehr aufgeschüttet war. Es wäre möglich, die RS485-Pfeife auf einem Computer loszuwerden und ein Programm zu verwenden, aber der Ehrgeiz, ein eigenes Gerät zu entwickeln, weckte das Interesse.

Insgesamt in unserem Haufen:

  1. Native Controller Yudian AI518.
  2. Arduino Mega + 2 RS485-Konverter (MAX485)
  3. Arduino Nano + 1 RS485 (MAX485) Wandler + Thermoelement + 12V Transistor.
  4. 12V Kaltwasserventil.

Zunächst wurde die Kommunikationsstruktur zwischen Mega und Nano geschrieben.

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; //  } }; 

Als alles stabil funktionierte, begann ich viel über verschiedene Datenübertragungsprotokolle zu lesen, konnte aber nicht das finden, das ich brauchte. Tatsache ist, dass der standardmäßige Yudian AI518-Controller über das AIBUS-Protokoll mit der Außenwelt kommuniziert, da es meines Wissens das chinesische Analogon von MODBUS ist. ( Dokumentation ) Ich habe dies zum ersten Mal gemacht und mich auf die Dokumentation und die Hilfe aller möglichen Foren konzentriert.

Ausgehende Paketstruktur für 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; } ; 

Die Struktur des eingehenden Pakets für 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; }; 

Tatsächlich stellte sich heraus, dass Pakete von allen Geräten zu Mega kommen (von Nano mit Kühltemperaturen, von AI518 mit aktualisierter Reaktortemperatur und anderen Werten und Befehlen vom Computer). Dann vereinte Mega alles in einem Paket und schickte es an einen Computer, wo das QT-Programm es las.

Mega-Computer-Paketstruktur:

 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; //  } }; 

Da das chinesische Protokoll still ist und das gesendete Paket nicht zur Beschreibung passt, habe ich bei der Auswahl der Struktur im Allgemeinen angefangen zu glauben, dass es kaputt ist, aber am Ende hat alles geklappt. Als ich die ersten richtigen Zahlen im Protokoll sah, war ich glücklich ...

Um den Controller des Arduino Nano vor Feuchtigkeit zu schützen, habe ich beschlossen, mein eigenes Board zu ätzen und in das Gehäuse zu legen. Es ist keine knifflige Sache, es gibt viele Beschreibungen, wie das geht, aber ich habe mich für die LUT-Technologie entschieden. ( LUT ). Am schwierigsten war es, ein geeignetes Hochglanz-Tintenstrahlpapier zu wählen, das normalerweise einen Laserdrucker druckt. Aber nach all dem Versuch und Irrtum haben wir ein solches Gerät bekommen.



Aber was ist mit dem Programm auf dem Computer mit Schaltflächen und Fenstern? Glücklicherweise sind solche Dinge auf Qt sehr einfach zu erledigen. Wir sind in der Lage, Anforderungen zu formulieren und von einem „basurmanischen“ Gerät zu lesen. Jetzt müssen wir Modi einstellen, ein Zeit-Temperatur-Diagramm zeichnen, am Ende der Reaktion einen Bericht über die Heizrate auf die eingestellte Temperatur, die Reaktionszeit selbst, die Abkühlrate auf eine bestimmte Temperatur und usw. Wenn wir all dies laut QSerialPort über den COM-Port, mit dem Arduinka selbst verbunden ist, zu einer separaten Struktur kombinieren, übertragen und akzeptieren wir Werte.

Am schwierigsten war es, das fertige Projekt unter Windows XP zu kompilieren. Leider funktionieren diese Systeme und ich musste ein paar Tage mit einem Tamburin tanzen, damit es funktioniert. Da ich dies bereits am zweiten Tag getan habe, habe ich die genauen Anweisungen nicht ohne Absicht festgelegt und alle vorgeschlagenen Optionen aus den Foren herausgesucht.

Das Ergebnis war ein Programm, das funktioniert und mir an meinem Arbeitsplatz hilft und viel Zeit spart (ich werde das QT-Projekt nicht veröffentlichen, da es dort nichts Interessantes gibt. Übertragen von Daten über QSerialPort und dann, was auch immer Ihr Herz begehrt).

Links zur Firmware für Arduinok:

Für Nano
Für Mega

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


All Articles