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

📄 104sa.c

📁 详细介绍了arm7-at91r40008,的开发全过程
💻 C
📖 第 1 页 / 共 4 页
字号:
						if (ComApp[i]->Tmpbuf[j] == YX_H)
							yx.ST |= (0x0001<<len);
				
						len++;
						if (len >= 16)
						{
							memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[no*sizeof (struct SCDYX)], (INT8U*)&yx, sizeof (struct SCDYX));
							len = 0;
							no++;
							yx.ST = 0;
						}
					}
					
					if (len != 0)
					{
						memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[no*sizeof (struct SCDYX)], (INT8U*)&yx, sizeof (struct SCDYX));
						no++;
					}					
					
					ComApp[i]->TxMsg.Head.TypeID = M_PS_NA;
					ComApp[i]->TxMsg.Head.VSQ = 0x80 | no;
					ComApp[i]->TxMsg.Head.COT = ComApp[i]->GroupTrn.COT;
					ComApp[i]->TxMsg.Head.PubAddr = (INT8U)S104GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
					ComApp[i]->TxMsg.Head.InfoAddr = ComApp[i]->GroupTrn.InfoAddr;
					#ifdef INFOADDR3BYTE
						ComApp[i]->TxMsg.Head.InfoAddrHigh = 0x00;
					#endif
					ComApp[i]->TxLen = sizeof (struct PASDUHead) + no * sizeof (struct SCDYX);
					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)S104GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
					ComApp[i]->TxMsg.Head.InfoAddr = ComApp[i]->GroupTrn.InfoAddr;
					#ifdef INFOADDR3BYTE
						ComApp[i]->TxMsg.Head.InfoAddrHigh = 0x00;
					#endif
					ComApp[i]->TxLen = sizeof (struct PASDUHead) + info.Num;
					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]->AppNextFlag &= (~HaveNVA);
				ycno = S104GetActDevNo(Port, ComApp[i]->NvaActDev, YCDATA);
				memcpy ((INT8U*)&ComApp[i]->YCValue[ycno], ComApp[i]->Tmpbuf, info.Num * 2);
				
				if ((ComApp[i]->YCTypeID == M_ME_NA) || (ComApp[i]->YCTypeID == M_ME_NB))
				{
					len = 3;
					ComApp[i]->TxMsg.Head.TypeID = ComApp[i]->YCTypeID;
					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)S104GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
				ComApp[i]->TxMsg.Head.InfoAddr = ComApp[i]->GroupTrn.InfoAddr;
				#ifdef INFOADDR3BYTE
					ComApp[i]->TxMsg.Head.InfoAddrHigh = 0x00;
				#endif
				ComApp[i]->TxLen = sizeof (struct PASDUHead) + info.Num * len;
				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;
	}

	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 = info.Num;
	ComApp[i]->CurSData = (ComApp[i]->CurSData + 1) % K;

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

