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

📄 df9000wh.c

📁 详细介绍了arm7-at91r40008,的开发全过程
💻 C
📖 第 1 页 / 共 3 页
字号:
					WH_FileList(p->rxbuf+6,port);
									break;
				case WH_EXT_FILE_RENAME:	//重命名
					WHACK(port);
									break;
				case WH_EXT_FILE_MKDIR:		//建立目录
					WHACK(port);
									break;
				case WH_EXT_FILE_DELDIR:	//删除目录
					WHACK(port);
									break;
				case WH_EXT_FILE_MODIFYATTRIB:	//修改属性
					WHACK(port);
									break;
				case WH_EXT_FILE_REMOTE_UP:	//文件上装
					WHACK(port);
									break;
				case WH_EXT_FILE_REMOTE_DOWN:	//文件下装
					WHACK(port);
									break;
				case WH_EXT_FILE_FORMAT_DISK:	//格式化盘
					WHACK(port);
									break;
				case WH_EXT_FILE_CLEARUP_DISK:	//清理磁盘
					WHACK(port);
									break;
				default:
					WHNAK(port,1);
							break;
			}
									break;
		case WH_OPERATE:
			switch(cmd_ext)
			{
				case WH_EXT_OPR_DOWN_DSP:
					KillProg(RESET_DD, RESET_CLR, FALSE);
					WHACK(port);
					break;
				case WH_EXT_OPR_POSITIVE_CHK:	//常温+45整定
					CalYcPara(0);
					WHACK(port);
							break;
				case WH_EXT_OPR_REVERSE45_CHK:	//常温-45整定
					CalYcPara(90);
					WHACK(port);
							break;
				case WH_EXT_OPR_ZEROFLOAT_CHK:
					WHACK(port);
							break;
				case WH_EXT_OPR_ACCUMULATOR:	//常温直流整定
					WHACK(port);
							break;
				case WH_EXT_OPR_LOCALE_CHK:	//现场整定
				//	myding++;
					WHACK(port);
							break;
				case WH_EXT_OPR_CHANNEL:	//常温通道整定
					WHACK(port);
							break;
				case WH_EXT_OPR_SHOWRESULT:	//常温显示通道整定结果
					WHACK(port);
							break;
				case WH_EXT_OPR_SAMPLECURVE:	//采样曲线
					WH_Sample(p->rxbuf[6],port);
							break;
				case WH_EXT_OPR_DC_BYVALUE:	//常温基准值直流整定
	//				value = MERGE(p->rxbuf[7],p->rxbuf[6]);
					CalYcPara(100);
					WHACK(port);
							break;
				case WH_EXT_OPR_POSITIVE45_HITEMP://高温+45整定
					WHACK(port);
							break;
				case WH_EXT_OPR_POSITIVE45_LOTEMP://低温+45整定
					WHACK(port);
							break;
				case WH_EXT_OPR_REVERSE45_HITEMP://高温+45整定
					WHACK(port);
							break;
				case WH_EXT_OPR_REVERSE45_LOTEMP://低温-45整定
					WHACK(port);
							break;
				case WH_EXT_OPR_ZEROFLOAT_HITEMP:
					WHACK(port);
							break;
				case  WH_EXT_OPR_ZEROFLOAT_LOTEMP:
					WHACK(port);
							break;
				case WH_EXT_OPR_ACCUMULATOR_HITEMP://高温直流整定
					WHACK(port);
							break;
				case WH_EXT_OPR_ACCUMULATOR_LOTEMP://低温直流整定
					WHACK(port);
							break;
				case WH_EXT_OPR_CHANNEL_HITEMP:		//高温通道整定
					WHACK(port);
							break;
				case WH_EXT_OPR_CHANNEL_LOTEMP:		//低温通道整定
					#ifdef BOOT_PROG
					for(i=2; i<7; i++)			//格式化错误参数扇区
					{
						FlashErase(FLASH_BASE, i);
					}
					for(i=19; i<23; i++)			//格式化错误参数扇区
					{
						FlashErase(FLASH_BASE, i);
					}
					#endif
					WHACK(port);
							break;
				case WH_EXT_OPR_SHOWRESULT_HITEMP:	//高温显示通道整定结果
					WHACK(port);
							break;
				case WH_EXT_OPR_SHOWRESULT_LOTEMP:	//低温显示通道整定结果
					WHACK(port);
							break;
				case WH_EXT_OPR_DC_BYVALUE_HITEMP://高温基准值直流整定
					value = MERGE(p->rxbuf[7],p->rxbuf[6]);
					WHACK(port);
							break;
				case WH_EXT_OPR_DC_BYVALUE_LOTEMP://低温基准值直流整定
					WHACK(port);
							break;
				default:
					WHNAK(port,1);
							break;
			}
									break;
		
		case WH_WHEND:
				WHACK(port);					//结束远程维护
				KillProg(RESET_DD, RESET_DD, TRUE);
									break;
		default: 	
				WHNAK(port,1);
									break;		//其他
	}
}
/*------------------------------------------------------------------------
 Procedure:     WHRes ID:1
 Purpose:       填写帧头和CRC码.
 Input:         cmd:功能码;cmd_ext:功能扩展;len:数据长度;
 Output:
 Errors:
------------------------------------------------------------------------*/
void WHRes(INT8U port, INT8U cmd, INT8U cmd_ext, INT16U len)
{
	ProtocolBuf *p=NULL;
	INT16U CRC16,Length; 
	INT8U	CRC8;
	if(port == COM1)	p=COM1Buf;
	else if(port == COM2)	p=COM2Buf;

	p->txbuf[0] = p->rxbuf[0];			//
	p->txbuf[1] = LOW(len);				//长度低位
	p->txbuf[2] = HIGH(len);			//长度高位
	p->txbuf[3] = (cmd|0x80);				//功能码
	p->txbuf[4] = (cmd_ext|0x80);			//扩展功能码
	CRC8 = SendVerifyHead(&p->txbuf[0], 5);
	p->txbuf[5] = CRC8;				//帧头校验码
	CRC16 = WHCRC16(&p->txbuf[1], 5+len);

	p->txbuf[6+len] = LOW(CRC16); 

	p->txbuf[7+len] = HIGH(CRC16);
	
        Length = 8+len;

        WriteX(p->txbuf,Length, port);
}
/*------------------------------------------------------------------------
 Procedure:     CWH9000::WH_FileHead ID:1
 Purpose:       填充文件头.
 Input:         
 Output:
 Errors:
------------------------------------------------------------------------*/
void WH_FileHead(INT8U port,struct FileInfo* pFile)
{
	ProtocolBuf *p=NULL;
	if(port == COM1)	p=COM1Buf;
	else if(port == COM2)	p=COM2Buf;
	
	memcpy (p->txbuf+6, (INT8U*)pFile->Name, MAXFILENAMELEN);

	p->txbuf[39] = LOW(pFile->Length);
	p->txbuf[40] = HIGH(pFile->Length);
	p->txbuf[41] = DLOW(pFile->Length);
	p->txbuf[42] = DHIGH(pFile->Length);
	
	p->txbuf[43] = LOW(pFile->CreateTime);
	p->txbuf[44] = HIGH(pFile->CreateTime);
	p->txbuf[45] = DLOW(pFile->CreateTime);
	p->txbuf[46] = DHIGH(pFile->CreateTime);
	
	p->txbuf[47] = LOW(pFile->Attr);
	p->txbuf[48] = HIGH(pFile->Attr);
	p->txbuf[49] = DLOW(pFile->Attr);
	p->txbuf[50] = DHIGH(pFile->Attr);
	
	p->txbuf[51] = LOW(pFile->Crc);
	p->txbuf[52] = HIGH(pFile->Crc);
	
	memset (p->txbuf+53, 0 ,sizeof(struct FileInfo));
	
	WHRes(port, p->rxbuf[3], p->rxbuf[4], 2*sizeof(struct FileInfo));
}

