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

📄 stipulparse.c

📁 电力行业必备。有错的地方
💻 C
📖 第 1 页 / 共 4 页
字号:
		{
			ParamLock += 1;
		}
	}
	else
	{
		ParamLock += 1;
	}
	if (ParamLock==3)
	{
		DateTimeRead(&year, &mon, &day, &week, 					// 读时钟
					 &hour, &min, &sec);
		Param_Lock_time[0] = (uint8)(year%100);					// 保存锁定时间
		Param_Lock_time[1] = (uint8)mon;
		Param_Lock_time[2] = (uint8)day;
		Param_Lock_time[3] = (uint8)hour;
		Param_Lock_time[4] = (uint8)min;
		ParamLock ++;
	}
		
	RetCodeErr(&num);				// 返回密码权限不足
	
	return(0);
		
}
/*********************************************************************************************************
** 函数名称: DealSetParam()
** 功能描述: 密码正确后的处理
**
** 输 入: 	num 当前处理的接收队列号
**			
** 输 出: 无
**         
** 全局变量: 
** 调用模块: 
**
** 作 者: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void DealSetParam(uint8 *pnum)
{
	uint32	i;
	uint32	offset;												// 保存该数据项在数据结构中的偏移地址
	uint8	attr;												// 保存该数据项的属性
	uint8	bnum;												// 保存该数据项块序号
	uint32 	len;												// 保存该数据项的长度
	static	uint32	len1,len2;											// 保存队列中为处理数据项及内容的长度
	uint8	*pt,*p,*pp;											// 记录当前处理接收队列中位置指针
	uint8	par[2];												// 用来保存临时参数
	uint8	uc_data;
	uint8	buf[256];
	static  uint8	sendbuf[256],sendlen;								// 保存返回的数据内容及长度
	uint8	err;
	static uint8 num;
	
	num = *pnum;
	sendlen = 0;
	len1 = Rcv_Q[num].datalen[1];
	len1 = len1<<8;
	len1 = len1 + Rcv_Q[num].datalen[0];						// 计算数据项及内容长度
	len1 = len1 - 5;											// 计算数据项及内容长度
	len2 = len1 - 2;
	pt	 = &Rcv_Q[num].buf[5];									// 把接收队列中第一个数据项的位置付给该指针
	
	while ((len1>2)&&(len1<1030))
	{//*
		par[1] = *pt;
		pt ++;
		par[0] = *pt;
		pt ++;
		len = ParamIndex(Rcv_Q[num].buf[0], par, &offset, &attr, &bnum); // 读出该数据项的长度
		if (len>0)												// 有该数据项
		{//**
			//pt = pt + len;
			len1 = len1 - len - 2;
			uc_data = attr>>4;
			if (((Rcv_Q[num].buf[1]&0x0F)+1)>=uc_data) 			// 密码权限判断
			{//***
				uc_data = attr & 0x0F;							// 读写权限判断
				if (uc_data==0x00)
				{
					err = 0x02;									// 返回设置内容非法
				}
				else
				{
					err = 0x00;									// 返回设置内容正常
				}
				
				if (par[0]==0x80 && 
					((par[1]<0x16) || (par[1]==0x1F)))			// 判断与GPRS相关的参数是否有变
				{	
					GprsManagPar.flag = 0x01;					// 如果有变,置标志位,由GPRS管理任务处理
				}
				if ((par[0]==0x80) && (par[1]==0x16))			// 判断终端地市区县码
				{
					TermAddr[0] = *pt;//Rcv_Q[num].buf[7];
					TermAddr[1] = *(pt + 1);//Rcv_Q[num].buf[8];
				}
				if ((par[0]==0x80) && (par[1]==0x17))			// 判断终端地址
				{
					TermAddr[2] = *pt;//Rcv_Q[num].buf[7];
					TermAddr[3] = *(pt + 1);//Rcv_Q[num].buf[8];
				}
				if ((par[0]==0x80) && (par[1]==0x21))			// 判断低级权限密码
				{
					UserCode[0] = *pt;//Rcv_Q[num].buf[7];
					UserCode[1] = *(pt + 1);//Rcv_Q[num].buf[8];
					UserCode[2] = *(pt + 1);////Rcv_Q[num].buf[9];
				}
				if ((par[0]==0x80) && (par[1]==0x22))			// 判断高级权限密码
				{
					AdminCode[0] = *pt;// Rcv_Q[num].buf[7];
					AdminCode[1] = *(pt + 1);//Rcv_Q[num].buf[8];
					AdminCode[2] = *(pt + 1);//Rcv_Q[num].buf[9];
				}
				if ((par[0]==0x80) && (par[1]==0x30))			// 判断时间设置
				{
					buf[5] = *pt;//Rcv_Q[num].buf[7];
					buf[4] = *(pt + 1);//Rcv_Q[num].buf[8];
					buf[3] = *(pt + 2);//Rcv_Q[num].buf[9];
					buf[2] = *(pt + 3);//Rcv_Q[num].buf[10];
					buf[1] = *(pt + 4);//Rcv_Q[num].buf[11];
					buf[0] = *(pt + 5);//Rcv_Q[num].buf[12];
					DateTimeWrite((uint16)(2000|(BCD2HEX(buf[0]))), 
					 			  (uint16)(BCD2HEX(buf[1])),
					 			  (uint16)(BCD2HEX(buf[2])),
					 			  (uint16)(BCD2HEX(buf[3])),
					 			  (uint16)(BCD2HEX(buf[4])),
					 			  (uint16)(BCD2HEX(buf[5])));
				}
				
				//else
				//{
				//	GprsManagPar.flag = 0x00;
				//}
						
				if (par[0]==0x81)								// 判断任务参数是否改变
				{
					ReadData(offset, len2, buf);					// 读参数区数据
					for (i=0;i<len2;i++)
					{
						if (*pp!=buf[i])						// 比较任务参数是否有变化
						{
							Task_Set_Flag = 0x01;
							break;
						}
						else
						{
							pp ++;
						}
					}		
				}
				
				if ((par[0]==0x81)&&(par[1]>0x00)&&(par[1]<=32))			// 保存任务参数
				{
					p = &ParamInSram.Term_Par.X8010[0] + offset;	
					pp = pt;
					
					writeData1(p, len2, pp);
					writeparamchk(&ParamInSram.Term_Par.X8010[0], &bnum);	//处理参数区校验码
					p = &ParamIn.Term_Par.X8010[0] + offset;
					pp = pt;// - len;
					writeData1(p, len2, pp);
					writeparamchk(&ParamIn.Term_Par.X8010[0], &bnum);
				}
				else
				{
					p = &ParamInSram.Term_Par.X8010[0] + offset;			// 保存参数
					pp = pt;
					writeData(p, len, pp);
					writeparamchk(&ParamInSram.Term_Par.X8010[0], &bnum);	//处理参数区校验码
					p = &ParamIn.Term_Par.X8010[0] + offset;
					pp = pt;// - len;
					writeData(p, len, pp);
					writeparamchk(&ParamIn.Term_Par.X8010[0], &bnum);
				}
				
				
				if ((Rcv_Q[num].buf[0]==0)&&							// 心跳间隔处理
					(par[0]==0x89)&&(par[1]==0x02))						// 把测量点参数中0号测量点的低字节作为心跳间隔
				{
					//uc_heartp = ParamInSram.Mp_Par[0].X8902[5];	
					uc_heartp = (uint8)BCD2HEX(Rcv_Q[num].buf[7]);
				}
				
				sendbuf[sendlen] = par[1];
				sendlen ++;
				sendbuf[sendlen] = par[0];
				sendlen ++;
				sendbuf[sendlen] = err;
				sendlen ++;	
				pt = pt + len;
				continue;		
			}//***
			else												// 返回密码权限不足
			{
				pt = pt + len;
				sendbuf[sendlen] = par[1];
				sendlen ++;
				sendbuf[sendlen] = par[0];
				sendlen ++;
				sendbuf[sendlen] = 0x03;
				sendlen ++;	
				continue;	
			}		    	
		}//**
		else													// 无该数据项,不再继续处理剩余的数据
		{
			sendbuf[sendlen] = par[1];
			sendlen ++;
			sendbuf[sendlen] = par[0];
			sendlen ++;
			sendbuf[sendlen] = 0x04;
			sendlen ++;	
			break;
		}
	}//*
	buf[0] = 0x68;												// 填写发送缓冲区
	for (i=0;i<6;i++)
	{
		buf[i+1] = Rcv_Q[num].addr[i];
	}
	buf[7] = 0x68;
	buf[8] = Rcv_Q[num].concode | 0x80;
	sendlen = sendlen + 1;
	buf[9] = sendlen;
	buf[10] = 0x00;
	buf[11]= Rcv_Q[num].buf[0];
	for (i=0;i<sendlen;i++)
	{
		buf[12+i] = sendbuf[i];
	}
	buf[11+sendlen]= AddData(buf, sendlen+11);
	buf[12+sendlen]= 0x16;
	PushSendQue(buf,sendlen+13, Rcv_Q[num].chtype);	
	ProgrmNote(&num);											// 填写编程记录
	
}

/*********************************************************************************************************
** 函数名称: ProgrmNote(uint8 *pnum)
** 功能描述: 编程记录
**
** 输 入: 	*pnum 当前处理的接收队列号
**			
** 输 出: 无
**         
** 全局变量: 
** 调用模块: 
**
** 作 者: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void ProgrmNote(uint8 *pnum)
{
	uint16	year;
	uint16	mon;
	uint16	day;
	uint16 	week;
	uint16	hour;
	uint16	min;
	uint16	sec;
	uint8	num;
	uint8	len,len1;
	uint8	i,j;
	
	 
	/*year = 2007;
	mon=9;day=18;hour=17;min=5;sec=30;
	DateTimeWrite(year, mon, day, hour, min, sec);*/
	
	DateTimeRead(&year, &mon, &day, &week, 						// 读时钟
						&hour, &min, &sec);
	DateTimeRead(&year, &mon, &day, &week, 						// 读时钟
						&hour, &min, &sec);
	//p_ProgramLog = 0;
	
	num = *pnum;
	
	if (p_ProgramLog>59)										// 如果记录超过60条,第一条被挤掉
	{
		for (i=0;i<60;i++)
		{
			ProgramLog[i].len = ProgramLog[i+1].len;
			ProgramLog[i].mp_num = ProgramLog[i+1].mp_num;
			for (j=0;j<5;j++)
			{
				ProgramLog[i].time[j] = ProgramLog[i+1].time[j];
			}
			for (j=0;j<9;j++)
			{
				ProgramLog[i].dac[j] = ProgramLog[i+1].dac[j];
			}
			for (j=0;j<238;j++)
			{
				ProgramLog[i].buf[j] = ProgramLog[i+1].buf[j];
			}
		}
		p_ProgramLog = 59;
	}
	ProgramLog[p_ProgramLog].mp_num	 = Rcv_Q[num].buf[0];
	//len = 1;
	ProgramLog[p_ProgramLog].time[0] = HEX2BCD(year%100);
	ProgramLog[p_ProgramLog].time[1] = HEX2BCD((uint8)(mon));
	ProgramLog[p_ProgramLog].time[2] = HEX2BCD((uint8)(day));
	ProgramLog[p_ProgramLog].time[3] = HEX2BCD((uint8)(hour));
	ProgramLog[p_ProgramLog].time[4] = HEX2BCD((uint8)(min));
	//ProgramLog[p_ProgramLog].time[5] = (uint8)(sec);
	//len += 5;
	
	len1 = Rcv_Q[num].datalen[1];
	len1 = len1<<8;
	len1 = len1 + Rcv_Q[num].datalen[0];						// 计算数据项及内容长度
	len1 = len1 - 5;
	ProgramLog[p_ProgramLog].dac[8] = Rcv_Q[num].chtype;
	//len += 1;
	for (i=0;i<8;i++)
	{
		ProgramLog[p_ProgramLog].dac[7-i] = i;
		//len ++;
	}
	len = 0;
	for (i=0;i<len1;i++)	
	{
		ProgramLog[p_ProgramLog].buf[i] = Rcv_Q[num].buf[5+i];
		len ++;
	}
	ProgramLog[p_ProgramLog].len = len;	
	p_ProgramLog += 1;		
}

