mrDarker
6 天以前 829fe6c6bc33d53fda9c31fd45a37e1df87befff
SourceCode/Bond/Servo/CVacuumBake.cpp
@@ -33,6 +33,377 @@
   {
      // 加入Pin初始化代码
      LOGI("<CVacuumBake>initPins");
      addPin(SERVO::PinType::INPUT, _T("In"));
      addPin(SERVO::PinType::OUTPUT, _T("Out1"));
      addPin(SERVO::PinType::OUTPUT, _T("Out2"));
   }
   void CVacuumBake::initSteps()
   {
      CEquipment::initSteps();
      {
         // eq mode
         CEqModeStep* pStep = new CEqModeStep();
         pStep->setName(STEP_MODE);
         pStep->setWriteSignalDev(0xc40);
         pStep->setModeDev(0x15d7d);
         if (addStep(STEP_ID_EQMODE_CHANGED, pStep) != 0) {
            delete pStep;
         }
      }
      {
         // eq status
         CEqStatusStep* pStep = new CEqStatusStep();
         pStep->setName(STEP_STATUS);
         pStep->setWriteSignalDev(0xc41);
         pStep->setStatusDev(0x15d59);
         if (addStep(STEP_ID_EQSTATUS_CHANGED, pStep) != 0) {
            delete pStep;
         }
      }
      {
         // Eq Alarm
         static char* pszName[] = { STEP_ALARM_BLOCK1, STEP_ALARM_BLOCK2, STEP_ALARM_BLOCK3, STEP_ALARM_BLOCK4, STEP_ALARM_BLOCK5 };
         static int dev[5] = { 0x15f0e , 0x15f3b, 0x15f68, 0x15f95, 0x15fc2 };
         static int writeSignalDev[5] = { 0xc42, 0xc43, 0xc44, 0xc45, 0xc46 };
         static int addr[] = { STEP_ID_EQALARM1, STEP_ID_EQALARM2, STEP_ID_EQALARM3, STEP_ID_EQALARM4, STEP_ID_EQALARM5 };
         for (int i = 0; i < 5; i++) {
            CEqAlarmStep* pStep = new CEqAlarmStep();
            pStep->setName(pszName[i]);
            pStep->setWriteSignalDev(writeSignalDev[i]);
            pStep->setAlarmDev(dev[i]);
            if (addStep(addr[i], pStep) != 0) {
               delete pStep;
            }
         }
      }
      {
         CEqReadStep* pStep = new CEqReadStep(0x16b55, 538 * 2,
            [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
               if (code == ROK && pszData != nullptr && size > 0) {
                  decodeProcessDataReport((CStep*)pFrom, pszData, size);
               }
               return -1;
            });
         pStep->setName(STEP_PROCESS);
         pStep->setWriteSignalDev(0xc47);
         if (addStep(STEP_ID_PROCESS_DATA_REPORT, pStep) != 0) {
            delete pStep;
         }
      }
      {
         // eq cim mode change
         CEqCimModeChangeStep* pStep = new CEqCimModeChangeStep();
         pStep->setName(STEP_CIM_MODE_CHANGE);
         pStep->setWriteSignalDev(0xc60);
         pStep->setCimModeDev(0x2555);
         if (addStep(STEP_ID_CIMMODE_CHANGED_CMD_REPLY, pStep) != 0) {
            delete pStep;
         }
      }
      {
         // eq cim message cmd
         CEqCimMessageCmdStep* pStep = new CEqCimMessageCmdStep();
         pStep->setName(STEP_CIM_MESSAGE_CMD);
         pStep->setWriteSignalDev(0xc61);
         pStep->setCimMessageDev(0x2540);
         if (addStep(STEP_ID_CIM_MSG_SET_CMD_REPLY, pStep) != 0) {
            delete pStep;
         }
      }
      {
         // eq current recipe change
         CEqCurrentRecipeChangeStep* pStep = new CEqCurrentRecipeChangeStep();
         pStep->setName(STEP_EQ_RURRENT_RECIPE_CHANGE);
         pStep->setWriteSignalDev(0xc48);
         pStep->setDataDev(0x16850);
         if (addStep(STEP_ID_CURRENT_RECIPE_CHANGE_REPORT, pStep) != 0) {
            delete pStep;
         }
      }
      {
         // CIM Message Confirm
         // 要将int32的值拆分为两个short, 分别为msg id和panel id
         // 65538, 2Ϊmsg id, 1Ϊpanel id
         CEqReadIntStep* pStep = new CEqReadIntStep(__INT32, 0x15d80);
         pStep->setName(STEP_EQ_CIM_MESSAGE_CONFIRM);
         pStep->setWriteSignalDev(0xc49);
         if (addStep(STEP_ID_CIM_MSG_CONFIRM_REPORT, pStep) != 0) {
            delete pStep;
         }
      }
      {
         CEqCimMessageClearStep* pStep = new CEqCimMessageClearStep();
         pStep->setName(STEP_CIM_MESSAGE_CLEAR);
         pStep->setWriteSignalDev(0xc62);
         pStep->setClearCimMessageDev(0x2553);
         if (addStep(STEP_ID_CIM_MSG_CLEAR_CMD_REPLY, pStep) != 0) {
            delete pStep;
         }
      }
      {
         CEqDateTimeSetCmdStep* pStep = new CEqDateTimeSetCmdStep();
         pStep->setName(STEP_DATETIME_SET_CMD);
         pStep->setWriteSignalDev(0xc63);
         pStep->setDateTimeDev(0x2556);
         if (addStep(STEP_ID_DATETIME_SET_CMD_REPLY, pStep) != 0) {
            delete pStep;
         }
      }
      {
         CEqModeChangeStep* pStep = new CEqModeChangeStep();
         pStep->setName(STEP_EQ_MODE_CHANGE);
         pStep->setWriteSignalDev(0xc65);
         pStep->setEqModeDev(0x255e);
         if (addStep(STEP_ID_EQMODE_CHANGE_CMD_REPLY, pStep) != 0) {
            delete pStep;
         }
      }
      {
         // 请求主配方列表的step
         CEqWriteStep* pStep = new CEqWriteStep();
         pStep->setName(STEP_EQ_MASTER_RECIPE_LIST_REQ);
         pStep->setWriteSignalDev(0xc66);
         pStep->setDataDev(0x2e4a);
         if (addStep(STEP_ID_MASTER_RECIPE_LIST_CMD_REPLY, pStep) != 0) {
            delete pStep;
         }
      }
      {
         // master recipe list report
         CEqReadStep* pStep = new CEqReadStep(0x16955, 255 * 2,
            [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
               CEqReadStep* pTmpStep = (CEqReadStep*)pFrom;
               short ret = MRLRC_OK;
               if (code == ROK && pszData != nullptr && size > 0) {
                  // 此处解释配方数据
                  ret = decodeRecipeListReport(pszData, size);
               }
               pTmpStep->setReturnCode(ret);
               return -1;
            });
         pStep->setName(STEP_EQ_MASTER_RECIPE_LIST);
         pStep->setWriteSignalDev(0xc4b);
         pStep->setReturnDev(0x37ad);
         if (addStep(STEP_ID_MASTER_RECIPE_LIST_REPORT, pStep) != 0) {
            delete pStep;
         }
      }
      {
         // 请求配方参数
         CEqWriteStep* pStep = new CEqWriteStep();
         pStep->setName(STEP_EQ_RECIPE_PARAMETER_REQ);
         pStep->setWriteSignalDev(0xc67);
         pStep->setDataDev(0x2e4b);
         if (addStep(STEP_ID_RECIPE_PARAMETER_CMD_REPLY, pStep) != 0) {
            delete pStep;
         }
      }
      {
         // recipe parameter report
         CEqReadStep* pStep = new CEqReadStep(0x16a54, 257 * 2,
            [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
               CEqReadStep* pTmpStep = (CEqReadStep*)pFrom;
               if (code == ROK && pszData != nullptr && size > 0) {
                  // 此处解释配方数据
                  short ret = decodeRecipeParameterReport(pszData, size);
                  pTmpStep->setReturnCode(ret);
               }
               pTmpStep->setReturnCode(MRLRC_OK);
               return -1;
            });
         pStep->setName(STEP_EQ_RECIPE_PARAMETER);
         pStep->setWriteSignalDev(0xc4c);
         pStep->setReturnDev(0x2ec);
         if (addStep(STEP_ID_RECIPE_PARAMETER_REPORT, pStep) != 0) {
            delete pStep;
         }
      }
      // 使用CEqReadStep替换CEqJobEventStep
      {
         // Received Job Report Upstream #1~9
         char szBuffer[256];
         for (int i = 0; i < 2; i++) {
            CEqReadStep* pStep = new CEqReadStep(0x14c90 + 320 * i, 320 * 2,
               [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
                  if (code == ROK && pszData != nullptr && size > 0) {
                     int port = (int)(__int64)((CEqReadStep*)pFrom)->getProp("Port");
                     if (port > 0) {
                        decodeReceivedJobReport((CStep*)pFrom, port, pszData, size);
                     }
                  }
                  return -1;
               });
            sprintf_s(szBuffer, "%s%d", STEP_EQ_RECEIVED_JOB_UPSn, i + 1);
            pStep->setName(szBuffer);
            pStep->setProp("Port", (void*)(__int64)(i + 1));
            pStep->setWriteSignalDev(0xc00 + i);
            if (addStep(STEP_ID_RECIVE_JOB_UPS1 + i, pStep) != 0) {
               delete pStep;
            }
         }
      }
      {
         // Sent Out Job Report Downstream #1~9
         char szBuffer[256];
         for (int i = 0; i < 2; i++) {
            CEqReadStep* pStep = new CEqReadStep(0x14000 + 320 * i, 320 * 2,
               [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
                  if (code == ROK && pszData != nullptr && size > 0) {
                     int port = (int)(__int64)((CEqReadStep*)pFrom)->getProp("Port");
                     if (port > 0) {
                        decodeSentOutJobReport((CStep*)pFrom, port, pszData, size);
                     }
                  }
                  return -1;
               });
            sprintf_s(szBuffer, "%s%d", STEP_EQ_SENT_OUT_JOB_DOWNSn, i + 1);
            pStep->setName(szBuffer);
            pStep->setProp("Port", (void*)(__int64)(i + 1));
            pStep->setWriteSignalDev(0xc0a + i);
            if (addStep(STEP_ID_SENT_OUT_JOB_DOWNS1 + i, pStep) != 0) {
               delete pStep;
            }
         }
      }
      {
         // Fetched Out Job Report #1~15
         char szBuffer[256];
         for (int i = 0; i < 2; i++) {
            CEqReadStep* pStep = new CEqReadStep(0x15c31 + 18 * i, 18 * 2,
               [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
                  if (code == ROK && pszData != nullptr && size > 0) {
                     int port = (int)(__int64)((CEqReadStep*)pFrom)->getProp("Port");
                     if (port > 0) {
                        decodeFetchedOutJobReport((CStep*)pFrom, port, pszData, size);
                     }
                  }
                  return -1;
               });
            sprintf_s(szBuffer, "%s%d", STEP_EQ_FETCHED_OUT_JOBn, i + 1);
            pStep->setName(szBuffer);
            pStep->setProp("Port", (void*)(__int64)(i + 1));
            pStep->setWriteSignalDev(0xc23 + i);
            if (addStep(STEP_ID_FETCHED_OUT_JOB_REPORT1 + i, pStep) != 0) {
               delete pStep;
            }
         }
      }
      {
         // Stored Job Report #1~15
         char szBuffer[256];
         for (int i = 0; i < 2; i++) {
            CEqReadStep* pStep = new CEqReadStep(0x15b23 + 18 * i, 18 * 2,
               [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
                  if (code == ROK && pszData != nullptr && size > 0) {
                     int port = (int)(__int64)((CEqReadStep*)pFrom)->getProp("Port");
                     if (port > 0) {
                        decodeStoredJobReport((CStep*)pFrom, port, pszData, size);
                     }
                  }
                  return -1;
               });
            sprintf_s(szBuffer, "%s%d", STEP_EQ_STORED_JOBn, i + 1);
            pStep->setName(szBuffer);
            pStep->setProp("Port", (void*)(__int64)(i + 1));
            pStep->setWriteSignalDev(0xc14 + i);
            if (addStep(STEP_ID_STORE_JOB_REPORT1 + i, pStep) != 0) {
               delete pStep;
            }
         }
      }
      // FAC Data Report
      addFacDataReportStep(0x16589, 0xc4d, 1);
      /*
      {
         CEqReadStep* pStep = new CEqReadStep(0x16589, 133 * 2,
            [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
               if (code == ROK && pszData != nullptr && size > 0) {
                  decodeFacDataReport((CStep*)pFrom, pszData, size);
               }
               return -1;
            });
         pStep->setName(STEP_EQ_FAC_DATA_REPORT);
         pStep->setProp("Port", (void*)1);
         pStep->setWriteSignalDev(0xc4d);
         if (addStep(STEP_ID_FAC_DATA_REPORT, pStep) != 0) {
            delete pStep;
         }
      }
      */
      // process start/end report
      {
         CEqReadStep* pStep = new CEqReadStep(0x15D3F, 13 * 2,
            [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
               if (code == ROK && pszData != nullptr && size > 0) {
                  decodeJobProcessStartReport((CStep*)pFrom, pszData, size);
               }
               return -1;
            });
         pStep->setName(STEP_EQ_JOB_PROCESS_START_REPORT);
         pStep->setProp("Port", (void*)1);
         pStep->setWriteSignalDev(0xc33);
         if (addStep(STEP_ID_JOB_PROCESS_START_REPORT, pStep) != 0) {
            delete pStep;
         }
      }
      {
         CEqReadStep* pStep = new CEqReadStep(0x15D4C, 13 * 2,
            [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
               if (code == ROK && pszData != nullptr && size > 0) {
                  decodeJobProcessEndReport((CStep*)pFrom, pszData, size);
               }
               return -1;
            });
         pStep->setName(STEP_EQ_JOB_PROCESS_END_REPORT);
         pStep->setProp("Port", (void*)1);
         pStep->setWriteSignalDev(0xc34);
         if (addStep(STEP_ID_JOB_PROCESS_END_REPORT, pStep) != 0) {
            delete pStep;
         }
      }
   }
   // 必须要实现的虚函数,在此初始化Slot信息
   void CVacuumBake::initSlots()
   {
      m_slot[0].enable();
      m_slot[0].setPosition(m_nID);
      m_slot[0].setNo(1);
      m_slot[0].setName("Slot 1(G1)");
      m_slot[0].setType(MaterialsType::G1);
      m_slot[0].setLinkSignalPath(0);
      m_slot[1].enable();
      m_slot[1].setPosition(m_nID);
      m_slot[1].setNo(2);
      m_slot[1].setName("Slot 2(G1)");
      m_slot[1].setType(MaterialsType::G1);
      m_slot[1].setLinkSignalPath(1);
   }
   void CVacuumBake::onTimer(UINT nTimerid)
