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

📄 101priapp.c

📁 详细介绍了arm7-at91r40008,的开发全过程
💻 C
📖 第 1 页 / 共 2 页
字号:
void P101ProcSetNVA(INT8U Port)
{
	
	
	
}

/*------------------------------------------------------------------*/
/*函数名称:P101ProcYX()											*/
/*函数功能:处理遥信数据并写入数据库								*/
/*输入说明:Flag:YX类型											*/
/*------------------------------------------------------------------*/
void P101ProcYX(INT8U Port, INT8U Flag)
{
	INT8U	i, j, k, num;
	INT16U	tmp, all;
	struct DBInfo info;
	
	i = Port - 1;
	memset (ComApp[i]->Tmpbuf, 0, 512);
	info.SuperID = ComApp[i]->ActDevIndex;
	info.DevID = ComApp[i]->ActDevIndex;
	info.Start = ComApp[i]->RxMsg->Head.InfoAddr - LBI;
	all = ComApp[i]->RxMsg->Head.VSQ & P101_VSQ;
	if (all >= ComDb[i]->DBCfgs[ComApp[i]->ActIndex].YXNum - 1)
		all = ComDb[i]->DBCfgs[ComApp[i]->ActIndex].YXNum - 1;
	info.Num = all;
	
	if (Flag == M_SP_NA)
	{
		if (ComApp[i]->RxMsg->Head.VSQ & P101_SQ)
		{
			info.Type = YXDATA;
			for (j=0; j<info.Num; j++)
			{
				if (ComApp[i]->RxMsg->Data[j])
					ComApp[i]->Tmpbuf[j] = YX_H;
				else
					ComApp[i]->Tmpbuf[j] = YX_F;
			}
			
		}
		else
		{
			info.Type = YXDOTDATA;
			ComApp[i]->Tmpbuf[0] = ComApp[i]->RxMsg->Head.InfoAddr - LBI;
			if (ComApp[i]->RxMsg->Data[0])
				ComApp[i]->Tmpbuf[2] = YX_H;
			else
				ComApp[i]->Tmpbuf[2] = YX_F;
			for (j=1; j<info.Num; j++)
			{
				tmp = *((INT16U*)(ComApp[i]->RxMsg->Data + j*3 - 2)) - LBI;
				ComApp[i]->Tmpbuf[3*j + 0] = tmp & 0xFF;
				ComApp[i]->Tmpbuf[3*j + 1] = (tmp>>8) & 0xFF;
				if (ComApp[i]->RxMsg->Data[3*j])
					ComApp[i]->Tmpbuf[3*j + 2] = YX_H;
				else
					ComApp[i]->Tmpbuf[3*j + 2] = YX_F;
			}
		}

		DBWrite(ComApp[i]->Tmpbuf, &info);	
	}
	
	if (Flag == M_PS_NA)
	{
		info.Type = YXDATA;
		num = all / 16;
		info.Num = 16;
		for (j=0; j<num; j++)
		{
			if (j == 0)
				info.Start = ComApp[i]->RxMsg->Head.InfoAddr - LBI;
			else
			{
				tmp = *(ComApp[i]->RxMsg->Data + j*sizeof (struct SCDYX) - 1);
				tmp = tmp * 0x100;
				tmp += *(ComApp[i]->RxMsg->Data + j*sizeof (struct SCDYX) - 2);
				info.Start = tmp - LBI;
			}
			tmp = *(ComApp[i]->RxMsg->Data + j*sizeof (struct SCDYX) + 1);
			tmp = tmp * 0x100;
			tmp += *(ComApp[i]->RxMsg->Data + j*sizeof (struct SCDYX));
			for (k=0; k<16; k++)
			{
				if (tmp & (0x0001<<k))
					ComApp[i]->Tmpbuf[k] = YX_H;
				else
					ComApp[i]->Tmpbuf[k] = YX_F;
			}
			DBWrite(ComApp[i]->Tmpbuf, &info);	
		}
		
		info.Num = all % 16;
		tmp = *(ComApp[i]->RxMsg->Data + j*sizeof (struct SCDYX) - 1);
		tmp = tmp * 0x100;
		tmp += *(ComApp[i]->RxMsg->Data + j*sizeof (struct SCDYX) - 2);
		info.Start = tmp - LBI;
		
		tmp = *(ComApp[i]->RxMsg->Data + j*sizeof (struct SCDYX) + 1);
		tmp = tmp * 0x100;
		tmp += *(ComApp[i]->RxMsg->Data + j*sizeof (struct SCDYX));
		for (k=0; k<info.Num; k++)
		{
			if (tmp & (0x0001<<k))
				ComApp[i]->Tmpbuf[k] = YX_H;
			else
				ComApp[i]->Tmpbuf[k] = YX_F;
		}
		DBWrite(ComApp[i]->Tmpbuf, &info);	
	}	

}

