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

📄 101secapp.c

📁 详细介绍了arm7-at91r40008,的开发全过程
💻 C
📖 第 1 页 / 共 3 页
字号:

/*------------------------------------------------------------------*/
/*函数名称:ProcSetNVA()											*/
/*函数功能:设定命令												*/
/*------------------------------------------------------------------*/
void ProcSetNVA(INT8U Port)
{
	
	
	
}

/*------------------------------------------------------------------*/
/*函数名称:ProcAllDataCall()										*/
/*函数功能:总召唤或分组召唤										*/
/*------------------------------------------------------------------*/
void ProcAllDataCall(INT8U Port)
{
	INT8U	i;
	
	i = Port - 1;
	if (!((ComApp[i]->GroupTrn.TypeID == 0) || (ComApp[i]->GroupTrn.TypeID == C_IC_NA)))
	{
		EnCodeAllDataEnd(Port, C_IC_NA);
		return ;
	}
	
	
	if (!(ComApp[i]->AllDataFlag))
	{
		ComApp[i]->AllDataFlag = TRUE;
		ComApp[i]->GroupTrn.DevID = ComApp[i]->ActDevIndex;
		ComApp[i]->GroupTrn.TypeID = C_IC_NA;
		ComApp[i]->GroupTrn.COT = ComApp[i]->RxMsg->Data[0];
		
		ComApp[i]->GroupTrn.GroupNo = 1;
		ComApp[i]->GroupTrn.InfoAddr = LBI;
		if (ComApp[i]->RxMsg->Head.PubAddr == BROADCASTADDR)
			ComApp[i]->AllDataNum = 0;
		else
			ComApp[i]->AllDataNum = ComDb[i]->DBCfgs->Info.Logic.DevNum;
		
		if (ComApp[i]->RxMsg->Data[0] != INTROGEN)	//分组召唤
		{
			ComApp[i]->GroupTrn.GroupNo = ComApp[i]->RxMsg->Data[0] - INTROGEN;
			if (ComApp[i]->GroupTrn.GroupNo <= 8)
				ComApp[i]->GroupTrn.InfoAddr = LBI + 0x80*(ComApp[i]->GroupTrn.GroupNo-1);
			else if (ComApp[i]->GroupTrn.GroupNo <= 12)
				ComApp[i]->GroupTrn.InfoAddr = LAI + 0x80*(ComApp[i]->GroupTrn.GroupNo-9);
			else if (ComApp[i]->GroupTrn.GroupNo == 13)
				ComApp[i]->GroupTrn.InfoAddr = LSPI;
			else if (ComApp[i]->GroupTrn.GroupNo == 14)
				ComApp[i]->GroupTrn.InfoAddr = LBCD;
			else if (ComApp[i]->GroupTrn.GroupNo == 15)
				ComApp[i]->GroupTrn.InfoAddr = RTUSTATUS;
			else if (ComApp[i]->GroupTrn.GroupNo >= 16)
				ComApp[i]->GroupTrn.InfoAddr = LBI;	//没用
		}
				
		EnCodeAllDataConf(Port);
	}
	else
	{
		EnCodeAllData(Port);
	}
			
}

/*------------------------------------------------------------------*/
/*函数名称:ProcCounterCall()										*/
/*函数功能:电度总召唤或分组召唤									*/
/*------------------------------------------------------------------*/
void ProcCounterCall(INT8U Port)
{
	INT8U	i, no, qcc;

	i = Port - 1;
	if (!((ComApp[i]->GroupTrn.TypeID == 0) || (ComApp[i]->GroupTrn.TypeID == C_CI_NA)))
	{
		EnCodeAllDataEnd(Port, C_CI_NA);
		return ;
	}
	
	if (!ComApp[i]->AllDataFlag)
	{
		ComApp[i]->AllDataFlag = TRUE;
		ComApp[i]->GroupTrn.DevID = ComApp[i]->ActDevIndex;
		ComApp[i]->GroupTrn.TypeID = C_CI_NA;
		ComApp[i]->GroupTrn.COT = ComApp[i]->RxMsg->Data[0];
		qcc = ComApp[i]->RxMsg->Data[0];
		
		if ((qcc & 0x3F) == 5)		//总召唤
		{
			ComApp[i]->GroupTrn.GroupNo = 5;
			ComApp[i]->GroupTrn.InfoAddr = LBCR;
		}
		else
		{
			no = (qcc & 0x3F);
			ComApp[i]->GroupTrn.GroupNo = no;
			ComApp[i]->GroupTrn.InfoAddr = LBCR + (no-1) * 32;
		}
	
		if (ComApp[i]->RxMsg->Head.PubAddr == BROADCASTADDR)
			ComApp[i]->AllDataNum = 0;
		else
			ComApp[i]->AllDataNum = ComDb[i]->DBCfgs->Info.Logic.DevNum;
		
		EnCodeAllDataConf(Port);
	}
	else
	{
		EnCodeCounter(Port);
	}
	
	
}


