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

📄 dnpexplain.cpp

📁 电力和自动化通讯规约模拟软件
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	__int64	timeInMillSec;
	SYSTEMTIME pSystemTime;
	CTime baseTime(0);
	CTimeSpan timeSpanTemp;
	
	BYTE timetemp1,timetemp2,timetemp3,
		timetemp4,timetemp5,timetemp6;
	
	//	pSoeRec=m_paSOE.GetAt(0);	
	
	
	BYTE rtuaddr1,rtuaddr2,priaddr1,priaddr2;
	rtuaddr1=(BYTE)rtuaddr;
	rtuaddr2=rtuaddr>>8;
	priaddr1=(BYTE)priaddr;
	priaddr2=priaddr>>8;
	BYTE Length=14+28;//58:一个故障的数据长度
	
	m_baOutBuffer.RemoveAll();
	m_baOutBuffer.Add(0x05);
	m_baOutBuffer.Add(0x64);
	m_baOutBuffer.Add(Length);//Length
	m_baOutBuffer.Add(0x44);
	m_baOutBuffer.Add(priaddr1);
	m_baOutBuffer.Add(priaddr2);
	m_baOutBuffer.Add(rtuaddr1);
	m_baOutBuffer.Add(rtuaddr2);
	//////////////////////////////2Byte CRC reserved
	/////////////////////////////
	m_baOutBuffer.Add(0xca);
	m_baOutBuffer.Add(0xeb);
	m_baOutBuffer.Add(0x81);
    //iin1
	//iin2
	m_baOutBuffer.Add(0x39);//object: 科汇FTU的故障对象定义
	m_baOutBuffer.Add(0x00);//
	m_baOutBuffer.Add(0x17);
	m_baOutBuffer.Add(1);//Number
	pFaultRec=(CFaultRec *)m_paFault.GetAt(0);
	
	pSystemTime=pFaultRec->m_stTime;//获取毫秒
	CTime timeFaultItem(pSystemTime);
	timeSpanTemp=timeFaultItem-baseTime;
	timeInMillSec=timeSpanTemp.GetTotalSeconds();
	timetemp1=(BYTE)timeInMillSec;
	timeInMillSec>>=8;
	timetemp2=(BYTE)timeInMillSec;
	timeInMillSec>>=8;
	timetemp3=(BYTE)timeInMillSec;
	timeInMillSec>>=8;
	timetemp4=(BYTE)timeInMillSec;
	timeInMillSec>>=8;
	timetemp5=(BYTE)timeInMillSec;
	timeInMillSec>>=8;
	timetemp6=(BYTE)timeInMillSec;
	m_baOutBuffer.Add(timetemp1);
	m_baOutBuffer.Add(timetemp2);
	m_baOutBuffer.Add(timetemp3);
	m_baOutBuffer.Add(timetemp4);
	m_baOutBuffer.Add(timetemp5);
	m_baOutBuffer.Add(timetemp6);
	m_baOutBuffer.Add(0x00);//故障源(RTU组的网络地址)
	m_baOutBuffer.Add(0x00);//故障源(RTU组的网络地址)
	BYTE time1=(BYTE)pFaultRec->m_wDelayTime;
	BYTE time2=(pFaultRec->m_wDelayTime)>>8;
	m_baOutBuffer.Add(time1);//故障持续时间
	m_baOutBuffer.Add(time2);//
	BYTE type1=0x00,type2=0x00;
	if(pFaultRec->m_AOverCurrent)//A overcurrent
	{
		type1|=0x02;
	}
	if (pFaultRec->m_BOverCurrrent) //B overcurrent
	{
		type1|=0x04;
	}
	if (pFaultRec->m_COverCurrrent) //C overcurrent
	{
		type1|=0x08;
	}
	if (pFaultRec->m_3I0OverCurrent)//3Io overcurrent 
	{
		type1|=0x10;
	}
	if (pFaultRec->m_3U0OverSetting)//3Uo over voltage set 
	{
		type1|=0x20;
	}
	m_baOutBuffer.Add(type1);//line 1
	m_baOutBuffer.Add(0x00);//line 2
	if (pFaultRec->m_byDirection==1) 
	{
		m_baOutBuffer.Add(0x0f);//故障方向
	}
	else
	{
		m_baOutBuffer.Add(0xf0);
	}
	m_baOutBuffer.Add(0x00);
	m_baOutBuffer.Add(0x00);//故障距离
	m_baOutBuffer.Add(0x00);
	BYTE analogy1,analogy2;
	WORD analogyTemp;
	analogyTemp=pFaultRec->m_wFaultValueIa;//故障IA信息
	analogy1=(BYTE)analogyTemp;
