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

📄 cdt.c

📁 力导保护35kv保护装置对接南自系统的CDT源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*************************************************************************/
/*                                                                       */
/*          国电南思	                              			 */
/*                                                                       */
/*************************************************************************/
/*************************************************************************/
/*	FILE NAME						VERSION								 */
/*                                                                       */
/*  cdt.c         cdt.h           cdtcode.c	           		 */
/*                                                                       */
/*  DESCRIPTION                                                          */
/*                                                                       */
/*		南京力导保护管理机通讯规约(扩展CDT)                      */
/*                                                                       */
/*  HISTORY                                                              */
/*                                                                       */
/*	NAME	            DATE		REMARKS                  */
/*                                                                       */
/*      TT                2006.02.21                                     */
/*                                                                       */
/*************************************************************************/
/*************************************************************************
通信设置:1200,8,1 ,NO
软件功能:遥控,对时,上送保护信息,定值,遥测,遥信。
备注:该规约除召唤定值使用扩展CDT外,其他功能仍按标准CDT规则
**************************************************************************/
#include "cdt.h"
static WORD pro_check_packet(const BYTE *p_data, WORD data_len)
{
	if (data_len <= 6)
	{
		if (((data_len % 2) != 0) && (p_data[data_len-1] == 0xEB))
		{
			return UART_PKT_CON;
		}
		if (((data_len % 2) == 0) && (p_data[data_len-1] == 0x90))
		{
			return UART_PKT_CON;
		}
		return UART_PKT_ERR;
	}
	if (data_len < 12)
	{
		return UART_PKT_CON;
	}
	if (data_len == (p_data[8]*6+12))
	{
		return UART_PKT_FIN;
	}
	return UART_PKT_CON;
}
BOOL IED_Initialize()
{
  return DEV_Create_IED(g_ied_list, sizeof(g_ied_list)/sizeof(T_IED));
}
/* 协议初始化 */
static BOOL pro_initialize()
{
	T_UART_CONFIG  config;
	STATUS	status;

	if (m_dev_port == UART_PORT_A)
	{
		config =g_sys_config.uart_a;
	}
	else if (m_dev_port == UART_PORT_B)
	{
		config =g_sys_config.uart_b;
	}
	else
	{
		return FALSE;
	}
	config.pcb =pro_check_packet;

	if ( !UART_Open(m_dev_port, &config) )
	{
		return FALSE;
	}
	NU_Create_Semaphore(&m_com_lock, "COM_LOCK", 1, NU_FIFO);
	
	status =NU_Create_Task(&m_232_task, "TASK_232", task_232, 0, NU_NULL,
					        m_232_stack, 0x2000, 10, 0, NU_PREEMPT, NU_START
						  );
	/*status =NU_Create_Task(&m_232x_task, "TASK_232x", task_232x, 0, NU_NULL,
					        m_232x_stack, 0x2000, 10, 0, NU_PREEMPT, NU_START
						  );*/
	/*status =NU_Create_Task(&m_232event_task, "TASK_232event", task_232event, 0, NU_NULL,
					        m_232event_stack, 0x2000, 10, 0, NU_PREEMPT, NU_START
						  );*/
	/*status =NU_Create_Task(&m_232di_task, "TASK_232di", task_232di, 0, NU_NULL,
					        m_232di_stack, 0x2000, 10, 0, NU_PREEMPT, NU_START
						  );*/					  
						  
	return (status == NU_SUCCESS);
}

/* 设备初始化 */
static BOOL pro_open_ied(const T_IED *p_ied)
{
	
	return TRUE;
}

