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

📄 isa.cpp

📁 一个电力系统方面的ISA通讯规约
💻 CPP
字号:
// ISA.cpp : Defines the initialization routines for the DLL.
//
// create : Benny 2001.7.25

#include "stdafx.h"
#include "ISA.h"
#include "IPremSvr.h"
#include "Serial.h"
#include "nsIRdbTable.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

DECLARE_PREMSERVER_INTERFACE

void FAR PASCAL EXPORT CommCallBack( UINT uMsg, HANDLE handle, WPARAM wParam, LPARAM lParam );
void FAR PASCAL EXPORT TimerProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );

//
//	Note!
//
//		If this DLL is dynamically linked against the MFC
//		DLLs, any functions exported from this DLL which
//		call into MFC must have the AFX_MANAGE_STATE macro
//		added at the very beginning of the function.
//
//		For example:
//
//		extern "C" BOOL PASCAL EXPORT ExportedFunction()
//		{
//			AFX_MANAGE_STATE(AfxGetStaticModuleState());
//			// normal function body here
//		}
//
//		It is very important that this macro appear in each
//		function, prior to any calls into MFC.  This means that
//		it must appear as the first statement within the 
//		function, even before any object variable declarations
//		as their constructors may generate calls into the MFC
//		DLL.
//
//		Please see MFC Technical Notes 33 and 58 for additional
//		details.
//

/////////////////////////////////////////////////////////////////////////////
// CISAApp

BEGIN_MESSAGE_MAP(CISAApp, CWinApp)
	//{{AFX_MSG_MAP(CISAApp)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CISAApp construction

CISAApp::CISAApp()
{
	m_uCTTimer = 0;
	m_uTimer = 0;
	m_uTimes = 0;
	m_uWait = 0;
	m_uTimeOut = 0;
	m_uSimulationTime = 0;
	m_uSwitchTime = 0;
	m_uAnaTime = 0;
	m_uPulTime = 0;
	m_uAllDgtTime = 0;
}

CISAApp::~CISAApp()
{
}

int CISAApp::SendPremMessage(UINT msg, WPARAM wParam, LPARAM lParam)
{
	int nRet = PREM_OK;
    BYTE btAddr;
	PREMDZHPARAM* pDZHParam = NULL;
	RELAYPARAM* pRelayParam = NULL;

	CDevice* pDevice = NULL;
   
	if (  ISPROTECTMSG( msg ) )
	{
		if ( PREM_PROTECTSIGNALRESET==msg )
		{
			PROTECTPARAM *pProtParam = (PROTECTPARAM *)wParam;
			if (!pProtParam)
				return PREM_ERR_PARAM;
			pDevice = GetDevice( pProtParam->btAddr );	
			
		}
		else
		{
			pDZHParam = (PREMDZHPARAM*)lParam;

			if ( !pDZHParam )
				return PREM_ERR_PARAM;
			
			BYTE btAddr = 0;
			((nsIRdbTable*)(pDZHParam->pProtectParam))->GetFieldValue( "地址", &btAddr, DBVT_UCHAR, sizeof(BYTE) );
				
			pDevice = GetDevice( btAddr );	
		}
		if ( !pDevice )
			return PREM_ERR_PARAM;
		
//		if ( !pDevice->CheckProtParam( pDZHParam ) )
//			return PREM_ERR_PARAM;
	}
	else if (  ISRELAYMSG( msg ) )
		return PREM_ERR_PARAM;

	
	switch ( msg )
	{
		case PREM_INIT:
			nRet = InitPrem();
			break;

		case PREM_EXIT:
			ExitPrem();
			break;

		case PREM_SETINTERFACE:
			if ( INTERFACE_PREMSERVER == wParam )
				SET_PREMSERVER_INTERFACE( lParam )
			break;

		case PREM_GETPROTOCOLNAME:
			strcpy( (char*)lParam, PROTOCOLNAME );
			break;

		case PREM_RELAYSELECT:
			break;

		case PREM_RELAYRUN:
			break;

		case PREM_RELAYCANCEL:
			break;

		case PREM_ASKAREA:
			break;

		case PREM_CHANGEAREA:
			break;

		case PREM_ACKCHANGEAREA:
			break;

		case PREM_CANCELCHANGEAREA:
			break;

		case PREM_ASKPROTECTVALUE:
			nRet = pDevice->AskValue( pDZHParam, msg );
			break;

		case PREM_CHANGEPROTECTVALUE:
			nRet = pDevice->ChangeValue( pDZHParam, msg );
			break;

		case PREM_ACKCHANGEPROTECTVALUE:
			nRet = pDevice->AckChangeValue( pDZHParam, msg ); 
			break;

		case PREM_CANCELCHANGEPROTECTVALUE:
			nRet = pDevice->NakChangeValue( pDZHParam, msg ); 
			break;

		case PREM_PROTECTSIGNALRESET:
			nRet = pDevice->SignalReset( pDZHParam, msg );
		
			break;

		case PREM_ASKANALOGUE:
			nRet = pDevice->AskProtectAna( pDZHParam , msg );
			break;
		case PREM_CHECKTIME:
			nRet = pDevice->CheckTime( pDZHParam, msg );
			break;

		case PREM_ASKACCIDENT:
			break;

		default:
			return PREM_ERR_MSG;
	}

	return nRet;

}

void CISAApp::CommCallBack(UINT uMsg, HANDLE handle, WPARAM wParam, LPARAM lParam)
{
	CComPort* pComPort = GetComPort( handle );
	if ( !pComPort )
		return;

	switch ( uMsg )
	{
		case CM_DATA:
			pComPort->Recv(); 
			break;

		case CM_IDLE:
//			pComPort->ResetComm(); 
			break;
	}
}

