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

📄 cdt.cpp

📁 此程序适用于电力系统中的网关程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
*                                                                                    
* Parameters  : 
*				 
*                                                                                    
* Called from : RuleLoop()                                    
* 
* Description : 打包处理,下发命令主要有以下几个
*			COMMAND_SEL_CTRL,		//控制选择
*			COMMAND_EXE_CTRL,		//控制执行
*			COMMAND_CANCEL_CTRL,	//控制撤消
*			COMMAND_BAOHU_RESET,	//保护复归
*			COMMAND_AMMETER,		//冻结电度
*			COMMAND_CALI_TIME,	//对时
*			COMMAND_SET_RYB		//软压板
* 
* Return	  : 
*                                     
* Modification: 
*				 2004-12-25: 
*                                                                                     
*====================================================================================*/
void CCDT::PackData(void)
{
	int			nResult = 0;	//常用变量,返回值
	unsigned short	nTime = 0;		//时间变量
	int			nOffset = 0;	//延时时间
	SYSTEMTIME		newtime;		//时间结构
	CTRL_VALUE		CtrlValue;		//下发命令结构体
	PansTime		pt;			//时间类

	memset(&CtrlValue, 0x00, sizeof(CTRL_VALUE));

	nResult = TimeCheck();
	if (nResult != 0)
	{
		return;
	}

	nResult = g_soedata.GetCtrlData(CtrlValue);
	if (nResult == 0)
	{
		m_eCmdCode = COMMAND_NONE;
	}
	else
	{
		m_eCmdCode = CtrlValue.eCmdType;
	}
	switch (m_eCmdCode)
	{
	case COMMAND_SEL_CTRL:		//控制选择
		m_bSendBuf[6] = 0x71;
		m_bSendBuf[7] = 0x61;
		m_bSendBuf[8] = 0x03;
		m_bSendBuf[9] = CtrlValue.bAddress;//RtuID;??配置
		m_bSendBuf[10] = 0x01;//配置??
		CheckSendCode(6);

		m_bSendBuf[12] = 0xe0;
		if (CtrlValue.iValue == 1)
		{
			m_bSendBuf[13] = 0x33;
		}
		else if (CtrlValue.iValue == 2)
		{
			m_bSendBuf[13] = 0xcc;
		}
		m_bSendBuf[14] = CtrlValue.nPotValue;
		m_bSendBuf[15] = m_bSendBuf[13];
		m_bSendBuf[16] = m_bSendBuf[14];
		CheckSendCode(12);

		memcpy(&m_bSendBuf[18], &m_bSendBuf[12], 6);	//连送三个相同的信息字
		memcpy(&m_bSendBuf[24], &m_bSendBuf[12], 6);
		m_wSendLen = 30;
		m_nCtrlNumber = CtrlValue.nPotValue;
		m_bCtrlType = CtrlValue.iValue;
		break;
	case COMMAND_EXE_CTRL:		//控制执行
		m_bSendBuf[6] = 0x71;
		m_bSendBuf[7] = 0xc2;
		m_bSendBuf[8] = 0x03;
		m_bSendBuf[9] = CtrlValue.bAddress;//RtuID;??配置
		m_bSendBuf[10] = 0x01;//配置??
		CheckSendCode(6);

		m_bSendBuf[12] = 0xe2;
		m_bSendBuf[13] = 0xaa;
		m_bSendBuf[14] = CtrlValue.nPotValue;
		m_bSendBuf[15] = m_bSendBuf[13];
		m_bSendBuf[16] = m_bSendBuf[14];
		CheckSendCode(12);

		memcpy(&m_bSendBuf[18], &m_bSendBuf[12], 6);	//连送三个相同的信息字
		memcpy(&m_bSendBuf[24], &m_bSendBuf[12], 6);
		m_wSendLen = 30;
		m_nCtrlNumber = CtrlValue.nPotValue;
		m_bCtrlType = CtrlValue.iValue;
		break;
	case COMMAND_CANCEL_CTRL:		//控制撤消
		m_bSendBuf[6] = 0x71;
		m_bSendBuf[7] = 0xb3;
		m_bSendBuf[8] = 0x03;
		m_bSendBuf[9] = CtrlValue.bAddress;//RtuID;??配置
		m_bSendBuf[10] = 0x01;//配置??
		CheckSendCode(6);

		m_bSendBuf[12] = 0xe3;
		m_bSendBuf[13] = 0x55;
		m_bSendBuf[14] = CtrlValue.nPotValue;
		m_bSendBuf[15] = m_bSendBuf[13];
		m_bSendBuf[16] = m_bSendBuf[14];
		CheckSendCode(12);

		memcpy(&m_bSendBuf[18], &m_bSendBuf[12], 6);	//连送三个相同的信息字
		memcpy(&m_bSendBuf[24], &m_bSendBuf[12], 6);
		m_wSendLen = 30;
		break;
 	case COMMAND_BAOHU_RESET:		//保护复归
		m_bSendBuf[6] = 0x31;
		m_bSendBuf[7] = 0x3d; 
		m_bSendBuf[8] = 0x00;
		m_bSendBuf[9] = CtrlValue.bAddress;//RtuID;??
		m_bSendBuf[10] = 0x01;
		CheckSendCode(6);
		m_wSendLen = 12;

//		m_bSendBuf[6] = 0xf0;	//自定义格式
//		m_bSendBuf[7] = 0x3d; 
//		m_bSendBuf[8] = 0x01;
//		m_bSendBuf[9] = RtuID;
//		m_bSendBuf[10] = 0x01;
//		Check_SendCode(6);

//		m_bSendBuf[12] = 0x9f;
//		m_bSendBuf[13] = 0xaa; 
//		m_bSendBuf[14] = rtu_debug.pdata[0];
//		m_bSendBuf[15] = 0xaa;
//		m_bSendBuf[16] = SendBuf[14];
//		Check_SendCode(12);
//		m_wSendLen = 18;
		break;
	case COMMAND_AMMETER:			//冻结电度
		m_bSendBuf[6] = 0x21;
		m_bSendBuf[7] = 0x9e; 
		m_bSendBuf[8] = 0x00;
		m_bSendBuf[9] = CtrlValue.bAddress;//RtuID;??
		m_bSendBuf[10] = 0xff;		//广播命令
		CheckSendCode(6);
		m_wSendLen = 12;
		break;
	case COMMAND_CALI_TIME:			//对时
		m_bSendBuf[6] = 0x70;
		m_bSendBuf[7] = 0x7a;
		m_bSendBuf[8] = 0x02;
		m_bSendBuf[9] = CtrlValue.bAddress;//RtuID;配置
		m_bSendBuf[10]= 0x01;				//destination
		CheckSendCode(6);
		m_bSendBuf[12]= 0xee;

//		try
//		{
//			Fetch_VDTSysInfo(PortNo,BAUD,(void *)&baud);
//			msoff= 240000/baud;
//		}
//		catch( ... ) {}
//		SYSTEMTIME newtime;
		pt.GetCurTime(&newtime);

		nOffset = 240000 / 600;//分母为波特率
		newtime.wMilliseconds += nOffset;
		if (newtime.wMilliseconds > 999)
		{
			newtime.wMilliseconds -= 1000;
			pt.TimeAdd(&newtime, 1);
		}
		m_bSendBuf[13] = (BYTE)(newtime.wMilliseconds % 256);
		m_bSendBuf[14] = (BYTE)(newtime.wMilliseconds / 256);
		m_bSendBuf[15] = (BYTE)newtime.wSecond;;
		m_bSendBuf[16] = (BYTE)newtime.wMinute;
		CheckSendCode(12);
		m_bSendBuf[18] = 0xef;
		m_bSendBuf[19] = (BYTE)newtime.wHour;
		m_bSendBuf[20] = (BYTE)newtime.wDay;
		m_bSendBuf[21] = (BYTE)newtime.wMonth;
		m_bSendBuf[22] = (BYTE)(newtime.wYear % 100);
		CheckSendCode(18);
		m_wSendLen = 24;
		break;
	case COMMAND_NONE:			//空命令
		break;
	case COMMAND_SET_RYB:			//软压板
		break;
	default:
		break;
	}

	m_ePreCode = m_eCmdCode;
	m_eCmdCode = COMMAND_NONE;

#ifdef SYNC_HEADBB
	if (m_wSendLen < 1) 
	{
		m_wSendLen = 6;
	}
#endif
}

