⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsx01pro.cpp

📁 AppWizard has created this DSX01 DLL for you. This DLL not only demonstrates the basics of using th
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// DSX01Pro.cpp : implementation file
//

#include "stdafx.h"
#include "DSX01.h"
#include "DSX01Pro.h"
#include "reg.h"
#include "math.h"

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

//#ifndef   TEST_ShowMessage
//#define  TEST_ShowMessage
//#endif

#ifndef  TEST_ShowMessage 
#define    ShowMessage  TRACE
#endif

#ifdef   TEST_ShowMessage 
void ShowMessage( const char* msg);
void ConVertBufToShowMessage(char * BufBeforeConVert, char * BufAfterConVert, int ConVertlong);
#define WM_MESSAGE_OUTPUT WM_USER+50
#endif

/////////////////////////////////////////////////////////////////////////////
// DSX01Pro

IMPLEMENT_DYNCREATE(DSX01Pro, CCmdTarget)

DSX01Pro::DSX01Pro()
{
	EnableAutomation();
	
	// To keep the application running as long as an OLE automation 
	//	object is active, the constructor calls AfxOleLockApp.

	m_nTimeOut =5000;
	m_nLastErrorCode = -1;
	m_hComm = INVALID_HANDLE_VALUE; 	
	
	AfxOleLockApp();
}

DSX01Pro::~DSX01Pro()
{
	// To terminate the application when all objects created with
	// 	with OLE automation, the destructor calls AfxOleUnlockApp.

	if(m_hComm != INVALID_HANDLE_VALUE)
	{
		CloseHandle(m_hComm);
		m_hComm = INVALID_HANDLE_VALUE;
	}		
	
	AfxOleUnlockApp();
}


void DSX01Pro::OnFinalRelease()
{
	// When the last reference for an automation object is released
	// OnFinalRelease is called.  The base class will automatically
	// deletes the object.  Add additional cleanup required for your
	// object before calling the base class.

	CCmdTarget::OnFinalRelease();
}


BEGIN_MESSAGE_MAP(DSX01Pro, CCmdTarget)
	//{{AFX_MSG_MAP(DSX01Pro)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

BEGIN_DISPATCH_MAP(DSX01Pro, CCmdTarget)
	//{{AFX_DISPATCH_MAP(DSX01Pro)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_DISPATCH_MAP
END_DISPATCH_MAP()

// Note: we add support for IID_IDSX01Pro to support typesafe binding
//  from VBA.  This IID must match the GUID that is attached to the 
//  dispinterface in the .ODL file.

// {E2F453A8-11FF-489D-8463-94172D8A334B}
static const IID IID_IDSX01Pro =
{ 0xe2f453a8, 0x11ff, 0x489d, { 0x84, 0x63, 0x94, 0x17, 0x2d, 0x8a, 0x33, 0x4b } };

BEGIN_INTERFACE_MAP(DSX01Pro, CCmdTarget)
	INTERFACE_PART(DSX01Pro, IID_IDSX01Pro, Dispatch)
	INTERFACE_PART(DSX01Pro, IID_ProtocolImp, ProtocolImp)
END_INTERFACE_MAP()

// {DDCDB353-BDFD-4A55-A0DD-8A6308070AA5}
IMPLEMENT_OLECREATE(DSX01Pro, "DSX01.DSX01Pro", 0xddcdb353, 0xbdfd, 0x4a55, 0xa0, 0xdd, 0x8a, 0x63, 0x8, 0x7, 0xa, 0xa5)

/////////////////////////////////////////////////////////////////////////////
// DSX01Pro message handlers
STDMETHODIMP_(ULONG) DSX01Pro::XProtocolImp::AddRef(void)
{
    METHOD_PROLOGUE(DSX01Pro, ProtocolImp);
    return pThis->ExternalAddRef();
}

STDMETHODIMP_(ULONG) DSX01Pro::XProtocolImp::Release(void)
{
    METHOD_PROLOGUE(DSX01Pro, ProtocolImp);
    return pThis->ExternalRelease();
}

STDMETHODIMP DSX01Pro::XProtocolImp::QueryInterface(REFIID iid, void FAR* FAR* ppvObj)
{
    METHOD_PROLOGUE(DSX01Pro, ProtocolImp);
    return pThis->ExternalQueryInterface(&iid, ppvObj);
}