//	analogyTemp>=8;
	analogy2=analogyTemp>>8;
	m_baOutBuffer.Add(analogy1);
	m_baOutBuffer.Add(analogy2);
	analogyTemp=pFaultRec->m_wFaultValueIb;//故障IB信息
	analogy1=(BYTE)analogyTemp;
	analogy2=analogyTemp>>8;
	m_baOutBuffer.Add(analogy1);
	m_baOutBuffer.Add(analogy2);
	analogyTemp=pFaultRec->m_wFaultValueIc;//故障IC信息
	analogy1=(BYTE)analogyTemp;
	analogy2=analogyTemp>>8;
	m_baOutBuffer.Add(analogy1);
	m_baOutBuffer.Add(analogy2);
	analogyTemp=pFaultRec->m_wFaultValueUa;//故障Ua信息
	analogy1=(BYTE)analogyTemp;
	analogy2=analogyTemp>>8;
	m_baOutBuffer.Add(analogy1);
	m_baOutBuffer.Add(analogy2);
	analogyTemp=pFaultRec->m_wFaultValueUb;//故障Ub信息
	analogy1=(BYTE)analogyTemp;
	analogy2=analogyTemp>>8;
	m_baOutBuffer.Add(analogy1);
	m_baOutBuffer.Add(analogy2);
	analogyTemp=pFaultRec->m_wFaultValueUc;//故障Uc信息
	analogy1=(BYTE)analogyTemp;
	analogy2=analogyTemp>>8;
	m_baOutBuffer.Add(analogy1);
	m_baOutBuffer.Add(analogy2);

	m_paFault.RemoveAll();
	HandleIInInfo();
	setSendCrc();
	SendRespons();
	m_paSOE.RemoveAll();
	return true;
}

void CDnpExplain::setSendCrc()
{
	unsigned short crcPositionPoint;
	BYTE crc1,crc2;
	unsigned char crcCheckNum,remainder;
//	crcPositionPoint=(unsigned short *)(&m_baOutBuffer[8]);
//	*crcPositionPoint=send_calc_crc(&m_baOutBuffer,8);//头校验
	crcPositionPoint=send_calc_crc(0,8);//头校验
	crc1=(BYTE)crcPositionPoint;
	crc2=crcPositionPoint>>8;
	m_baOutBuffer.InsertAt(8,crc1);
	m_baOutBuffer.InsertAt(9,crc2);
	
	crcCheckNum=(m_baOutBuffer[2]-5)/16;//校验次数---USER DATA长度除16
	remainder=(m_baOutBuffer[2]-5)%16;//余数
	for(int k=0;k<crcCheckNum;k++)
	{
	//	crcPositionPoint=(unsigned short *)(&m_baOutBuffer[26+18*k]);
	//	*crcPositionPoint=send_calc_crc(m_baOutBuffer[10+18*k],16);//校验USER DATA
		crcPositionPoint=send_calc_crc(10+18*k,16);//校验USER DATA
		crc1=(BYTE)crcPositionPoint;
		crc2=crcPositionPoint>>8;
		m_baOutBuffer.InsertAt(26+18*k,crc1);
		m_baOutBuffer.InsertAt(27+18*k,crc2);
	}
	if(remainder)
	{
	//	crcPositionPoint=(unsigned short *)(&m_baOutBuffer[10+18k*+remainder]);
//		*crcPositionPoint=send_calc_crc(m_baOutBuffer[10+18*k],remainder);//校验最后一段USER DATA
		crcPositionPoint=send_calc_crc(10+18*k,remainder);//校验最后一段USER DATA
		crc1=(BYTE)crcPositionPoint;
		crc2=crcPositionPoint>>8;
		m_baOutBuffer.InsertAt(10+18*k+remainder,crc1);
		m_baOutBuffer.InsertAt(11+18*k+remainder,crc2);
	}
	return;

}

