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

📄 104sa.c

📁 详细介绍了arm7-at91r40008,的开发全过程
💻 C
📖 第 1 页 / 共 4 页
字号:
	
	if (ComApp[i]->TxLen)
		S104DLSendProc(Port, (INT8U*)&ComApp[i]->TxMsg, ComApp[i]->TxLen);
}

/*------------------------------------------------------------------*/
/*函数名称:S104ProcControl()										*/
/*函数功能:处理控制命令											*/
/*------------------------------------------------------------------*/
void S104ProcControl(INT8U Port)
{
	INT8U	i, dco;
	struct BOCode code;
	struct DBInfo info;
	struct DBBOOPInfo result;
	
	i = Port - NET1;
	memset (&code, 0, sizeof (struct BOCode));
	
	switch (ComApp[i]->RxMsg->Head.TypeID)
	{
		case C_DC_NA:		//遥控操作
			info.SuperID = ComDb[i]->DBCfgs->DevID;
			info.DevID = ComApp[i]->ActDevIndex;
			info.Type = BORESQ;
			info.Start = ComApp[i]->RxMsg->Head.InfoAddr - LBO + 1;
			dco = ComApp[i]->RxMsg->Data[0];
			if (dco & DCO_SE)
				info.Num = BOSELECT;
			else
				info.Num = BOOPERATE;
			
			if ((dco & DCO_DCS) == 0x01)
				code.Control |=	BOOPEN;
			else if ((dco & DCO_DCS) == 0x02)
				code.Control |= BOCLOSE;
						
			if (ComApp[i]->RxMsg->Head.COT == ACT)
				code.Control &= (~BODEL);
			else
				code.Control |= BODEL;
			
			code.Status = BORCNONSUPPORT;
			if (ComApp[i]->BaseControl & YKPERMIT)	//遥控允许
				DBOperate((INT8U*)&code, &info);
				
			if (code.Status != BORCOK)
			{
				result.SuperID = info.SuperID;
				result.DevID = info.DevID;
				result.ID = info.Start;
				result.Status = code.Control;
				if (dco & DCO_SE)
					result.Flag = BOOPSELECT;
				else
					result.Flag = BOOPOPERATE;
				
				if (ComApp[i]->RxMsg->Head.COT != ACT)
					result.Flag |= BOOPDEL;

				result.Flag |= BOOPERROR;
				S104EnCodeControl(Port, &result);
			}
			break;
			
		case C_RC_NA:
		
			break;
			
		case C_SE_NA:
		
			break;
		
		
	}
	
}

/*------------------------------------------------------------------*/
/*函数名称:S104ProcDB()											*/
/*函数功能:数据库置位												*/
/*------------------------------------------------------------------*/
void S104ProcDB(INT8U Port, INT8U Num)
{
	INT8U	i, j, tmp;
	INT16U	dev;
	struct DBInfo info;
	
	i = Port - NET1;
	
	if (Num >= ComApp[i]->CurSData)
		tmp = ComApp[i]->CurSData;
	else
		tmp = Num;
	
	for (j=0; j<tmp; j++)
	{
		if ((ComApp[i]->SData[j].Type == SOEDATA) || (ComApp[i]->SData[j].Type == COSDATA))
		{
			info.SuperID = ComDb[i]->DBCfgs->DevID;
			info.DevID = ComApp[i]->SData[j].DevID;
			info.Type = ComApp[i]->SData[j].Type;
			info.Num = ComApp[i]->SData[j].Num;
			if (!DBClear(&info))
				DBClear(&info);
		}
	}

	if (Num < ComApp[i]->CurSData)
	{
		tmp = ComApp[i]->CurSData - Num;
		memcpy ((INT8U*)ComApp[i]->SData, (INT8U*)&ComApp[i]->SData[Num], tmp * sizeof (struct SendData));
		ComApp[i]->CurSData = tmp;
	}
	else
	{
		ComApp[i]->CurSData = 0;
	}
	memset ((INT8U*)&ComApp[i]->SData[ComApp[i]->CurSData], 0, (K-ComApp[i]->CurSData) * sizeof (struct SendData));


	dev = S104CheckDB(Port, COSDATA);
	if (dev != 0xFFFF)
		ComApp[i]->AppNextFlag |= HaveCOS;
		
	dev = S104CheckDB(Port, SOEDATA);
	if (dev != 0xFFFF)
		ComApp[i]->AppNextFlag |= HaveSOE;
}

/*------------------------------------------------------------------*/
/*函数名称:S104CheckDB()											*/
/*函数功能:查询数据库												*/
/*输出说明:有返回有数据的设备ID,没有返回0xFFFF					*/
/*------------------------------------------------------------------*/
INT16U S104CheckDB(INT8U Port, INT8U Type)
{
	INT8U	i, j, k, num, tmp;
	struct DBInfo info;
	
	i = Port - NET1;
	info.SuperID = ComDb[i]->DBCfgs->DevID;
	info.Type = Type;
	switch (Type)
	{
		case SOEDATA:
			for (j=0; j<ComDb[i]->DBCfgs->Info.Logic.DevNum; j++)
			{
				info.DevID = ComDb[i]->DBCfgs->Info.Logic.pOld[j].DevID;
				num = DBCheck(&info);
				if (num)
				{
					for (k=0, tmp=0; k<ComApp[i]->CurSData; k++)
					{
						if ((ComApp[i]->SData[k].DevID == info.DevID) && (ComApp[i]->SData[k].Type == Type))
							tmp += ComApp[i]->SData[k].Num;
					}
					if (tmp < num)
						return (info.DevID);
				}
			}
			break;
			
		case COSDATA:
			for (j=0; j<ComDb[i]->DBCfgs->Info.Logic.DevNum; j++)
			{
				info.DevID = ComDb[i]->DBCfgs->Info.Logic.pOld[j].DevID;
				num = DBCheck(&info);
				if (num)
				{
					for (k=0, tmp=0; k<ComApp[i]->CurSData; k++)
					{
						if ((ComApp[i]->SData[k].DevID == info.DevID) && (ComApp[i]->SData[k].Type == Type))
							tmp += ComApp[i]->SData[k].Num;
					}
					if (tmp < num)
						return (info.DevID);
				}
			}			
			break;
			
		default:
			break;
	}

	return (0xFFFF);
}

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

