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

📄 qssreadbotdlg.cpp

📁 空调数据多线程采集
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//
// ODBC 连接数据库

LRESULT WINAPI OnThreadProc7( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) 
{
	int nRet = -1 ;
	HRESULT hr ;
	hWnd7 = hWnd ;

	switch( message )
	{
		case WM_CREATE:
			hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);			/// COINIT_APARTMENTTHREADED
			if ( S_OK != hr )
				AfxMessageBox("线程七组件库初始化错误!") ;

			break ;
		case WM_TIMER:
			switch( wParam ) 
			{
				case ID_TIMER7:
					//MessageBox( NULL, "WM_TIMER","",MB_OK) ;
					nRet = QSSReadWrite( 7, strQSS[6] ) ;
					break ;
			}

			break ;
		case WM_DESTROY:
			if ( KillTimer( hWnd, ID_TIMER7 ) == 0 ) 
				AfxMessageBox("关闭定时器 7 错误") ;

			CoUninitialize() ;

			PostQuitMessage( 0 ) ;
			break ;

		default:
			return DefWindowProc( hWnd, message, wParam, lParam ) ;
	}

	return 0 ;

}

//================================================================================
// 
// 线程处理函数 8 处理 QSS 8 连接的数据
//
// ODBC 连接数据库

LRESULT WINAPI OnThreadProc8( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) 
{
	int nRet = -1 ;
	HRESULT hr ;
	hWnd8 = hWnd ;

	switch( message )
	{
		case WM_CREATE:
			hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);			/// COINIT_APARTMENTTHREADED
			if ( S_OK != hr )
				AfxMessageBox("线程八组件库初始化错误!") ;

			break ;
		case WM_TIMER:
			switch( wParam ) 
			{
				case ID_TIMER8:
					//MessageBox( NULL, "WM_TIMER","",MB_OK) ;
					nRet = QSSReadWrite( 8, strQSS[7] ) ;
					break ;
			}

			break ;
		case WM_DESTROY:
			if ( KillTimer( hWnd, ID_TIMER8 ) == 0 ) 
				AfxMessageBox("关闭定时器 8 错误") ;

			CoUninitialize() ;

			PostQuitMessage( 0 ) ;
			break ;

		default:
			return DefWindowProc( hWnd, message, wParam, lParam ) ;
	}

	return 0 ;

}

//================================================================================
// 
// 线程处理函数 9 处理 QSS 9 连接的数据
//
// ODBC 连接数据库

LRESULT WINAPI OnThreadProc9( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) 
{
	int nRet = -1 ;
	HRESULT hr ;
	hWnd9 = hWnd ;

	switch( message )
	{
		case WM_CREATE:
			hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);			/// COINIT_APARTMENTTHREADED
			if ( S_OK != hr )
				AfxMessageBox("线程九组件库初始化错误!") ;

			break ;
		case WM_TIMER:
			switch( wParam ) 
			{
				case ID_TIMER9:
					//MessageBox( NULL, "WM_TIMER","",MB_OK) ;
					nRet = QSSReadWrite( 9, strQSS[8] ) ;
					break ;
			}

			break ;
		case WM_DESTROY:
			if ( KillTimer( hWnd, ID_TIMER9 ) == 0 ) 
				AfxMessageBox("关闭定时器 9 错误") ;

			CoUninitialize() ;

			PostQuitMessage( 0 ) ;
			break ;

		default:
			return DefWindowProc( hWnd, message, wParam, lParam ) ;
	}

	return 0 ;

}

//================================================================================
// 
// 线程处理函数 10 处理 QSS 10 连接的数据
//
// ODBC 连接数据库

LRESULT WINAPI OnThreadProc10( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) 
{
	int nRet = -1 ;
	HRESULT hr ;
	hWnd10 = hWnd ;

	switch( message )
	{
		case WM_CREATE:
			hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);			/// COINIT_APARTMENTTHREADED
			if ( S_OK != hr )
				AfxMessageBox("线程十组件库初始化错误!") ;

			break ;
		case WM_TIMER:
			switch( wParam ) 
			{
				case ID_TIMER10:
					//MessageBox( NULL, "WM_TIMER","",MB_OK) ;
					nRet = QSSReadWrite( 10, strQSS[9] ) ;
					break ;
			}

			break ;
		case WM_DESTROY:
			KillTimer( hWnd, ID_TIMER10 ) ;
			PostQuitMessage( 0 ) ;
			break ;

		default:
			return DefWindowProc( hWnd, message, wParam, lParam ) ;
	}

	return 0 ;

}