STDMETHODIMP_(BOOL) DSX01Pro::XProtocolImp::TryConnect( char * pDeviceName, int nUnitAddr, LPVOID lpDevAddr )
{
    METHOD_PROLOGUE(DSX01Pro, ProtocolImp);

	PPACKET   pPac = new PACKET;
	IdNo     *pTempIdNo = new IdNo;
	pPac->nPacketType = PT_READ;
	pPac->nRegType = 0;
	pPac->nUnitNo = nUnitAddr;
	pPac->nStartNo = 0;
	pPac->nEndNo = 0;

	pTempIdNo->wNo = pPac->nStartNo;
	pTempIdNo->wDataType = FLOAT_DATATYPE;

	pPac->varList.AddTail(pTempIdNo);
	if(ProcessPacket( pPac ))
	{
		delete   pPac;
		delete   pTempIdNo;
		return   TRUE;
	}
	else
	{
		delete   pPac;
		delete   pTempIdNo;
		return   FALSE;
	}		
}

STDMETHODIMP_(BOOL) DSX01Pro::XProtocolImp::StrToDevAddr( const  char * str,LPVOID lpDevAddr)
{
    METHOD_PROLOGUE(DSX01Pro, ProtocolImp); 
	DEVADDR * pDevAddr =(DEVADDR *) lpDevAddr;

	int len=strlen(str);	
	WORD addr=0;

//	_strupr(str);

	for(int i=0;i<len;i++) 
	{
		if( !isdigit(str[i]) )
		{
			pThis->m_nLastErrorCode = USER_ADDR_SCOPE_ERROR;
			return FALSE;
		}
	}
	addr=(WORD)atoi(str);
	if(addr<128 || addr>255)
	{
		pThis->m_nLastErrorCode = USER_ADDR_SCOPE_ERROR;
		return FALSE;
	}
	
	pDevAddr->nDevAddr = addr;

	return  TRUE;
}

STDMETHODIMP_(char *) DSX01Pro::XProtocolImp::GetLastError()
{
    METHOD_PROLOGUE(DSX01Pro, ProtocolImp);
	
	if(pThis->m_nLastErrorCode != -1)
		return Error_Message_Table[pThis->m_nLastErrorCode];
	else
		return NULL;
}

STDMETHODIMP_(BOOL) DSX01Pro::XProtocolImp::OpenComDevice( int nDeviceType, LPVOID lpInitData)
{
    METHOD_PROLOGUE(DSX01Pro, ProtocolImp); 
	
	ASSERT( nDeviceType == SERIAL_DEV_TYPE );
	
	return pThis->InitialComm( lpInitData );

/*	char szPort[8]; 
	int Flag = 1;
	ComDevice *pcc = (ComDevice *)lpInitData;   
    if(pcc->isRs232 != RS232)
	{
		pcc->isRs232 = RS485;
	    pThis->m_nCommType=RS485;/*XCL  添加*/
//	}
/*	if((pcc->baudRate<9600)||(pcc->baudRate)>57600)
	{ 	
		TRACE( "Error Config for Commounication .\n" );
		pThis->m_nLastErrorCode = COMMUNICATION_CONFIG_ERROR;
		return FALSE;
	}  
	pThis->m_nTimeOut = pcc->timeOut;
	strcpy(szPort, pcc->deviceName);
    HANDLE hComm;
	hComm = CreateFile( szPort, GENERIC_READ | GENERIC_WRITE, 0, 
		NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL , NULL );
	if ( INVALID_HANDLE_VALUE==hComm )
	{
		TRACE( "Error in open COM port.\n" );
		pThis->m_nLastErrorCode = FAILED_OPEN_COM; 
		return FALSE; 
	}
//	SetupComm( hComm, RX_QUEU, TX_QUEU );
	SetupComm( hComm, 512, 512 );
	
	DCB dcb;
	GetCommState( hComm, &dcb );
	dcb.BaudRate = (WORD)pcc->baudRate;
	dcb.ByteSize =  (BYTE)pcc->dataBits;      
	dcb.StopBits =  ONESTOPBIT;      
	dcb.Parity   =  (BYTE)pcc->parity;
	if ( !SetCommState( hComm, &dcb ) )
	{
		CloseHandle( hComm );
		TRACE( "Error in SetCommDcb.\n" );
//        pThis->m_nLastErrorCode = FAILED_INITIALIZED_COM;
		return FALSE;
	}	
    PurgeComm( hComm, PURGE_TXABORT | PURGE_RXABORT |
		PURGE_TXCLEAR | PURGE_RXCLEAR ) ;
	
	COMMTIMEOUTS CommTimeOuts;
    CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF ;
    CommTimeOuts.ReadTotalTimeoutMultiplier = 0 ;
    CommTimeOuts.ReadTotalTimeoutConstant = 0 ;
    CommTimeOuts.WriteTotalTimeoutMultiplier = 5;
    CommTimeOuts.WriteTotalTimeoutConstant = 0 ;
    SetCommTimeouts( hComm, &CommTimeOuts ) ;
	
	pThis->m_hComm = hComm;
	return  TRUE;*/
}

