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

📄 corearg.cpp

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

/*====================================================================================
*                                                                                    
* Subroutine  : CheckSoeData()
*                                                                                    
* Parameters  : 
*				 
*                                                                                    
* Called from :                                  
* 
* Description : 检测事件队列,list最大值超过2000弹出首值
* 
* Return	  : 
*                                     
* Modification: 
*				 2004-12-11: 
*                                                                                     
*====================================================================================*/
void CSoeData::CheckSoeData(void)
{
	int			nResult = 0;
	unsigned int	i_len = 0;
	list<SOE_STATUS>::iterator iter,iter0;
	
	sem_wait(&sem_soe);

	i_len = m_ListSoe.size();
	if (i_len > 2000) 
	{
		m_ListSoe.pop_front();
	}
	else if (i_len > 8000) 
	{
//		m_ListSoe.erase(m_ListSoe.begin(), m_ListSoe.end()+7000);
		m_ListSoe.clear();
	}

	//查找错误数据并删除
	iter = m_ListSoe.begin();
	for (iter=m_ListSoe.begin(); iter!=m_ListSoe.end(); iter++)
	{
		if (((*iter).eStation != GATE_REMOTESTATION)
			&& ((*iter).eStation != GATE_OPERATERSTATION)
			&& ((*iter).eStation != GATE_ENGINEERSTATION))
		{
			m_ListSoe.erase(iter);
		}
	}

	sem_post(&sem_soe);
	return;
}

/*====================================================================================
*                                                                                    
* Subroutine  : CheckCtrlData()
*                                                                                    
* Parameters  : 
*				 
*                                                                                    
* Called from :                                   
* 
* Description : 检测命令队列,list最大值超过2000弹出首值。当enum CMD_TYPE
*			增加命令时函数中的判断也要添加
* 
* Return	  : 
*                                     
* Modification: 
*				 2004-12-22: 
*                                                                                     
*====================================================================================*/
void CSoeData::CheckCtrlData(void)
{
	int			nResult = 0;
	unsigned int	i_len = 0;
	list<CTRL_VALUE>::iterator iter,iter0;
	
	sem_wait(&sem_soe);

	i_len = m_CtrlValue.size();
	if (i_len > 2000) 
	{
		m_CtrlValue.pop_front();
	}
	else if (i_len > 8000) 
	{
//		m_CtrlValue.erase(m_CtrlValue.begin(), m_CtrlValue.end()+7000);
		m_CtrlValue.clear();
	}

	//查找错误数据并删除
	iter = m_CtrlValue.begin();
	for (iter=m_CtrlValue.begin(); iter!=m_CtrlValue.end(); iter++)
	{
		if ( ((*iter).eCmdType != COMMAND_SEL_CTRL)		//控制选择
			&& ((*iter).eCmdType != COMMAND_EXE_CTRL)		//控制执行
			&& ((*iter).eCmdType != COMMAND_CANCEL_CTRL)	//控制撤消
			&& ((*iter).eCmdType != COMMAND_BAOHU_RESET)	//保护复归
			&& ((*iter).eCmdType != COMMAND_AMMETER)		//冻结电度
			&& ((*iter).eCmdType != COMMAND_CALI_TIME)	//对时
			&& ((*iter).eCmdType != COMMAND_SET_RYB))		//软压板
		{
			m_CtrlValue.erase(iter);
		}
	}

	sem_post(&sem_soe);
	return;
}


//----------------------------------- 设备内存数据 -----------------------------------
CDevData::CDevData()
{
	sem_init(&sem_dev, 0, 1);
}
CDevData::~CDevData()
{
	sem_destroy(&sem_dev);
}

/*====================================================================================
*                                                                                    
* Subroutine  : InsDevData()
*                                                                                    
* Parameters  : 
*				pData:设备数据结构	 
*                       count:数据的个数(以数据结构为单位)
*                                                             
* Called from :                                   
* 
* Description : 插入设备数据信息
* 
* Return	  : 返回值: 1:成功, 0:失败
*                                     
* Modification: 
*				 2004-12-25: 
*                                                                                     
*====================================================================================*/
int CDevData::InsDevData(DATAGROUP *pData, int count)
{
	int	nResult = 0;

	if (count>0) 
	{
		pair<pair<unsigned int, unsigned int>, enum DATA_TYPE>  i_pair;

		map<pair<pair<unsigned int, unsigned int>, enum DATA_TYPE>, DATAGROUP>::iterator iter;
		
		sem_wait(&sem_dev);

		for (int i=0; i<count; i++)
		{
			i_pair.first.first = pData[i].nPortNo;
			i_pair.first.second = pData[i].nSerial;
			i_pair.second = pData[i].eType;
			m_MapData.insert(map<pair<pair<unsigned int, unsigned int>, enum DATA_TYPE>, DATAGROUP>
				::value_type(i_pair, pData[i]));
		}
		sem_post(&sem_dev);
		nResult = 1;
	}

	return nResult;
}

