From a14c8cb51345fa3342addde7fa584465c4bc7083 Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期一, 09 十二月 2024 17:58:17 +0800
Subject: [PATCH] 1.加入GDI+ 2.警告信息获取;

---
 SourceCode/Bond/BondEq/BondEq.cpp                 |   11 
 SourceCode/Bond/BondEq/CBonder.cpp                |    8 
 SourceCode/Bond/BondEq/InputDialog.cpp            |    1 
 SourceCode/Bond/BondEq/AlarmMonitor.cpp           |  207 +++++++++++-----
 SourceCode/Bond/BondEq/CProjectPageComponents.cpp |   13 
 SourceCode/Bond/BondEq/BondEq.h                   |    2 
 SourceCode/Bond/BondEq/BondEq.rc                  |    0 
 SourceCode/Bond/BondEq/AlarmMonitor.h             |   20 
 SourceCode/Bond/BondEq/CProjectPageRemoteEqs.cpp  |    7 
 SourceCode/Bond/BondEq/BondEqDlg.cpp              |    4 
 SourceCode/Bond/x64/Debug/AlarmList.txt           |  336 ++++++++++++++--------------
 Document/ET6060AVA-LR-101规划表.xlsx                 |    0 
 SourceCode/Bond/BondEq/Alarm.cpp                  |   51 +++
 SourceCode/Bond/BondEq/Model.cpp                  |   10 
 SourceCode/Bond/BondEq/Alarm.h                    |   14 
 SourceCode/Bond/BondEq/Common.h                   |   22 +
 16 files changed, 422 insertions(+), 284 deletions(-)

diff --git "a/Document/ET6060AVA-LR-101\350\247\204\345\210\222\350\241\250.xlsx" "b/Document/ET6060AVA-LR-101\350\247\204\345\210\222\350\241\250.xlsx"
new file mode 100644
index 0000000..3ab6765
--- /dev/null
+++ "b/Document/ET6060AVA-LR-101\350\247\204\345\210\222\350\241\250.xlsx"
Binary files differ
diff --git a/SourceCode/Bond/BondEq/Alarm.cpp b/SourceCode/Bond/BondEq/Alarm.cpp
index eaa30ad..266e4ca 100644
--- a/SourceCode/Bond/BondEq/Alarm.cpp
+++ b/SourceCode/Bond/BondEq/Alarm.cpp
@@ -5,16 +5,25 @@
 
 CAlarm::CAlarm()
 {
+	m_nStatus = 0;
+	m_nId = 0;
+	m_nLevel = 0;
 }
 
-CAlarm::CAlarm(int unitId, int status, int id, int level, const char* pszText)
+CAlarm::CAlarm(int id, int level, const char* pszText)
 {
-	m_nUnitId = unitId;
-	m_nStatus = status;
-	m_time = CToolUnits::getTimestamp();
+	m_nStatus = 0;
 	m_nId = id;
 	m_nLevel = level;
 	m_strText = pszText;
+}
+
+CAlarm::CAlarm(CAlarm* pScr)
+{
+	m_nStatus = 0;
+	m_nId = pScr->m_nId;
+	m_nLevel = pScr->m_nLevel;
+	m_strText = pScr->m_strText;;
 }
 
 CAlarm::~CAlarm()
@@ -31,7 +40,8 @@
 {
 	std::string strText;
 	strText += "CAlarm[";
-	strText += ("time:" + CToolUnits::timeToString2(m_time) + ";");
+	strText += ("m_timeOn:" + CToolUnits::timeToString2(m_timeOn) + ";");
+	strText += ("m_timeOff:" + CToolUnits::timeToString2(m_timeOff) + ";");
 	strText += ("m_nStatus:" + std::to_string(m_nStatus) + ";");
 	strText += ("m_nId:" + std::to_string(m_nId) + ";");
 	strText += ("m_nLevel:" + std::to_string(m_nLevel) + ";");
@@ -46,9 +56,30 @@
 	return m_nUnitId;
 }
 
-ULONGLONG CAlarm::getTime()
+void CAlarm::alarmOn()
 {
-	return m_time;
+	if (m_nStatus == 0) {
+		m_nStatus++;
+		m_timeOn = CToolUnits::getTimestamp();
+	}
+}
+
+void CAlarm::alarmOff()
+{
+	if (m_nStatus == 1) {
+		m_nStatus++;
+		m_timeOff = CToolUnits::getTimestamp();
+	}
+}
+
+ULONGLONG CAlarm::getOnTime()
+{
+	return m_timeOn;
+}
+
+ULONGLONG CAlarm::getOffTime()
+{
+	return m_timeOff;
 }
 
 int CAlarm::getId()
