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

📄 tcp103.cpp

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

	return;
}

/*====================================================================================
*                                                                                    
* Subroutine  : RtuAnswerNo()
*                                                                                    
* Parameters  : 
*               
*                                                                                    
* Called from : RtuControl()
* 
* Description : 控制命令不成功
* 
* Return	  : 
*               
*                                             
* Modification: 
*				 2004-07-29: 
*                                                                                     
*====================================================================================*/
void CTcp103::RtuAnswerNo(void)
{
	DATA_STR		DataInfo;		//数据信息格式

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

	DataInfo.ApduHead.bStartCode =  0x68;
	DataInfo.ApduHead.bApduLength = 0x0e;
	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 =  m_bFrameBuf[6];
	DataInfo.AsduHead.bAsduVsq = 0x01;
	DataInfo.AsduHead.nAsduCot = 0x0076;		//失败
	DataInfo.AsduHead.nAsduComAddr = m_bFrameBuf[11]*0x100 + m_bFrameBuf[10];
	DataInfo.AsduHead.bAsduFun = 0xb2;//??
	DataInfo.AsduHead.bAsduInf = m_bFrameBuf[13];
	if (!DataInfo.bDataVec.empty())
	{
		DataInfo.bDataVec.clear();
	}
	DataInfo.bDataVec.push_back(m_bFrameBuf[14]);
	DataInfo.bDataVec.push_back(m_bFrameBuf[15]);	//RII标示号

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

/*====================================================================================
*                                                                                    
* Subroutine  : GetYC()
*                                                                                    
* Parameters  :
*               
*                                                                                    
* Called from : RuleLoop()
* 
* Description : 遥测量响应
* 
* Return	  : 
*               
*                                             
* Modification: 
*				 2004-12-28: 
*                                                                                     
*====================================================================================*/
void CTcp103::GetYC(void)
{
	int			i = 0;		//常用变量
	int			nResult;		//常用变量,返回值
	int			nNumber;		//遥信数量
	DATA_STR		DataInfo;		//数据信息格式
	DATAGROUP		DataGroup;		//存储数据结构体

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


	nResult = CheckNode();
//////////////??
	nResult = 1;
//////////////
	if (nResult != 0)
	{
		nNumber = g_devdata.CountDevData(m_nPortNo, DATA_YC);
		//////////////??
		nNumber = 10;
		//////////////

		DataInfo.ApduHead.bStartCode =  0x68;
		DataInfo.ApduHead.bApduLength = 0x12;
		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 =  0x32;
		DataInfo.AsduHead.bAsduVsq = (unsigned char)nNumber;//??
		DataInfo.AsduHead.nAsduCot = 0x0002;
		DataInfo.AsduHead.nAsduComAddr = m_iAddress*0x100 + 0x01;//bSector;//??
		DataInfo.AsduHead.bAsduFun = 0xb2;//??
		DataInfo.AsduHead.bAsduInf = 0x94;//??

		for (i=0; i<nNumber; ++i)
		{
			g_devdata.GetFixDevData(m_nPortNo, i, DATA_YC, DataGroup);
			DataInfo.bDataVec.push_back(DataGroup.nValue & 0xff);
			DataInfo.bDataVec.push_back(DataGroup.nValue / 0xff);
			if (i<nNumber-1)
			{
				DataInfo.bDataVec.push_back(0x94+i+1);
			}
		}
		//如果增加频率,可在此处添加
		m_SendList.push_back(DataInfo);
		DataInfo.bDataVec.clear();
		m_wSendCount += 2;		//最低位未使用
	}
	return;
}

/*====================================================================================
*                                                                                    
* Subroutine  : PutSendList()
*                                                                                    
* Parameters  : 
*               
*                                                                                    
* Called from : PackData()
* 
* Description : 打包主动上送信息,存入m_SendList队列中
* 
* Return	  : 
*               
*                                             
* Modification: 
*				 2004-07-29: 
*                                                                                     
*====================================================================================*/
int CTcp103::PutSendList()
{
	int			ret = 0;
	int			nResult = 0;	//返回值变量
	int			nResult1 = 0;	//返回值变量
	SOE_STATUS		soe_status;		//收到信息数据结构
	DATA_STR		DataInfo;		//数据信息格式
	enum GateStation	eStation;		//站类型

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

	GetGateStation(eStation);
	nResult1 = g_soedata.GetSoeData(eStation, soe_status);

	if (nResult1)
	{
		DataInfo.ApduHead.bStartCode =  0x68;
		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.bAsduVsq = 0x81;
		DataInfo.AsduHead.nAsduCot = 0x0001;
		DataInfo.AsduHead.bAsduFun = 0xb2;//??
		if (!DataInfo.bDataVec.empty())
		{
			DataInfo.bDataVec.clear();
		}
		//asdu类型需要配置??
		switch (soe_status.eType)
		{
		case INFDATA_YX:	//遥信变位
			if (soe_status.nPot < 512)
			{
				DataInfo.AsduHead.nAsduComAddr = m_iAddress * 0x100 
					+ m_bSector[soe_status.nPot];//??soe_status.bAddress;
				DataInfo.AsduHead.bAsduInf = m_bYXInfBuf[soe_status.nPot];//??
			}
			else
			{
				//有问题了
			}
			DataInfo.ApduHead.bApduLength = 0x12;

			DataInfo.AsduHead.bAsduType =  0x01;

			DataInfo.bDataVec.push_back(soe_status.bStatus);
			DataInfo.bDataVec.push_back(soe_status.wMilliseconds % 0x100);
			DataInfo.bDataVec.push_back(soe_status.wMilliseconds / 0x100);
			DataInfo.bDataVec.push_back(soe_status.bMinute);
			DataInfo.bDataVec.push_back(soe_status.bHour);
			DataInfo.bDataVec.push_back(0);

			m_SendList.push_back(DataInfo);
			DataInfo.bDataVec.clear();
			m_wSendCount += 2;		//最低位未使用
			nResult = 1;
			break;
		case INFDATA_SOE:
			DataInfo.AsduHead.nAsduComAddr = m_iAddress * 0x100 
				+ m_bSector[soe_status.nPot];//??soe_status.bAddress;
			ret = ReadSOEInf103(soe_status.nPot);
			if (ret!=0)
			{
				DataInfo.AsduHead.bAsduInf = ret;//??
			}
			else
			{
				break;
			}

			DataInfo.ApduHead.bApduLength = 0x16;

			DataInfo.AsduHead.bAsduType =  0x02;

			DataInfo.bDataVec.push_back(soe_status.bStatus);
			DataInfo.bDataVec.push_back(0);//相对时间
			DataInfo.bDataVec.push_back(0);//相对时间
			DataInfo.bDataVec.push_back(0);//(soe_status.wSerial % 0x100);//故障信号
			DataInfo.bDataVec.push_back(0);//(soe_status.wSerial / 0x100);//故障信号
			DataInfo.bDataVec.push_back(soe_status.wMilliseconds % 0x100);
			DataInfo.bDataVec.push_back(soe_status.wMilliseconds / 0x100);
			DataInfo.bDataVec.push_back(soe_status.bMinute);
			DataInfo.bDataVec.push_back(soe_status.bHour);
			DataInfo.bDataVec.push_back(0);//SIN=0无关

			m_SendList.push_back(DataInfo);
			DataInfo.bDataVec.clear();
			m_wSendCount += 2;		//最低位未使用
			nResult = 1;
			break;
		case INFDATA_YK_SEL:	//遥控返校,选择
		case INFDATA_YK_EXE:	//遥控返校,执行
			if (soe_status.nPot < 512)
			{
				DataInfo.AsduHead.nAsduComAddr = m_iAddress * 0x100 
					+ m_bSector[soe_status.nPot];//??soe_status.bAddress;
				DataInfo.AsduHead.bAsduInf = m_bYXInfBuf[soe_status.nPot];//??
			}
			else
			{
				//有问题了
			}

			DataInfo.ApduHead.bApduLength = 0x0e;

			DataInfo.AsduHead.bAsduType =  0x40;

			if ((soe_status.bStatus == 1)
				|| (soe_status.bStatus == 2))
			{
				DataInfo.AsduHead.nAsduCot = 0x000c;	//肯定回答
			}
			else
			{
				DataInfo.AsduHead.nAsduCot = 0x004c;	//否定回答
			}
			if (soe_status.eType == INFDATA_YK_SEL)
			{
				DataInfo.bDataVec.push_back(soe_status.bStatus|0x80);	//选择
			}
			else
			{
				DataInfo.bDataVec.push_back(soe_status.bStatus);	//执行
			}
			DataInfo.bDataVec.push_back(0);

			m_SendList.push_back(DataInfo);
			DataInfo.bDataVec.clear();
			m_wSendCount += 2;		//最低位未使用
			nResult = 1;
			break;
		default:
			break;
		}
	}
	return nResult;
}

/*====================================================================================
*                                                                                    
* Subroutine  : ID_State()
*                                                                                    
* Parameters  :	bAddr:	装置地址
*			bState:	装置状态 1 投入 2退出
*               
*                                                                                    
* Called from : TcpHeart()
* 
* Description : 打包装置状态上送信息,存入m_SendList队列中
* 
* Return	  : 
*               
*                                             
* Modification: 
*				 2004-07-29: 
*                                                                                     
*====================================================================================*/
void CTcp103::ID_State(BYTE bAddr, BYTE bState)
{
	SYSTEMTIME		systime;		//时间结构体
	DATA_STR		DataInfo;		//数据信息格式

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

	DataInfo.ApduHead.bStartCode =  0x68;
	DataInfo.ApduHead.bApduLength = 0x14;
	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;
	DataInfo.AsduHead.nAsduCot = 0x0001;
	DataInfo.AsduHead.nAsduComAddr = bAddr*0x100;
	DataInfo.AsduHead.bAsduFun = 0xbb;//187
	DataInfo.AsduHead.bAsduInf = 0xc0;
	if (!DataInfo.bDataVec.empty())
	{
		DataInfo.bDataVec.clear();
	}
	DataInfo.bDataVec.push_back(bState);
	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(systime.wDay & 0x1f);
	DataInfo.bDataVec.push_back(systime.wMonth & 0x1f);
	DataInfo.bDataVec.push_back(systime.wYear % 100);

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

	return;
}

/*====================================================================================
*                                                                                    
* Subroutine  : ReadYXInf103()
*                                                                                    
* Parameters  :	
*			
*               
*                                                                                    
* Called from : CTcp103()
* 
* Description : 读取103遥信信息表
* 
* Return	  : 
*               
*                                             
* Modification: 
*				 2004-07-29: 
*                                                                                     
*====================================================================================*/
int CTcp103::ReadYXInf103()
{
	FILE *fp;
	char Temp_buf[255];
	int bNumber = 0;
	int bResult = 1;

	fp=fopen("yx103.txt","r");
	if(fp!=NULL)
	{
		char* str=fgets(Temp_buf,80,fp);
		if (str==0) 
		{
			bResult = 0;
			return bResult;
		}
		sscanf(str,"%d\n",&bNumber);

		for (int i=0; i<bNumber; i++)
		{
			fscanf(fp, "%d %d\n", &m_bSector[i], &m_bYXInfBuf[i]);	
		}
		fclose(fp);
	}
	else
	{
		bResult = 0;
	}
	return bResult;
}

/*====================================================================================
*                                                                                    
* Subroutine  : ReadSOEInf103()
*                                                                                    
* Parameters  :	
*			
*               
*                                                                                    
* Called from : PutSendList()
* 
* Description : 读取103遥信信息表
* 
* Return	  : 
*               
*                                             
* Modification: 
*				 2004-07-29: 
*                                                                                     
*====================================================================================*/
int CTcp103::ReadSOEInf103(int pot)
{
	FILE *fp;
    char Temp_buf[255];
	int bNumber = 0;
	int pot103 = 0;
	int potCDT = 0;

	fp=fopen("soe103.txt","r");
	if(fp!=NULL)
	{
		char* str=fgets(Temp_buf,80,fp);
		if (str==0) 
		{
			pot103 = 0;
			return pot103;
		}
		sscanf(str,"%d\n",&bNumber);

		for (int i=0; i<bNumber; i++)
		{
			fscanf(fp, "%d %d\n", &potCDT, &pot103);
			if (pot == potCDT) break;
		}
    	fclose(fp);
	}
	else
	{
		pot103 = 0;
	}
	return pot103;
}

/*====================================================================================
*                                                                                    
* Subroutine  : ReadYXInfCDT()
*                                                                                    
* Parameters  :	
*			
*               
*                                                                                    
* Called from : CTcp103()
* 
* Description : 读取CDT遥信信息
* 
* Return	  : CDT信息值
*               
*                                             
* Modification: 
*				 2004-07-29: 
*                                                                                     
*====================================================================================*/
int CTcp103::ReadYXInfCDT(BYTE pot)
{
	int nResult = 0;
	int i = 0;
	int size = 0;

	size = sizeof(m_bYXInfBuf)/sizeof(BYTE);
	for(i=0; i<size; i++)
	{
		if (m_bYXInfBuf[i] == pot)
		{
			nResult = i;
			break;
		}
	}
	return nResult;
}

⌨️ 快捷键说明

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