/*====================================================================================
*                                                                                    
* Subroutine  : DelDevData()
*                                                                                    
* Parameters  : 
*				nPortNo	设备编号
*				No:		序号	 
*                       count:	数据的个数(以数据结构为单位)
*                                                             
* Called from :                                   
* 
* Description : 删除设备数据信息
* 
* Return	  : 返回值: 1:成功, 0:失败
*                                     
* Modification: 
*				 2004-12-25: 
*                                                                                     
*====================================================================================*/
int CDevData::DelDevData(unsigned int nPortNo, 
				 unsigned int *No, 
				 enum DATA_TYPE eType, 
				 int count)
{
	int	nResult = 0;

	if (count >0)
	{
		pair<pair<unsigned int, unsigned int>, enum DATA_TYPE>  i_pair;

		sem_wait(&sem_dev);
		for (int i=0; i<count; i++)
		{
			i_pair.first.first = nPortNo;
			i_pair.first.second = No[i];
			i_pair.second = eType;
			m_MapData.erase(i_pair);
		}
		sem_post(&sem_dev);
		nResult = 1;
	}
	return nResult;
}

/*====================================================================================
*                                                                                    
* Subroutine  : DelAllDevData()
*                                                                                    
* Parameters  : 
*				DevAddr:	设备地址
*                                                             
* Called from :                                   
* 
* Description : 删除全部设备数据信息
* 
* Return	  : 返回值: 1:成功, 0:失败
*                                     
* Modification: 
*				 2004-12-25: 
*                                                                                     
*====================================================================================*/
int CDevData::DelAllDevData(unsigned int nPortNo)
{
	int num = 0;

	pair<pair<unsigned int, unsigned int>, enum DATA_TYPE>  i_pair;
	map<pair<pair<unsigned int, unsigned int>, enum DATA_TYPE>, DATAGROUP>::iterator iter;

	sem_wait(&sem_dev);

	iter = m_MapData.begin();
	while (iter != m_MapData.end())
	{
		if (nPortNo==(*iter).second.nPortNo)
		{
			i_pair.first.first = (*iter).second.nPortNo;
			i_pair.first.second = (*iter).second.nSerial;
			i_pair.second = (*iter).second.eType;
			m_MapData.erase(i_pair);
			iter = m_MapData.begin();
			num++;		  
		}
		else
		{
			iter++;
		}
	}
	sem_post(&sem_dev);

	return num;
}

/*====================================================================================
*                                                                                    
* Subroutine  : CountDevData()
*                                                                                    
* Parameters  : 
*				nPortNo:	设备编号	 
*				eType:	数据类型
*                                                                                    
* Called from :                                   
* 
* Description : 返回指定装置和类型的数据分组信息记录
* 
* Return	  : 返回值: 记录个数num
*                                     
* Modification: 
*				 2004-12-25: 
*                                                                                     
*====================================================================================*/
int CDevData::CountDevData(unsigned int nPortNo, enum DATA_TYPE eType)
{
	int num = 0;

	map<pair<pair<unsigned int, unsigned int>, enum DATA_TYPE>, DATAGROUP>::iterator iter;

	sem_wait(&sem_dev);
	for (iter=m_MapData.begin(); iter!=m_MapData.end(); iter++)
	{
		if ((nPortNo==(*iter).second.nPortNo)
			&& (eType==(*iter).second.eType))
		{
			num++;
		}
	}
	sem_post(&sem_dev);

	return num;
}

/*====================================================================================
*                                                                                    
* Subroutine  : GetFixDevData()
*                                                                                    
* Parameters  : 
*				nPortNo:	设备编号	 
*				no:		序号
*				pData:	设备数据结构
*                                                                                    
* Called from :                                   
* 
* Description : 返回指定装置和序号的指定数据信息记录(根据设备编号/序号找实际值)
* 
* Return	  : 返回值: 1:记录存在, 0:记录不存在
*                                     
* Modification: 
*				 2004-12-25: 
*                                                                                     
*====================================================================================*/
int CDevData::GetFixDevData(unsigned int nPortNo, 
				    unsigned int no, 
				    enum DATA_TYPE eType, 
				    DATAGROUP &pData)
{
	int ret = 0;

	map<pair<pair<unsigned int, unsigned int>, enum DATA_TYPE>, DATAGROUP>::iterator iter;

	sem_wait(&sem_dev);
	for (iter=m_MapData.begin(); iter!=m_MapData.end(); iter++)
	{
		if ((nPortNo==(*iter).second.nPortNo)
			&& (no==(*iter).second.nSerial)
			&& (eType==(*iter).second.eType))
		{
			pData = (*iter).second;
			ret = 1;
			break;
		}
	}
	sem_post(&sem_dev);

	return ret;
}

⌨️ 快捷键说明

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