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

📄 baserule.cpp

📁 此程序适用于电力系统中的网关程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:

	DWORD C_Rtimeout = 3000;
	DWORD C_RtimeMilti = 20;

	memcpy(&portname, m_szComm, 0);	//m_szComm在config.txt中配置
	ret = CommCheck(portname);
	if (ret!=0)
	{
		return true;
	}
	
	sprintf(cportname,"\\\\.\\%s",portname);
	
	if ((m_ComInfo[m_bComIndex].hcom = 
		CreateFile(cportname, 
		GENERIC_READ | GENERIC_WRITE, 0, NULL,
		OPEN_EXISTING, 
		FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, 
		NULL))
		== INVALID_HANDLE_VALUE)
	{
		derr = GetLastError();
		return false;
	}
	ClearCommError(m_ComInfo[m_bComIndex].hcom,&dwerr,NULL);
	
	derr=GetLastError();
	if(derr!=0) 
	{
		return false;
	}
	
	SetCommMask(m_ComInfo[m_bComIndex].hcom, EV_RXCHAR);
	SetupComm(m_ComInfo[m_bComIndex].hcom, 1024, 1024);
	derr=GetLastError();
	if(derr!=0) 
	{
		CloseHandle( m_ComInfo[m_bComIndex].hcom );
		return false;
	}
	///////////////////////////////////////
	//{
	m_hCom = m_ComInfo[m_bComIndex].hcom;
	m_ComInfo[m_bComIndex].flag = 1;
	//}
	///////////////////////////////////////
	GetCommState(m_ComInfo[m_bComIndex].hcom,&dcb);
	
	dcb.BaudRate = m_dbBaudRate;		//波特率baud;
	dcb.ByteSize = m_bByteSize; 		//数据位number of bits/byte, 4-8
	dcb.Parity = m_bParity;			//校验位0-4=no,odd,even,mark,space
	dcb.StopBits = m_bStopBits;		//停止位0,1,2 = 1, 1.5, 2

  	SetCommState(m_ComInfo[m_bComIndex].hcom, &dcb);
  	derr=GetLastError();
	COMMTIMEOUTS CommTimeOuts;
	CommTimeOuts.ReadIntervalTimeout = 0x100;
	CommTimeOuts.ReadTotalTimeoutMultiplier = C_RtimeMilti;
	CommTimeOuts.ReadTotalTimeoutConstant = C_Rtimeout;
	CommTimeOuts.WriteTotalTimeoutMultiplier = 10;
	CommTimeOuts.WriteTotalTimeoutConstant =3000;
	SetCommTimeouts(m_ComInfo[m_bComIndex].hcom, &CommTimeOuts);
   	derr=GetLastError();

	PurgeComm(m_ComInfo[m_bComIndex].hcom,PURGE_TXCLEAR|PURGE_RXCLEAR);

	return true;
}

/*====================================================================================
*                                                                                    
* Subroutine  : CommCheck()
*                                                                                    
* Parameters  : 
*				 
*                                                                                    
* Called from : CommConnect()                                    
* 
* Description : 串口检测
* 
* Return	  :
*                                             
* Modification: 
*				 2004-11-10: 
*                                                                                     
*====================================================================================*/
int BaseRule::CommCheck(char *sysname)
{
	int	i = 0;
	int	ret = false;

	if (m_bComIndex > 0)
	{//更换
		m_ComInfo[m_bComIndex].flag--;
		if (m_ComInfo[m_bComIndex].flag <= 0)
		{
			CloseHandle(m_ComInfo[m_bComIndex].hcom);
			m_ComInfo[m_bComIndex].hcom = NULL;
		}
		m_bComIndex = 0;
	}

	if (m_bComIndex <= 0)
	{
		for (i=0; i<MAXCOMCOUNT; i++)
		{
			if (!strcmp(m_ComInfo[i].name, sysname))
			{
				m_bComIndex = i;
				if (m_ComInfo[i].flag > 0)break;
			}
		}
		if (i < MAXCOMCOUNT)
		{
			m_hCom = m_ComInfo[i].hcom;
			m_ComInfo[i].flag ++;
			ret = true;
		}
	}

	return ret;
}