@@ -76,7 +107,8 @@
 	if (ar.IsStoring())
 	{
 		Lock();
-		ar << m_time;
+		ar << m_timeOn;
+		ar << m_timeOff;
 		ar << m_nStatus;
 		ar << m_nId;
 		ar << m_nLevel;
@@ -86,7 +118,8 @@
 	else
 	{
 		Lock();
-		ar >> m_time;
+		ar >> m_timeOn;
+		ar >> m_timeOff;
 		ar >> m_nStatus;
 		ar >> m_nId;
 		ar >> m_nLevel;
diff --git a/SourceCode/Bond/BondEq/Alarm.h b/SourceCode/Bond/BondEq/Alarm.h
index 9b3a354..12b4a26 100644
--- a/SourceCode/Bond/BondEq/Alarm.h
+++ b/SourceCode/Bond/BondEq/Alarm.h
@@ -6,14 +6,19 @@
 {
 public:
 	CAlarm();
-	CAlarm(int unitId, int status, int id, int level, const char* pszText);
+	CAlarm(int id, int level, const char* pszText);
+	CAlarm(int status, int id, int level, const char* pszText);
+	CAlarm(CAlarm* pScr);
 	~CAlarm();
 
 public:
 	virtual std::string& getClassName();
 	virtual std::string toString();
 	int getUnitId();
-	ULONGLONG getTime();
+	void alarmOn();
+	void alarmOff();
+	ULONGLONG getOnTime();
+	ULONGLONG getOffTime();
 	int getId();
 	int getLevel();
 	int getStatus();
@@ -22,8 +27,9 @@
 
 private:
 	int m_nUnitId;
-	ULONG64 m_time;
-	int m_nStatus;
+	ULONG64 m_timeOn;
+	ULONG64 m_timeOff;
+	int m_nStatus;				// 0:未知;1:ON;2:OFF;
 	int m_nId;
 	int m_nLevel;
 	std::string m_strText;
diff --git a/SourceCode/Bond/BondEq/AlarmMonitor.cpp b/SourceCode/Bond/BondEq/AlarmMonitor.cpp
index edf375d..d53b6f7 100644
--- a/SourceCode/Bond/BondEq/AlarmMonitor.cpp
+++ b/SourceCode/Bond/BondEq/AlarmMonitor.cpp
@@ -3,20 +3,33 @@
 #include "Common.h"
 #include "CBonder.h"
 #include "Log.h"
+#include "ToolUnits.h"
 
 #define ALARM_MAX		200
 
 CAlarmMonitor::CAlarmMonitor()
 {
-	m_nBeginAddr = 0;
-	m_nLastId = 0;
-	m_nLastLevel = 0;
+	m_pRawData = new char[200];
+	memset(m_pRawData, 0, 200);
 }
 
 
 CAlarmMonitor::~CAlarmMonitor()
 {
+	if (m_pRawData != nullptr) {
+		delete[] m_pRawData;
+		m_pRawData = nullptr;
+	}
 
+	for (auto item : m_mapAlarmTemplate) {
+		delete item.second;
+	}
+	m_mapAlarmTemplate.clear();
+
+	for (auto item : m_mapAlarming) {
+		item.second->release();
+	}
+	m_mapAlarming.clear();
 }
 
 std::string& CAlarmMonitor::getClassName()
@@ -33,13 +46,59 @@
 void CAlarmMonitor::onData(int id, const void* pData, int size)
 {
 	const char* pszData = (const char*)pData;
-	if (m_nIndex + 1 == id) {
-		int addr = m_nBeginAddr * 2;
-		int alarmId = (pszData[addr] & 0xff) | (pszData[addr + 1] & 0xff) << 8;
-		int alarmLevel = (pszData[addr + 2] & 0xff) | (pszData[addr + 3] & 0xff) << 8;
-		if (m_nLastId != alarmId) {
-			LOGI("<CAlarmMonitor-%d>AlarmId:%d, AlarmLevel:%d", m_nIndex, alarmId, alarmLevel);
-			Alarm(alarmId, alarmLevel);
+	if (MONITOR_ID_ALARM != id) {
+		return;
+	}
+	
+	// 比较有没有变化
+	if (compareData(m_pRawData, (const char*)pData, size)) {
+		return;
+	}
+	memcpy(m_pRawData, (const char*)pData, size);
+
+
+	// 找到On的报警并缓存
+	std::vector<int> alarmIds;
+	for (auto item : m_mapAlarmTemplate) {
+		if (isAlarmOn(item.first)) {
+			alarmIds.push_back(item.first);
+		}
+	}
+
+
+	// 发生警告:
+	// 比较新加的ON的警告
+	// 即m_mapAlarming无,alarmIds有
+	for (auto item : alarmIds) {
+		if (m_mapAlarming.find(item) == m_mapAlarming.end()) {
+			auto iter = m_mapAlarmTemplate.find(item);
+			if (iter != m_mapAlarmTemplate.end()) {
+				CAlarm* pAlarm = new CAlarm(iter->second);
+				pAlarm->alarmOn();
+				pAlarm->addRef();
+				m_mapAlarming[item] = pAlarm;
+				LOGE("发生了警告:%s", pAlarm->toString().c_str());
+
+				// 警告信息发出,以使界面显示和历史记录保存
+				SendBroadcast(&CIntent(BC_CODE_ALARM_ON, "", pAlarm));
+			}
+		}
+	}
+
+	// 削除警告:
+	// 比较得到原来ON(m_mapAlarming有), 现在OFF的警告(alarmIds无)
+	for (auto iter = m_mapAlarming.begin(); iter != m_mapAlarming.end();/* iter++*/) {
+		if (!findAlarm(alarmIds, iter->first)) {
+			// 消除警告, 同时将信息发出,以使界面显示和历史记录保存
+			iter->second->alarmOff();
+			LOGE("消除了警告:%s", iter->second->toString().c_str());
+			SendBroadcast(&CIntent(BC_CODE_ALARM_OFF, "", iter->second));
+
+			iter->second->release();
+			m_mapAlarming.erase(iter++);
+		}
+		else {
+			iter++;
 		}
 	}
 }
@@ -51,20 +110,29 @@
 		return -1;
 	}
 
-	CString strLine, strNumber, strDescription;
+	CString strLine, strNumber, strLevel, strDescription;
+	int number, level;
 	while (file.ReadString(strLine)) {
-		int index = strLine.Find(",");
-		if (index <= 0) continue;
+		if (!AfxExtractSubString(strNumber, (LPCTSTR)strLine, 0, ','))
+			continue;
+		if (!AfxExtractSubString(strLevel, (LPCTSTR)strLine, 1, ','))
+			continue;
+		if (!AfxExtractSubString(strDescription, (LPCTSTR)strLine, 2, ','))
+			continue;
 
-		strNumber = strLine.Left(index).Trim();
-		strDescription = strLine.Right(strLine.GetLength() - index - 1).Trim();
+		try {
+			number = std::stoi((LPTSTR)(LPCTSTR)strNumber);
+			level = std::stoi((LPTSTR)(LPCTSTR)strLevel);
+		}
+		catch (...) {
+			continue;
+		}
 
-		int number = atoi(strNumber);
-		m_mapAlarmText[number] = std::string((LPTSTR)(LPCTSTR)strDescription);
+		addAlarmTemplate(number, level, (LPTSTR)(LPCTSTR)strDescription);
 	}
 
 	file.Close();
-	return (int)m_mapAlarmText.size();
+	return (int)m_mapAlarmTemplate.size();
 }
 
 void CAlarmMonitor::init()
@@ -74,14 +142,7 @@
 
 void CAlarmMonitor::term()
 {
-	for (auto item : m_alarms) {
-		item->release();
-	}
-}
 
-void CAlarmMonitor::setBeginAddr(int nAddr)
-{
-	m_nBeginAddr = nAddr;
 }
 
 void CAlarmMonitor::OnTimer(UINT nTimerid)
@@ -91,43 +152,14 @@
 
 const char* CAlarmMonitor::getAlarmText(int nID)
 {
-	auto iter = m_mapAlarmText.find(nID);
-	if (iter == m_mapAlarmText.end()) return "";
-
-	return iter->second.c_str();
-}
-
-void CAlarmMonitor::Alarm(int id, int level)
-{
-	BEQ::IUnit* pUnit = m_pBonder->getUnit(m_nIndex);
-	ASSERT(pUnit);
-
-	if (id != 0) {
-		// 警告
-		pUnit->setAlarm(id, level, getAlarmText(id));
-		LOGI("<CAlarmMonitor-%d>设备告警(%d, %d).", m_nIndex, id, level);
-
-		CAlarm* pAlarm = new CAlarm(m_nIndex, 1, id, level, getAlarmText(id));
-		AddAlarm(pAlarm);
-		SendBroadcast(&CIntent(BC_CODE_ALARM_EVENT, "", pAlarm));
-		m_nLastId = id;
-		m_nLastLevel = level;
-	}
-	else {
-		// 解除警告
-		pUnit->setAlarm(0, 0, "");
-		LOGI("<CAlarmMonitor-%d>解除设备告警(%d, %d).", m_nIndex, m_nLastId, m_nLastLevel);
-
-		CAlarm* pAlarm = new CAlarm(m_nIndex, 2, m_nLastId, m_nLastLevel, getAlarmText(m_nLastId));
-		AddAlarm(pAlarm);
-		SendBroadcast(&CIntent(BC_CODE_ALARM_EVENT, "", pAlarm));
-		m_nLastId = 0;
-		m_nLastLevel = 0;
-	}
+	auto iter = m_mapAlarmTemplate.find(nID);
+	if (iter == m_mapAlarmTemplate.end()) return "";
+	return iter->second->getText().c_str();
 }
 
 void CAlarmMonitor::Serialize(CArchive& ar)
 {
+	/*
 	if (ar.IsStoring())
 	{
 		Lock();
@@ -153,24 +185,59 @@
 		}
 		Unlock();
 	}
+	*/
 }
 
-void CAlarmMonitor::AddAlarm(CAlarm* pAlarm)
+void CAlarmMonitor::getAlarmingMap(std::map<int, CAlarm*>& alarms)
 {
 	Lock();
-	pAlarm->addRef();
-	m_alarms.push_back(pAlarm);
-	if (m_alarms.size() > ALARM_MAX) {
-		CAlarm* pTemp = m_alarms.front();
-		pTemp->release();
-		m_alarms.pop_front();
+	alarms = m_mapAlarming;
+	Unlock();
+}
+
+BOOL CAlarmMonitor::isAlarming()
+{
+	Lock();
+	BOOL bAlarming = !m_mapAlarming.empty();
+	Unlock();
+	return bAlarming;
+}
+
+BOOL CAlarmMonitor::compareData(const char* pScrData, const char* pTarData, int len)
+{
+	for (int i = 0; i < len; i++) {
+		if (pScrData[i] != pTarData[i]) {
+			return FALSE;
+		}
 	}
-	Unlock();
+
+	return TRUE;
 }
 
-void CAlarmMonitor::getAlarmList(std::list<CAlarm*>& list)
+int CAlarmMonitor::addAlarmTemplate(int id, int level, const char* pszDescription)
 {
-	Lock();
-	list = m_alarms;
-	Unlock();
+	auto iter = m_mapAlarmTemplate.find(id);
+	if (iter != m_mapAlarmTemplate.end()) return -1;
+
+	CAlarm* pAlarm = new CAlarm(id, level, pszDescription);
+	m_mapAlarmTemplate[id] = pAlarm;
+	return 0;
+}
+
+BOOL CAlarmMonitor::isAlarmOn(int id)
+{
+	int byteIndex, bitIndex;
+	byteIndex = (id - 1) / 8;
+	bitIndex = (id - 1) % 8;
+
+	return CToolUnits::getBit(m_pRawData[byteIndex], bitIndex);
+}
+
+BOOL CAlarmMonitor::findAlarm(std::vector<int>& ids, int id)
+{
+	for (auto item : ids) {
+		if (item == id) return TRUE;
+	}
+
+	return FALSE;
 }
\ No newline at end of file
diff --git a/SourceCode/Bond/BondEq/AlarmMonitor.h b/SourceCode/Bond/BondEq/AlarmMonitor.h
index ae84f65..fe1108c 100644
--- a/SourceCode/Bond/BondEq/AlarmMonitor.h
+++ b/SourceCode/Bond/BondEq/AlarmMonitor.h
@@ -17,24 +17,22 @@
 	virtual void onRecvBroadcast(void* pSender, CIntent* pIntent);
 	virtual void init();
 	virtual void term();
-	void setBeginAddr(int nAddr);
 	int readAlarmListFromFile(const char* pszFilepath);
 	virtual void OnTimer(UINT nTimerid);
 	const char* getAlarmText(int nID);
-	void Alarm(int id, int level);
 	virtual void Serialize(CArchive& ar);
-	void getAlarmList(std::list<CAlarm*>& list);
+	void getAlarmingMap(std::map<int, CAlarm*>& alarms);
+	BOOL isAlarming();
 
 private:
-	void AddAlarm(CAlarm* pAlarm);
+	BOOL compareData(const char* pScrData, const char* pTarData, int len);
+	int addAlarmTemplate(int id, int level, const char* pszDescription);
+	BOOL isAlarmOn(int id);
+	BOOL findAlarm(std::vector<int>& ids, int id);
 
 private:
-	int m_nBeginAddr;
-
-private:
-	std::map<int, std::string> m_mapAlarmText;
-	int m_nLastId;
-	int m_nLastLevel;
-	std::list<CAlarm*> m_alarms;
+	std::map<int, CAlarm*> m_mapAlarmTemplate;	// 这是警告的模板,从文件加载
+	std::map<int, CAlarm*> m_mapAlarming;		// 正在发生的警告
+	char* m_pRawData;
 };
 
diff --git a/SourceCode/Bond/BondEq/BondEq.cpp b/SourceCode/Bond/BondEq/BondEq.cpp
index 6818a3d..984e455 100644
--- a/SourceCode/Bond/BondEq/BondEq.cpp
+++ b/SourceCode/Bond/BondEq/BondEq.cpp
@@ -77,6 +77,11 @@
 	SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
 
 
+	// gdi+
+	Gdiplus::GdiplusStartupInput gdiplusStartupInput;
+	Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
+
+
 	// 本程序文件目录
 	TCHAR sDrive[_MAX_DRIVE];
 	TCHAR sDir[_MAX_DIR];
@@ -156,6 +161,12 @@
 	BEQ_Term();
 	RX_Term();
 	MCL_Term();
+	CloseHandle(m_hAppMutex);
+
+
+	// gdi+
+	Gdiplus::GdiplusShutdown(m_gdiplusToken);
+
 
 	return CWinApp::ExitInstance();
 }
diff --git a/SourceCode/Bond/BondEq/BondEq.h b/SourceCode/Bond/BondEq/BondEq.h
index 94f0db3..0112da3 100644
--- a/SourceCode/Bond/BondEq/BondEq.h
+++ b/SourceCode/Bond/BondEq/BondEq.h
@@ -33,7 +33,7 @@
 	CString m_strAppFile;
 	int m_nVersionNumber;
 	CString m_strVersionName;
-
+	ULONG_PTR m_gdiplusToken;
 
 // 实现
 
diff --git a/SourceCode/Bond/BondEq/BondEq.rc b/SourceCode/Bond/BondEq/BondEq.rc
index 61728c2..22fdfef 100644
--- a/SourceCode/Bond/BondEq/BondEq.rc
+++ b/SourceCode/Bond/BondEq/BondEq.rc
Binary files differ
diff --git a/SourceCode/Bond/BondEq/BondEqDlg.cpp b/SourceCode/Bond/BondEq/BondEqDlg.cpp
index 498f7af..3f3103b 100644
--- a/SourceCode/Bond/BondEq/BondEqDlg.cpp
+++ b/SourceCode/Bond/BondEq/BondEqDlg.cpp
@@ -573,6 +573,7 @@
 			return 0;
 		}
 
+		/*
 		CString inputText = inputDialog.GetInputText();
 		std::string strPass = UserManager::getInstance().getCurrentPass();
 		if (inputText.Compare(strPass.c_str()) != 0) {
@@ -580,14 +581,17 @@
 			logManager.log(SystemLogManager::LogType::Info, _T("验证时,密码错误!"));
 			return 0;
 		}
+		*/
 	}
 
 	if (id == IDC_BUTTON_RUN) {
+		theApp.m_model.getBonder().start();
 		m_pTopToolbar->GetBtn(IDC_BUTTON_RUN)->EnableWindow(FALSE);
 		m_pTopToolbar->GetBtn(IDC_BUTTON_STOP)->EnableWindow(TRUE);
 		logManager.log(SystemLogManager::LogType::Operation, _T("运行..."));
 	}
 	else if (id == IDC_BUTTON_STOP) {
+		theApp.m_model.getBonder().stop();
 		m_pTopToolbar->GetBtn(IDC_BUTTON_RUN)->EnableWindow(TRUE);
 		m_pTopToolbar->GetBtn(IDC_BUTTON_STOP)->EnableWindow(FALSE);
 		logManager.log(SystemLogManager::LogType::Operation, _T("停止..."));
diff --git a/SourceCode/Bond/BondEq/CBonder.cpp b/SourceCode/Bond/BondEq/CBonder.cpp
index 9f81e4e..4ebcf7a 100644
--- a/SourceCode/Bond/BondEq/CBonder.cpp
+++ b/SourceCode/Bond/BondEq/CBonder.cpp
@@ -175,11 +175,18 @@
 				c->onData(id, &m_pPlcData[400], 184);
 			}
 		}
