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

📄 dnpsec.c

📁 详细介绍了arm7-at91r40008,的开发全过程
💻 C
📖 第 1 页 / 共 4 页
字号:
	else if(port == COM2)
	{
		ali = aliCom2;
		alo = aloCom2;
	}	
	alo->buf[0] = 0xC0 + (ali->buf[0]&0x0F);
	alo->buf[1] = AL_FC_CONFIRM;
	alo->buf[2] =  LOW(m_wIIN[port-1]);
	alo->buf[3] = HIGH(m_wIIN[port-1]);

	alo->dest = ali->source;	alo->count = 4;
	alo->ready = TRUE;		alo->service = DL_SEND_NOCF;
	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);
}
/*----------------------------------------------------------------------------
 Procedure:     AppFuction
 Purpose:       应用层选择类数据函数.
 Input:
 Output:
 Errors:
------------------------------------------------------------------------*/
void AppFuntion(INT32U Class,INT8U port)
{
	switch(Class)
	{
		case 0:	SendStatus(AL_IIN_ZERO,port);	break;
		case 1:	
		case 2: SendCOS(port);					break;
		case 3:
		case 4: SendYC(port);					break;
		case 5:	SendAllData(port);				break;
		case 6:	SendStatus(AL_IIN_ZERO,port);	break;
		case 7: SendSOE(port);					break;
		case 8:	
		case 9:	SendCOS(port);					break;
		default:SendStatus(AL_IIN_UNOBJ,port);	break;
	}
}