/* 设备服务接口 */
BOOL LD_service(T_IED *p_ied, T_MESSAGE *p_msg)
{
  	 
  BOOL  ret_code =FALSE;
  /* [初始化部分] */
  switch(p_msg->m_type)
  {
  case MSG_T_INIT:
    /* 初始化协议 */
    return pro_initialize();
  case MSG_T_OPEN:
    /* 初始化设备 */
    return pro_open_ied((T_IED *)(p_msg->m_data));
  default:
    break;
  }
  //设备操作接口部分
  DEV_LOCK_COM();
  switch(p_msg->m_type)
  {
  case MSG_T_LIST:
    if(p_msg->m_flag == MSG_F_READ)
    {
      ret_code = c103_get_List(p_ied, (T_LIST*) p_msg->m_data);
    }
    break;
    case MSG_T_SET:
    if(p_msg->m_flag == MSG_F_READ)
    {
      ret_code = cdt_get_setting(p_ied, (T_SET *)p_msg->m_data);
    }
    break;
  case MSG_T_CTRL:
    if(p_msg->m_flag == MSG_F_CHECK)
    {
      ret_code = cdt_check_control(p_ied, (WORD) p_msg->m_data);
     // NU_Sleep(100);
    }
    if (p_msg->m_flag == MSG_F_WRITE)
    {
      ret_code = cdt_remote_control(p_ied, (WORD) p_msg->m_data);
     // NU_Sleep(100);
    }
    break;
  case MSG_T_CLOCK:
    /* 广播对时 */
    if(p_msg->m_flag == MSG_F_WRITE)
    {
      time_num++;
      if(time_num==50)
      {
      	time_num=0;
      	ret_code = cdt_set_clock(p_ied, (T_DATE *)p_msg->m_data);
      }
      ret_code=true;	
      //NU_Sleep(200);
    }
    break;
  default:
    break;
  }
  //开放通讯资源
  NU_Sleep(50);
  DEV_UNLOCK_COM();
  return ret_code;
} 

static BYTE calc_crc_8(const BYTE *inf, BYTE nSize)
{
	int   i =0, r =0;
	DWORD crc =0;
	while (i < nSize)
	{
		if (inf[i] & (0x80 >> r))
		{
			crc |=0x01;
		}
		if (crc >= 0x100)
		{
			crc ^=0x107;
		}
		crc <<=1;
		r++;
		if (r == 8)
		{
			r=0;
			i++;
		}
	}
	for (i =0; i < 8; i++)
	{
		if (crc >= 0x100)
		{
			crc ^=0x107;
		}
		crc <<=1;
	}
	crc >>=1;
	crc =~crc;
	return (BYTE)crc;
}

static WORD dc_measure_value(BYTE low, BYTE hi)
{
	WORD  ms_val =0;
	WORD  v =MAKEWORD(low,hi);

	ms_val =((v & 0x4000) << 1) | ((v & 0x8000) >> 1);

	if ((v & 0x0800) != 0)
	{
		ms_val |=INF_MS_NEGATIVE;
		ms_val |=0x800-(v & 0x7FF);
	}
	else
	{
		ms_val |=(v & 0x7FF);
	}
	return ms_val;
}

