亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? abcomms.cpp

?? 用于開發Modbus工業級通信
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
         break;
      case ENG_STATE_RECEIVE :
         // DLE STX ---> DST SRC CMD STS TNS TNS FNC CNT FIL ADDR ADDR [ADDR] .... DLE ETX CRC CRC
         {
         BYTE  nodleBuffer[MAX_ABPORT_MESSAGELEN];
         DWORD nodleLen;
         BOOL valid;

            if (m_noiseLength >= 2)
            {
               if (( m_noiseBuffer[0] == ALLENBRADLEY_DLE)&&
                   (m_noiseBuffer[1] == ALLENBRADLEY_ACK ))
               {
                  RSDataMessage("GOT ACK: await remaining response.");
                  // strip these 2 chars
                  m_noiseLength-= 2;
                  memmove(m_noiseBuffer, &m_noiseBuffer[2], m_noiseLength);
                  memset(&m_noiseBuffer[m_noiseLength], 0xAA, 2);
               }
            }
            // strip double DLE's 
            RemoveDLE(m_noiseBuffer, m_noiseLength, nodleBuffer, &nodleLen);

            valid= (nodleLen >= minFrameLength);
            if ((nodleLen >= minRESP_FrameLength/*12*/) && ((nodleBuffer[AB_COMMANDBYTEOFF] & 0x40)==0x40)) // command response
               valid = TRUE;
            if (valid)
            {
            CHAR ETXBuff[2];
            BYTE *crcStartPtr;
            WORD  crc = 0;
            WORD *crcPtr;
            BYTE  bccCode;
            BYTE *bccPtr;
            BOOL checksummingOK = FALSE;

               //memcpy(&nodleBuffer[nodleLen], &m_receivedBuffer[m_noiseLength-2],2);

               crcPtr = (WORD*)&nodleBuffer[nodleLen-2];   //skip the DLE STX
               bccPtr = (BYTE*)&nodleBuffer[nodleLen-1];  
               crcStartPtr = (BYTE*)&nodleBuffer[2];

               crc = 0;
               CalcCRC(crcStartPtr, nodleLen-6, &crc);      // Only one buffer to calc crc of
               bccCode = CalcBCC(crcStartPtr, nodleLen-5);      
               // include the ETX, remember that the DLE gets ignored
               ETXBuff[0] = 0x03;
               CalcCRC((BYTE*)&ETXBuff[0], 1, &crc);      // include the ETX

               if (!m_useBCCchecks)
                  checksummingOK = (crc == *crcPtr);
               else
                  checksummingOK = (bccCode == *bccPtr);

               if (checksummingOK)
               {
               CABMessage msg(&nodleBuffer[2], nodleLen-2-4, FALSE);

                  ActivateStation((BYTE)nodleBuffer[AB_SOURCEBYTEOFF]);
                  ActivateStation((BYTE)nodleBuffer[AB_DESTINATIONBYTEOFF]);
                  if (pGlobalDialog->StationEnabled(msg.stationIDDest))
                  {
                  DWORD dataLength = nodleLen-2-4; // exclude the STX, ETX and CRC portions
                     // send an ACK, and process the message
                     RSDataMessage("ACK device message.");
                     Send(2, txDLE_ACK, FALSE, NULL);
                     if (pGlobalDialog->m_useBCC)
                        dataLength++;
                     BOOL result = OnMessageReceived(&nodleBuffer[2], dataLength ); //(-2-4) 
                     // will do it's own SetEngineState(ENG_STATE_FINALACK);
                  }
                  else
                  {
                  CString message;
                     message.Format("Station %d is off-line, no response will be sent", msg.stationIDDest);
                     RSDataMessage(message);
                     SetEngineState(ENG_STATE_IDLE);
                  }
                  m_noiseLength = 0;
                  return (TRUE);
               }
               else
               {
               DWORD etxPos=-1;
               DWORD stxPos = -1;

                  // try find a DLE-ETX
                  if (FindFragment(nodleBuffer, nodleLen, txDLE_ETX, 2, &etxPos))
                     if (etxPos+4 <= nodleLen)
                  {
                     FindFragment(nodleBuffer, nodleLen, txDLE_STX, 2, &stxPos);
                     if (stxPos < etxPos)
                     { // prevent parsing of an STX occuring after an ETX
                        RSDataMessage("Cannot match STX-ETX framing, removing DLE-ETX.");
                        m_noiseLength-= etxPos+2;
                        // swallow all chars up to & including the DLE-ETX
                        memmove(m_noiseBuffer, &m_noiseBuffer[etxPos+2], m_noiseLength);
                        memset(&m_noiseBuffer[m_noiseLength], 0xAA, sizeof(m_noiseBuffer)-m_noiseLength);
                        SetEngineState(ENG_STATE_IDLE);
                        return(TRUE);
                     }
                     crcStartPtr = (BYTE*)&nodleBuffer[stxPos + 2];
                     crcPtr = (WORD*)&nodleBuffer[etxPos+2];   //skip the DLE STX
                     crc = 0;
                     bccCode = 0;
                     ASSERT(stxPos > etxPos); // Fix this possible - number
                     CalcCRC(crcStartPtr, etxPos-2- stxPos, &crc);      // Only one buffer to calc crc of
                     
                     bccCode = CalcBCC(crcStartPtr, etxPos-2- stxPos);
                     // include the ETX, remember that the DLE gets ignored
                     ETXBuff[0] = 0x03;
                     CalcCRC((BYTE*)&ETXBuff[0], 1, &crc);      // include the ETX

                     if (!m_useBCCchecks)
                        checksummingOK = (crc == *crcPtr);
                     else
                        checksummingOK = (bccCode == *bccPtr);

                     if (checksummingOK)
                     {
                        ActivateStation((BYTE)nodleBuffer[AB_SOURCEBYTEOFF]);
                        ActivateStation((BYTE)nodleBuffer[AB_DESTINATIONBYTEOFF]);
                  
                        // send an ACK, and process the message
                        RSDataMessage("ACK device message.");
                        Send(2, txDLE_ACK, FALSE, NULL);
                        BOOL result = OnMessageReceived(&nodleBuffer[2], nodleLen-2-4); //(-2-4) exclude the STX, ETX and CRC portions
                        // will do it's own SetEngineState(ENG_STATE_FINALACK);
                        //m_noiseLength = 0;
                        return (TRUE);
                     }
                     else
                     {  // kill this frame, I cannot match a CRC for it
                        if (FindFragment(m_noiseBuffer, m_noiseLength, txDLE_ETX, 2, &etxPos))
                        {
                           RSDataMessage("Skipping frame, cannot match the CRC.");
                           m_noiseLength-= etxPos+4;
                           memmove(m_noiseBuffer, &m_noiseBuffer[etxPos+4], m_noiseLength);
                           SetEngineState(ENG_STATE_IDLE);
                           return(TRUE);
                        }
                     }
                  }
               }

            }
         }
         return(TRUE);
         break;
      case ENG_STATE_FINALACK :
         if (m_noiseLength >= 2)
         {
            if (( m_noiseBuffer[0] == ALLENBRADLEY_DLE)&&
                (m_noiseBuffer[1] == ALLENBRADLEY_ACK ))
            {
               // strip these 2 chars
               m_noiseLength-= 2;
               memmove(m_noiseBuffer, &m_noiseBuffer[2], m_noiseLength);
               // determine next state
               SetEngineState(ENG_STATE_IDLE);   //return to idle state
               RSDataMessage("SEND: completed OK:");
               if (m_noiseLength)
               {
                  // process the leftover data/next request in our buffer
                  return(OnProcessData((char*)m_noiseBuffer, 0, discardData));
               }
               return TRUE;
            }
            // NAK
            if (( m_noiseBuffer[0] == ALLENBRADLEY_DLE)&&
                (m_noiseBuffer[1] == ALLENBRADLEY_NAK ))
            {
               m_messageNAKs++;
               if (m_messageNAKs >= AB_MAXIMUM_NAKS)
               {
                  RSDataMessage("Too many NAKs, will abort:");
                  Send(2, txDLE_ENQ, FALSE, NULL);
                  SetEngineState(ENG_STATE_IDLE);   // wait for ACK again
                  m_noiseLength = 0;
                  return TRUE;
               }
               RSDataMessage("NAK, will re-send:");
               SendPLCMessage(m_lastAppBuffer, m_lastAppLength);
               SetEngineState(ENG_STATE_FINALACK);   // wait for ACK again
               m_noiseLength = 0;
               return TRUE;
            }
            // strip the leading char from the noise buffer
            RSDataMessage("Bad device final ACK response, restarting interpreter:");
            SetEngineState(ENG_STATE_IDLE);   //return to idle state
            m_noiseLength = 0;
            return(TRUE);
         }
         //wait for more data
         return(FALSE);
         
         break;
      default:
         return(TRUE);
         break;
   }

   return(TRUE);
}