/*------------------------------------------------------------------*/
/*函数名称:EnCodeAllDataConf()										*/
/*函数功能:总召唤确认帧											*/
/*输入说明:														*/
/*------------------------------------------------------------------*/
void EnCodeAllDataConf(INT8U Port)
{
	INT8U i, err;
	
	i = Port - 1;
	ComApp[i]->TxMsg.Head.TypeID = ComApp[i]->GroupTrn.TypeID;
	ComApp[i]->TxMsg.Head.VSQ = 0x01;
	ComApp[i]->TxMsg.Head.COT = ACTCON;
	ComApp[i]->TxMsg.Head.PubAddr = (INT8U)GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
	ComApp[i]->TxMsg.Head.InfoAddr = 0x0;
	ComApp[i]->TxMsg.Data[0] = 0x14;

	ComApp[i]->TxLen = sizeof (struct PASDUHead) + 1;
	ComApp[i]->AppCommand = APP_APPCON;
	
	if (ComApp[i]->GroupTrn.TypeID == C_IC_NA)
		ComApp[i]->AppNextFlag |= FNextALLDATA;
	else
		ComApp[i]->AppNextFlag |= FNextCounter;
	OSFlagPost(ComDb[i]->Event, FTXNEXT, OS_FLAG_SET, &err);

}

/*------------------------------------------------------------------*/
/*函数名称:EnCodeAllDataEnd()										*/
/*函数功能:总召唤结束帧											*/
/*输入说明:														*/
/*------------------------------------------------------------------*/
void EnCodeAllDataEnd(INT8U Port, INT8U	Cmd)
{
	INT8U i;
	
	i = Port - 1;
	ComApp[i]->TxMsg.Head.TypeID = Cmd;
	ComApp[i]->TxMsg.Head.VSQ = 0x01;
	ComApp[i]->TxMsg.Head.COT = ACTTERM;
	ComApp[i]->TxMsg.Head.PubAddr = (INT8U)GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
	ComApp[i]->TxMsg.Head.InfoAddr = 0x0;
	ComApp[i]->TxMsg.Data[0] = 0x14;
	ComApp[i]->TxLen = sizeof (struct PASDUHead) + 1;
	ComApp[i]->AppCommand = APP_SENDDATA;
	

	ComApp[i]->AllDataFlag = FALSE;
	ComApp[i]->AllDataNum = 0;
	if (Cmd == C_IC_NA)
		ComApp[i]->AppNextFlag &= (~FNextALLDATA);
	else
		ComApp[i]->AppNextFlag &= (~FNextCounter);
	memset (&ComApp[i]->GroupTrn.TypeID, 0, sizeof (struct PGroupTrn));
	
	if (ComApp[i]->Data1Flag)
		ComApp[i]->AppCommand |= APP_HAVEDATA1;
}