/*------------------------------------------------------------------------
 Procedure:     CWH9000::WH_FileList ID:1
 Purpose:       列表文件.
 Input:         
 Output:
 Errors:
------------------------------------------------------------------------*/
void WH_FileList(void *FileName,INT8U port)
{
	INT8U  FileHead[68*47];
	INT32U FileNum,i;
	struct WHFileInfo *WHFileInfo;
	struct FileInfo *FileInfo;
	ProtocolBuf *p=NULL;
	if(port == COM1)	p=COM1Buf;
	else if(port == COM2)	p=COM2Buf;
	
	FileNum = FReadInfos((void *)FileHead, FileName);
	memcpy (p->txbuf+6, (INT8U*)&FileNum, 4);
	memset (p->txbuf+10, 0 , 4);
	for(i=0;i<FileNum;i++)
		{
			FileInfo = (struct FileInfo*)((struct FileInfo*)FileHead + i);
			WHFileInfo = (struct WHFileInfo*)((struct WHFileInfo*)(p->txbuf+14) + i);
			memcpy ((INT8U *)WHFileInfo->Name, (INT8U *)FileInfo->Name, MAXFILENAMELEN);
			WHFileInfo->Length = FileInfo->Length;
			WHFileInfo->CreateTime = FileInfo->CreateTime;
			WHFileInfo->Attr = FileInfo->Attr;
		}
	WHRes(port, p->rxbuf[3], p->rxbuf[4], FileNum*sizeof(struct WHFileInfo)+8);
}
/*------------------------------------------------------------------------
 Procedure:     CWH9000::WH_FileRead ID:1
 Purpose:       上传文件.
 Input:         
 Output:
 Errors:
------------------------------------------------------------------------*/
void WH_FileRead(INT8U port,INT16U packetnum,struct FileInfo* pFile)
{
	INT16U DataLength;
	INT16U packetlength;
	ProtocolBuf *p=NULL;
	
	if(port == COM1)	p=COM1Buf;
	else if(port == COM2)	p=COM2Buf;
	
	memcpy (p->txbuf+6, (INT8U*)pFile->Name, MAXFILENAMELEN);
	
	p->txbuf[39] = LOW(Pos);
	p->txbuf[40] = HIGH(Pos);
	p->txbuf[41] = DLOW(Pos);
	p->txbuf[42] = DHIGH(Pos);
	
	DataLength = FRead(p->txbuf+44, packetnum, WH_DATA_MAXLENGTH, pFile);

	if(DataLength != WH_DATA_MAXLENGTH)
	{
		Pos = 0;
		p->txbuf[43] = 1;
		FilePacketNum = 0;
	}
	else
	{
		Pos += WH_DATA_MAXLENGTH;
		p->txbuf[43] = 0;
	}
	packetlength = 38+DataLength;
	

	WHRes(port, p->rxbuf[3], WH_EXT_FILE_CONTENT, packetlength);
}
/*------------------------------------------------------------------------
 Procedure:     CWH9000::WHSAMPLE ID:1
 Purpose:       采样曲线传送.
 Input:         
 Output:
 Errors:
------------------------------------------------------------------------*/
void WH_Sample(INT8U Num,INT8U port)
{
	ProtocolBuf *p=NULL;
	INT8U	*quxian = NULL;

	if(port == COM1)	p=COM1Buf;
	else if(port == COM2)	p=COM2Buf;
		
	quxian = MakeQuxian(Num);
	if (quxian == NULL)
		WHNAK(port, 1);
	else
	{		
		p->txbuf[6] = Num;
		p->txbuf[7] = 5;
		memcpy(p->txbuf+8,quxian,320);
		WHRes(port, p->rxbuf[3], p->rxbuf[4], 322);
	}
}

