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

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

?? plcapplication.cpp

?? mod_RSsim
?? CPP
字號:
/////////////////////////////////////////////////////////////////////////////
//
// FILE: PLCApplication.cpp : implementation file
//
// See "_README.CPP"
//                    
// implementation of the CPLCApplication class.
//
/////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "message.h"
#include "ABCommsProcessor.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif


//////////////////////////////////////////////////////////////////////
// CPLCApplication IMPLEMENTATION
//
IMPLEMENT_DYNAMIC( CPLCApplication, CABCommsProcessor);

CPLCApplication::CPLCApplication(LPCTSTR portNameShort, 
                                     DWORD  baud, 
                                     DWORD byteSize, 
                                     DWORD parity, 
                                     DWORD stopBits,
                                     DWORD rts,
                                     int   responseDelay,
                                     BOOL  MOSCADchecks,
                                     BOOL modifyThenRespond,
                                     BOOL disableWrites,
									 BOOL bcc
                                     ) 
   : CABCommsProcessor(portNameShort,
                       baud,        
                       byteSize,     
                       parity,       
                       stopBits,     
                       rts,          
                       responseDelay,
					   bcc
                       )
{
   m_TNS = 0;
}

// ------------------------------- SendPLCMessage --------------------------------------
// pAppLayerMsg = buffer pointig to start of the app layer (stationID)
// length = length of the app layer only (before DLE expansion)
//
BOOL CPLCApplication::SendPLCMessage(const BYTE* pAppLayerMsg, DWORD length)  // if False, then re-send
{
   // call base class
   return(CABCommsProcessor::SendPLCMessage(pAppLayerMsg, length));
}

// ----------------------------- SendPLCBlock -------------------------------------
BOOL CPLCApplication::FetchPLCBlock(BYTE sourceStationID, 
                     BYTE destStationID, 
                     WORD TNS, 
                     WORD fileNum,
                     WORD startRegister,
                     WORD numRegisters)
{
CString info;
BYTE appMessage[MAX_AB_MESSAGELEN];
BYTE *pHeadderPtr;         // work pointer in the headder
DWORD lengthAppMsg=0;
BOOL sendOK;

   // Do BASIC range checking
   if (numRegisters>234)
      return(FALSE);

   info.Format("MASTER- Initiate %02X to %02X, READ file %d, registers %d to %d (trans=%04X)",
               sourceStationID, destStationID,
               fileNum, startRegister, startRegister+ numRegisters, TNS);
   RSDataMessage(info);


   appMessage[AB_SOURCEBYTEOFF] = sourceStationID;
   appMessage[AB_DESTINATIONBYTEOFF] = destStationID;
   appMessage[AB_COMMANDBYTEOFF] = ALLENBRADLEY_SLC_CMD; // 0x0F
   appMessage[AB_STATUSBYTEOFF] = AB_STS_NOERROR;        // 0x00
   *(WORD*)&appMessage[AB_TNSBYTEOFF] = TNS;
   appMessage[AB_FUNCBYTEOFF] = ALLENBRADLEY_WORD_READ;  // 0xA2

      // build the rest of the headder
   pHeadderPtr = &appMessage[AB_FUNCBYTEOFF+1];
   *pHeadderPtr++ = 2*numRegisters;   // # bytes to send in the frame
   *pHeadderPtr = (BYTE)fileNum;
   if (fileNum > 254)
   {
      *pHeadderPtr++ = 0xFF;
      *(WORD*)pHeadderPtr = fileNum;
      pHeadderPtr++;
   }
   pHeadderPtr++;
   *pHeadderPtr++ = 0x89;  // always INTEGER file
   // element#
   *pHeadderPtr = (BYTE)startRegister;
   if (startRegister > 254)
   {
      *pHeadderPtr++ = 0xFF;
      *(WORD*)pHeadderPtr = startRegister;
      pHeadderPtr++;
   }
   pHeadderPtr++;
   // sub-element is always 0
   *pHeadderPtr++ = 0x00;

   lengthAppMsg = (LONG)pHeadderPtr - (LONG)appMessage; // message pre-amble including STX
   //
   lengthAppMsg -= 2; // substract the STX

   sendOK = SendPLCMessage(&appMessage[2], lengthAppMsg);
   // await the response ACK and frame
   m_masterWaiting = TRUE;
   SetEngineState(ENG_STATE_RECEIVE);  // await a read-response
   return(sendOK);
}


