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

📄 101secapp.c

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

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

	i = Port - 1;
	
	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)GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
	ComApp[i]->TxMsg.Head.InfoAddr = 0x0;
	
	if (ComApp[i]->Control & USESTANDARDCLOCKFORMAT)
		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]->AppCommand = APP_APPCON;
	
}

/*------------------------------------------------------------------*/
/*函数名称:EnCodeControl()											*/
/*函数功能:编辑控制命令响应帧										*/
/*------------------------------------------------------------------*/
void EnCodeControl(INT8U Port, struct DBBOOPInfo* Info)
{
	INT8U	i, dco;
	
	i = Port - 1;
	
	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)GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
	ComApp[i]->TxMsg.Head.InfoAddr = Info->SID + LBO - 1;

	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]->AppCommand = APP_APPCON;
	
}

/*------------------------------------------------------------------*/
/*函数名称:EnCodeCOS()												*/
/*函数功能:编辑COS帧 												*/
/*------------------------------------------------------------------*/
void EnCodeCOS(INT8U Port)
{
	BOOL	rc;
	INT8U	i, j, len, num;
	struct DBInfo info;
	struct COS_t *cos;
	
	i = Port - 1;
	num = 0;
	len = sizeof (struct COS_t);
	info.SuperID = ComDb[i]->DBCfgs->DevID;
	info.DevID = ComApp[i]->ActDevIndex;
	info.Type = COSDATA;
	info.Start = STARTTYPE;
	info.Num = 0x40;	//dingding?
	
	for (j=0; j<ComDb[i]->DBCfgs->Info.Logic.DevNum; j++)
	{
		rc = DBRead(ComApp[i]->Tmpbuf, &info);
		if ((!rc) || (info.Num == 0))
			continue;
		
		for (; num<info.Num; num++)
		{
			cos = ((struct COS_t*)ComApp[i]->Tmpbuf + num);
			
			cos->No = LBI + cos->No;
			if (cos->Status == YX_H)
				cos->Status = 0x01;
			else
				cos->Status  = 0x00;
			
			if (num == 0)
				memcpy ((INT8U*)&ComApp[i]->TxMsg.Head.InfoAddr, (INT8U*)cos, len);
			else
				memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[1 + (num-1)*len], (INT8U*)cos, len);
		}
		
		ComApp[i]->TxMsg.Head.TypeID = M_SP_NA;
		ComApp[i]->TxMsg.Head.VSQ = info.Num;
		ComApp[i]->TxMsg.Head.COT = REQ;
		ComApp[i]->TxMsg.Head.PubAddr = (INT8U)GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
	
		ComApp[i]->TxLen = sizeof (struct PASDUHead) + info.Num*len - 2;
		ComApp[i]->AppCommand = APP_SENDDATA;
		
		ComApp[i]->LastDevIndex = ComApp[i]->ActDevIndex;
		ComApp[i]->LastDevType = COSDATA;
		ComApp[i]->LastDevNum = info.Num;
		return;
	}
	
	ComApp[i]->Data1Flag &= (~HaveCOS);
	ComApp[i]->AppCommand = APP_NODATA;
	
}

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

/*------------------------------------------------------------------*/
/*函数名称:EnCodeSOE()												*/
/*函数功能:编辑SOE帧 												*/
/*------------------------------------------------------------------*/
void EnCodeSOE(INT8U Port)
{
	BOOL	rc;
	INT8U	i, j, len, num;
	struct DBInfo info;
	struct SOE_t *soe;
	struct SOECP24Time time;
	
	i = Port - 1;
	num = 0;
	len = sizeof (struct SOECP24Time);
	info.SuperID = ComDb[i]->DBCfgs->DevID;
	info.DevID = ComApp[i]->ActDevIndex;
	info.Type = SOEDATA;
	info.Start = STARTTYPE;
	info.Num = 0x20;	//dingding?
	
	for (j=0; j<ComDb[i]->DBCfgs->Info.Logic.DevNum; j++)
	{
		rc = DBRead(ComApp[i]->Tmpbuf, &info);
		if ((!rc) || (info.Num == 0))
		{
			rc = GetNextActDevIndex(Port, ComApp[i]->ActDevIndex, ACTDEVINDEX);
			if (rc)
				continue;
			else
				break;
		}
		
		for (; num<info.Num; num++)
		{
			soe = ((struct SOE_t*)ComApp[i]->Tmpbuf + num);
			
			time.No = LBI + soe->No;
			if (soe->Status == YX_H)
				time.Status = 0x01;
			else
				time.Status  = 0x00;
			time.Minute = soe->Time.Minute % 60;
			time.Msecond = soe->Time.Msecond;
			
			if (num == 0)
				memcpy ((INT8U*)&ComApp[i]->TxMsg.Head.InfoAddr, (INT8U*)&time, len);
			else
				memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[4 + (num-1)*len], (INT8U*)&time, len);
		}
		
		ComApp[i]->TxMsg.Head.TypeID = M_SP_TA;
		ComApp[i]->TxMsg.Head.VSQ = info.Num;
		ComApp[i]->TxMsg.Head.COT = REQ;
		ComApp[i]->TxMsg.Head.PubAddr = (INT8U)GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
	
		ComApp[i]->TxLen = sizeof (struct PASDUHead) + info.Num*len - 2;
		ComApp[i]->AppCommand = APP_SENDDATA;
		
		ComApp[i]->LastDevIndex = ComApp[i]->ActDevIndex;
		ComApp[i]->LastDevType = SOEDATA;
		ComApp[i]->LastDevNum = info.Num;
		return ;
	}
	
	ComApp[i]->Data2Flag &= (~HaveSOE);
	ComApp[i]->AppCommand = APP_NODATA;
}

