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

📄 nz94.c

📁 南自94规约
💻 C
📖 第 1 页 / 共 2 页
字号:
/*                               	南自94规约   

			
*/

#include "hardef.h"
#include "wtypedef.h"
#include "evar.h"
#include <nucleus.h>
#include "sys.h"
#include "extm103.H"
#include "command.H"

/////////////////////////////////////////////////////////////////////
#define CS_NZ94_TIME 		80
#define CS_NZ94_RESET 		90
#define CS_NZ94_CTRL 		10
////////////////////////////////////////////////////////////////////
#define CS_NZ94_CTRL_SELECT	1	
#define CS_NZ94_CTRL_PERFORM	2	
#define CS_NZ94_CTRL_CANCEL	3	
#define CS_NZ94_CTRL_UNSELECT	4	
/////////////////////////////////////////////////////////////////////

extern NU_SEMAPHORE semCanrxbuf;
extern NU_SEMAPHORE semCantxbuf;

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


static UBYTE Src_Addr_Base ;
static UBYTE Src_Addr_Length ;
static UBYTE Dst_Addr_First ;
static UBYTE Rtu_Total ;
static UBYTE ReadOverTime = 400;
CS_SCPU_ONLINE  sonline;
CS_SCTLHEAD Cs_Cmd_List[10];
CS_SCTL_ID_MANAGE SCtrlIdManager[10];
static UBYTE SendBuffer[1000];
static UBYTE RecBuffer[1000];
UBYTE ontimes=0;
TCTRLRECORD Stru_Ctrl_Select,Stru_Ctrl_Execute,Stru_Ctrl_Cancel;

extern NU_SEMAPHORE cs_sptx_semaphore[8];
extern NU_SEMAPHORE cs_sprx_semaphore[8];


enum {YaoCe,YaoXin,AlarmAction,KGBW}CurFrame;
///////////////////////////////////////////////////////////////////

static void Send_CheckTimer(CS_SCTLHEAD Cmd_Stru)                 //测试通过
{
	int minute,hour,day,month;
	UBYTE SendPacket[10];
        TDUISHI Stru_CheckTimer;
        UBYTE Source_Addr;
        UBYTE Seria;
        UBYTE Source_Addr_Length;
        UBYTE hValue;
        UBYTE lValue;
        UBYTE Type=0;
        UBYTE DLC=8;
  	Type=Type<<5;
  
  


	if (Cmd_Stru.send_type==0)
	{
        	CS_SRetrieve_Lianbiao_Business(CS_CAN_PORT,&Stru_CheckTimer,sizeof(Stru_CheckTimer));
                CS_Search_Source_From_Dest(CS_CAN_PORT,&Source_Addr,&Source_Addr_Length,&Stru_CheckTimer.byAddr);
           	
  
           	SendPacket[0]=0x00;
            	SendPacket[1] = Type|DLC;
            	SendPacket[2]=(BYTE)(Stru_CheckTimer.time.wMs);//msL
        	SendPacket[3]=(BYTE)(Stru_CheckTimer.time.wMs>>8);//msH
        	
        	//minute
        	hValue=(UBYTE)(Stru_CheckTimer.time.byMin/10);
		minute=Stru_CheckTimer.time.byMin-hValue*10;
		lValue=(UBYTE)(minute);
		SendPacket[4]=(hValue<<4)|lValue;//min
		
		//hour
		hValue=(UBYTE)(Stru_CheckTimer.time.byHour/10);
		hour=Stru_CheckTimer.time.byHour-hValue*10;
		lValue=(UBYTE)(hour);
        	SendPacket[5]=(hValue<<4)|lValue;
        	
        	//day
        	hValue=(UBYTE)((Stru_CheckTimer.time.byDay&0x1f)/10);
		day=(Stru_CheckTimer.time.byDay&0x1f)-hValue*10;
		lValue=(UBYTE)(day);
        	SendPacket[6]=(hValue<<4)|lValue;//day,高四位表示‘星期’,低四位表示‘日’
        	
        	//month
        	hValue=(UBYTE)(Stru_CheckTimer.time.byMon/10);
		month=Stru_CheckTimer.time.byMon-hValue*10;
		lValue=(UBYTE)(month);
        	SendPacket[7]=(hValue<<4)|lValue;
        	
        	
        	SendPacket[8]=Stru_CheckTimer.time.wYear;//year
        	SendPacket[9]=0x15;//Century
        	
        	Seria = Source_Addr - Src_Addr_Base;
        	CS_Cpu_Online_Add(Seria,&sonline);
        	Store_Com_Frame(SendPacket,10,com_in_buf);
        	NU_Release_Semaphore(&semCantxbuf);
        }
    
	return ;
	
}


