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

📄 tcp103.cpp

📁 此程序适用于电力系统中的网关程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	unsigned char	bSector = 0;;	//扇区
	unsigned char	bNode = 0;		//节点号
	SYSTEMTIME		systime;		//时间结构体
	DATA_STR		DataInfo;		//数据信息格式
	DATAGROUP		DataGroup;		//存储数据结构体

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

	bSector = m_bFrameBuf[10];//m_bFrameBuf[4];
	bNode = m_bFrameBuf[11];//m_bFrameBuf[5];

	nResult = CheckNode();

	if ((nResult != 0) 
		&& (bSector == 0)
		&& (bNode == m_iAddress))
	{
		DataInfo.ApduHead.bStartCode =  0x68;
		DataInfo.ApduHead.bApduLength = 0x12;
		DataInfo.ApduHead.bControlCode3 = m_wRevCount % 0x100;
		DataInfo.ApduHead.bControlCode4 = m_wRevCount / 0x100;

		DataInfo.AsduHead.bAsduType =  0x01;
		DataInfo.AsduHead.bAsduVsq = 0x81;
		DataInfo.AsduHead.nAsduCot = 0x0009;
		DataInfo.AsduHead.nAsduComAddr = bNode*0x100 + bSector;
		DataInfo.AsduHead.bAsduFun = 0xb2;//??

		GetLocalTime(&systime);
		if (!DataInfo.bDataVec.empty())
		{
			DataInfo.bDataVec.clear();
		}
		nNumber = g_devdata.CountDevData(m_nPortNo, DATA_YX);
		///////////////////
//		nNumber = 10;
		///////////////////
		for (i=0; i<nNumber; ++i)
		{
			DataInfo.ApduHead.bControlCode1 = m_wSendCount % 0x100;
			DataInfo.ApduHead.bControlCode2 = m_wSendCount / 0x100;

			g_devdata.GetFixDevData(m_nPortNo, i, DATA_YX, DataGroup);
			DataInfo.AsduHead.bAsduInf = DataGroup.nSerial;//??
			DataInfo.bDataVec.push_back(DataGroup.nValue & 0xff);
			DataInfo.bDataVec.push_back(systime.wMilliseconds % 1000);
			DataInfo.bDataVec.push_back(systime.wMilliseconds / 1000);
			DataInfo.bDataVec.push_back(systime.wMinute & 0x3f);
			DataInfo.bDataVec.push_back(systime.wHour & 0x1f);
			DataInfo.bDataVec.push_back(0);//(m_bRii);

			m_SendList.push_back(DataInfo);
			DataInfo.bDataVec.clear();
			m_wSendCount += 2;		//最低位未使用
		}
		//总召唤结束
		DataInfo.ApduHead.bStartCode =  0x68;
		DataInfo.ApduHead.bApduLength = 0x0d;
		DataInfo.ApduHead.bControlCode1 = m_wSendCount % 0x100;
		DataInfo.ApduHead.bControlCode2 = m_wSendCount / 0x100;

		DataInfo.AsduHead.bAsduType = 0x08;
		DataInfo.AsduHead.bAsduVsq = 0x81;
		DataInfo.AsduHead.nAsduCot = 0x000a;
		DataInfo.AsduHead.nAsduComAddr = bNode*0x100 + bSector;
		DataInfo.AsduHead.bAsduFun = 0xff;
		DataInfo.AsduHead.bAsduInf = 0x00;
		DataInfo.bDataVec.clear();
		DataInfo.bDataVec.push_back(m_bRii);
		m_SendList.push_back(DataInfo);
		DataInfo.bDataVec.clear();
		m_wSendCount += 2;		//最低位未使用
		m_bRii = (m_bRii++) & 0xff;
	}
	return;
}

/*====================================================================================
*                                                                                    
* Subroutine  : CheckNode()
*                                                                                    
* Parameters  : 
*               
*                                                                                    
* Called from : UnpackData()
* 
* Description : 节点检测
* 
* Return	  : (!=0) 节点通信正常
*               0 通信不正常
*                                             
* Modification: 
*				 2004-06-29: 
*                                                                                     
*====================================================================================*/
int CTcp103::CheckNode(void)
{
	int	nResult = 0;	//返回值变量
	enum GateDevStatus eStatus = GATE_UNKNOW;

	g_glonet.GetDevStatus(eStatus);
	if (eStatus != 0)
	{
		nResult = 1;
	}
	return nResult;
}

