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

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

?? message.cpp

?? modbus PLC 模擬程序
?? CPP
字號:
/////////////////////////////////////////////////////////////////////////////
//
// 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

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品久久久久久久久图文区| 91社区在线播放| 国内精品写真在线观看| 国产一区二区三区免费在线观看| 国产在线观看免费一区| 99久久国产免费看| 欧美一区二区三区喷汁尤物| 国产日韩精品视频一区| 久久综合五月天婷婷伊人| 欧美日韩三级视频| 国产午夜精品在线观看| 亚洲成人av电影在线| 国产精品99久久久久久宅男| 欧美午夜电影网| 欧美国产一区视频在线观看| 午夜精品久久久久久久久久久| 亚洲国产精品麻豆| 国产成人免费视| 欧美日韩视频第一区| 精品久久久久久综合日本欧美 | 午夜欧美在线一二页| 老司机免费视频一区二区三区| 福利视频网站一区二区三区| 欧美人与z0zoxxxx视频| 欧美日免费三级在线| 国产精品女上位| 亚洲一卡二卡三卡四卡| 国产电影一区在线| 欧美精品乱码久久久久久按摩| 国产欧美综合色| 爽好多水快深点欧美视频| 成人污视频在线观看| 日韩欧美色电影| 亚洲色图视频网| 久久激情综合网| 欧美性色综合网| 中文字幕在线观看一区| 国产综合久久久久影院| 久久www免费人成看片高清| 中文字幕亚洲欧美在线不卡| 国产在线精品一区二区不卡了| 欧美日韩在线电影| 一区二区三区四区在线免费观看| 国产成人精品亚洲777人妖| 色综合视频在线观看| 国产精品久久久久四虎| 国产成人在线视频网站| 亚洲精品一区二区三区精华液| 日韩国产一区二| 欧美日韩中文另类| 亚洲高清免费观看高清完整版在线观看 | 国产一区三区三区| 日韩一级欧美一级| 蜜桃精品在线观看| 欧美xxxx老人做受| 国产麻豆欧美日韩一区| 欧美精品一区二区久久久| 久久99久久99精品免视看婷婷| 欧美不卡在线视频| 国产一区欧美二区| 久久久99久久| 黄色日韩网站视频| 在线综合+亚洲+欧美中文字幕| 日韩影院免费视频| 日韩美一区二区三区| 丝袜亚洲另类丝袜在线| 91精品视频网| 狠狠色丁香久久婷婷综合丁香| 精品美女一区二区三区| 国产精品综合视频| 日本一区二区视频在线| 99re这里只有精品6| 尤物在线观看一区| 欧美人妇做爰xxxⅹ性高电影| 一区二区三区免费看视频| 91免费版在线看| 日韩成人免费看| 精品对白一区国产伦| 成人激情图片网| 自拍偷在线精品自拍偷无码专区 | 精品国产91乱码一区二区三区| 国产在线观看一区二区| 国产精品高清亚洲| 精品视频在线看| 精品亚洲成a人| 欧美国产日产图区| 91国偷自产一区二区三区成为亚洲经典| 中文乱码免费一区二区| 欧美三区在线视频| 国产成人99久久亚洲综合精品| 亚洲免费在线观看| 欧美一区二区三区免费视频| 风间由美一区二区三区在线观看 | 日韩女优视频免费观看| av动漫一区二区| 日韩中文字幕亚洲一区二区va在线| 亚洲精品一线二线三线| 色猫猫国产区一区二在线视频| 青椒成人免费视频| 伊人色综合久久天天人手人婷| 欧美一级xxx| 91麻豆精品秘密| 国产一区二区三区在线观看精品| 一区二区久久久久| 中文字幕第一区第二区| 欧美一区二区三区在| 色欲综合视频天天天| 国产1区2区3区精品美女| 亚洲私人影院在线观看| 精品国精品国产| 欧美区一区二区三区| 91性感美女视频| 国产精品综合一区二区| 亚洲福利一区二区| 日韩天堂在线观看| 在线不卡欧美精品一区二区三区| 国产精品18久久久久久久久| 免费观看成人av| 亚洲图片欧美视频| 日韩免费视频线观看| 91精品国产一区二区| 欧美猛男超大videosgay| 在线精品国精品国产尤物884a| 国产成a人无v码亚洲福利| 日韩中文字幕区一区有砖一区| 亚洲欧美精品午睡沙发| 国产欧美视频一区二区| 日韩一区二区在线看片| 在线一区二区观看| 风间由美一区二区三区在线观看 | 一区二区三区电影在线播| 久久久www成人免费无遮挡大片 | 亚洲午夜激情av| 精品国产99国产精品| 91丝袜美女网| 成人高清免费观看| 国产精品久久久久一区 | 国产91对白在线观看九色| 亚洲日本青草视频在线怡红院| 欧美大片在线观看| 日韩一级欧美一级| 欧美日韩一级片网站| 欧美日韩日本视频| 亚洲综合在线观看视频| 樱桃视频在线观看一区| 天天免费综合色| 国产乱人伦偷精品视频不卡 | 欧美性视频一区二区三区| 欧美日韩国产一级| 久久久久久久久久久久电影| 国产精品欧美一区二区三区| 亚洲精品久久嫩草网站秘色| 日韩高清国产一区在线| 国产激情视频一区二区三区欧美 | 成人h版在线观看| 欧美三片在线视频观看| 欧美成人性战久久| 中文字幕成人在线观看| 三级久久三级久久| 国产91精品入口| 欧美一区二区三区系列电影| 久久久精品国产免费观看同学| 依依成人精品视频| 国产不卡在线视频| 91精品国产一区二区| 中文字幕在线一区免费| 久久福利视频一区二区| 欧洲一区二区三区免费视频| 欧美成人官网二区| 亚洲成人综合在线| 99视频国产精品| 久久奇米777| 免费视频一区二区| 欧美亚州韩日在线看免费版国语版| 日韩精品一区二区三区在线观看| 中文幕一区二区三区久久蜜桃| 蜜臀av亚洲一区中文字幕| 日本道精品一区二区三区| 国产亚洲视频系列| 久久66热偷产精品| 欧美美女视频在线观看| 国产精品毛片a∨一区二区三区| 日本不卡高清视频| 欧美性色aⅴ视频一区日韩精品| 国产亚洲人成网站| 国产精一品亚洲二区在线视频| 91精品国产欧美一区二区| 一区二区三区.www| 一本色道久久综合亚洲精品按摩| 91麻豆123| av午夜一区麻豆| 波多野结衣精品在线| 99在线精品视频| 中文字幕在线观看不卡| 国产一区二区日韩精品| 日韩女同互慰一区二区| 麻豆一区二区三| 91精品国产综合久久久久久久 | 日韩亚洲欧美在线| 亚洲免费毛片网站|