unsigned short CDnpExplain::send_calc_crc(int index, unsigned short len)
{
	unsigned short crc = 0;
//	while (len--)
//		crc = dnp_crc16(crc, (unsigned int)*byte++);

	while (len--)
	{
		crc=dnp_crc16(crc,(unsigned int)m_baOutBuffer[index]);
		index++;
	}
	crc ^= 0xFFFF;
	return crc;

}

unsigned short CDnpExplain::dnp_crc16(unsigned short crc, unsigned int text)
{
	unsigned char  index = (unsigned char )(text ^ crc);
	crc = ((crc & ~0xff) >> 8) ^ (dnp_crc_table[index]);
	return crc;

}

int CDnpExplain::SoePtrExplain(bool onOff, BYTE DigitalNo, SYSTEMTIME &soeTime)
{
	if(m_paSOE.GetSize()==0)
		return 0;
	return 0;
}

void CDnpExplain::DumpSoeRecord()
{
	int j=m_paSOE.GetSize();

	while(m_paSOE.GetSize()>0)
	{
		delete (CSOERec*)m_paSOE.GetAt(0);
	}
	m_paSOE.RemoveAll();
	
}

BOOL CDnpExplain::OperateTimeOut(WORD timeOut, SYSTEMTIME &doneTime)
{
	WORD tsubMillSecond;
	if(doneTime.wSecond>=m_tSelectOperater.wSecond)
	{
		tsubMillSecond=doneTime.wSecond*1000+doneTime.wMilliseconds-m_tSelectOperater.wSecond*1000-m_tSelectOperater.wMilliseconds;
		if(tsubMillSecond>3000)
			return false;
		return true;

	}
	else
	{
		tsubMillSecond=(doneTime.wSecond+60)*1000+doneTime.wMilliseconds-m_tSelectOperater.wSecond*1000-m_tSelectOperater.wMilliseconds;
		if(tsubMillSecond>3000)
			return false;
		return true;
	}

}

void CDnpExplain::BinaryInputChange(BYTE &index, BOOL onOff)
{
	if(m_baDigital.GetSize()==0)
		return;
	CByteArray baTmp;
	baTmp.Copy(m_baDigital);
	BYTE baDigital=m_baDigital.GetAt(0);
	if(onOff)//trip
	{
		baDigital&=0xfe;
		m_baDigital.RemoveAt(0);
		m_baDigital.Add(baDigital);

	}
	else//close
	{
		baDigital|=0x01;
		m_baDigital.RemoveAt(0);
		m_baDigital.Add(baDigital);
	}
	CheckStateChange(baTmp, m_baDigital);
}

void CDnpExplain::ResetLink()
{
	m_baOutBuffer.RemoveAll();
	m_baOutBuffer.Add(0x05);
	m_baOutBuffer.Add(0x64);
	m_baOutBuffer.Add(0x05);
	m_baOutBuffer.Add(0x20);
	m_baOutBuffer.Add(0xfe);
	m_baOutBuffer.Add(0x00);
	m_baOutBuffer.Add((BYTE)m_wAddr);
	m_baOutBuffer.Add((BYTE)m_wAddr>>8);
	setSendCrc();
	SendRespons();
}