// ----------------------------- SendPLCBlock -------------------------------------
BOOL CPLCApplication::SendPLCBlock(BYTE sourceStationID, 
                     BYTE destStationID, 
                     WORD TNS, 
                     WORD fileNum,
                     WORD startRegister,
                     WORD numRegisters)
{
BYTE appMessage[MAX_AB_MESSAGELEN];
DWORD lengthAppMsg=0;
BYTE *pHeadderPtr;   // work pointer in the headder
WORD *pwDataStart;
CString info;
BOOL sendOK;


   // Do BASIC range checking
   if (numRegisters>234)
      return(FALSE);

   // initiate a WRITE message to the required PLC, pack in the data and TNS field specified
   // use SendPLCMessage() to fire it off, then we will just wait for and do nothing with the response in
   // OnMessageReceived() which fires once the PLC responds to us.
   info.Format("MASTER- initiate %02X to %02X, SEND file %d, registers %d to %d (trans=%04X)",
               sourceStationID, destStationID,
               fileNum, startRegister, startRegister+ numRegisters, TNS);
   RSDataMessage(info);

   //
   appMessage[AB_SOURCEBYTEOFF] = sourceStationID;
   appMessage[AB_DESTINATIONBYTEOFF] = destStationID;
   appMessage[AB_COMMANDBYTEOFF] = ALLENBRADLEY_SLC_CMD; // 0x0F
   appMessage[AB_STATUSBYTEOFF] = AB_STS_NOERROR;        // 0x00
   *(WORD*)&appMessage[AB_TNSBYTEOFF] = TNS;
   appMessage[AB_FUNCBYTEOFF] = ALLENBRADLEY_WORD_WRITE; // 0xAA
   
   // build the rest of the headder
   pHeadderPtr = &appMessage[AB_FUNCBYTEOFF+1];
   *pHeadderPtr++ = 2*numRegisters;   // # bytes to send in the frame
   *pHeadderPtr = (BYTE)fileNum;
   if (fileNum > 254)
   {
      *pHeadderPtr++ = 0xFF;
      *(WORD*)pHeadderPtr = fileNum;
      pHeadderPtr++;
   }
   pHeadderPtr++;
   *pHeadderPtr++ = 0x89;  // always INTEGER file
   // element#
   *pHeadderPtr = (BYTE)startRegister;
   if (startRegister > 254)
   {
      *pHeadderPtr++ = 0xFF;
      *(WORD*)pHeadderPtr = startRegister;
      pHeadderPtr++;
   }
   pHeadderPtr++;
   // sub-element is always 0
   *pHeadderPtr++ = 0x00;

   // pack in the data
   pwDataStart = (WORD*)(pHeadderPtr);
   for (int i=0; i < numRegisters; i++)
   {
      *pwDataStart++ = PLCMemory[fileNum].GetAt(startRegister + i);
   }

   lengthAppMsg = (LONG)pHeadderPtr - (LONG)appMessage; // message pre-amble including STX
   lengthAppMsg += (2*numRegisters);
   //lengthAppMsg+= 4;  // Add in message-end framing : ETX and CRC fields
   lengthAppMsg -= 2; // substract the STX

   sendOK = SendPLCMessage(&appMessage[2], lengthAppMsg);
   // await the response ACK and frame
   m_masterWaiting = TRUE;
   SetEngineState(ENG_STATE_FINALACK);
   return(sendOK);
   
}