/* 重要遥测量 */
static void Frame_A_Interpret(const BYTE *body, WORD nSize)
{
	int	 i,x;
	int      n;	
	WORD     cpu,fu1,fu2;
	int     id;
	int     temp;
	int     temp1;
	BOOL bChanged =FALSE;
	for (i =0; i < nSize; i++)
	{     
		/*if(body[0]==0x6f)
		{
		  NU_Sleep(100);	
		}*/
	     if((body[0]&0x80)==0)
	     {
		if (calc_crc_8(&body[0], 5) != body[5])
		{
			body +=6;
			continue;
		}
		id=body[0]*2;
		yc_temp[id]=MAKEWORD(body[1],body[2]);
		yc_temp[id+1]=MAKEWORD(body[3],body[4]);
		fu1=yc_temp[id];
		fu2=yc_temp[id+1];
		if((fu1&0x800)!=0)
		{
		  yc_temp[id]=((yc_temp[id]&0x7ff)-1)^0x7ff;
		  yc_temp[id]=yc_temp[id]|INF_MS_NEGATIVE;	
		}
		if((fu2&0x800)!=0)
		{
		  yc_temp[id+1]=((yc_temp[id+1]&0x7ff)-1)^0x7ff;
		  yc_temp[id+1]=yc_temp[id+1]|INF_MS_NEGATIVE;	
		}
		bChanged =TRUE;
	     }
	     else//变位遥信//1
	     {
	       if(body[0]>=0xf0)
	       {
	       	 if(body[0]==0xf8)
	       	 {
	       	   cpu=(body[0]-0xf0)*4;
	           for(n=0;n<2;n++)
	           {
	       	     m_di.di_val[0]=MAKEDWORD(MAKEWORD(body[1+n],0),0);	       	
	       	     INF_Set_Di(cpu+n, &m_di);
	           }	
	       	 }
	       
	       	 if(body[0]==0xf7)
	       	 {
	       	   cpu=(body[0]-0xf0)*4+1;
	           for(n=0;n<3;n++)
	           {
	       	     m_di.di_val[0]=MAKEDWORD(MAKEWORD(body[1+n],0),0);	       	
	       	     INF_Set_Di(cpu+n, &m_di);
	           }	
	       	 }
	         if(body[0]<0xf7)
	         {
	           cpu=(body[0]-0xf0)*4+1;
	           for(n=0;n<4;n++)
	           {
	       	     m_di.di_val[0]=MAKEDWORD(MAKEWORD(body[1+n],0),0);	       	
	       	     INF_Set_Di(cpu+n, &m_di);
	           }
	         }//end for  if(body[0]<0xf7)
	       }//end for if(body[0]>=0xf0)	
	     }//end for else //1
		body +=6;
	}
////////////////////////////////////////////////////////////////////////////////////////////	
	
		for(n=0;n<4;n++)
		{
		  m_ms.ms_val[n]=yc_temp[n];	
		}
		INF_Set_Measure(2, &m_ms);///331(电容器)
/////////////////////////////////////////////////////////////////////////////////////////		
		for(n=0;n<3;n++)
		{
		  m_ms.ms_val[n]=yc_temp[n+4];	
		}
		INF_Set_Measure(3, &m_ms);//315)
///////////////////////////////////////////////////////////////////////////////////////////
                for(i=3;i<28;i++)
                {
                  for(n=0;n<7;n++)
                  {
                    temp=(i-3)*7;
                    temp=temp+7;
                    temp=temp+n;
                    //temp=(n+(i-3)*7+8);
                    m_ms.ms_val[n]=yc_temp[temp];	
                  }	
                  INF_Set_Measure(i+1, &m_ms);//311(进线)
                }
/////////////////////////////////////////////////////////////////////////////////////////////////
                for(i=28;i<34;i++)
                {
                  for(n=0;n<12;n++)
                  {
                    temp1=(i-28)*12;
                    temp1=temp1+182;
                    temp1=temp1+n;
                    //temp=(n+(i-28)*12+183);
                    m_ms.ms_val[n]=yc_temp[temp1];	
                  }
                  INF_Set_Measure(i+1, &m_ms);//313	
                } 		
	
	//break;
}

/* 次要遥测量 */
static void Frame_B_Interpret(const BYTE *body, WORD nSize)
{
	int	 i;
	BOOL bChanged =FALSE;
	for (i =0; i < nSize; i++)
	{
		if (calc_crc_8(&body[0], 5) != body[5])
		{
			body +=6;
			continue;
		}
		switch (body[0])  /* 功能码 */
		{
		case 0x01:	//条目4-5
			m_ms.ms_val[3] =dc_measure_value(body[1], body[2]);
			m_ms.ms_val[4] =dc_measure_value(body[3], body[4]);
			bChanged =TRUE;
			break;
		case 0x03:	//条目6-7
			m_ms.ms_val[5] =dc_measure_value(body[1], body[2]);
			m_ms.ms_val[6] =dc_measure_value(body[3], body[4]);
			bChanged =TRUE;
			break;
		case 0x04:	//条目8
			m_ms.ms_val[7] =dc_measure_value(body[1], body[2]);
			bChanged =TRUE;
			break;
		default:
			break;
		}
		body +=6;
	}
	if (bChanged )
	{
		INF_Set_Measure(m_dev_id, &m_ms);
	}
}

