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

📄 dnpsec.c

📁 详细介绍了arm7-at91r40008,的开发全过程
💻 C
📖 第 1 页 / 共 4 页
字号:
	}		
	
	info.Type = DDDATA;
	info.Start = 0;
	
	DBRead((INT8U*)val, &info);
	
	alo->buf[5] = AL_OV_A_32BIT;
	alo->buf[6] = 0x07;
	alo->buf[7] = num;   		//总遥测个数
	for( i=0;i<num;i++)
	{
		alo->buf[8+4*i]	 =  LOW(val[i]);
		alo->buf[8+4*i+1] = HIGH(val[i]);
		alo->buf[8+4*i+2] =  LOW(val[i]>>16);
		alo->buf[8+4*i+3] = HIGH(val[i]>>16);
	}
	

	AppSend(m_wIIN[port-1], AL_OG_CON, 8+alo->buf[7]*4,port);
}
/*------------------------------------------------------------------------
 Procedure:     SendCOS
 Purpose:       传送变化遥信(COS).
 Input:	
 Output:		
 Errors:
------------------------------------------------------------------------*/
void SendCOS(INT8U port)
{
	INT8U CosMem[sizeof(struct COS_t)*25];
	struct DBInfo	info;

	stIPacket *ali = NULL;
	stOPacket *alo = NULL;	

	if(port == COM1)
	{
		ali = aliCom1;
		alo = aloCom1;
	}
	else if(port == COM2)
	{
		ali = aliCom2;
		alo = aloCom2;
	}
	
	if(port == COM1)
	{
		info.SuperID = pp1->DBCfgs->DevID;
		info.DevID = pp1->DBCfgs->DevID;
	}
	if(port == COM2)
	{
		info.SuperID = pp2->DBCfgs->DevID;
		info.DevID = pp2->DBCfgs->DevID;
	}
	
	if(!(m_wIIN[port-1]&AL_IIN_CLASS1))
	{
		memset(CosMem,0,sizeof(struct COS_t)*25);
		memset(&DnpCosinfo[port-1],0,sizeof(struct DBInfo));
	}	
	
	info.Type = COSDATA;
	info.Start = STARTTYPE;
	info.Num = 25;
	if(DBRead(CosMem, &info)==FALSE && !(m_wIIN[port-1]&AL_IIN_CLASS1))
		{SendStatus(AL_IIN_ZERO,port); return ;}
	if(info.Num == 0)
	{
		SendStatus(AL_IIN_ZERO,port); return;
	}
	Sequence[port-1] = ali->buf[0]&0x0F;
	alo->buf[5]=AL_OV_SOE_N_TIME;	alo->buf[6]=0x28;

	DnpCosinfo[port-1].DevID = info.DevID;
	DnpCosinfo[port-1].Type = COSDATA;
	DnpCosinfo[port-1].Start = 0xffff;
	DnpCosinfo[port-1].Num = info.Num;
	DnpCosinfo[port-1].SuperID = info.SuperID;
	
	memcpy((INT8U*)&alo->buf[9],&CosMem[0],sizeof(struct COS_t)*info.Num);
	
	alo->buf[7]=info.Num;	alo->buf[8]=0;
	AppSend(m_wIIN[port-1], AL_OG_SOE, 9+3*info.Num, port);
//	alo->buf[0]=AL_AC_FIR + AL_AC_FIN + AL_AC_CON + Sequence[port-1];
}
/*------------------------------------------------------------------------
 Procedure:     SendSOE
 Purpose:       传送事项记录(SOE).单包传送SOE最大数(249-9)/9.
 Input:	
 Output:		
 Errors:
------------------------------------------------------------------------*/
void SendSOE(INT8U port)
{
	UCHAR i;
	INT8U SoeMem[sizeof(struct SOE_t)*25];

	struct DBInfo	info;
	INT8U	size, tmp[6];

	stIPacket *ali = NULL;
	stOPacket *alo = NULL;	
	SoeReadPoint *soe = NULL;
	if(port == COM1)
	{
		ali = aliCom1;
		alo = aloCom1;
		soe = SoeReadCom1;
	}
	else if(port == COM2)
	{
		ali = aliCom2;
		alo = aloCom2;
		soe = SoeReadCom2;
	}
	
	if(port == COM1)
	{
		info.SuperID = pp1->DBCfgs->DevID;
		info.DevID = pp1->DBCfgs->DevID;
	}
	if(port == COM2)
	{
		info.SuperID = pp2->DBCfgs->DevID;
		info.DevID = pp2->DBCfgs->DevID;
	}
	
	if(!(m_wIIN[port-1]&AL_IIN_CLASS2))
	{
		memset(SoeMem,0,sizeof(struct SOE_t)*25);
		memset(&DnpSoeinfo[port-1],0,sizeof(struct DBInfo));
	}	
	
	info.Type = SOEDATA;
	info.Start = STARTTYPE;
	info.Num = 25;
	if(DBRead(SoeMem, &info)==FALSE && !(m_wIIN[port-1]&AL_IIN_CLASS2))
		{SendStatus(AL_IIN_ZERO,port); return ;}
	if(info.Num == 0)
	{
		SendStatus(AL_IIN_ZERO,port); return;
	}
	Sequence[port-1] = ali->buf[0]&0x0F;
	alo->buf[5]=AL_OV_SOE_A_TIME;	alo->buf[6]=0x28;

	DnpSoeinfo[port-1].DevID = info.DevID;
	DnpSoeinfo[port-1].Type = SOEDATA;
	DnpSoeinfo[port-1].Start = 0xffff;
	DnpSoeinfo[port-1].Num = info.Num;
	DnpSoeinfo[port-1].SuperID = info.SuperID;
	
	size = 0;
	for(i=0;i<info.Num;i++)
	{
		TimeChange((void*)tmp, DNPTIME, (void*)&SoeMem[3+size],ABSTIME);
		memcpy (&SoeMem[3+size], tmp, 6);
		size += sizeof(struct SOE_t);
	}
	memcpy((INT8U*)&alo->buf[9],&SoeMem[0],sizeof(struct SOE_t)*info.Num);
	
	alo->buf[7]=info.Num;	alo->buf[8]=0;
	AppSend(m_wIIN[port-1], AL_OG_SOE, 9+9*info.Num, port);
//	alo->buf[0]=AL_AC_FIR + AL_AC_FIN + AL_AC_CON + Sequence[port-1];
	
}
/*------------------------------------------------------------------------
 Procedure:     SelectYK ID:1
 Purpose:       遥控预置.
 Input:
 Output:
 Errors:
------------------------------------------------------------------------*/
void SelectYK(INT8U port)
{
	struct BOCode code;
	struct DBInfo info;
	INT16U	YKID;

	stIPacket *ali = NULL;
	stOPacket *alo = NULL;	
	
	if(port == COM1)
	{

		ali = aliCom1;
		alo = aloCom1;
	}
	else if(port == COM2)
	{
		ali = aliCom2;
		alo = aloCom2;
	}

	alo->buf[5]  = AL_OV_YK_1;	alo->buf[6]  = 0x28;
	alo->buf[7]  = 0x01;		alo->buf[8]  = 0x00;
	memmove((void*)&(alo->buf[9]), (void *)&(ali->buf[7]), 12);
	YKID = ali->buf[7];
	
	if(!DnpSecPadPara[port-1]->EnYk)
	{
		alo->buf[21] = 5;
		AppSend(m_wIIN[port-1], AL_OG_YK, 22, port);
		return ;
	}	
	
	if((ali->buf[9]&0xE0) == DNP_AL_YK_H)
	{
		code.Control = BOCLOSE;
		if(port == COM1)
		{
			info.SuperID = pp1->DBCfgs->DevID;
			info.DevID = pp1->DBCfgs->DevID;
		}
		if(port == COM2)
		{
			info.SuperID = pp2->DBCfgs->DevID;
			info.DevID = pp2->DBCfgs->DevID;
		}

		info.Type = BORESQ;
		info.Start = YKID;
		info.Num = BOSELECT;
		code.Status = 0;
		DBOperate ((INT8U*)&code, &info);
		if (code.Status == BORCOK)
		{
			alo->buf[21] = 0;
			return ;				//预置成功
		}
		else
			alo->buf[21] = 5;					//预置失败
		
	}
	else if((ali->buf[9]&0xE0) == DNP_AL_YK_F)
	{
		code.Control = BOOPEN;
		if(port == COM1)
		{
			info.SuperID = pp1->DBCfgs->DevID;
			info.DevID = pp1->DBCfgs->DevID;
		}
		if(port == COM2)
		{
			info.SuperID = pp2->DBCfgs->DevID;
			info.DevID = pp2->DBCfgs->DevID;
		}

		info.Type = BORESQ;
		info.Start = YKID;
		info.Num = BOSELECT;
		code.Status = 0;
		DBOperate ((INT8U*)&code, &info);
		if (code.Status == BORCOK)
		{
			alo->buf[21] = 0;					//预置成功
			return ;
		}
		else
			alo->buf[21] = 5;					//预置失败
	}
//	else if((ali->buf[9]&0xE0) == DNP_AL_YK_DEL)
	else
	{
		code.Control = ali->buf[9];//BODEL | 0x80;
		if(port == COM1)
		{
			info.SuperID = pp1->DBCfgs->DevID;
			info.DevID = pp1->DBCfgs->DevID;
		}
		if(port == COM2)
		{
			info.SuperID = pp2->DBCfgs->DevID;
			info.DevID = pp2->DBCfgs->DevID;
		}

		info.Type = BORESQ;
		info.Start = YKID;
		info.Num = BOSELECT;
		code.Status = 0;
		DBOperate ((INT8U*)&code, &info);
		if (code.Status == BORCOK)
		{
			alo->buf[21] = 0;					//成功
			return ;
		}
		else
			alo->buf[21] = 5;					//失败
		
	}	
//	else
//		alo->buf[21] = 3;					//控制码错
	
	AppSend(m_wIIN[port-1], AL_OG_YK, 22, port);
}
/*------------------------------------------------------------------------
 Procedure:     OperateYK ID:1
 Purpose:       遥控执行/撤销.
 Input:
 Output:
 Errors:
------------------------------------------------------------------------*/
void OperateYK(INT8U port)
{
	struct BOCode code;
	struct DBInfo info;
	INT16U	YKID;
	

	stIPacket *ali = NULL;
	stOPacket *alo = NULL;	
	
	if(port == COM1)
	{

		ali = aliCom1;
		alo = aloCom1;
	}
	else if(port == COM2)
	{

		ali = aliCom2;
		alo = aloCom2;
	}	
	alo->buf[5] = AL_OV_YK_1;	alo->buf[6]  = 0x28;	
	alo->buf[7] = 0x01;			alo->buf[8]  = 0x00;
	memmove((void *)&(alo->buf[9]), (void *)&(ali->buf[7]), 12);

	YKID = ali->buf[7];
/*	if((ali->buf[9]&0xE0) == DNP_AL_YK_DEL)
	{
		code.Control = BODEL;
		if(port == COM1)
		{
			info.SuperID = pp1->DBCfgs->DevID;
			info.DevID = pp1->DBCfgs->DevID;
		}
		if(port == COM2)
		{
			info.SuperID = pp2->DBCfgs->DevID;
			info.DevID = pp2->DBCfgs->DevID;
		}

		info.Type = BORESQ;
		info.Start = YKID;
		info.Num = BOSELECT;
		code.Status = 0;
		DBOperate ((INT8U*)&code, &info);
		if (code.Status == BORCOK)
		{
			alo->buf[21] = 0;					//成功
//			return ;
		}
		else
			alo->buf[21] = 5;					//失败
		
	}*/
	if ((ali->buf[9]&0xE0) == DNP_AL_YK_H)	
	{
		code.Control = BOCLOSE;
		if(port == COM1)
		{
			info.SuperID = pp1->DBCfgs->DevID;
			info.DevID = pp1->DBCfgs->DevID;
		}
		if(port == COM2)
		{
			info.SuperID = pp2->DBCfgs->DevID;
			info.DevID = pp2->DBCfgs->DevID;
		}

		info.Type = BORESQ;
		info.Start = YKID;
		info.Num = BOOPERATE;
		code.Status = 0;
		DBOperate ((INT8U*)&code, &info);
		if (code.Status == BORCOK)
		{
			alo->buf[21] = 0;					//成功
			return ;
		}
		else
			alo->buf[21] = 5;					//失败
	}
	else if ((ali->buf[9]&0xE0) == DNP_AL_YK_F )
	{
		code.Control = BOOPEN;
		if(port == COM1)
		{
			info.SuperID = pp1->DBCfgs->DevID;
			info.DevID = pp1->DBCfgs->DevID;
		}
		if(port == COM2)
		{
			info.SuperID = pp2->DBCfgs->DevID;
			info.DevID = pp2->DBCfgs->DevID;
		}

		info.Type = BORESQ;
		info.Start = YKID;
		info.Num = BOOPERATE;
		code.Status = 0;
		DBOperate ((INT8U*)&code, &info);
		if (code.Status == BORCOK)
		{
			alo->buf[21] = 0;					//成功
			return ;
		}
		else
			alo->buf[21] = 5;					//失败
	}
	else		alo->buf[21] = 3;					//控制码错

	AppSend(m_wIIN[port-1], AL_OG_YK, 22, port);

}
/*------------------------------------------------------------------------
 Procedure:     AppSend ID:1
 Purpose:       公共发送函数.
 Input:
 Output:
 Errors:
------------------------------------------------------------------------*/
void AppSend(USHORT iin, UCHAR obj, USHORT count,INT8U port)
{
	INT8U err;
	stIPacket *ali = NULL;
	stOPacket *alo = NULL;	
	
	if(port == COM1)
	{
		ali = aliCom1;
		alo = aloCom1;
	}
	else if(port == COM2)
	{
		ali = aliCom2;
		alo = aloCom2;
	}	
	if(obj == AL_OG_SOE)
		alo->buf[0]=AL_AC_FIR + AL_AC_FIN + AL_AC_CON + Sequence[port-1];
	else
		alo->buf[0] = 0xC0 + (ali->buf[0]&0x0F);
	alo->buf[1] = AL_FC_REPLY;
	alo->buf[2] =  LOW(iin);
	alo->buf[3] = HIGH(iin);
	alo->buf[4] = obj;
	
	alo->dest  = ali->source;	alo->count   = count;
	alo->ready = TRUE;		alo->service = DL_SEND_NOCF;
	bsending[port-1]  = obj; 		
	if(port == COM1)
		OSFlagPost(pp1->Event,Dnp_Al_Ready,OS_FLAG_SET,&err);
	if(port == COM2)
		OSFlagPost(pp2->Event,Dnp_Al_Ready,OS_FLAG_SET,&err);
}