/*------------------------------------------------------------------*/
/*函数名称:EnCodeFA()												*/
/*函数功能:编辑故障检测数据帧										*/
/*------------------------------------------------------------------*/
void EnCodeFA(INT8U Port)
{
	
	
}

/*------------------------------------------------------------------*/
/*函数名称:EnCodeNVA()												*/
/*函数功能:编辑变化遥测帧											*/
/*------------------------------------------------------------------*/
void EnCodeNVA(INT8U Port)
{
	BOOL	rc;
	INT8U	i, j, k, num;
	INT16U	tmp, no, len;
	struct MENA	yc;
	struct DBInfo info;
	
	i = Port - 1;
	num = 0;
	len = 4;
	info.SuperID = ComDb[i]->DBCfgs->DevID;
	info.DevID = ComApp[i]->NvaActDev;
	info.Type = YCDATA;
	info.Start = ComApp[i]->NvaActDevCur;
	info.Num = 0x80;	//dingding?

	for (j=0; j<ComDb[i]->DBCfgs->Info.Logic.DevNum; j++)
	{
		rc = DBRead(ComApp[i]->Tmpbuf, &info);
		
		if ((!rc) || (info.Num == 0))
		{
			rc = GetNextActDevIndex(Port, ComApp[i]->NvaActDev, NVAACTDEV);
			if (!rc)
			{
				ComApp[i]->AppCommand = APP_NODATA;
				return ;
			}
		}
		else
		{
			no = GetActDevNo(Port, ComApp[i]->NvaActDev, YCDATA);
			for (k=0; k<info.Num; k++)
			{
				tmp = *((INT16U*)ComApp[i]->Tmpbuf + k);
				if ((tmp > ComApp[i]->YCValue[no+k] + ComApp[i]->YCDVal[no+k]) ||
					(tmp < ComApp[i]->YCValue[no+k] - ComApp[i]->YCDVal[no+k]))
				{
					num++;
					ComApp[i]->YCValue[no+k] = tmp;
					
					if (ComApp[i]->YCTypeID == M_ME_NA)
					{
						len = sizeof (struct MENA);
						if (num == 1)
						{
							ComApp[i]->TxMsg.Head.InfoAddr = LAI + k;
							*((INT16U*)ComApp[i]->TxMsg.Data) = tmp;
							ComApp[i]->TxMsg.Data[2] = 0x00;
						}
						else
						{
							yc.InfoAddr = LAI + k;
							yc.Value = tmp;
							yc.QDS = 0x00;
							memcpy ((INT8U*)&ComApp[i]->TxMsg.Data[num*len - 7], (INT8U*)&yc, len);
						}
					}
					else
					{				
						if (num == 1)
						{
							ComApp[i]->TxMsg.Head.InfoAddr = LAI + k;
							*((INT16U*)ComApp[i]->TxMsg.Data) = tmp;
						}
						else
						{
							*((INT16U*)ComApp[i]->TxMsg.Data + num*2 - 3) = LAI + k;
							*((INT16U*)ComApp[i]->TxMsg.Data + num*2 - 2) = tmp;
						}
					}
				}
				
				if (num >= ComApp[i]->MaxYCNum)	//一帧发送的最多遥测个数
				{
					ComApp[i]->NvaActDevCur = k;
					break;
				}
			}
			
			if (info.Num == 0x80)	//当前设备一次没有发完
			{
				ComApp[i]->NvaActDevCur = k;
			}
			else	//下一台设备
			{
				rc = GetNextActDevIndex(Port, ComApp[i]->NvaActDev, NVAACTDEV);
				if (num)
					break;
				if (!rc)
				{
					ComApp[i]->Data2Flag &= (~HaveNVA);
					ComApp[i]->AppCommand = APP_NODATA;
					return ;
				}
			}
			
		}
	}	//for
	
	if (num)
	{
		ComApp[i]->TxMsg.Head.TypeID = ComApp[i]->YCTypeID;
		ComApp[i]->TxMsg.Head.VSQ = num;
		ComApp[i]->TxMsg.Head.COT = REQ;
		ComApp[i]->TxMsg.Head.PubAddr = (INT8U)GetAddrByDevIndex(Port, ComApp[i]->NvaActDev);
	
		ComApp[i]->TxLen = sizeof (struct PASDUHead) + num*len - 2;
		ComApp[i]->AppCommand = APP_SENDDATA;
	}
	else
		ComApp[i]->Data2Flag &= (~HaveNVA);
	
}

