|
本帖最后由 zyl182001 于 2023-9-20 23:24 编辑
【米尔瑞萨RZ/G2L开发板-创新应用】化学反应釜远程人机界面
使用QML与C++混合编程,开发基于MODBUS 的主机程序,实现一个远程控制界面,操作另一端的化学反应釜,控制反应釜的温度、压力和反应时间。
设定反应釜的温度50~300摄氏度,压力0.5~3个大气压,运行时间0~99分钟,控制反应釜运行,实时显示温度、压力和时间的设定值和瞬时值,运行时间到自动停止,产生故障报故障错误。
开发板跟反应釜通讯采用modbusTCP主机控制功能,移植libmodbus库,为了通讯顺畅,跟从机的通讯用一个独立的线程完成,在modbuspollthread.cpp函数中实现,界面设计在main.qml中完成,它们中间通讯通过信号和槽以及调用属性方法进行。
[color=rgba(0, 0, 0, 0.85)]
头文件类函数声明
#ifndef MODBUSPOLLTHREAD_H
#define MODBUSPOLLTHREAD_H
#include <QObject>
#include <QThread>
#include "modbus.h"
//#include <QSerialPort>
//#include <QSerialPortInfo>
#include <QDebug>
#include <QTimer>
#include <QStringList>
#include <QThread>
#include <QtQml>
class ModbusPollThread : public QObject
{
Q_OBJECT
public:
explicit ModbusPollThread(int slaveID = 1, QObject *parent = nullptr);
~ModbusPollThread();
void Serial_search_function();
void modbus_update_text();
static void stBusMonitorAddItem( modbus_t * modbus,
uint8_t isOut, uint8_t slave, uint8_t func, uint16_t addr,
uint16_t nb, uint16_t expectedCRC, uint16_t actualCRC );
//显示接受内容 在右上角
static void stBusMonitorRawData( modbus_t * modbus, uint8_t * data,
uint8_t dataLen, uint8_t addNewline,uint8_t );
Q_INVOKABLE void connnectModbusPoll();// 连接ModbusPoll,供QML调用
Q_INVOKABLE void disconnnectModbusPoll();// 关闭ModbusPoll,供QML调用
Q_INVOKABLE void sendMsg();//向服务端发送数据,供QML调用
Q_INVOKABLE void readModbus(uint addr);//向服务端发送数据,供QML调用
Q_INVOKABLE void writeModbus(uint addr, uint data);//向服务端发送数据,供QML调用
Q_INVOKABLE void clearHistory();//向服务端发送数据,供QML调用
signals:
// void SIGNAL_SENDGETSLAVEINFO(QString); //发送获取到的从机信息给UI
// void signal_SENDGETSLAVEDATA(uint, uint); // 发送获取到的从机数据给UI
void sendData(QVariant add, QVariant arr); // 发送获取到的从机数据给UI
void sendDataAll(QVariantList array); // 发送获取到的从机数据给UI
// void signal_enable(); // 使能行编辑和按钮
// void signal_disable(); // 失能行编辑和按钮
public slots:
void initPollThread();
void ClosePollThread();
void modbus_Poll_work();
// void connnectModbusPoll(QString portName,int baud);
// void disconnnectModbusPoll();
// void readModbus(uint addr);
// void writeModbus(uint addr, uint16_t data);
private:
QThread* m_pollThread;
bool isWork; //是否连接成功
modbus_t *my_bus; //定义第一个modbus类
modbus_mapping_t *mb_mapping = NULL; //modbus相关的寄存器
QTimer *Time_one; //modbus数据更新时钟
int m_slaveId; //查询从机ID
};
#endif // modbusPollThread_H
反应釜客户端用Modbus slave软件模拟,可以接收查看主机传来的控制信息,也可把温度压力和其它运行状态发给主机。
运行环境是开发板和电脑连在同一个路由器上,程序要连接的远程IP设为电脑的IP,电脑虚拟机编译好的程序通过WIFI传到开发板上,开发板配置HDMI输出,通过一个HDMI二进一出分配器连到电脑显示器上,旧显示器可能需要把开发板的输出分辨率刷新率的降下来。USB鼠标插上去就可以用了,界面操作用到。
想在开发板上增加一些运行库以便能够实现动画和虚拟键盘功能,没想到出奇的难,依赖太多,怎么也编不通,过一阵子接着研究吧。
运行操作视频
|
|