/*------------------------------------------------------------------*/
/*函数名称:P101ProcYC()											*/
/*函数功能:处理遥测数据并写入数据库								*/
/*输入说明:Flag:YC类型											*/
/*------------------------------------------------------------------*/
void P101ProcYC(INT8U Port, INT8U Flag)
{
	INT8U	i, j;
	INT16U	tmp;
	struct DBInfo info;
	
	i = Port - 1;
	memset (ComApp[i]->Tmpbuf, 0, 512);
	info.SuperID = ComApp[i]->ActDevIndex;
	info.DevID = ComApp[i]->ActDevIndex;
	info.Start = ComApp[i]->RxMsg->Head.InfoAddr - LAI;
	info.Num = ComApp[i]->RxMsg->Head.VSQ & P101_VSQ;
	
	if (Flag == M_ME_ND)
	{
		if (ComApp[i]->RxMsg->Head.VSQ & P101_SQ)
		{
			info.Type = YCDATA;
			memcpy (ComApp[i]->Tmpbuf, (INT8U*)&ComApp[i]->RxMsg->Data, info.Num * 2);
		}
		else
		{
			info.Type = YCDOTDATA;
			ComApp[i]->Tmpbuf[0] = ComApp[i]->RxMsg->Head.InfoAddr - LAI;
			ComApp[i]->Tmpbuf[2] = *(ComApp[i]->RxMsg->Data);
			ComApp[i]->Tmpbuf[3] = *(ComApp[i]->RxMsg->Data + 1);
			for (j=1; j<info.Num; j++)
			{
				tmp = *(ComApp[i]->RxMsg->Data + j*4 - 1);
				tmp = tmp * 0x100;
				tmp += *(ComApp[i]->RxMsg->Data + j*4 - 2);
				ComApp[i]->Tmpbuf[j*4] = tmp - LAI;
				ComApp[i]->Tmpbuf[j*4 + 2] = *(ComApp[i]->RxMsg->Data + j*4);
				ComApp[i]->Tmpbuf[j*4 + 3] = *(ComApp[i]->RxMsg->Data + j*4 + 1);
			}
		}
		
	}
	
	if (Flag == M_ME_NA)
	{
		if (ComApp[i]->RxMsg->Head.VSQ & P101_SQ)
		{
			info.Type = YCDATA;
			for (j=0; j<info.Num; j++)
			{
				ComApp[i]->Tmpbuf[j*2 + 0] = *(ComApp[i]->RxMsg->Data + j*3);
				ComApp[i]->Tmpbuf[j*2 + 1] = *(ComApp[i]->RxMsg->Data + j*3 + 1);
			}
		}
		else
		{
			info.Type = YCDOTDATA;
			ComApp[i]->Tmpbuf[0] = ComApp[i]->RxMsg->Head.InfoAddr - LAI;
			ComApp[i]->Tmpbuf[2] = *(ComApp[i]->RxMsg->Data);
			ComApp[i]->Tmpbuf[3] = *(ComApp[i]->RxMsg->Data + 1);
			
			for (j=1; j<info.Num; j++)
			{
				tmp = *(ComApp[i]->RxMsg->Data + j*5 - 1);
				tmp = tmp * 0x100;
				tmp += *(ComApp[i]->RxMsg->Data + j*5 - 2);
				ComApp[i]->Tmpbuf[j*4] = tmp - LAI;
				
				ComApp[i]->Tmpbuf[j*4 + 2] = *(ComApp[i]->RxMsg->Data + j*5);
				ComApp[i]->Tmpbuf[j*4 + 3] = *(ComApp[i]->RxMsg->Data + j*5 + 1);
			}
		}		
	
	}

	DBWrite(ComApp[i]->Tmpbuf, &info);
}