int  CheckAddr(INT16U SourceAddr,INT16U DesAddr,INT8U port)
{			/*校验目的地址*/
		if(SourceAddr==0xFFFF)
		{
			TimeFlag = TRUE;
			return 0;	/*公共站号*/
		}
		if(port == COM1)
		{
			if((SourceAddr==pp1->DBCfgs->Address)&&(DesAddr==pp1->DBCfgs->MAddress))
			{
				TimeFlag = FALSE;
		  		return 1;
			}
		}
		if(port == COM2)
		{
			if((SourceAddr==pp2->DBCfgs->Address)&&(DesAddr==pp2->DBCfgs->MAddress))
			{
				TimeFlag = FALSE;
		  		return 1;
			}
		}
		return -1;					/*无效站号*/
}


/*------------------------------------------------------------------------
 Procedure:     AppYcVar ID:1
 Purpose:       变化遥测.
 Input:			置位遥测变化;
 Output:        变化遥测.
 Errors:
------------------------------------------------------------------------*/
INT16U AppYcVar(INT8U port)
{
	INT16U num,i;
	INT8U	*value;
	INT16S	new_yc,old_yc;
	INT16U	VarYcNum;
	
	struct DBInfo	info;

	info.Type = YCDATA;
	info.Start = 0;
	if(port == COM1)
	{
		info.SuperID = pp1->DBCfgs->DevID;
		info.DevID = pp1->DBCfgs->DevID;
		info.Num = pp1->DBCfgs->YCNum;
		value = YC_Value[0];
	}
	if(port == COM2)
	{
		info.SuperID = pp2->DBCfgs->DevID;
		info.DevID = pp2->DBCfgs->DevID;
		info.Num = pp2->DBCfgs->YCNum;
		value = YC_Value[1];
	}
	DBRead(value, &info);

	num = info.Num;
	VarYcNum = 0;
	for(i=0;i<num;i++)
	{
		new_yc = (INT16S)(MERGE(*(value+i*2+1),*(value+i*2)));
		if(port==COM1)
		{
			old_yc = VarYcValueStruct[0][i].YcValue;
//			if( abs(new_yc-old_yc) > *(YCDValue[0]+i))
			if (new_yc > (*(YCDValue[1]+i) + old_yc) || new_yc < (*(YCDValue[1]+i) - old_yc))
			{
				VarYcValueStruct[0][i].YcNo = TRUE;
				VarYcValueStruct[0][i].YcValue = new_yc;
				VarYcNum++;
			}
		}
		else if(port==COM2)
		{
			old_yc = VarYcValueStruct[1][i].YcValue;
			
//			if( abs(new_yc-old_yc) > *(YCDValue[1]+i))
			if (new_yc > (*(YCDValue[1]+i) + old_yc) || new_yc < (*(YCDValue[1]+i) - old_yc))
			{
				VarYcValueStruct[1][i].YcNo = TRUE;
				VarYcValueStruct[1][i].YcValue = new_yc;
				VarYcNum++;
			}
		}
	}
	return VarYcNum;
}

void YkRespond(struct SysPort *info, struct DBBOOPInfo *msg, INT8U port)
{
	stOPacket *alo = NULL;	
	
	if(port == COM1)
	{
		alo = aloCom1;
	}
	else if(port == COM2)
	{
		alo = aloCom2;
	}	
	alo->buf[5]  = AL_OV_YK_1;	alo->buf[6]  = 0x28;
	alo->buf[7]  = 0x01;		alo->buf[8]  = 0x00;
	
	alo->buf[9]  = LOW(msg->SID);	alo->buf[10]  = HIGH(msg->SID);
	alo->buf[11]  = LOW(msg->Status);		alo->buf[12]  = 0x01;	
	
	alo->buf[13]  = 0x0;	alo->buf[14]  = 0x0;
	alo->buf[15]  = 0x0;	alo->buf[16]  = 0x0;
	
	alo->buf[17]  = 0x0;	alo->buf[18]  = 0x0;
	alo->buf[19]  = 0x0;	alo->buf[20]  = 0x0;
	
	alo->buf[21]  = 0x0;
	
	AppSend(m_wIIN[port-1], AL_OG_YK, 22, port);	
}

⌨️ 快捷键说明

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