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

📄 nz94.c

📁 南自94规约
💻 C
📖 第 1 页 / 共 2 页
字号:
	          {
	          	Ctl_Stru.cmd_entry=CS_NZ94_CTRL_SELECT;
	          }
	          if(RBuffer[2]==0xee)
	          {
	          	Ctl_Stru.cmd_entry=CS_NZ94_CTRL_UNSELECT;
	          }
	          CS_SStore_Lianbiao_Business(Ctl_Stru.source_port_serial,&Ctl_Stru,sizeof(Ctl_Stru));

	          
	          CS_SStore_Lianbiao_Business(Ctl_Stru.source_port_serial,&Stru_Ctrl_Select,sizeof(Stru_Ctrl_Select));
		  CS_Write_Event(Ctl_Stru.source_port_serial,CS_ANSWER_EVENT);
		  NU_Release_Semaphore(&cs_port_semaphore[Ctl_Stru.source_port_serial]);
	}
	               
	
}


/////////////////////////////////////////////////////////////////////////
static void Answer_Ctrl_Execute(UBYTE *RBuffer,UBYTE Source_Addr,UBYTE Dest_Addr)
{
	CS_SCTLHEAD Ctl_Stru;
	UBYTE SoeFlag;
	UBYTE Ngd = 1;
	
	CS_If_Cpu_Online(Dst_Addr_First,Source_Addr-Src_Addr_Base,&SoeFlag,&sonline);
        if(1==SoeFlag)
        {
                Rec_Nz94_CommunicationSOE(Dest_Addr);
        }

	if (CS_Read_Ctl_Id_Stru(Dest_Addr,CS_NZ94_CTRL,CS_NZ94_CTRL_PERFORM,Cs_Cmd_List,&Ctl_Stru,SCtrlIdManager)==CS_FALSE)
	{
	}
	else
	{
		  Ctl_Stru.num=Ngd;
	          if(0xaa==RBuffer[2])
	          {
	          
	          	CS_SStore_Lianbiao_Business(Ctl_Stru.source_port_serial,&Ctl_Stru,sizeof(Ctl_Stru));

	         	CS_SStore_Lianbiao_Business(Ctl_Stru.source_port_serial,&Stru_Ctrl_Execute,sizeof(Stru_Ctrl_Execute));
		  	CS_Write_Event(Ctl_Stru.source_port_serial,CS_ANSWER_EVENT);
		 	NU_Release_Semaphore(&cs_port_semaphore[Ctl_Stru.source_port_serial]);
		   }
	               
	}
	
}

/////////////////////////////////////////////////////////////////////////
static void Answer_Ctrl_Cancel(UBYTE *RBuffer,UBYTE Source_Addr,UBYTE Dest_Addr)
{
	CS_SCTLHEAD Ctl_Stru;
	UBYTE SoeFlag;
	UBYTE Ngd = 1;

	CS_If_Cpu_Online(Dst_Addr_First,Source_Addr-Src_Addr_Base,&SoeFlag,&sonline);
        if(1==SoeFlag)
        {
                Rec_Nz94_CommunicationSOE(Dest_Addr);
        }

	if (CS_Read_Ctl_Id_Stru(Dest_Addr,CS_NZ94_CTRL,CS_NZ94_CTRL_CANCEL,Cs_Cmd_List,&Ctl_Stru,SCtrlIdManager)==CS_FALSE)
	{
	}
	else
	{
	
	          Ctl_Stru.num=Ngd;
	          if(0x55==RBuffer[2])
	          {
	          
	          	CS_SStore_Lianbiao_Business(Ctl_Stru.source_port_serial,&Ctl_Stru,sizeof(Ctl_Stru));
	          	CS_SStore_Lianbiao_Business(Ctl_Stru.source_port_serial,&Stru_Ctrl_Cancel,sizeof(Stru_Ctrl_Cancel));
		  	CS_Write_Event(Ctl_Stru.source_port_serial,CS_ANSWER_EVENT);
		  	NU_Release_Semaphore(&cs_port_semaphore[Ctl_Stru.source_port_serial]);
		  }
	               
	}
	
}

/////////////////////////////////////////////////////////////////////////