////////////////////////////////////////////////////////////////////////////////////

// 读取QSS数据,并插入数据到数据库中
DWORD  QSSReadWrite( __int32 n32QssNumber,  CString strComNumber )
{
	
	char szYear[5], szMonth[5], szDay[5], szHour[5], szMinute[5], szSecond[5], szTemp[5] ;
	CString strDateTime ;
	CString strAirConditonID ;
	CString strAirConSwitch_ID, strLX_datetime ;
	CString strRunStatus, strWD, strSNWD, strPZFKD, strYXFS, strEquipeID ;
	CString strErrorCode ;

	CString strSql  ;
	CString strDBConnection ;
	CString strQssNumber, strBh, strName ;


	/// 取得当前系统本地时间
	SYSTEMTIME stSystemDateTime ;
	memset( &stSystemDateTime, 0, sizeof(SYSTEMTIME)) ;

	GetLocalTime( & stSystemDateTime ) ;

	itoa( stSystemDateTime.wYear, szYear, 10 ) ;	// 年

	if ( stSystemDateTime.wMonth < 10 )				// 月份
	{
		itoa( stSystemDateTime.wMonth, szTemp, 10 ) ;
		strcpy( szMonth, "0" ) ;
		strcat( szMonth, szTemp ) ;
	}
	else
	{
		itoa( stSystemDateTime.wMonth, szMonth, 10 ) ;
	}

	if ( stSystemDateTime.wDay < 10 )				// 日
	{
		itoa( stSystemDateTime.wDay, szTemp, 10 ) ;
		strcpy( szDay, "0" ) ;
		strcat( szDay, szTemp ) ;
	}
	else
	{
		itoa( stSystemDateTime.wDay, szDay, 10 ) ;
	}

	if ( stSystemDateTime.wHour < 10 )				// 小时
	{
		itoa( stSystemDateTime.wHour, szTemp, 10 ) ;
		strcpy( szHour, "0" ) ;
		strcat( szHour, szTemp ) ;
	}
	else
	{
		itoa( stSystemDateTime.wHour, szHour, 10 ) ;
	}

	if ( stSystemDateTime.wMinute < 10 )			// 分钟
	{
		itoa( stSystemDateTime.wMinute, szTemp, 10 ) ;
		strcpy( szMinute, "0" ) ;
		strcat( szMinute, szTemp ) ;
	}
	else
	{
		itoa( stSystemDateTime.wMinute, szMinute, 10 ) ;
	}

	if ( stSystemDateTime.wSecond < 10 )			// 秒
	{
		itoa( stSystemDateTime.wSecond, szSecond, 10 ) ;
		strcpy( szSecond, "0" ) ;
		strcat( szSecond, szTemp ) ;
	}
	else
	{
		itoa( stSystemDateTime.wSecond, szSecond, 10 ) ;
	}


	strDateTime = szYear ;
	strDateTime += "-" ;
	strDateTime += szMonth ;
	strDateTime += "-";
	strDateTime += szDay ;
	strDateTime += " " ;
	strDateTime += szHour ;
	strDateTime += ":" ;
	strDateTime += szMinute ;
	strDateTime += ":" ;
	strDateTime += szSecond ;
	
	strAirConditonID = szYear ;
	strAirConditonID += szMonth ;
	strAirConditonID += szDay ;
	strAirConditonID += szHour ;
	strAirConditonID += szMinute ;

	strLX_datetime = strDateTime ;

	// strComNumber = "com1" ;
	/// 取得通过QSS采集到的空调运行数据, 动态链接库名称 ( PMBHair.dll ) 

	int nRet = -1 ;
	AirCondState struAirCondState ;
	ZeroMemory( &struAirCondState, sizeof(AirCondState)) ;
	
	HANDLE hCom = NULL  ;									// 打开串口资源
	
	HMODULE hAirCModule = LoadLibrary( "PMBHair.dll" ) ;	// 装载动态链接库
	if ( FAILED(hAirCModule) )
		return -11 ;
			
	GetOpenDevice   getOpenDevice   ;
	GetAirCondState getAirCondState ;

	/// 得到动态链接库中的函数的地址指针
	getOpenDevice   = ( GetOpenDevice )GetProcAddress( hAirCModule , "OpenDevice" ) ;
	getAirCondState = ( GetAirCondState )GetProcAddress( hAirCModule , "GetIndoorStatus" ) ;
	/// 打开串口句柄


	hCom = getOpenDevice( strComNumber.GetBuffer(strComNumber.GetLength()), 1000 ) ;
	if ( hCom <= 0 ) 
	 	return (long)hCom;

	long lgret = GetLastError() ;

	/// 取得数据库中的空调内机信息
	/// 转换QSS编号从 int 到 CString 类型
	char	szQssNumber[4] , szIndoorNumber[4];
	itoa( n32QssNumber, szQssNumber, 10 ) ;
	strQssNumber = szQssNumber ;

	//_ConnectionPtr  m_pConnection ; /// _CommandPtr		m_pCommand ;
	//_RecordsetPtr	m_pRecordset ;

	int i = 0;
	HRESULT hr = 0 ;

	/// 调用函数取得( QSS )空调运行数据, 共 48 个内机 
	int		nIndoorNumber ;
	CString strIndoor ;
	/// char	szIndoor[4] ; 
	for ( i = 0 ; i < nEquipementCount[n32QssNumber-1] ; i ++ ) 
	{
		strIndoor = strEquipementID[n32QssNumber-1][i].Mid( 4, 2 ) ;
		nIndoorNumber = atoi( strIndoor.GetBuffer( strIndoor.GetLength() ));
		if ( nIndoorNumber < 0 || nIndoorNumber > 48 )
			AfxMessageBox("空调内机编号错误!") ;
		// 数据采集函数调用

		nRet = getAirCondState( hCom, nIndoorNumber , &struAirCondState ) ;
		if ( nRet <= 0 ) 
		{
			Sleep(1000) ;
			continue ;
		}
		else
			Sleep(1000) ;
//#####		
/*		strcpy( struAirCondState.status , "run" ) ;
		strcpy( struAirCondState.EEVOpening  , "45" ) ;
		strcpy( struAirCondState.intakeairTemp  , "20" ) ;
		strcpy( struAirCondState.operationMode  , "heating" ) ;
		strcpy( struAirCondState.setPoint , "25" ) ;
*/
		// 如果取出成功,保存数据到SQL SERVER 2000 数据库中
		itoa( i, szIndoorNumber, 10 ) ;
	
		if ( strncmp( struAirCondState.status, "run", 3 ) == 0 ) 
			strRunStatus = "0" ;
		else
			strRunStatus = "1" ;

		strWD		 = struAirCondState.setPoint ;
		strSNWD		 = struAirCondState.intakeairTemp ;
		strPZFKD	 = struAirCondState.EEVOpening ;
		strErrorCode = struAirCondState.ErrorMode ;

		// heating 1 cooling 0 blowing 2 automatic 3 drying 4
		if ( strncmp( struAirCondState.operationMode, "cooling", 7 ) == 0 ) 
			strYXFS = "0" ;
		if ( strncmp( struAirCondState.operationMode, "heating", 7 ) == 0 ) 
			strYXFS = "1" ;
		if ( strncmp( struAirCondState.operationMode, "blowing", 7 ) == 0 ) 
			strYXFS = "2" ;
		if ( strncmp( struAirCondState.operationMode, "automatic", 9 ) == 0 ) 
			strYXFS = "3" ;
		if ( strncmp( struAirCondState.operationMode, "drying", 6 ) == 0 ) 
			strYXFS = "4" ;

		strAirConSwitch_ID = strAirConditonID + strEquipementID[n32QssNumber-1][i].Mid(1, 5 ) ;

		strSql  = "INSERT INTO T_TEST1([AirConSwitch_ID], [LX_Datetime], [Equipment_ID], [Run_Status], [WD], [SNWD], [PZFKD], [YXFS],[CWM] ) VALUES( '" ;		
		strSql += strAirConSwitch_ID + "' ,'"+ strLX_datetime+ "' ,'" ;
		strSql += strEquipementID[n32QssNumber-1][i] + "' ,'"+ strRunStatus+ "' ,'"  ; 
		strSql += strWD + "' ,'"+ strSNWD + "' ,'" ;
		strSql += strPZFKD + "' ,'" + strYXFS +"' ,'"+ strErrorCode + "')" ;
	
		_variant_t	RecordsAffected ;

		try
		{
			if(m_pConnection->State)
			{	
	
				EnterCriticalSection( &criticalSection ) ;			// 进入临界区
		
				
				if(m_pConnection->State)
				{
					hr = m_pConnection->Execute( (_bstr_t)strSql, &RecordsAffected, adCmdText ) ;
					
					//Sleep(200) ;
					if ( RecordsAffected.intVal != 1 ) 
					{
						AfxMessageBox("插入内机运行数据错误!") ;
					}
				}
				else
					AfxMessageBox("数据库没有连接,请重新运行程序!") ;
				LeaveCriticalSection( &criticalSection ) ;			// 退出临界区
	
			}


		}
		catch(_com_error e)	/// 捕捉异常
		{
			CString errormessage;
			errormessage.Format("数据库插入数据失败!\r\n错误信息:%s",e.ErrorMessage());
			AfxMessageBox(errormessage);	/// 显示错误信息
			//AfxMessageBox(e.Description()) ;
			//e.WCode ;
		} 
	}


	//m_pRecordset->Close() ;

	if ( hCom != NULL )
		lgret = CloseHandle( hCom ) ;
	if ( hAirCModule != NULL )
		lgret = FreeLibrary( hAirCModule ) ;		// 释放动态链接库

//	AfxMessageBox( "QSS编号:"+ strQssNumber +"操作成功!") ;
	return 1 ;
}