// ----------------------------- LoadRegisters -----------------------------
// load binary dump of the register values from file.
BOOL CABCommsProcessor::LoadRegisters()
{
CFileException ex;
CFile dat;
LONG area;
DWORD wordIndex;

   if (!dat.Open("ABDATA.DAT", CFile::modeRead|CFile::shareDenyRead, &ex) )
   {
      // complain if an error happened
      // no need to delete the exception object

      TCHAR szError[1024];
      ex.GetErrorMessage(szError, 1024);
      OutputDebugString( "Couldn't open source file: ");
      OutputDebugString( szError);
      
      return FALSE;
   }
   // read it in
   for (area=0;area < MAX_AB_MEMFILES ; area++)
   {
   DWORD numRead,totalRead=0;
   WORD dataWord;
   DWORD maxIndex = PLCMemory[area].GetSize();

      // lock the memory for reading
//      CMemWriteLock lk(pGlobalDialog->m_pMemWriteSync);
      CMemWriteLock  lk(PLCMemory.GetMutex());
      // loop thru all registers (WORD)
      if (!lk.IsLocked())
      {
         for (wordIndex=0; wordIndex < maxIndex/*MAX_MOD_MEMWORDS*/; wordIndex++)
         {
            numRead = dat.Read((BYTE*)&dataWord, sizeof(WORD));
            PLCMemory.SetAt(area, wordIndex, dataWord);
            totalRead +=numRead;
            if (numRead != sizeof(WORD))
               return FALSE;
         }
         // Read past the rest of the block
         while (wordIndex < MAX_MOD_MEMWORDS)
         {
            numRead = dat.Read((BYTE*)&dataWord, sizeof(WORD));
            totalRead +=numRead;
            if (numRead != sizeof(WORD))
               return FALSE;
            wordIndex++;
         }
      }
      else
      {
      CString errorMsg;
         //error
         errorMsg = "an error occured!";//errorMsg.LoadString(IDS_SYNC_READING);
         AfxMessageBox(errorMsg, MB_ICONEXCLAMATION);
         return FALSE;
      }
   }
   return TRUE;
} // LoadRegisters


