#include "StdAfx.h" #include "CHSignalControls/SignalControl_MxComponent.h" #include "SharedMemoryDefine.h" CSignalControl_MxComponent::CSignalControl_MxComponent(int nIndex, DWORD dwPeriod) : CSignalControl(nIndex, dwPeriod) , m_ReadEvent(FALSE, FALSE, _T("DIT_PLCConnector_Event_1")) , m_WriteEvent(FALSE, FALSE, _T("DIT_PLCConnector_Write_Complete_Event_1")) { m_hMemMap = NULL; m_pMemStartAddr = NULL; } CSignalControl_MxComponent::~CSignalControl_MxComponent(void) { //AfxMessageBox(_T("CSignalControl_MxComponent")); Disconnect(); } int CSignalControl_MxComponent::Connect(const CSignalControlInfo* pControlInfo) { if (pControlInfo==NULL) return 0; m_ControlInfo = *pControlInfo; // set signal info if (m_ControlInfo.GetIndex() < 0) return -1; m_nIndex = m_ControlInfo.GetIndex(); m_nReceiveSignalCount = m_ControlInfo.GetReceiveSignalCount(); m_nSendSignalCount = m_ControlInfo.GetSendSignalCount(); // new signal pointer m_pReceiveSignalValue = new WORD[m_nReceiveSignalCount]; m_pReceiveSignalValuePrev = new WORD[m_nReceiveSignalCount]; memset(m_pReceiveSignalValue, 0, sizeof(WORD)*m_nReceiveSignalCount); memset(m_pReceiveSignalValuePrev, 0, sizeof(WORD)*m_nReceiveSignalCount); m_pSendSignalValue = new WORD[m_nSendSignalCount]; m_pSendSignalValuePrev = new WORD[m_nSendSignalCount]; memset(m_pSendSignalValue, 0, sizeof(WORD)*m_nSendSignalCount); memset(m_pSendSignalValuePrev, 0, sizeof(WORD)*m_nSendSignalCount); // 4k Å©±âÀÇ °øÀ¯ ¸Þ¸ð¸® ÆÄÀÏ »ý¼º m_hMemMap = ::CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, SHARED_MEMORY_SIZE, PC_SHARED_MEMORY_NAME); // ¸¸ÀÏ ÀÌ¹Ì »ý¼ºµÈ °´Ã¼°¡ ÀÖ´Ù¸é ÀÌ¹Ì Connector°¡ ÀÛµ¿ Áß.. if (::GetLastError() == ERROR_ALREADY_EXISTS) { // ÀÌ¹Ì »ý¼ºµÈ °´Ã¼°¡ ÀÖ´Ù¸é »ý¼ºÀÌ ¾Æ´Ï¶ó ¿ÀÇÂÀ¸·Î ½ÇÇà m_hMemMap = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, PC_SHARED_MEMORY_NAME); } else // ¸¸ÀÏ »ý¼ºµÈ °´Ã¼°¡ ¾ø´Ù¸é Á¤»ó µ¿ÀÛÇÏÁö ¾Ê´Â´Ù. { if (m_hMemMap == NULL) return -2; } //°øÀ¯¸Þ¸ð¸® ¸ÊÇÎ m_pMemStartAddr = (char*)::MapViewOfFile(m_hMemMap, FILE_MAP_ALL_ACCESS, 0, 0, SHARED_MEMORY_SIZE); if (m_pMemStartAddr == NULL) return -3; //0À¸·Î ÃʱâÈ­ ZeroMemory(m_pMemStartAddr, SHARED_MEMORY_SIZE); m_bConnected = TRUE; return 1; } void CSignalControl_MxComponent::Disconnect() { if (m_pMemStartAddr!=NULL) { ::UnmapViewOfFile(m_pMemStartAddr); m_pMemStartAddr = NULL; } if (m_hMemMap != NULL) { ::CloseHandle(m_hMemMap); m_hMemMap = NULL; } } int CSignalControl_MxComponent::Hex2Dec(const CString& hex_str) { CString hex("0123456789ABCDEF"); int cnv = 1; int dec = 0; for(int i=0 ; i 6) strlength = 6; short WriteData = (nSignalValue << nSignalIndex); memset(m_pMemStartAddr+PLC_WRITEWORD_ADDRESS, 0x00, 7*sizeof(TCHAR)); memcpy(m_pMemStartAddr+PLC_WRITEWORD_ADDRESS, strAddr, strlength*sizeof(TCHAR)); memcpy(m_pMemStartAddr+PLC_WRITEWORD_VALUE, &WriteData, 2); // typeÀÌ timerÀ̸é timer pram set if (nOnTime > 0) { memcpy(m_pMemStartAddr+PLC_WRITEWORD_TIMER, &nOnTime, 2); } //¸ðµç °ªÀ» ä¿ö ³ÖÀº ÈÄ PLCConnector¿¡°Ô PLC ÁÖ¼Ò¿¡ °ªÀ» Àûµµ·Ï ½ÅÈ£¸¦ º¸³½´Ù. m_pMemStartAddr[PLC_WRITEWORD_SIGNAL] = 1; if (nAddrIndex == 1 ) { m_bAlive = TRUE; } else { m_bAlive = FALSE; } return TRUE; } BOOL CSignalControl_MxComponent::ReadData(const CString strAddr, int nSize, CString& strData) { if(m_pMemStartAddr == NULL) return FALSE; int strlength = lstrlen(strAddr); if ( strlength > 6) strlength = 6; if( nSize > 1000) nSize = 1000; strData = _T(""); //°øÀ¯ ¸Þ¸ð¸®¿¡ ¹°·ùµ¥ÀÌÅ͸¦ Àеµ·Ï ½ÅÈ£¸¦ º¸³½´Ù. memset(m_pMemStartAddr+PLC_READ_LONGDATA_SIGNAL_1, 0x01, 1); memcpy(m_pMemStartAddr+PLC_READ_LONGDATA_ADDRESS_1, strAddr, strlength*sizeof(TCHAR)); memcpy(m_pMemStartAddr+PLC_READ_LONGDATA_LENGTH_1, &nSize, sizeof(unsigned short)); //µ¥ÀÌÅ͸¦ ´Ù ÀÐ°í °øÀ¯¸Þ¸ð¸® ÀûÀ» ¶§±îÁö ±â´Ù¸°´Ù. m_ReadEvent.ResetEvent(); ::WaitForSingleObject(m_ReadEvent, 2000); //¿Ï·á°¡ µÇ¸é ÇØ´ç °ªÀ» Àоî¿Â´Ù. char pData[2048] = {0}; memcpy(pData, m_pMemStartAddr+PLC_READ_LONGDATA_VALUE_1, nSize*sizeof(TCHAR)); strData = pData; return TRUE; } BOOL CSignalControl_MxComponent::ReadData(const CString strAddr, int nSize, char* pData) { if(m_pMemStartAddr == NULL) return FALSE; int strlength = lstrlen(strAddr); if ( strlength > 6) strlength = 6; if( nSize > 1000) nSize = 1000; //°øÀ¯ ¸Þ¸ð¸®¿¡ ¹°·ùµ¥ÀÌÅ͸¦ Àеµ·Ï ½ÅÈ£¸¦ º¸³½´Ù. memset(m_pMemStartAddr+PLC_READ_LONGDATA_SIGNAL_1, 0x01, 1); ZeroMemory(m_pMemStartAddr+PLC_READ_LONGDATA_ADDRESS_1, PLC_READ_ADDRESS_LENGTH); memcpy(m_pMemStartAddr+PLC_READ_LONGDATA_ADDRESS_1, strAddr, strlength*sizeof(TCHAR)); memcpy(m_pMemStartAddr+PLC_READ_LONGDATA_LENGTH_1, &nSize, sizeof(unsigned short)); //µ¥ÀÌÅ͸¦ ´Ù ÀÐ°í °øÀ¯¸Þ¸ð¸® ÀûÀ» ¶§±îÁö ±â´Ù¸°´Ù. m_ReadEvent.ResetEvent(); ::WaitForSingleObject(m_ReadEvent, 2000); //¿Ï·á°¡ µÇ¸é ÇØ´ç °ªÀ» Àоî¿Â´Ù. memcpy(pData, m_pMemStartAddr+PLC_READ_LONGDATA_VALUE_1, nSize*sizeof(TCHAR)); return TRUE; } BOOL CSignalControl_MxComponent::WriteWordData(const CString strAddr, int nSize, int nData) { if(m_pMemStartAddr == NULL) return FALSE; if (m_ControlInfo.GetIndex() < 0) return FALSE; int strlength = lstrlen(strAddr); if ( strlength > 6) strlength = 6; if( nSize > 1000) nSize = 1000; ::WaitForSingleObject(m_WriteEvent, 1000); memset(m_pMemStartAddr+PLC_WRITELONG_ADDRESS, 0x00, 7*sizeof(TCHAR)); memcpy(m_pMemStartAddr+PLC_WRITELONG_ADDRESS, strAddr, strlength*sizeof(TCHAR)); memcpy(m_pMemStartAddr+PLC_WRITELONG_WORDLENGTH, &nSize, sizeof(unsigned short)); memcpy(m_pMemStartAddr+PLC_WRITELONG_DATA, &nData, nSize); //¸ðµç °ªÀ» ä¿ö ³ÖÀº ÈÄ PLCConnector¿¡°Ô PLC ÁÖ¼Ò¿¡ °ªÀ» Àûµµ·Ï ½ÅÈ£¸¦ º¸³½´Ù. m_pMemStartAddr[PLC_WRITELONG_SIGNAL] = 1; return TRUE; } BOOL CSignalControl_MxComponent::WriteData(const CString strAddr, int nSize, CString strData) { if(m_pMemStartAddr == NULL) return FALSE; if (m_ControlInfo.GetIndex() < 0) return FALSE; int strlength = lstrlen(strAddr); if ( strlength > 6) strlength = 6; if( nSize > 1000) nSize = 1000; //::WaitForSingleObject(m_WriteEvent, 1000); memset(m_pMemStartAddr+PLC_WRITELONG_ADDRESS, 0x00, 7*sizeof(TCHAR)); memcpy(m_pMemStartAddr+PLC_WRITELONG_ADDRESS, strAddr, strlength*sizeof(TCHAR)); memcpy(m_pMemStartAddr+PLC_WRITELONG_WORDLENGTH, &nSize, sizeof(unsigned short)); memcpy(m_pMemStartAddr+PLC_WRITELONG_DATA, strData.GetBuffer(0), nSize*2); //¸ðµç °ªÀ» ä¿ö ³ÖÀº ÈÄ PLCConnector¿¡°Ô PLC ÁÖ¼Ò¿¡ °ªÀ» Àûµµ·Ï ½ÅÈ£¸¦ º¸³½´Ù. m_pMemStartAddr[PLC_WRITELONG_SIGNAL] = 1; return TRUE; } BOOL CSignalControl_MxComponent::WritePacketData(const CString strAddr, int nSize, short* pPacketData) { if(m_pMemStartAddr == NULL) return FALSE; if (m_ControlInfo.GetIndex() < 0) return FALSE; int strlength = lstrlen(strAddr); if ( strlength > 6) strlength = 6; if( nSize > 1000) nSize = 1000; //::WaitForSingleObject(m_WriteEvent, 1000); memset(m_pMemStartAddr+PLC_WRITELONG_ADDRESS, 0x00, 14*sizeof(TCHAR)); memcpy(m_pMemStartAddr+PLC_WRITELONG_ADDRESS, strAddr, strlength*sizeof(TCHAR)); memcpy(m_pMemStartAddr+PLC_WRITELONG_WORDLENGTH, &nSize, sizeof(unsigned short)); memcpy(m_pMemStartAddr+PLC_WRITELONG_DATA, pPacketData, nSize*2); //¸ðµç °ªÀ» ä¿ö ³ÖÀº ÈÄ PLCConnector¿¡°Ô PLC ÁÖ¼Ò¿¡ °ªÀ» Àûµµ·Ï ½ÅÈ£¸¦ º¸³½´Ù. m_pMemStartAddr[PLC_WRITELONG_SIGNAL] = 1; return TRUE; }