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

📄 cdt.cpp

📁 此程序适用于电力系统中的网关程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
*               
* Modification: 
*				 2004-11-28: 
*                                                                                     
*====================================================================================*/
int CCDT::GetFunType(enum FUNC_TYPE &eFunc)
{
	unsigned char	bFunc;		//功能码
	bool			bResult = 1;	//返回值
	bFunc = m_bInfoBuf[0];

	if (m_bControl==0)
	{
		if (bFunc >= 0x00 && bFunc < 0x80 ) 
		{
			eFunc = FUNC_YC;			//遥测
		}
		else if (bFunc == 0x8a) 
		{
			eFunc = FUNC_HZ;			//频率
		}
		else if ((bFunc >=0x8d) && (bFunc<0x93))
		{
			eFunc = FUNC_WHITE;		//水位
		}
		else if ((bFunc >= 0x86) && (bFunc <= 0x89)) 
		{
			eFunc = FUNC_YC_ADD;		//总加遥测
		}
		else if ((bFunc >= 0xf0) && (bFunc <= 0xff))  
		{
			eFunc = FUNC_YX;		//遥信
		}
		else if (bFunc == 0xe1) 
		{
			eFunc = FUNC_YK_UP;	//遥控返校
		}
		else if (bFunc == 0xe5) 
		{
			eFunc = FUNC_YT_UP;	//升降返校
		}
		else if ((bFunc >= 0xa0) && (bFunc < 0xe0))
		{
			eFunc = FUNC_DD;		//电能脉冲,D2帧
		}
		else if ((bFunc == 0x80) || (bFunc==0x81))
		{
			eFunc = FUNC_SOE;		//事件顺序纪录
		}
		else
		{
			bResult = 0;
		}
				
	}
	else 
	{
//		if ((m_bFrameType == 0x3d) && ((eFunc>=0x00) && (eFunc< 0x40))) 
//		{
//			eFunc = BAOHU_KIND;
//		}
//		else if ((m_bFrameType == 0x3d) && (eFunc ==0x96)) 
//		{//notify
//			if(m_bInfoBuf[1] ==0xa5) Fill_BaohuValueEvt(0,0,PortNo); //ok
//			else Fill_BaohuValueEvt(0,1,PortNo);		//fail
//			return;
//		}
//		else return;
		bResult = 0;
	}

	return bResult;
}

/*====================================================================================
*                                                                                    
* Subroutine  : PutYC()
*                                                                                    
* Parameters  : 
*				 
*                                                                                    
* Called from : UnpackData()                                    
* 
* Description : 存储遥测数值,按照60870系列格式。
* 
* Return	  : 
*                   
* Modification: 
*				 2004-11-28: 
*                                                                                     
*====================================================================================*/
void CCDT::PutYC(void)
{
	unsigned short	nOrder = 0;		//序号
	unsigned short	nValue = 0;		//数值
	unsigned short	nData = 0;		//上送数据
	DATAGROUP		DataGroup;		//存储数据结构体

	memset(&DataGroup, 0x00, sizeof(DATAGROUP));
	nOrder = m_bInfoBuf[0] * 2;

	for (int i=0; i<2; i++)
	{
		nValue = m_bInfoBuf[i*2+1] + (m_bInfoBuf[i*2+2] & 0x07) * 0x100;
		DataGroup.bLocal = 0;
		DataGroup.eType = DATA_YC;
//		DataGroup.nAddress = m_nAddr;
		DataGroup.nPortNo = m_nPortNo;
		DataGroup.nSerial = nOrder +i;
		nData = (nValue & 0x07ff) >> 3;

		//负数
		if (m_bInfoBuf[i*2+2] & 0x08)
		{
			nData =  nData | 0x80;
		}
		if (m_bInfoBuf[i*2+2] & 0x80)
		{
			nData =  nData | 0x02;	//无效
		}
		else if (m_bInfoBuf[i*2+2] & 0x40)
		{
			nData =  nData | 0x01;	//溢出
		}
		DataGroup.nValue = nData;
		g_devdata.InsDevData(&DataGroup, 1);
	}
	return;
}

