This commit is contained in:
2025-10-20 22:28:37 +08:00
parent eeb5af98eb
commit 7d148d79c9
429 changed files with 13624 additions and 586480 deletions

View File

@@ -2,6 +2,7 @@
#include "ui_P401_CuttingPage.h"
#include <GlobalDefinitions/Variable.h>
#include <FileOperation/ConfigFiles.h>
#include <Threads/MultiCoreManager.h>
P401_CuttingPage::P401_CuttingPage(QWidget *parent) :
QWidget(parent),
@@ -9,10 +10,10 @@ P401_CuttingPage::P401_CuttingPage(QWidget *parent) :
{
ui->setupUi(this);
QTimer::singleShot(10, this, &P401_CuttingPage::WinInit);
// QTimer::singleShot(1000, this, &P401_CuttingPage::WinInit);
// QTimer::singleShot(2000, this, &P401_CuttingPage::Show3D);
qDebug()<<"P401_CuttingPage 初始化完成!";
}
@@ -25,7 +26,7 @@ void P401_CuttingPage::WinInit(){
for (int row = 1; row < CutConditionConfigFile.size()-1; ++row)
{
QString TextObjName = QString("Text_SSConditions_%1").arg(row);
QString TextObjName = QString("Cut_SSConditions_%1").arg(row);
QLabel* Label = findChild<QLabel*>(TextObjName);
if (Label) {
QString Text = CutConditionConfigFile.at(row)[1];
@@ -37,12 +38,12 @@ void P401_CuttingPage::WinInit(){
FalseColor.append(CutConditionConfigFile.at(row)[3]);
}
// 现在 ui->CPW_1 已经是一个 CurvePlotWidget*
ui->CPW_1->addSeries("电机电流U", Qt::green);
ui->CPW_1->addSeries("电机电流V", Qt::blue);
ui->CPW_1->addSeries("电机电流W", Qt::darkCyan);
// 现在 ui->CPW_1 已经是一个 CurvePlotWidget*
ui->CPW_2->addSeries("电机温度", Qt::green);
// 现在 ui->Cut_CPW_1 已经是一个 CurvePlotWidget*
ui->Cut_CPW_1->addSeries("电机电流U", Qt::green);
ui->Cut_CPW_1->addSeries("电机电流V", Qt::blue);
ui->Cut_CPW_1->addSeries("电机电流W", Qt::darkCyan);
// 现在 ui->Cut_CPW_1 已经是一个 CurvePlotWidget*
ui->Cut_CPW_2->addSeries("电机温度", Qt::green);
//所用定时器初始化
@@ -54,7 +55,7 @@ void P401_CuttingPage::WinInit(){
//所用定时器初始化
QTimer* TrailRefresh_Timer = new QTimer(this);
connect(TrailRefresh_Timer, &QTimer::timeout, this, &P401_CuttingPage::TrailRefreshTimeOut);
TrailRefresh_Timer->setInterval(ConfigFiles().TrailRefreshTime * 1000); // 设置定时器间隔为 1000 毫秒1 秒)
TrailRefresh_Timer->setInterval(10000); // 设置定时器间隔为 1000 毫秒1 秒)
TrailRefresh_Timer->start();
}
void P401_CuttingPage::Show3D()
@@ -152,7 +153,7 @@ void P401_CuttingPage::SetProgressBar(QProgressBar *PB,const uint16_t Value,cons
}
void P401_CuttingPage::SetProgressBar(QProgressBar *PB,QLCDNumber *LCD,const QString NodeGroup,const QString NodeLCD,const QStringList Color){
// 从OPC节点获取油位显示组数据32位无符号整数
uint32_t PB_Group = gOPC_NodeValue["ns=6;s=::AsGlobalPV:" + NodeGroup].toUInt();
uint32_t PB_Group = getNodeValue("" + NodeGroup).toUInt();
// 从32位数据中拆分出16位油位百分比值和颜色值
uint16_t Percentage = static_cast<uint16_t>(PB_Group >> 16); // 高16位百分比
@@ -162,87 +163,120 @@ void P401_CuttingPage::SetProgressBar(QProgressBar *PB,QLCDNumber *LCD,const QSt
SetProgressBar(PB, Percentage, ColorIndex, Color);
// 在LCD上显示实际油位测量值
LCD->display(gOPC_NodeValue["ns=6;s=::AsGlobalPV:" +NodeLCD].toReal());
LCD->display(getNodeValue("" +NodeLCD).toReal());
}
void P401_CuttingPage::UIRefreshTimeOut()
{
if(!gPageIndexStr.contains("P401"))
if(!gPageIndexStr.contains("P04"))
return;
/************************************* 电机基本信息 *************************************/
// 从OPC节点获取切割设备电机相关的状态数据32位无符号整数
uint32_t PB_Group1 = gOPC_NodeValue["ns=6;s=::AsGlobalPV:PB_Curr_Cut.PageGroup1"].toUInt(); // 电流显示组1数据
uint32_t PB_Group2 = gOPC_NodeValue["ns=6;s=::AsGlobalPV:PB_Curr_Cut.PageGroup2"].toUInt(); // 电流显示组2数据
uint32_t SSConditions = gOPC_NodeValue["ns=6;s=::AsGlobalPV:StartStopConditions.Cut"].toUInt(); // 启停条件状态数据
uint32_t PB_MotorTemp = gOPC_NodeValue["ns=6;s=::AsGlobalPV:PB_Temp_Cut.PageGroup"].toUInt(); // 电机温度显示数据
// 从32位数据中提取16位百分比值高16位和低16位拆分
uint16_t PercentageCurU = static_cast<uint16_t>(PB_Group1 >> 16); // U相电流百分比高16位
uint16_t PercentageCurV = static_cast<uint16_t>(PB_Group1 & 0xFFFF); // V相电流百分比低16位
uint16_t PercentageCurW = static_cast<uint16_t>(PB_Group2 >> 16); // W相电流百分比高16位
uint16_t PercentageTmpColor = static_cast<uint16_t>(PB_Group2 & 0xFFFF); // 温度颜色百分比低16位
uint16_t PercentageMotorTemp= static_cast<uint16_t>(PB_MotorTemp >> 16); // 电机温度百分比高16位
uint16_t ColorTemp = static_cast<uint16_t>(PB_MotorTemp & 0xFFFF); // 温度颜色值低16位
// 解析颜色值(从百分比中提取个位、十位、百位)
uint8_t ColorU = (PercentageTmpColor / 10) % 10; // U相颜色值十位
uint8_t ColorV = (PercentageTmpColor / 100) % 10; // V相颜色值百位
uint8_t ColorW = PercentageTmpColor % 10; // W相颜色值个位
// 设置进度条显示(电流和温度)
SetProgressBar(ui->PB_Cur_1, PercentageCurU, ColorU, glMotorCurColor); // U相电流进度条
SetProgressBar(ui->PB_Cur_2, PercentageCurV, ColorV, glMotorCurColor); // V相电流进度条
SetProgressBar(ui->PB_Cur_3, PercentageCurW, ColorW, glMotorCurColor); // W相电流进度条
SetProgressBar(ui->PB_Temp, PercentageMotorTemp, ColorTemp, glMotorTempColor); // 电机温度进度条
// 在LCD上显示实际测量值电流和温度
ui->LCD_Cur_1->display(gOPC_NodeValue["ns=6;s=::AsGlobalPV:IN_PhaseCut.Filtered30_U"].toReal()); // U相电流实际
ui->LCD_Cur_2->display(gOPC_NodeValue["ns=6;s=::AsGlobalPV:IN_PhaseCut.Filtered30_V"].toReal()); // V相电流实际值
ui->LCD_Cur_3->display(gOPC_NodeValue["ns=6;s=::AsGlobalPV:IN_PhaseCut.Filtered30_W"].toReal()); // W相电流实际值
ui->LCD_Temp->display(gOPC_NodeValue["ns=6;s=::AsGlobalPV:IN_PhaseCut.Filtered_Temp"].toReal()); // 电机温度实际值
// 更新32个启停条件状态标签的显示样式
for (int i = 0; i < 32; ++i)
{
// 根据索引查找对应的标签控件
QLabel* Label = findChild<QLabel*>(QString("Text_SSConditions_%1").arg(i));
// 如果找到标签
if (Label){
// 基础样式:默认背景图
QString StyleStr = "border-image: url(:/Frames/null.png);\n";
// 根据状态位设置不同颜色True/False对应不同样式
StyleStr += getBitOf32Data(SSConditions, i, false) ? TrueColor[i] + "\n" : FalseColor[i] + "\n";
// 应用样式到标签
Label->setStyleSheet(StyleStr);
}
}
/**************************************************************************************/
/************************************ 截割油缸压力信息 ***********************************/
SetProgressBar(ui->PB_1,ui->LCD_1,"PB_Pressure_Cut.PageGroup","IN_Sersor.Pressure_Cut");
/**************************************************************************************/
/************************************ 掏槽油缸压力信息 ***********************************/
SetProgressBar(ui->PB_2,ui->LCD_2,"PB_Pressure_Cutt.PageGroup","IN_Sersor.Pressure_Cutt");
/**************************************************************************************/
/************************************ 截割喷雾压力信息 ***********************************/
SetProgressBar(ui->PB_3,ui->LCD_3,"PB_Pressure_CutSpray.PageGroup","IN_Sersor.Pressure_CutSpray");
/**************************************************************************************/
/************************************ 截割喷雾流量信息 ***********************************/
SetProgressBar(ui->PB_4,ui->LCD_4,"PB_SprayFlow_Cut.PageGroup","IN_Sersor.SprayFlow_Cut");
/**************************************************************************************/
// 使用多核心管理器异步获取切割页面数据
//MultiCoreManager::instance()->submitTask([this]() {
// 准备数据容器
QMap<QString, QVariant> cuttingData;
// 异步读取切割页面数据
cuttingData["PB_Group1"] = getNodeValue("PB_Curr_Cut.PageGroup1");
cuttingData["PB_Group2"] = getNodeValue("PB_Curr_Cut.PageGroup2");
cuttingData["PB_MotorTemp"] = getNodeValue("PB_Temp_Cut.PageGroup");
cuttingData["SSConditions"] = getNodeValue("StartStopConditions.Cut");
cuttingData["IN_PhaseCut_Filtered30_U"] = getNodeValue("IN_PhaseCut.Filtered30_U");
cuttingData["IN_PhaseCut_Filtered30_V"] = getNodeValue("IN_PhaseCut.Filtered30_V");
cuttingData["IN_PhaseCut_Filtered30_W"] = getNodeValue("IN_PhaseCut.Filtered30_W");
cuttingData["IN_PhaseCut_Filtered_Temp"] = getNodeValue("IN_PhaseCut.Filtered_Temp");
cuttingData["PB_Pressure_Cut"] = getNodeValue("PB_Pressure_Cut.PageGroup");
cuttingData["IN_Sersor_Pressure_Cut"] = getNodeValue("IN_Sersor.Pressure_Cut");
cuttingData["PB_Pressure_Cutt"] = getNodeValue("PB_Pressure_Cutt.PageGroup");
cuttingData["IN_Sersor_Pressure_Cutt"] = getNodeValue("IN_Sersor.Pressure_Cutt");
cuttingData["PB_Pressure_CutSpray"] = getNodeValue("PB_Pressure_CutSpray.PageGroup");
cuttingData["IN_Sersor_Pressure_CutSpray"] = getNodeValue("IN_Sersor.Pressure_CutSpray");
cuttingData["PB_SprayFlow_Cut"] = getNodeValue("PB_SprayFlow_Cut.PageGroup");
cuttingData["IN_Sersor_SprayFlow_Cut"] = getNodeValue("IN_Sersor.SprayFlow_Cut");
// 在主线程中更新UI
QMetaObject::invokeMethod(this, [this, cuttingData]() {
/************************************* 电机基本信息 *************************************/
// 从32位数据中提取16位百分比
uint32_t PB_Group1 = cuttingData["PB_Group1"].toUInt();
uint32_t PB_Group2 = cuttingData["PB_Group2"].toUInt();
uint32_t PB_MotorTemp = cuttingData["PB_MotorTemp"].toUInt();
uint32_t SSConditions = cuttingData["SSConditions"].toUInt();
uint16_t PercentageCurU = static_cast<uint16_t>(PB_Group1 >> 16);
uint16_t PercentageCurV = static_cast<uint16_t>(PB_Group1 & 0xFFFF);
uint16_t PercentageCurW = static_cast<uint16_t>(PB_Group2 >> 16);
uint16_t PercentageTmpColor = static_cast<uint16_t>(PB_Group2 & 0xFFFF);
uint16_t PercentageMotorTemp = static_cast<uint16_t>(PB_MotorTemp >> 16);
uint16_t ColorTemp = static_cast<uint16_t>(PB_MotorTemp & 0xFFFF);
uint8_t ColorU = (PercentageTmpColor / 10) % 10;
uint8_t ColorV = (PercentageTmpColor / 100) % 10;
uint8_t ColorW = PercentageTmpColor % 10;
// 设置进度条显示
SetProgressBar(ui->PB_Cur_1, PercentageCurU, ColorU, glMotorCurColor);
SetProgressBar(ui->PB_Cur_2, PercentageCurV, ColorV, glMotorCurColor);
SetProgressBar(ui->PB_Cur_3, PercentageCurW, ColorW, glMotorCurColor);
SetProgressBar(ui->PB_Temp, PercentageMotorTemp, ColorTemp, glMotorTempColor);
// 在LCD上显示实际测量值
ui->LCD_Cur_1->display(cuttingData["IN_PhaseCut_Filtered30_U"].toReal());
ui->LCD_Cur_2->display(cuttingData["IN_PhaseCut_Filtered30_V"].toReal());
ui->LCD_Cur_3->display(cuttingData["IN_PhaseCut_Filtered30_W"].toReal());
ui->LCD_Temp->display(cuttingData["IN_PhaseCut_Filtered_Temp"].toReal());
// 更新32个启停条件状态标签的显示样式
for (int i = 0; i < 32; ++i)
{
QLabel* Label = findChild<QLabel*>(QString("Cut_SSConditions_%1").arg(i+1));
if (Label) {
QString StyleStr = "border-image: url(:/Frames/null.png);\n";
StyleStr += getBitOf32Data(SSConditions, i, false) ? TrueColor[i] + "\n" : FalseColor[i] + "\n";
Label->setStyleSheet(StyleStr);
}
}
/**************************************************************************************/
/************************************ 截割油缸压力信息 ***********************************/
uint32_t pressureCutGroup = cuttingData["PB_Pressure_Cut"].toUInt();
uint16_t pressureCutPercentage = static_cast<uint16_t>(pressureCutGroup >> 16);
uint16_t pressureCutColorIndex = static_cast<uint16_t>(pressureCutGroup & 0xFFFF);
SetProgressBar(ui->PB_1, pressureCutPercentage, pressureCutColorIndex, glMotorCurColor);
ui->LCD_1->display(cuttingData["IN_Sersor_Pressure_Cut"].toReal());
/**************************************************************************************/
/************************************ 掏槽油缸压力信息 ***********************************/
uint32_t pressureCuttGroup = cuttingData["PB_Pressure_Cutt"].toUInt();
uint16_t pressureCuttPercentage = static_cast<uint16_t>(pressureCuttGroup >> 16);
uint16_t pressureCuttColorIndex = static_cast<uint16_t>(pressureCuttGroup & 0xFFFF);
SetProgressBar(ui->PB_2, pressureCuttPercentage, pressureCuttColorIndex, glMotorCurColor);
ui->LCD_2->display(cuttingData["IN_Sersor_Pressure_Cutt"].toReal());
/**************************************************************************************/
/************************************ 截割喷雾压力信息 ***********************************/
uint32_t pressureCutSprayGroup = cuttingData["PB_Pressure_CutSpray"].toUInt();
uint16_t pressureCutSprayPercentage = static_cast<uint16_t>(pressureCutSprayGroup >> 16);
uint16_t pressureCutSprayColorIndex = static_cast<uint16_t>(pressureCutSprayGroup & 0xFFFF);
SetProgressBar(ui->PB_3, pressureCutSprayPercentage, pressureCutSprayColorIndex, glMotorCurColor);
ui->LCD_3->display(cuttingData["IN_Sersor_Pressure_CutSpray"].toReal());
/**************************************************************************************/
/************************************ 截割喷雾流量信息 ***********************************/
uint32_t sprayFlowCutGroup = cuttingData["PB_SprayFlow_Cut"].toUInt();
uint16_t sprayFlowCutPercentage = static_cast<uint16_t>(sprayFlowCutGroup >> 16);
uint16_t sprayFlowCutColorIndex = static_cast<uint16_t>(sprayFlowCutGroup & 0xFFFF);
SetProgressBar(ui->PB_4, sprayFlowCutPercentage, sprayFlowCutColorIndex, glMotorCurColor);
ui->LCD_4->display(cuttingData["IN_Sersor_SprayFlow_Cut"].toReal());
/**************************************************************************************/
}, Qt::QueuedConnection);
// }, "cutting_page_ui_refresh");
}
void P401_CuttingPage::TrailRefreshTimeOut(){
ui->CPW_1->appendPoint(0, gOPC_NodeValue["ns=6;s=::AsGlobalPV:IN_PhaseCut.Filtered30_U"] .toReal());
ui->CPW_1->appendPoint(1, gOPC_NodeValue["ns=6;s=::AsGlobalPV:IN_PhaseCut.Filtered30_V"] .toReal());
ui->CPW_1->appendPoint(2, gOPC_NodeValue["ns=6;s=::AsGlobalPV:IN_PhaseCut.Filtered30_W"] .toReal());
ui->CPW_2->appendPoint(0,gOPC_NodeValue["ns=6;s=::AsGlobalPV:IN_PhaseCut.Filtered_Temp"] .toDouble());
ui->Cut_CPW_1->appendPoint(0, getNodeValue("IN_PhaseCut.Filtered30_U") .toReal());
ui->Cut_CPW_1->appendPoint(1, getNodeValue("IN_PhaseCut.Filtered30_V") .toReal());
ui->Cut_CPW_1->appendPoint(2, getNodeValue("IN_PhaseCut.Filtered30_W") .toReal());
ui->Cut_CPW_2->appendPoint(0,getNodeValue("IN_PhaseCut.Filtered_Temp") .toDouble());
}