/*====================================================================================
*                                                                                    
* Subroutine  : RS232Send()
*                                                                                    
* Parameters  : 
*				 
*                                                                                    
* Called from : RuleLoop()                                    
* 
* Description : 写串口发送数据
* 
* Return	  :
*                                             
* Modification: 
*				 2004-11-10: 
*                                                                                     
*====================================================================================*/
int BaseRule::RS232Send()
{
	OVERLAPPED OlWRtu; 
	DWORD byte1,byte2=0;
	BOOL waitflag;

	memset(&OlWRtu,0,sizeof(OlWRtu));
	OlWRtu.hEvent=NULL;
		
	if (m_ComInfo[m_bComIndex].hcom != NULL) 
	{
		WriteFile(m_ComInfo[m_bComIndex].hcom, m_bSendBuf, m_wSendLen, &byte1, &OlWRtu);
		waitflag = GetOverlappedResult(m_ComInfo[m_bComIndex].hcom, &OlWRtu, &byte2, TRUE);
	}
	
	if( (int) byte2!=m_wSendLen) 
	{
		byte2 = -1;
	}
	return byte2;
}

/*====================================================================================
*                                                                                    
* Subroutine  : RS232Read()
*                                                                                    
* Parameters  : nLength 读取的最大长度
*				 
*                                                                                    
* Called from : RuleLoop()                                    
* 
* Description : 读串口接收数据
* 
* Return	  :
*                                             
* Modification: 
*				 2004-11-10: 
*                                                                                     
*====================================================================================*/
int BaseRule::RS232Read(int n)
{
	OVERLAPPED OlWRtu; 
	DWORD byte1,byte2=0;
	BOOL waitflag=FALSE;
	
	memset(&OlWRtu,0,sizeof(OlWRtu));
	OlWRtu.hEvent=NULL;
	
	if(m_ComInfo[m_bComIndex].hcom != NULL) 
	{
		ReadFile(m_ComInfo[m_bComIndex].hcom, m_bRevBuf, n, &byte1, &OlWRtu);
		waitflag = GetOverlappedResult(m_ComInfo[m_bComIndex].hcom, &OlWRtu, &byte2, TRUE);
	}
	
	if(waitflag && byte2>0 )
	{
		m_wSendLen = (short)byte2;
		byte2 = -1;
	}
	return byte2;
}

/*====================================================================================
*                                                                                    
* Subroutine  : SetNetState()
*                                                                                    
* Parameters  : state: 通道的状态
*				 
*                                                                                    
* Called from :                                     
* 
* Description : 设置网络状态
* 
* Return	  : 
*                                     
* Modification: 
*				 2004-12-09: 
*                                                                                     
*====================================================================================*/
void BaseRule::SetNetState(enum GateDevStatus state)
{
	GateNetAddr  n_addr;
	g_glonet.GetNetAddr(n_addr);
	switch(m_nPortNo)
	{
	case RULE_CDT:  //CDT规约
		{
			break;
		}
	case RULE_ENGINEER:  //103规约,工程师站
		{
			n_addr.ENGINEERNet.eNetState = state;
			break;
		}
	case RULE_REMOTE: //104规约,远动站
		{
			n_addr.REMOTENet.eNetState = state;
			break;		
		}
	case RULE_OPERATER: //104规约,操作员站
		{
			n_addr.OPERATERNet.eNetState = state;
			break;		
		}
	default:
		break;
	}	
	g_glonet.InsNetAddr(n_addr);
}

/*====================================================================================
*                                                                                    
* Subroutine  : GetNetAddr()
*                                                                                    
* Parameters  : netaddr: IP和端口号对
*				 
*                                                                                    
* Called from :                                 
* 
* Description : 读取网络状态
* 
* Return	  : 
*                                     
* Modification: 
*				 2004-12-11: 
*                                                                                     
*====================================================================================*/
void BaseRule::GetNetAddr(GateIpPort &netaddr)
{
	GateNetAddr  n_addr;
	g_glonet.GetNetAddr(n_addr);
	switch(m_nPortNo)
	{
	case RULE_CDT:  //CDT规约
		{
			break;
		}
	case RULE_ENGINEER:  //103规约,工程师站
		{
			memcpy(&netaddr, &n_addr.ENGINEERNet, sizeof(GateIpPort));//确认OPERATENet??
			break;
		}
	case RULE_REMOTE: //104规约,远动站
		{
			memcpy(&netaddr, &n_addr.REMOTENet, sizeof(GateIpPort));//确认OPERATENet??
			break;		
		}
	case RULE_OPERATER: //104规约,操作员站
		{
			memcpy(&netaddr, &n_addr.OPERATERNet, sizeof(GateIpPort));//确认OPERATENet??
			break;		
		}
	default:
		break;
	}	
	return;
}

