Files
EJM_Display/DataCenter/DataCenter - 副本.h

74 lines
2.3 KiB
C
Raw Normal View History

2025-09-15 22:28:43 +08:00
#ifndef DATACENTER_H
#define DATACENTER_H
#include <QObject>
#include <QVariant>
#include <QTimer>
#include <QMap>
#include <QStringList>
#include "OpcUaManager.h"
#include <GlobalDefinitions/Variable.h>
#include <QMutex> // 新增:线程安全锁
class DataCenter : public QObject
{
Q_OBJECT
public:
static DataCenter* instance(QObject* parent = nullptr); // 全局唯一获取方式
// 禁止拷贝和赋值
DataCenter(const DataCenter&) = delete;
DataCenter& operator=(const DataCenter&) = delete;
// 添加需要监控的节点
void addMonitoredNode(const QString &nodeId, const QString &nodeName,const QString &varName,const QString &TableName,const QString &FieldName);
// 开始/停止循环读取
void startCyclicRead(int intervalMs);
void stopCyclicRead();
// 获取最新的节点值
QVariant getNodeValue(const QString &nodeId) const;
QVariant getNodeValueByName(const QString &nodeName) const;
// 获取所有节点信息
QMap<QString, QString> getAllNodeNames() const { return gOPC_NodeName; }
void InitData();
void browseRecursive(const QString &nodeId);
void doBrowse(const QString &nodeId, int depth, QString prefix);
signals:
// 节点值更新信号供UI层订阅
void nodeValueUpdated(const QString &nodeId, const QString &nodeName,const QString &varName, const QVariant &value);
// 错误信号
void errorOccurred(const QString &errorString);
private slots:
// 定时器触发,执行循环读取
void onTimerTimeout();
// 处理OPC读取结果
void handleReadCompleted(const QVariant &value, const QString &nodeId);
void refreshAllNodes();
private:
explicit DataCenter(OpcUaManager *opcManager, QObject *parent = nullptr); // 私有构造函数
static DataCenter* m_instance; // 静态单例实例
static QMutex m_mutex; // 线程安全锁
/** @brief OPC操作实例不负责所有权 */
OpcUaManager *m_opcManager;
/** @brief 循环读取定时器 */
QTimer *m_cyclicTimer;
/** @brief 当前读取索引 */
int m_currentReadIndex;
//GlobalType DC_SetST; // 数据中心,给变量赋值
};
#endif // DATACENTER_H