/*------------------------------------------------------------------------
 Procedure:     CWH9000::WHYC ID:1
 Purpose:       遥测传送.
 Input:         
 Output:
 Errors:
------------------------------------------------------------------------*/
void WH_Send_YC(INT8U port)
{
	ProtocolBuf *p=NULL;
	INT8U num;
	INT8U	value[200];
	INT32U  Name;
	struct DBInfo	info;
		
	if(port == COM1)	p=COM1Buf;
	else if(port == COM2)	p=COM2Buf;
	
	Name = DMERGE(p->rxbuf[9],p->rxbuf[8],p->rxbuf[7],p->rxbuf[6]);
	p->txbuf[6] = '9';
	p->txbuf[7] = '3';
	p->txbuf[8] = '1';
	p->txbuf[9] = '1';
	p->txbuf[10] = p->rxbuf[10];
	
	info.SuperID = ROOTID;
	info.DevID = GetDevIDOfName(Name);
	info.Type = YCDATA;
	info.Start = 0;
	info.Num = DBCfgs[info.DevID].YCNum;
	DBRead(value, &info);

	num = info.Num;
	memcpy (p->txbuf+15, value, num * 2);
	
	p->txbuf[11] = LOW(0x0);
	p->txbuf[12] = HIGH(0x0);
	p->txbuf[13] = LOW(num-1);
	p->txbuf[14] = HIGH(num-1);
	
	WHRes(port, p->rxbuf[3], p->rxbuf[4], num*2+9);

}
/*------------------------------------------------------------------------
 Procedure:     CWH9000::WHYX ID:1
 Purpose:       遥信,SOE,COS传送.
 Input:         
 Output:
 Errors:
------------------------------------------------------------------------*/
void WH_Send_YX(INT8U port)
{
	ProtocolBuf *p=NULL;
	INT8U yxnum;
	INT8U  yxstatus[200],whyxstatus[10],j;
	INT16U i,Begin,Length,soenum,cosnum,num;
	INT32U Name;
	struct DBInfo	info;
	
	struct 	SOE_Data	whSOE;
	struct  SOE_t		SoeStruct;
	struct  COS_Data	whCOS;
	struct  COS_t		CosStruct;
	
	if(port == COM1)	p=COM1Buf;
	else if(port == COM2)	p=COM2Buf;

	Name = DMERGE(p->rxbuf[9],p->rxbuf[8],p->rxbuf[7],p->rxbuf[6]);
	p->txbuf[6] = '9';
	p->txbuf[7] = '3';
	p->txbuf[8] = '1';
	p->txbuf[9] = '1';
	p->txbuf[10] = p->rxbuf[10];
	
	info.SuperID = GetDevIDOfName(Name);
	info.DevID = info.SuperID;
	if ((p->rxbuf[10] == YX_REAL) ||(p->rxbuf[10] == YX_LOGIC))
		info.Type = YXDATA;
	else if ((p->rxbuf[10] == SOE_LOGIC) ||(p->rxbuf[10] == SOE_REAL))
		info.Type = SOEDATA;
	else if ((p->rxbuf[10] == COS_LOGIC) ||(p->rxbuf[10] == COS_REAL))
		info.Type = COSDATA;
	else
		info.Type = 0xFFFF;		

	if (info.Type == YXDATA)
	{
		info.Start = 0;
		info.Num = DBCfgs[info.DevID].YXNum;
		DBRead(yxstatus, &info);
		
		yxnum = DBCfgs[info.DevID].YXNum;
		if(yxnum%8==0)
			num = yxnum/8;
		else
			num = yxnum/8+1;
			
		for(i=0;i<num;i++)
		{
			for(j=0;j<8;j++)
			{
				if((yxstatus[i*8+j]&0x80) == 0x80)
					whyxstatus[i] |= (1<<j);
				else
					whyxstatus[i] &= ~(1<<j);
			}
		}
		p->txbuf[11] = LOW(0x0);
		p->txbuf[12] = HIGH(0x0);
		p->txbuf[13] = LOW(yxnum-1);
		p->txbuf[14] = HIGH(yxnum-1);
		for(i=0;i<num;i++)
			p->txbuf[15+i] = whyxstatus[i];
		WHRes(port, p->rxbuf[3], p->rxbuf[4], num+9);
	}
	else if (info.Type == SOEDATA)
	{
		Begin = MERGE(p->rxbuf[12],p->rxbuf[11]);
		Length = MERGE(p->rxbuf[14],p->rxbuf[13]);
		
		if(Begin > SOELIMIT)	Begin = SOELIMIT;
		if((Begin+Length) > SOELIMIT)	Length = SOELIMIT - Begin;
		
		info.Start = 0;
		info.Num = 1;
		DBRead((INT8U*)&whSOE, &info);

		soenum = whSOE.CurPos;

		p->txbuf[11] = LOW(Begin);
		p->txbuf[12] = HIGH(Begin);

		p->txbuf[13] = LOW(Length);
		p->txbuf[14] = HIGH(Length);

		p->txbuf[15] = LOW(soenum);
		p->txbuf[16] = HIGH(soenum);

		p->txbuf[17] = LOW(SOELIMIT);
		p->txbuf[18] = HIGH(SOELIMIT);
		
		for(i=Begin;i<(Begin+Length);i++)
		{
			info.Start = i;
			info.Num = 1;
			DBRead((INT8U*)&whSOE, &info);
			
			p->txbuf[19+(i-Begin)*sizeof(SoeStruct)] = LOW(whSOE.Soe.No);
			p->txbuf[20+(i-Begin)*sizeof(SoeStruct)] = HIGH(whSOE.Soe.No);
			p->txbuf[21+(i-Begin)*sizeof(SoeStruct)] = whSOE.Soe.Status;
				
			p->txbuf[22+(i-Begin)*sizeof(SoeStruct)] = LOW(whSOE.Soe.Time.Minute);
			p->txbuf[23+(i-Begin)*sizeof(SoeStruct)] = HIGH(whSOE.Soe.Time.Minute);
			p->txbuf[24+(i-Begin)*sizeof(SoeStruct)] = DLOW(whSOE.Soe.Time.Minute);
			p->txbuf[25+(i-Begin)*sizeof(SoeStruct)] = DHIGH(whSOE.Soe.Time.Minute);
				
			p->txbuf[26+(i-Begin)*sizeof(SoeStruct)] = LOW(whSOE.Soe.Time.Msecond);
			p->txbuf[27+(i-Begin)*sizeof(SoeStruct)] = HIGH(whSOE.Soe.Time.Msecond);
		}
		num = Length*sizeof(SoeStruct)+13;
		WHRes(port, p->rxbuf[3], p->rxbuf[4], num);

	}
	
	else if (info.Type == COSDATA)
	{
		Begin = MERGE(p->rxbuf[12],p->rxbuf[11]);
		Length = MERGE(p->rxbuf[14],p->rxbuf[13]);
		
		if(Begin > COSLIMIT)	Begin = COSLIMIT;
		if((Begin+Length) > COSLIMIT)	Length = COSLIMIT - Begin;
		
		info.Start = 0;
		info.Num = 1;
		DBRead((INT8U*)&whCOS, &info);

		cosnum = whCOS.CurPos;

		p->txbuf[11] = LOW(Begin);
		p->txbuf[12] = HIGH(Begin);
		p->txbuf[13] = LOW(Length);
		p->txbuf[14] = HIGH(Length);
		p->txbuf[15] = LOW(cosnum);
		p->txbuf[16] = HIGH(cosnum);
		p->txbuf[17] = LOW(COSLIMIT);
		p->txbuf[18] = HIGH(COSLIMIT);
		for(i=Begin;i<(Begin+Length);i++)
		{
			info.Start = i;
			info.Num = 1;
			DBRead((INT8U*)&whCOS, &info);
			p->txbuf[19+(i-Begin)*sizeof(CosStruct)] = LOW(whCOS.Cos.No);
			p->txbuf[20+(i-Begin)*sizeof(CosStruct)] = HIGH(whCOS.Cos.No);
			p->txbuf[21+(i-Begin)*sizeof(CosStruct)] = whCOS.Cos.Status;
		}
		num = Length*sizeof(CosStruct)+13;
		WHRes(port, p->rxbuf[3], p->rxbuf[4], num);
	}
}
/*------------------------------------------------------------------------
 Procedure:     CWH9000::WHDD ID:1

⌨️ 快捷键说明

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