/////////////////////////////////////////////////////////////////
static void Send_Reset(CS_SCTLHEAD Cmd_Stru)
{
	
	UBYTE SendPacket[3];
        TFUGUIRECORD Stru_Reset;
        UBYTE Source_Addr;
        UBYTE Source_Addr_Length;
        UBYTE Seria;
        UBYTE Type=6;
        UBYTE DLC=1;
        
  	Type=Type<<5;
	SendPacket[0]=0x00;
        SendPacket[1]=Type|DLC;
	if (Cmd_Stru.send_type==0)
	{
        	CS_SRetrieve_Lianbiao_Business(CS_CAN_PORT,&Stru_Reset,sizeof(Stru_Reset));
                CS_Search_Source_From_Dest(CS_CAN_PORT,&Source_Addr,&Source_Addr_Length,&Stru_Reset.byAddr);
           
           	
                if(Cmd_Stru.dest_cpu == 255)
        	{
        		SendPacket[2]=0xff;
        	
        		Seria = Source_Addr - Src_Addr_Base;
        		CS_Cpu_Online_Add(Seria,&sonline);
        		Store_Com_Frame(SendPacket,3,com_in_buf);
        		NU_Release_Semaphore(&semCantxbuf);
        	}
        	else
        	{
        		SendPacket[2] =Source_Addr;
        		
        		Seria = Source_Addr - Src_Addr_Base;
        		CS_Cpu_Online_Add(Seria,&sonline);
        		Store_Com_Frame(SendPacket,3,com_in_buf);
        		NU_Release_Semaphore(&semCantxbuf);
        	}
        }
    
	return ;

	
}
/////////////////////////////////////////////////////////////////