/*------------------------------------------------------------------*/
/*函数名称:P101ProcSOE()											*/
/*函数功能:处理遥信数据并写入数据库								*/
/*------------------------------------------------------------------*/
void P101ProcSOE(INT8U Port)
{

	INT8U	i, j, min;
	struct DBInfo	info;
	struct AbsTime_t	time;
	struct SOECP24Time	*tmp;
	struct SOE_t	*soe;
	
	i = Port - 1;
	memset (ComApp[i]->Tmpbuf, 0, 512);
	info.SuperID = ComApp[i]->ActDevIndex;
	info.DevID = ComApp[i]->ActDevIndex;
	info.Type = SOEDATA;
	info.Num = ComApp[i]->RxMsg->Head.VSQ & P101_VSQ;

	GetTime((INT8U*)&time, ABSTIME);
	min = time.Minute % 60;
	time.Minute = (time.Minute / 60) * 60;
	
	for (j=0; j<info.Num; j++)
	{
		soe = (struct SOE_t*)&ComApp[i]->Tmpbuf[j * sizeof (struct SOE_t)];
		if (j == 0)
			tmp = (struct SOECP24Time*)&ComApp[i]->RxMsg->Head.InfoAddr;
		else
			tmp = (struct SOECP24Time*)&ComApp[i]->RxMsg->Data[j * sizeof (struct SOECP24Time) - 2];
			
		soe->No = tmp->No - LBI;
		if (soe->No >= ComDb[i]->DBCfgs[ComApp[i]->ActIndex].YXNum - 1)
			continue;
			
		if (tmp->Status)
			soe->Status = YX_H;
		else
			soe->Status = YX_F;
		
		if (min >= tmp->Minute)
			soe->Time.Minute = time.Minute + tmp->Minute;
		else
			soe->Time.Minute = time.Minute + tmp->Minute - 60;

		soe->Time.Msecond = tmp->Msecond; 
	}
	
	DBWrite(ComApp[i]->Tmpbuf, &info);
}

/*------------------------------------------------------------------*/
/*函数名称:P101ProcDD()											*/
/*函数功能:处理电度数据并写入数据库								*/
/*------------------------------------------------------------------*/
void P101ProcDD(INT8U Port)
{
	INT8U	i, j, k;
	struct DBInfo info;
	
	i = Port - 1;
	memset (ComApp[i]->Tmpbuf, 0, 512);
	info.SuperID = ComApp[i]->ActDevIndex;
	info.DevID = ComApp[i]->ActDevIndex;
	info.Start = ComApp[i]->RxMsg->Head.InfoAddr - LBCD;
	info.Num = ComApp[i]->RxMsg->Head.VSQ & P101_VSQ;
	
	for (j=0, k=0; k<info.Num * 7; j++, k++)
	{
		ComApp[i]->Tmpbuf[j] = ComApp[i]->RxMsg->Data[k];
		k += 3;
	}

	DBWrite(ComApp[i]->Tmpbuf, &info);
}

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


/*------------------------------------------------------------------*/
/*函数名称:P101ProcClock()											*/
/*函数功能:对钟命令确认命令										*/
/*输入说明:														*/
/*------------------------------------------------------------------*/
void P101ProcClock(INT8U Port)
{


}


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


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


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


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

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


/*------------------------------------------------------------------*/
/*函数名称:P101EnCodeControl()										*/
/*函数功能:编辑控制命令帧											*/
/*------------------------------------------------------------------*/
void P101EnCodeControl(INT8U Port, struct DBBOOPInfo* Info)
{
	INT8U	i, dco;
	
	i = Port - 1;
	dco = 0;
	ComApp[i]->YKDevID = Info->SuperID;
	
	ComApp[i]->TxMsg.Head.TypeID = C_DC_NA;
	ComApp[i]->TxMsg.Head.VSQ = 0x01;
	if (Info->Status & BODEL)
		ComApp[i]->TxMsg.Head.COT = DEACT;
	else
		ComApp[i]->TxMsg.Head.COT = ACT;
		
	ComApp[i]->TxMsg.Head.PubAddr = (INT8U)P101GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
	ComApp[i]->TxMsg.Head.InfoAddr = Info->ID + 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_SENDCON;
}

/*------------------------------------------------------------------*/
/*函数名称:P101EnCodeClock()										*/
/*函数功能:编辑对钟命令帧											*/
/*------------------------------------------------------------------*/
void P101EnCodeClock(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 = ACT;
	ComApp[i]->TxMsg.Head.PubAddr = 0xFF;
	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) + 7;
	ComApp[i]->AppCommand = APP_SENDNOCON;
	
	ComApp[i]->AppDevs[ComApp[i]->ActIndex].Status = INUSE;	
}