/*------------------------------------------------------------------*/
/*函数名称:EnCodeAllData()											*/
/*函数功能:处理全数据												*/
/*------------------------------------------------------------------*/
void EnCodeAllData(INT8U Port)
{
	BOOL	rc;
	INT8U 	i, j, no, err, len;
	INT16U	num, curnum, ycno;
	struct SCDYX	yx;
	struct DBInfo	info;
	
	i = Port - 1;
	no = ComApp[i]->GroupTrn.GroupNo;
	curnum = ComApp[i]->GroupTrn.InfoAddr % 0x80;
	info.SuperID = ComDb[i]->DBCfgs->DevID;
	info.DevID = ComApp[i]->GroupTrn.DevID;
	
	if ((no >= 1) && (no <= 8))		//处理遥信
	{
		num = 0x70;		//一帧数据个数
		info.Type = YXDATA;
		info.Start = ComApp[i]->GroupTrn.InfoAddr - LBI;
		if ((curnum+num) > 0x80)
		{
			info.Num = 0x80 - curnum;
			ComApp[i]->GroupTrn.GroupNo++;
		}
		else
			info.Num = num;
	}
	else if ((no >= 9) && (no <= 12))	//处理遥测
	{
		num = 80;
		info.Type = YCDATA;
		info.Start = ComApp[i]->GroupTrn.InfoAddr - LAI;
		if ((curnum+num) > 0x80)
		{
			info.Num = 0x80 - curnum;
			ComApp[i]->GroupTrn.GroupNo++;
		}
		else
			info.Num = num;
	}	
	else if (no == 13)	//处理步位置信息
	{
		ComApp[i]->GroupTrn.GroupNo = 17;
	}
	else if (no == 14)	//处理BCD码
	{
		ComApp[i]->GroupTrn.GroupNo = 17;
	}
	else if (no == 15)	//处理子站远动终端
	{
		ComApp[i]->GroupTrn.GroupNo = 17;
	}
	else if (no == 16)	//处理备用
	{
		ComApp[i]->GroupTrn.GroupNo = 17;
	}	

	if (ComApp[i]->GroupTrn.GroupNo == 17)	//数据发送完毕
	{
		if (ComApp[i]->AllDataNum < ComDb[i]->DBCfgs->Info.Logic.DevNum)	//指向下一台设备
		{
			ComApp[i]->AllDataNum++;
			if (!GetNextActDevIndex(Port, ComApp[i]->ActDevIndex, ACTDEVINDEX))
			{
				EnCodeAllDataEnd(Port, ComApp[i]->GroupTrn.TypeID);
				return ;
			}
			else
			{
				ComApp[i]->GroupTrn.DevID = ComApp[i]->ActDevIndex;
			}
		}
		else
		{
			EnCodeAllDataEnd(Port, ComApp[i]->GroupTrn.TypeID);
			return ;
		}
	}
		
	rc = DBRead(ComApp[i]->Tmpbuf, &info);	//读取数据
	
	switch (info.Type)	//组帧
	{
		case YXDATA:
			if (info.Num)
			{
				if (ComApp[i]->YXTypeID == M_PS_NA)
				{
					len = 0;
					no = 0;
					memset ((INT8U*)&yx, 0, sizeof (struct SCDYX));
					yx.InfoAddr = ComApp[i]->GroupTrn.InfoAddr;
					for (j=0; j<info.Num; j++)
					{
						if (ComApp[i]->Tmpbuf[j] == YX_H)
							yx.ST |= (0x0001<<len);
				
						len++;
						if (len >= 16)
						{
							if (no == 0)
								memcpy ((INT8U*)&ComApp[i]->TxMsg.Head.InfoAddr, (INT8U*)&yx, sizeof (struct SCDYX));
							else
								memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[no*sizeof (struct SCDYX) - 2], (INT8U*)&yx, sizeof (struct SCDYX));
							
							len = 0;
							no++;
							yx.ST = 0;
							yx.InfoAddr = ComApp[i]->GroupTrn.InfoAddr + no*16;
						}
					}
					
					if (len != 0)
					{
						if (no == 0)
							memcpy ((INT8U*)&ComApp[i]->TxMsg.Head.InfoAddr, (INT8U*)&yx, sizeof (struct SCDYX));
						else
							memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[no*sizeof (struct SCDYX) - 2], (INT8U*)&yx, sizeof (struct SCDYX));						
						
						no++;
					}
					
					ComApp[i]->TxMsg.Head.TypeID = M_PS_NA;
					ComApp[i]->TxMsg.Head.VSQ = info.Num;
					ComApp[i]->TxMsg.Head.COT = ComApp[i]->GroupTrn.COT;
					ComApp[i]->TxMsg.Head.PubAddr = (INT8U)GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
					ComApp[i]->TxMsg.Head.InfoAddr = ComApp[i]->GroupTrn.InfoAddr;
					ComApp[i]->TxLen = sizeof (struct PASDUHead) + no * sizeof (struct SCDYX) - 2;
					ComApp[i]->AppCommand = APP_SENDDATA;
					ComApp[i]->GroupTrn.InfoAddr += info.Num;				
				}
				else
				{
					for (j=0; j<info.Num; j++)
					{
						if (ComApp[i]->Tmpbuf[j] == YX_H)
							ComApp[i]->TxMsg.Data[j] = 0x01;
						else
							ComApp[i]->TxMsg.Data[j] = 0x00;
					}
					
					ComApp[i]->TxMsg.Head.TypeID = M_SP_NA;
					ComApp[i]->TxMsg.Head.VSQ = 0x80 | info.Num;
					ComApp[i]->TxMsg.Head.COT = ComApp[i]->GroupTrn.COT;
					ComApp[i]->TxMsg.Head.PubAddr = (INT8U)GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
					ComApp[i]->TxMsg.Head.InfoAddr = ComApp[i]->GroupTrn.InfoAddr;
					ComApp[i]->TxLen = sizeof (struct PASDUHead) + info.Num;
					ComApp[i]->AppCommand = APP_SENDDATA;
					ComApp[i]->GroupTrn.InfoAddr += info.Num;
				}
			}
			
			if ((!rc) || (info.Num != num))
			{
				if (ComApp[i]->GroupTrn.COT == REQ)		//处理单组
					ComApp[i]->GroupTrn.GroupNo = 17;
				else
				{
					ComApp[i]->GroupTrn.GroupNo = 9;
					ComApp[i]->GroupTrn.InfoAddr = LAI;
				}
				
			}
			
			break;
		
		case YCDATA:
			if (info.Num)
			{
				ComApp[i]->Data2Flag &= (~HaveNVA);
				ycno = GetActDevNo(Port, ComApp[i]->NvaActDev, YCDATA);
				memcpy ((INT8U*)&ComApp[i]->YCValue[ycno], ComApp[i]->Tmpbuf, info.Num * 2);
				
				if (ComApp[i]->YCTypeID == M_ME_NA)
				{
					len = 3;
					ComApp[i]->TxMsg.Head.TypeID = M_ME_NA;
					for (j=0; j<info.Num; j++)
					{
						memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[3*j], &ComApp[i]->Tmpbuf[2*j], 2);
						ComApp[i]->TxMsg.Data[3*j + 2] = 0x00;	//QDS
					}
				}
				else
				{				
					len = 2;
					ComApp[i]->TxMsg.Head.TypeID = M_ME_ND;					
					memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[0], ComApp[i]->Tmpbuf, info.Num * 2);
				}
				ComApp[i]->TxMsg.Head.VSQ = 0x80 | info.Num;
				ComApp[i]->TxMsg.Head.COT = ComApp[i]->GroupTrn.COT;
				ComApp[i]->TxMsg.Head.PubAddr = (INT8U)GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
				ComApp[i]->TxMsg.Head.InfoAddr = ComApp[i]->GroupTrn.InfoAddr;
				ComApp[i]->TxLen = sizeof (struct PASDUHead) + info.Num * len;
				ComApp[i]->AppCommand = APP_SENDDATA;
				ComApp[i]->GroupTrn.InfoAddr += info.Num;
			}
			
			if ((!rc) || (info.Num != num))
			{
				if (ComApp[i]->GroupTrn.COT == REQ)		//处理单组
					ComApp[i]->GroupTrn.GroupNo = 17;
				else
				{
					ComApp[i]->GroupTrn.GroupNo = 13;
					ComApp[i]->GroupTrn.InfoAddr = LSPI;
				}
				
			}
			
			break;
		
		default:
			break;
	}

	OSFlagPost(ComDb[i]->Event, FTXNEXT, OS_FLAG_SET, &err);
}