/////////////////////////////////////////////////////////////////
static void Send_Ctrl(CS_SCTLHEAD Cmd_Stru)
{
	UBYTE Source_Addr; 
	UBYTE Source_Addr_Length;
	UBYTE SendPacket[6];
	
	UBYTE Seria;
	TCTRLRECORD Stru_Ctrl;
	
	UBYTE Type = 0x04;
	UBYTE DLC = 0x04;
	Type = Type<<5;
	
	
	
        if (Cmd_Stru.send_type==0)
	{
        	
                CS_Search_Source_From_Dest(CS_CAN_PORT,&Source_Addr,&Source_Addr_Length,&Stru_Ctrl.byAddr);
                SendPacket[0]=Source_Addr|0x40;
   		SendPacket[1] = Type|DLC;
   
                if (Cmd_Stru.cmd_entry==CS_NZ94_CTRL_SELECT)       
                {
                
                	CS_SRetrieve_Lianbiao_Business(CS_CAN_PORT,&Stru_Ctrl_Select,sizeof(Stru_Ctrl_Select));
                	if(Stru_Ctrl.tCtrl.byDiq == 1)  //1分
                		SendPacket[2] = 0x33;
                	else
                		SendPacket[2] = 0xcc;   //合
                	SendPacket[3] =  Source_Addr ;           //目前定义的遥控对象是装置地址,如果不是就是0
                	SendPacket[4] = ~(0x33);                    //遥控命令反码
                	SendPacket[5] = ~(Source_Addr);              //遥控对象反码
                	
                }		
                
                
                if(Cmd_Stru.cmd_entry==CS_NZ94_CTRL_PERFORM)
                {
                	CS_SRetrieve_Lianbiao_Business(CS_CAN_PORT,&Stru_Ctrl_Execute,sizeof(Stru_Ctrl_Execute));
                	SendPacket[2] = 0xaa;
                	SendPacket[3] =  Source_Addr ;           
                	SendPacket[4] = ~0xaa;                    
                	SendPacket[5] = ~Source_Addr;             
                
        		
                	
               	}
                if(Cmd_Stru.cmd_entry==CS_NZ94_CTRL_CANCEL)
                {
                	CS_SRetrieve_Lianbiao_Business(CS_CAN_PORT,&Stru_Ctrl_Cancel,sizeof(Stru_Ctrl_Cancel));
                	SendPacket[2] = 0x55;
                	SendPacket[3] =  Source_Addr ;          
                	SendPacket[4] = ~0x55;                 
                	SendPacket[5] = ~Source_Addr;             
                	
                
                }
             
            		 Seria = Source_Addr - Src_Addr_Base;
        		CS_Cpu_Online_Add(Seria,&sonline);
        		Store_Com_Frame(SendPacket,6,com_in_buf);
        		NU_Release_Semaphore(&semCantxbuf);
        }
      

	return;
	
	
}
static void SendYaoCe(UBYTE Source_Addr)
{
	UBYTE SendPacket[4];
	UBYTE Seria;
	UBYTE Type = 0x02;
	UBYTE DLC = 0x02;
	Type = Type<<5;
	
	Source_Addr = Source_Addr|0x40;
	
	SendPacket[0] = Source_Addr;
	SendPacket[1] = Type|DLC;
	SendPacket[2] = 0x00;
	SendPacket[3] = 0x00;

	Seria = Source_Addr - Src_Addr_Base;
        CS_Cpu_Online_Add(Seria,&sonline);
        Store_Com_Frame(SendPacket,4,com_in_buf);
        NU_Release_Semaphore(&semCantxbuf);
	
}
static void SendYaoXin(UBYTE Source_Addr)
{
	UBYTE SendPacket[4];
	UBYTE Seria;
	
	UBYTE Type = 0x02;
	UBYTE DLC = 0x02;
	Type = Type<<5;
	
	Source_Addr = Source_Addr|0x40;
	
	SendPacket[0] = Source_Addr;
	SendPacket[1] = Type|DLC;
	SendPacket[2] = 0x03;
	SendPacket[3] = 0x00;
	
	
	 Seria = Source_Addr - Src_Addr_Base;
        CS_Cpu_Online_Add(Seria,&sonline);
        Store_Com_Frame(SendPacket,4,com_in_buf);
        NU_Release_Semaphore(&semCantxbuf);
        
 
        

}

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