/*------------------------------------------------------------------*/
/*函数名称:CheckNVA()												*/
/*函数功能:检测变化遥测数据,成功返回TRUE							*/
/*------------------------------------------------------------------*/
BOOL CheckNVA(INT8U Port)
{
	BOOL	rc;
	INT8U	i, j, k;
	INT16U	tmp, no, curdev, num;
	struct DBInfo info;
	
	i = Port - 1;
	num = 0;	
	curdev = ComApp[i]->NvaActDev;
	info.SuperID = ComDb[i]->DBCfgs->DevID;
	info.DevID = ComApp[i]->NvaActDev;
	info.Type = YCDATA;
	info.Start = num;
	info.Num = 0x80;	//dingding?

	for (j=0; j<ComDb[i]->DBCfgs->Info.Logic.DevNum; j++)
	{
		rc = DBRead(ComApp[i]->Tmpbuf, &info);

		if ((!rc) || (info.Num == 0))
		{
			rc = GetNextActDevIndex(Port, ComApp[i]->NvaActDev, NVAACTDEV);
			if (!rc)
			{
				ComApp[i]->NvaActDev = curdev;
				return (FALSE);
			}
		}
		else
		{
			no = GetActDevNo(Port, ComApp[i]->NvaActDev, YCDATA);
			for (k=0; k<info.Num; k++)
			{
				tmp = *((INT16U*)ComApp[i]->Tmpbuf + k);
				if ((tmp > ComApp[i]->YCValue[no+k] + ComApp[i]->YCDVal[no+k]) ||
					(tmp < ComApp[i]->YCValue[no+k] - ComApp[i]->YCDVal[no+k]))
				{
					ComApp[i]->NvaActDev = curdev;
					return (TRUE);
				}
			}
			
			if (info.Num == 0x80)	//当前设备一次没有发完
			{
				num += 0x80;
			}
			else	//下一台设备
			{
				rc = GetNextActDevIndex(Port, ComApp[i]->NvaActDev, NVAACTDEV);
				if (!rc)
				{
					ComApp[i]->NvaActDev = curdev;
					return (FALSE);
				}
			}
			
		}
	}	//for
	
	ComApp[i]->NvaActDev = curdev;
	return (FALSE);
}

/*------------------------------------------------------------------*/
/*函数名称:GetYcDeadValue()										*/
/*函数功能:获得遥测死区值											*/
/*输入说明:														*/
/*------------------------------------------------------------------*/
void GetYcDeadValue(INT8U Port, INT16U Num, INT32U DValue)
{
	INT8U	i, id;
	INT16U	num, j;
	struct DBInfo info;
	
	i = Port - 1;
	num = 0;
	
	for (id=0; id<ComDb[i]->DBCfgs->Info.Logic.DevNum; id++)
	{
		info.SuperID = ComDb[i]->DBCfgs->DevID;
		info.DevID = ComDb[i]->DBCfgs->Info.Logic.pOld[id].DevID;
		info.Type = YCFULLVAULE;
		info.Num = DBCfgs[info.DevID].YCNum;
		info.Start = 0;
		DBRead(&ComApp[i]->Tmpbuf[0], &info);
		
		for (j=0; j<info.Num; j++)
		{
			ComApp[i]->YCDVal[num+j] = DValue * (*((INT16U*)ComApp[i]->Tmpbuf + j)) / 1000;	//可能为零
			
		}
		num += info.Num;
	}
}

