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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? message.cpp

?? 用于開(kāi)發(fā)Modbus工業(yè)級(jí)通信
?? CPP
字號(hào):
/////////////////////////////////////////////////////////////////////////////
//
// FILE: Message.cpp : file
//
//
/////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "mod_rssimDlg.h"
#include "abcommsprocessor.h"
#include "message.h"

// English meanings for Allen-Bradley (Exception) error codes
PCHAR plcErrorLocal[9] =     // local STS (low nibble)
{
   "No error",                            // 0x0
   "DST node out of buffer space",        // 0x1
   "Cannot guarantee delivery",           // 0x2
   "Duplicate token holder detected",     // 0x3
   "Local port is disconnected",          // 0x4
   "Application layer timed out waiting for response",             // 0x5
   "Duplicate node detected",             // 0x6
   "Station is offline",                  // 0x7
   "Hardware fault"                       // 0x8
};  

PCHAR plcErrorRemote[16] =     // remote STS (high nibble)
{
   "No error",                               // 0x00
   "Illegal command or format",              // 0x10
   "Host has a problem and will not comm.",                       // 0x20
   "Remote node host is missing,",                                // 0x30
   "Host could not complete function due to h/w fault",           // 0x40
   "Addressing problem or memory protect rungs",                  // 0x50
   "Function not allowed due to command protection selection",    // 0x60
   "Processor is in program mode",                                // 0x70
   "Compatibility mode file missing or comm. zone problem",       // 0x80
   "Remote node cannot buffer command",              // 0x90
   "xxxx",              // 0xA0
   "Remote node problem due to download",              // 0xB0
   "xxxx",              // 0xC0
   "unused",              // 0xD0
   "unused",              // 0xE0
   "Error code is in EXT-STS"              // 0xF0
};  


// Global - Global data
BYTE txDLE_STX[SIZEOF_TAIL] =
{
   ALLENBRADLEY_DLE,
   ALLENBRADLEY_STX
};

BYTE txDLE_ACK[SIZEOF_TAIL] =
{
   ALLENBRADLEY_DLE,
   ALLENBRADLEY_ACK
};

BYTE txDLE_NAK[SIZEOF_TAIL] =
{
   ALLENBRADLEY_DLE,
   ALLENBRADLEY_NAK
};

BYTE txDLE_ETX[SIZEOF_TAIL] =
{
   ALLENBRADLEY_DLE,
   ALLENBRADLEY_ETX
};

BYTE txDLE_ENQ[SIZEOF_TAIL] =
{
   ALLENBRADLEY_DLE,
   ALLENBRADLEY_ENQ
};

// -------------------------------- CalcBCC ----------------------------
// Calculate Allen-Bradley specified BCC code
// the BCC is a 2'scomp sum of all bytes in the message frame excluding DLE-STX and DLE-ETX
BYTE CalcBCC(BYTE * lrcBuffPtr,    //  -> pointer to buffer at start of BCC
             DWORD  buffLen        //  -> 
            )
{
BYTE bcc=0;

   CalcLRC(lrcBuffPtr,    //  -> pointer to buffer at start of LRC
           buffLen,       //  -> 
           FALSE,     //  -> Calc 2's Compliment also (last call)
           &bcc            // <-> 
            );
   bcc = 256-bcc;
   return(bcc);
} // CalcBCC


/////////////////////////////////////////////////////////////////////////////////
// CProtocolMessage implementation
/////////////////////////////////////////////////////////////////////////////////
CProtocolMessage::CProtocolMessage(const BYTE * pMessageRX, DWORD len)
{

}
CProtocolMessage::CProtocolMessage(const CProtocolMessage & oldProtMessage)
{ //copy constructor

}



/////////////////////////////////////////////////////////////////////////////////
// CABMessage implementation
/////////////////////////////////////////////////////////////////////////////////