@@ -44,4 +415,243 @@
   {
      CEquipment::serialize(ar);
   }
   void CVacuumBake::getAttributeVector(CAttributeVector& attrubutes)
   {
      __super::getAttributeVector(attrubutes);
   }
   int CVacuumBake::recvIntent(CPin* pPin, CIntent* pIntent)
   {
      return __super::recvIntent(pPin, pIntent);
   }
   int CVacuumBake::getIndexerOperationModeBaseValue()
   {
      return 30000;
   }
   int CVacuumBake::parsingParams(const char* pszData, size_t size, std::vector<CParam>& params)
   {
      ASSERT(pszData);
      if (size < 250) return 0;
      int i = 0, v;
      // 1.A_腔加热时间
      v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8;
      params.push_back(CParam("A_腔加热时间", "", this->getName().c_str(), v * 0.1f));
      i += 2;
      // 2.B_腔加热时间
      v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8;
      params.push_back(CParam("B_腔加热时间", "", this->getName().c_str(), v * 0.1f));
      i += 2;
      // 3.A_腔破真空时间
      v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8;
      params.push_back(CParam("A_腔破真空时间", "", this->getName().c_str(), v * 0.01f));
      i += 2;
      // 4.B_腔破真空时间
      v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8;
      params.push_back(CParam("B_腔破真空时间", "", this->getName().c_str(), v * 0.01f));
      i += 2;
      // 5.A_腔真空到达值
      params.push_back(CParam("A_腔真空到达值", "", this->getName().c_str(), (double)toFloat(&pszData[i])));
      i += 4;
      // 6.B_腔真空到达值
      params.push_back(CParam("B_腔真空到达值", "", this->getName().c_str(), (double)toFloat(&pszData[i])));
      i += 4;
      // 7.A_腔温控表主控温度设定
      v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8 | (pszData[i + 2] & 0xff) << 16 | (pszData[i + 3] & 0xff) << 24;
      params.push_back(CParam("A_腔温控表主控温度设定", "", this->getName().c_str(), v * 0.1f));
      i += 4;
      // 8.B_腔温控表主控温度设定
      v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8 | (pszData[i + 2] & 0xff) << 16 | (pszData[i + 3] & 0xff) << 24;
      params.push_back(CParam("B_腔温控表主控温度设定", "", this->getName().c_str(), v * 0.1f));
      i += 4;
      return (int)params.size();
   }
   int CVacuumBake::parsingProcessData(const char* pszData, size_t size, std::vector<CParam>& params)
   {
      ASSERT(pszData);
      if (size < 250) return 0;
      int i = 0, v;
      // 1.工艺参数序号
      v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8;
      params.push_back(CParam("工艺参数序号", "", this->getName().c_str(), v));
      i += 2;
      if (v == 1) {
         // 2.A_腔加热时间
         v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8;
         params.push_back(CParam("A_腔加热时间", "", this->getName().c_str(), v * 0.1f));
         i += 2;
         // 3.A_腔破真空时间
         v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8;
         params.push_back(CParam("A_腔破真空时间", "", this->getName().c_str(), v * 0.01f));
         i += 2;
         // 4.A_腔真空到达值
         params.push_back(CParam("A_腔真空到达值", "", this->getName().c_str(), (double)toFloat(&pszData[i])));
         i += 4;
         // 5.A_腔温控表主控温度设定
         v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8 | (pszData[i + 2] & 0xff) << 16 | (pszData[i + 3] & 0xff) << 24;
         params.push_back(CParam("A_腔温控表主控温度设定", "", this->getName().c_str(), v * 0.1f));
         i += 4;
      }
      else if (v == 1) {
         // 2.B_腔加热时间
         v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8;
         params.push_back(CParam("B_腔加热时间", "", this->getName().c_str(), v * 0.1f));
         i += 2;
         // 3.A_腔破真空时间
         v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8;
         params.push_back(CParam("B_腔破真空时间", "", this->getName().c_str(), v * 0.01f));
         i += 2;
         // 4.A_腔真空到达值
         params.push_back(CParam("B_腔真空到达值", "", this->getName().c_str(), (double)toFloat(&pszData[i])));
         i += 4;
         // 5.A_腔温控表主控温度设定
         v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8 | (pszData[i + 2] & 0xff) << 16 | (pszData[i + 3] & 0xff) << 24;
         params.push_back(CParam("B_腔温控表主控温度设定", "", this->getName().c_str(), v * 0.1f));
         i += 4;
      }
      return (int)params.size();
   }
   int CVacuumBake::parsingSVData(const char* pszData, size_t size, std::vector<CParam>& params)
   {
      /*
      1   A腔工艺运行步骤   1Word   123456
         2   A腔体真空规值   FLOAT   123.456
         3   A腔温控表1当前值   2Word   12345.6
         4   A腔温控表2当前值   2Word   12345.6
         5   A腔温控表4当前值   2Word   12345.6
         6   A腔温控表5当前值   2Word   12345.6
         7   A腔温控表6当前值   2Word   12345.6
         8   A腔温控表7当前值   2Word   12345.6
         9   A腔烘烤剩余时间   1Word   12345.6
         10   B腔工艺运行步骤   1Word   123456
         11   B腔体真空规值   FLOBT   123.456
         12   B腔温控表1当前值   2Word   12345.6
         13   B腔温控表2当前值   2Word   12345.6
         14   B腔温控表4当前值   2Word   12345.6
         15   B腔温控表5当前值   2Word   12345.6
         16   B腔温控表6当前值   2Word   12345.6
         17   B腔温控表7当前值   2Word   12345.6
         18   B腔烘烤剩余时间   1Word   12345.6
   */
      ASSERT(pszData);
      if (size < 125) return 0;
      int i = 0, v;
      // 1.A腔工艺运行步骤
      v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8;
      params.push_back(CParam("A腔工艺运行步骤", "", this->getName().c_str(), v));
      i += 2;
      // 2.A腔体真空规值
      params.push_back(CParam("A腔体真空规值", "", this->getName().c_str(), (double)toFloat(&pszData[i])));
      i += 4;
      // 3.A腔温控表1当前值
      v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8 | (pszData[i + 2] & 0xff) << 16 | (pszData[i + 3] & 0xff) << 24;
      params.push_back(CParam("A腔温控表1当前值", "", this->getName().c_str(), v * 0.1f));
      i += 4;
      // 4.A腔温控表2当前值
      v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8 | (pszData[i + 2] & 0xff) << 16 | (pszData[i + 3] & 0xff) << 24;
      params.push_back(CParam("A腔温控表2当前值", "", this->getName().c_str(), v * 0.1f));
      i += 4;
      // 5.A腔温控表4当前值
      v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8 | (pszData[i + 2] & 0xff) << 16 | (pszData[i + 3] & 0xff) << 24;
      params.push_back(CParam("A腔温控表4当前值", "", this->getName().c_str(), v * 0.1f));
      i += 4;
      // 6.A腔温控表5当前值
      v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8 | (pszData[i + 2] & 0xff) << 16 | (pszData[i + 3] & 0xff) << 24;
      params.push_back(CParam("A腔温控表5当前值", "", this->getName().c_str(), v * 0.1f));
      i += 4;
      // 7.A腔温控表6当前值
      v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8 | (pszData[i + 2] & 0xff) << 16 | (pszData[i + 3] & 0xff) << 24;
      params.push_back(CParam("A腔温控表6当前值", "", this->getName().c_str(), v * 0.1f));
      i += 4;
      // 8.A腔温控表7当前值
      v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8 | (pszData[i + 2] & 0xff) << 16 | (pszData[i + 3] & 0xff) << 24;
      params.push_back(CParam("A腔温控表7当前值", "", this->getName().c_str(), v * 0.1f));
      i += 4;
      // 9.A腔烘烤剩余时间
      v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8;
      params.push_back(CParam("A腔烘烤剩余时间", "", this->getName().c_str(), v * 0.1f));
      i += 2;
      // 10.B腔工艺运行步骤
      v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8;
      params.push_back(CParam("B腔工艺运行步骤", "", this->getName().c_str(), v));
      i += 2;
      // 11.A腔体真空规值
      params.push_back(CParam("B腔体真空规值", "", this->getName().c_str(), (double)toFloat(&pszData[i])));
      i += 4;
      // 12.B腔温控表1当前值
      v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8 | (pszData[i + 2] & 0xff) << 16 | (pszData[i + 3] & 0xff) << 24;
      params.push_back(CParam("B腔温控表1当前值", "", this->getName().c_str(), v * 0.1f));
      i += 4;
      // 13.B腔温控表2当前值
      v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8 | (pszData[i + 2] & 0xff) << 16 | (pszData[i + 3] & 0xff) << 24;
      params.push_back(CParam("B腔温控表2当前值", "", this->getName().c_str(), v * 0.1f));
      i += 4;
      // 14.B腔温控表4当前值
      v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8 | (pszData[i + 2] & 0xff) << 16 | (pszData[i + 3] & 0xff) << 24;
      params.push_back(CParam("B腔温控表4当前值", "", this->getName().c_str(), v * 0.1f));
      i += 4;
      // 15.B腔温控表5当前值
      v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8 | (pszData[i + 2] & 0xff) << 16 | (pszData[i + 3] & 0xff) << 24;
      params.push_back(CParam("B腔温控表5当前值", "", this->getName().c_str(), v * 0.1f));
      i += 4;
      // 16.B腔温控表6当前值
      v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8 | (pszData[i + 2] & 0xff) << 16 | (pszData[i + 3] & 0xff) << 24;
      params.push_back(CParam("B腔温控表6当前值", "", this->getName().c_str(), v * 0.1f));
      i += 4;
      // 17.B腔温控表7当前值
      v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8 | (pszData[i + 2] & 0xff) << 16 | (pszData[i + 3] & 0xff) << 24;
      params.push_back(CParam("B腔温控表7当前值", "", this->getName().c_str(), v * 0.1f));
      i += 4;
      // 18.B腔烘烤剩余时间
      v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8;
      params.push_back(CParam("B腔烘烤剩余时间", "", this->getName().c_str(), v * 0.1f));
      i += 2;
      return (int)params.size();
   }
}