// ------------------------- OnMessageReceived ---------------------------------
// return false to reject the message
BOOL CPLCApplication::OnMessageReceived(BYTE* pAppLayerMsg, DWORD length)
{
BYTE appMessage[MAX_AB_MESSAGELEN];
DWORD lengthAppMsg=0;
BYTE  commandCode;

   CABMessage msg(pAppLayerMsg, length, FALSE);
   commandCode = msg.command;
   if ((commandCode & 0x40)==0x40)  // handle command responses for MASTER mode
   {
   CString debugMess;
      // this is a response frame, since the CPU layer already ACKed it before passing it here
      // we are done with it unless it is an error message frame
      if (msg.transmissionStatus)
      {
         debugMess.Format("MASTER : Message %04X delivered with STS error:\n", msg.transactionID);
         return(FALSE); // re-send frame
      }
      debugMess.Format("MASTER : Message %04X delivered OK:\n", msg.transactionID);
      RSDataMessage(debugMess);
      SetEngineState(ENG_STATE_MASTERIDLE);
      return(TRUE);
   }

   // simulate the I/O and network delays of a real PLC
   Sleep(m_responseDelay);
   if (pGlobalDialog->StationEnabled(msg.stationIDDest))
   {
      // build up a response
      BuildResponse(pAppLayerMsg, length, appMessage, &lengthAppMsg);

      SendPLCMessage(appMessage, lengthAppMsg);
      RSDataMessage("Await response ACK:");
      SetEngineState(ENG_STATE_FINALACK); //and then wait for the ack
   
      return(TRUE);
   }
   // station not listening
   SetEngineState(ENG_STATE_IDLE); //and then wait for the ack
   return(FALSE);
}

// --------------------------- BuildResponse ----------------------------------
void CPLCApplication::BuildResponse(const BYTE *inBuffer, DWORD inLength, 
                                    BYTE *buffer, DWORD *length)
{
CString diagnoseMsg;
char * dataPtr = NULL;
BOOL  ABError = TRUE;
WORD  ABErrorCode = 0;

   CABMessage msg(inBuffer, inLength, FALSE);

   RSDataMessage("Building Response Frame:");
   // determine if the request was valid
   if (AB_COMMAND_DRIVER == msg.command)
   {
      switch (msg.functionCode)
      {
         case (AB_FUNC_WRITE3 | 0x40):   // MASTER mode
            RSDataMessage("Write response received:");
            msg.count =0; // there no data in the response frame

            break;
         case AB_FUNC_WRITE3:  // SLAVE
            // build response
            {
            LONG dataStartOff=14;
               if (msg.fileNum >254)
                  dataStartOff+=2;     // 3-byte field was used
               if (msg.address >254)
                  dataStartOff+=2;

               msg.BuildMessagePreamble();
               dataPtr = &msg.buffer[dataStartOff];
               for (int i=0; i < msg.count/2; i++)
               {
               //CMemWriteLock  lk(PLCMemory.GetMutex());
                  diagnoseMsg.Format("Set File %d:%d = %d\n", msg.fileNum, msg.address + i, *(WORD*)dataPtr);
                  //RSDataMessage(diagnoseMsg);
                  PLCMemory[msg.fileNum].SetAt(msg.address + i, *(WORD*)dataPtr, PLCMemory.GetMutex());
                  dataPtr +=2;
               }
               ABError = FALSE;
               if (pGlobalDialog)
               {
                   int cols = pGlobalDialog->GetListDisplayedWidth();
                   pGlobalDialog->RedrawListItems(msg.fileNum, 
                                                  msg.address/(cols), 
                                                  (msg.address+((msg.count/2)-1))/(cols)
                                                 ); // repaint only the needed rows
               }

               RSDataMessage("Write processed OK:");
               msg.count =0; // there no data in the response frame
            }
            break;
         case AB_FUNC_READ3:   // SLAVE
            // build response
            {
            DWORD linePos=0;

               msg.BuildMessagePreamble();
               dataPtr = &msg.buffer[8];
               diagnoseMsg.Format("Get File %3d:%3d\n", msg.fileNum, msg.address);
               //RSDataMessage(diagnoseMsg);

               for (int i=0; i < msg.count/2; i++)
               {
               CMemWriteLock  lk(PLCMemory.GetMutex());
                  
                  diagnoseMsg.Format("%3d = x%04X |", msg.address + i, PLCMemory[msg.fileNum].GetAt(msg.address+i));
                  linePos+= diagnoseMsg.GetLength();
                  if (linePos > 79)
                  {
                     //RSDataMessage("\n");
                     linePos = diagnoseMsg.GetLength();
                  }
                  //RSDataMessage(diagnoseMsg);
                  *(WORD*)dataPtr = PLCMemory[msg.fileNum].GetAt(msg.address+i);
                  dataPtr +=2;
               }
               RSDataMessage("Read processed OK:");
               ABError = FALSE;
            }
            break;
         default:
            ABErrorCode = AB_STS_ILLEGALCMD + (AB_EXTSTS_ILLEGALFIELDVALUE << 8);
            break;
      }
   }
   else
   {
      ABErrorCode = AB_STS_ILLEGALCMD + (AB_EXTSTS_CANNOTEXECUTE << 8);
   }

   if (ABError)
   {
      msg.BuildMessagePreamble(ABError, ABErrorCode);
      //Send(msg.overalLen-8, (BYTE*)&msg.buffer[2], TRUE, NULL);
      // send a NAK or error message
   }
   else
   {

      *length = msg.count + 6;
      memcpy(buffer, (BYTE*)&msg.buffer[2], *length);
   }
} // 