/////////////////////////////////////////////////////////////////////////
static void Rec_Ctrl(UBYTE *RBuffer,UBYTE Source_Addr,UBYTE Dest_Addr)
{
	switch(RBuffer[2])
	{
		case 0x33:
		case 0xcc:
		
		Answer_Ctrl_Select(RBuffer,Source_Addr,Dest_Addr);
		break;
		
		case 0xaa:
		Answer_Ctrl_Execute(RBuffer,Source_Addr,Dest_Addr);
		break;
		
		case 0x55:
		Answer_Ctrl_Cancel(RBuffer,Source_Addr,Dest_Addr);
		break;
		
		default:
		break;
		
	}
}

//////////////////////////////////////////////////////////////////////////
static void Rec_YaoCe(UBYTE *RecBuffer,UBYTE SourceAddr,UBYTE DestAddr)
{
	UBYTE* Addr_YaoCe;
	float Value;
	UBYTE SoeFlag;
	UBYTE HiValue;
	UBYTE *Entry_Addr;
	UBYTE *p;
	UBYTE pTemp;
	UBYTE count ;
	UBYTE i;
	
	CS_If_Cpu_Online(Dst_Addr_First,SourceAddr-Src_Addr_Base,&SoeFlag,&sonline);
        if(1==SoeFlag)
        {
                Rec_Nz94_CommunicationSOE(DestAddr);
        }
        
	Addr_YaoCe=CS_Find_Group_Begin(CS_CAN_PORT,DestAddr,CS_YAOCE_TYPE);
	
	 i = RecBuffer[2];
	
	for(count = 0;count<i;count +=2 )
	
	{
		Entry_Addr=CS_Find_Entry_Pos(Addr_YaoCe,count,CS_YAOCE_TYPE);
		HiValue = RecBuffer[4+count] & 0x7f;
		Value = (float)(RecBuffer[3+count]+HiValue*256);
		p = (UBYTE*)(&Value);
		
		pTemp = *p;
		*p = *(p+3);
		*(p+3) = pTemp;
		pTemp = *(p+1);
		*(p+1) = *(p+2);
		*(p+2) = pTemp;
	
	
		CS_Write_Database(Entry_Addr,p,4);
		
	}
	
	
}



////////////////////////////////////////////////////////////////////////////////////////////
//开关变位,以soe方式上送
////////////////////////////////////////////////////////////////////////////////////////////
static void Rec_KGBW(UBYTE *RecBuffer,UBYTE SourceAddr,UBYTE DestAddr)
{
	
	int i,n;
	UBYTE SoeFlag;
	TSOERECORD SoeRecord;
	CS_SCTLHEAD Cs_SctlHead;
	UBYTE ifneedsoe;

	ifneedsoe = CS_If_Cpu_Online(Dst_Addr_First,SourceAddr-Src_Addr_Base,&SoeFlag,&sonline);
        if(1==ifneedsoe)
        {
                Rec_Nz94_CommunicationSOE(DestAddr);
        }

	
	//发送标识结构
	Cs_SctlHead.source_port_serial=CS_CAN_PORT;
	Cs_SctlHead.dest_cpu=DestAddr;
	Cs_SctlHead.trans_mode=CS_BURST_TYPE;
	Cs_SctlHead.send_type=0;
	Cs_SctlHead.cmd_type=CS_IEC103_BURST;
	Cs_SctlHead.cmd_entry=CS_IEC103_BURST_SOE;
	Cs_SctlHead.num=1;
	CS_Deal_Store_Business(&Cs_SctlHead,sizeof(Cs_SctlHead));

	
        SoeRecord.port_serial=CS_CAN_PORT;
        SoeRecord.byAddr=DestAddr;
        SoeRecord.tSoe.byDiNo=RecBuffer[2];//条目号
        SoeRecord.tSoe.byDiq=RecBuffer[3]; //状态信息
        	

        if (SoeRecord.tSoe.byDiq==0x00)   //单点信息转换
        {
        	 SoeRecord.tSoe.byDiq=1;
        }
        else
        {
        	 SoeRecord.tSoe.byDiq=2;
        }

        SoeRecord.tSoe.tDate.wMs=MAKEWORD((WORD)RecBuffer[8],(WORD)RecBuffer[9]);
        SoeRecord.tSoe.tDate.byMin=RecBuffer[6]; //min
        SoeRecord.tSoe.tDate.byHour=RecBuffer[5];//hour
        CS_Deal_Store_Business(&SoeRecord,sizeof(SoeRecord));
        	
        CS_Soe_Conjunction(&SoeRecord,sizeof(SoeRecord));
      
	CS_Send_Group_Database_Message();
	
}

