add HMI variant setting

This commit is contained in:
baiYue 2026-04-15 09:00:54 +08:00
parent 8287f5a685
commit 87c4d9e380
8 changed files with 196 additions and 18 deletions

View File

@ -294,4 +294,11 @@ struct PluginTypeInfo //插件的类型信息
QString modelName; //工程模名 QString modelName; //工程模名
}; };
struct ParamUpdateInfo //参量更新信息
{
QString sToken;
double oldVal;
double newVal;
};
#endif #endif

View File

@ -234,7 +234,7 @@ private:
dlg.showDlg(customType); dlg.showDlg(customType);
if (dlg.exec() == QDialog::Accepted) { if (dlg.exec() == QDialog::Accepted) {
DataSourceType setType = dlg.getCurData(); DataSourceType setType = dlg.getCurData();
varNameEdit->setText(setType.sPara); varNameEdit->setText(setType.sCode);
} }
}); });
return page; return page;

View File

@ -119,6 +119,7 @@ public:
void startAcceptData(); //开始接收实时数据 void startAcceptData(); //开始接收实时数据
void stopAcceptData(QString); //停止接收实时数据 void stopAcceptData(QString); //停止接收实时数据
void updateParamData(QList<ParamUpdateInfo>); //更新参量
QMap<int,QList<QPair<MonitorItemState,QString>>>& getMonitorStateMap(){return m_monitorStateMap;} QMap<int,QList<QPair<MonitorItemState,QString>>>& getMonitorStateMap(){return m_monitorStateMap;}
void setMonitorDisplaySetting(QMap<MonitorItemTypeStruct,QMap<MonitorItemStateStruct,MonitorItemDisplayInfo>> map){m_monitorDisplaySetting = map;} void setMonitorDisplaySetting(QMap<MonitorItemTypeStruct,QMap<MonitorItemStateStruct,MonitorItemDisplayInfo>> map){m_monitorDisplaySetting = map;}
@ -165,7 +166,6 @@ public:
QString getLastSave() {return _lastSaveTime;} QString getLastSave() {return _lastSaveTime;}
public Q_SLOTS: public Q_SLOTS:
void onSignal_ifExits(QUuid id,const QString&,int type,GraphicsFunctionModelItem*); //判断用户输入的名称是否已存在 void onSignal_ifExits(QUuid id,const QString&,int type,GraphicsFunctionModelItem*); //判断用户输入的名称是否已存在
void onTimeOut();
void onSignal_GetPointData(QString type,QMap<qint64,double> map); void onSignal_GetPointData(QString type,QMap<qint64,double> map);
void onSignal_openBayManager(); void onSignal_openBayManager();
void onDataTimerOut(); void onDataTimerOut();

View File

@ -17,6 +17,7 @@ public:
void setParent(DiagramCavas* p) {_parentCavas = p;} void setParent(DiagramCavas* p) {_parentCavas = p;}
QMap<QString,QMap<quint64,double>> getTargetData(QStringList); //获取指定名称的值 QMap<QString,QMap<quint64,double>> getTargetData(QStringList); //获取指定名称的值
QMap<QString,int> getParaUpdateState(QStringList); //获取指定参量的更新结果
public slots: public slots:
void onReceiveHttpData(const QString& sType,const QVariant& data); void onReceiveHttpData(const QString& sType,const QVariant& data);
void onReceiveWebsocketData(const QVariant& data); void onReceiveWebsocketData(const QVariant& data);
@ -24,6 +25,7 @@ private:
QString removeAfterStreamBySplit(const QString& url); //手动处理websocket的config QString removeAfterStreamBySplit(const QString& url); //手动处理websocket的config
private: private:
QMap<QString,QMap<quint64,double>> _realTimeData; //实时数据缓存 todo:自动清理 QMap<QString,QMap<quint64,double>> _realTimeData; //实时数据缓存 todo:自动清理
QMap<QString,int> _paraUpdateState; //参量更新结果
mutable QMutex m_mutex; mutable QMutex m_mutex;
DiagramCavas* _parentCavas; DiagramCavas* _parentCavas;
}; };

View File

@ -45,7 +45,53 @@ QMap<QString,double> BaseItemPropertyProxy::getMap()
return map; return map;
} }
void BaseItemPropertyProxy::setMap(QMap<QString,double>) void BaseItemPropertyProxy::setMap(QMap<QString,double> mapSetting)
{ {
//todo:接口修改参量 int nMode = _pControl->getCurMode();
if(nMode == 0) //编辑模式不设置
return;
QUuid uid = _pItem->getProperty()->uuid();
QList<ParamUpdateInfo> updateList;
auto pPara = _pControl->getMonitorPara();
const QList<MonitorItemAttributeInfo>& attributeList = pPara.value(uid);
// 2. 构建sName到MonitorItemAttributeInfo的快速查找表
QHash<QString, const MonitorItemAttributeInfo*> 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);
}
} }