// --------------------------------------- SaveRegisters ---------------------------
// save a binary dump of the values to file.
BOOL CABCommsProcessor::SaveRegisters()
{
CFileException ex;
CFile dat;
LONG area;
DWORD wordIndex;


   if (!dat.Open("ABDATA.DAT", CFile::modeWrite | CFile::shareExclusive | CFile::modeCreate, &ex) )
   {
      // complain if an error happened
      // no need to delete the ex object

      TCHAR szError[1024];
      ex.GetErrorMessage(szError, 1024);
      OutputDebugString( "Couldn't open source file: ");
      OutputDebugString( szError);
      
      return FALSE;
   }
   // read it in
   for (area=0;area < MAX_AB_MEMFILES; area++)
   {
   WORD wordData;
   DWORD maxIndex = PLCMemory[area].GetSize();
      // lock the memory for writting
      CMemWriteLock lk(PLCMemory.GetMutex());
      // loop thru all registers (WORD)
      if (!lk.IsLocked())
      {
         for (wordIndex=0; wordIndex < maxIndex/*MAX_MOD_MEMWORDS*/; wordIndex++)
         {
            wordData = PLCMemory[area][wordIndex];
            dat.Write((BYTE*)&wordData, sizeof(WORD));
         }
         // Fill the rest with NULLs
         while (wordIndex < maxIndex)
         {
            wordData = 0;
            dat.Write((BYTE*)&wordData, sizeof(WORD));
            wordIndex++;
         }
      }
      else
      {
      CString errorMsg;
         errorMsg = "an error occured!";//.LoadString(IDS_SYNC_WRITTING);
         AfxMessageBox(errorMsg, MB_ICONEXCLAMATION);
         // error
         return FALSE;
      }
   }
   
   return TRUE;
} // SaveRegisters