// ----------------------- constructor -----------------------------------
CABMessage::CABMessage(const BYTE * pMessageRX, DWORD len, BOOL dataLayer) 
      : CProtocolMessage(pMessageRX, len)
{
BYTE *crcStartPtr = (BYTE*)pMessageRX;
WORD  crc = 0;
BYTE bcc;
WORD *crcPtr;
WORD *bccPtr;
DWORD appStartOffset = 2; // data layer telegram
DWORD addressWidth, elementWidth;

   transactionID = -1;
   transmissionStatus = 0;
   transmissionStatusEXT = 0;
   if (!dataLayer)
   {
      appStartOffset=0; // this is an app layer telegram
      len+=2;
   }
   ASSERT(len > 2);
   ASSERT(len < sizeof(buffer)); 
   memset(buffer, 0xCD, sizeof(buffer));
   memcpy(&buffer[2], &pMessageRX[appStartOffset], len);

   // double DLE stripping here
   if (dataLayer)
      StripDLEs(buffer, &len);
   totalLen = (WORD)len;

   // at this point we have a data layer message
   crcCheckedOK = FALSE;

   // break down the msg
   count = 0;
   if ((len>2) && (dataLayer))
   {
      if (buffer[0] != ALLENBRADLEY_DLE)
         return;
      if ((buffer[1] != ALLENBRADLEY_SOH )&&
          (buffer[1] != ALLENBRADLEY_STX )&&
          (buffer[1] != ALLENBRADLEY_ACK )&&
          (buffer[1] != ALLENBRADLEY_NAK )&&
          (buffer[1] != ALLENBRADLEY_ENQ )
         )
         return;
      // we seem to have the beginning of the message, parse it
   }
   if (len > 3)
   {
      stationIDDest = (BYTE)buffer[AB_SOURCEBYTEOFF];          // Dest addr
      stationIDSource = (BYTE)buffer[AB_DESTINATIONBYTEOFF];   // Source addr
   }
   if (len >4)
      command = buffer[AB_COMMANDBYTEOFF];       // may be 0x0F other values are not processed
   if (len >5)
      transmissionStatus = buffer[AB_STATUSBYTEOFF];
   if (len >=7)
   {
      transactionID = (buffer[6]) + (buffer[7]<<8);
   }
   if (len >8)
      functionCode = buffer[8];
   if (len > 9)
      count = (BYTE)buffer[9];   // # bytes to be read (/2 to get integers)
   if (len > 10)
      fileNum = (BYTE)buffer[10];
   if (len >11)
      fileType = (BYTE)buffer[11];
   addressWidth = 1;
   elementWidth = 1;
   if (len >12)
   {
      address = (BYTE)buffer[12];
      if (address == 0xFF)
      {
         addressWidth=3;
         address = buffer[12+1] + (buffer[13+1]<<8);
         address = SwapBytes(address);
      }
   }
   if (len >=(13+addressWidth))   // 14
   {
      subElement = buffer[12+addressWidth];
      if (subElement == 0xFF)
      {
         elementWidth=3;
         subElement = buffer[12+addressWidth+1] + (buffer[13+addressWidth+1]<<8);
         subElement = SwapBytes(subElement);
      }

   }
   if (len >=(13+addressWidth+elementWidth))  // 15
      dataPtr = (BYTE*)&buffer[12+addressWidth+elementWidth];

   if (dataLayer) // app messages will not have a CRC byte anyway
   {
      //check the CRC at this point
      if (pGlobalDialog->m_useBCC)
      {
         if (len >= 17)
         {
            bccPtr = (WORD*)&buffer[totalLen-1];//count + 16];
            crcStartPtr = (BYTE*)&buffer[2];

            bcc = CalcBCC(crcStartPtr, totalLen-6);      // Only one buffer to calc crc of
            overalLen = count+16 + AB_BCC_LEN;
            crcCheckedOK = (bcc==*bccPtr);
         }
      }
      else
      {
         if (len >= 18)
         {
         CHAR ETXBuff[2];
            crcPtr = (WORD*)&buffer[totalLen-2];//count + 16];
            crcStartPtr = (BYTE*)&buffer[2];

            crc = 0x0;
            CalcCRC(crcStartPtr, totalLen-6, &crc);      // Only one buffer to calc crc of
            ETXBuff[0] = 0x03;
            CalcCRC((BYTE*)&ETXBuff[0], 1, &crc);      // include the ETX
            overalLen = count+16 + AB_CRC_LEN;
            crcCheckedOK = (crc==*crcPtr);
         }
      }
   }

   if (!crcCheckedOK)
      return;
   else
   {
      crc = 0xffff;
   }
} // CABMessage

