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

📄 stipulparse.c

📁 电力行业必备。有错的地方
💻 C
📖 第 1 页 / 共 4 页
字号:
				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;											// 返回符合条件的记录的序号
					count ++;
					pt ++;
					next ++;
					if (count>=Rcv_Q[num].buf[6])
					{
						break;
					}
				}
				else
				{
					next ++;
					continue;
				}
			}
			if (count>=Rcv_Q[num].buf[6])
			{
				break;
			}
		}
	}
	else																// 查询某一测量点
	{
		tn = Rcv_Q[num].buf[0];
		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 ++;
		}
	}
	return(count);																	
}
/*********************************************************************************************************
** 函数名称: ReadParam()
** 功能描述: 读某一项参数
**
** 输 入: 	*cp		测量点号
**			*pbuf  	保存数据的指针
**			
** 输 出: 数据长度
**         
** 全局变量: 
** 调用模块: 
**
** 作 者: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint32 ReadParam(uint8 cp,uint8 *di, uint8 *pbuf)
{
	uint32	i;
	uint32	offset;												// 保存该数据项在数据结构中的偏移地址
	uint8	attr;												// 保存该数据项的属性
	uint8	bnum;
	uint8	*p,*pt;
	uint32 	len;
	pt = pbuf;												// 保存该数据项的长度
	len = ParamIndex(cp, di, &offset, &attr, &bnum);		// 读出该数据项的长度
	//pt = &ParamInSram.Mp_Par[0].X8902[0];					// 测试用
	p = &ParamInSram.Term_Par.X8010[0] + offset;
	for (i=0;i<len;i++)
	{
		*pt = *p;
		p ++;
		pt ++;	
	}
	return(len);
}
/*********************************************************************************************************
** 函数名称: ReadRelay()
** 功能描述: 读中继
**
** 输 入: 	num 当前处理的接收队列号
**			
** 输 出: 0:成功 1:失败
**         
** 全局变量: 
** 调用模块: 
**
** 作 者: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
/*
typedef struct	{								// 接收队列数据结构
					uint8	state;				// 0:为空 1:有数据待处理
					//uint8	*read;
					//uint8   *write;
					uint8	chtype;				// 01:短信 02:GPRS 05:红外 06:RS232
					uint8	addr[6];			// 主站通讯地址
					uint8	concode;			// 控制码
					uint8	datalen[2];			// 数据长度
					//uint16	bufsize;			// 缓冲区尺寸
					uint8	buf[1024];			// 数据区
					//uint8	chkcode[2];			// 校验码	
				} RCV_QUE;						// 说明:在POWERRAM.C中定义一个16的结构数组
				
typedef struct	{
					uint8	state;
					uint8	count;
					uint8	ch;
					uint8	len;
					uint8	buf[1024];
				} SEND_QUE;
*/
uint8 ReadRelay(uint8 *pnum)
{
	uint32	i,j;
	uint32 	len;												// 保存该数据项的长度
	uint32	len1;												// 保存队列中为处理数据项及内容的长度
	//uint8	*pt,*p,*pp;												// 记录当前处理接收队列中位置指针
	uint8	port;												// 端口号
	uint16	uart_bps;											// 波特率
	uint8	odd_even;											//
	uint8	stop_bit;											// 
	uint8	datbit_len;											//
	uint8	buf[1024];
	uint8	sendbuf[1024];										// 保存返回的数据内容及长度
	uint32	sendlen;
	uint32	overtime;											// 超时时间
	uint8	di[2];											
	static uint8 num;
	//uint8	err;
	
	num = *pnum;
	sendlen = 0;
	
	port = Rcv_Q[num].buf[0];
	di[0] = 0x87;
	di[1] = port<<4;
	di[1] = di[1]&0xF0;
	ReadParam(0, di, buf);										// 读出波特率
	uart_bps = buf[0]*300;
	di[1] = di[1]|0x01;
	ReadParam(0, di, buf);										// 读出校验位
	odd_even = buf[0];
	di[1] = di[1]|0x02;
	ReadParam(0, di, buf);										// 读出数据位长度
	datbit_len = buf[0];
	di[1] = di[1]|0x03;
	ReadParam(0, di, buf);										// 读出停止位
	stop_bit = buf[0];
	CloseComm(COMM3);
    OpenComm(COMM3,uart_bps,odd_even,stop_bit,datbit_len);
    len = Rcv_Q[num].datalen[1];
	len = len<<8;
	len = len + Rcv_Q[num].datalen[0];							// 计算命令长度
	len = len - 7;												// 
	CommFlush(COMM3);
	//OSMutexPend(Comm_Sem, 0, &err);
	WriteComm(COMM3, &Rcv_Q[num].buf[7], len);					// 发送中继命令
	//OSMutexPost(Comm_Sem);
	overtime = Rcv_Q[num].buf[1];
	overtime = overtime*1000/5;
	OSTimeDly(overtime);
	len = 0;
	len1= 0;
	j	= 0;

	//OSMutexPend(Comm_Sem, 0, &err);
	while(1)
	{
		len1 = ReadCommMs(COMM3,sendbuf,1024,40, 1000);
		if (len1!=0)
		{
			len = len + len1;
			for (i=0;i<len1;i++)								// 将读到的数据放到本地接收缓冲区
			{
				buf[j] = sendbuf[i];
				waitms(20);
			}
		}
		else
		{
			break;
		}
	}
	//OSMutexPost(Comm_Sem);
	if (len==0)													// 如果读到的字节数为0,返回失败
	{
		sendbuf[0] = 0x68;										// 填写发送缓冲区
		sendlen = 1;
										
		for (i=0;i<5;i++)
		{
			sendbuf[i+1] = Rcv_Q[num].addr[i];
			sendlen ++;
		}
		sendbuf[6] = Rcv_Q[num].addr[5];
		sendlen ++;
		sendbuf[7] = 0x68;
		sendlen ++;
		sendbuf[8] = Rcv_Q[num].concode | 0x80;
		sendlen ++;
		sendbuf[11] = Rcv_Q[num].buf[0];						// 端口号
		sendlen ++;
		sendbuf[12] = 0x01;
		sendlen ++;
		len = sendlen - 8;
		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(1);
	}
	else
	{
		sendbuf[0] = 0x68;										// 填写发送缓冲区
		sendlen = 1;
										
		for (i=0;i<5;i++)
		{
			sendbuf[i+1] = Rcv_Q[num].addr[i];
			sendlen ++;
		}
		sendbuf[6] = Rcv_Q[num].addr[5];
		sendlen ++;
		sendbuf[7] = 0x68;
		sendlen ++;
		sendbuf[8] = Rcv_Q[num].concode | 0x80;
		sendlen ++;
		sendbuf[11] = Rcv_Q[num].buf[0];						// 端口号
		sendlen ++;
		if (Rcv_Q[num].buf[2]==0)								// 不截取
		{
			for (i=0;i<len;i++)
			{
				sendbuf[sendlen] = buf[i];
				sendlen ++;
			}
		}
		else													// 截取处理
		{
			j = 0;
			for (i=0;i<len;i++)
			{
				if (Rcv_Q[num].buf[2]==buf[i])					// 查找与特征字节相同字节
				{
					len1 = Rcv_Q[num].buf[4];
					len1 = len1<<8;
					len1 = len1 + Rcv_Q[num].buf[3];
					j = j + len1;								// 计算从特征字节后多少字节开始截取
					len1 = Rcv_Q[num].buf[6];
					len1 = len1<<8;
					len1 = len1 + Rcv_Q[num].buf[5];
					for (i=0;i<len1;i++)
					{
						sendbuf[sendlen] = buf[j];
						sendlen ++;
						j ++;
					}
					break;
				}
				else
				{
					j ++;
				}
			}
		}
		len = sendlen - 8;
		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);
	
}
/*****************************************************/
uint32 CalculateTime(uint8 *pyear, uint8 *pmon, uint8 *pday, uint8 *phour, uint8 *pmin)
{
	uint32	times;
	uint16 	year;
	uint8	mon;
	uint8	day;
	uint8	hour;
	uint8	min;
	uint8	i;
	uint16  data;
	
	/*year = BCD2HEX(*pyear);
	mon	 = BCD2HEX(*pmon);
	day	 = BCD2HEX(*pday);
	hour = BCD2HEX(*phour);
	min	 = BCD2HEX(*pmin);*/
	
	year = (*pyear);
	mon	 = (*pmon);
	day	 = (*pday);
	hour = (*phour);
	min	 = (*pmin);
	
	times = 0;
	for (i=0;i<year;i++)
	{
		data = 2000+i;
		if ((data%4)==0)
		{
			if ((data%100)==0)
			{
				if ((data%400)==0)
				{
					times += 366;
				}
				else
				{
					times += 365;
				}
			}
			else
			{
				times += 366;
			}
		}
		else
		{
			times += 365;
		}
	}
	
	data = 2000+year;
	if ((data%4)==0)
	{
		if ((data%100)==0)
		{
			if ((data%400)==0)
			{
				if (mon>2)
				{
					times += 29;
				}
			}
			else
			{
				if (mon>2)
				{
					times += 28;
				}
			}
		}
		else
		{
			if (mon>2)
			{
				times += 29;
			}
		}
	}
	else
	{
		if (mon>2)
		{
			times += 28;
		}
	}
	
	if (mon == 1)
	{
		if (mon>2)
		{
			times += 31;
		}
	}
	
	for (i=3;i<mon;i++)
	{
		if ((i==4)||(i==6)||(i==9)||(i==0x0B))
		{
			times += 30;
		}
		else if ((i==3)||(i==5)||(i==7)||(i==8)||(i==0x0A)||(i==0x0C))
		{
			times += 31;
		}
		else;
	}
	
	times = times + day - 1;
	times = times*24;
	
	times = times + hour;
	
	times = times*60;
	times = times + min;
	
	return(times);	
}
unsigned int HEX2BCD(unsigned char hex_data)
{
	unsigned int bcd_data;
	unsigned char temp;
	temp=hex_data%100;
	bcd_data=((unsigned int)hex_data)/100<<8;
	bcd_data=bcd_data|temp/10<<4;
	bcd_data=bcd_data|temp%10;
	return bcd_data;
}

unsigned int BCD2HEX(unsigned int bcd_data)
{
	unsigned char temp;
	temp=((bcd_data>>8)*100) + ((bcd_data>>4)*10) + (bcd_data&0x0F);
	return(temp);	
}



⌨️ 快捷键说明

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