/*------------------------------------------------------------------*/
/*函数名称:S104EnCodeCounter()										*/
/*函数功能:处理电度召唤											*/
/*------------------------------------------------------------------*/
void S104EnCodeCounter(INT8U Port)
{
	BOOL	rc = FALSE;
	INT8U 	i, j, len1, len2, err, qcc;
	INT16U	ddno;
	struct DBInfo	info;
	struct InfoAddr addr;
	struct Counter	counter;
	
	i = Port - NET1;

	len1 = ComApp[i]->GroupTrn.InfoAddr - LBCR;
	info.SuperID = ComDb[i]->DBCfgs->DevID;
	info.Type = DDDATA;
	info.Num = 30;
	
	for (j=0; j<ComDb[i]->DBCfgs->Info.Logic.DevNum; j++)
	{
		len2 = ComApp[i]->GroupTrn.DevID;
		if (DBCfgs[len2].DDNum > len1)
		{
			info.DevID = ComApp[i]->GroupTrn.DevID;
			info.Start = len1;
			
			rc = DBRead(ComApp[i]->Tmpbuf, &info);	//读取数据
			if (rc)
			{
				break;
			}
		}
		else	//指向下一台
		{
			len1 = 0;
			if (ComApp[i]->AllDataNum == ComDb[i]->DBCfgs->Info.Logic.DevNum)
			{
				rc = FALSE;
				break;
			}
			
			if (!S104GetNextActDevIndex(Port, ComApp[i]->ActDevIndex, ACTDEVINDEX))
			{
				S104EnCodeAllDataEnd(Port, ComApp[i]->GroupTrn.TypeID);
				return ;
			}
			else
			{
				ComApp[i]->GroupTrn.DevID = ComApp[i]->ActDevIndex;
			}
		}
		
	}
	if (!rc)
	{
		S104EnCodeAllDataEnd(Port, ComApp[i]->GroupTrn.TypeID);
		return ;
	}
	
	len1 = sizeof (struct InfoAddr);
	len2 = sizeof (struct Counter);
	qcc = ComApp[i]->GroupTrn.COT;	


	if (info.Num)
	{
		if ((qcc & 0xC0)== 0x80)	//冻结复位
		{
			ddno = S104GetActDevNo(Port, ComApp[i]->NvaActDev, DDDATA);
			for (j=0; j<info.Num; j++)
			{
				addr.InfoAddr = ComApp[i]->GroupTrn.InfoAddr + j;
				#ifdef INFOADDR3BYTE
					addr.InfoAddrHigh = 0x00;
				#endif
				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*)&addr, len1);
					memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[0], (INT8U*)&counter, len2);
				}
				else
				{
					memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[j*(len1+len2) - len1], (INT8U*)&addr, len1);
					memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[j*(len1+len2)], (INT8U*)&counter, len2); 
				}
			}
			
			memcpy ((INT8U*)&ComApp[i]->DDValue[ddno], ComApp[i]->Tmpbuf, info.Num * 4);

		}
		else	//冻结不复位
		{
			ddno = S104GetActDevNo(Port, ComApp[i]->NvaActDev, DDDATA);
			for (j=0; j<info.Num; j++)
			{
				addr.InfoAddr = ComApp[i]->GroupTrn.InfoAddr + j;
				#ifdef INFOADDR3BYTE
					addr.InfoAddrHigh = 0x00;
				#endif
				counter.Value = *((INT32U*)ComApp[i]->Tmpbuf + j);
				counter.SQ = j;
				
				if (j == 0)
				{
					memcpy ((INT8U*)&ComApp[i]->TxMsg.Head.InfoAddr, (INT8U*)&addr, len1);
					memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[0], (INT8U*)&counter, len2);
				}
				else
				{
					memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[j*(len1+len2) - len1], (INT8U*)&addr, len1);
					memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[j*(len1+len2)], (INT8U*)&counter, len2); 
				}
			}
		}
		
						
		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)S104GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
		ComApp[i]->TxMsg.Head.InfoAddr = ComApp[i]->GroupTrn.InfoAddr;
		ComApp[i]->TxLen = sizeof (struct PASDUHead) + info.Num * (len1+len2) - len1;
		
		
		ComApp[i]->GroupTrn.InfoAddr += info.Num;

	}
	else
	{
		S104EnCodeAllDataEnd(Port, ComApp[i]->GroupTrn.TypeID);
		return ;	
	}

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

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

/*------------------------------------------------------------------*/
/*函数名称:S104ProcClock()											*/
/*函数功能:对钟命令												*/
/*------------------------------------------------------------------*/
void S104ProcClock(INT8U Port)
{
	INT8U	i;

	i = Port - NET1;
		
	if (ComApp[i]->BaseControl & SETSECTIME)
	{
		if (ComApp[i]->Control & USESTANDARDCLOCKFORMAT104)
			SetTime((void*)ComApp[i]->RxMsg->Data, IEC101TIME);
		else
			SetTime((void*)ComApp[i]->RxMsg->Data, IEC101EXTTIME);
	}
	
	S104EnCodeClock(Port);
}


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


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


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


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

/*------------------------------------------------------------------*/
/*函数名称:S104ProcAppErr()										*/
/*函数功能:应用层命令错误或无法解释处理							*/
/*------------------------------------------------------------------*/
void S104ProcAppErr(INT8U Port)
{


}

