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/BoounionPLC/Model.cpp | 67 +++++++++++++++++++++++++++++++--
1 files changed, 63 insertions(+), 4 deletions(-)
diff --git a/SourceCode/Bond/BoounionPLC/Model.cpp b/SourceCode/Bond/BoounionPLC/Model.cpp
index d89bf61..051b050 100644
--- a/SourceCode/Bond/BoounionPLC/Model.cpp
+++ b/SourceCode/Bond/BoounionPLC/Model.cpp
@@ -2,6 +2,9 @@
#include "Model.h"
#include "Log.h"
#include "Common.h"
+#include "ToolUnits.h"
+
+// 常量
CModel* g_pModel = NULL;
@@ -18,6 +21,7 @@
m_pObservableEmitter = nullptr;
m_pObservable = nullptr;
m_nTimerID = 0;
+ m_pActivePlc = nullptr;
}
@@ -72,10 +76,12 @@
g_pModel = this;
- // 模拟从文档或数据库加载PLC列表
- addPlc("Test1", "127.0.0.1", 1001);
- addPlc("Test2", "127.0.0.1", 1002);
-
+ // 获取所有PLC信息
+ std::vector<PlcInfo> plcList;
+ m_configuration.getAllPLCInfo(plcList);
+ for (const auto& plc : plcList) {
+ addPlc(plc.strName, plc.strIp, plc.nPort);
+ }
return 0;
}
@@ -308,6 +314,13 @@
}
}
}
+
+
+ // 读取产能信息
+ CPLC* pPlc = getCurrentPlc();
+ if (pPlc != nullptr) {
+ pPlc->readPLCDataRegularly();
+ }
}
std::map<std::string, CPLC*>& CModel::getPlcMap()
@@ -319,9 +332,39 @@
{
auto iter = m_mapPlc.find(pszName);
if (iter != m_mapPlc.end()) return -1;
+ CString strPlcDir;
+ strPlcDir.Format(_T("%s\\Plcs\\%s"), (LPTSTR)(LPCTSTR)m_strWorkDir, pszName);
CPLC* pPLC = new CPLC(pszName, pszIp, port);
+ pPLC->setWorkDir((LPTSTR)(LPCTSTR)strPlcDir);
+ PLCListener listener;
+ listener.onStateChanged = [&](void* pFrom, int state) -> void {
+ notifyPtr(RX_PLC_STATE_CHANGED, pFrom);
+ };
+ listener.onMonitorData = [&](void* pFrom, int id) -> void {
+ LOGD("PLConMonitorData,%d", id);
+ };
+ listener.onAlarm = [&](void* pFrom, CAlarm* pAlarm, int flag) -> void {
+ LOGE("onAlarm,%d %s", pAlarm->getId(), flag != 0 ? "ON" : "Off");
+ if (flag == 1) {
+ pAlarm->addRef();
+ notifyObjAndPtr(RX_CODE_ALARM_ON, pAlarm, pFrom);
+ pAlarm->release();
+ }
+ else {
+ pAlarm->addRef();
+ notifyObjAndPtr(RX_CODE_ALARM_OFF, pAlarm, pFrom);
+ pAlarm->release();
+ }
+
+ };
+ pPLC->setListener(listener);
pPLC->init();
m_mapPlc[pszName] = pPLC;
+
+ CString strDir;
+ strDir.Format(_T("%s\\PLCs\\%s"), (LPTSTR)(LPCTSTR)m_strWorkDir, (LPTSTR)(LPCTSTR)pszName);
+ CToolUnits::createDir(strDir);
+ m_configuration.addPLC(pszName, pszIp, port);
notifyPtr(RX_CODE_ADD_PLC, pPLC);
return 0;
@@ -332,8 +375,24 @@
auto iter = m_mapPlc.find(pszName);
if (iter == m_mapPlc.end()) return -1;
+ CString strDir;
+ strDir.Format(_T("%s\\PLCs\\%s"), (LPTSTR)(LPCTSTR)m_strWorkDir, (LPTSTR)(LPCTSTR)pszName);
+ CToolUnits::deleteDir(strDir);
+ m_configuration.removePLC(pszName);
+
notifyPtr(RX_CODE_REMOVE_PLC, iter->second);
delete iter->second;
m_mapPlc.erase(iter);
+
return 0;
}
+
+void CModel::setCurrentPlc(CPLC* pPlc)
+{
+ m_pActivePlc = pPlc;
+}
+
+CPLC* CModel::getCurrentPlc()
+{
+ return m_pActivePlc;
+}
\ No newline at end of file
--
Gitblit v1.9.3