/*------------------------------------------------------------------------
 Procedure:     AppRes
 Purpose:       应用层回答函数.
 Input:
 Output:
 Errors:
------------------------------------------------------------------------*/
void AppRes(INT8U port)
{
	static UCHAR FunCode, ObjClass, SubClass, Qualifier; 
	struct DnpTime_t Dnptm;	
	stIPacket *ali = NULL;
	stOPacket *alo = NULL;	

	if(port == COM1)
	{
		ali = aliCom1;
		alo = aloCom1;
	}
	else if(port == COM2)
	{
		ali = aliCom2;
		alo = aloCom2;
	}	
	FunCode   = ali->buf[1];	ObjClass  = ali->buf[2];
	SubClass  = ali->buf[3];	Qualifier = ali->buf[4];

	switch(FunCode) {
	case AL_FC_CONFIRM:					/*作为原方等待副方站确认*/
		ResConfirm(port);
		break;
	case AL_FC_READ:
		if(ObjClass==AL_OG_CLASS)	
		{
			if     (m_wIIN[port-1]&AL_IIN_CLASS1)	AppFuntion(DnpSecPadPara[port-1]->Class1Data,port);//SendYX(port);
        	else if(m_wIIN[port-1]&AL_IIN_CLASS2)	AppFuntion(DnpSecPadPara[port-1]->Class2Data,port);//SendSOE(port);
        	else if(m_wIIN[port-1]&AL_IIN_CLASS3)	AppFuntion(DnpSecPadPara[port-1]->Class3Data,port);//SendSOE(port);
        	else 									SendYC(port);
		}	
		
		else if(ObjClass==AL_OG_YX)					SendYX(port);
		else if(ObjClass==AL_OG_ANALOG)				SendYC(port);					
                
        else if(ObjClass==AL_OG_VAR1)       /*传送变化数据*/
        {
        	if     (m_wIIN[port-1]&AL_IIN_CLASS1)	AppFuntion(DnpSecPadPara[port-1]->Class1Data,port);//SendYX(port);
	        else if(m_wIIN[port-1]&AL_IIN_CLASS2)	AppFuntion(DnpSecPadPara[port-1]->Class2Data,port);//SendSOE(port);
	        else if(m_wIIN[port-1]&AL_IIN_CLASS3)	AppFuntion(DnpSecPadPara[port-1]->Class3Data,port);//SendSOE(port);
	        else
	        {
	        	if(ValueFlag[port-1])
	        	{
	        		SendVarYC(port);
	        	}
	        	else
	        	{
	        			SendYC(port);
	        	}
	        }
		}
               
        else if(ObjClass==AL_OG_SOE) 				SendSOE(port);
		else if(ObjClass==AL_OG_STATUS)				SendStatus(AL_IIN_ZERO,port);
		else if(ObjClass==AL_OG_CON)
		{
//			if(DnpSecPadPara[port-1]->EnDD)
				SendDD(port);
//			else
//				SendStatus(AL_IIN_UNOBJ,port);
		}
		else	SendStatus(AL_IIN_UNOBJ,port);
		break;
	
	case AL_FC_WRITE:
		/*子站与RTU对钟, TIME=子站发送时间+通道延时+处理延时.*/
		if (ObjClass==AL_OG_TIME)
		{
			Dnptm.Times[0] = ali->buf[6];
			Dnptm.Times[1] = ali->buf[7];
			Dnptm.Times[2] = ali->buf[8];
			Dnptm.Times[3] = ali->buf[9];
			Dnptm.Times[4] = ali->buf[10];
			Dnptm.Times[5] = ali->buf[11];
			if(DnpSecPadPara[port-1]->EnClock)
				SetTime((void *)&Dnptm,DNPTIME);	//写时间

			m_wIIN[port-1] = m_wIIN[port-1]&(~AL_IIN_TIME);
			if(TimeFlag == TRUE)
			{
				TimeFlag = FALSE;
			}
			else
			{
				SendStatus(AL_IIN_ZERO,port);
			}
		}
		else	SendStatus(AL_IIN_UNOBJ,port);
		break;
	case AL_FC_SELECT:							/*遥控预置*/
		if (ObjClass==AL_OG_YK && SubClass==AL_OV_YK_1) {
			if (Qualifier==0x28)		SelectYK(port);
			else						SendStatus(AL_IIN_UNIND,port);
		}
		else							SendStatus(AL_IIN_UNOBJ,port);
		break;
	case AL_FC_OPERATE: 						/*遥控执行和撤销*/
		if (ObjClass==AL_OG_YK && SubClass==AL_OV_YK_1) {
			if (Qualifier==0x28) 		OperateYK(port);
			else						SendStatus(AL_IIN_UNIND,port);
		}
		else							SendStatus(AL_IIN_UNOBJ,port);
		break;
	case AL_FC_WARM_RESTART:					/*热复位*/
						//热复位函数或标志
				KillProg(RESET_RETAIN, RESET_DD, TRUE);
				break;
	case AL_FC_COLD_RESTART:					/*冷复位*/
						//冷复位函数或标志
				KillProg(RESET_CLR, RESET_DD, TRUE);
				break;
	default:									/*未知功能码*/
		SendStatus(AL_IIN_UNFUN,port);	break;
	}
	ali->ready=FALSE;
}
/*------------------------------------------------------------------------
 Procedure:     SendStatus
 Purpose:       状态回答(不明对象, 状态查询).
 Input:
 Output:
 Errors:
------------------------------------------------------------------------*/
void SendStatus(USHORT iin,INT8U port)
{
	AppSend((m_wIIN[port-1]|iin), AL_OG_STATUS, 4,port);
}
/*------------------------------------------------------------------------
 Procedure:     ResConfirm
 Purpose:       确认帧反应.
 Input:
 Output:
 Errors:
------------------------------------------------------------------------*/
void ResConfirm(INT8U port)
{	
	stIPacket *ali = NULL;
	stOPacket *alo = NULL;	
	
	if(port == COM1)
	{
		ali = aliCom1;
		alo = aloCom1;
	}
	else if(port == COM2)
	{

		ali = aliCom2;
		alo = aloCom2;
	}
		
	if ( (ali->buf[0]&0x0F)==Sequence[port-1])
	{
		if (DnpSoeinfo[port-1].Type == SOEDATA)
		{
			if(DBClear(&DnpSoeinfo[port-1]))
			{
				if(!DBCheck(&DnpSoeinfo[port-1]))
					m_wIIN[port-1] = m_wIIN[port-1]&(~AL_IIN_CLASS2);	/*清SOE上送标志*/
				
				memset((INT8U *)&DnpSoeinfo[port-1],0,sizeof(struct DBInfo));
			}
		}
		if (DnpCosinfo[port-1].Type == COSDATA)
		{
			if(DBClear(&DnpCosinfo[port-1]))
			{
				if(!DBCheck(&DnpCosinfo[port-1]))
					m_wIIN[port-1] = m_wIIN[port-1]&(~AL_IIN_CLASS1);	/*清COS上送标志*/
				
				memset((INT8U *)&DnpCosinfo[port-1],0,sizeof(struct DBInfo));
			}
		}
	}
	
}