/*====================================================================================
*                                                                                    
* Subroutine  : GetGateStation()
*                                                                                    
* Parameters  : eStation: 站类型
*				 
*                                                                                    
* Called from :                                  
* 
* Description : 读取站类型
* 
* Return	  : 
*                                     
* Modification: 
*				 2004-12-24: 
*                                                                                     
*====================================================================================*/
void BaseRule::GetGateStation(enum GateStation &eStation)
{
	switch(m_nPortNo)
	{
	case RULE_CDT:  //CDT规约
		{
			break;
		}
	case RULE_ENGINEER:  //103规约,工程师站
		{
			eStation = GATE_ENGINEERSTATION;
			break;
		}
	case RULE_REMOTE: //104规约,远动站
		{
			eStation = GATE_REMOTESTATION;
			break;		
		}
	case RULE_OPERATER: //104规约,操作员站
		{
			eStation = GATE_OPERATERSTATION;
			break;		
		}
	default:
		break;
	}	
}

/*====================================================================================
*                                                                                    
* Subroutine  : ReadConfig()
*                                                                                    
* Parameters  :	
*			
*               
*                                                                                    
* Called from : BaseRule()
* 
* Description : 读取103遥信信息表
* 
* Return	  : 
*               
*                                             
* Modification: 
*				 2004-07-29: 
*                                                                                     
*====================================================================================*/
void BaseRule::ReadConfig()
{
	FILE*		fp = NULL;

	m_iAddress = 0;
	m_iPort = 0;
	memset(m_szIPAddress, 0, sizeof(char)*20);
	memset(m_szComm, 0, sizeof(char)*20);

	m_dbBaudRate = 9600;	//波特率baud;
	m_bByteSize = 8;		//数据位number of bits/byte, 4-8 
	m_bParity = 0;		//校验位0-4=no,odd,even,mark,space 
	m_bStopBits = 0;		//停止位0,1,2 = 1, 1.5, 2
	
	fp = fopen("config.txt", "r");
	if (fp == NULL)
	{
		strcpy(m_szIPAddress, "10.100.100.7");
		m_iAddress = 1;
		m_iPort = 2403;
	}
	else
	{
		//地址
		m_iAddress = GetFileValue(fp);
		//IP地址
		GetFileChar(fp, m_szIPAddress);
		//IP端口号
		m_iPort = GetFileValue(fp);
		//串口地址
		GetFileChar(fp, &m_szComm[0]);
		//波特率baud
		m_dbBaudRate = GetFileValue(fp);
		//数据位number of bits/byte, 4-8 
		m_bByteSize = GetFileValue(fp);
		//校验位0-4=no,odd,even,mark,space 
		m_bParity = GetFileValue(fp);
		//停止位0,1,2 = 1, 1.5, 2
		m_bStopBits = GetFileValue(fp);

		if (fp != NULL)
		{
			fclose(fp);
		}
	}	
}

/*====================================================================================
*                                                                                    
* Subroutine  : GetFileValue()
*                                                                                    
* Parameters  :	
*			
*               
*                                                                                    
* Called from : ReadConfig()
* 
* Description : 读文件数据
* 
* Return	  : 
*               
*                                             
* Modification: 
*				 2004-07-29: 
*                                                                                     
*====================================================================================*/
DWORD BaseRule::GetFileValue(FILE *fp)
{
	int val,idx;
	char szStr[80];
	char szNum[20];
	string s;

	fscanf(fp, "%s\n", szStr);		//position year
	s = szStr;
	idx = s.find('=');
	memcpy(szNum, &szStr[idx+1], 20);
	val = atoi(szNum);
	return val;
}

/*====================================================================================
*                                                                                    
* Subroutine  : GetFileChar()
*                                                                                    
* Parameters  :	FILE *fp : 读取的文件
*			char* pcRead : 读到的字符内容首地址
*               
*                                                                                    
* Called from : ReadConfig()
* 
* Description : 读文件字符串
* 
* Return	  : 
*               
*                                             
* Modification: 
*				 2004-07-29: 
*                                                                                     
*====================================================================================*/
void BaseRule::GetFileChar(FILE *fp, char pcRead[])
{
	int idx;
	char szStr[80];
	string s;

	fscanf(fp, "%s\n", szStr);
	s = szStr;
	idx = s.find('=');
	memcpy(pcRead, &szStr[idx+1], 20);
}

⌨️ 快捷键说明

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