?? dsx01pro.cpp
字號:
// 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 + -