BOOL CDnpExplain::SendBinaryAndAnalogy(WORD &rtuaddress, WORD &priaddress)
{
	if(m_waAnalog.GetSize()==0||m_baDigital.GetSize()==0)
	{
		return false;
	}
	BYTE DigitalCount=m_baDigital.GetSize();
	BYTE AnalogyCount=m_waAnalog.GetSize();
	BYTE rtuaddr1,rtuaddr2,priaddr1,priaddr2;
	BYTE data1,data2;
	priaddr1=(BYTE)priaddress;
	priaddr2=priaddress>>8;
	rtuaddr1=(BYTE)rtuaddress;
	rtuaddr2=rtuaddress>>8;
	BYTE Length=10+5*2+DigitalCount+AnalogyCount*2;

	m_baOutBuffer.RemoveAll();
	m_baOutBuffer.Add(0x05);
	m_baOutBuffer.Add(0x64);
	m_baOutBuffer.Add(Length);//Length
	m_baOutBuffer.Add(0x44);
	m_baOutBuffer.Add(priaddr1);
	m_baOutBuffer.Add(priaddr2);
	m_baOutBuffer.Add(rtuaddr1);
	m_baOutBuffer.Add(rtuaddr2);
	//////////////////////////////2Byte CRC reserved
	/////////////////////////////
	m_baOutBuffer.Add(0xcf);
	m_baOutBuffer.Add(0xc7);
	m_baOutBuffer.Add(0x81);
///IIN
	m_baOutBuffer.Add(0x01);//binary input
	m_baOutBuffer.Add(0x01);
	m_baOutBuffer.Add(0x00);
	m_baOutBuffer.Add(0x00);//number
	m_baOutBuffer.Add(DigitalCount*8-1);//number
	for(int i=0;i<DigitalCount;i++)
	{
		m_baOutBuffer.Add(m_baDigital[i]);
	}
////////////////////////////////////
	m_baOutBuffer.Add(0x1e);//object
	m_baOutBuffer.Add(0x04);
	m_baOutBuffer.Add(0x00);
	m_baOutBuffer.Add(0x00);//Number
	m_baOutBuffer.Add(AnalogyCount-1);//Number
	for(int ii=0;ii<AnalogyCount;ii++)
	{
		data1=(BYTE)m_waAnalog[ii];
		data2=m_waAnalog[ii]>>8;
		m_baOutBuffer.Add(data1);
		m_baOutBuffer.Add(data2);
	}
	HandleIInInfo();
	
	setSendCrc();
	SendRespons();
	return true;
}

BOOL CDnpExplain::SendBinaryAndCount(WORD &rtuaddress, WORD &priaddress)
{
	if(m_dwaCount.GetSize()==0||m_baDigital.GetSize()==0)
	{
		return false;
	}
	BYTE DigitalCount=m_baDigital.GetSize();
	BYTE CountNumber=m_dwaCount.GetSize();
	BYTE rtuaddr1,rtuaddr2,priaddr1,priaddr2;
	BYTE data1,data2,data3,data4;
	priaddr1=(BYTE)priaddress;
	priaddr2=priaddress>>8;
	rtuaddr1=(BYTE)rtuaddress;
	rtuaddr2=rtuaddress>>8;
	BYTE Length=10+5*2+DigitalCount+CountNumber*4;

	m_baOutBuffer.RemoveAll();
	m_baOutBuffer.Add(0x05);
	m_baOutBuffer.Add(0x64);
	m_baOutBuffer.Add(Length);//Length
	m_baOutBuffer.Add(0x44);
	m_baOutBuffer.Add(priaddr1);
	m_baOutBuffer.Add(priaddr2);
	m_baOutBuffer.Add(rtuaddr1);
	m_baOutBuffer.Add(rtuaddr2);
	//////////////////////////////2Byte CRC reserved
	/////////////////////////////
	m_baOutBuffer.Add(0xcf);
	m_baOutBuffer.Add(0xc7);
	m_baOutBuffer.Add(0x81);
///IIN
	m_baOutBuffer.Add(0x01);//binary input
	m_baOutBuffer.Add(0x01);
	m_baOutBuffer.Add(0x00);
	m_baOutBuffer.Add(0x00);//number
	m_baOutBuffer.Add(DigitalCount*8-1);//number
	for(int i=0;i<DigitalCount;i++)
	{
		m_baOutBuffer.Add(m_baDigital[i]);
	}
////////////////////////////////////

	m_baOutBuffer.Add(0x14);//object  count
	m_baOutBuffer.Add(0x06);
	m_baOutBuffer.Add(0x00);
	m_baOutBuffer.Add(0x00);//Number
	m_baOutBuffer.Add(CountNumber-1);//Number
	for(int iii=0;iii<m_dwaCount.GetSize();iii++)
	{
		DWORD dwTemp=m_dwaCount[iii];
		data1=(BYTE)m_dwaCount[iii];
		m_dwaCount[iii]>>=8;
		data2=(BYTE)m_dwaCount[iii];
		m_dwaCount[iii]>>=8;
		data3=(BYTE)m_dwaCount[iii];
		m_dwaCount[iii]>>=8;
		data4=(BYTE)m_dwaCount[iii];
		m_baOutBuffer.Add(data1);
		m_baOutBuffer.Add(data2);
		m_baOutBuffer.Add(data3);
		m_baOutBuffer.Add(data4);
	}
	HandleIInInfo();
	
	setSendCrc();
	SendRespons();
	return true;
}