+		else if (id == MONITOR_ID_ALARM) {
+			for (auto c : m_components) {
+				c->onData(id, &m_pPlcData[600], 260);
+			}
+		}
 	};
 	pPlc->setListener(listener);
 	pPlc->addMonitor(1, 4400, 4499, MC::SOFT_COMPONENT::D, m_pPlcData);
 	pPlc->addMonitor(2, 4500, 4599, MC::SOFT_COMPONENT::D, &m_pPlcData[200]);
 	pPlc->addMonitor(3, 4700, 4791, MC::SOFT_COMPONENT::D, &m_pPlcData[400]);
+	pPlc->addMonitor(MONITOR_ID_ALARM, 1001, 1064, MC::SOFT_COMPONENT::M, &m_pPlcData[600]);
+	
 	pPlc->setName("PLC(1)");
 	pPlc->setDescription("PLC");
 	pPlc->setIndex(0);
@@ -201,7 +208,6 @@
 	CAlarmMonitor* pAlarmMonitor1 = new CAlarmMonitor();
 	pAlarmMonitor1->setName("警告信息");
 	pAlarmMonitor1->setDescription("警告信息监控");
-	pAlarmMonitor1->setBeginAddr(4461 - 4400);
 	pAlarmMonitor1->setIndex(0);
 	pAlarmMonitor1->readAlarmListFromFile((LPTSTR)(LPCTSTR)strAlarmFile);
 	AddComponent(pAlarmMonitor1);