// --------------------------- CABMessage --------------------------
// PURPOSE: copy constructor used to build responses, does not actually 
// copy the message.
CABMessage::CABMessage(const CABMessage & oldABMessage) 
    : CProtocolMessage(oldABMessage)
{
      memset(buffer, 0xCD, sizeof(buffer));
      //Copy in common stuff from both messages here!
      m_localStationID = oldABMessage.m_localStationID;
      stationIDSource    = oldABMessage.stationIDSource;
      stationIDDest    = oldABMessage.stationIDDest;
      functionCode = oldABMessage.functionCode;
      fileType = oldABMessage.fileType;
      address = oldABMessage.address;       // where to copy data from
      byteCount = oldABMessage.byteCount;   // length of data to copy
      
      overalLen = 0;   //New message so 0 for now!
      
      dataPtr = (BYTE*)buffer; //Nice a fresh pointer to the beginning!
}

// ------------------------- CalculateReadAheadLength -------------------------
// static function
WORD CABMessage::CalculateReadAheadLength(const BYTE*pBuffer, DWORD length)
{
   //if (length < 2)
   //   return(2);  // DLE ACK/NAK or DLE/STX in our case
   // look at the rest of the telegram
   return(1);
} // CalculateReadAheadLength

// -------------------------------- Status ----------------------------
// static function
BOOL CABMessage::Status(const BYTE*pBuffer, DWORD length)
{
   if (length >6)
      return(pBuffer[5]);  // STS byte

   return(FALSE);
} // CalculateReadAheadLength

// ------------------------------- GetValue -------------------------
//
WORD CABMessage::GetValue(WORD wIndex)
{
WORD *pData = (WORD*)dataPtr;
   pData+=wIndex;
   return(*pData);
}

// ------------------------------- StripDLEs ------------------------
LONG CProtocolMessage::StripDLEs(CHAR *bufferPtr, DWORD *numBytes)
{
char *pSourceData= bufferPtr;
char *pDestData = bufferPtr;
BOOL stripDLE = FALSE;
int count = *numBytes;
int bytesXferred=0;
int dleCount = 0;
   //if (*numBytes <= 20)
      return(0);
   while (count>0)
   {
      if (*pSourceData == 0x10)  // if current byte is a DLE
         stripDLE = TRUE;        // flag that byte was a DLE
      else
         stripDLE = FALSE;
      // copy current byte
      *pDestData++ = *pSourceData++;
      bytesXferred++;

      if ((stripDLE)&&(*pSourceData == 0x10))
      {
         *pSourceData++;   // skip the byte and clear the flag
         dleCount++;
         count--;
         stripDLE = FALSE;
      }
      count--;
   }
   *numBytes = bytesXferred;
   return(dleCount);
}


// ------------------------------ BuildMessagePreamble -------------------------
// PURPOSE: Builds the STN,FN and LEN bytes of the telegram.
// on completion dataPtr pointsto where the data must be packed in (if any)
CHAR * CABMessage::BuildMessagePreamble(BOOL error, WORD errorCode)
{
WORD  crc = 0;
WORD  dataLength=6;

   // swap the station IDs
   buffer[2] = stationIDSource;
   buffer[3] = stationIDDest;
   //
   buffer[AB_COMMANDBYTEOFF] |= 0x40;    // CMD byte
   buffer[5] = (BYTE)errorCode; // STS byte
   if (error)
   {
      buffer[8] = (BYTE)(errorCode>>8); //EXT-STS
      dataLength++;
   }
   // byte 6 & 7 contain the sender's TNS value
   byteCount = 0;
   totalLen = dataLength + 6;//13;  6+6=12 bytes

   return(buffer);
} // BuildMessagePreamble

  /*
// ------------------------------ BuildMessageEnd -------------------------------
// PURPOSE: glue a CRC onto the end of the message
// totalLen must be = the full telegram length (+CRC) when this is called.
CHAR * CABMessage::BuildMessageEnd()
{
WORD length;
BYTE *pCrcStart = (BYTE*)buffer;
WORD crc = 0xFFFF;
BYTE *crcPtr;

   // Add the CRC bytes
   length = totalLen - AB_CRC_LEN; //calc the CRC of all bytes but the 2 CRC bytes

   CalcCRC(pCrcStart, length, &crc);
   crcPtr = (BYTE*)&buffer[length];
   *(WORD *)crcPtr = crc;

   return (buffer);
} // BuildMessageEnd
*/

