From bc7f1c4e028e69be51079b59dae4ae5c4d43f5bb Mon Sep 17 00:00:00 2001
From: chenluhua1980 <Chenluhua@qq.com>
Date: 星期六, 31 一月 2026 21:54:56 +0800
Subject: [PATCH] 1.状态指示图,目前灰色表示掉线,绿色表示在线。增加Slot的小点表示有没有料,及加工状态 。 2.增加图示

---
 SourceCode/Bond/BondEq/Model.cpp |  233 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 232 insertions(+), 1 deletions(-)

diff --git a/SourceCode/Bond/BondEq/Model.cpp b/SourceCode/Bond/BondEq/Model.cpp
index 30fd949..a6f979f 100644
--- a/SourceCode/Bond/BondEq/Model.cpp
+++ b/SourceCode/Bond/BondEq/Model.cpp
@@ -4,6 +4,8 @@
 #include "Model.h"
 #include "Log.h"
 #include "ToolUnits.h"
+#include "Alarm.h"
+#include "EQState.h"
 
 
 CModel* g_pModel = NULL;
@@ -36,6 +38,7 @@
 void CModel::setWorkDir(const char* pszWorkDir)
 {
 	m_strWorkDir = pszWorkDir;
+	m_bonder.setWorkDir(pszWorkDir);
 }
 
 int CModel::init()
@@ -99,11 +102,97 @@
 	g_pModel = this;
 
 
+	BondListener bonderListener;
+	bonderListener.onStateChanged = [&](void* pFrom, int state) -> void {
+		notifyInt(RX_CODE_BONDER_STATE_CHANGED, state);
+	};
+	bonderListener.onPlcStateChanged = [&](void* pFrom, int state) -> void {
+		PLCSTATE ps = (PLCSTATE)state;
+		if (ps == PLCSTATE::CONNECTED) {
+			notifyPtrAndInt(RX_CODE_PLC1_CONNECTTD, pFrom, 0, state);
+		}
+		else if (ps == PLCSTATE::DISCONNECTED) {
+			notifyPtrAndInt(RX_CODE_PLC1_DISCONNECTTD, pFrom, 0, state);
+		}
+	};
+	bonderListener.onEfemStateChanged = [&](void* pFrom, const char* pszAddr, int port, int state) -> void {
+		if (m_pObservableEmitter != NULL) {
+			IAny* pAny = RX_AllocaAny();
+			if (pAny != NULL) {
+				pAny->addRef();
+				pAny->setCode(RX_CODE_EFEM_STATUS_CHANGED);
+				pAny->setStringValue("addr", pszAddr);
+				pAny->setIntValue("port", port);
+				pAny->setIntValue("state", state);
+				m_pObservableEmitter->onNext(pAny);
+				pAny->release();
+			}
+		}
+	};
+	bonderListener.onRecvBroadcast = [&](void* pFrom, void* p) -> void {
+		CComponent* pSender = (CComponent*)pFrom;
+		CIntent* pIntent = (CIntent*)p;
+		int code = pIntent->getCode();
+		if (code == BC_CODE_DATA1_MATERIAL_RECEIVED) {
+			notifyPtr(RX_CODE_DATA1_MATERIAL_RECEIVED, pSender);
+		}
+		else if (code == BC_CODE_DATA1_BEGIN_SAMPLING) {
+			notifyPtr(RX_CODE_DATA1_BEGIN_SAMPLING, pSender);
+		}
+		else if (code == BC_CODE_DATA1_UPDATE) {
+			notifyPtr(RX_CODE_DATA1_UPDATE, pSender);
+		}
+		else if (code == BC_CODE_DATA1_END_SAMPLING) {
+			notifyPtr(RX_CODE_DATA1_END_SAMPLING, pSender);
+		}
+		else if (code == BC_CODE_DATA1_MATERIAL_REMOVED) {
+			std::string strError;
+			CPanel* pPanel = (CPanel*)pIntent->getContext();
+			pPanel->addRef();
+			savePanel(pPanel, pSender);
+			m_sqlite.insertPanel(pPanel, strError);
+			notifyPtr(RX_CODE_DATA1_MATERIAL_REMOVEED, pSender);
+			notifyObj(RX_CODE_PANEL_COMPLATE, pPanel);
+			pPanel->release();
+		}
+		else if (code == BC_CODE_ALARM_ON) {
+			CAlarm* pAlarm = (CAlarm*)pIntent->getContext();
+			pAlarm->addRef();
+			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) {
+			CEQState* pState = (CEQState*)pIntent->getContext();
+			pState->addRef();
+			notifyObjAndPtr(RX_CODE_EQSTATE_EVENT, pState, pSender);
+			pState->release();
+		}
+	};
+	m_bonder.setListener(bonderListener);
+	m_bonder.setModel(this);
+	m_bonder.init();
+
+
+	CString strBonderDataFile;
+	strBonderDataFile.Format(_T("%s\\Bonder.dat"), (LPTSTR)(LPCTSTR)m_strWorkDir);
+	m_bonder.read((LPTSTR)(LPCTSTR)strBonderDataFile);
+
+
 	return 0;
 }
 
 int CModel::term()
 {
+	m_bonder.save();
+	m_bonder.term();
+	m_sqlite.term();
+
 	CLog::GetLog()->SetOnLogCallback(nullptr);
 	return 0;
 }