STDMETHODIMP_(BOOL) DSX01Pro::XProtocolImp::CloseComDevice()
{
    METHOD_PROLOGUE(DSX01Pro, ProtocolImp);
	
	if(pThis->m_hComm != INVALID_HANDLE_VALUE)
	{
		CloseHandle( pThis->m_hComm );
		pThis->m_hComm = INVALID_HANDLE_VALUE;
	}
    return TRUE;
}

STDMETHODIMP_(BOOL) DSX01Pro::XProtocolImp::InitialDevice(char *  pDeviceName, int nUnitAddr, LPVOID lpDevAddr)
{
    METHOD_PROLOGUE(DSX01Pro, ProtocolImp);
	return TRUE;
}


BOOL DSX01Pro::PhysicalReceive(char * pReceive, int & nLen)
{
	DWORD  dwError;
	COMSTAT	cs;
	DWORD dwTimeOut=GetTickCount()+m_nTimeOut;
	ULONG   nByteRead = 0;
	int     RecLen = 0;
	char cTemp[1024];
	memset(cTemp,0,sizeof(cTemp));

	while(TRUE)
	{
		if(GetTickCount() > dwTimeOut)
		{
//			m_nLastErrorCode = TIME_OUT_ERROR;
			TRACE("Time Out!\n");
			return FALSE;
		}
		ClearCommError( m_hComm, &dwError, &cs );

//		if(cs.cbInQue > 1024)
//			RecLen = 1024;
//		else 
//			RecLen = cs.cbInQue;

		if ( cs.cbInQue )
		{
			BOOL bReadSuc = ReadFile(m_hComm, cTemp, cs.cbInQue, &nByteRead, NULL);
			if ( bReadSuc  )
			{
				memcpy(pReceive,cTemp,nByteRead);
				nLen = (int) nByteRead;
//				TRACE("receive  %s\n",pReceive);
				
			}
			return  TRUE;
		}			//for(i=0;i<strlen(pReceive)
//		if(pReceive[nLen-1]==0x0A) 
//			return TRUE;
	}
	return FALSE;
}

STDMETHODIMP_(int) DSX01Pro::XProtocolImp::LoadDeviceInfo( const char *sProd, const char *sDevName, int nType )
{
    METHOD_PROLOGUE(DSX01Pro, ProtocolImp);
	
	return  TRUE;
}

STDMETHODIMP_(BOOL) DSX01Pro::XProtocolImp::GetRegisters(char *szDeviceName,LPVOID * ppRegs, int *pRegNum)
{	
    METHOD_PROLOGUE(DSX01Pro, ProtocolImp);
		*ppRegs = (LPVOID)&gsRegInfos;
		*pRegNum = REG_TYPE_NUM;
	
	return TRUE;
}

