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

📄 znet.c

📁 采用MPS430控制的项目
💻 C
📖 第 1 页 / 共 2 页
字号:
#define _znet_
#include  "..\Inc\includes.h"
/*********************************************************************************************************
* 函数名称:DealUpData_Com1
*
* 功能描述:收到来自上位机的数据和进行响应和处理
*
* 说明:还差历史数据 历史告警 厂家信息 没有做
* 
********************************************************************************************************/
void DealUpData_Com1(void)
{
	Uint8 Flag=0,adr,cid1,cid2,ver;
	ver  = Combine(STR1_Rec[1],STR1_Rec[2]);			//获取协议版本号
	adr  = Combine(STR1_Rec[3],STR1_Rec[4]); 			//获取地址
	cid1 = Combine(STR1_Rec[CID1],STR1_Rec[CID1+1]);	//获得CID1的信息
	cid2 = Combine(STR1_Rec[CID2],STR1_Rec[CID2+1]);	//获得CID2的信息	
	if(adr != ADR)										//给智能设备的命令
	{
		Task |= Com1OrderToCom0;
	}
	else
	{
		if(ver != VER)	ErrorDeal(0x01,ADR,cid1,COM1);	//协议错
		Flag = XiaoYan(STR1_Rec,STR1_len);
		if(Flag != 0)	ErrorDeal(Flag,ADR,cid1,COM1);	//校验出错
		else
		{
			if(cid1== 0xB0)
			{
				Deal_DoorCommand(cid2);
			}
			else if(cid2 < 0x20)	;		//响应信息
			else
			{
				switch(cid2)
				{
				case 0x42:SendAIDataI(0);		break;//获取模拟量(定点)CID2 = 0;响应信息
				case 0x43:SendDIData(0);		break;//获取开关量输入状态
				case 0x44:SendGaoJing(0);		break;//获取告警信息
				case 0x45:YaoKong();			break;//遥控
				case 0x47:SendXiTongData();		break;//上传系统参数(上、下限)
				case 0x49:SetXiTongData();		break;//设定系统参数(上、下限)
				case 0x4B:SendOldData();		break;//上传历史数据(含开关量)
				case 0x4C:SendOldGaoJing();		break;//上传历史告警
				case 0x4D:SendTime();			break;//上传时间
				case 0x4E:SetTime();			break;//设定时间
				case 0x4F:
				case 0x50:ErrorDeal(0x0,ADR,CID10,COM1);break;//上传设备地址、协议版本号
				case 0x51:SendChangJiaInfo();	break;//上传厂家信息
				case 0x80:ErrorDeal(0x0,ADR,CID10,COM1);break;//上传设备地址
				case 0x83:SendDefine(0);		break;//上传检测量定义表
				case 0x85:SetInterval();		break;//设定上传时间间隔
				case 0x87:SendAllAdr(0);		break;//上传设备地址表(智能设备)
				case 0x88:SendBigData();		break;//批量上传数据
				default:  ErrorDeal(0x04,adr,cid1,COM1);break;//CID2无效
				}
			}
		}
		STR1_Re_flag = 0;
	}
}
/*********************************************************************************************************
* 函数名称:DealDownData_Com0
*
* 功能描述:收到来自下位机的数据后进行响应和处理
*
* 说明:
* 
********************************************************************************************************/
void DealDownData_Com0(void)
{
	Uint8 Flag;
	Uint16 k;
	if(LastBuf == 0)								//来自于智能设备
	{
		Task |= Com0DataToCom1;
	}
	else if(LastBuf == 1)							//来自于门禁
	{
		Flag = STR0_Rec[0];
		for(k=1; k<STR0_len-1; k++)	Flag ^= STR0_Rec[k];
		if(Flag == STR0_Rec[STR0_len-1])
		{   
			if(STR0_Rec[3]==0x04)	//有记录卡号
			{	
				Task |= SendDoorCardNo;

				if(Menu_ID==22)  	//添加卡号记录
				{
					Set_array[0] = STR0_Rec[4];
					Set_array[1] = STR0_Rec[5];
					Set_array[2] = STR0_Rec[6];
					Set_array[3] = STR0_Rec[7];
					Disp_CardNo(Set_array,Set_array_count,1);
					Door_Speak(STR0_Rec[2],1,5,2);
				}
				else
				{			 //控制开关门
					if(ComparaCardNo(&STR0_Rec[4])==1)
					{
						CtrlDoor(OPEN);
						HaveDoorRight = 1;
						OpenDoorDelay = OPENDOORDELAY;
						Door_Speak(STR0_Rec[2],1,5,2);
						if(STR0_Rec[2]==CARD_IN)
						{
							DoorDir = OUTDOOR;
							for(k=0; k<16; k++)
							{
								if(ADSam_Alarm[k]!=0||DISam_Alarm[k]!=0)	
								{
									DoorAlarm |= 0x10;
									DoorAlarm_ID = 0x012;		//检查故障是否解除完毕
									break;
								}
							}
						}
						else DoorDir = INDOOR;	
					}
					else 
					{
						CtrlDoor(CLOSE);
						//HaveDoorRight = 0;
						CloseDoorDelay = CLOSEDOORDELAY;
						Door_Speak(STR0_Rec[2],3,2,2);
						DoorAlarm |= 0x04;
						DoorAlarm_ID = 0x07;					//无访问权限	
					}
				}
			}
		}
		Com0Busy = 0;
		STR0_Re_flag = 0;
	}
}
/*********************************************************************************************************
* 函数名称:ShangChuanData
*
* 功能描述:定时上传数据,包括模拟量、开关量和告警信息
*
* 说明:
* 
********************************************************************************************************/
void ShangChuanData(void)
{
	if(STR1_Re_flag==Busy || Com1_flag==Busy)	return;
	//SendAIDataI(0x42);		//上传模拟量(定点)
	//SendDIData(0x43);		    //上传开关量
	SendGaoJing(0x44);	        //上传告警信息
	Task &=~ UpSend_Data;
}
/*********************************************************************************************************
* 函数名称: GetDeviceAdr
*
* 功能描述:检察设备地址,从地址1-254循检,如有响应则记录ADR和CID1.
*
* 说明:须保证RS485总线上地址不重复
* 
********************************************************************************************************/
void GetDeviceAdr(void)
{
	Uint16 i,k;
	Adr_sum = 0;
	for(k=1; k<255; k++)							//从1-254地址搜索设备
	{
		GetCommandPackage(STR0_Rec,k,0,0x80);		//检查设备地址
		SendStrlenToCom0(STR0_Rec,Com_Long);		//发给智能设备
		for(i=0; i<1000; i++)	;					//延时、等待响应
		if(STR0_Re_flag==Busy)	
		{
			i = Combine(STR0_Rec[3],STR0_Rec[4]);	//获取设备地址
			if(i == k)							 	//响应的地址和发送的地址一致
			{
				Adr[Adr_sum][0] = k;
				Adr[Adr_sum][1] = Combine(STR0_Rec[CID1],STR0_Rec[CID1+1]);	//CID1
				Adr_sum += 1;
			}
			STR0_Re_flag = 0;
		}		
	}
}
/*********************************************************************************************************
* 函数名称:SendAIDataI
*
* 功能描述:将模拟量化后的数据传给上位机
*
* 说明:
* 
********************************************************************************************************/
void SendAIDataI(Uint16 k)
{
	Uint16 i;
	STR1_Rec[0] = SOI;
	STR1_Rec[1] = ASCII[VER>>4];
	STR1_Rec[2] = ASCII[VER&0x0f];
	STR1_Rec[3] = ASCII[ADR>>4];
	STR1_Rec[4] = ASCII[ADR&0x0f];
	STR1_Rec[5] = ASCII[CID10>>4];
	STR1_Rec[6] = ASCII[CID10&0x0f];
	STR1_Rec[7] = ASCII[k>>4];			//用K来区别被动响应还是主动上传
	STR1_Rec[8] = ASCII[k&0x0f];
	GetCheckLength(STR1_Rec,4+16*4);	//数据长度校验 12
	STR1_Rec[13] = ASCII[DATAFLAG>>4];	//DATAFLAG
	STR1_Rec[14] = ASCII[DATAFLAG&0x0f];
	STR1_Rec[15] = ASCII[16>>4];
	STR1_Rec[16] = ASCII[16&0x0f];
	for(i=0; i<16; i++)
	{
		if(ADSam_Code[i]==0)			//没有启用该通道 发送0x20
		{
			STR1_Rec[i*4+17]=0x20; STR1_Rec[i*4+18]=0x20;
			STR1_Rec[i*4+19]=0x20; STR1_Rec[i*4+20]=0x20;	
		}
		else
		{
			STR1_Rec[i*4+17]=ASCII[(ADSam_Value[i]>>12)&0x000f]; 
			STR1_Rec[i*4+18]=ASCII[(ADSam_Value[i]>>8) &0x000f]; 
			STR1_Rec[i*4+19]=ASCII[(ADSam_Value[i]>>4) &0x000f]; 
			STR1_Rec[i*4+20]=ASCII[(ADSam_Value[i]>>0) &0x000f]; 
		}
	}
	i = 15*4+20;
	GetCheckSum(STR1_Rec,i);				//数据包和校验
	STR1_Rec[i+5]= EOI;
	SendStrlenToCom1(STR1_Rec,i+6);	
}
/*********************************************************************************************************
* 函数名称:SendDIData
*
* 功能描述:将开关量数据传给上位机
*
* 说明:
* 
********************************************************************************************************/
void SendDIData(Uint16 k)
{
	Uint16 i;
	STR1_Rec[0] = SOI;
	STR1_Rec[1] = ASCII[VER>>4];
	STR1_Rec[2] = ASCII[VER&0x0f];
	STR1_Rec[3] = ASCII[ADR>>4];
	STR1_Rec[4] = ASCII[ADR&0x0f];
	STR1_Rec[5] = ASCII[CID10>>4];
	STR1_Rec[6] = ASCII[CID10&0x0f];
	STR1_Rec[7] = ASCII[k>>4];			//用K来区别被动响应还是主动上传
	STR1_Rec[8] = ASCII[k&0x0f];
	GetCheckLength(STR1_Rec,4+16*2);	//数据长度校验 12
	STR1_Rec[13] = ASCII[DATAFLAG>>4];	//DATAFLAG
	STR1_Rec[14] = ASCII[DATAFLAG&0x0f];
	STR1_Rec[15] = ASCII[16>>4];
	STR1_Rec[16] = ASCII[16&0x0f];
	for(i=0; i<16; i++)
	{
		if(DISam_Code[i]==0)			//没有启用该通道 发送0x20
		{
			STR1_Rec[i*2+17]=0x20; STR1_Rec[i*2+18]=0x20;
		}
		else
		{
			STR1_Rec[i*2+17]=ASCII[(DISam_Value[i]>>4)&0x0f]; 
			STR1_Rec[i*2+18]=ASCII[(DISam_Value[i]>>0)&0x0f]; 
		}
	}
	i = 15*2+18;
	GetCheckSum(STR1_Rec,i);			//数据包和校验
	STR1_Rec[i+5]= EOI;
	SendStrlenToCom1(STR1_Rec,i+6);	
}
/*********************************************************************************************************
* 函数名称:SendGaoJing
*
* 功能描述:发送当前告警消息
*
* 说明:
* 
********************************************************************************************************/
void SendGaoJing(Uint16 k)
{
	Uint16 i;
	STR1_Rec[0] = SOI;
	STR1_Rec[1] = ASCII[VER>>4];
	STR1_Rec[2] = ASCII[VER&0x0f];
	STR1_Rec[3] = ASCII[ADR>>4];
	STR1_Rec[4] = ASCII[ADR&0x0f];
	STR1_Rec[5] = ASCII[CID10>>4];
	STR1_Rec[6] = ASCII[CID10&0x0f];
	STR1_Rec[7] = ASCII[k>>4];				//用K来区别被动响应还是主动上传
	STR1_Rec[8] = ASCII[k&0x0f];
	GetCheckLength(STR1_Rec,6+16*10+16*6);	//数据长度校验 6+16*10+16*6
	STR1_Rec[13] = ASCII[DATAFLAG>>4];		//DATAFLAG
	STR1_Rec[14] = ASCII[DATAFLAG&0x0f];

	STR1_Rec[15] = ASCII[16>>4];			//模拟通道
	STR1_Rec[16] = ASCII[16&0x0f];
	for(i=0; i<16; i++)
	{
		STR1_Rec[i*10+17] = ASCII[i>>4];
		STR1_Rec[i*10+18] = ASCII[i&0x0f];
		STR1_Rec[i*10+19] = ASCII[ADSam_Code[i]>>4];
		STR1_Rec[i*10+20] = ASCII[ADSam_Code[i]&0x0f];
		
		if(ADSam_Code[i]==0)			//没有启用该通道 发送0x20
		{
			STR1_Rec[i*10+21]=0x20; 	STR1_Rec[i*10+22]=0x20;
			STR1_Rec[i*10+23]=0x20; 	STR1_Rec[i*10+24]=0x20;	
			STR1_Rec[i*10+25]=0x20;		STR1_Rec[i*10+26]=0x20;	
		}
		else
		{
			STR1_Rec[i*10+21]=ASCII[ADSam_Alarm[i]>>4]; 
			STR1_Rec[i*10+22]=ASCII[ADSam_Alarm[i]&0x0f]; 
			STR1_Rec[i*10+23]=ASCII[(ADSam_Value[i]>>12)&0x000f]; 
			STR1_Rec[i*10+24]=ASCII[(ADSam_Value[i]>>8) &0x000f]; 
			STR1_Rec[i*10+25]=ASCII[(ADSam_Value[i]>>4) &0x000f]; 
			STR1_Rec[i*10+26]=ASCII[(ADSam_Value[i]>>0) &0x000f]; 
		}
	}
										//开关量通道
	k = 15*10+26;
	STR1_Rec[k+1] = ASCII[16>>4];
	STR1_Rec[k+2] = ASCII[16&0x0f];
	for(i=0; i<16; i++)
	{
		STR1_Rec[i*6+3+k] = ASCII[i>>4];
		STR1_Rec[i*6+4+k] = ASCII[i&0x0f];
		STR1_Rec[i*6+5+k] = ASCII[DISam_Code[i]>>4];
		STR1_Rec[i*6+6+k] = ASCII[DISam_Code[i]&0x0f];
		if(DISam_Code[i]==0)			//没有启用该通道 发送0x20
		{
			STR1_Rec[i*6+7+k]=0x20; STR1_Rec[i*6+8+k]=0x20;
		}
		else
		{
			STR1_Rec[i*6+7+k]=ASCII[(DISam_Alarm[i]>>4)&0x0f]; 
			STR1_Rec[i*6+8+k]=ASCII[(DISam_Alarm[i]>>0)&0x0f]; 
		}
	}
	
	i = 15*6+8+k;
	GetCheckSum(STR1_Rec,i);				//数据包和校验
	STR1_Rec[i+5]= EOI;
	SendStrlenToCom1(STR1_Rec,i+6);

	DATAFLAG &= 0xEE;						//上传完告警信息后,将新增告警信息D0 D4位屏蔽
}
/*********************************************************************************************************
* 函数名称:YaoKong
*
* 功能描述:遥控...控制开关量输出
*
* 说明:
* 
********************************************************************************************************/
void YaoKong(void)
{
	Uint16 tongdao, states;
	
	tongdao = Combine(STR1_Rec[13],STR1_Rec[14]);
	states = Combine(STR1_Rec[15],STR1_Rec[16]);
	if(tongdao == 0xFF)							//对所有的通道
	{
		if(states==0x10)		OutStates = 0x00ff;
		else if(states==0x1F)	OutStates = 0x0000;
	}
	else if(tongdao>=1&&tongdao<=8)				//指定的通道号
	{
		tongdao = (1<<(tongdao-1));
		if(states==0x10)		OutStates = OutStates | tongdao;
		else if(states==0x1F)	OutStates = OutStates & (~tongdao);
	}
	ctrl(OutStates);
	ErrorDeal(0,ADR,CID10,COM1);
}
/*********************************************************************************************************
* 函数名称:SendXiTongData
*
* 功能描述:上传系统参数,上限、下限
*
* 说明:P15
* 
********************************************************************************************************/
void SendXiTongData(void)
{
	Uint16 i;
	STR1_Rec[0] = SOI;
	STR1_Rec[1] = ASCII[VER>>4];
	STR1_Rec[2] = ASCII[VER&0x0f];
	STR1_Rec[3] = ASCII[ADR>>4];
	STR1_Rec[4] = ASCII[ADR&0x0f];
	STR1_Rec[5] = ASCII[CID10>>4];
	STR1_Rec[6] = ASCII[CID10&0x0f];
	STR1_Rec[7] = ASCII[0];				//正常响应
	STR1_Rec[8] = ASCII[0];
	GetCheckLength(STR1_Rec,2+16*8);	//数据长度校验 12
	STR1_Rec[13] = ASCII[16>>4];
	STR1_Rec[14] = ASCII[16&0x0f];
	for(i=0; i<16; i++)
	{		

⌨️ 快捷键说明

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