diff --git a/SourceCode/Bond/BondEq/CProjectPageComponents.cpp b/SourceCode/Bond/BondEq/CProjectPageComponents.cpp
index 3afe5e9..e6eb9f5 100644
--- a/SourceCode/Bond/BondEq/CProjectPageComponents.cpp
+++ b/SourceCode/Bond/BondEq/CProjectPageComponents.cpp
@@ -6,6 +6,7 @@
 #include "CProjectPageComponents.h"
 #include "afxdialogex.h"
 #include "Alarm.h"
+#include "AlarmMonitor.h"
 
 
 // CProjectPageComponents 瀵硅瘽妗�
@@ -72,18 +73,16 @@
 					}
 				}
 			}
-			else if (RX_CODE_ALARM_EVENT == code) {
-				CComponent* pComponent = nullptr;
-				CAlarm* pAlarm = nullptr;
-				pAny->getObject("obj", (IRxObject*&)pAlarm);
+			else if (RX_CODE_ALARM_ON == code
+				|| RX_CODE_ALARM_OFF == code) {
+				CAlarmMonitor* pComponent = nullptr;
 				pAny->getPtrValue("ptr", (void*&)pComponent);
 				ASSERT(pComponent);
-				ASSERT(pAlarm);
 				HTREEITEM hItem = getTreeItem(pComponent);
 				if (hItem != nullptr) {
-					if(pAlarm->getStatus() == 1)
+					if (pComponent->isAlarming())
 						m_treeComponents.ShowItemBadgeDotMode(hItem);
-					else if (pAlarm->getStatus() == 2)
+					else
 						m_treeComponents.HideItemBadge(hItem);
 				}
 			}
diff --git a/SourceCode/Bond/BondEq/CProjectPageRemoteEqs.cpp b/SourceCode/Bond/BondEq/CProjectPageRemoteEqs.cpp
index b10097f..e120046 100644
--- a/SourceCode/Bond/BondEq/CProjectPageRemoteEqs.cpp
+++ b/SourceCode/Bond/BondEq/CProjectPageRemoteEqs.cpp
@@ -128,9 +128,10 @@
 		::DeleteObject(m_hbrBkgnd);
 	}
 
