AIBUS中文协议和实验室化学反应器

问候哈伯! 很久以前,我写了一篇有关反应口味的文章 。 很多时间过去了,我回到了这个问题。

在本文中,我不会详细介绍用于开发反应风味的技术,而是将讨论我在使工作时间自动化和共享可能派上用场的代码方面的经验。 我遇到了一个中国制造的实验室化学反应器,不幸的是,它缺少自动进行冷却,读写数据和编程模式的工具,这一点非常重要。 反应器本身是三脚架上的普通金属毛坯,带有高达350度的加热器。 宇典AI518控制器负责温度控制。




对我来说,一个好消息是其中有一个RS-485端口。

是的,Yudian AI518具有计时器和一些非常简单的程序,但首先,用窗口和按钮制作自己的“二十一点”非常有趣,其次,拨动常规控制器不是很方便,我想在计算机上做。

由于我有使用Arduino控制器的经验,因此我最初决定通过它进行通信和控制,然后我已经有了在Qt上编写负责控制和自动化的程序的想法,并在Arduino Mega上编写了用AI518进行数据包的形成和解密的程序。

由于冷水启用阀可以放置在距计算机和设备本身一定距离的地方,因此决定构建一个附加控制器,该控制器将根据命令打开/关闭冷水阀,并读取和发送冷却温度。 是的,在项目结束时,我意识到结构非常繁琐,可以摆脱计算机上的RS485信号,使用一个程序,但是制造自己的设备的野心激起了人们的兴趣。

总计:

  1. 本机控制器宇典AI518。
  2. Arduino Mega + 2个RS485转换器(MAX485)
  3. Arduino nano + 1个RS485(MAX485)转换器+热电偶+ 12V晶体管
  4. 12V冷水阀。

首先,编写了mega和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; //  } }; 

当一切稳定运行时,我开始阅读很多有关不同数据传输协议的内容,但找不到我需要的协议。 事实是,标准的Yudian AI518控制器通过AIBUS协议与外界通信,据我了解它是MODBUS的中文类似物。 ( 文档 )我是第一次这样做,重点是文档和所有可能的论坛的帮助。

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

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

实际上,事实证明,所有设备的包装都来自Mega(具有冷却温度的nano,来自具有更新反应堆温度的AI518,以及来自计算机的其他值和命令)。 然后,Mega将所有内容组合在一个包中,然后将其发送到计算机,由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上做这些事情非常容易。 我们能够制定要求并从“ Basurman”设备中读取要求,现在有必要设置模式,建立时间-温度图,在反应结束时给出加热至设定温度的报告,反应时间本身,至特定温度的冷却速度以及等 根据QSerialPort,通过Arduinka本身连接的COM端口将所有这些组合到一个单独的结构中,我们可以传输和接受值。

最困难的事情是在Windows XP下编译完成的项目。 不幸的是,这些系统正在工作,我不得不与手鼓跳舞几天,以使其正常工作。 由于我已经在第二天做了此操作,因此我没有仔细地列出确切的说明,也没有故意从论坛中整理出所有建议的选项。

结果是一个程序在我的工作场所工作并为我提供了帮助,并节省了很多时间(我不会发布QT项目,因为那里没有什么有趣的东西。通过QSerialPort传输数据,然后随心所欲地传输数据)。

链接到Arduinok的固件:

对于纳米
对于兆丰

Source: https://habr.com/ru/post/zh-CN448212/


All Articles