/*------------------------------------------------------------------------
 Procedure:     SendYX ID:1
 Purpose:       送遥信.
 Input:
 Output:
 Errors:
------------------------------------------------------------------------*/
void SendYX(INT8U port)
{
	USHORT index;
	INT8U	*yxstatus;
	INT8U i,yxnum;
	struct DBInfo	info;

	stOPacket *alo = NULL;	
	
	if(port == COM1)
	{
		alo = aloCom1;
		yxstatus = YX_Value[0];
	}
	else if(port == COM2)
	{
		alo = aloCom2;
		yxstatus = YX_Value[1];
	}

	info.Type = YXDATA;
	
	info.Start = 0;
	if(port == COM1)
	{
		info.SuperID = pp1->DBCfgs->DevID;
		info.DevID = pp1->DBCfgs->DevID;
		info.Num = pp1->DBCfgs->YXNum;
	}
	if(port == COM2)
	{
		info.SuperID = pp2->DBCfgs->DevID;
		info.DevID = pp2->DBCfgs->DevID;
		info.Num = pp2->DBCfgs->YXNum;
	}
//	yxstatus = malloc(info.Num);
	DBRead(yxstatus, &info);
	if(port == COM1)
		yxnum = pp1->DBCfgs->YXNum;
	if(port == COM2)
		yxnum = pp2->DBCfgs->YXNum;
	index = 5;
	alo->buf[index++]  = AL_OV_YX_2;	alo->buf[index++]  = 0x01;
	alo->buf[index++]  = 0x00;		alo->buf[index++]  = 0x00;

	alo->buf[index++]  = yxnum;		alo->buf[index++]  = 0;

	for(i=0;i<yxnum;i++)
	{
		alo->buf[index++] = yxstatus[i];
	}
//	free(yxstatus);
//	m_wIIN[port-1] = m_wIIN[port-1]&(~AL_IIN_CLASS1);
	AppSend(m_wIIN[port-1], AL_OG_YX, index, port);
}
/*------------------------------------------------------------------------
 Procedure:     SendVarYC ID:1
 Purpose:       变化遥测.
 Input:
 Output:
 Errors:
------------------------------------------------------------------------*/
void SendVarYC(INT8U port)
{
	INT16U num;
	INT16U i;

	struct DBInfo	info;

	stIPacket *ali = NULL;
	stOPacket *alo = NULL;	
	VarYcValue *VarYc = NULL;
	
	if(port == COM1)
	{
		ali = aliCom1;
		alo = aloCom1;
		VarYc = VarYcValueStruct[0];
	}
	else if(port == COM2)
	{
		ali = aliCom2;
		alo = aloCom2;
		VarYc = VarYcValueStruct[1];
	}	

	info.Type = YCDATA;
	info.Start = 0;
	if(port == COM1)
	{
		info.Num = pp1->DBCfgs->YCNum;
		info.DevID = pp1->DBCfgs->DevID;
		info.Num = pp1->DBCfgs->YCNum;
	}
	if(port == COM2)
	{
		info.Num = pp2->DBCfgs->YCNum;
		info.DevID = pp2->DBCfgs->DevID;
		info.Num = pp2->DBCfgs->YCNum;
	}
	
	alo->buf[5] = AL_OV_CLASS_2;
	alo->buf[6] = 0x17;
	
	num = 0;
	
	for(i=0;i<info.Num;i++)
	{
		if(VarYc[i].YcNo)
		{
			alo->buf[8+num*4] = i;
			alo->buf[9+num*4] = 1;
			alo->buf[10+num*4] = LOW(VarYc[i].YcValue);
			alo->buf[11+num*4] = HIGH(VarYc[i].YcValue);
			num++;
		}
	}
	alo->buf[7] = num;   		//变化遥测个数
	
	for(i=0;i<info.Num;i++)
	{
		if(VarYcValueStruct[port-1][i].YcNo)
		{
			VarYcValueStruct[port-1][i].YcNo = FALSE;
		}
	}	

	AppSend(m_wIIN[port-1], AL_OG_VAR1, 8+alo->buf[7]*4, port);
}

