#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<hex_str.GetLength() ; i++)
|
{
|
dec += hex.Find(hex_str.GetAt(hex_str.GetLength()-1-i))*cnv;
|
cnv *= 16;
|
}
|
return dec;
|
}
|
|
BOOL CSignalControl_MxComponent::Read_ReceiveSignal(int nAddrIndex, WORD& wValue)
|
{
|
if(m_pMemStartAddr == NULL) return FALSE;
|
|
int nAddress = PLC_READ_SIGNAL0 + (sizeof(WORD)*nAddrIndex);
|
|
// copy signal
|
memcpy(&wValue, m_pMemStartAddr+nAddress, sizeof(WORD));
|
|
// make string
|
CString strValue = _T("");
|
strValue.Format(_T("%x"), wValue);
|
strValue.MakeUpper();
|
|
// hex 2 dec
|
wValue = Hex2Dec(strValue);
|
|
return TRUE;
|
}
|
|
BOOL CSignalControl_MxComponent::Read_SendSignal(int nAddrIndex, WORD& wValue)
|
{
|
if(m_pMemStartAddr == NULL) return FALSE;
|
|
if (m_ControlInfo.GetIndex() < 0) return FALSE;
|
|
int nAddress = PLC_WRITEWORD_VALUE + (sizeof(WORD)*nAddrIndex);
|
|
memcpy(&wValue, m_pMemStartAddr+nAddress, sizeof(WORD));
|
|
CString strValue = _T("");
|
strValue.Format(_T("%x"), wValue);
|
strValue.MakeUpper();
|
|
wValue = Hex2Dec(strValue);
|
|
return TRUE;
|
}
|
|
|
BOOL CSignalControl_MxComponent::Write_SendSignal(int nAddrIndex, int nSignalIndex, WORD nSignalValue, int nOnTime)
|
{
|
if(m_pMemStartAddr == NULL) return FALSE;
|
|
if (m_ControlInfo.GetIndex() < 0) return FALSE;
|
|
CString strAddr = m_ControlInfo.GetSendSignalAddress(nAddrIndex);
|
int strlength = lstrlen(strAddr);
|
if ( strlength > 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;
|
}
|