/*====================================================================================
*                                                                                    
* Subroutine  : TimeCheck()
*                                                                                    
* Parameters  : 
*               
*                                                                                    
* Called from : PackData()
* 
* Description : 超时检测
* 
* Return	  : 
*               
*                                             
* Modification: 
*				 2004-08-02: 
*                                                                                     
*====================================================================================*/
int CCDT::TimeCheck(void)
{
	int			nResult = 0;		//返回值变量
	unsigned long	lTimeEnd = 0;		//结束时刻
	unsigned long	lUsingTime = 0;		//溢出时间
	bool			bFlag = false;		//失败参数

	if ((m_ePreCode == COMMAND_SEL_CTRL)	//控制选择
		||(m_ePreCode == COMMAND_EXE_CTRL))	//控制执行
	{
		lTimeEnd = GetTickCount();
		lUsingTime = (lTimeEnd - m_lTimeBegin) / 1000;

		if (lUsingTime > TIMEOUT)
		{

			if (m_ePreCode == COMMAND_SEL_CTRL)		//控制选择
			{
				m_ePreCode = COMMAND_NONE;
				bFlag = true;
				PutYK(INFDATA_YK_SEL, bFlag);				//遥控返校失败
			}
			else if (m_ePreCode == COMMAND_EXE_CTRL)	//控制执行
			{
//				CommandReturn(INF_SWITCH, RESULT_FAIL);
			}
		}
		else 
		{
			nResult = 1;
		}
	}
	else
	{
		m_lTimeBegin = GetTickCount();
	}

	return nResult;
}