/*------------------------------------------------------------------*/
/*函数名称:EnCodeCounter()												*/
/*函数功能:处理电度召唤											*/
/*------------------------------------------------------------------*/
void EnCodeCounter(INT8U Port)
{
	BOOL	rc;
	INT8U 	i, j, len, err, qcc;
	INT16U	ddno;
	struct DBInfo	info;
	struct Counter	counter;
	
	i = Port - 1;
	len = sizeof (struct Counter);
	qcc = ComApp[i]->GroupTrn.COT;
	
	info.SuperID = ComDb[i]->DBCfgs->DevID;
	info.DevID = ComApp[i]->GroupTrn.DevID;
	info.Type = DDDATA;
	info.Start = ComApp[i]->GroupTrn.InfoAddr - LBCR;
	info.Num = 32;
	
	rc = DBRead(ComApp[i]->Tmpbuf, &info);	//读取数据
	
	if (!rc)
	{
		EnCodeAllDataEnd(Port, ComApp[i]->GroupTrn.TypeID);
		return ;
	}

	if (info.Num)
	{
		if ((qcc & 0xC0)== 0x80)	//冻结复位
		{
			ddno = GetActDevNo(Port, ComApp[i]->NvaActDev, DDDATA);
			for (j=0; j<info.Num; j++)
			{
				counter.InfoAddr = ComApp[i]->GroupTrn.InfoAddr + j;
				counter.Value = *((INT32U*)ComApp[i]->Tmpbuf + j) - ComApp[i]->DDValue[ddno + j];
				counter.SQ = j;
				
				if (j == 0)
					memcpy ((INT8U*)&ComApp[i]->TxMsg.Head.InfoAddr, (INT8U*)&counter, len);
				else
					memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[j*len-2], (INT8U*)&counter, len); 
			}
			memcpy ((INT8U*)&ComApp[i]->DDValue[ddno], ComApp[i]->Tmpbuf, info.Num * 4);

		}
		else	//冻结不复位
		{
			ddno = GetActDevNo(Port, ComApp[i]->NvaActDev, DDDATA);
			for (j=0; j<info.Num; j++)
			{
				counter.InfoAddr = ComApp[i]->GroupTrn.InfoAddr + j;
				counter.Value = *((INT32U*)ComApp[i]->Tmpbuf + j);
				counter.SQ = j;
				
				if (j == 0)
					memcpy ((INT8U*)&ComApp[i]->TxMsg.Head.InfoAddr, (INT8U*)&counter, len);
				else
					memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[j*len-2], (INT8U*)&counter, len); 
			}
		}
		
						
		ComApp[i]->TxMsg.Head.TypeID = M_IT_NA;
		ComApp[i]->TxMsg.Head.VSQ = info.Num;
		if (ComApp[i]->GroupTrn.GroupNo == 5)
			ComApp[i]->TxMsg.Head.COT = REQCOGCN;
		else
			ComApp[i]->TxMsg.Head.COT = REQCOGCN + ComApp[i]->GroupTrn.GroupNo;	//dingding
		ComApp[i]->TxMsg.Head.PubAddr = (INT8U)GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
		ComApp[i]->TxMsg.Head.InfoAddr = ComApp[i]->GroupTrn.InfoAddr;
		ComApp[i]->TxLen = sizeof (struct PASDUHead) + info.Num * len - 2;
		
		ComApp[i]->AppCommand = APP_SENDDATA;
		ComApp[i]->GroupTrn.InfoAddr += info.Num;
	
	}
	else
	{
		EnCodeAllDataEnd(Port, ComApp[i]->GroupTrn.TypeID);
		return ;	
	}

	OSFlagPost(ComDb[i]->Event, FTXNEXT, OS_FLAG_SET, &err);
}