/*====================================================================================
*                                                                                    
* Subroutine  : PutYX()
*                                                                                    
* Parameters  : 
*				 
*                                                                                    
* Called from : UnpackData()                                    
* 
* Description : 存储遥信值,如果与内存中的不一致就认为是遥信变位。
* 
* Return	  : 
*                   
* Modification: 
*				 2004-11-28: 
*                                                                                     
*====================================================================================*/
void CCDT::PutYX(void)
{
	int			nOrder = 0;		//序号
	unsigned short	nValue = 0;		//数值
	int			nNumber = 0;	//存储序号
	int			i = 0;		//一般变量
	int			j = 0;		//一般变量
	SYSTEMTIME		systime;		//时间结构体
	DATAGROUP		DataGroup;		//存储数据结构体
	SOE_STATUS		SoeStatus;		//事件结构体	

	memset(&SoeStatus, 0, sizeof(SOE_STATUS));
	memset(&DataGroup, 0x00, sizeof(DATAGROUP));
	GetLocalTime(&systime);
	nOrder = (m_bInfoBuf[0] - 0xf0) * 32;

	for (i=0; i<4; i++)
	{
		unsigned char m = 0;
		for (j=0; j<8; j++)
		{
			nNumber = nOrder + i*8 + j;
			m = 1 << j;
			if ((m_bInfoBuf[i+1] & m)== 0x00 ) 
			{
				nValue = 1;//换算成双点
			}
			else 
			{
				nValue = 2;
			}

			g_devdata.GetFixDevData(m_nPortNo, nNumber, DATA_YX, DataGroup);
			if (DataGroup.nValue != nValue)
			{
				if (m_nCtrlNumber = nNumber)
				{
					PutYK(INFDATA_YK_EXE, false);	//遥控执行成功
				}
				SoeStatus.bAddress = 0x01;	//固定值??
				SoeStatus.nPot = nNumber;
				SoeStatus.bStatus = nValue;
				SoeStatus.wMilliseconds = systime.wMilliseconds + (systime.wSecond & 0xff) * 1000;
//				SoeStatus.bSecond = systime.wMilliseconds / 1000;
				SoeStatus.bMinute = systime.wMinute & 0x3f;
				SoeStatus.bHour = systime.wHour & 0x1f;
				SoeStatus.bDay = systime.wDay & 0x3f;
				SoeStatus.eType = INFDATA_YX;

				SoeStatus.eStation = GATE_REMOTESTATION;	//远动站
				g_soedata.InsSoeData(SoeStatus);
				SoeStatus.eStation = GATE_OPERATERSTATION;	//操作员站
				g_soedata.InsSoeData(SoeStatus);
				SoeStatus.eStation = GATE_ENGINEERSTATION;	//工程师站
				g_soedata.InsSoeData(SoeStatus);
				g_devdata.InsDevData(&DataGroup, 1);
			}
		}
	}
	return;
}

/*====================================================================================
*                                                                                    
* Subroutine  : PutSOE()
*                                                                                    
* Parameters  : 
*				 
*                                                                                    
* Called from : UnpackData()                                    
* 
* Description : 存储事件进队列。
* 
* Return	  : 
*                   
* Modification: 
*				 2004-11-28: 
*                                                                                     
*====================================================================================*/
void CCDT::PutSOE(void)
{
	SOE_STATUS		SoeStatus;		//事件结构体	

	memset(&SoeStatus, 0, sizeof(SOE_STATUS));

	if(m_bInfoBuf[0]==0x80)
	{
		m_bSoe80 = 0x80;
		memcpy(&m_bSoeBuf[0],&m_bInfoBuf[0],6);
	}
	if(m_bInfoBuf[0]==0x81 && m_bSoe80 == 0x80)
	{
		m_bSoe80 = 0x00;
		memcpy(&m_bSoeBuf[6],&m_bInfoBuf[0],6);

		SoeStatus.bAddress = 0x01;	//固定值??
		SoeStatus.nPot = m_bSoeBuf[9] + (m_bSoeBuf[10] & 0x0f) * 256;
		SoeStatus.bStatus = m_bSoeBuf[10] & 0x80;
		SoeStatus.wMilliseconds = (m_bSoeBuf[2] & 0x03 ) * 256 + m_bSoeBuf[1] 
			+ (m_bSoeBuf[3] & 0x3f) * 1000;
//		SoeStatus.bSecond = m_bSoeBuf[3];
		SoeStatus.bMinute = m_bSoeBuf[4];
		SoeStatus.bHour = m_bSoeBuf[7];
		SoeStatus.bDay = m_bSoeBuf[8];
		SoeStatus.eType = INFDATA_SOE;
//		SoeStatus.wSerial = m_bSoeBuf[9] + (m_bSoeBuf[10] & 0x0f) * 0x100;

		SoeStatus.eStation = GATE_REMOTESTATION;	//远动站
		g_soedata.InsSoeData(SoeStatus);
		SoeStatus.eStation = GATE_OPERATERSTATION;	//操作员站
		g_soedata.InsSoeData(SoeStatus);
		SoeStatus.eStation = GATE_ENGINEERSTATION;	//工程师站
		g_soedata.InsSoeData(SoeStatus);
	}
	return;
}