// ------------------------------ GetAddressArea --------------------
// Returns:    A supported MEM area index for any MOD address class
// Parameter:  A modbus command (e.g. 3 =read holding register)
//
WORD CABMessage::GetAddressArea(WORD classCode //  modbus command byte
                                )
{
   /*
   switch(classCode)
   {
      // read commands 
      case MOD_READ_COILS     : return(0); break;
      case MOD_READ_DIGITALS  : return(1); break;
      case MOD_READ_REGISTERS : return(2); break;   
      case MOD_READ_HOLDING   : return(3); break;
      case MOD_READ_EXTENDED  : return(4); break;
      // write commands      
      case MOD_WRITE_HOLDING        : return(3); break;
      case MOD_WRITE_SINGLEHOLDING  : return(3); break;
      case MOD_WRITE_SINGLE_COIL    : return(0); break;
      case MOD_WRITE_MULTIPLE_COILS : return(0); break;
      case MOD_WRITE_EXTENDED       : return(4); break;
   }
   */
   return(3); //Default here for now, Should never get here anyways!

} // GetAddressArea

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美电影免费观看高清完整版在线观看| 91丨九色丨黑人外教| 亚洲国产日韩一区二区| 亚洲精品一线二线三线 | 亚洲乱码日产精品bd| 欧美日韩国产另类一区| 国内不卡的二区三区中文字幕 | 99精品久久99久久久久| 久久精品国产秦先生| 中文字幕中文乱码欧美一区二区| 欧美午夜寂寞影院| 成人手机电影网| 全国精品久久少妇| 国产精品国产三级国产aⅴ无密码| 51精品秘密在线观看| av在线不卡观看免费观看| 国产精品系列在线播放| 麻豆成人综合网| 日韩制服丝袜先锋影音| 亚洲一区二区三区视频在线播放 | 欧美日韩精品一区二区天天拍小说| av在线不卡观看免费观看| 国产精品羞羞答答xxdd| 麻豆成人av在线| 国产一区二区毛片| 成人在线一区二区三区| 国产成人夜色高潮福利影视| 久久99精品久久只有精品| 天天综合色天天综合色h| 亚洲成人777| 久久精品噜噜噜成人88aⅴ| 污片在线观看一区二区| 国产精品国产三级国产aⅴ无密码| 1024精品合集| 一区二区三区在线视频免费观看| 国产精品护士白丝一区av| 日韩理论片在线| 香蕉加勒比综合久久| 美女视频一区二区三区| 国产精一区二区三区| 高清免费成人av| 欧美日韩在线观看一区二区 | 玉足女爽爽91| 亚洲国产日韩a在线播放性色| 日本成人在线电影网| 久久99久久99小草精品免视看| 国产永久精品大片wwwapp| 国产精品一区二区无线| 91老师国产黑色丝袜在线| 精品视频免费在线| 久久一区二区三区四区| 亚洲免费观看视频| 日韩精品视频网站| 亚洲欧洲精品天堂一级| 一区二区三区欧美视频| 国产高清精品网站| 欧美人与z0zoxxxx视频| 亚洲欧美日韩成人高清在线一区| 日本不卡中文字幕| 色婷婷久久99综合精品jk白丝| 日韩免费一区二区| 亚洲制服丝袜av| 94-欧美-setu| 国产精品五月天| 国产成人在线视频网址| 欧美日韩精品三区| 国产精品福利一区二区| 国产成人免费视| 久久一日本道色综合| 日韩1区2区3区| 国产一区欧美一区| 欧美日韩在线免费视频| 国产精品美女一区二区三区| 精品一区二区免费看| 日韩欧美国产不卡| 激情久久五月天| 2019国产精品| 激情都市一区二区| 久久综合色婷婷| 五月激情六月综合| 欧美精品日韩精品| 五月天亚洲婷婷| 欧美日本不卡视频| 免费看黄色91| 亚洲精品一区二区三区影院 | 欧美主播一区二区三区美女| 亚洲一区二区三区精品在线| 欧美性色黄大片手机版| 麻豆精品蜜桃视频网站| 国产精品久久久久aaaa| 色婷婷激情综合| 一区二区三区四区在线播放 | 中文字幕一区二区三区av| 91最新地址在线播放| 亚洲乱码精品一二三四区日韩在线| 99久久久免费精品国产一区二区| 最新国产精品久久精品| 91小视频在线观看| 免费看黄色91| 亚洲图片有声小说| 国产精品大尺度| 欧美男同性恋视频网站| 国产精选一区二区三区| 亚洲精品国产品国语在线app| 欧美亚洲动漫精品| 成人美女视频在线观看18| 麻豆国产欧美日韩综合精品二区| 一区二区三区在线视频免费| 久久男人中文字幕资源站| 91美女视频网站| 狠狠色丁香久久婷婷综合丁香| 国产嫩草影院久久久久| 色狠狠一区二区三区香蕉| 国产不卡在线一区| 美女国产一区二区| 亚洲h在线观看| 国产精品色一区二区三区| 日韩欧美自拍偷拍| 欧美精品一二三区| 精品视频在线视频| 777奇米四色成人影色区| 欧美三级日韩三级国产三级| av网站一区二区三区| 成人精品鲁一区一区二区| 国产在线日韩欧美| 国产二区国产一区在线观看| 成人福利在线看| av激情亚洲男人天堂| 成人免费黄色大片| 国产91露脸合集magnet| 风间由美中文字幕在线看视频国产欧美| 国产成人h网站| 色女孩综合影院| 7777女厕盗摄久久久| 日韩一区二区三区在线视频| 337p亚洲精品色噜噜狠狠| 欧美成人高清电影在线| 国产日产欧美一区二区三区| 亚洲国产成人在线| 亚洲午夜精品一区二区三区他趣| 香蕉影视欧美成人| 久久91精品国产91久久小草| 国产老妇另类xxxxx| 欧美在线免费观看亚洲| 久久九九国产精品| 亚洲精品菠萝久久久久久久| 午夜精品在线视频一区| 国产麻豆视频一区| 欧美日韩综合在线| 日本一区二区三区久久久久久久久不| 国产精品久久久久久久久果冻传媒| 日韩中文字幕麻豆| 国产精品亚洲一区二区三区在线| 97久久精品人人做人人爽50路| 精品国内片67194| 亚洲国产精品一区二区www在线 | 国产日韩欧美亚洲| 亚洲高清久久久| 国产久卡久卡久卡久卡视频精品| 91久久精品日日躁夜夜躁欧美| 久久理论电影网| 秋霞午夜av一区二区三区| 粉嫩嫩av羞羞动漫久久久 | 久久精品人人爽人人爽| 亚洲国产美女搞黄色| 成人三级伦理片| 国产香蕉久久精品综合网| 麻豆视频观看网址久久| 欧美一级片在线观看| 亚洲国产视频在线| 色香蕉久久蜜桃| 自拍视频在线观看一区二区| 不卡av在线网| 亚洲激情在线播放| 91毛片在线观看| 亚洲婷婷综合色高清在线| 处破女av一区二区| 中文字幕日韩精品一区| 91蝌蚪porny| 亚洲午夜羞羞片| 在线影院国内精品| 亚洲精品免费播放| 日本二三区不卡| 亚洲一区二区欧美日韩| 色婷婷精品大视频在线蜜桃视频| 亚洲宅男天堂在线观看无病毒| 色婷婷精品大视频在线蜜桃视频| 亚洲一区在线视频| 欧美亚洲综合另类| 日本不卡一区二区| 国产欧美日韩在线观看| 9l国产精品久久久久麻豆| 一区二区三区影院| 日韩午夜在线播放| 国产91精品一区二区| 午夜影院在线观看欧美| 欧美xxxxx裸体时装秀| 高清国产午夜精品久久久久久| 一级做a爱片久久| 久久日韩精品一区二区五区|