// ------------------------------------------ TestReceiveMessage -----------------------------
BOOL CABCommsProcessor::TestReceiveMessage()
{
   return(FALSE);
}

// ----------------------------------------- OnMessageReceived -------------------------------
BOOL CABCommsProcessor::OnMessageReceived(BYTE * pAppMessage, DWORD length)
{
   return(FALSE);
}

// --------------------------- RemoveDLE ----------------------------------
LONG CABCommsProcessor::RemoveDLE(const BYTE * buffer, DWORD len, BYTE * destBuff, DWORD *destLen)
{
DWORD dleCount=0;
BYTE *pSource, *pDest;
DWORD i=0;

   pSource = (BYTE*)buffer;
   pDest = destBuff;
   *destLen = len;
   while( i < len)
   {
      if ((*pSource == ALLENBRADLEY_DLE) &&     // Detect first DLE and post inc Ptr
       // check if it's a double
         (pSource[1] == ALLENBRADLEY_DLE))
      { // copy one of the doubled chars only
         pSource++;
         i++;
         if (i < len)
         { // verify this was not the buffer end
            *pDest++ = *pSource++;
            i++;
            dleCount++;
         }
      }
      else
      { // copy char
         *pDest++ = *pSource++;
         i++;
      }
   }   
   // subtract the # of double-DLEs actually removed
   *destLen -= dleCount;
   return(dleCount);
}                                 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产日韩v精品一区二区| 亚洲一区二区三区四区在线观看| 免费视频一区二区| 久久蜜桃av一区精品变态类天堂| 国产欧美日韩在线| 国内精品免费**视频| 亚洲一区二三区| 欧美成人精精品一区二区频| 成人免费视频免费观看| 国产精品麻豆久久久| 玉足女爽爽91| 91免费版pro下载短视频| 男男成人高潮片免费网站| 久久国产尿小便嘘嘘| 亚洲精品va在线观看| 一区二区三区日韩欧美精品| 日本亚洲电影天堂| 成人激情图片网| bt欧美亚洲午夜电影天堂| 欧美日韩一区二区在线观看 | 久久精品水蜜桃av综合天堂| 国产成人自拍网| 一本久道久久综合中文字幕 | 亚洲一区二区av电影| 欧美一级黄色片| 91精品国产福利在线观看| 99久久99精品久久久久久| 一本大道久久a久久精二百| 国产亚洲欧美日韩日本| 国产一区二区三区日韩| 久久久精品影视| 久久久www成人免费无遮挡大片| 日韩一区精品视频| 免费高清视频精品| 日韩亚洲欧美综合| 日产欧产美韩系列久久99| 欧美日本一区二区在线观看| 亚洲国产视频直播| 在线观看日产精品| 国产亚洲精品资源在线26u| 欧美久久久久免费| 国产午夜精品一区二区三区嫩草| 欧美日韩国产经典色站一区二区三区 | 欧美三级电影网站| 777色狠狠一区二区三区| 欧美高清精品3d| 在线精品亚洲一区二区不卡| 国产亚洲欧美色| 欧美一级xxx| 欧美日韩一区不卡| 91.xcao| 国产精品美日韩| 免费在线观看成人| 久久蜜臀中文字幕| 麻豆91精品视频| 亚洲天堂免费在线观看视频| 欧美精品乱码久久久久久| 国产成人自拍高清视频在线免费播放| 国产精品传媒视频| 91久久香蕉国产日韩欧美9色| 国产精品久久久久久妇女6080 | 久久99国内精品| 国产精品亚洲午夜一区二区三区 | av在线不卡网| 91精品国产aⅴ一区二区| 青青草原综合久久大伊人精品优势| 日韩一级欧美一级| 成人久久视频在线观看| 亚洲国产视频直播| 久久综合国产精品| aaa国产一区| 婷婷开心激情综合| 久久久久国产精品人| 色激情天天射综合网| 麻豆91精品91久久久的内涵| 亚洲欧洲99久久| 欧美成人精品1314www| 99久久精品国产导航| 天天综合网天天综合色| 国产精品三级久久久久三级| 欧美日韩一区二区三区四区五区| 激情另类小说区图片区视频区| 国产精品福利在线播放| 日韩视频免费观看高清在线视频| 成人在线综合网| 欧美激情中文不卡| 欧美影视一区二区三区| 理论电影国产精品| 欧美一卡二卡三卡| 丝袜a∨在线一区二区三区不卡| 欧美三级日韩在线| 国产一区二区免费在线| 亚洲一区二区三区在线看| 一区二区在线观看视频 | 欧洲亚洲精品在线| 欧美日韩国产精选| 久久亚洲综合色| 中文字幕亚洲精品在线观看 | 亚洲自拍偷拍图区| 国产成人一级电影| 国产精品美女一区二区在线观看| 成人亚洲一区二区一| 26uuu欧美| 欧美精品自拍偷拍动漫精品| 一区二区视频在线| 欧美久久久久久久久久| 91同城在线观看| 亚洲电影一级黄| 欧美一区二区美女| 在线成人午夜影院| 色综合久久88色综合天天6 | 91成人免费在线视频| 狠狠色综合日日| 亚洲成人激情社区| 亚洲色图色小说| 欧美一级日韩免费不卡| 欧美性色aⅴ视频一区日韩精品| 国产成人综合在线播放| 麻豆精品在线视频| 五月天丁香久久| 亚洲综合偷拍欧美一区色| 亚洲线精品一区二区三区| 亚洲美女区一区| 中文字幕一区二区在线播放 | 日本乱人伦aⅴ精品| a美女胸又www黄视频久久| 激情久久五月天| 国产成人免费视频一区| 精品一区二区三区免费| 美女网站在线免费欧美精品| 免费高清不卡av| 日本不卡一区二区| 美国欧美日韩国产在线播放| 视频一区二区中文字幕| 五月激情综合色| 天堂在线一区二区| 亚洲精品一二三| 经典三级在线一区| 91精品国产品国语在线不卡| 99re在线精品| 不卡电影一区二区三区| 91蝌蚪porny| 91精品麻豆日日躁夜夜躁| 欧美三级日韩在线| 国产欧美一区二区三区在线看蜜臀| 日韩成人dvd| 日本91福利区| 色婷婷久久久综合中文字幕| 99久久精品久久久久久清纯| 国产成人自拍在线| 欧美日韩在线播| 国产精品欧美经典| 日韩av二区在线播放| 日韩一区二区视频| 成人欧美一区二区三区视频网页| 国产成人av一区二区三区在线观看| 久久精品水蜜桃av综合天堂| av中文字幕不卡| 一区二区三区加勒比av| 欧美v国产在线一区二区三区| 国产精品一区二区三区99| 91精品中文字幕一区二区三区| 亚洲激情在线播放| 麻豆91精品视频| 欧美日韩国产高清一区二区| 久久综合狠狠综合久久激情| 久久不见久久见中文字幕免费| 成人污视频在线观看| 欧美片网站yy| 美女脱光内衣内裤视频久久影院| 国产1区2区3区精品美女| 欧美午夜精品一区二区三区| 亚洲丝袜另类动漫二区| 一本久道久久综合中文字幕| 中文字幕一区二区三区精华液 | 日韩制服丝袜先锋影音| 91官网在线免费观看| 久久国产成人午夜av影院| 日韩欧美国产一区在线观看| 色呦呦日韩精品| 日本电影亚洲天堂一区| 91久久免费观看| 99视频有精品| 欧美午夜精品一区二区蜜桃| 色狠狠一区二区三区香蕉| 成人毛片视频在线观看| 麻豆精品在线播放| 在线成人高清不卡| 久久精品国产99| 亚洲猫色日本管| 在线观看欧美日本| 国产美女精品在线| 亚洲国产中文字幕在线视频综合| 91免费观看国产| 亚洲欧洲日韩在线| 91精品一区二区三区久久久久久 | 国产99久久久国产精品潘金| 91蜜桃婷婷狠狠久久综合9色| **性色生活片久久毛片| 制服丝袜亚洲网站|