STDMETHODIMP_(BOOL) DSX01Pro::XProtocolImp:: AddVarToPacket( LPVOID lpVar, int nVarAccessType,LPVOID lpPacket)
{
	METHOD_PROLOGUE(DSX01Pro, ProtocolImp);
	
    PPACKET pPack = (PACKET *)lpPacket;
    PPLCVAR pVar = (PLCVAR *)lpVar;

	int nTotalNo;

	if((nVarAccessType == pPack->nPacketType)&&(pPack->nUnitNo == pVar->nUnitNo)
        && (pPack->nRegType == pVar->nRegType))
	{
		if ( nVarAccessType == PT_WRITE )
		{
			if ( pVar->nNo == pPack->nStartNo )  
				return TRUE;
			else  
				return FALSE;
		}
	  //Read Operate 
		if ( pVar->nNo<pPack->nStartNo )
		{//Graph:		-----no-------Start================End----------
			nTotalNo = pPack->nEndNo - pVar->nNo + 1;
			if ( nTotalNo <= MAX_PACKET_NUM )
			{
				pPack->nStartNo = pVar->nNo;	
				return TRUE;
			}
		}
		else if ( pVar->nNo > pPack->nEndNo )
		{//Graph:		------------Start================End----no------
			nTotalNo = pVar->nNo - pPack->nStartNo + 1;
			if ( nTotalNo <= MAX_PACKET_NUM )
			{
				pPack->nEndNo = pVar->nNo;
				return TRUE;
			}
		}
		else
		{//Graph:		------------Start====no============End----------
			return TRUE;
		}		
	}
	return FALSE;		
}

STDMETHODIMP_(WORD) DSX01Pro::XProtocolImp:: ConvertUserConfigToVar( LPVOID lpDbItem, LPVOID lpVar )
{
	METHOD_PROLOGUE(DSX01Pro, ProtocolImp);
	
	MiniDbItem * pTheDbItem = (MiniDbItem*)lpDbItem;
	CString strRegName;
	
	CString strDevName(pTheDbItem->szDevName);
	strRegName = pTheDbItem->szRegister;      
	
	if(pThis->MyConvert( lpDbItem, lpVar,
		gsRegInfos, REG_TYPE_NUM))
		return 1;
	return 0;
}

STDMETHODIMP_(int) DSX01Pro::XProtocolImp:: ProcessPacket( LPVOID lpPacket )
{
    METHOD_PROLOGUE(DSX01Pro, ProtocolImp);
	

	PPACKET pPac = (PPACKET) lpPacket;

	POSITION position =  pPac->varList.GetHeadPosition();
	ID_NO* idNo = (ID_NO*)pPac->varList.GetNext(position);
	
	char Readbuffer[1024];	
	char SendBuffer[64];
	char pData[1024];
		
	DWORD    dwTimeOutTick = 0;
	BOOL     bTimeOut = FALSE;

    int  nLen=0;
	int  nReceiveLen = 0;
	int  nByteRead = 0;
	int  ret = 0;
	int  bError  = 0;
	int  bPacSuc = 0;	

	memset(Readbuffer,0,sizeof(Readbuffer));	
	memset(SendBuffer,0,sizeof(SendBuffer));	
	memset(pData,0,sizeof(pData));	
	
	if(PT_WRITE == pPac->nPacketType)//写数据
	{
		pThis->m_nLastErrorCode = DONOT_WRITE; 
		return  FALSE;
	}	
	
	pThis->GetSendString(pPac,SendBuffer, nLen);
	
	ASSERT(nLen > 0);

	pThis->PhysicalSend(SendBuffer, nLen);
	
	TRACE("Send %s\n",SendBuffer+1);

	Sleep(100);

	dwTimeOutTick = GetTickCount() + pThis->m_nTimeOut;
	
	while ( TRUE )
	{					
		if( pThis->PhysicalReceive( Readbuffer, nByteRead ) )
		{					
			memcpy( pData+nReceiveLen, Readbuffer, nByteRead );
			/*	for (int i=0;i<nByteRead;i++)
			{
			TRACE("%x,",Readbuffer[i]);					
			}
			TRACE("\n");*/
			TRACE("receive %s\n",Readbuffer);
			
			nReceiveLen+= nByteRead;
			pData[nReceiveLen] = 0;
			
			ret = pThis->PreProcessData(pPac, pData, nReceiveLen, nByteRead);
			//#ifdef _DEBUG
			//ret = RECEIVE_RECEIVED;//test
			//#endif
			if(ret == RECEIVE_RECEIVED)
			{
				//					receivetime = GetTickCount() - (dwTimeOutTick - pThis->m_nTimeOut);
				break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -