#pragma once #include "BaseModule.h" #include "libaray_symbols.h" #include "LockFreeQueue.h" #include #include // 数据越限报警:测试脚本,由td触发,报警结果推送到mqtt // CREATE TABLE IF NOT EXISTS lanpengdb.mokuai99(ts timestamp, dim1 double); // create topic mokuai99 as select * from lanpengdb.mokuai99; // delete from lanpengdb.mokuai99; // insert into lanpengdb.mokuai99 values(NOW,12.345); // 报警规则1:满足条件报警 // - : -∞ +∞ 默认范围 // > : max +∞ 介于中间报警 // < : -∞ min 介于中间报警 // []: min max 介于中间报警 // 报警规则2:系统中仅存在一条活跃报警;新报警产生后,应该将历史报警恢复。 // 报警关键字:object,新报警产生时,与本模块alarmRuleId不相符的活跃报警,应当恢复 // update相关代码,在mysql触发器中执行 class ALARMRECOGNITION_EXPORT Module : public BaseModule { public: Module(); private: struct tagRange{ QString szName; // data name double dbMax = __DBL_MAX__; double dbMin = __DBL_MIN__; uint uWinSize = 5; int nStatus = 0; std::string szOperator; // 操作符 std::string alarmRuleId; // 节点-标识码 int alarmRuleVersion; int level; int status; std::string object; tagRange() { szName.clear(); dbMax = __DBL_MAX__; dbMin = __DBL_MIN__; uWinSize = 5; nStatus = 0; } }; struct tagKeyValue{ std::string name = ""; double value = 0; QDateTime tm; tagKeyValue() { tm = QDateTime::currentDateTime(); } tagKeyValue(std::string n,double v) { name = n; value = v; tm = QDateTime::currentDateTime(); } }; private: DataConsumer* m_pDataConsumer = nullptr; std::vector m_szOutputs; // 输出名称 std::map m_mpRangeConfig; // 数据范围:data name - confit private: std::map> m_mpDataValue; // 测量数据:data name - list QReadWriteLock m_objDataLock; public: virtual void Setup(ModuleInfo mi); virtual void regConsumer(DataConsumer* pDC) ; virtual bool isInheritedFrom(std::string tp); virtual void OnSubData(std::string name,std::string val); }; extern "C" {//一定要添加上 ALARMRECOGNITION_EXPORT BaseModule* instance(); ALARMRECOGNITION_EXPORT void destroy(BaseModule*); }