-	ASSERT(m_pObserver != NULL);
-	m_pObserver->unsubscribe();
-	m_pObserver = NULL;
+	if (m_pObserver != NULL) {
+		m_pObserver->unsubscribe();
+		m_pObserver = NULL;
+	}
 }
 
 
diff --git a/SourceCode/Bond/BondEq/Common.h b/SourceCode/Bond/BondEq/Common.h
index 8c949bd..d52651b 100644
--- a/SourceCode/Bond/BondEq/Common.h
+++ b/SourceCode/Bond/BondEq/Common.h
@@ -7,6 +7,10 @@
 #define UNIT1			_T("UNIT1")
 
 
+/* 监控数据id */
+#define MONITOR_ID_ALARM		1001
+
+
 /* Context Ret code */
 #define CRC_ACK_REJECT							-3
 #define CRC_TIMEOUT								-2
@@ -27,11 +31,12 @@
 #define RX_CODE_DATA1_END_SAMPLING		1009
 #define RX_CODE_DATA1_MATERIAL_REMOVEED	1010
 #define RX_CODE_PANEL_COMPLATE			1011
-#define RX_CODE_ALARM_EVENT				1012
-#define RX_CODE_EQSTATE_EVENT			1013
-#define RX_CODE_EFEM_STATUS_CHANGED		1014
-#define RX_CODE_EQ_STATE_CHANGED		1015
-#define RX_CODE_SELECT_COMPONENT		1016
+#define RX_CODE_ALARM_ON				1012
+#define RX_CODE_ALARM_OFF				1013
+#define RX_CODE_EQSTATE_EVENT			1014
+#define RX_CODE_EFEM_STATUS_CHANGED		1015
+#define RX_CODE_EQ_STATE_CHANGED		1016
+#define RX_CODE_SELECT_COMPONENT		1017
 
 /* 广播代码 */
 #define BC_CODE_DATA1_MATERIAL_RECEIVED	5000
@@ -39,9 +44,10 @@
 #define BC_CODE_DATA1_UPDATE			5002
 #define BC_CODE_DATA1_END_SAMPLING		5003
 #define BC_CODE_DATA1_MATERIAL_REMOVED	5004
-#define BC_CODE_ALARM_EVENT				5005
-#define BC_CODE_EQSTATE_EVENT			5006
-#define BC_CODE_RUN_RECIPE_RESULT		5007
+#define BC_CODE_ALARM_ON				5005
+#define BC_CODE_ALARM_OFF				5006
+#define BC_CODE_EQSTATE_EVENT			5007
+#define BC_CODE_RUN_RECIPE_RESULT		5008
 
 /* Channel Name */
 #define MC_CHANNEL1_NAME		"McChannel1"
diff --git a/SourceCode/Bond/BondEq/InputDialog.cpp b/SourceCode/Bond/BondEq/InputDialog.cpp
index ab890fe..86252f9 100644
--- a/SourceCode/Bond/BondEq/InputDialog.cpp
+++ b/SourceCode/Bond/BondEq/InputDialog.cpp
@@ -49,6 +49,7 @@
 	// TODO:  鍦ㄦ娣诲姞棰濆鐨勫垵濮嬪寲
     SetWindowText(m_strTitle);
     m_staticPrompt.SetWindowText(m_strPrompt);
+	m_editInput.SetFocus();
 
 	return TRUE;  // return TRUE unless you set the focus to a control
 	// 寮傚父: OCX 灞炴�ч〉搴旇繑鍥� FALSE
diff --git a/SourceCode/Bond/BondEq/Model.cpp b/SourceCode/Bond/BondEq/Model.cpp
index 8c088d2..ff9e24e 100644
--- a/SourceCode/Bond/BondEq/Model.cpp
+++ b/SourceCode/Bond/BondEq/Model.cpp
@@ -155,10 +155,16 @@
 			notifyObj(RX_CODE_PANEL_COMPLATE, pPanel);
 			pPanel->release();
 		}
