From 87c4d9e3802a15b67e7fba915ad48b089bddd113 Mon Sep 17 00:00:00 2001 From: baiYue Date: Wed, 15 Apr 2026 09:00:54 +0800 Subject: [PATCH] add HMI variant setting --- common/frontend/monitor_item.h | 7 ++ diagramCavas/include/eventPropertyEditor.h | 2 +- .../graphicsDataModel/fixedPortsModel.h | 2 +- diagramCavas/include/instance/dataAccessor.h | 2 + diagramCavas/source/baseItemPropertyProxy.cpp | 50 +++++++- .../graphicsDataModel/fixedPortsModel.cpp | 110 +++++++++++++++--- diagramCavas/source/instance/dataAccessor.cpp | 38 ++++++ diagramCommunication/source/dataProcessor.cpp | 3 + 8 files changed, 196 insertions(+), 18 deletions(-) diff --git a/common/frontend/monitor_item.h b/common/frontend/monitor_item.h index 90d7ba1..74006fe 100644 --- a/common/frontend/monitor_item.h +++ b/common/frontend/monitor_item.h @@ -294,4 +294,11 @@ struct PluginTypeInfo //插件的类型信息 QString modelName; //工程模名 }; +struct ParamUpdateInfo //参量更新信息 +{ + QString sToken; + double oldVal; + double newVal; +}; + #endif diff --git a/diagramCavas/include/eventPropertyEditor.h b/diagramCavas/include/eventPropertyEditor.h index 5994a0e..9d7747a 100644 --- a/diagramCavas/include/eventPropertyEditor.h +++ b/diagramCavas/include/eventPropertyEditor.h @@ -234,7 +234,7 @@ private: dlg.showDlg(customType); if (dlg.exec() == QDialog::Accepted) { DataSourceType setType = dlg.getCurData(); - varNameEdit->setText(setType.sPara); + varNameEdit->setText(setType.sCode); } }); return page; diff --git a/diagramCavas/include/graphicsDataModel/fixedPortsModel.h b/diagramCavas/include/graphicsDataModel/fixedPortsModel.h index c7a9848..b3580b7 100644 --- a/diagramCavas/include/graphicsDataModel/fixedPortsModel.h +++ b/diagramCavas/include/graphicsDataModel/fixedPortsModel.h @@ -119,6 +119,7 @@ public: void startAcceptData(); //开始接收实时数据 void stopAcceptData(QString); //停止接收实时数据 + void updateParamData(QList); //更新参量 QMap>>& getMonitorStateMap(){return m_monitorStateMap;} void setMonitorDisplaySetting(QMap> map){m_monitorDisplaySetting = map;} @@ -165,7 +166,6 @@ public: QString getLastSave() {return _lastSaveTime;} public Q_SLOTS: void onSignal_ifExits(QUuid id,const QString&,int type,GraphicsFunctionModelItem*); //判断用户输入的名称是否已存在 - void onTimeOut(); void onSignal_GetPointData(QString type,QMap map); void onSignal_openBayManager(); void onDataTimerOut(); diff --git a/diagramCavas/include/instance/dataAccessor.h b/diagramCavas/include/instance/dataAccessor.h index 6f71f2d..ee01af0 100644 --- a/diagramCavas/include/instance/dataAccessor.h +++ b/diagramCavas/include/instance/dataAccessor.h @@ -17,6 +17,7 @@ public: void setParent(DiagramCavas* p) {_parentCavas = p;} QMap> getTargetData(QStringList); //获取指定名称的值 + QMap getParaUpdateState(QStringList); //获取指定参量的更新结果 public slots: void onReceiveHttpData(const QString& sType,const QVariant& data); void onReceiveWebsocketData(const QVariant& data); @@ -24,6 +25,7 @@ private: QString removeAfterStreamBySplit(const QString& url); //手动处理websocket的config private: QMap> _realTimeData; //实时数据缓存 todo:自动清理 + QMap _paraUpdateState; //参量更新结果 mutable QMutex m_mutex; DiagramCavas* _parentCavas; }; diff --git a/diagramCavas/source/baseItemPropertyProxy.cpp b/diagramCavas/source/baseItemPropertyProxy.cpp index 954576d..db19ea1 100644 --- a/diagramCavas/source/baseItemPropertyProxy.cpp +++ b/diagramCavas/source/baseItemPropertyProxy.cpp @@ -45,7 +45,53 @@ QMap BaseItemPropertyProxy::getMap() return map; } -void BaseItemPropertyProxy::setMap(QMap) +void BaseItemPropertyProxy::setMap(QMap mapSetting) { - //todo:接口修改参量 + int nMode = _pControl->getCurMode(); + if(nMode == 0) //编辑模式不设置 + return; + QUuid uid = _pItem->getProperty()->uuid(); + + QList updateList; + auto pPara = _pControl->getMonitorPara(); + + const QList& attributeList = pPara.value(uid); + + // 2. 构建sName到MonitorItemAttributeInfo的快速查找表 + QHash nameToAttribute; + for (const MonitorItemAttributeInfo& attributeInfo : attributeList) { + nameToAttribute[attributeInfo.sName] = &attributeInfo; + } + + // 3. 遍历mapSetting进行比较 + for (auto it = mapSetting.constBegin(); it != mapSetting.constEnd(); ++it) { + const QString& targetName = it.key(); + double settingValue = it.value(); + + if (nameToAttribute.contains(targetName)) { + const MonitorItemAttributeInfo* attributeInfo = nameToAttribute[targetName]; + + if(attributeInfo->nConnectType == 1) //量测情况先不设置值 + continue; + // 4. 获取当前值 + double currentValue = 0.0; + if (!attributeInfo->mapValue.isEmpty()) { + auto firstIt = attributeInfo->mapValue.constBegin(); + currentValue = firstIt.value(); + } + + // 5. 比较并记录需要更新的项 + if (qAbs(currentValue - settingValue) > 1e-10) { //记录不同项 + ParamUpdateInfo updateInfo; + updateInfo.sToken = attributeInfo->sConnectPara; + updateInfo.oldVal = currentValue; + updateInfo.newVal = settingValue; + updateList.append(updateInfo); + } + } + } + + if(!updateList.isEmpty()){ + _pControl->updateParamData(updateList); + } } diff --git a/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp b/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp index de888ba..f4f537f 100644 --- a/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp +++ b/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp @@ -24,6 +24,7 @@ #include "pluginManager.h" #include "graphicsItem/pluginItemFactory.h" +#include "extraPropertyManager.h" #include "graphicsItem/itemPort.h" #include "designerScene.h" @@ -1691,13 +1692,6 @@ void FixedPortsModel::onSignal_ifExits(QUuid id,const QString& str,int type,Grap } } - -void FixedPortsModel::onTimeOut() -{ - _Interface->getPointData("i"); - _Interface->getPointData("v"); -} - void FixedPortsModel::onSignal_GetPointData(QString type,QMap map) { if(map.size() == 1) //实时数据 @@ -1774,7 +1768,48 @@ void FixedPortsModel::onPanelVisibilityChanged(const QString& panelName, bool sh void FixedPortsModel::onVariantSet(QString varName,QVariant val) { + QMap mapExtra; + ExtraPropertyManager* pExtra = getCavas()->getExtraPropertyManager(); + if(pExtra){ + mapExtra = pExtra->geAlltProperty(); + } + auto monitorData = m_monitorPara; // 假设这是你的成员变量 + + for(auto& extra:mapExtra){ + if(extra.code == varName){ + QString sConnectPara = extra.connect_para; + QString sourceType = extra.sourceType; + + if(sourceType == "property"){ //参量 + double dOldVal = 0.0; // 默认值 + + // 在监控数据中查找匹配的sConnectPara + for(auto& uuidListPair : monitorData){ + for(auto& item : uuidListPair){ + if(item.sConnectPara == sConnectPara && !item.mapValue.isEmpty()){ + // 取第一个值 + if(!item.mapValue.isEmpty()){ + dOldVal = item.mapValue.constBegin().value(); + } + break; // 找到第一个匹配项就退出 + } + } + } + + QList lst; + ParamUpdateInfo info; + info.sToken = sConnectPara; + info.oldVal = dOldVal; + info.newVal = val.toDouble(); + lst.append(info); + updateParamData(lst); + } + else{ //量测,是否可设置待定 + } + break; + } + } } void FixedPortsModel::onScriptExec(QString script) @@ -2555,19 +2590,40 @@ void FixedPortsModel::updateMonitorDisplay() void FixedPortsModel::startAcceptData() { - QStringList lstTarget; //待订阅的对象 + QStringList lstTarget; //待订阅的对象(量测) + QStringList lstParamTarget; //待读取的对象(参量,不需要一直读取,httpget) + QMap connectTypeMap; //先创建一个sConnectPara到nConnectType的映射 for(auto& lst:m_monitorPara){ for(auto& para:lst){ - if(para.bSelected && !para.sConnectPara.isEmpty()){ - if(!lstTarget.contains(para.sConnectPara)) - lstTarget.append(para.sConnectPara); + if(!para.sConnectPara.isEmpty()){ + connectTypeMap[para.sConnectPara] = para.nConnectType; + if(para.bSelected){ //选中的查询数据 + if(para.nConnectType == 1){ //量测数据 + if(!lstTarget.contains(para.sConnectPara)) + lstTarget.append(para.sConnectPara); + } + else if(para.nConnectType == 0){ //参量 + if(!lstParamTarget.contains(para.sConnectPara)) + lstParamTarget.append(para.sConnectPara); + } + } } } } - for(auto& paraRef:m_monitorParaRef){ //如果normalItem中未选择该属性,textItem引用了该属性,追加数据请求 - if(!lstTarget.contains(paraRef)) - lstTarget.append(paraRef); + for(auto& paraRef : m_monitorParaRef){ //如果normalItem中未选择该属性,textItem引用了该属性,追加数据请求 + QString sConnectPara = paraRef; + if(connectTypeMap.contains(sConnectPara)){ + int nConnectType = connectTypeMap[sConnectPara]; + if(nConnectType == 1){ //量测数据 + if(!lstTarget.contains(sConnectPara)) + lstTarget.append(sConnectPara); + } + else if(nConnectType == 0){ //参量 + if(!lstParamTarget.contains(sConnectPara)) + lstParamTarget.append(sConnectPara); + } + } } QJsonObject obj; //构建开始请求 @@ -2599,6 +2655,32 @@ void FixedPortsModel::startAcceptData() UiCommunicationBus::instance()->insertTempRequest(_pageName,requestLst); _curRequestLst = lstTarget; m_dataTimer->start(); + + QString sParaPath = "/component/attribute/get/"; //参数查询地址 + sParaPath += lstParamTarget.join(","); + UiCommunicationBus::instance()->sendHttpRequest(sParaPath,QVariant(),"GET"); + _curRequestLst.append(lstParamTarget); +} + +void FixedPortsModel::updateParamData(QList lst) +{ + QJsonObject obj; + QJsonArray arrAttr; + + for(auto& info:lst){ + QJsonObject objAttr; + objAttr["token"] = info.sToken; + objAttr["attribute_old_val"] = QString::number(info.oldVal); + objAttr["attribute_new_val"] = QString::number(info.newVal); + arrAttr.append(objAttr); + } + + obj["attributes"] = arrAttr; + + QString sParaPath = "/component/attribute/update"; //参数更新地址 + QJsonDocument doc(obj); + QVariant variant = doc.toVariant(); + UiCommunicationBus::instance()->sendHttpRequest(sParaPath,variant,"POST"); } void FixedPortsModel::stopAcceptData(QString page) diff --git a/diagramCavas/source/instance/dataAccessor.cpp b/diagramCavas/source/instance/dataAccessor.cpp index 9229697..bb33567 100644 --- a/diagramCavas/source/instance/dataAccessor.cpp +++ b/diagramCavas/source/instance/dataAccessor.cpp @@ -132,6 +132,31 @@ void DataAccessor::onReceiveHttpData(const QString& sType,const QVariant& data) } } } + else if(sType == "paraQuery"){ + QJsonObject dataObj = data.toJsonObject(); + QJsonArray targetArr = dataObj.value("attributes").toArray(); + for(const QJsonValue& value : targetArr){ + QJsonObject obj = value.toObject(); + if(obj.contains("value")){ //包含value,是查询结果 + QString sToken = obj["token"].toString(); + QString sValue = obj["value"].toString(); + int code = obj["code"].toInt(); + + QMap newInnerMap; + if(code == 20000){ + newInnerMap.insert(0,sValue.toDouble()); //参量没有时序,默认1个值 + QMutexLocker locker(&m_mutex); + _realTimeData[sToken].insert(newInnerMap); //插入到数据队列 + } + else{ + qDebug()<> DataAccessor::getTargetData(QStringList paraL return mapData; } +QMap DataAccessor::getParaUpdateState(QStringList paraLst) +{ + QMap mapState; + + QMutexLocker locker(&m_mutex); + for (const QString& key : paraLst) { + if (_paraUpdateState.contains(key)) { + mapState.insert(key, _paraUpdateState.value(key)); + } + } + return mapState; +} + QString DataAccessor::removeAfterStreamBySplit(const QString& url) { QStringList parts = url.split('/'); diff --git a/diagramCommunication/source/dataProcessor.cpp b/diagramCommunication/source/dataProcessor.cpp index 2117357..44918cf 100644 --- a/diagramCommunication/source/dataProcessor.cpp +++ b/diagramCommunication/source/dataProcessor.cpp @@ -50,6 +50,9 @@ void DataProcessor::processJson( const QVariant& data,int conType) if(dataObj.contains("client_id")){ //实时数据相关 emit httpProcessed("subscriptions",data); } + else if(dataObj.contains("attributes")){ + emit httpProcessed("paraQuery",data); //参量查询/更新返回值 + } } else if(conType == 1){ if(dataObj.contains("targets")){ //实时数据相关