///////////////////////////////////////////////////////////////////////////////////////////
//通过移位计算遥信状态
static CS_STATUS Check_Bit(UBYTE Dig_data,UBYTE bit_num)
{
	UBYTE temp;
	
	temp = Dig_data<<(7-bit_num);
	
	//if ((Dig_data<<(7-bit_num))>=0x80)
	if ((temp&0x80) == 0x80)
	{
		return CS_SUCCESS;
	}
	else return CS_FALSE;
}

////////////////////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////////////////////

static void Rec_YaoXin(UBYTE *RecBuffer,UBYTE SourceAddr,UBYTE DestAddr)
{
	UBYTE* Addr_YaoXin;
	UBYTE* Entry_Addr;
	UBYTE SoeFlag;
	UBYTE  Value;
	UBYTE count ;
	UBYTE i;
	UBYTE m;
	UBYTE n;
	
	m = 1;
	
	
	CS_If_Cpu_Online(Dst_Addr_First,SourceAddr-Src_Addr_Base,&SoeFlag,&sonline);
        if(1==SoeFlag)
        {
                Rec_Nz94_CommunicationSOE(DestAddr);
        }
        
	Addr_YaoXin=CS_Find_Group_Begin(CS_CAN_PORT,DestAddr,CS_YAOXIN_TYPE);
	
	
	
	for(count = 0;count<2;count++ )                             //YaoXin上送两个字节
	
	{
		for(n = 0;n<=7;n++)
		{
			if (Check_Bit(RecBuffer[2+count],n))     
			{
				Value = 2;
				
			}
			else
			{
				Value = 1;
				
			}
			Entry_Addr = CS_Find_Entry_Pos(Addr_YaoXin,m,CS_YAOXIN_TYPE);
			CS_Write_Database(Entry_Addr,&Value,1);
			m++;
		}
		
		
	}
}
////////////////////////////////////////////////////////////////////////////////////////

static void Rec_AlarmEvent(UBYTE *RecBuffer,UBYTE SourceAddr,UBYTE DestAddr)
{
	
	return;
}

///////////////////////////////////////////////////////////////////////////////////////////
static void Reply_KGBW(UBYTE *RecBuffer,UBYTE SourceAddr,UBYTE DestAddr)
{
	UBYTE SendPacket[5];
	UBYTE Seria;
	UBYTE Type = 0x03;
	UBYTE DLC = 0x03;
	Type = Type<<5;
	
	SendPacket[0] = 0x00;
	SendPacket[1] = Type|DLC;
	SendPacket[2] = SourceAddr;
	SendPacket[3] = 0x06;
	SendPacket[4] = 0x55;

	Seria = SourceAddr - Src_Addr_Base;
        CS_Cpu_Online_Add(Seria,&sonline);
        Store_Com_Frame(SendPacket,5,com_in_buf);
        NU_Release_Semaphore(&semCantxbuf);
	return;
}

/////////////////////////////////////////////////////////////////////////////////////////////