BOOL CDnpExplain::SendAnalogyAndCount(WORD &rtuaddress, WORD &priaddress)
{
	if(m_dwaCount.GetSize()==0||m_waAnalog.GetSize()==0)
	{
		return false;
	}
	BYTE AnalogyCount=m_waAnalog.GetSize();
	BYTE CountNumber=m_dwaCount.GetSize();
	BYTE rtuaddr1,rtuaddr2,priaddr1,priaddr2;
	BYTE data1,data2,data3,data4;
	priaddr1=(BYTE)priaddress;
	priaddr2=priaddress>>8;
	rtuaddr1=(BYTE)rtuaddress;
	rtuaddr2=rtuaddress>>8;
	BYTE Length=10+5*2+AnalogyCount*2+CountNumber*4;

	m_baOutBuffer.RemoveAll();
	m_baOutBuffer.Add(0x05);
	m_baOutBuffer.Add(0x64);
	m_baOutBuffer.Add(Length);//Length
	m_baOutBuffer.Add(0x44);
	m_baOutBuffer.Add(priaddr1);
	m_baOutBuffer.Add(priaddr2);
	m_baOutBuffer.Add(rtuaddr1);
	m_baOutBuffer.Add(rtuaddr2);
	//////////////////////////////2Byte CRC reserved
	/////////////////////////////
	m_baOutBuffer.Add(0xcf);
	m_baOutBuffer.Add(0xc7);
	m_baOutBuffer.Add(0x81);
//  IIN
	///////////////////////////////////////////////object
	m_baOutBuffer.Add(0x1e);//object analogy
	m_baOutBuffer.Add(0x04);
	m_baOutBuffer.Add(0x00);
	m_baOutBuffer.Add(0x00);//Number
	m_baOutBuffer.Add(AnalogyCount-1);//Number
	for(int ii=0;ii<AnalogyCount;ii++)
	{
		data1=(BYTE)m_waAnalog[ii];
		data2=m_waAnalog[ii]>>8;
		m_baOutBuffer.Add(data1);
		m_baOutBuffer.Add(data2);
	}
/////////////////////////////////////
	m_baOutBuffer.Add(0x14);//object
	m_baOutBuffer.Add(0x06);
	m_baOutBuffer.Add(0x00);
	m_baOutBuffer.Add(0x00);//Number
	m_baOutBuffer.Add(CountNumber-1);//Number
	for(int iii=0;iii<m_dwaCount.GetSize();iii++)
	{
		DWORD dwTemp=m_dwaCount[iii];
		data1=(BYTE)m_dwaCount[iii];
		m_dwaCount[iii]>>=8;
		data2=(BYTE)m_dwaCount[iii];
		m_dwaCount[iii]>>=8;
		data3=(BYTE)m_dwaCount[iii];
		m_dwaCount[iii]>>=8;
		data4=(BYTE)m_dwaCount[iii];
		m_baOutBuffer.Add(data1);
		m_baOutBuffer.Add(data2);
		m_baOutBuffer.Add(data3);
		m_baOutBuffer.Add(data4);
	}
	HandleIInInfo();
	
	setSendCrc();
	SendRespons();
	return true;
}

void CDnpExplain::HandleIInInfo()
{
	BYTE iin1=0x80,iin2=0x00;
	if(m_soeState)
	{ 
		iin1|=0x04;
	}//IIN 2Byte
	if(m_faultState)
	{
		iin1|=0x08;
	}
	if (m_timeAnch) 
	{
		iin1|=0x10;
	}
	m_baOutBuffer.InsertAt(11,iin1);
	m_baOutBuffer.InsertAt(12,iin2);
	
}

⌨️ 快捷键说明

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