/*********************************************************************************************************
** 函数名称: SetParamOVT()
** 功能描述: 写实时对象超时的处理
**
** 输 入: 	num 当前处理的接收队列号
**			
** 输 出: 无
**         
** 全局变量: 
** 调用模块: 
**
** 作 者: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void SetParamOVT(uint8 *pnum)
{
	uint32	i;
	uint32	offset;												// 保存该数据项在数据结构中的偏移地址
	uint8	attr;												// 保存该数据项的属性
	uint8	bnum;												// 保存该数据项块序号
	uint32 	len;												// 保存该数据项的长度
	uint32	len1;												// 保存队列中为处理数据项及内容的长度
	uint8	*pt;												// 记录当前处理接收队列中位置指针
	uint8	par[2];												// 用来保存临时参数
	uint8	buf[256];
	uint8	sendbuf[256],sendlen;								// 保存返回的数据内容及长度
	static uint8 num;
	
	num = *pnum;
	sendlen = 0;
	len1 = Rcv_Q[num].datalen[1];
	len1 = len1<<8;
	len1 = len1 + Rcv_Q[num].datalen[0];						// 计算数据项及内容长度
	len1 = len1 - 5;											// 计算数据项及内容长度
	pt	 = &Rcv_Q[num].buf[5];									// 把接收队列中第一个数据项的位置付给该指针
	
	while (len1>2)
	{//*
		par[1] = *pt;
		pt ++;
		par[0] = *pt;
		pt ++;
		len = ParamIndex(Rcv_Q[num].buf[0], par, &offset, &attr, &bnum); // 读出该数据项的长度
		if (len>0)												// 有该数据项
		{//**
			//pt = pt + len;
			len1 = len1 - len - 2;
			pt = pt + len;
			sendbuf[sendlen] = par[1];
			sendlen ++;
			sendbuf[sendlen] = par[0];
			sendlen ++;
			sendbuf[sendlen] = 0x05;
			sendlen ++;	
			continue;			    	
		}//**
		else													// 无该数据项,不再继续处理剩余的数据
		{
			sendbuf[sendlen] = par[1];
			sendlen ++;
			sendbuf[sendlen] = par[0];
			sendlen ++;
			sendbuf[sendlen] = 0x04;
			sendlen ++;	
			break;
		}
	}//*
	buf[0] = 0x68;												// 填写发送缓冲区
	for (i=0;i<6;i++)
	{
		buf[i+1] = Rcv_Q[num].addr[i];
	}
	buf[7] = 0x68;
	buf[8] = Rcv_Q[num].concode | 0x80;
	sendlen = sendlen + 1;
	buf[9] = sendlen;
	buf[10] = 0x00;
	buf[11]= Rcv_Q[num].buf[0];
	for (i=0;i<sendlen;i++)
	{
		buf[12+i] = sendbuf[i];
	}
	buf[11+sendlen]= AddData(buf, sendlen+11);
	buf[12+sendlen]= 0x16;
	PushSendQue(buf,sendlen+13, Rcv_Q[num].chtype);	
}
/*********************************************************************************************************
** 函数名称: ReadCurData()
** 功能描述: 读当前数据
**
** 输 入: 	num 当前处理的接收队列号
**			
** 输 出: 无
**         
** 全局变量: 
** 调用模块: 
**
** 作 者: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 ReadCurData(uint8 *pnum)
{
	uint32	j;
	static uint32	offset;												// 保存该数据项在数据结构中的偏移地址
	static uint8	attr;												// 保存该数据项的属性
	static uint8	bnum;												// 保存该数据项块序号
	static uint32 	len;												// 保存该数据项的长度
	static uint32	len1;												// 保存队列中为处理数据项及内容的长度
	uint8	*pt,*p,*pp;												// 记录当前处理接收队列中位置指针

⌨️ 快捷键说明

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