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

📄 iec104.cpp

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

		m_bSendBuf[index++] = DataInfo.ApduHead.bStartCode;
		m_bSendBuf[index++] = DataInfo.ApduHead.bApduLength;	
		m_bSendBuf[index++] = DataInfo.ApduHead.bControlCode1;
		m_bSendBuf[index++] = DataInfo.ApduHead.bControlCode2;
		m_bSendBuf[index++] = DataInfo.ApduHead.bControlCode3;
		m_bSendBuf[index++] = DataInfo.ApduHead.bControlCode4;

		m_bSendBuf[index++] = DataInfo.AsduHead.bAsduType;
		m_bSendBuf[index++] = DataInfo.AsduHead.bAsduVsq;
		m_bSendBuf[index++] = DataInfo.AsduHead.nAsduCot % 0x100;
		m_bSendBuf[index++] = DataInfo.AsduHead.nAsduCot / 0x100;
		m_bSendBuf[index++] = DataInfo.AsduHead.nAsduComAddr % 0x100;//单元公共地址 
		m_bSendBuf[index++] = DataInfo.AsduHead.nAsduComAddr / 0x100;//单元公共地址 
		m_bSendBuf[index++] = DataInfo.AsduHead.bAsduInf;//inf 

		bLength = DataInfo.bDataVec.size();
		for (i=0; i<bLength; ++i)
		{
			m_bSendBuf[index++] = DataInfo.bDataVec[i];
		}
		m_wSendLen = index;
	}

	return;

}

/*====================================================================================
*                                                                                    
* Subroutine  : GeneralInquire()
*                                                                                    
* Parameters  :
*               
*                                                                                    
* Called from : RuleLoop()
* 
* Description : 总召唤响应
* 
* Return	  : 
*               
*                                             
* Modification: 
*				 2004-07-29: 
*                                                                                     
*====================================================================================*/
void CIEC104::GeneralInquire(void)
{
	int			i = 0;		//常用变量
	int			nResult;		//常用变量,返回值
	int			nNumber;		//遥信数量
	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))
	{
		DataInfo.ApduHead.bStartCode =  0x68;
		DataInfo.ApduHead.bApduLength = 0x12;
		DataInfo.ApduHead.bControlCode3 = m_wRevCount % 0x100;
		DataInfo.ApduHead.bControlCode4 = m_wRevCount / 0x100;

		DataInfo.AsduHead.bAsduType =  0x64;
		DataInfo.AsduHead.bAsduVsq = 0x01;
		DataInfo.AsduHead.nAsduCot = 0x0007;
		DataInfo.AsduHead.nAsduComAddr = bNode*0x100 + bSector;
		DataInfo.AsduHead.bAsduInf = 0x00;
		if (!DataInfo.bDataVec.empty())
		{
			DataInfo.bDataVec.clear();
		}
		DataInfo.bDataVec.push_back(20);

		m_SendList.push_back(DataInfo);
		DataInfo.bDataVec.clear();
		m_wSendCount += 2;		//最低位未使用

		DataInfo.AsduHead.bAsduType =  0x03;
		DataInfo.AsduHead.bAsduVsq = 0x01;
		DataInfo.AsduHead.nAsduCot = 0x0020;
		GetLocalTime(&systime);

		nNumber = g_devdata.CountDevData(m_nPortNo, DATA_YX);
		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);

			m_SendList.push_back(DataInfo);
			DataInfo.bDataVec.clear();
			m_wSendCount += 2;		//最低位未使用
		}
	}

	//总召唤结束
	DataInfo.ApduHead.bStartCode =  0x68;
	DataInfo.ApduHead.bApduLength = 0x0c;
	DataInfo.ApduHead.bControlCode1 = m_wSendCount % 0x100;
	DataInfo.ApduHead.bControlCode2 = m_wSendCount / 0x100;

	DataInfo.AsduHead.bAsduType = 0x64;
	DataInfo.AsduHead.bAsduVsq = 0x01;
	DataInfo.AsduHead.nAsduCot = 0x000a;
	DataInfo.AsduHead.nAsduComAddr = bNode*0x100 + bSector;
	DataInfo.AsduHead.bAsduInf = 0x00;
	DataInfo.bDataVec.push_back(20);
	m_SendList.push_back(DataInfo);
	DataInfo.bDataVec.clear();
	m_wSendCount += 2;		//最低位未使用
}

/*====================================================================================
*                                                                                    
* Subroutine  : CheckNode()
*                                                                                    
* Parameters  : 
*               
*                                                                                    
* Called from : UnpackData()
* 
* Description : 节点检测
* 
* Return	  : (!=0) 节点通信正常
*               0 通信不正常
*                                             
* Modification: 
*				 2004-06-29: 
*                                                                                     
*====================================================================================*/
int CIEC104::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 CIEC104::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[13] + m_bFrameBuf[14]*0x100)%1000;
	systime.wSecond = (m_bFrameBuf[13] + m_bFrameBuf[14]*0x100)/1000;
	systime.wMinute = m_bFrameBuf[15] & 0x3f;
	systime.wHour = m_bFrameBuf[16] & 0x1f;
	systime.wDay = m_bFrameBuf[17] & 0x1f;
	systime.wMonth = m_bFrameBuf[18] &0x0f;
	systime.wYear = (m_bFrameBuf[19])%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 = 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 =  0x67;
	DataInfo.AsduHead.bAsduVsq = 0x01;
	DataInfo.AsduHead.nAsduCot = 0x0007;
	DataInfo.AsduHead.nAsduComAddr = m_bFrameBuf[11]*0x100 + m_bFrameBuf[10];
	DataInfo.AsduHead.bAsduInf = 0x00;
	if (!DataInfo.bDataVec.empty())
	{
		DataInfo.bDataVec.clear();
	}
	DataInfo.bDataVec.push_back(m_bFrameBuf[13]);
	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]);

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

	return;
}

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

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

	bNode = m_bFrameBuf[11];

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

	return;
}

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

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

	DataInfo.ApduHead.bStartCode =  0x68;
	DataInfo.ApduHead.bApduLength = 0x0c;
	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 = 0x000a;		//失败
	DataInfo.AsduHead.nAsduComAddr = m_bFrameBuf[11]*0x100 + m_bFrameBuf[10];
	DataInfo.AsduHead.bAsduInf = m_bFrameBuf[12];
	if (!DataInfo.bDataVec.empty())
	{
		DataInfo.bDataVec.clear();
	}
	DataInfo.bDataVec.push_back(m_bFrameBuf[13]);

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

	return;
}

/*====================================================================================
*                                                                                    
* Subroutine  : GetYC()
*                                                                                    
* Parameters  :
*               
*                                                                                    
* Called from : RuleLoop()
* 
* Description : 遥测量响应
* 
* Return	  : 
*               
*                                             
* Modification: 
*				 2004-12-28: 
*                                                                                     
*====================================================================================*/
void CIEC104::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();

	if (nResult != 0)
	{
		nNumber = g_devdata.CountDevData(m_nPortNo, DATA_YC);

		DataInfo.ApduHead.bStartCode =  0x68;
		DataInfo.ApduHead.bApduLength = 0x12;

⌨️ 快捷键说明

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