From bea6407b376a4e426f0b120bae569fba6ab867db Mon Sep 17 00:00:00 2001
From: chenluhua1980 <Chenluhua@qq.com>
Date: 星期六, 08 十一月 2025 17:55:47 +0800
Subject: [PATCH] 1.CMaster.cpp 第 1644/1667/1691 行在记录 SV 曲线时通过 getGlassFromSlot(0) 取玻璃,而各设备的 initSlots() 都是从 1 开始编号(例如 CBonder.cpp (line 408)、CVacuumBake.cpp (line 415) 等)。槽位 0 永远不存在,所以 pGlass 始终是 nullptr,pGlass->addSVData(...) 的分支从未执行。结果 SERVO::CGlass::m_svDatas 里没有任何曲线数据,GlassJson::ToPrettyString 生成的 pretty 字符串也就没有 sv_datas,导出 CSV 时自然读不到曲线。 同一段代码还有一个潜在 Bug:虽然判断了 channel - 1 < bonderTypes.size(),但真正索引却用的是 bonderTypes[channel]。索引偏移会导致数据类型错位,最后一个通道甚至可能越界。即使修正了槽位,这里也需要同步改成 bonderTypes[channel - 1](另外两处 vacuumbakeTypes、coolingTypes 也一样)。

---
 SourceCode/Bond/Servo/CMaster.h |   40 ++++++++++++++++++++++++++--------------
 1 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/SourceCode/Bond/Servo/CMaster.h b/SourceCode/Bond/Servo/CMaster.h
index 6a17fb1..e2844bd 100644
--- a/SourceCode/Bond/Servo/CMaster.h
+++ b/SourceCode/Bond/Servo/CMaster.h
@@ -1,4 +1,4 @@
-#pragma once
+锘�#pragma once
 #include <list>
 #include "CEquipment.h"
 #include "CEFEM.h"
@@ -15,6 +15,7 @@
 #include "CRobotTask.h"
 #include "ProcessJob.h"
 #include "CControlJob.h"
+#include "../DAQBridge/core/Collector.h"
 
 
 #define CTStep_Unknow                   0
@@ -107,8 +108,9 @@
         int abortCurrentTask();
         int restoreCurrentTask();
         int resendCurrentTask();
-        void setPortType(unsigned int index, BOOL enable, int type, int mode,
+        void setPortTypeEx(unsigned int index, BOOL enable, int type, int mode,
             int cassetteType, int transferMode, BOOL autoChangeEnable);
+        void setPortType(unsigned int index, int type);
         void setPortCassetteType(unsigned int index, SERVO::CassetteType type);
         void setPortEnable(unsigned int index, BOOL bEnable);
         void setCompareMapsBeforeProceeding(BOOL bCompare);
@@ -128,13 +130,15 @@
         CControlJob* getControlJob();
         CLoadPort* getPortWithCarrierId(const std::string& carrierId) const;
         bool saveState() const;
-        bool loadState(const std::string& path);
+        bool loadState();
+        void setStateFile(const std::string& path);
         int getWipGlasses(std::vector<CGlass*>& glasses);
         void test();
         bool moveGlassToBuf(int eqid, int slotNo);
         bool moveGlassToSlot(int eqid, int slotNo);
         int getPortCassetteSnSeed(int port);
         void setPortCassetteSnSeed(int port, int seed);
+        CGlass* getGlass(int scrPort, int scrSlot);
 
     private:
         inline void lock() { EnterCriticalSection(&m_criticalSection); }
@@ -167,7 +171,7 @@
             CEquipment* pTarEq, int nTarSlot, int armNo = 1);
 
     public:
-        // —— IResourceView 覆写 ——(注意 const)
+        // 鈥斺�� IResourceView 瑕嗗啓 鈥斺�旓紙娉ㄦ剰 const锛�
         bool isProcessJobsEmpty() const override;
         bool recipeExists(const std::string& ppid) const override;
         bool carrierPresent(const std::string& carrierId) const override;
@@ -179,7 +183,7 @@
         std::string& getLastErrorText();
 
     public:
-        // 新增函数
+        // 鏂板鍑芥暟
         CProcessJob* acquireNextProcessJob();
         CGlass* acquireNextGlass();
         int acquireGlassToQueue();
@@ -190,10 +194,14 @@
         bool checkAndUpdatePjComplete(CProcessJob* pJob);
         bool checkAndUpdateCjComplete(CControlJob* pJob);
         CProcessJob* getGlassProcessJob(CGlass* pGlass);
-        bool completeControlJob(std::string description);
+        bool completeControlJob();
+        bool forceCompleteControlJob(std::string description);
         bool canCreateControlJob();
         bool canCompleteControlJob();
         bool canDeleteControlJob();
+        
+        // DAQ Bridge閻╃鍙�
+        Collector* getCollector() const { return m_pCollector; }
 
     private:
         CRITICAL_SECTION m_criticalSection;
@@ -206,42 +214,42 @@
         bool m_bBatch;
 
     private:
-        /* 监控比特位的线程*/
+        /* 鐩戞帶姣旂壒浣嶇殑绾跨▼*/
         HANDLE m_hEventReadBitsThreadExit[2];
         HANDLE m_hReadBitsThreadHandle;
         unsigned m_nReadBitsThreadAddr;
 
-        // 调度线程
+        // 璋冨害绾跨▼
         HANDLE m_hDispatchEvent;
         HANDLE m_hEventDispatchThreadExit[2];
         HANDLE m_hDispatchThreadHandle;
         unsigned m_nDispatchThreadAddr;
 
-        // 启动时间,运行时间,状态
+        // 鍚姩鏃堕棿锛岃繍琛屾椂闂达紝鐘舵��
         ULONGLONG m_ullStartTime;
         ULONGLONG m_ullRunTime;
         MASTERSTATE m_state;
 
-        // 当前任务和已完成任务列表
+        // 褰撳墠浠诲姟鍜屽凡瀹屾垚浠诲姟鍒楄〃
         CRobotTask* m_pActiveRobotTask;
         std::list< CRobotTask* > m_listTask;
 
-        // 错误代码
+        // 閿欒浠g爜
         int m_nLastError;
         std::string m_strLastError;
 
-        // 在开始工艺前是否先需要先比较map
+        // 鍦ㄥ紑濮嬪伐鑹哄墠鏄惁鍏堥渶瑕佸厛姣旇緝map
         BOOL m_isCompareMapsBeforeProceeding;
         BOOL m_bJobMode;
 
 
-        // 千传圈数计数
+        // 鍗冧紶鍦堟暟璁℃暟
         int m_nContinuousTransferCount;
         int m_nContinuousTransferStep;
         int m_nContinuousWorkingPort;
         int m_nContinuousWorkingSlot;
 
-        // 新增已经开始处理的ProcessJob列表
+        // 鏂板宸茬粡寮�濮嬪鐞嗙殑ProcessJob鍒楄〃
         std::vector<CProcessJob*> m_inProcesJobs;
         std::vector<CProcessJob*> m_completeProcessJobs;
         std::vector<CGlass*> m_queueGlasses;
@@ -257,6 +265,10 @@
 
         int m_nTestFlag;
         std::list<CGlass*> m_bufGlass;
+
+    private:
+        Collector* m_pCollector = nullptr;
+        void CreateDAQBridgeServer();
     };
 }
 

--
Gitblit v1.9.3