// --------------------------- SetEmulationParameters -----------------------
void CAB232CommsProcessor::SetEmulationParameters(BOOL moscadChecks, 
                                                BOOL modifyThenRespond, 
                                                BOOL disableWrites)
{
   //m_MOSCADchecks = moscadChecks;
   m_modifyThenRespond = modifyThenRespond;
   m_disableWrites = disableWrites;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一二精品视频| 精品国产乱码久久久久久久久| 国产福利一区在线| 久久精品亚洲一区二区三区浴池| 色婷婷av久久久久久久| 狠狠色综合日日| 奇米精品一区二区三区在线观看一| 中文字幕高清不卡| 91亚洲国产成人精品一区二区三 | 亚洲婷婷综合色高清在线| 亚洲午夜影视影院在线观看| 成人黄色电影在线| 日韩欧美亚洲国产另类| 天堂精品中文字幕在线| 欧美一级生活片| 日本伊人精品一区二区三区观看方式| 欧美午夜精品一区二区蜜桃| 亚洲地区一二三色| 7777女厕盗摄久久久| 一区二区三区四区在线免费观看| 色先锋aa成人| 亚洲国产精品久久久久婷婷884 | 久久国产精品99精品国产| 亚洲精品在线电影| 国产成人在线色| 国产日韩视频一区二区三区| 91丨porny丨最新| 一区二区三区中文字幕电影| 日韩一区二区三区免费观看| 中文字幕第一区二区| 日一区二区三区| 精品免费国产二区三区 | 麻豆精品精品国产自在97香蕉| 91精品蜜臀在线一区尤物| 蜜桃91丨九色丨蝌蚪91桃色| 国产精品乱码妇女bbbb| 欧美性一区二区| 老鸭窝一区二区久久精品| 日韩欧美第一区| 国产精品18久久久久久久网站| 337p日本欧洲亚洲大胆精品| 大胆亚洲人体视频| 亚洲欧美乱综合| 欧美美女直播网站| 久久99精品久久久| 亚洲另类色综合网站| 日韩午夜精品电影| 在线免费亚洲电影| 久久国产视频网| 亚洲电影视频在线| 久久精品亚洲乱码伦伦中文| 成人精品国产一区二区4080| 欧美久久久久免费| 精品欧美黑人一区二区三区| 综合av第一页| 成人a免费在线看| 欧美日韩国产另类不卡| 日韩美女啊v在线免费观看| 精品在线一区二区| 91麻豆精品久久久久蜜臀| 亚洲码国产岛国毛片在线| 国产成人在线影院| 亚洲国产成人在线| 成人午夜精品一区二区三区| 久久嫩草精品久久久精品| 日日噜噜夜夜狠狠视频欧美人| 欧美一区二区三区不卡| 亚洲综合一区二区| 欧美精品一区二区三区四区| 成人美女在线观看| 日韩久久久精品| 精品欧美一区二区三区精品久久| 从欧美一区二区三区| 国产一区在线观看麻豆| 91一区二区三区在线观看| 亚洲第一搞黄网站| 中文字幕一区二区不卡| 精品国产精品网麻豆系列| 欧美日韩专区在线| 91在线视频18| 99综合电影在线视频| 韩国视频一区二区| 日韩av中文字幕一区二区三区| 中文字幕视频一区| 欧美激情中文不卡| 久久综合给合久久狠狠狠97色69| 欧美大片一区二区| 6080亚洲精品一区二区| 欧美美女直播网站| 欧美日韩高清一区二区不卡| 成人av中文字幕| 99久久精品国产麻豆演员表| 成人动漫在线一区| 91丨九色丨黑人外教| 91小视频在线免费看| 欧美三级在线视频| 91激情在线视频| 欧美三级韩国三级日本三斤 | 欧美亚洲一区二区在线| 99久久99久久精品免费看蜜桃| 91在线免费播放| 91国产精品成人| 91精品欧美综合在线观看最新| 91精品综合久久久久久| 欧美男人的天堂一二区| 91行情网站电视在线观看高清版| 色综合天天综合网国产成人综合天 | 免费人成黄页网站在线一区二区| 亚洲图片欧美视频| 视频一区欧美日韩| 日本人妖一区二区| 蜜桃视频在线观看一区二区| 午夜精品免费在线观看| 日韩电影免费一区| 韩国女主播成人在线| 秋霞电影网一区二区| 久久se这里有精品| 91在线观看一区二区| 91久久精品网| 7777精品伊人久久久大香线蕉超级流畅 | 国产一区二区三区av电影| 亚洲一二三区在线观看| 亚洲一区在线看| 国产毛片精品国产一区二区三区| 国产大陆精品国产| 欧美日韩国产另类一区| 日韩免费高清av| 亚洲人成伊人成综合网小说| 日韩电影一区二区三区四区| 狠狠色丁香九九婷婷综合五月| 丁香一区二区三区| 7799精品视频| 中文字幕的久久| 一区二区三区成人在线视频| 国产美女娇喘av呻吟久久| 一本到一区二区三区| 欧美一区二区观看视频| 国产女人水真多18毛片18精品视频| 亚洲视频狠狠干| 免费人成精品欧美精品| 99久久99久久精品免费观看| xfplay精品久久| 一区二区在线观看视频在线观看| 国产一区二区日韩精品| 欧美唯美清纯偷拍| √…a在线天堂一区| 日韩综合小视频| 国内精品嫩模私拍在线| 日韩欧美亚洲一区二区| 亚洲男女一区二区三区| 99精品视频一区二区| 日韩一区二区影院| 午夜精品福利一区二区蜜股av| 国产精品456| 久久麻豆一区二区| 视频一区二区三区在线| 一本大道久久a久久综合婷婷| 久久久欧美精品sm网站| 亚洲欧美在线视频观看| av资源网一区| 欧美区在线观看| 天天av天天翘天天综合网色鬼国产| 懂色av中文一区二区三区| 精品免费日韩av| 日韩av电影天堂| 日韩一区二区三区观看| 洋洋av久久久久久久一区| 91免费在线看| 欧美极品xxx| 成人午夜精品在线| 久久精品视频在线看| 国产精品一区二区男女羞羞无遮挡| 欧美一区二区三区在线| 国产91丝袜在线播放0| 久久精品国产久精国产爱| 亚洲一级片在线观看| 成人黄色片在线观看| 日日摸夜夜添夜夜添精品视频| 亚洲国产精品一区二区久久恐怖片| 中文av一区二区| 538在线一区二区精品国产| 国产精品一区二区免费不卡| 亚洲婷婷综合色高清在线| 精品日韩欧美一区二区| 91高清视频在线| 91视视频在线直接观看在线看网页在线看| 亚洲尤物在线视频观看| 国产亚洲制服色| 91亚洲精品一区二区乱码| 寂寞少妇一区二区三区| 亚洲福中文字幕伊人影院| 欧美xxxxx牲另类人与| 欧美精品一二三四| 成人理论电影网| 丰满少妇在线播放bd日韩电影| 一区二区在线观看视频| 亚洲精品视频在线观看网站| 91官网在线免费观看| 国产精品丝袜91| 黄页网站大全一区二区|