void CQssReadBotDlg::OnSetqsssave() 
{
	// TODO: Add your control notification handler code here
	// 保存 QSS 通讯 COM 端口设置

	LPCTSTR hFileName = "C:\\QSS.ini" ;
	int i = 0 ;
	int nCheckRet[10] ;
	CString strCom[10]  ;
	CIni ini ;
	ini.SetPathName( hFileName ) ;

	GetDlgItemText(IDC_COMBO1, strQSS[0] ) ;
	GetDlgItemText(IDC_COMBO2, strQSS[1] ) ;
	GetDlgItemText(IDC_COMBO3, strQSS[2] ) ;
	GetDlgItemText(IDC_COMBO4, strQSS[3] ) ;
	GetDlgItemText(IDC_COMBO5, strQSS[4] ) ;
	GetDlgItemText(IDC_COMBO6, strQSS[5] ) ;
	GetDlgItemText(IDC_COMBO7, strQSS[6] ) ;
	GetDlgItemText(IDC_COMBO8, strQSS[7] ) ;
	GetDlgItemText(IDC_COMBO9, strQSS[8] ) ;
	GetDlgItemText(IDC_COMBO10, strQSS[9] ) ;

	ini.WriteString( "QSS", "QSS1", strQSS[0] ) ; 
	ini.WriteString( "QSS", "QSS2", strQSS[1] ) ; 
	ini.WriteString( "QSS", "QSS3", strQSS[2] ) ; 
	ini.WriteString( "QSS", "QSS4", strQSS[3] ) ; 
	ini.WriteString( "QSS", "QSS5", strQSS[4] ) ; 
	ini.WriteString( "QSS", "QSS6", strQSS[5] ) ; 
	ini.WriteString( "QSS", "QSS7", strQSS[6] ) ; 
	ini.WriteString( "QSS", "QSS8", strQSS[7] ) ; 
	ini.WriteString( "QSS", "QSS9", strQSS[8] ) ; 
	ini.WriteString( "QSS", "QSS10", strQSS[9] ) ; 

	nCheckRet[0] = m_Check1.GetCheck() ;
	nCheckRet[1] = m_Check2.GetCheck() ;
	nCheckRet[2] = m_Check3.GetCheck() ;
	nCheckRet[3] = m_Check4.GetCheck() ;
	nCheckRet[4] = m_Check5.GetCheck() ;
	nCheckRet[5] = m_Check6.GetCheck() ;
	nCheckRet[6] = m_Check7.GetCheck() ;
	nCheckRet[7] = m_Check8.GetCheck() ;
	nCheckRet[8] = m_Check9.GetCheck() ;
	nCheckRet[9] = m_Check10.GetCheck() ;

	ini.WriteInt( "THREAD", "THREAD1", nCheckRet[0], BASE_DECIMAL ) ; 
	ini.WriteInt( "THREAD", "THREAD2", nCheckRet[1] , BASE_DECIMAL ) ; 
	ini.WriteInt( "THREAD", "THREAD3", nCheckRet[2] , BASE_DECIMAL) ; 
	ini.WriteInt( "THREAD", "THREAD4", nCheckRet[3] , BASE_DECIMAL) ; 
	ini.WriteInt( "THREAD", "THREAD5", nCheckRet[4] , BASE_DECIMAL) ; 
	ini.WriteInt(

⌨️ 快捷键说明

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