chenluhua1980
2026-01-24 fbc7719e6c3386418014b92c033d84a3c930e58b
SourceCode/Bond/Servo/CMaster.cpp
@@ -62,6 +62,7 @@
      m_ullStartTime = 0;
      m_ullRunTime = 0;
      m_state = MASTERSTATE::READY;
      m_curveMode = CurveMode::Production;
      m_pActiveRobotTask = nullptr;
      m_nLastError = ER_CODE_NOERROR;
      m_isCompareMapsBeforeProceeding = FALSE;
@@ -118,6 +119,14 @@
         m_hEventDispatchThreadExit[1] = nullptr;
      }
      // 释放人工搬出缓冲区里的玻璃
      for (auto* pGlass : m_bufGlass) {
         if (pGlass != nullptr) {
            pGlass->release();
         }
      }
      m_bufGlass.clear();
      DeleteCriticalSection(&m_criticalSection);
   }
@@ -138,11 +147,18 @@
   int CMaster::init()
   {
      const ULONGLONG boot_master_begin = GetTickCount64();
      LOGI("<Master>正在初始化...");
      LOGI("[BOOT][MASTER] init begin");
      //    cclink
      if (m_cclink.Connect(CC_LINK_IE_CONTROL_CHANNEL(1)) != 0) {
      const ULONGLONG boot_cclink_begin = GetTickCount64();
      const int cc_ret = m_cclink.Connect(CC_LINK_IE_CONTROL_CHANNEL(1));
      LOGI("[BOOT][MASTER] CC-Link connect ret=%d, cost=%llu ms",
         cc_ret,
         (unsigned long long)(GetTickCount64() - boot_cclink_begin));
      if (cc_ret != 0) {
         LOGE("连接CC-Link失败.");
      }
      else {
@@ -231,11 +247,21 @@
      // 读缓存数据
      const ULONGLONG boot_cache_begin = GetTickCount64();
      const ULONGLONG boot_read_begin = GetTickCount64();
      readCache();
      LOGI("[BOOT][MASTER] readCache finished, cost=%llu ms", (unsigned long long)(GetTickCount64() - boot_read_begin));
      const ULONGLONG boot_state_begin = GetTickCount64();
      loadState();
      LOGI("[BOOT][MASTER] loadState finished, cost=%llu ms", (unsigned long long)(GetTickCount64() - boot_state_begin));
      if (m_listener.onControlJobChanged) {
         notifyControlJobChanged();
      }
      LOGI("[BOOT][MASTER] cache/state loaded, cost=%llu ms (since init %llu ms)",
         (unsigned long long)(GetTickCount64() - boot_cache_begin),
         (unsigned long long)(GetTickCount64() - boot_master_begin));
      // 定时器
@@ -258,7 +284,39 @@
      LOGI("<Master>初始化完成.");
      LOGI("[BOOT][MASTER] init finished, total cost=%llu ms",
         (unsigned long long)(GetTickCount64() - boot_master_begin));
      return 0;
   }
   void CMaster::setCurveMode(CurveMode mode)
   {
      if (m_curveMode == mode) {
         return;
      }
      m_curveMode = mode;
      if (m_pCollector != nullptr) {
         const uint32_t mids[] = {
            MID_Bonder1, MID_Bonder2,
            MID_VacuumBakeA, MID_VacuumBakeB,
            MID_BakeCoolingA, MID_BakeCoolingB
         };
         for (uint32_t mid : mids) {
            if (mode == CurveMode::EmptyChamber) {
               m_pCollector->batchStart(mid, "EMPTY_CHAMBER", 30 * 60 * 1000ULL); // 空腔模式:启动采样批次
            }
            else {
               m_pCollector->batchStop(mid);
               m_pCollector->buffersClear(mid); // 切回生产模式,清掉空腔数据
            }
         }
      }
      LOGI("<Master>CurveMode=%s", mode == CurveMode::EmptyChamber ? "EmptyChamber" : "Production");
   }
   CurveMode CMaster::getCurveMode() const
   {
      return m_curveMode;
   }
   int CMaster::term()
@@ -1675,6 +1733,15 @@
         }
      };
      listener.onSVDataReport = [&](void* pEquipment, void* pData) {
         const bool allowSvLog =
            (m_state == MASTERSTATE::RUNNING ||
               m_state == MASTERSTATE::RUNNING_CONTINUOUS_TRANSFER ||
               m_state == MASTERSTATE::RUNNING_BATCH ||
               m_state == MASTERSTATE::STARTING);
         const bool allowCurve = allowSvLog || (m_curveMode == CurveMode::EmptyChamber);
         if (!allowCurve) {
            return;
         }
         CSVData* pSVData = (CSVData*)pData;
         auto rawData = pSVData->getSVRawData();
         std::vector<CParam> params;
@@ -3492,6 +3559,15 @@
      if (pSlot == nullptr) return false;
      CGlass* pGlass = (CGlass*)pSlot->getContext();
      if (pGlass == nullptr) return false;
      // Buffer 上限为 1:新搬出时丢弃旧的
      if (!m_bufGlass.empty()) {
         for (auto* oldGlass : m_bufGlass) {
            if (oldGlass != nullptr) oldGlass->release();
         }
         m_bufGlass.clear();
      }
      m_bufGlass.push_back(pGlass);
      pGlass->addRef();
      pSlot->setContext(nullptr);
@@ -3580,14 +3656,14 @@
         auto& dataTypes = CServoUtilsTool::getEqDataTypes();
         auto& bonderTypes = dataTypes[MID_Bonder1];
         for (size_t i = 0; i < bonderTypes.size(); ++i) {
            m_pCollector->buffersSetChannelName(MID_Bonder1, i + 1, bonderTypes[i].c_str());
            m_pCollector->buffersSetChannelName(MID_Bonder2, i + 1, bonderTypes[i].c_str());
            m_pCollector->buffersSetChannelName(MID_Bonder1, (UINT)i + 1, bonderTypes[(UINT)i].c_str());
            m_pCollector->buffersSetChannelName(MID_Bonder2, (UINT)i + 1, bonderTypes[(UINT)i].c_str());
         }
         auto& vacuumbakeTypes = dataTypes[MID_VacuumBakeA];
         for (size_t i = 0; i < vacuumbakeTypes.size(); ++i) {
            m_pCollector->buffersSetChannelName(MID_VacuumBakeA, i + 1, vacuumbakeTypes[i].c_str());
            m_pCollector->buffersSetChannelName(MID_VacuumBakeB, i + 1, vacuumbakeTypes[i].c_str());
            m_pCollector->buffersSetChannelName(MID_VacuumBakeA, (UINT)i + 1, vacuumbakeTypes[(UINT)i].c_str());
            m_pCollector->buffersSetChannelName(MID_VacuumBakeB, (UINT)i + 1, vacuumbakeTypes[(UINT)i].c_str());
         }
         auto& coolingTypes = dataTypes[MID_BakeCoolingA];
@@ -3595,6 +3671,17 @@
            m_pCollector->buffersSetChannelName(MID_BakeCoolingA, i + 1, coolingTypes[i].c_str());
            m_pCollector->buffersSetChannelName(MID_BakeCoolingB, i + 1, coolingTypes[i].c_str());
         }
         if (m_curveMode == CurveMode::EmptyChamber) {
            const uint32_t mids[] = {
               MID_Bonder1, MID_Bonder2,
               MID_VacuumBakeA, MID_VacuumBakeB,
               MID_BakeCoolingA, MID_BakeCoolingB
            };
            for (uint32_t mid : mids) {
               m_pCollector->batchStart(mid, "EMPTY_CHAMBER", 10 * 60 * 1000ULL);
            }
         }
      }
   }