static void Reply_AlarmEvent(UBYTE *RecBuffer,UBYTE SourceAddr,UBYTE DestAddr)
{
	UBYTE SendPacket[5];
	UBYTE Seria;
	UBYTE Type = 0x03;
	UBYTE DLC = 0x03;
	Type = Type<<5;
	
	SendPacket[0] = 0x00;
	SendPacket[1] = Type|DLC;
	SendPacket[2] = SourceAddr;
	SendPacket[3] = 0x06;
	SendPacket[4] = 0xaa;

	Seria = SourceAddr - Src_Addr_Base;
        CS_Cpu_Online_Add(Seria,&sonline);
        Store_Com_Frame(SendPacket,5,com_in_buf);
        NU_Release_Semaphore(&semCantxbuf);
	return;
}
//////////////////////////////////////////////////////////////////////////
static void CS_NZ94_Receive_Kernel()
{

	UBYTE  preturnserial;
	UBYTE  i;
	UWORD wLen;
	UBYTE Source_Addr;
	UBYTE Dest_Addr;  
	CS_STATUS Status;
	STATUS Nust;
	UBYTE flag;
	UBYTE Type;


	while(1)
        {	
        	Nust=NU_Obtain_Semaphore(&semCanrxbuf,ReadOverTime);
        	if (Nust==NU_SUCCESS )
        	{
                	wLen=Retrieve_Com_Frame(RecBuffer,com_out_buf);
			if(wLen==0)
			{
				return;
			}
                 	if (Permit_process(CS_CAN_PORT,RecBuffer[0]))
                 	{
	                	Source_Addr=RecBuffer[0];
	                 	CS_Search_Dest_From_Source(CS_CAN_PORT,&Source_Addr,&Dest_Addr);
	                 	
	                 	flag = RecBuffer[1]&0x40;
	                 	if(flag == 0x40)
	                 	{
	                 		Type = RecBuffer[1] & 0x0f ; 
	                 		switch(Type)    
	                	 	{
	                	 		case  0:
	                	 	
	                	 		{
	                	 			Rec_YaoCe(RecBuffer,Source_Addr,Dest_Addr);
	                	 		}
	                	 	
	                	 		break;
	                	 	
	                	 	
	                	 	
	                	 		case 4:
	                	 	
	                	 		{
	                	 			Rec_YaoXin(RecBuffer,Source_Addr,Dest_Addr);
	                	 		
	                	 		
	                	 		}
	                	 	
	                	 		break;
	                	    

	                			default:
	                			 break;
	                	 	}
	                 		
	                 	}
	                 	else
	                 	{
	                 		Type = RecBuffer[1];
	                 		switch(Type)
	                 		{
	                 		
	                 		
	                 			case 0:
	                 			{
	                 				Reply_KGBW(RecBuffer,Source_Addr,Dest_Addr);
	                 				Rec_KGBW(RecBuffer,Source_Addr,Dest_Addr);
	                 					
	                 			}
	                 			break;
	                 		
	                 			case 1:
	                 			{
	                 				Reply_AlarmEvent(RecBuffer,Source_Addr,Dest_Addr);
	                 				Rec_AlarmEvent(RecBuffer,Source_Addr,Dest_Addr);
	                 			}
	                 			break;
	                 		
	                 			case 4:
	                 			{
	                 				Rec_Ctrl(RecBuffer,Source_Addr,Dest_Addr);
	                 			}
	                 			break;
	                 		
	                 	
	                 			
	                 			default:
	                 	
	                 			break;
	                 		}
	                 	
	                
	               		}
	               	}
	        }

                
        	
        	
        }

}

//////////////////////////////////////////////////////////

#define SZ_NZ94_TSK_STK 1024
static NU_TASK NZ94TX,NZ94RX;
static UBYTE NZ94_TxStack[SZ_NZ94_TSK_STK];
static UBYTE NZ94_RxStack[SZ_NZ94_TSK_STK];


void NZ94_INIT()
{
   	NU_Create_Task(&NZ94TX, "NZ94TX", CS_NZ94_Send_Kernel, 0, NU_NULL, 
   	NZ94_TxStack, SZ_NZ94_TSK_STK, PROTO_TASK_PRI, 0, NU_NO_PREEMPT, NU_START);
 
 
        NU_Create_Task(&NZ94RX, "NZ94RX", CS_NZ94_Receive_Kernel, 0, NU_NULL,NZ94_RxStack, SZ_NZ94_TSK_STK ,PROTO_TASK_PRI, 0, NU_NO_PREEMPT, NU_START);
}






///////////////////////////////////////////////////////////////////////保护时间报文
//01 01 10 00 2f 00 00 01 cd 00 20 03 22 21 14 12 04 04 21 00 

⌨️ 快捷键说明

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