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

📄 stipulparse.c

📁 电力行业必备。有错的地方
💻 C
📖 第 1 页 / 共 4 页
字号:
	static uint8	par[2];												// 用来保存临时参数
	uint8	uc_data;
	//uint8	buf[256];
	uint8	sendbuf[1024];										// 保存返回的数据内容及长度
	uint32	sendlen;
	
	uint16	mp_flag,mp;											// 测量点标志
	uint8	iseq;												// 帧内序号
	static uint8 num;
	static uint32 ii;
	num = *pnum;
	sendlen = 0;
	iseq	= 0;
	
	mp_flag = Rcv_Q[num].buf[1];								// 取测量点标志
	mp_flag = mp_flag << 8;
	mp_flag = mp_flag + Rcv_Q[num].buf[0];
	
	if ((mp_flag&0x01FF)==0)
	{
		return(1);
	}
	
	for (ii=0;ii<9;ii++)											// 查询9个测量点
	{//*
		mp = mp_flag;
		mp_flag = mp_flag >> 1; 
		
		len1 = Rcv_Q[num].datalen[1];
		len1 = len1<<8;
		len1 = len1 + Rcv_Q[num].datalen[0];					// 计算数据项及内容长度
		len1 = len1 - 8;										// 计算数据项及内容长度
		
		pt	 = &Rcv_Q[num].buf[8];								// 把接收队列中第一个数据项的位置付给该指针	
		
		if ((mp&0x01) == 1)										// 测量点有效,进行处理
		{//**
			while (len1>=2)
			{//***
				//----------------------------------------------
				len1 = len1 - 2;
				par[1] = *pt;
				pt ++;
				par[0] = *pt;
				pt ++;
				if ((par[0]>=0x80) && (par[0]<=0x89))			// 读参数
				{
					len = ParamIndex(ii, par, 
									 &offset, &attr, &bnum);	// 读出该数据项的长度
				}
				else if ((par[0]>=0x90) && (par[0]<=0xC3)		// 读测量点数据
									    || (par[0]==0x8E))		
				{
					len = CurDataIndex(par, &offset);			// 读出该数据项的长度;
				}
				else											// 读极值类数据
				{
					len = ExtrDataIndex(par, &offset);			// 读极值类数据长度
				}
				//-----------------------------------------------
				if (len>0)											// 有该数据项
				{//****
					if (Rcv_Q[num].chtype == 0x01)					// 如果是短信通道
					{
						if ((sendlen+len)>(140-13-8))
						{
							iseq = 1;
							WriteSendBuf(&num, sendbuf, &sendlen, &iseq);
							iseq ++;
						}
					}
					else											// 其他通道
					{
						if ((sendlen+len)>(1024-13-8))
						{
							iseq = 1;
							WriteSendBuf(&num, sendbuf, &sendlen, &iseq);
							iseq ++;
						}
					}
					
					if ((par[0]>=0x80) && (par[0]<=0x89))					// 读参数要判断属性
					{//*****
						uc_data = attr & 0x0F;								// 读写权限判断
						if (uc_data==0x01)									// 只写数据项
						{
							sendbuf[sendlen] = par[1];
							sendlen ++;
							sendbuf[sendlen] = par[0];
							sendlen ++;
							for (j=0;j<len;j++)								// 返回0xFF
							{
								sendbuf[sendlen] = 0xFF;
								sendlen ++;
							}
						}
						else
						{
							sendbuf[sendlen] = par[1];
							sendlen ++;
							sendbuf[sendlen] = par[0];
							sendlen ++;
							p = &ParamIn.Term_Par.X8010[0] + offset;
							 
							if ((par[0]==0x81) && (par[1]>=0x01) && (par[1]<=32))	// 如果是读任务参数,特殊处理
							{
								pp = &sendbuf[sendlen];
								for (j=0;j<len;j++)							// 返回任务参数
								{
									*pp = *p;
									sendlen ++;
									p ++;
									pp ++;
								}
							}
							else
							{
								pp = &sendbuf[sendlen] + len - 1;
								for (j=0;j<len;j++)							// 返回正常内容
								{
									*pp = *p;
									sendlen ++;
									p ++;
									pp --;
								}
							}
						}
					}//*****
					else if ((par[0]>=0x90) && (par[0]<=0xC3)			// 读测量点数据
									    || (par[0]==0x8E))				// 读的不是参数不判断属性
					{
						sendbuf[sendlen] = par[1];
						sendlen ++;
						sendbuf[sendlen] = par[0];
						sendlen ++;
						p = &cur_data[ii].X9010[0] + offset;
						pp = &sendbuf[sendlen]; 
						for (j=0;j<len;j++)								// 返回内容正常
						{
							*pp = *p;
							//*p  = 0x89;
							sendlen ++;
							p ++;
							pp ++;
						}
					}
					else												// 读极值类数据
					{
						sendbuf[sendlen] = par[1];
						sendlen ++;
						sendbuf[sendlen] = par[0];
						sendlen ++;
						p = &extremdata.X8C00[0] + offset;
						pp = &sendbuf[sendlen] + len - 1; 
						for (j=0;j<len;j++)								// 返回内容正常
						{
							*pp = *p;
							sendlen ++;
							p ++;
							pp --;
						}
					}
				}//****
				else													// 无该数据项,不再继续处理剩余的数据
				{
						//sendbuf[sendlen] = par[1];
						//sendlen ++;
						//sendbuf[sendlen] = par[0];
						//sendlen ++;
						//sendbuf[sendlen] = 0x04;
						//sendlen ++;
						//WriteSendBuf(&num, sendbuf, &sendlen, &iseq);
					return (1);
				}	
			}//***
		}//**
		else															// 测量点无效,继续查询下一个测量点
		{
			continue;
		}
	}//*
	
	WriteSendBuf(&num, sendbuf, &sendlen, &iseq);
	return(0);
}
/*********************************************************************************************************
** 函数名称: WriteSendBuf()
** 功能描述: 读当前数据时,用来写发送数据
**
** 输 入: 	num 当前处理的接收队列号
**			
** 输 出: 无
**         
** 全局变量: 
** 调用模块: 
**
** 作 者: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void WriteSendBuf(uint8 *pnum, uint8 *psendbuf, uint32 *psendlen, uint8 *piseq)
{
	uint32	i;
	uint32	sendlen;
	uint8	num;
	uint8	iseq;
	uint8	buf[1024];
	uint8	data;
	
	num		= *pnum;
	sendlen = *psendlen;
	iseq	= *piseq;
	
	buf[0] = 0x68;							// 填写发送缓冲区
	
	//iseq ++;								// 分帧标识
	iseq = iseq << 5;
	data = Rcv_Q[num].addr[5];
	data |= iseq;
	
	for (i=0;i<5;i++)
	{
		buf[i+1] = Rcv_Q[num].addr[i];
	}
	buf[6] = data;												
	buf[7] = 0x68;
	buf[8] = Rcv_Q[num].concode | 0x80;
							
	for (i=0;i<8;i++)
	{
		buf[11+i]= Rcv_Q[num].buf[i];
	}
	//buf[11]= Rcv_Q[num].buf[0];
	for (i=0;i<sendlen;i++)
	{
		buf[19+i] = *psendbuf;
		psendbuf ++;
	}
	sendlen = sendlen + 8;
	buf[9] = (uint8)(sendlen);
	buf[10] = (uint8)(sendlen>>8);
	sendlen = sendlen - 8;
	buf[19+sendlen]= AddData(buf, sendlen+8+11);
	buf[20+sendlen]= 0x16;
	PushSendQue(buf,sendlen+8+13, Rcv_Q[num].chtype);	
}

/*********************************************************************************************************
** 函数名称: ReadProgrmLog()
** 功能描述: 读编程日志
**
** 输 入: 	num 当前处理的接收队列号
**			
** 输 出: 无
**         
** 全局变量: 
** 调用模块: 
**
** 作 者: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 ReadProgrmLog(uint8 *pnum)
{
	uint8	i,j;
	uint8	num;	
	uint8	buf[60];
	uint8	count;
	uint8	sendbuf[1024];
	uint32	len,sendlen;
	uint8	iseq,iseq1;
	static  uint8	data;
	
	num = *pnum;
	
	count = DealReadProgrmLog(&num, buf);
	if (count>1)
	{
		iseq = 1;
	}
	else
	{
		iseq = 0;
	}
	
	//if (count>Rcv_Q[num].buf[6])
	//{
	//	count = Rcv_Q[num].buf[6];
	//}
	
	for (j=0;j<count;j++)
	{	
		sendbuf[0] = 0x68;										// 填写发送缓冲区
		sendlen = 1;
		if (iseq>=7)
		{
			iseq = 1;
		}
										
		for (i=0;i<5;i++)
		{
			sendbuf[i+1] = Rcv_Q[num].addr[i];
			sendlen ++;
		}
		iseq1 = iseq << 5;										// 分帧标识
		data = Rcv_Q[num].addr[5];
		data |= iseq1;
		iseq ++;
		sendbuf[6] = data;
		sendlen ++;
		sendbuf[7] = 0x68;
		sendlen ++;
		sendbuf[8] = Rcv_Q[num].concode | 0x80;
		sendlen ++;
		data = buf[j];
		sendbuf[11] = ProgramLog[data].mp_num;					// 测量点号
		sendlen ++;
		sendbuf[12] = ProgramLog[data].time[0];					// 时间
		sendlen ++;
		sendbuf[13] = ProgramLog[data].time[1];
		sendlen ++;
		sendbuf[14] = ProgramLog[data].time[2];
		sendlen ++;
		sendbuf[15] = ProgramLog[data].time[3];
		sendlen ++;
		sendbuf[16] = ProgramLog[data].time[4];
		sendlen ++;
		for (i=0;i<9;i++)										// 通讯通道
		{
			sendbuf[17+i] = ProgramLog[data].dac[i];
			sendlen ++;
		}
		for (i=0;i< ProgramLog[data].len;i++)					// 编程内容
		{
			sendbuf[26+i] = ProgramLog[data].buf[i];
			sendlen ++;
		}
		len = sendlen - 8 - 1;
		sendbuf[9] = (uint8)(len);
		sendbuf[10] = (uint8)(len>>8);
		sendlen = sendlen + 2;
		sendbuf[sendlen] = AddData(sendbuf, sendlen);
		sendbuf[sendlen+1] = 0x16;
		sendlen = sendlen + 2;
		PushSendQue(sendbuf,sendlen, Rcv_Q[num].chtype);
	}						
	return(0);
	// 无符合条件的记录如何处理?加一个找到记录的标志
}
/*********************************************************************************************************
** 函数名称: DealReadProgrmLog()
** 功能描述: 处理读编程日志
**
** 输 入: 	*pnum 当前处理的接收队列号
**			*buf  记录符合条件的记录的序号
**			
** 输 出: count记录符合条件的记录的数目
**         
** 全局变量: 
** 调用模块: 
**
** 作 者: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 DealReadProgrmLog(uint8 *pnum, uint8 *pbuf)
{
	uint8 	i;
	static uint8	num;
	//uint8	buf[8];
	uint8	*pt;
	uint8	count;
	static  uint8	next;
	uint8	tn;
	uint8	year0,year1;
	uint8	mon0,mon1;
	uint8	day0,day1;
	uint8	hour0,hour1;
	uint8	min0,min1;
	uint32  times0,times1;
	
	num = *pnum;
	pt  = pbuf;
	
	count = 0;
	//uint32 CalculateTime(uint8 *pyear, uint8 *pmon, uint8 *pday, uint8 *phour, uint8 *pmin)
	if (Rcv_Q[num].buf[0] == 0xFE)										// 查询除0以外的测量点
	{
		for (i=1;i<9;i++)
		{
			tn = i;
			next = 0;
			while (next<60)												// 找出符合条件的记录
			{
				year0 = BCD2HEX(ProgramLog[next].time[0]);
				mon0  = BCD2HEX(ProgramLog[next].time[1]);
				day0  = BCD2HEX(ProgramLog[next].time[2]);
				hour0 = BCD2HEX(ProgramLog[next].time[3]);
				min0  = BCD2HEX(ProgramLog[next].time[4]);
				times0= CalculateTime(&year0, &mon0, &day0, &hour0, &min0);
				year1 = BCD2HEX(Rcv_Q[num].buf[1]);
				mon1  = BCD2HEX(Rcv_Q[num].buf[2]);
				day1  = BCD2HEX(Rcv_Q[num].buf[3]);
				hour1 = BCD2HEX(Rcv_Q[num].buf[4]);
				min1  = BCD2HEX(Rcv_Q[num].buf[5]);
				times1= CalculateTime(&year1, &mon1, &day1, &hour1, &min1);
				if ((times0>=times1)&&
				(ProgramLog[next].mp_num == tn))
				{
					*pt = next;	
					pt ++;												// 返回符合条件的记录的序号
					count ++;
					next ++;
					if (count>=Rcv_Q[num].buf[6])
					{
						break;
					}
				}
				else
				{
					next ++;
					continue;
				}
				//next ++;
			}
			if (count>=Rcv_Q[num].buf[6])
			{
				break;
			}
		}
	}
	else if (Rcv_Q[num].buf[0] == 0xFF)									// 查询所有测量点
	{
		for (i=0;i<9;i++)
		{
			tn = i;
			next = 0;
			while (next<60)												// 找出符合条件的记录
			{
				year0 = BCD2HEX(ProgramLog[next].time[0]);
				mon0  = BCD2HEX(ProgramLog[next].time[1]);
				day0  = BCD2HEX(ProgramLog[next].time[2]);
				hour0 = BCD2HEX(ProgramLog[next].time[3]);
				min0  = BCD2HEX(ProgramLog[next].time[4]);
				times0= CalculateTime(&year0, &mon0, &day0, &hour0, &min0);
				year1 = BCD2HEX(Rcv_Q[num].buf[1]);
				mon1  = BCD2HEX(Rcv_Q[num].buf[2]);

⌨️ 快捷键说明

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