/*------------------------------------------------------------------*/
/*函数名称:S104EnCodeClock()										*/
/*函数功能:编辑时钟确认响应帧										*/
/*------------------------------------------------------------------*/
void S104EnCodeClock(INT8U Port)
{
	INT8U	i;

	i = Port - NET1;
	
	ComApp[i]->TxMsg.Head.TypeID = C_CS_NA;
	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
	
	if (ComApp[i]->Control & USESTANDARDCLOCKFORMAT104)
		GetTime((void*)ComApp[i]->TxMsg.Data, IEC101TIME);
	else
		GetTime((void*)ComApp[i]->TxMsg.Data, IEC101EXTTIME);
	
	ComApp[i]->TxLen = sizeof (struct PASDUHead) + sizeof (struct IEC101Time_t);

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

/*------------------------------------------------------------------*/
/*函数名称:S104EnCodeControl()										*/
/*函数功能:编辑控制命令响应帧										*/
/*------------------------------------------------------------------*/
void S104EnCodeControl(INT8U Port, struct DBBOOPInfo* Info)
{
	INT8U	i, dco;
	
	i = Port - NET1;
	
	ComApp[i]->TxMsg.Head.TypeID = C_DC_NA;
	ComApp[i]->TxMsg.Head.VSQ = 0x01;
	if (Info->Status & BODEL)
		ComApp[i]->TxMsg.Head.COT = DEACTCON;
	else
		ComApp[i]->TxMsg.Head.COT = ACTCON;
	if (Info->Flag & BOOPERROR)
		ComApp[i]->TxMsg.Head.COT |= P101_PN;
		
	ComApp[i]->TxMsg.Head.PubAddr = (INT8U)S104GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
	ComApp[i]->TxMsg.Head.InfoAddr = Info->SID + LBO - 1;

	#ifdef INFOADDR3BYTE
		ComApp[i]->TxMsg.Head.InfoAddrHigh = 0x00;
	#endif

	if (Info->Status & BOCLOSE)
		dco = 0x02;
	else
		dco = 0x01;
	if (Info->Flag & BOOPSELECT)
		dco |= DCO_SE;
	ComApp[i]->TxMsg.Data[0] = dco;
	
	ComApp[i]->TxLen = sizeof (struct PASDUHead) + 1;

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

/*------------------------------------------------------------------*/
/*函数名称:S104EnCodeCOS()											*/
/*函数功能:编辑COS帧 												*/
/*------------------------------------------------------------------*/
void S104EnCodeCOS(INT8U Port)
{
	BOOL	rc;
	INT8U	i, j, len, num, val;
	struct DBInfo info;
	struct COS_t *cos;
	struct InfoAddr addr;
	
	i = Port - NET1;
	len = sizeof (struct InfoAddr) + 1;
	info.SuperID = ComDb[i]->DBCfgs->DevID;
	info.DevID = S104CheckDB(Port, COSDATA);
	if (info.DevID == 0xFFFF)
	{
		ComApp[i]->AppNextFlag &= (~HaveCOS);
		return;
	}
	info.Type = COSDATA;
	for (j=0, num=0; j<ComApp[i]->CurSData; j++)
	{
		if ((ComApp[i]->SData[j].DevID == info.DevID) && (ComApp[i]->SData[j].Type == COSDATA))
			num += ComApp[i]->SData[j].Num;
	}
	info.Start = STARTTYPE | num;
	info.Num = 40;	//dingding?
	
	rc = DBRead(ComApp[i]->Tmpbuf, &info);
	if ((!rc) || (info.Num == 0))
	{
		info.Num = 0;
		DBClear(&info);
		return;
	}
		
	for (num=0; num<info.Num; num++)
	{
		cos = (struct COS_t*)ComApp[i]->Tmpbuf + num;
		
		addr.InfoAddr = LBI + cos->No;
		#ifdef INFOADDR3BYTE
			addr.InfoAddrHigh = 0x00;
		#endif
		if (cos->Status == YX_H)
			val = 0x01;
		else
			val  = 0x00;
			
		if (num == 0)
		{

⌨️ 快捷键说明

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