/*====================================================================================
*                                                                                    
* Subroutine  : CalibrateTime()
*                                                                                    
* Parameters  : 
*               
*                                                                                    
* Called from : UnpackData()
* 
* Description : 校时函数,校正时间
* 
* Return	  : 
*               
*                                             
* Modification: 
*				 2004-07-29: 
*                                                                                     
*====================================================================================*/
void CTcp103::CalibrateTime(void)
{
	SYSTEMTIME		systime;		//时间结构
	unsigned char	bNode = 0;		//节点号
	int			nResult;		//常用变量,返回值
	CTRL_VALUE		CtrlValue;		//下发命令结构体
	DATA_STR		DataInfo;		//数据信息格式

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

	bNode = m_bFrameBuf[11];
	nResult = CheckNode();

	systime.wMilliseconds = (m_bFrameBuf[14] + m_bFrameBuf[15]*0x100)%1000;
	systime.wSecond = (m_bFrameBuf[14] + m_bFrameBuf[15]*0x100)/1000;
	systime.wMinute = m_bFrameBuf[16] & 0x3f;
	systime.wHour = m_bFrameBuf[17] & 0x1f;
	systime.wDay = m_bFrameBuf[18] & 0x1f;
	systime.wMonth = m_bFrameBuf[19] &0x0f;
	systime.wYear = (m_bFrameBuf[20])%100 + 2000;
	SetLocalTime(&systime);//校对本机时间

	if (nResult != 0)
	{
		CtrlValue.eCmdType = COMMAND_CALI_TIME;
		CtrlValue.bAddress = m_bFrameBuf[11];
		g_soedata.InsCtrlData(CtrlValue);
	}
	
	DataInfo.ApduHead.bStartCode =  0x68;
	DataInfo.ApduHead.bApduLength = 0x13;
	DataInfo.ApduHead.bControlCode1 = m_wSendCount % 0x100;
	DataInfo.ApduHead.bControlCode2 = m_wSendCount / 0x100;
	DataInfo.ApduHead.bControlCode3 = m_wRevCount % 0x100;
	DataInfo.ApduHead.bControlCode4 = m_wRevCount / 0x100;

	DataInfo.AsduHead.bAsduType =  0x06;
	DataInfo.AsduHead.bAsduVsq = 0x81;
	DataInfo.AsduHead.nAsduCot = 0x0008;
	DataInfo.AsduHead.nAsduComAddr = m_bFrameBuf[11]*0x100 + m_bFrameBuf[10];
	DataInfo.AsduHead.bAsduFun = 0xff;
	DataInfo.AsduHead.bAsduInf = 0x00;
	if (!DataInfo.bDataVec.empty())
	{
		DataInfo.bDataVec.clear();
	}
	DataInfo.bDataVec.push_back(m_bFrameBuf[14]);
	DataInfo.bDataVec.push_back(m_bFrameBuf[15]);
	DataInfo.bDataVec.push_back(m_bFrameBuf[16]);
	DataInfo.bDataVec.push_back(m_bFrameBuf[17]);
	DataInfo.bDataVec.push_back(m_bFrameBuf[18]);
	DataInfo.bDataVec.push_back(m_bFrameBuf[19]);
	DataInfo.bDataVec.push_back(m_bFrameBuf[20]);

	m_SendList.push_back(DataInfo);
	DataInfo.bDataVec.clear();

	return;
}