/*====================================================================================
*                                                                                    
* Subroutine  : HexToBCD()
*                                                                                    
* Parameters  : 
*				 bHex:	16进制数
*                                                                                    
* Called from :                                    
* 
* Description : 16 进制数转换成BCD码。
* 
* Return	  : BCD值,无效返回-1。 
*                   
* Modification:
*				 2004-12-28: 
*                                                                                     
*====================================================================================*/
int CCDT::HexToBCD(unsigned char bHex)
{
	int nResult = -1;

	if (((bHex >> 4) < 10)
		|| ((bHex & 0x0f) < 10))
	{
		nResult = ((bHex & 0xf0) /16) * 10 + (bHex & 0x0f);
	}

	return nResult;
}

/*====================================================================================
*                                                                                    
* Subroutine  : TestPutYX()
*                                                                                    
* Parameters  : 
*				 
*                                                                                    
* Called from : TimeTest()                                    
* 
* Description : 存储遥信值,测试使用
* 
* Return	  : 
*                   
* Modification: 
*				 2004-11-28: 
*                                                                                     
*====================================================================================*/
void CCDT::TestPutYX(void)
{
	int			i = 0;		//一般变量
	SYSTEMTIME		systime;		//时间结构体
	DATAGROUP		DataGroup;		//存储数据结构体
	SOE_STATUS		SoeStatus;		//事件结构体	

	memset(&SoeStatus, 0, sizeof(SOE_STATUS));
	memset(&DataGroup, 0x00, sizeof(DATAGROUP));
	GetLocalTime(&systime);

	for (i=0; i<43; i++)
	{
		SoeStatus.bAddress = 0x01;	//固定值??
		SoeStatus.nPot = i;
		SoeStatus.bStatus = rand()%2+1;
		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 = 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  : TestPutSOE()
*                                                                                    
* Parameters  : 
*				 
*                                                                                    
* Called from : TimeTest()                                    
* 
* Description : 存储遥信值,测试使用
* 
* Return	  : 
*                   
* Modification: 
*				 2004-11-28: 
*                                                                                     
*====================================================================================*/
void CCDT::TestPutSOE(void)
{
	SOE_STATUS		SoeStatus;		//事件结构体	
	SYSTEMTIME		systime;		//时间结构体
	DATAGROUP		DataGroup;		//存储数据结构体

	memset(&DataGroup, 0x00, sizeof(DATAGROUP));
	memset(&SoeStatus, 0, sizeof(SOE_STATUS));
	GetLocalTime(&systime);

	SoeStatus.bAddress = 0x01;	//固定值??
	SoeStatus.nPot = 17;//m_bSoeBuf[9] + (m_bSoeBuf[10] & 0x0f) * 256;
	SoeStatus.bStatus = rand()%2+1;//m_bSoeBuf[10] & 0x80;
	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 = INFDATA_SOE;


	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  : TimeTest()
*                                                                                    
* Parameters  : 
*				 
*                                                                                    
* Called from : RuleLoop()                                    
* 
* Description : 存储遥信值,如果与内存中的不一致就认为是遥信变位。
* 
* Return	  : 
*                   
* Modification: 
*				 2004-11-28: 
*                                                                                     
*====================================================================================*/
int CCDT::TimeTest()
{
	int i=0;
	unsigned long YXend;

	
	//间隔30秒送一次状态
	YXend = GetTickCount();
	if ((YXend - m_begin)/1000 > 30) 
	{
		m_begin = GetTickCount();
//		TestPutYX();
		TestPutSOE();
		return 1;
	}
	return 0;	
}

⌨️ 快捷键说明

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