View File

@ -24,6 +24,7 @@
#include "pluginManager.h" #include "pluginManager.h"
#include "graphicsItem/pluginItemFactory.h" #include "graphicsItem/pluginItemFactory.h"
#include "extraPropertyManager.h"
#include "graphicsItem/itemPort.h" #include "graphicsItem/itemPort.h"
#include "designerScene.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<qint64,double> map) void FixedPortsModel::onSignal_GetPointData(QString type,QMap<qint64,double> map)
{ {
if(map.size() == 1) //实时数据 if(map.size() == 1) //实时数据
@ -1774,7 +1768,48 @@ void FixedPortsModel::onPanelVisibilityChanged(const QString& panelName, bool sh
void FixedPortsModel::onVariantSet(QString varName,QVariant val) void FixedPortsModel::onVariantSet(QString varName,QVariant val)
{ {
QMap<QString, ExtraProperty> 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<ParamUpdateInfo> 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) void FixedPortsModel::onScriptExec(QString script)
@ -2555,19 +2590,40 @@ void FixedPortsModel::updateMonitorDisplay()
void FixedPortsModel::startAcceptData() void FixedPortsModel::startAcceptData()
{ {
QStringList lstTarget; //待订阅的对象 QStringList lstTarget; //待订阅的对象(量测)
QStringList lstParamTarget; //待读取的对象(参量,不需要一直读取,httpget)
QMap<QString, int> connectTypeMap; //先创建一个sConnectPara到nConnectType的映射
for(auto& lst:m_monitorPara){ for(auto& lst:m_monitorPara){
for(auto& para:lst){ for(auto& para:lst){
if(para.bSelected && !para.sConnectPara.isEmpty()){ if(!para.sConnectPara.isEmpty()){
if(!lstTarget.contains(para.sConnectPara)) connectTypeMap[para.sConnectPara] = para.nConnectType;
lstTarget.append(para.sConnectPara); 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引用了该属性追加数据请求 for(auto& paraRef : m_monitorParaRef){ //如果normalItem中未选择该属性textItem引用了该属性追加数据请求
if(!lstTarget.contains(paraRef)) QString sConnectPara = paraRef;
lstTarget.append(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; //构建开始请求 QJsonObject obj; //构建开始请求
@ -2599,6 +2655,32 @@ void FixedPortsModel::startAcceptData()
UiCommunicationBus::instance()->insertTempRequest(_pageName,requestLst); UiCommunicationBus::instance()->insertTempRequest(_pageName,requestLst);
_curRequestLst = lstTarget; _curRequestLst = lstTarget;
m_dataTimer->start(); m_dataTimer->start();
QString sParaPath = "/component/attribute/get/"; //参数查询地址
sParaPath += lstParamTarget.join(",");
UiCommunicationBus::instance()->sendHttpRequest(sParaPath,QVariant(),"GET");
_curRequestLst.append(lstParamTarget);
}
void FixedPortsModel::updateParamData(QList<ParamUpdateInfo> 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) void FixedPortsModel::stopAcceptData(QString page)

View File

@ -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<quint64, double> newInnerMap;
if(code == 20000){
newInnerMap.insert(0,sValue.toDouble()); //参量没有时序默认1个值
QMutexLocker locker(&m_mutex);
_realTimeData[sToken].insert(newInnerMap); //插入到数据队列
}
else{
qDebug()<<sToken<<" "<<code<<"receive attr err";
}
}
else{ //update返回值
}
}
}
else if(sType == "subscriptionTest"){ else if(sType == "subscriptionTest"){
qDebug()<<"receive null data"; qDebug()<<"receive null data";
} }
@ -208,6 +233,19 @@ QMap<QString,QMap<quint64,double>> DataAccessor::getTargetData(QStringList paraL
return mapData; return mapData;
} }
QMap<QString,int> DataAccessor::getParaUpdateState(QStringList paraLst)
{
QMap<QString,int> 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) QString DataAccessor::removeAfterStreamBySplit(const QString& url)
{ {
QStringList parts = url.split('/'); QStringList parts = url.split('/');

View File

@ -50,6 +50,9 @@ void DataProcessor::processJson( const QVariant& data,int conType)
if(dataObj.contains("client_id")){ //实时数据相关 if(dataObj.contains("client_id")){ //实时数据相关
emit httpProcessed("subscriptions",data); emit httpProcessed("subscriptions",data);
} }
else if(dataObj.contains("attributes")){
emit httpProcessed("paraQuery",data); //参量查询/更新返回值
}
} }
else if(conType == 1){ else if(conType == 1){
if(dataObj.contains("targets")){ //实时数据相关 if(dataObj.contains("targets")){ //实时数据相关