/*====================================================================================
*                                                                                    
* Subroutine  : NormalCommand()
*                                                                                    
* Parameters  : 
*               
*                                                                                    
* Called from : UnpackData()
* 
* Description : 一般命令
* 
* Return	  : 
*               
*                                             
* Modification: 
*				 2004-12-22: 
*                                                                                     
*====================================================================================*/
void CTcp103::NormalCommand(void)
{
	int			nResult = 0;	//常用变量,返回值
	int			pot = 0;		//CDT信息值,返回值
	unsigned char	bNode = 0;		//节点号
	unsigned char	bInf = 0;		//信息序号
	CTRL_VALUE		CtrlValue;		//下发命令结构体
	bool			bSign = false;	//肯定否定信号

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

	bNode = m_bFrameBuf[11];
	bInf = m_bFrameBuf[13];

	nResult = CheckNode();
	if (bInf == 0x13)	//信息序号为19表示LED复归
	{
		if (nResult != 0)
		{
			CtrlValue.eCmdType = COMMAND_BAOHU_RESET;
			CtrlValue.bAddress = bNode;
			g_soedata.InsCtrlData(CtrlValue);

			bSign = true;
			NormalAnswer(bInf, bSign);
		}
		else
		{
			NormalAnswer(bInf);
		}
	}
	else if ((bInf > 0x63) && (bInf < 0x6c))	//切换定值区
	{
		//装置未通信
		bInf = 0xe0;
		NormalAnswer(bInf);
	}
	else		//软压板投退
	{
		pot = ReadYXInfCDT(m_bFrameBuf[13]);
		if ((nResult != 0) && (pot != 0))		//装置通信正常
		{
			CtrlValue.eCmdType = COMMAND_SET_RYB;
			CtrlValue.bAddress = bNode;
			CtrlValue.bSwitch = 0xff;//??当前区
			CtrlValue.nPotValue = pot;
			CtrlValue.iValue = m_bFrameBuf[14];

			g_soedata.InsCtrlData(CtrlValue);
		}
		else			//装置未通信
		{
			NormalAnswer(bInf);
		}
	}
}

/*====================================================================================
*                                                                                    
* Subroutine  : NormalAnswer()
*                                                                                    
* Parameters  : bInf	信息序号
*               nSign	肯定否定回答标志
*                                                                                    
* Called from : NormalCommand()
* 
* Description : 一般命令回答
* 
* Return	  : 
*               
*                                             
* Modification: 
*				 2004-07-29: 
*                                                                                     
*====================================================================================*/
void CTcp103::NormalAnswer(unsigned char bInf, bool bSign)
{
	SYSTEMTIME		systime;
	DATA_STR		DataInfo;		//数据信息格式

	memset(&DataInfo, 0x00, sizeof(DATA_STR));

	DataInfo.ApduHead.bStartCode =  0x68;
	DataInfo.ApduHead.bApduLength = 0x13;
	DataInfo.ApduHead.bControlCode1 = m_wSendCount % 0x100;
	DataInfo.ApduHead.bControlCode2 = m_wSendCount / 0x100;
	DataInfo.ApduHead.bControlCode3 = m_wRevCount % 0x100;
	DataInfo.ApduHead.bControlCode4 = m_wRevCount / 0x100;

	DataInfo.AsduHead.bAsduType =  0x01;
	DataInfo.AsduHead.bAsduVsq = 0x81;

	if (bSign)
	{
		DataInfo.AsduHead.nAsduCot = 0x0014;		//成功
	}
	else
	{
		DataInfo.AsduHead.nAsduCot = 0x0015;		//失败
	}
	DataInfo.AsduHead.nAsduComAddr = m_bFrameBuf[11]*0x100 + m_bFrameBuf[10];
	DataInfo.AsduHead.bAsduFun = 0xb2;//??
	DataInfo.AsduHead.bAsduInf = bInf;
	if (!DataInfo.bDataVec.empty())
	{
		DataInfo.bDataVec.clear();
	}
	DataInfo.bDataVec.push_back(m_bFrameBuf[14]);
	GetLocalTime(&systime);
	DataInfo.bDataVec.push_back(systime.wMilliseconds % 1000);
	DataInfo.bDataVec.push_back(systime.wMilliseconds / 1000);
	DataInfo.bDataVec.push_back(systime.wMinute & 0x3f);
	DataInfo.bDataVec.push_back(systime.wHour & 0x1f);
	DataInfo.bDataVec.push_back(m_bFrameBuf[15]);	//RII标示号
	m_SendList.push_back(DataInfo);
	DataInfo.bDataVec.clear();

	return;
}

/*====================================================================================
*                                                                                    
* Subroutine  : SettingOperate()
*                                                                                    
* Parameters  : bInf:	信息序号
*               
*                                                                                    
* Called from : UnpackData()
* 
* Description : 定值操作
* 
* Return	  : 
*               
*                                             
* Modification: 
*				 2004-07-29: 
*                                                                                     
*====================================================================================*/
void CTcp103::SettingOperate(unsigned char bInf)
{
	SettingNo(bInf);
	return;
}

