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

📄 dev103.c

📁 简单103规约程序示例
💻 C
📖 第 1 页 / 共 3 页
字号:
        if(p_asdu->type == ASDU64 && p_asdu->cot == 0x0c &&p_asdu->data[0] == dpi)
          return TRUE;
        else
          return FALSE;
      }
      else
      {
        return FALSE;
      }
    }
  }
  else
    return FALSE;
}
//===================================================================
/* 信号复归 */
BOOL c103_reset_signal(T_IED *p_ied)
{
  T_C103_ASDU* p_asdu;
  T_C103_FRAME t_frame;

  /* 执行信号复归 */
  p_asdu =(T_C103_ASDU *)&m_tx_buf[6];
  p_asdu->type =20;
  p_asdu->vsq	=0x81;
  p_asdu->cot	=20;
  p_asdu->addr = (BYTE)p_ied->dev_data[0];
  p_asdu->fun	= (BYTE)p_ied->dev_type;
  p_asdu->inf	= 19;
  p_asdu->data[0] =0x01;
  p_asdu->data[1] =m_c103_rii++;

  t_frame.type = FRAME_T_VOL;
  t_frame.contral = 0x53;		//发送/确认
  t_frame.address = (BYTE)p_ied->dev_data[0];
  t_frame.len =10;
  t_frame.endbyte =0x16;

  if (c103_serial_com(p_ied, &t_frame, 1))
  {
    if (t_frame.type ==0x10 && (t_frame.contral &0xF0) ==0x20 && t_frame.address ==p_ied->dev_data[0])
    {
      c103_request_first(p_ied);
    }
    p_asdu =(T_C103_ASDU *)&m_rx_buf[6];
    if ( (t_frame.contral &0x0F) == 0 && p_asdu->cot == 20 && p_asdu->inf == 19)
    {
      return true;
    }
  }
  else
    return false;
}
//===================================================================
/* 时间服务 */
BOOL c103_set_clock(T_IED *p_ied, const T_DATE *p_date)
{
  T_C103_ASDU* p_asdu;
  T_C103_FRAME t_frame;

  /* 时间同步报文 */
  p_asdu =(T_C103_ASDU *)&m_tx_buf[6];
  p_asdu->type =6;
  p_asdu->vsq  =0x81;
  p_asdu->cot  =8;
  p_asdu->addr = 0xFF;
  p_asdu->fun  =255;
  p_asdu->inf  =0;
  p_asdu->data[0] =LOBYTE(p_date->msec);
  p_asdu->data[1] =HIBYTE(p_date->msec);
  p_asdu->data[2] =p_date->minute;
  p_asdu->data[3] =p_date->hour;
  p_asdu->data[4] =((p_date->week << 5) & 0xE0) | (p_date->day & 0x1F);
  p_asdu->data[5] =p_date->month;
  p_asdu->data[6] =p_date->year - 2000;

  t_frame.type = FRAME_T_VOL;
  t_frame.contral = 0x44;			//发送/无回答
  t_frame.address = 0xFF;
  t_frame.len =15;
  t_frame.endbyte =0x16;

  m_c103_fcb[p_ied->dev_id] =0x20;

  c103_serial_com(p_ied, &t_frame, 0);

  SYS_Set_Clock(p_date);

  return TRUE;
}
//===================================================================
/* 协议初始化 */
static BOOL c103_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 =c103_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_c103_task, "TASK_C103", task_c103, 0, NU_NULL,
    m_c103_stack, 0x2000, 10, 0, NU_PREEMPT, NU_START);

  return (status == NU_SUCCESS);
}
//===================================================================
/* 设备初始化 */
static BOOL c103_open_ied(T_IED *p_ied)
{
  return true;
}
//===================================================================
/* 设备描述表 */
BOOL c103_get_List(T_IED *p_ied, T_LIST* p_list)
{
  int i;
  for(i=0;i<g_c103_code_size;i++)
  {
    if(p_ied->user_defined_1==g_c103_code[i].dev_type)
    {
      switch(p_list->l_type)
      {
      case LIST_T_SET:
        {
          p_list->l_ptr = g_c103_code[i].p_setting;
          p_list->l_size = g_c103_code[i].w_setting;
          return true;
        }
      case LIST_T_EVENT:
        {
          p_list->l_ptr = g_c103_code[i].p_event;
          p_list->l_size = g_c103_code[i].w_even;
          return true;
        }
      case LIST_T_ALARM:
        {
          p_list->l_ptr = g_c103_code[i].p_alarm;
          p_list->l_size = g_c103_code[i].w_alarm;
          return true;
        }
        return false;
      }
    }
  }
  return false; //hu?
}
//===================================================================
/* 取103条目号 */
static WORD C103_Get_Code(T_IED* p_ied, T_LIST* p_list, WORD code)
{
  if(c103_get_List(p_ied,p_list))
  {
    switch(p_list->l_type)
    {
    case  LIST_T_EVENT:
      {
        int i;
        T_EVENT_ENTRY* p_event = (T_EVENT_ENTRY*) p_list->l_ptr;
        for(i = 0; i< p_list->l_size; i++)
        {
          if(p_event[i].e_key == code)
            return i+1;
        }
      }
    case LIST_T_ALARM:
      {
        int i;
        T_ALARM_ENTRY* p_alarm = (T_ALARM_ENTRY*) p_list->l_ptr;
        for(i = 0; i< p_list->l_size; i++)
        {
          if(p_alarm[i].e_key  == code)
            return i+1;
        }
      }
    case LIST_T_SET:
      {
        int i;
        T_SET_ENTRY* p_set = (T_SET_ENTRY*) p_list->l_ptr;
        for(i = 0; i< p_list->l_size; i++)
        {
          if(p_set[i].e_key  == code)
            return i+1;
        }
      }
    }
  }
  return 0;
}
//===================================================================
/* 103设备服务接口 */
BOOL c103_service(T_IED *p_ied, T_MESSAGE *p_msg)
{
  BOOL  ret_code =FALSE;
  /* [初始化部分] */
  switch(p_msg->m_type)
  {
  case MSG_T_INIT:
    /* 初始化协议 */
    return c103_initialize();
  case MSG_T_OPEN:
    /* 初始化设备 */
    return c103_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 = c103_get_setting(p_ied, (T_SET *)p_msg->m_data);
    }
    break;
  case MSG_T_ZONE:
    if(p_msg->m_flag == MSG_F_READ)
    {
      ret_code = c103_get_zone(p_ied, (WORD *)p_msg->m_data);
    }
    break;
  case MSG_T_SFC:
    if(p_msg->m_flag == MSG_F_READ)
    {
      ret_code = c103_get_sfc(p_ied);
    }
    break;
  case MSG_T_CTRL:
    if(p_msg->m_flag == MSG_F_CHECK)
    {
      ret_code = c103_check_control(p_ied, (WORD) p_msg->m_data);
    }
    if (p_msg->m_flag == MSG_F_WRITE)
    {
      ret_code = c103_remote_control(p_ied, (WORD) p_msg->m_data);
    }
    break;
  case MSG_T_SIGNAL:
    /* 信号复归 */
    if(p_msg->m_flag == MSG_F_WRITE)
    {
      ret_code = c103_reset_signal(p_ied);
    }
    break;
  case MSG_T_ANALOG:
    if(p_msg->m_flag == MSG_F_READ)
    {
      ret_code = c103_get_analog(p_ied, (T_CHANNEL *)p_msg->m_data);
    }
    break;
  case MSG_T_CLOCK:
    // 广播对时
    if(p_msg->m_flag == MSG_F_WRITE)
    {
      ret_code = c103_set_clock(p_ied, (T_DATE *)p_msg->m_data);
    }
    break;
  default:
    break;
  }
  //开放通讯资源
  DEV_UNLOCK_COM();
  return ret_code;
}
//===================================================================
//复位通信单元
BOOL c103_reset_cu(T_IED* p_ied)
{
  T_C103_FRAME t_frame;

  t_frame.type =FRAME_T_CON;
  t_frame.contral =0x40;			//复位通信单元
  t_frame.address = (BYTE)p_ied->dev_data[0];
  t_frame.endbyte =0x16;

  m_c103_fcb[p_ied->dev_id] =0x20;		//使帧计数位常为0

  if(c103_serial_com_init(p_ied, &t_frame,1))
  {
    if((t_frame.contral &0x0F) == 0)	//确认响应
    {

      if((t_frame.contral &0x20) != 0)		//判别响应帧
      {
        return c103_request_first(p_ied);
      }
      else
      {
        return c103_request_second(p_ied);	//请求二级用户数据
      }
    }
  }
  else
    return false;
}
//===================================================================
/* 复位帧计数位 */
BOOL c103_reset_fcb(T_IED* p_ied)
{
  T_C103_FRAME t_frame;

  t_frame.type =FRAME_T_CON;
  t_frame.contral =0x47;			//复位帧计数位
  t_frame.address = (BYTE)p_ied->dev_data[0];
  t_frame.endbyte =0x16;

  m_c103_fcb[p_ied->dev_id] =0x20;		//使帧计数位常为0

  if (c103_serial_com(p_ied, &t_frame, 1))
  {
    if ( (t_frame.contral &0x0F) == 0 )	//确认响应
    {
      if ( (t_frame.contral &0x20) != 0)//判别响应帧
      {
        return c103_request_first(p_ied);
      }
      else
      {
        return c103_request_second(p_ied);	//请求二级用户数据
      }
    }
  }
  else
    return false; //hu
}
//===================================================================
//总查询
BOOL c103_request_gi(T_IED* p_ied)  //asdu07
{
  T_C103_FRAME t_frame;
  T_C103_ASDU* p_asdu;

  p_asdu =(T_C103_ASDU *)&m_tx_buf[6];
  p_asdu->type =7;
  p_asdu->vsq =0x81;
  p_asdu->cot =9;
  p_asdu->addr = (BYTE)p_ied->dev_data[0];
  p_asdu->fun =C103_FUN_GLB;
  p_asdu->inf =0;
  p_asdu->data[0] =m_c103_sn++;

  t_frame.type =FRAME_T_VOL;
  t_frame.address = (BYTE)p_ied->dev_data[0];
  t_frame.len =9;
  t_frame.contral =0x53;	//发送/确认
  t_frame.endbyte =0x16;

  if(c103_serial_com_init(p_ied, &t_frame,1))
  {
    if((t_frame.contral&0x0F)==0)
    {
      //确认响应
      if((t_frame.contral&0x20)!=0)
      {
        //判别响应帧
        return c103_request_first(p_ied);
      }
      else
      {
        return c103_request_second(p_ied);	//请求二级用户数据
      }
    }
  }
  else
    return false;
}
//===================================================================
/* 上电初始化 */
BOOL c103_device_initialize(T_IED* p_ied)
{
  //复位通信单元
  if(!c103_reset_cu(p_ied))
    return false;

  //复位帧计数位
  /*
  if(!c103_reset_fcb(p_ied))
  {
    return false;
  }
  */

  if(!c103_request_gi(p_ied) )  //总查询
  {
    return false;
  }
  return true;
}
//===================================================================
/* module's task */
VOID task_c103(UNSIGNED argc, VOID *argv)
{
  T_IED *p_ied;
  T_DI   yx;

  p_ied = DEV_First_IED();

      DEV_LOCK_COM();
      //每次上电初始化遥信库,否则召唤全遥信可能出错
      yx.di_num=64;
      yx.di_val[0]=yx.di_val[1]=0;
      INF_Set_Di(p_ied->dev_id,&yx);
      //复归链路并进行总召唤
      c103_device_initialize(p_ied);
      DEV_UNLOCK_COM();

loop:
  p_ied =DEV_First_IED();

      //如果初始化装置成功.则进行2级数据的访问,否则继续初始化
      DEV_LOCK_COM();
      if(p_ied->dev_flag == DEV_F_ONLINE)
        c103_request_second(p_ied);
      else
        c103_device_initialize(p_ied);
      DEV_UNLOCK_COM();


  goto loop;
}

⌨️ 快捷键说明

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