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

📄 stipulparse.c

📁 电力行业必备。有错的地方
💻 C
📖 第 1 页 / 共 4 页
字号:
/****************************************Copyright (c)**************************************************
**                               	江苏广一科技有限公司
**                                     研    发    部
**                                        浙江配变
**
**                                 
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: stipulparse.c
**创   建   人: 
**最后修改日期: 2007年09月05日
**描        述: 
**              
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 
** 版  本: 
** 日 期: 
** 描 述: 
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
** 描 述: 
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define  STIPULP_GLOBALS
#include "stipulparse.h"
#include "powerram.h"
#include "parameter.h"
#include "Clock.h"
#include "curdata.h"
#include "extremdata.h"
#include "main.h"
#include "commup.h"

extern PARAM_STR ParamInSram;

const uint8 DefaulAddr[4] = {0xAA,0xAA,0xAA,0xAA};					// 终端默认地址
const uint8 OverCode[3]   = {0x22,0x84,0x33};						// 超级权限密码
//const uint8 OverCode[3]   = {0x66,0x77,0x42};
/*********************************************************************************************************
** 函数名称: StipParsDel()
** 功能描述: 规约解析
**
** 输 入: 无
**
** 输 出: 无
**         
** 全局变量: 
** 调用模块: 
**
** 作 者: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
/*
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 StipParsDel(void)
{
	TASK_CALL_STR TaskCallData;
	uint16 len,len1;
	uint16 i;
	uint16	year,mon,day,hour,min,week,sec;
	uint8	year0,mon0,day0,hour0,min0;
	uint32	times0,times1;
	static uint8 uc_rqnum;
	for (uc_rqnum=0;uc_rqnum<16;uc_rqnum++)
	{//*
		if (uc_rqnum==16)
		return(1);
		if (Rcv_Q[uc_rqnum].state!=0)
		{//**
			Rcv_Q[uc_rqnum].state = 0;
			if (Rcv_Q[uc_rqnum].addr[0]==DefaulAddr[0] &&		// 判断终端公共地址
				Rcv_Q[uc_rqnum].addr[1]==DefaulAddr[1] &&
				Rcv_Q[uc_rqnum].addr[2]==DefaulAddr[2] &&
				Rcv_Q[uc_rqnum].addr[3]==DefaulAddr[3]);
			else if (Rcv_Q[uc_rqnum].addr[0]==TermAddr[0] &&	// 判断终端地址
					 Rcv_Q[uc_rqnum].addr[1]==TermAddr[1] &&
					 Rcv_Q[uc_rqnum].addr[2]==TermAddr[2] &&
					 Rcv_Q[uc_rqnum].addr[3]==TermAddr[3]);
			else
			{
				Rcv_Q[uc_rqnum].state = 0;
				continue;
			}
			
			switch (Rcv_Q[uc_rqnum].concode)					// 控制码
			{//***
				case 0x00:										// 中继
					ReadRelay(&uc_rqnum);
					break;
				case 0x01:										// 读当前数据
					ReadCurData(&uc_rqnum);
					break;
				case 0x02:										// 读任务数据
					TaskCallData.ch = Rcv_Q[uc_rqnum].chtype;
					for (i=0;i<6;i++)
					{
						TaskCallData.addr[i] =  Rcv_Q[uc_rqnum].addr[i];
					}
					TaskCallData.concode = Rcv_Q[uc_rqnum].concode;
					TaskCallData.datalen[0] = Rcv_Q[uc_rqnum].datalen[0];
					TaskCallData.datalen[1] = Rcv_Q[uc_rqnum].datalen[1];
					len = Rcv_Q[uc_rqnum].datalen[1];
					len = (len<<8)|Rcv_Q[uc_rqnum].datalen[0];
					for (i=0;i<len;i++)
					{
						TaskCallData.buf[i] = Rcv_Q[uc_rqnum].buf[i];
					}
					OSMboxPost(Task_Call_Box,(void *)&TaskCallData);
					break;
				case 0x04:										// 读编程日志
					ReadProgrmLog(&uc_rqnum);
					break;
				case 0x07:													// 实时写对象参数
					DateTimeRead(&year, &mon, &day, &week, 					// 读时钟
							 &hour, &min, &sec);
					year = year%100;
					year0 = (uint8)year;mon0 = (uint8)mon;
					day0 = (uint8)day;hour0 = (uint8)hour;
					min0 = (uint8)min;
					times0 = CalculateTime(&year0, &mon0, &day0,  			// 
							 		  	   &hour0, &min0);
					year0 = BCD2HEX(Rcv_Q[uc_rqnum].buf[10]);
					mon0  = BCD2HEX(Rcv_Q[uc_rqnum].buf[9]);
					day0  = BCD2HEX(Rcv_Q[uc_rqnum].buf[8]);
					hour0 = BCD2HEX(Rcv_Q[uc_rqnum].buf[7]);
					min0  = BCD2HEX(Rcv_Q[uc_rqnum].buf[6]);
					times1 = CalculateTime(&year0, &mon0, &day0,  			// 
							 		  	   &hour0, &min0);
					times1 = times1 + BCD2HEX(Rcv_Q[uc_rqnum].buf[5]);
					if (times0>times1)										// 如果过时
					{
						SetParamOVT(&uc_rqnum);
					}
					else													// 未过时,与写对象参数相同
					{
						len = Rcv_Q[uc_rqnum].datalen[1];					// 先将接收队列整理成与写对象参数相同
						len = len<<8;
						len = len + Rcv_Q[uc_rqnum].datalen[0];				// 计算数据项及内容长度
						len = len - 6;
						len1 = len;
						Rcv_Q[uc_rqnum].datalen[0] = (uint8)len1;
						len1 = len;
						len1 = len1>>8;
						Rcv_Q[uc_rqnum].datalen[1] = (uint8)len1;
						for (i=0;i<len;i++)
						{
							Rcv_Q[uc_rqnum].buf[5+i] = Rcv_Q[uc_rqnum].buf[11+i];
						}
						SetParam(&uc_rqnum);
					}
					break;
				case 0x08:										// 写对象参数
					SetParam(&uc_rqnum);
					break;
				case 0x09:										// 异常告警
					break;
				case 0x0A:										// 告警确认
					break;
				case 0x0F:										// 用户自定义数据
					break;
				case 0x21:										// 登录应答
					GprsManagPar.on = 1;
					GprsManagPar.heartsp = 0;
					GprsManagPar.logsp = 0;
					break;
				case 0xA2:										// 登录退出
					GprsManagPar.on = 0;
					GprsManagPar.heartsp = 0;
					GprsManagPar.logsp = 0;
					break;
				case 0xA4:										// 心跳应答
					GprsManagPar.heartt = 0;
					break;
				case 0x28:										// 请求发送短信
					break;
				case 0x29:										// 收到短信上报
					break;
				default:
					break;
			}//***
		}//**
		else continue;
	}//*
	return(0);
}
/*********************************************************************************************************
** 函数名称: ReturnErr()
** 功能描述: 参数设置返回错误
**
** 输 入: 	num 当前处理的接收队列号
**			
** 输 出: 无
**         
** 全局变量: 
** 调用模块: 
**
** 作 者: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
/*********************************************************************************************************
** 函数名称: RetCodeErr()
** 功能描述: 参数设置返回错误
**
** 输 入: 	num 当前处理的接收队列号
**			
** 输 出: 无
**         
** 全局变量: 
** 调用模块: 
**
** 作 者: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void RetCodeErr(uint8 *pnum)
{
	uint32	i;
	uint32	offset;												// 保存该数据项在数据结构中的偏移地址
	uint8	attr;												// 保存该数据项的属性
	uint8	bnum;												// 保存该数据项块序号
	uint32 	len;												// 保存该数据项的长度
	uint32	len1;												// 保存队列中为处理数据项及内容的长度
	uint8	*pt;												// 记录当前处理接收队列中位置指针
	uint8	par[2];												// 用来保存临时参数
	//uint8	uc_data;
	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)&&(len1<1030))
	{//*
		par[1] = *pt;
		pt ++;
		par[0] = *pt;
		pt ++;
		len = ParamIndex(Rcv_Q[num].buf[0], par, 
						 &offset, &attr, &bnum); 				// 读出该数据项的长度
		if (len>0)												// 有该数据项
		{//**
			if (ParamLock<3)
			{
				len1 = len1 - len - 2;
				pt = pt + len;
				sendbuf[sendlen] = par[1];
				sendlen ++;
				sendbuf[sendlen] = par[0];
				sendlen ++;
				sendbuf[sendlen] = 0x03;
				sendlen ++;	
			}
			else
			{
				len1 = len1 - len - 2;
				pt = pt + len;
				sendbuf[sendlen] = par[1];
				sendlen ++;
				sendbuf[sendlen] = par[0];
				sendlen ++;
				sendbuf[sendlen] = 0x02;
				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+1;
	buf[10] = 0x00;
	buf[11]= Rcv_Q[num].buf[0];
	for (i=0;i<sendlen;i++)
	{
		buf[12+i] = sendbuf[i];
	}
	buf[12+sendlen]= AddData(buf, sendlen+12);
	buf[13+sendlen]= 0x16;
	PushSendQue(buf,sendlen+14, Rcv_Q[num].chtype);	
}

/*********************************************************************************************************
** 函数名称: SetParam()
** 功能描述: 参数设置
**
** 输 入: 	num 当前处理的接收队列号
**			
** 输 出: 无
**         
** 全局变量: 
** 调用模块: 
**
** 作 者: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 SetParam(uint8 *pnum)
{
	static uint8 num;
	uint16	year,mon,day,hour,min,week,sec;
	uint8	year0,mon0,day0,hour0,min0;
	uint32	times0,times1;
	num = *pnum;
	if (Rcv_Q[num].buf[1]==0x11)							// 密码部分处理
	{
		if ((Rcv_Q[num].buf[2]==OverCode[0]) &&
			(Rcv_Q[num].buf[3]==OverCode[1]) &&
			(Rcv_Q[num].buf[4]==OverCode[2]))
		{
			ParamLock = 0x00;								// 超级权限密码,解冻	
			DealSetParam(&num);
			return(0);			
		}
		if ((Rcv_Q[num].buf[2]==AdminCode[0]) &&			// 管理员密码
			(Rcv_Q[num].buf[3]==AdminCode[1]) &&
			(Rcv_Q[num].buf[4]==AdminCode[2]))
		{
			if (ParamLock<3)
			{
				ParamLock = 0x00;									
				DealSetParam(&num);
				return(0);	
			}
			else
			{
				DateTimeRead(&year, &mon, &day, &week, 					// 读时钟
							 &hour, &min, &sec);
				year = year%100;
				year0 = (uint8)year;mon0 = (uint8)mon;day0 = (uint8)day;
				hour0 = (uint8)hour;min0 = (uint8)min;
				times0 = CalculateTime(&year0, &mon0, &day0,  					// 
							 		   &hour0, &min0);
				
				times1 = CalculateTime(&Param_Lock_time[0], &Param_Lock_time[1],
				 					   &Param_Lock_time[2], &Param_Lock_time[3],
				 					   &Param_Lock_time[4]);
				times0 = times0 - times1;
				if (times0>=(24*60))
				{
					ParamLock = 0x00;									
					DealSetParam(&num);
					return(0);	
				}
				else
				{
					RetCodeErr(&num);
					return(1);				
				}
			}
		}
		else
		{
			ParamLock += 1;
		}
	}
	
	else if (Rcv_Q[num].buf[1]==0x00)								// 低级权限密码
	{
		if ((Rcv_Q[num].buf[2]==UserCode[0]) &&
			(Rcv_Q[num].buf[3]==UserCode[1]) &&
			(Rcv_Q[num].buf[4]==UserCode[2]))
		{			
			if (ParamLock<3)
			{
				ParamLock = 0x00;									
				DealSetParam(&num);
				return(0);	
			}
			else
			{	
				DateTimeRead(&year, &mon, &day, &week, 					// 读时钟
							 &hour, &min, &sec);
				year = year%100;
				year0 = (uint8)year;mon0 = (uint8)mon;day0 = (uint8)day;
				hour0 = (uint8)hour;min0 = (uint8)min;
				times0 = CalculateTime(&year0, &mon0, &day0,  					// 读时钟
							 		   &hour0, &min0);
				
				times1 = CalculateTime(&Param_Lock_time[0], &Param_Lock_time[1],
				 					   &Param_Lock_time[2], &Param_Lock_time[3],
				 					   &Param_Lock_time[4]);
				times0 = times0 - times1;
				if (times0>=(24*60))
				{
					ParamLock = 0x00;									
					DealSetParam(&num);
					return(0);	
				}
				else
				{
					RetCodeErr(&num);
					return(1);				
				}
				//return(1);
			}
		}
		else

⌨️ 快捷键说明

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