/*------------------------------------------------------------------*/
/*函数名称:ProcTimeDelay()											*/
/*函数功能:延时获得命令											*/
/*------------------------------------------------------------------*/
void ProcTimeDelay(INT8U Port)
{
	
	
}


/*------------------------------------------------------------------*/
/*函数名称:ProcClock()												*/
/*函数功能:对钟命令												*/
/*输入说明:Con--为TRUE时需要确认									*/
/*------------------------------------------------------------------*/
void ProcClock(INT8U Port, BOOL Conf)
{
	INT8U	i;

	i = Port -  1;
		
	if (ComApp[i]->BaseControl & SETSECTIME)
	{
		if (ComApp[i]->Control & USESTANDARDCLOCKFORMAT)
			SetTime((void*)ComApp[i]->RxMsg->Data, IEC101TIME);
		else
			SetTime((void*)ComApp[i]->RxMsg->Data, IEC101EXTTIME);
	}
	
	if (Conf)
		EnCodeClock(Port);
}


/*------------------------------------------------------------------*/
/*函数名称:ProcReset()												*/
/*函数功能:复位进程命令											*/
/*------------------------------------------------------------------*/
void ProcReset(INT8U Port)
{
	
}


/*------------------------------------------------------------------*/
/*函数名称:ProcReadData()											*/
/*函数功能:读数据命令												*/
/*------------------------------------------------------------------*/
void ProcReadData(INT8U Port)
{
	
}


/*------------------------------------------------------------------*/
/*函数名称:ProcTest()												*/
/*函数功能:测试命令												*/
/*------------------------------------------------------------------*/
void ProcTest(INT8U Port)
{
	
	
}


/*------------------------------------------------------------------*/
/*函数名称:ProcParaSet()											*/
/*函数功能:装载参数命令											*/
/*------------------------------------------------------------------*/
void ProcParaSet(INT8U Port)
{
	
	
}

/*------------------------------------------------------------------*/
/*函数名称:ProcAppErr()											*/
/*函数功能:应用层命令错误或无法解释处理							*/
/*------------------------------------------------------------------*/
void ProcAppErr(INT8U Port)
{
/*	
	ComApp[i]->TxLen = 0;
	ComApp[i]->AppCommand = APP_APPCON;
		if (ComApp[i]->Data1Flag)
			ComApp[i]->AppCommand |= APP_HAVEDATA1;
*/	
}

⌨️ 快捷键说明

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