/* 一般遥测量 */
static void Frame_C_Interpret(const BYTE *body, WORD nSize)
{
	int	 i;
	BOOL bChanged =FALSE;
	for (i =0; i < nSize; i++)
	{
		if (calc_crc_8(&body[0], 5) != body[5])
		{
			body +=6;
			continue;
		}
		switch (body[0])
		{
		case 0x01:	//条目9-10
			m_ms.ms_val[8] =dc_measure_value(body[1], body[2]);
			m_ms.ms_val[9] =dc_measure_value(body[3], body[4]);
			bChanged =TRUE;
			break;
		case 0x03:	//条目11-12
			m_ms.ms_val[10] =dc_measure_value(body[1], body[2]);
			m_ms.ms_val[11] =dc_measure_value(body[3], body[4]);
			bChanged =TRUE;
			break;
		case 0x05:	//条目13-14
			m_ms.ms_val[12] =dc_measure_value(body[1], body[2]);
			m_ms.ms_val[13] =dc_measure_value(body[3], body[4]);
			bChanged =TRUE;
			break;
		case 0x07:	//条目15-16
			m_ms.ms_val[14] =dc_measure_value(body[1], body[2]);
			m_ms.ms_val[15] =dc_measure_value(body[3], body[4]);
			bChanged =TRUE;
			break;
		case 0x09:	//条目17-18
			m_ms.ms_val[16] =dc_measure_value(body[1], body[2]);
			m_ms.ms_val[17] =dc_measure_value(body[3], body[4]);
			bChanged =TRUE;
			break;
		case 0x0B:	//条目19-20
			m_ms.ms_val[18] =dc_measure_value(body[1], body[2]);
			m_ms.ms_val[19] =dc_measure_value(body[3], body[4]);
			bChanged =TRUE;
			break;
		}
		body +=6;
	}
	if (bChanged )
	{
		INF_Set_Measure(m_dev_id, &m_ms);
	}
}

/* 遥信量 */
static void Frame_D_Interpret(const BYTE *body, WORD nSize)
{
	static DWORD	di_bitmap =0; //遥信量有效标志
	int	   i;
	int        n;
	WORD       temp,id;
	//DWORD  di_val=m_di.di_val[0];
	BOOL   bChanged =FALSE;
	T_DATE realdate;
	
	for (i =0; i < nSize; i++)
	{
		WORD  low,hi;
		DWORD state; 
		if(body[0]==0xf8)
		{
		  m_di.di_val[0]=MAKEDWORD(MAKEWORD(body[1],0),0);
		  INF_Set_Di(32, &m_di);
		  m_di.di_val[0]=MAKEDWORD(MAKEWORD(body[2],0),0);
		  INF_Set_Di(33, &m_di);		
		}
              if(body[0]<0xf8)
              {
              	  for(n=0;n<4;n++)
                  {
                    m_di.di_val[0]=MAKEDWORD(MAKEWORD(body[1+n],0),0);
                    id=(body[0]-0xf0)*4+n+1;
	            if(body[0]==0xf7)
	            {
	             if(n==2)
	             {
	              n++;	
	             }
	            }
                    if(id<34)
                    {
                      INF_Set_Di(id, &m_di);
                    }	
                  }
               }                  	
		body +=6;
	}
	//break;	
}
///////////soe
static void Frame_E_Interpret(const BYTE *body_e, WORD Size)
{
  int	 z;
  int      n;
  int    id;
  WORD   temp;
  WORD   code;
  BYTE   state;
  T_DATE        t_date;
  T_EVENT       t_event;
  T_LIST        t_list;
  T_IED         * p_ied;
  
  BOOL bChanged =FALSE;
  for (z =0; z < Size; z++)
  {
    	if(body_e[0]==0x80)

⌨️ 快捷键说明

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