@@ -194,6 +283,39 @@
 			pAny->addRef();
 			pAny->setCode(code);
 			pAny->setIntValue("exCode", exCode);
+			m_pObservableEmitter->onNext(pAny);
+			pAny->release();
+		}
+	}
+
+	return 0;
+}
+
+int CModel::notifyInt2(int code, int exCode, int exCode2)
+{
+	if (m_pObservableEmitter != NULL) {
+		IAny* pAny = RX_AllocaAny();
+		if (pAny != NULL) {
+			pAny->addRef();
+			pAny->setCode(code);
+			pAny->setIntValue("exCode", exCode);
+			pAny->setIntValue("exCode2", exCode2);
+			m_pObservableEmitter->onNext(pAny);
+			pAny->release();
+		}
+	}
+
+	return 0;
+}
+
+int CModel::notifyDouble(int code, double dValue)
+{
+	if (m_pObservableEmitter != NULL) {
+		IAny* pAny = RX_AllocaAny();
+		if (pAny != NULL) {
+			pAny->addRef();
+			pAny->setCode(code);
+			pAny->setDoubleValue("value", dValue);
 			m_pObservableEmitter->onNext(pAny);
 			pAny->release();
 		}
@@ -293,4 +415,113 @@
 void CModel::onTimer(UINT nTimerid)
 {
 
-}
\ No newline at end of file
+}
+
+int CModel::savePanel(CPanel* pPanel, CComponent* pComponent)
+{
+	int year, month, day;
+	pPanel->getReceivedTime(year, month, day);
+	CString strDir, strFilepath;
+	strDir.Format("%s\\%d\\%d\\%d", (LPTSTR)(LPCTSTR)m_strDataDir, year, month, day);
+	CToolUnits::createDir((LPTSTR)(LPCTSTR)strDir);
+	strFilepath.Format("%s\\%s.csv", (LPTSTR)(LPCTSTR)strDir, pPanel->getQRCode().c_str());
+
+	CStdioFile file;
+	if (!file.Open(strFilepath, CFile::modeCreate | CFile::modeWrite)) {
+		return -1;
+	}
+
+	// 基本信息
+	// 来源, id,开始采样时间,结束采样时间
+	CString strLine;
+	file.WriteString("# 统计\n");
+	strLine.Format(_T("来源,%s\n"), pComponent->getName().c_str());
+	file.WriteString(strLine);
+	strLine.Format(_T("id,%s\n"), pPanel->getQRCode().c_str());
+	file.WriteString(strLine);
+	strLine.Format(_T("来料时间,%s\n"),
+		CToolUnits::timeToString3(pPanel->getReceivedTime()).c_str());
+	file.WriteString(strLine);
+	strLine.Format(_T("采样开始时间,%s\n"),
+		CToolUnits::timeToString3(pPanel->getBeginSamplingTime()).c_str());
+	file.WriteString(strLine);
+	strLine.Format(_T("采样结束时间,%s\n"),
+		CToolUnits::timeToString3(pPanel->getEndSamplingTime()).c_str());
+	file.WriteString(strLine);
+	strLine.Format(_T("出料时间,%s\n"),
+		CToolUnits::timeToString3(pPanel->getRemovedTime()).c_str());
+	file.WriteString(strLine);
+	strLine.Format(_T("Recipe name,%s\n"), pPanel->getRecipeName().c_str());
+	file.WriteString(strLine);
+	strLine.Format(_T("干泵吸真空值,%f\n"), pPanel->getAir1());
+	file.WriteString(strLine);
+	strLine.Format(_T("分子泵吸真空值,%f\n"), pPanel->getAir2());
+	file.WriteString(strLine);
+	strLine.Format(_T("气囊压力值,%f\n"), pPanel->getAir3());
+	file.WriteString(strLine);
+	strLine.Format(_T("贴合总压力,%d\n"), pPanel->getPre1());
+	file.WriteString(strLine);
+	strLine.Format(_T("上腔体温度,%f\n"), pPanel->getTmp1());
+	file.WriteString(strLine);
+	strLine.Format(_T("下腔体温度,%f\n"), pPanel->getTmp2());
+	file.WriteString(strLine);
+	file.WriteString("\n");
+
+
+	// 统计区
+	file.WriteString("# 统计\n");
+	file.WriteString("项,上腔体温度(℃),下腔体温度(℃),上腔体温度1(℃),上腔体温度2(℃),上腔体温度3(℃),上腔体温度4(℃),上腔体温度5(℃),下腔体温度1(℃),下腔体温度2(℃),下腔体温度3(℃),下腔体温度4(℃),下腔体温度5(℃),腔体真空(Pa),腔体压力1(Kg),腔体压力2(Kg),腔体压力3(Kg),腔体压力4(Kg),腔体压力5(Kg)\n");
+	UNITDATA1 dataMax = pPanel->getMathData(IMAX);
+	strLine.Format(_T("最大值,%.01f,%.01f,%.01f,%.01f,%.01f,%.01f,%.01f,%.01f,%.01f,%.01f,%.03f,%.01f,%.01f,%.01f,%.01f,%.01f,%.01f,%.01f\n"),
+		dataMax.temp[0], dataMax.temp[1],
+		dataMax.temp[2], dataMax.temp[3], dataMax.temp[4], dataMax.temp[5], dataMax.temp[6],
+		dataMax.temp[7], dataMax.temp[8], dataMax.temp[9], dataMax.temp[10], dataMax.temp[11],
+		dataMax.vacuum,
+		dataMax.pressure[0], dataMax.pressure[1], dataMax.pressure[2],
+		dataMax.pressure[3], dataMax.pressure[4]);
+	file.WriteString(strLine);
+
+	UNITDATA1 dataMin = pPanel->getMathData(IMIN);
+	strLine.Format(_T("最小值,%.01f,%.01f,%.01f,%.01f,%.01f,%.01f,%.01f,%.01f,%.01f,%.01f,%.03f,%.01f,%.01f,%.01f,%.01f,%.01f,%.01f,%.01f\n"),
+		dataMin.temp[0], dataMin.temp[1],
+		dataMin.temp[2], dataMin.temp[3], dataMin.temp[4], dataMin.temp[5], dataMin.temp[6],
+		dataMin.temp[7], dataMin.temp[8], dataMin.temp[9], dataMin.temp[10], dataMin.temp[11],
+		dataMin.vacuum,
+		dataMin.pressure[0], dataMin.pressure[1], dataMin.pressure[2],
+		dataMin.pressure[3], dataMin.pressure[4]);
+	file.WriteString(strLine);
+
+	UNITDATA1 dataAve = pPanel->getMathData(IAVE);
+	strLine.Format(_T("平均值,%.01f,%.01f,%.01f,%.01f,%.01f,%.01f,%.01f,%.01f,%.01f,%.01f,%.03f,%.01f,%.01f,%.01f,%.01f,%.01f,%.01f,%.01f\n"),
+		dataAve.temp[0], dataAve.temp[1],
+		dataAve.temp[2], dataAve.temp[3], dataAve.temp[4], dataAve.temp[5], dataAve.temp[6],
+		dataAve.temp[7], dataAve.temp[8], dataAve.temp[9], dataAve.temp[10], dataAve.temp[11],
+		dataAve.vacuum,
+		dataAve.pressure[0], dataAve.pressure[1], dataAve.pressure[2],
+		dataAve.pressure[3], dataAve.pressure[4]);
+	file.WriteString(strLine);
+	file.WriteString("\n");
+
+
+	// 数据区
+	file.WriteString("# 数据区\n");
+	file.WriteString("时间,上腔体温度(℃),下腔体温度(℃),上腔体温度1(℃),上腔体温度2(℃),上腔体温度3(℃),上腔体温度4(℃),上腔体温度5(℃),下腔体温度1(℃),下腔体温度2(℃),下腔体温度3(℃),下腔体温度4(℃),下腔体温度5(℃),腔体真空(Pa),腔体压力1(Kg),腔体压力2(Kg),腔体压力3(Kg),腔体压力4(Kg),腔体压力5(Kg)\n");
+	std::vector<UNITDATA1> datas;
+	pPanel->getDatas(datas);
+	for (auto item : datas) {
+		strLine.Format(_T("%s,%.01f,%.01f,%.01f,%.01f,%.01f,%.01f,%.01f,%.01f,%.01f,%.01f,%.03f,%.01f,%.01f,%.01f,%.01f,%.01f,%.01f,%.01f\n"),
+			CToolUnits::timeToString3(item.time).c_str(),
+			item.temp[0], item.temp[1],
+			item.temp[2], item.temp[3], item.temp[4], item.temp[5], item.temp[6],
+			item.temp[7], item.temp[8], item.temp[9], item.temp[10], item.temp[11],
+			item.vacuum,
+			item.pressure[0], item.pressure[1], item.pressure[2],
+			item.pressure[3], item.pressure[4]);
+		file.WriteString(strLine);
+	}
+
+
+	file.Close();
+
+	return 0;
+}

--
Gitblit v1.9.3