/*------------------------------------------------------------------------
 Procedure:     SendYC ID:1
 Purpose:       将遥测传送到子站.
 Input:
 Output:
 Errors:
------------------------------------------------------------------------*/
void SendYC(INT8U port)
{
	INT16U i;
	INT16U num;
	INT8U *value;
	
	struct DBInfo	info;
	
	stIPacket *ali = NULL;
	stOPacket *alo = NULL;	
	
	if(port == COM1)
	{
		ali = aliCom1;
		alo = aloCom1;
		value = YC_Value[0];
	}
	else if(port == COM2)
	{
		ali = aliCom2;
		alo = aloCom2;
		value = YC_Value[1];
	}	

	info.Type = YCDATA;
	info.Start = 0;
	if(port == COM1)
	{
		info.SuperID = pp1->DBCfgs->DevID;
		info.DevID = pp1->DBCfgs->DevID;
		info.Num = pp1->DBCfgs->YCNum;
	}
	if(port == COM2)
	{
		info.SuperID = pp2->DBCfgs->DevID;
		info.DevID = pp2->DBCfgs->DevID;
		info.Num = pp2->DBCfgs->YCNum;
	}
//	value = malloc(info.Num*2);
	DBRead(value, &info);
	num = info.Num;
	
	for(i=0;i<num;i++)
	{
		VarYcValueStruct[port-1][i].YcNo = FALSE;
		VarYcValueStruct[port-1][i].YcValue = (INT16S)(MERGE(*(value+i*2+1),*(value+i*2)));
	}
	

	alo->buf[5] = AL_OV_A_16BIT;
	alo->buf[6] = 0x07;
	alo->buf[7] = num;   		/*总遥测个数*/


	ValueFlag[port-1] = TRUE;	//可以发变化遥测
	
	memcpy ((char*)alo->buf+8, value, num * 2);
	
//	free(value);
	
	AppSend(m_wIIN[port-1], AL_OG_ANALOG, 8+alo->buf[7]*2, port);
}
/*------------------------------------------------------------------------
 Procedure:     SendAllData ID:1
 Purpose:       送全数据.
 Input:
 Output:
 Errors:
------------------------------------------------------------------------*/
void SendAllData(INT8U port)
{
	USHORT index;
	INT8U  *yxstatus;
	INT8U i,yxnum;
	INT8U num;
	
	INT8U	*value;

	struct DBInfo	info;
	
	stIPacket *ali = NULL;
	stOPacket *alo = NULL;	
	
	if(port == COM1)
	{
		ali = aliCom1;
		alo = aloCom1;
		yxstatus = YX_Value[0];
		value = YC_Value[0];
	}
	else if(port == COM2)
	{
		ali = aliCom2;
		alo = aloCom2;
		yxstatus = YX_Value[1];
		value = YC_Value[1];
	}
	info.Type = YXDATA;
	
	info.Start = 0;
	if(port == COM1)
	{
		info.SuperID = pp1->DBCfgs->DevID;
		info.DevID = pp1->DBCfgs->DevID;
		info.Num = pp1->DBCfgs->YXNum;
	}
	if(port == COM2)
	{
		info.Num = pp2->DBCfgs->YXNum;
		info.SuperID = pp2->DBCfgs->DevID;
		info.DevID = pp2->DBCfgs->DevID;
	}
//	yxstatus = malloc(info.Num);
	DBRead(yxstatus, &info);
	if(port == COM1)
		yxnum = pp1->DBCfgs->YXNum;
	if(port == COM2)
		yxnum = pp2->DBCfgs->YXNum;
	index = 5;
	alo->buf[index++]  = AL_OV_YX_2;	alo->buf[index++]  = 0x01;
	alo->buf[index++]  = 0x00;		alo->buf[index++]  = 0x00;

	alo->buf[index++]  = yxnum;		alo->buf[index++]  = 0;

	for(i=0;i<yxnum;i++)
	{
		alo->buf[index++] = yxstatus[i];
	}

	info.Type = YCDATA;
	info.Start = 0;
	if(port == COM1)
	{
		info.Num = pp1->DBCfgs->YCNum;
		info.SuperID = pp1->DBCfgs->DevID;
		info.DevID = pp1->DBCfgs->DevID;
	}
	if(port == COM2)
	{
		info.Num = pp2->DBCfgs->YCNum;
		info.SuperID = pp2->DBCfgs->DevID;
		info.DevID = pp2->DBCfgs->DevID;
	}
//	value = malloc(info.Num*2);
	if(value == NULL)
		return ;
	DBRead(value, &info);

	num = info.Num;
	
	for(i=0;i<num;i++)
	{
		VarYcValueStruct[port-1][i].YcNo = FALSE;
		VarYcValueStruct[port-1][i].YcValue = (INT16S)(MERGE(*(value+i*2+1),*(value+i*2)));
	}
	
	alo->buf[index++] = AL_OG_ANALOG;
	alo->buf[index++] = AL_OV_A_16BIT;
	alo->buf[index++] = 0x07;
	alo->buf[index++] = num;   		//总遥测个数

	for(i=0;i<num;i++)
	{
		alo->buf[index++] = *(value+i*2);
		alo->buf[index++] = *(value+i*2+1);
	}

	ValueFlag[port-1] = TRUE;	//可以发变化遥测
	
//	free(yxstatus);	
//	free(value);

	
//	m_wIIN[port-1] = m_wIIN[port-1]&(~AL_IIN_CLASS1);
	AppSend(m_wIIN[port-1], AL_OG_YX, index, port);
}

/*------------------------------------------------------------------------
 Procedure:     SendDD
 Purpose:       将电度传送到子站.
 Input:
 Output:
 Errors:
------------------------------------------------------------------------*/
void SendDD(INT8U port)
{
	int i;
	ULONG val[50];
	UCHAR num = 0;
	struct DBInfo	info;	
	stIPacket *ali = NULL;
	stOPacket *alo = NULL;	
	
	if(port == COM1)
	{
		ali = aliCom1;
		alo = aloCom1;
		info.Num = pp1->DBCfgs->YCNum;
		info.SuperID = pp1->DBCfgs->DevID;
		info.DevID = pp1->DBCfgs->DevID;
		num = pp1->DBCfgs->YCNum;
	}
	else if(port == COM2)
	{
		ali = aliCom2;
		alo = aloCom2;
		info.Num = pp2->DBCfgs->YCNum;
		info.SuperID = pp2->DBCfgs->DevID;
		info.DevID = pp2->DBCfgs->DevID;
		num = pp2->DBCfgs->DevID;

⌨️ 快捷键说明

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