-		else if (code == BC_CODE_ALARM_EVENT) {
+		else if (code == BC_CODE_ALARM_ON) {
 			CAlarm* pAlarm = (CAlarm*)pIntent->getContext();
 			pAlarm->addRef();
-			notifyObjAndPtr(RX_CODE_ALARM_EVENT, pAlarm, pSender);
+			notifyObjAndPtr(RX_CODE_ALARM_ON, pAlarm, pSender);
+			pAlarm->release();
+		}
+		else if (code == BC_CODE_ALARM_OFF) {
+			CAlarm* pAlarm = (CAlarm*)pIntent->getContext();
+			pAlarm->addRef();
+			notifyObjAndPtr(RX_CODE_ALARM_OFF, pAlarm, pSender);
 			pAlarm->release();
 		}
 		else if (code == BC_CODE_EQSTATE_EVENT) {
diff --git a/SourceCode/Bond/x64/Debug/AlarmList.txt b/SourceCode/Bond/x64/Debug/AlarmList.txt
index 34ad3a9..69473c8 100644
--- a/SourceCode/Bond/x64/Debug/AlarmList.txt
+++ b/SourceCode/Bond/x64/Debug/AlarmList.txt
@@ -1,208 +1,208 @@
-1,A单元_急停_01
-2,A单元_急停_02
-3,A单元_急停_03
-4,A单元_MEO
+1,1,A单元_急停_01
+2,1,A单元_急停_02
+3,1,A单元_急停_03
+4,1,A单元_MEO
 
-10,B单元_急停_01
-11,B单元_急停_02
-12,B单元_急停_03
-13,B单元_MEO
+10,1,B单元_急停_01
+11,1,B单元_急停_02
+12,1,B单元_急停_03
+13,1,B单元_MEO
 
-201,A单元-上腔体压合Z轴1异常
-202,A单元-上腔体压合Z轴2异常
-203,A单元-上腔体压合Z轴3异常
-204,A单元-上腔体压合Z轴4异常
-205,A单元-上腔体压合Z轴5异常
-206,A单元-上腔体Z轴1异常
-207,A单元-上腔体Z轴2异常
-208,A单元-分离胶辊Z轴1异常
-209,A单元-分离胶辊Z轴2异常
-210,A单元-左侧分离胶辊X轴1异常
-211,A单元-左侧分离胶辊X轴2异常
-212,A单元-分离胶辊调节Z轴异常
-213,A单元-下腔体Z轴异常
-214,A单元-收膜旋转轴异常
-215,A单元-放膜旋转轴异常
+201,2,A单元-上腔体压合Z轴1异常
+202,2,A单元-上腔体压合Z轴2异常
+203,2,A单元-上腔体压合Z轴3异常
+204,2,A单元-上腔体压合Z轴4异常
+205,2,A单元-上腔体压合Z轴5异常
+206,2,A单元-上腔体Z轴1异常
+207,2,A单元-上腔体Z轴2异常
+208,2,A单元-分离胶辊Z轴1异常
+209,2,A单元-分离胶辊Z轴2异常
+210,2,A单元-左侧分离胶辊X轴1异常
+211,2,A单元-左侧分离胶辊X轴2异常
+212,2,A单元-分离胶辊调节Z轴异常
+213,2,A单元-下腔体Z轴异常
+214,2,A单元-收膜旋转轴异常
+215,2,A单元-放膜旋转轴异常
 
-217,B单元-上腔体压合Z轴1异常
-218,B单元-上腔体压合Z轴2异常
-219,B单元-上腔体压合Z轴3异常
-220,B单元-上腔体压合Z轴4异常
-221,B单元-上腔体压合Z轴5异常
-222,B单元-上腔体Z轴1异常
-223,B单元-上腔体Z轴2异常
-224,B单元-分离胶辊Z轴1异常
-225,B单元-分离胶辊Z轴2异常
-226,B单元-左侧分离胶辊X轴1异常
-227,B单元-左侧分离胶辊X轴2异常
-228,B单元-分离胶辊调节Z轴异常
-229,B单元-下腔体Z轴异常
-230,B单元-收膜旋转轴异常
-231,B单元-放膜旋转轴异常
+217,2,B单元-上腔体压合Z轴1异常
+218,2,B单元-上腔体压合Z轴2异常
+219,2,B单元-上腔体压合Z轴3异常
+220,2,B单元-上腔体压合Z轴4异常
+221,2,B单元-上腔体压合Z轴5异常
+222,2,B单元-上腔体Z轴1异常
+223,2,B单元-上腔体Z轴2异常
+224,2,B单元-分离胶辊Z轴1异常
+225,2,B单元-分离胶辊Z轴2异常
+226,2,B单元-左侧分离胶辊X轴1异常
+227,2,B单元-左侧分离胶辊X轴2异常
+228,2,B单元-分离胶辊调节Z轴异常
+229,2,B单元-下腔体Z轴异常
+230,2,B单元-收膜旋转轴异常
+231,2,B单元-放膜旋转轴异常
 
-260,QD77MS16(U60)异常
-261,QD77MS16(U62)异常
+260,2,QD77MS16(U60)异常
+261,2,QD77MS16(U62)异常
 
-501,A单元-分离膜收膜压紧气缸异常
-502,A单元-分离膜放膜压紧气缸异常
-503,A单元-粘膜上升气缸异常
-504,A单元-粘膜下降气缸异常
-505,A单元-高粘上压紧气缸异常
-506,A单元-高粘下压紧气缸异常
-507,A单元-干泵气阀异常
-508,A单元-腔体干泵与分子泵组合气阀异常
-509,A单元-腔体分子泵气阀异常
-510,A单元-腔体总破真空气阀异常
+501,3,A单元-分离膜收膜压紧气缸异常
+502,3,A单元-分离膜放膜压紧气缸异常
+503,3,A单元-粘膜上升气缸异常
+504,3,A单元-粘膜下降气缸异常
+505,3,A单元-高粘上压紧气缸异常
+506,3,A单元-高粘下压紧气缸异常
+507,3,A单元-干泵气阀异常
+508,3,A单元-腔体干泵与分子泵组合气阀异常
+509,3,A单元-腔体分子泵气阀异常
+510,3,A单元-腔体总破真空气阀异常
 
-520,B单元-分离膜收膜压紧气缸异常
-521,B单元-分离膜放膜压紧气缸异常
-522,B单元-粘膜上升气缸异常
-523,B单元-粘膜下降气缸异常
-524,B单元-高粘上压紧气缸异常
-525,B单元-高粘下压紧气缸异常
-526,B单元-干泵气阀异常
-527,B单元-腔体干泵与分子泵组合气阀异常
-528,B单元-腔体分子泵气阀异常
-529,B单元-腔体总破真空气阀异常
+520,3,B单元-分离膜收膜压紧气缸异常
+521,3,B单元-分离膜放膜压紧气缸异常
+522,3,B单元-粘膜上升气缸异常
+523,3,B单元-粘膜下降气缸异常
+524,3,B单元-高粘上压紧气缸异常
+525,3,B单元-高粘下压紧气缸异常
+526,3,B单元-干泵气阀异常
+527,3,B单元-腔体干泵与分子泵组合气阀异常
+528,3,B单元-腔体分子泵气阀异常
+529,3,B单元-腔体总破真空气阀异常
 
-541,A单元-上腔体破真空异常
-542,A单元-下腔体破真空异常
-543,A单元-腔体干泵破真空异常
-544,A单元-腔体分离泵破真空异常
+541,3,A单元-上腔体破真空异常
+542,3,A单元-下腔体破真空异常
+543,3,A单元-腔体干泵破真空异常
+544,3,A单元-腔体分离泵破真空异常
 
-556,B单元-上腔体破真空异常
-557,B单元-下腔体破真空异常
-558,B单元-腔体干泵破真空异常
-559,B单元-腔体分离泵破真空异常
+556,3,B单元-上腔体破真空异常
+557,3,B单元-下腔体破真空异常
+558,3,B单元-腔体干泵破真空异常
+559,3,B单元-腔体分离泵破真空异常
 
-571,A单元-上腔体吸真空异常
-572,A单元-下腔体吸真空异常
-573,A单元-腔体干泵吸真空异常
-574,A单元-腔体分离泵吸真空异常
+571,3,A单元-上腔体吸真空异常
+572,3,A单元-下腔体吸真空异常
+573,3,A单元-腔体干泵吸真空异常
+574,3,A单元-腔体分离泵吸真空异常
 
-586,B单元-上腔体吸真空异常
-587,B单元-下腔体吸真空异常
-588,B单元-腔体干泵吸真空异常
-589,B单元-腔体分离泵吸真空异常
+586,3,B单元-上腔体吸真空异常
+587,3,B单元-下腔体吸真空异常
+588,3,B单元-腔体干泵吸真空异常
+589,3,B单元-腔体分离泵吸真空异常
 
-601,A单元-下腔体在籍异常
+601,3,A单元-下腔体在籍异常
 
-610,B单元-下腔体在籍异常
+610,3,B单元-下腔体在籍异常
 
-621,A单元-离心膜断料
-622,A单元-离心膜转动异常
+621,3,A单元-离心膜断料
+622,3,A单元-离心膜转动异常
 
-626,B单元-离心膜断料
-627,B单元-离心膜转动异常
+626,3,B单元-离心膜断料
+627,3,B单元-离心膜转动异常
 
-631,A单元-上腔体压合Z轴1绝对位置丢失
-632,A单元-上腔体压合Z轴2绝对位置丢失
-633,A单元-上腔体压合Z轴3绝对位置丢失
-634,A单元-上腔体压合Z轴4绝对位置丢失
-635,A单元-上腔体压合Z轴5绝对位置丢失
-636,A单元-上腔体Z轴1绝对位置丢失
-637,A单元-上腔体Z轴2绝对位置丢失
+631,3,A单元-上腔体压合Z轴1绝对位置丢失
+632,3,A单元-上腔体压合Z轴2绝对位置丢失
+633,3,A单元-上腔体压合Z轴3绝对位置丢失
+634,3,A单元-上腔体压合Z轴4绝对位置丢失
+635,3,A单元-上腔体压合Z轴5绝对位置丢失
+636,3,A单元-上腔体Z轴1绝对位置丢失
+637,3,A单元-上腔体Z轴2绝对位置丢失
 
-641,B单元-上腔体压合Z轴1绝对位置丢失
-642,B单元-上腔体压合Z轴2绝对位置丢失
-643,B单元-上腔体压合Z轴3绝对位置丢失
-644,B单元-上腔体压合Z轴4绝对位置丢失
-645,B单元-上腔体压合Z轴5绝对位置丢失
-646,B单元-上腔体Z轴1绝对位置丢失
-647,B单元-上腔体Z轴2绝对位置丢失
+641,3,B单元-上腔体压合Z轴1绝对位置丢失
+642,3,B单元-上腔体压合Z轴2绝对位置丢失
+643,3,B单元-上腔体压合Z轴3绝对位置丢失
+644,3,B单元-上腔体压合Z轴4绝对位置丢失
+645,3,B单元-上腔体压合Z轴5绝对位置丢失
+646,3,B单元-上腔体Z轴1绝对位置丢失
+647,3,B单元-上腔体Z轴2绝对位置丢失
 
-651,A单元-安全门异常
+651,3,A单元-安全门异常
 
-653,B单元-安全门异常
+653,3,B单元-安全门异常
 
-656,A单元-设备正压异常
-657,A单元-离子风正压异常
+656,3,A单元-设备正压异常
+657,3,A单元-离子风正压异常
 
-661,B单元-设备正压异常
-662,B单元-离子风正压异常
+661,3,B单元-设备正压异常
+662,3,B单元-离子风正压异常
 
-666,A单元-上腔体压合Z轴同步异常
-667,A单元-上腔体Z轴同步异常
-668,A单元-分离胶辊Z轴同步异常
-669,A单元-分离胶辊X轴同步异常
+666,3,A单元-上腔体压合Z轴同步异常
+667,3,A单元-上腔体Z轴同步异常
+668,3,A单元-分离胶辊Z轴同步异常
+669,3,A单元-分离胶辊X轴同步异常
 
-671,B单元-上腔体压合Z轴同步异常
-672,B单元-上腔体Z轴同步异常
-673,B单元-分离胶辊Z轴同步异常
-674,B单元-分离胶辊X轴同步异常
+671,3,B单元-上腔体压合Z轴同步异常
+672,3,B单元-上腔体Z轴同步异常
+673,3,B单元-分离胶辊Z轴同步异常
+674,3,B单元-分离胶辊X轴同步异常
 
-676,A单元-干泵处于非远程模式
-677,A单元-干泵DVP未运行
-678,A单元-干泵MBP未运行
-679,A单元-干泵异常
-680,A单元-干泵面板急停触发
+676,3,A单元-干泵处于非远程模式
+677,3,A单元-干泵DVP未运行
+678,3,A单元-干泵MBP未运行
+679,3,A单元-干泵异常
+680,3,A单元-干泵面板急停触发
 
-683,B单元-干泵处于非远程模式
-684,B单元-干泵DVP未运行
-685,B单元-干泵MBP未运行
-686,B单元-干泵异常
-687,B单元-干泵面板急停触发
+683,3,B单元-干泵处于非远程模式
+684,3,B单元-干泵DVP未运行
+685,3,B单元-干泵MBP未运行
+686,3,B单元-干泵异常
+687,3,B单元-干泵面板急停触发
 
-690,A单元-上腔体压合Z轴1过载报警
-691,A单元-上腔体压合Z轴2过载报警
-692,A单元-上腔体压合Z轴3过载报警
-693,A单元-上腔体压合Z轴4过载报警
-694,A单元-上腔体压合Z轴5过载报警
-695,A单元-上腔体Z轴1过载报警
-696,A单元-上腔体Z轴2过载报警
-697,A单元-分离胶辊Z轴1过载报警
-698,A单元-分离胶辊Z轴2过载报警
-699,A单元-分离胶辊X轴1过载报警
-700,A单元-分离胶辊X轴2过载报警
+690,3,A单元-上腔体压合Z轴1过载报警
+691,3,A单元-上腔体压合Z轴2过载报警
+692,3,A单元-上腔体压合Z轴3过载报警
+693,3,A单元-上腔体压合Z轴4过载报警
+694,3,A单元-上腔体压合Z轴5过载报警
+695,3,A单元-上腔体Z轴1过载报警
+696,3,A单元-上腔体Z轴2过载报警
+697,3,A单元-分离胶辊Z轴1过载报警
+698,3,A单元-分离胶辊Z轴2过载报警
+699,3,A单元-分离胶辊X轴1过载报警
+700,3,A单元-分离胶辊X轴2过载报警
 
-701,B单元-上腔体压合Z轴1过载报警
-702,B单元-上腔体压合Z轴2过载报警
-703,B单元-上腔体压合Z轴3过载报警
-704,B单元-上腔体压合Z轴4过载报警
-705,B单元-上腔体压合Z轴5过载报警
-706,B单元-上腔体Z轴1过载报警
-707,B单元-上腔体Z轴2过载报警
-708,B单元-分离胶辊Z轴1过载报警
-709,B单元-分离胶辊Z轴2过载报警
-710,B单元-分离胶辊X轴1过载报警
-711,B单元-分离胶辊X轴2过载报警
+701,3,B单元-上腔体压合Z轴1过载报警
+702,3,B单元-上腔体压合Z轴2过载报警
+703,3,B单元-上腔体压合Z轴3过载报警
+704,3,B单元-上腔体压合Z轴4过载报警
+705,3,B单元-上腔体压合Z轴5过载报警
+706,3,B单元-上腔体Z轴1过载报警
+707,3,B单元-上腔体Z轴2过载报警
+708,3,B单元-分离胶辊Z轴1过载报警
+709,3,B单元-分离胶辊Z轴2过载报警
+710,3,B单元-分离胶辊X轴1过载报警
+711,3,B单元-分离胶辊X轴2过载报警
 
-712,A单元-上腔体压合Z轴5轴间误差过大
-713,A单元-上腔体Z轴2轴间误差过大
-714,A单元-上腔体Z轴与上腔压合Z轴误差过大
+712,3,A单元-上腔体压合Z轴5轴间误差过大
+713,3,A单元-上腔体Z轴2轴间误差过大
+714,3,A单元-上腔体Z轴与上腔压合Z轴误差过大
 
-717,B单元-上腔体压合Z轴5轴间误差过大
-718,B单元-上腔体Z轴2轴间误差过大
-719,B单元-上腔体Z轴与上腔压合Z轴误差过大
+717,3,B单元-上腔体压合Z轴5轴间误差过大
+718,3,B单元-上腔体Z轴2轴间误差过大
+719,3,B单元-上腔体Z轴与上腔压合Z轴误差过大
 
-722,A单元-分子泵处于非远程模式
-723,A单元-分子泵异常
-724,B单元-分子泵处于非远程模式
-725,B单元-分子泵异常
-726,A单元-干泵抽真空异常
-727,B单元-干泵抽真空异常
+722,3,A单元-分子泵处于非远程模式
+723,3,A单元-分子泵异常
+724,3,B单元-分子泵处于非远程模式
+725,3,B单元-分子泵异常
+726,3,A单元-干泵抽真空异常
+727,3,B单元-干泵抽真空异常
 
-729,A单元-上腔体加热主控仪表异常
-730,A单元-上腔体加热腔体温度异常
+729,3,A单元-上腔体加热主控仪表异常
+730,3,A单元-上腔体加热腔体温度异常
 
-732,A单元-下腔体加热主控仪表异常
-733,A单元-下腔体加热腔体温度异常
+732,3,A单元-下腔体加热主控仪表异常
+733,3,A单元-下腔体加热腔体温度异常
 
-739,B单元-上腔体加热主控仪表异常
-740,B单元-上腔体加热腔体温度异常
+739,3,B单元-上腔体加热主控仪表异常
+740,3,B单元-上腔体加热腔体温度异常
 
-742,B单元-下腔体加热主控仪表异常
-743,B单元-下腔体加热腔体温度异常
+742,3,B单元-下腔体加热主控仪表异常
+743,3,B单元-下腔体加热腔体温度异常
 
-801,上游连接中断
-802,下游连接中断
+801,3,上游连接中断
+802,3,下游连接中断
 
-806,上游交握超时
-807,下游交握超时
+806,3,上游交握超时
+807,3,下游交握超时
 
-811,A单元-离子风异常
+811,3,A单元-离子风异常
 
-814,B单元-离子风异常
+814,3,B单元-离子风异常
 
 
 

--
Gitblit v1.9.3