/*------------------------------------------------------------------*/
/*函数名称:S104ProcAllDataCall()									*/
/*函数功能:总召唤或分组召唤										*/
/*------------------------------------------------------------------*/
void S104ProcAllDataCall(INT8U Port)
{
	INT8U	i;
	
	i = Port - NET1;
	if (!((ComApp[i]->GroupTrn.TypeID == 0) || (ComApp[i]->GroupTrn.TypeID == C_IC_NA)))
	{
		S104EnCodeAllDataEnd(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;	//没用
		}
				
		S104EnCodeAllDataConf(Port);
	}
	else
	{
		S104EnCodeAllData(Port);
	}
			
}

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

	i = Port - NET1;
	if (!((ComApp[i]->GroupTrn.TypeID == 0) || (ComApp[i]->GroupTrn.TypeID == C_CI_NA)))
	{
		S104EnCodeAllDataEnd(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) * 30;
		}
	
		if (ComApp[i]->RxMsg->Head.PubAddr == BROADCASTADDR)
			ComApp[i]->AllDataNum = 0;
		else
			ComApp[i]->AllDataNum = ComDb[i]->DBCfgs->Info.Logic.DevNum;
		
		S104EnCodeAllDataConf(Port);
	}
	else
	{
		S104EnCodeCounter(Port);
	}
	
	
}


/*------------------------------------------------------------------*/
/*函数名称:S104EnCodeAllDataConf()									*/
/*函数功能:总召唤确认帧											*/
/*输入说明:														*/
/*------------------------------------------------------------------*/
void S104EnCodeAllDataConf(INT8U Port)
{
	INT8U i, err;
	
	i = Port - NET1;
	
	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)S104GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
	ComApp[i]->TxMsg.Head.InfoAddr = 0x00;
	#ifdef INFOADDR3BYTE
		ComApp[i]->TxMsg.Head.InfoAddrHigh = 0x00;
	#endif
	ComApp[i]->TxMsg.Data[0] = 0x14;

	ComApp[i]->TxLen = sizeof (struct PASDUHead) + 1;
	
	if (ComApp[i]->GroupTrn.TypeID == C_IC_NA)
		ComApp[i]->AppNextFlag |= FNextALLDATA;
	else
		ComApp[i]->AppNextFlag |= FNextCounter;

	ComApp[i]->SData[ComApp[i]->CurSData].DevID = ComApp[i]->ActDevIndex;
	ComApp[i]->SData[ComApp[i]->CurSData].Type = 0;
	ComApp[i]->SData[ComApp[i]->CurSData].Num = 0;
	ComApp[i]->CurSData = (ComApp[i]->CurSData + 1) % K;

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

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

	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));

	ComApp[i]->SData[ComApp[i]->CurSData].DevID = ComApp[i]->ActDevIndex;
	ComApp[i]->SData[ComApp[i]->CurSData].Type = 0;
	ComApp[i]->SData[ComApp[i]->CurSData].Num = 0;
	ComApp[i]->CurSData = (ComApp[i]->CurSData + 1) % K;
}

/*------------------------------------------------------------------*/
/*函数名称:S104EnCodeAllData()										*/
/*函数功能:处理全数据												*/
/*------------------------------------------------------------------*/
void S104EnCodeAllData(INT8U Port)
{
	BOOL	rc;
	INT8U 	i, j, no, err, len;
	INT16U	num, curnum, ycno;
	struct SCDYX	yx;
	struct DBInfo	info;
	
	i = Port - NET1;
	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 = 120;		//一帧数据个数
		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 = 60;
		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)	//数据发送完毕
	{
		ComApp[i]->AllDataNum++;		
		if (ComApp[i]->AllDataNum < ComDb[i]->DBCfgs->Info.Logic.DevNum)	//指向下一台设备
		{
			if (!S104GetNextActDevIndex(Port, ComApp[i]->ActDevIndex, ACTDEVINDEX))
			{
				S104EnCodeAllDataEnd(Port, ComApp[i]->GroupTrn.TypeID);
				return ;
			}
			else
			{
				ComApp[i]->GroupTrn.DevID = ComApp[i]->ActDevIndex;
				ComApp[i]->GroupTrn.GroupNo = 1;
				ComApp[i]->GroupTrn.InfoAddr = LBI;
			}
		}
		else
		{
			S104EnCodeAllDataEnd(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));
					for (j=0; j<info.Num; j++)
					{

⌨️ 快捷键说明

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