AIBUS中国のプロトコルと実験用化学反応器

こんにちは、Habr! むかしむかし、反応フレーバーに関する記事を書きまし 。 多くの時間が経過したので、この質問に戻りました。



この記事では、反応フレーバーを開発する技術の詳細には触れませんが、勤務時間の自動化と便利なコードの共有に関する私の経験についてお話します。 中国製の実験用化学反応装置に出会いましたが、残念なことに、冷却、データの読み書き、プログラミングモードを自動化するツールがありませんでした。これは非常に重要でした。 リアクター自体は、三脚に取り付けられた通常の金属製のブランクで、ヒーターは最大350度でした。 温度コントローラーはYudian AI518コントローラーです。









私にとって良いニュースは、そこにRS-485ポートがあることでした。



はい、Yudian AI518にはタイマーといくつかの非常に単純なプログラムがありますが、まず、ウィンドウとボタンを使用して独自の「ブラックジャック」を作成することは非常に面白かったです。次に、通常のコントローラーを突くのはあまり便利ではありません。コンピューターで行います。



Arduinoコントローラーでの作業経験があったため、最初にそれを介して通信と制御を行うことにしました。その後、制御と自動化を担当するプログラムをQtで作成し、AI518でパケットの形成と復号化を行うArduino Megaを作成するというアイデアをすでに持っていました。



冷水作動バルブはコンピューターと設置自体から離れた場所に配置できるため、コマンドで冷水バルブをオン/オフし、冷却温度を読み取って送信する追加のコントローラーを構築することにしました。 はい、プロジェクトの終わりに、私は建設が積み重なっていることに気付きました。コンピューターでRS485のwhiを取り除き、1つのプログラムを使用することは可能ですが、独自のデバイスを作成するという野心は興味を刺激しました。



私たちの束の合計:



  1. ネイティブコントローラーYudian AI518。
  2. Arduino Mega + 2 RS485コンバーター(MAX485)
  3. Arduino nano + 1 RS485(MAX485)コンバーター+熱電対+ 12Vトランジスター。
  4. 12V冷水バルブ。


まず、メガとナノ間の通信構造が記述されました。



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





すべてが安定して動作するようになったとき、さまざまなデータ転送プロトコルについて多くのことを読み始めましたが、必要なプロトコルを見つけることができませんでした。 事実、標準的なYudian AI518コントローラーは、AIBUSプロトコルを介して外界と通信します。これは、MODBUSの中国語の類似物だと理解しています。 ( ドキュメンテーション )私はこれを初めて行い、ドキュメントと可能なすべてのフォーラムのヘルプに焦点を当てました。



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





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





本質的に、すべてのデバイスからのパッケージがメガに到達することが判明しました(冷却温度の値を持つnanoから、更新されたリアクター温度およびその他の値とコンピューターコマンドを持つAI518から)。 その後、Megaはすべてを1つのパッケージにまとめ、コンピューターに送信し、そこでQTプログラムが読み取りました。



メガコンピューターパッケージ構造:



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





中国のプロトコルは沈黙しているので、送信されたパケットが記述に適合せず、構造を選択すると、私は一般にそれが壊れていると思い始めましたが、結局はすべてうまくいきました。 ログで最初の正しい数字を見たとき、幸福がありました...



Arduino nano上のコントローラーを湿気から保護するために、自分のボードをエッチングしてケースに入れることにしました。 難しいことではありません。これを行う方法については多くの説明がありますが、LUTテクノロジを選択しました。 ( LUT )。 最も困難なことは、レーザープリンターが通常印刷する適切な光沢のあるインクジェット用紙を選択することでした。 しかし、すべての試行錯誤の後、そのようなデバイスを手に入れました。







しかし、ボタンとウィンドウを備えたコンピューター上のプログラムについてはどうでしょう。 幸いなことに、このようなことはQtでは非常に簡単です。 要求を定式化して「Basurmanian」デバイスから読み取ることができます。モードを設定し、時間温度グラフをプロットし、反応の最後に設定温度への加熱速度、反応時間自体、特定の温度への冷却速度に関するレポートを提供する必要があります。など QSerialPortによると、これらすべてをArduinka自体が接続するCOMポートを通じて組み合わせて、値を送信および受け入れます。



最も困難なことは、完成したプロジェクトをWindows XPでコンパイルすることでした。 残念ながら、これらのシステムは機能しており、機能させるために数日間タンバリンと踊らなければなりませんでした。 すでに2日目にこれを行ったので、フォーラムから提案されたすべてのオプションを慎重に整理することなく、正確な手順を説明しませんでした。



その結果、私は職場で役立つプログラムを手に入れ、多くの時間を節約できました(QTプロジェクトは投稿するつもりはありません。面白いものは何もありません。QSerialPortを介してデータを転送します。



Arduinokのファームウェアへのリンク:



ナノ用

メガ用



All Articles