/*------------------------------------------------------------------*/
/*函数名称:GetActDevIndexByAddr()									*/
/*函数功能:通过地址查询设备的是否存在								*/
/*输出说明:成功返回TRUE											*/
/*------------------------------------------------------------------*/
BOOL GetActDevIndexByAddr(INT8U Port, INT16U Addr)
{
	INT8U	i, j;
	INT16U	dev;
	
	i = Port - 1;
	if (ComDb[i]->DBCfgs->Info.Logic.DevNum == 1)
	{
		if (Addr == ComDb[i]->DBCfgs->Address)
		{
			ComApp[i]->ActDevIndex = ComDb[i]->DBCfgs->DevID;
			return (TRUE);
		}
		return (FALSE);
	}
	
	for (j=0; j<ComDb[i]->DBCfgs->Info.Logic.DevNum; j++)
	{
		dev = ComDb[i]->DBCfgs->Info.Logic.pOld[j].DevID;
		if (Addr == DBCfgs[dev].Address)
		{
			ComApp[i]->ActDevIndex = dev;
			return (TRUE);
		}
	}
	
	return (FALSE);
}

/*------------------------------------------------------------------*/
/*函数名称:GetAddrByDevIndex()										*/
/*函数功能:通过设备查询地址的是否存在(针对公共地址)				*/
/*输出说明:成功返回地址											*/
/*------------------------------------------------------------------*/
INT16U GetAddrByDevIndex(INT8U Port, INT16U DevID)
{
	INT8U	i, j;
	
	i = Port - 1;
	
	//参数输入
	if (!(ComApp[i]->Control & 0x04))
		return (ComApp[i]->PubAddrBase);
	
	if (ComDb[i]->DBCfgs->Info.Logic.DevNum == 1)
	{
		if (DevID == ComDb[i]->DBCfgs->DevID)
		{
			return (ComDb[i]->DBCfgs->Address);
		}
		return (0);
	}	
	
	for (j=0; j<ComDb[i]->DBCfgs->Info.Logic.DevNum; j++)
	{
		if (DevID == ComDb[i]->DBCfgs->Info.Logic.pOld[j].DevID)
		{
			return (DBCfgs[DevID].Address);
		}
	}
	
	return (0);
}

/*------------------------------------------------------------------*/
/*函数名称:GetNextActDevIndex()									*/
/*函数功能:激活下一个设备											*/
/*输出说明:成功返回TRUE,只有一个设备时返回FALSE					*/
/*------------------------------------------------------------------*/
BOOL GetNextActDevIndex(INT8U Port, INT16U ActDev, INT8U Flag)
{
	INT8U	i, j;
	INT16U	devid;
	
	i = Port - 1;
	if (ComDb[i]->DBCfgs->Info.Logic.DevNum == 1)
		return (FALSE);
		
	devid = ComDb[i]->DBCfgs->Info.Logic.pOld[0].DevID;
	for (j=0; j<(ComDb[i]->DBCfgs->Info.Logic.DevNum - 1); j++)
	{
		if (ComDb[i]->DBCfgs->Info.Logic.pOld[j].DevID == ActDev)
		{
			devid = ComDb[i]->DBCfgs->Info.Logic.pOld[j+1].DevID;
			break;
		}
	}

	if (Flag == ACTDEVINDEX)
	{
		ComApp[i]->ActDevIndex = devid;
	}
	else if (Flag == NVAACTDEV)
	{
		ComApp[i]->NvaActDev = devid;
	}		
	else
		return (FALSE);
	
	return (TRUE);
}

/*------------------------------------------------------------------*/
/*函数名称:GetActDevNo()											*/
/*函数功能:获得当前设备的遥测起始号								*/
/*输出说明:返回起始号												*/
/*------------------------------------------------------------------*/
INT16U GetActDevNo(INT8U Port, INT16U DevID, INT16U Flag)
{
	INT8U	i, j;
	INT16U	num, dev;
	
	i = Port - 1;
	num = 0;
	
	if (ComDb[i]->DBCfgs->Info.Logic.DevNum == 1)
		return (num);
		
	for (j=0; j<ComDb[i]->DBCfgs->Info.Logic.DevNum; j++)
	{
		if (DevID == ComDb[i]->DBCfgs->Info.Logic.pOld[j].DevID)
			return (num);
		else
		{
			dev = ComDb[i]->DBCfgs->Info.Logic.pOld[j].DevID;
			if (Flag == YCDATA)
				num += DBCfgs[dev].YCNum;
			else if (Flag == DDDATA)
				num += DBCfgs[dev].DDNum;
		}
	}
	
	return (0);		//dingding?
}






⌨️ 快捷键说明

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