static void CS_NZ94_Send_Kernel()
{
	
   	CS_SCTLHEAD Cmd_Stru;
 	UBYTE Cpu_Addr;
 	STATUS Nust;
 	UBYTE i;
 	UBYTE Flag = 1;
 	
	CS_Init_CS_SCPU_ONLINE(&sonline);
        CS_Init_CS_SCTL_ID_MANAGE(SCtrlIdManager,10);
	CS_Get_Port_Para(CS_CAN_PORT,&Src_Addr_Base,&Src_Addr_Length,&Dst_Addr_First,&Rtu_Total);

	Cpu_Addr = Src_Addr_Base;
	CurFrame = YaoCe;
	while(1)
	{
	//	for (Cpu_Addr = Src_Addr_Base; Cpu_Addr <  (Src_Addr_Base + Rtu_Total); Cpu_Addr++)
	//	{
			Nust=NU_Obtain_Semaphore(&cs_port_semaphore[CS_CAN_PORT],ReadOverTime);
			if (Nust == NU_SUCCESS)
			{
			        CS_SRetrieve_Lianbiao_Business( CS_CAN_PORT,&Cmd_Stru, sizeof(Cmd_Stru));
			        
			        if (Cmd_Stru.trans_mode==CS_BROADCAST_TYPE)
			        {

				}
			        else
			        {
	        	                CS_Write_Ctl_Id_Stru(Cmd_Stru,Cs_Cmd_List,SCtrlIdManager);
		                }

			        switch(Cmd_Stru.cmd_type)                 //类型标志
				{
					case CS_NZ94_TIME:              //对时
					     	Send_CheckTimer(Cmd_Stru);
					     break;

					case CS_NZ94_RESET:             //复归
					     	Send_Reset(Cmd_Stru);
					     break;

					case CS_NZ94_CTRL:              //遥控
					     	Send_Ctrl(Cmd_Stru);
					     break;

					default:
						break;
				}

			}
			
	/*		else               
			{
				
				
				for(i =0 ;i<4;i++)
				{
					switch(CurFrame)
					{
						case YaoCe:
						{
							SendYaoCe(Cpu_Addr);
							CurFrame = YaoCe;
					
						}	
						break;
					
						case YaoXin:
						{
							SendYaoXin(Cpu_Addr);
							CurFrame = AlarmAction;
						}
					
					
						break;
						
						case AlarmAction:
						{
							SendAlarmEvent(Cpu_Addr);
							CurFrame = KGBW;
						}
						break;
						
						case KGBW:
						{
							SendKGBW(Cpu_Addr);
							CurFrame = YaoCe;
						}
						break;
						
				
					
						default:
						break;
					}
				}
				
				
				

		    	}
		}*/

	}
	return ;
} 

///////////////////////////////////////////////////////////////////
static CS_STATUS Permit_process(UBYTE port_serial,UBYTE source_addr)
{
	UBYTE i;

	for(i=0;i<cs_vsport_assem.port_num;i++)
	{
		if(port_serial==cs_vsport_lchr[i].port_serial)
		{
			if((source_addr>=cs_vsport_lchr[i].source_min_addr[0])&&
				(source_addr<(cs_vsport_lchr[i].source_min_addr[0]+cs_vsport_lchr[i].cpu_num)))
			{
				return CS_SUCCESS;
			}
			else
			{
				return CS_FALSE;
			}
		}
	}
}
//////////////////////////////////////////////////////////////////////////
static void Rec_Nz94_CommunicationSOE(UBYTE Dest_Addr)
{
	UBYTE ngd;
	TSOERECORD psoerecord;
	CS_SCTLHEAD cs_sctlhead;
	SY_DATE_TIME sy_data_time;

	cs_sctlhead.source_port_serial=CS_CAN_PORT;
	cs_sctlhead.dest_cpu=0;
	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));

	psoerecord.port_serial=CS_CAN_PORT;
	psoerecord.byAddr=0;//表示CPU通信正常值
	psoerecord.tSoe.byDiq=2;
	psoerecord.tSoe.byDiNo=Dest_Addr;
	//要调用时间函数取得时间
        SY_Get_Sys_Time(&sy_data_time);
        //psoerecord.tSoe.tDate.wMs=sy_data_time.unMSEL;//ms
        psoerecord.tSoe.tDate.wMs=sy_data_time.ucSec*1000;
	psoerecord.tSoe.tDate.byMin=sy_data_time.ucMinute; //min
	psoerecord.tSoe.tDate.byHour=sy_data_time.ucHour;//hour
	psoerecord.tSoe.tDate.byDay=sy_data_time.ucDate;//Day
	psoerecord.tSoe.tDate.byMon=sy_data_time.ucMonth;//Month
	psoerecord.tSoe.tDate.wYear=sy_data_time.unYear;//year
	CS_Deal_Store_Business(&psoerecord,sizeof(psoerecord));
	CS_Send_Group_Database_Message();
	ontimes++;
}
//////////////////////////////////////////////////////////////////////////
static void Answer_Ctrl_Select(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_SELECT,Cs_Cmd_List,&Ctl_Stru,SCtrlIdManager)==CS_FALSE)
	{
	}
	else
	{
	
	          Ctl_Stru.num=Ngd;
	          if((0x33==RBuffer[2])||(RBuffer[2]==0xcc))

⌨️ 快捷键说明

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