/*====================================================================================
*                                                                                    
* Subroutine  : PutDD()
*                                                                                    
* Parameters  : 
*				 
*                                                                                    
* Called from : UnpackData()                                    
* 
* Description : 存储电度值。
* 
* Return	  : 
*                   
* Modification: 
*				 2004-11-28: 
*                                                                                     
*====================================================================================*/
void CCDT::PutDD(void)
{
	unsigned short	nOrder = 0;		//序号
	DATAGROUP		DataGroup;		//存储数据结构体

	memset(&DataGroup, 0x00, sizeof(DATAGROUP));

	nOrder = m_bInfoBuf[0] - 0xa0;
	DataGroup.bLocal = 0;
	DataGroup.eType = DATA_DD;
//	DataGroup.nAddress = m_nAddr;
	DataGroup.nPortNo = m_nPortNo;
	DataGroup.nSerial = nOrder;
	DataGroup.nValue = (((m_bInfoBuf[4]&0x0f) * 256 + m_bInfoBuf[3]) * 256
		+ m_bInfoBuf[2]) * 256 + m_bInfoBuf[1];
	g_devdata.InsDevData(&DataGroup, 1);

	return;
}

/*====================================================================================
*                                                                                    
* Subroutine  : PutYK()
*                                                                                    
* Parameters  : 
*					eType:	信息类型,区分遥控选择和执行
*					bFailFlag:	缺省参数,遥控成功或失败标志,缺省为成功
*                                                                                    
* Called from : UnpackData()                                    
* 
* Description : 存储遥控返校信息。
* 
* Return	  : 
*                   
* Modification: 
*				 2004-12-28: 
*                                                                                     
*====================================================================================*/
void CCDT::PutYK(enum INFO_TYPE eType, bool bFailFlag)
{
	SYSTEMTIME		systime;		//时间结构体
	SOE_STATUS		SoeStatus;		//事件结构体	

	memset(&SoeStatus, 0, sizeof(SOE_STATUS));
	GetLocalTime(&systime);
	SoeStatus.bAddress = 0x01;		//固定值??
//	SoeStatus.nPot = m_bInfoBuf[2];

	if (eType == INFDATA_YK_EXE)
	{
		SoeStatus.nPot = m_nCtrlNumber;
		if (bFailFlag)
		{
			SoeStatus.bStatus = 0;		
		}
		else
		{
			SoeStatus.bStatus = m_bCtrlType;
		}

	}
	else if (eType == INFDATA_YK_SEL)
	{
		if (bFailFlag)	//遥控失败
		{
			SoeStatus.nPot = m_nCtrlNumber;
			SoeStatus.bStatus = 0x00;	
		}
		else
		{
			SoeStatus.nPot = m_bInfoBuf[2];
			if (m_bInfoBuf[1] == 0x33)
			{
				SoeStatus.bStatus = 1;
			}
			else if (m_bInfoBuf[1] == 0xcc)
			{
				SoeStatus.bStatus = 2;
			}
			else
			{
				SoeStatus.bStatus = 0;
			}
		}
	}
	SoeStatus.wMilliseconds = systime.wMilliseconds + (systime.wSecond & 0xff) * 1000;
	SoeStatus.bMinute = systime.wMinute & 0x3f;
	SoeStatus.bHour = systime.wHour & 0x1f;
	SoeStatus.bDay = systime.wDay & 0x3f;
	SoeStatus.eType = eType;

	SoeStatus.eStation = GATE_REMOTESTATION;		//远动站
	g_soedata.InsSoeData(SoeStatus);
	SoeStatus.eStation = GATE_OPERATERSTATION;	//操作员站
	g_soedata.InsSoeData(SoeStatus);
	SoeStatus.eStation = GATE_ENGINEERSTATION;	//工程师站
	g_soedata.InsSoeData(SoeStatus);

	m_nCtrlNumber = 0;
	m_bCtrlType = 0;
	return;
}

/*====================================================================================
*                                                                                    
* Subroutine  : PutHZ()
*                                                                                    
* Parameters  : 
*				 
*                                                                                    
* Called from : UnpackData()                                    
* 
* Description : 存储频率值。
* 
* Return	  : 
*                   
* Modification: 
*				 2004-12-28: 
*                                                                                     
*====================================================================================*/
void CCDT::PutHZ(void)
{
	unsigned short	nOrder = 0;		//序号
	int			val1 = 0;		//数值1
	int			val2 = 0;		//数值2
	DATAGROUP		DataGroup;		//存储数据结构体

	memset(&DataGroup, 0x00, sizeof(DATAGROUP));

	nOrder = m_bInfoBuf[0] - 0x8a;
	DataGroup.bLocal = 0;
	DataGroup.eType = DATA_HZ;
//	DataGroup.nAddress = m_nAddr;
	DataGroup.nPortNo = m_nPortNo;
	DataGroup.nSerial = nOrder;
	val1 = HexToBCD(m_bInfoBuf[1]);
	val2 = HexToBCD(m_bInfoBuf[2]);
	if ((val1>=0) && (val2>=0))
	{
		DataGroup.nValue = val1 + val2 * 100;
		g_devdata.InsDevData(&DataGroup, 1);
	}

	return;
}

/*====================================================================================
*                                                                                    
* Subroutine  : PackData()

⌨️ 快捷键说明

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