int CISAApp::InitPrem()
{
	m_uTimes = ::GetPrivateProfileInt( "Setting", "Retry", 3, PROTOCOL_INIFILE );

	m_uTimeOut = ::GetPrivateProfileInt( "Setting", "TimeOut", 5, PROTOCOL_INIFILE );
	m_uWait = ::GetPrivateProfileInt( "Setting", "Wait", 20, PROTOCOL_INIFILE );

	m_uTimeOut *= 1000 / TIMER_ELAPSE;
	m_uWait *= 1000 / TIMER_ELAPSE;
	
	DBHANDLE dbHandle = ::FindDbHandle( (WORD)-1, TYPE_NULL, 0 );
	for ( ; ::IsValidDbHandle( dbHandle ); dbHandle = ::GetNextDbHandle( dbHandle ) )
	{
		char szProtocol[PROTOCOLNAMELEN] = "";
		DBHANDLE dbParent = ::GetParentDbHandle( dbHandle);
		if (!::IsValidDbHandle( dbParent ))
			continue;
		if ( !::GetAttr( dbParent, ATTR_ST_PROTOCOLNAME, szProtocol )
			|| _stricmp( szProtocol, PROTOCOLNAME ) )
			continue;
		
		CDevice* pDevice = new CDevice();
		if ( !pDevice )
			continue;

		pDevice->OnInit( dbHandle );


		m_ListDevice.AddTail( pDevice );

		char szCom[COMSETTINGLEN] = "";
		::GetAttr( dbParent, ATTR_ST_COM, szCom );
		CComPort* pComPort = GetComPort( ::StringToPort( szCom ) );
		if ( !pComPort )
		{
			pComPort = new CComPort();
			if ( !pComPort )
				continue;

			pComPort->Open( szCom );
			m_ListComPort.AddTail( pComPort );
		}

		if ( pComPort )
		{
			pDevice->m_hComPort = pComPort->m_hComPort;
			pComPort->AddDevice( pDevice );
		}
	}
	::GetKerTable( "ACCTYPE", getter_AddRefs( m_pAccTable ) ) ;
	::GetKerTable( "PROTTYPE", getter_AddRefs( m_pProtTable ) ) ;
	::GetKerTable( "ANATYPE", getter_AddRefs( m_pAnaTable ) ) ;
	::GetKerTable( "DZHTYPE", getter_AddRefs( m_pDzhTable ) ) ;
	::GetKerTable( "DIAGTYPE", getter_AddRefs( m_pDiagTable ) ) ;
    //add by llj to add anavalue
	::GetKerTable( "ANAVALUE",getter_AddRefs( m_pAnaValueTable) );


	m_uTimer = ::SetTimer( NULL, 0x0001, TIMER_ELAPSE, (TIMERPROC)::TimerProc );
	if ( 0 == m_uTimer )
		return PREM_ERR_TIMER;

	return PREM_OK;
}


CComPort* CISAApp::GetComPort(UINT uPort)
{
	POSITION pos = m_ListComPort.GetHeadPosition();
	while( pos )
	{
		CComPort* pComPort = m_ListComPort.GetNext( pos );
		if ( pComPort->GetPortNO() == uPort )
			return pComPort;
	}

	return NULL;
}

void CISAApp::TimerProc()
{
	POSITION pos = m_ListDevice.GetHeadPosition();
	while( pos )
	{
		CDevice* pDevice = m_ListDevice.GetNext( pos );
		pDevice->OnTimer();
	}

	pos = m_ListComPort.GetHeadPosition();
	while( pos )
	{
 		CComPort* pComPort = m_ListComPort.GetNext( pos );
		pComPort->OnTimer();
	}
}

CDevice* CISAApp::GetDevice(BYTE btAddr)
{
	POSITION pos = m_ListDevice.GetHeadPosition();
	while( pos )
	{
		CDevice* pDevice = m_ListDevice.GetNext( pos );
		if ( pDevice->m_btAddr == btAddr )
			return pDevice;
	}
	return NULL;

}

CComPort* CISAApp::GetComPort(HANDLE handle)
{
	POSITION pos = m_ListComPort.GetHeadPosition();
	while ( pos )
	{
		CComPort* pComPort = m_ListComPort.GetNext( pos );
		if ( pComPort->m_hComPort == handle )
			return pComPort;
	}

	return NULL;
}

void CISAApp::ExitPrem()
{
	::KillTimer( NULL, m_uTimer );

	while( !m_ListComPort.IsEmpty() )
		delete m_ListComPort.RemoveHead();

	while( !m_ListDevice.IsEmpty() )
		delete m_ListDevice.RemoveHead();
}

/////////////////////////////////////////////////////////////////////////////
// The one and only CISAApp object

CISAApp theApp;

int FAR PASCAL EXPORT SendPremMessage( UINT msg, WPARAM wParam, LPARAM lParam )
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	return theApp.SendPremMessage( msg, wParam, lParam );
}

void FAR PASCAL EXPORT CommCallBack( UINT uMsg, HANDLE handle, WPARAM wParam, LPARAM lParam )
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	theApp.CommCallBack( uMsg, handle, wParam, lParam );
}

void FAR PASCAL EXPORT TimerProc( HWND, UINT, WPARAM, LPARAM )
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	theApp.TimerProc();
}

⌨️ 快捷键说明

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