/*------------------------------------------------------------------*/
/*函数名称:P101EnCodeAllData()										*/
/*函数功能:编辑总召唤帧											*/
/*输入说明:														*/
/*------------------------------------------------------------------*/
void P101EnCodeAllData(INT8U Port)
{
	INT8U	i;
	
	i = Port - 1;
	
	ComApp[i]->TxMsg.Head.TypeID = C_IC_NA;
	ComApp[i]->TxMsg.Head.VSQ = 0x01;
	ComApp[i]->TxMsg.Head.COT = ACT;
	ComApp[i]->TxMsg.Head.PubAddr = (INT8U)P101GetAddrByDevIndex(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_SENDCON;
	
	ComApp[i]->AppDevs[ComApp[i]->ActIndex].Status = USING;
}

/*------------------------------------------------------------------*/
/*函数名称:P101EnCodeCounter()										*/
/*函数功能:编辑总召唤帧											*/
/*输入说明:														*/
/*------------------------------------------------------------------*/
void P101EnCodeCounter(INT8U Port)
{
	INT8U	i;
	
	i = Port - 1;
	
	ComApp[i]->TxMsg.Head.TypeID = C_CI_NA;
	ComApp[i]->TxMsg.Head.VSQ = 0x01;
	ComApp[i]->TxMsg.Head.COT = ACT;
	ComApp[i]->TxMsg.Head.PubAddr = (INT8U)P101GetAddrByDevIndex(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_SENDCON;
	
	ComApp[i]->AppDevs[ComApp[i]->ActIndex].Status = USING;
}

/*------------------------------------------------------------------*/
/*函数名称:P101EnCodeCommStatus()									*/
/*函数功能:编辑通讯状态帧											*/
/*输入说明:Flag为TRUE,通讯正常;									*/
/*------------------------------------------------------------------*/
void P101EnCodeCommStatus(INT8U Port, BOOL Flag)
{
	INT8U	i;
	struct SOE_t soe;
	struct DBInfo info;
	
	i = Port - 1;
	
	soe.No = ComDb[i]->DBCfgs[ComApp[i]->ActIndex].YXNum - 1;
	if (Flag)
		soe.Status = YX_H;
	else
		soe.Status = YX_F;
	GetTime((void*)&soe.Time, ABSTIME);
	
	info.SuperID = ComApp[i]->ActDevIndex;
	info.DevID = ComApp[i]->ActDevIndex;
	info.Num = 1;

	info.Type = SOEDATA;
	DBWrite((INT8U*)&soe, &info);
	
	info.Type = YXDOTDATA;
	DBWrite((INT8U*)&soe, &info);
}

/*------------------------------------------------------------------*/
/*函数名称:P101GetAddrByDevIndex()									*/
/*函数功能:通过设备查询地址的是否存在(针对公共地址)				*/
/*输入说明:DevID为0xFFFF,将对应广播地址							*/
/*输出说明:成功返回地址											*/
/*------------------------------------------------------------------*/
INT16U P101GetAddrByDevIndex(INT8U Port, INT16U DevID)
{
	INT8U	i, j;
	
	i = Port - 1;
	
	if (DevID == 0xFFFF)
		return (0xFFFF);
	
	for (j=0; j<ComDb[i]->DevNum; j++)
	{
		if (DevID == ComDb[i]->DBCfgs[j].DevID)
		{
			return (ComDb[i]->DBCfgs[j].Address);
		}
	}
	
	return (0);
}

/*------------------------------------------------------------------*/
/*函数名称:P101GetDevIndexByAddr()									*/
/*函数功能:通过设备查询地址的是否存在(针对公共地址)				*/
/*输入说明:DevID为0xFFFF,将对应广播地址							*/
/*输出说明:成功返回地址											*/
/*------------------------------------------------------------------*/
INT16U P101GetDevIndexByAddr(INT8U Port, INT16U Addr)
{
	INT8U	i, j;
	
	i = Port - 1;
	
	for (j=0; j<ComDb[i]->DevNum; j++)
	{
		if (Addr == ComDb[i]->DBCfgs[j].Address)
		{
			return (ComDb[i]->DBCfgs[j].DevID);
		}
	}
	
	return (0);
}

/*------------------------------------------------------------------*/
/*函数名称:P101GetIndexByAddr()									*/
/*函数功能:通过设备查询地址的是否存在(针对公共地址)				*/
/*输入说明:DevID为0xFFFF,将对应广播地址							*/
/*输出说明:成功返回地址											*/
/*------------------------------------------------------------------*/
INT16U P101GetIndexByAddr(INT8U Port, INT16U DevID)
{
	INT8U	i, j;
	
	i = Port - 1;
	
	for (j=0; j<ComDb[i]->DevNum; j++)
	{
		if (DevID == ComDb[i]->DBCfgs[j].DevID)
		{
			return (j);
		}
	}

	return (0);
}



⌨️ 快捷键说明

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