/*====================================================================================
*                                                                                    
* Subroutine  : SettingNo()
*                                                                                    
* Parameters  : bInf:	信息序号
*               
*                                                                                    
* Called from : SettingOperate()
* 
* Description : 装置未连接时定值命令的打包数据
* 
* Return	  : 
*               
*                                             
* Modification: 
*				 2004-07-29: 
*                                                                                     
*====================================================================================*/
void CTcp103::SettingNo(unsigned char bInf, bool bSign)
{
	int			i = 0;		//常用变量
	unsigned char	bVsq = 0;		//可变结构限定词
	DATA_STR		DataInfo;		//数据信息格式

	memset(&DataInfo, 0x00, sizeof(DATA_STR));

	DataInfo.ApduHead.bStartCode =  0x68;
	DataInfo.ApduHead.bApduLength = 0x13;
	DataInfo.ApduHead.bControlCode1 = m_wSendCount % 0x100;
	DataInfo.ApduHead.bControlCode2 = m_wSendCount / 0x100;
	DataInfo.ApduHead.bControlCode3 = m_wRevCount % 0x100;
	DataInfo.ApduHead.bControlCode4 = m_wRevCount / 0x100;

	DataInfo.AsduHead.bAsduType =  0x61;
	DataInfo.AsduHead.bAsduVsq = m_bFrameBuf[7];

	DataInfo.AsduHead.nAsduComAddr = m_bFrameBuf[11]*0x100 + m_bFrameBuf[10];
	DataInfo.AsduHead.bAsduFun = 0xb2;//??
	DataInfo.AsduHead.bAsduInf = m_bFrameBuf[13];

	if (bSign)
	{
		DataInfo.AsduHead.nAsduCot = 0x0014;
	}
	else
	{
		DataInfo.AsduHead.nAsduCot = 0x0015;
	}
	if (!DataInfo.bDataVec.empty())
	{
		DataInfo.bDataVec.clear();
	}

	DataInfo.bDataVec.push_back(m_bFrameBuf[14]);
	DataInfo.bDataVec.push_back(m_bFrameBuf[15]);

	for (i=0; i<bVsq; ++i)
	{
		if (m_bFrameLen <= (10+i*3))
		{
			break;
		}
		DataInfo.bDataVec.push_back(m_bFrameBuf[16+i*3]);
		DataInfo.bDataVec.push_back(m_bFrameBuf[17+i*3]);
		DataInfo.bDataVec.push_back(m_bFrameBuf[18+i*3]);
	}
	m_SendList.push_back(DataInfo);
	DataInfo.bDataVec.clear();
}

/*====================================================================================
*                                                                                    
* Subroutine  : RtuControl()
*                                                                                    
* Parameters  : 
*               
*                                                                                    
* Called from : UnpackData()
* 
* Description : 控制命令
* 
* Return	  : 
*               
*                                             
* Modification: 
*				 2004-07-29: 
*                                                                                     
*====================================================================================*/
void CTcp103::RtuControl(void)
{
	int			nResult = 0;	//常用变量,返回值
	int			pot = 0;		//CDT信息点
	unsigned char	bNode = 0;		//节点号
	CTRL_VALUE		CtrlValue;		//下发命令结构体
	unsigned char	bType = 1;		//1为无用

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

	bNode = m_bFrameBuf[11];

	nResult = CheckNode();
	pot = ReadYXInfCDT(m_bFrameBuf[13]);
	if ((nResult != 0) && (pot != 0))		//装置通信正常
	{
		CtrlValue.bAddress = bNode;
		CtrlValue.nPotValue = pot;
		CtrlValue.iValue = m_bFrameBuf[14] & 0x03;
		bType = m_bFrameBuf[14] >> 6;
		switch (bType)
		{
		case 0x02:	//选择
			CtrlValue.eCmdType = COMMAND_SEL_CTRL;
			g_soedata.InsCtrlData(CtrlValue);
			break;
		case 0x00://执行
			CtrlValue.eCmdType = COMMAND_EXE_CTRL;
			g_soedata.InsCtrlData(CtrlValue);
			break;
		case 0x03://撤销
			CtrlValue.eCmdType = COMMAND_CANCEL_CTRL;
			g_soedata.InsCtrlData(CtrlValue);
			break;
		case 0x01://无用
			break;
		default:
			break;
		}
	}
	else			//装置未通信
	{
		RtuAnswerNo();
	}

⌨️ 快捷键说明

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