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

📄 dev103.c

📁 简单103规约程序示例
💻 C
📖 第 1 页 / 共 3 页
字号:
  p_asdu->addr = p_ied->dev_id;//(BYTE)p_ied->dev_data[0];
  p_asdu->fun =254;
  p_asdu->inf =241;//241
  p_asdu->data[0] =m_c103_rii++;
  p_asdu->data[1] =1;//NOD
  p_asdu->data[2] =ginl;
  p_asdu->data[3] =ginh;
  p_asdu->data[4] =kod;

  for(i=0;i<3;i++)
  {
    t_frame.type = FRAME_T_VOL;
    t_frame.contral = 0x53;
    t_frame.address = p_ied->dev_id;//(BYTE)p_ied->dev_data[0];
    t_frame.len =13;
    t_frame.endbyte =0x16;
    if(c103_serial_com(p_ied,&t_frame,1))
    {
      //注意通用分类读后必须请求一级数据
      if(t_frame.type ==0x10  && m_rx_buf[1]==0x20)
      {
        if(c103_request_first(p_ied))
        {
          return true;
        }
      }
    }
  }
  return false;
}
//===================================================================
/* 主站ASDU10带确认写一个(组/条目)的值 */
/*	p_ied:	设备标识
ngd:	通用数据数目
*/
static BOOL c103_generic_ackwrite(T_IED *p_ied, BYTE ngd, BYTE len)
{
  T_C103_FRAME t_frame;
  T_C103_ASDU* p_asdu;

  /* 加入ASDU10通用分类数据写报文头 */
  p_asdu =(T_C103_ASDU *)&m_tx_buf[6];
  p_asdu->type =10;
  p_asdu->vsq =0x81;
  p_asdu->cot =40;
  p_asdu->addr = (BYTE)p_ied->dev_data[0];
  p_asdu->fun =254;
  p_asdu->inf =249;
  p_asdu->data[0] =m_c103_rii++;
  p_asdu->data[1] =ngd;

  /* 帧格式 */
  t_frame.type = FRAME_T_VOL;
  t_frame.contral = 0x53;
  t_frame.address = (BYTE)p_ied->dev_data[0];
  t_frame.len = len;
  t_frame.endbyte =0x16;

  if (c103_serial_com(p_ied, &t_frame, 1))
  {
    if (t_frame.type ==0x10 && t_frame.contral ==0x21
      && t_frame.address ==p_ied->dev_data[0])		//接收数据识别
    {
      c103_request_first(p_ied);
    }
    if (t_frame.type ==0x68 && t_frame.contral ==0
      && t_frame.address ==p_ied->dev_data[0])
    {
      p_asdu =(T_C103_ASDU *) &m_rx_buf[6];
      /* 校验ASDU信息 */
      if ((p_asdu->cot != 44) || (p_asdu->fun != 254) || (p_asdu->inf != 249))
      {
        return false;
      }
      return true;
    }
  }
  else
    return false;
}
//===================================================================
/* 主站ASDU10带执行写一个(组/条目)的值 */
/*	p_ied:	设备标识
ngd:	通用数据数目
*/
static BOOL c103_generic_exewrite(T_IED *p_ied, BYTE ngd, BYTE len)
{
  T_C103_FRAME t_frame;
  T_C103_ASDU* p_asdu;

  /* 加入ASDU10通用分类数据写报文头 */
  p_asdu =(T_C103_ASDU *) &m_tx_buf[6];
  p_asdu->type=10;
  p_asdu->vsq =0x81;
  p_asdu->cot =40;
  p_asdu->addr= (BYTE)p_ied->dev_data[0];
  p_asdu->fun =254;
  p_asdu->inf =250;
  p_asdu->data[0] =m_c103_rii++;
  p_asdu->data[1] =ngd;


  /* 帧格式 */
  t_frame.type = FRAME_T_VOL;
  t_frame.contral = 0x53;
  t_frame.address = (BYTE)p_ied->dev_data[0];
  t_frame.len = len;
  t_frame.endbyte =0x16;

  if (c103_serial_com(p_ied, &t_frame, 1))
  {
    if (t_frame.type ==0x10 && t_frame.contral ==0x21
      && t_frame.address ==p_ied->dev_data[0])
    {
      c103_request_first(p_ied);
    }
    if (t_frame.type ==0x68 && t_frame.contral ==0
      && t_frame.address ==p_ied->dev_data[0])
    {
      p_asdu =(T_C103_ASDU *)m_rx_buf[6];
      /* 校验ASDU信息 */
      if ((p_asdu->cot != 40) || (p_asdu->fun != 254) || (p_asdu->inf != 250))
      {
        return false;
      }
      return true;
    }
  }
  else
    return false;
}
//===================================================================
//保护采样通道值
BOOL c103_get_analog(T_IED *p_ied, T_CHANNEL *p_chn)
{
  T_C103_ASDU *p_asdu;
  BYTE		i;
  T_C103_DATA *p_rec;

  // 解析数据
  p_asdu =(T_C103_ASDU *)&m_tx_buf[6];

  if ( !c103_generic_read(p_ied, 0x09, 0x00, 0x01) )
  {
    return FALSE;
  }

  p_asdu =(T_C103_ASDU *) &m_rx_buf[6];

  p_chn->chn_num =p_asdu->data[1];
  if (p_chn->chn_num > SYS_MAX_CHANNEL)
  {
    p_chn->chn_num =SYS_MAX_CHANNEL;
  }
  p_rec =(T_C103_DATA *)&p_asdu->data[2];

  for (i =0; i < p_chn->chn_num; i++)
  {
    if ((p_rec->ginh != 0x02) || (p_rec->kod != 0x01) || (p_rec->num != 1))
    {
      return FALSE;
    }

    if (p_rec->type == 0x40)
    {
      float f_val;
      f_val = MAKEWORD(p_rec->data[0],p_rec->data[1]) /100.0;
      p_chn->chn_val[i] =f_val;
    }
    else
    {
      p_chn->chn_val[i] =(float)p_rec->data[0];
    }
    p_rec =(T_C103_DATA *)((BYTE *)p_rec+6+p_rec->num*p_rec->size);
  }
  return TRUE;
}
//===================================================================
//选择当前操作定值区
static BOOL c103_select_zone(T_IED *p_ied, BYTE set_no)
{
  BYTE len;
  T_C103_ASDU *p_asdu;
  T_C103_DATA *p_rec;
  BYTE		ngd =1;

  p_asdu =(T_C103_ASDU *)&m_tx_buf[6];

  p_rec =(T_C103_DATA *)&p_asdu->data[2];
  p_rec->ginh	=0;
  p_rec->ginl	=2;
  p_rec->kod	=1;
  p_rec->type	=3;
  p_rec->size	=1;
  p_rec->num	=1;
  p_rec->data[0] =set_no;

  len =17;

  if ( !c103_generic_exewrite(p_ied, ngd, len) )
  {
    return false;
  }

  p_asdu =(T_C103_ASDU *) &m_rx_buf[6];
  p_rec  =(T_C103_DATA *)&p_asdu->data[2];

  if ((p_rec->ginh != 0) || (p_rec->ginl != 2) || (p_rec->kod != 1))
  {
    return false;
  }
  return (p_rec->data[0] == set_no);
}
//===================================================================
//定值类服务
BOOL c103_get_setting(T_IED *p_ied, T_SET *p_set)
{
  T_C103_ASDU* p_asdu;
  T_C103_DATA* p_rec;
  BYTE		i,j;
  BYTE		set_num;
  BYTE		flag_con;
  BYTE		ginh,ginl,kod;

  ginh = 0x00;
  ginl = p_ied->dev_data[1];
  kod  = 0x01;

  p_asdu =(T_C103_ASDU *)&m_tx_buf[6];

  if(!c103_generic_read(p_ied, ginl, ginh, kod))
  {
    return FALSE;
  }
  //解析数据
  p_set->set_num = 0;
  do
  {
    p_asdu =(T_C103_ASDU *)&m_rx_buf[6];
    set_num = p_asdu->data[1] & 0x3f;
    p_set->set_num += set_num;
    flag_con = p_asdu->data[1] & 0x80;//是否还有未上送完的数据
    if (p_set->set_num >= SYS_MAX_SET)
    {
      p_set->set_num =SYS_MAX_SET;
      flag_con = 0;
    }
    p_rec =(T_C103_DATA *)&p_asdu->data[2];

    for (i =0; i < set_num; i++)
    {
      if((p_rec->ginh != 0x01) && (p_rec->kod != 0x01)  || (p_rec->num != 1))
      {
        return false;
      }
      j=p_rec->ginl;//定值项序号
      if (p_rec->type == 0x07)
      {
        float f_val;
        gen_scan_float(p_rec->data, &f_val);//定值格式转换
        p_set->set_val[j].type =SET_T_FLOAT;
        p_set->set_val[j].un_val.f_val =f_val;
      }
      else
      {
        if (p_rec->size == 0x02)
        {
          p_set->set_val[j].type =SET_T_UINT;
          p_set->set_val[j].un_val.u_val =MAKEWORD(p_rec->data[0],p_rec->data[1]);
        }
        else
        {
          p_set->set_val[j].type =SET_T_UINT;
          p_set->set_val[j].un_val.u_val =p_rec->data[0];
        }
      }
      p_rec =(T_C103_DATA *)((BYTE *)p_rec+6+p_rec->num*p_rec->size);
    }
    if(flag_con != 0)
    {
      c103_request_first( p_ied);
    }
  }while(flag_con != 0);
  return true;
}
//===================================================================
BOOL c103_get_zone(T_IED *p_ied, WORD *p_set_no)
{
  T_C103_ASDU *p_asdu;
  T_C103_DATA *p_rec;

  p_asdu =(T_C103_ASDU *)&m_tx_buf[6];

  if ( !c103_generic_read(p_ied, 0x02, 0x01, 0x01))
  {
    return false;
  }

  p_asdu =(T_C103_ASDU *)&m_rx_buf[6];
  p_rec  =(T_C103_DATA *)&p_asdu->data[2];

  if ((p_rec->ginh != 0x00) || (p_rec->ginl != 0x03) || (p_rec->kod != 0x01))
  {
    return false;
  }

  *p_set_no =p_rec->data[0];

  return true;
}
//===================================================================
//软压板类服务
BOOL c103_get_sfc(T_IED *p_ied)
{
  T_C103_ASDU* p_asdu;
  T_C103_DATA* p_rec;
  T_SFC t_sfc;
  BYTE		i;

  p_asdu =(T_C103_ASDU *)&m_tx_buf[6];

  if(!c103_generic_read(p_ied, 0x06, 0x00, 0x01))
  {
    return FALSE;
  }

  p_asdu =(T_C103_ASDU *)&m_rx_buf[6];
  /* 解析数据 */
  t_sfc.sfc_num =p_asdu->data[1];
  if (t_sfc.sfc_num > SYS_MAX_SFC)
  {
    t_sfc.sfc_num =SYS_MAX_SFC;
  }
  p_rec =(T_C103_DATA *)&p_asdu->data[2];

  for (i =1; i <= t_sfc.sfc_num; i++)
  {
    if ((p_rec->ginh != 0x03) || (p_rec->kod != 0x01) || (p_rec->num != 1))
    {
      return FALSE;
    }
    if ( (p_rec->data[0] /0x32) == 0x01 )
    {
      INF_Preset_SFC(&t_sfc, i, INF_S_ON);
    }
    else if  ( (p_rec->data[0] /0x32) == 0x02 )
    {
      INF_Preset_SFC(&t_sfc, i, INF_S_OFF);
    }
    p_rec =(T_C103_DATA *)((BYTE *)p_rec+6+p_rec->num*p_rec->size);
  }

  INF_Set_SFC(p_ied->dev_id, &t_sfc);
  return TRUE;
}
//===================================================================
//遥控类服务[最小遥控点号 =1]
BOOL c103_check_control(T_IED *p_ied, WORD ctrl_no)
{
  T_C103_ASDU	*p_asdu;
  T_C103_FRAME t_frame;
  BYTE ginl =(ctrl_no+1)/2;
  BYTE dpi  =((ctrl_no % 2) != 0)?0x01:0x02;

  p_asdu =(T_C103_ASDU *)&m_tx_buf[6];

  p_asdu->type = ASDU64;
  p_asdu->vsq = 0x01;
  p_asdu->cot = 0x0c;
  p_asdu->addr = (BYTE)p_ied->dev_data[0];
  p_asdu->fun = CTRL_FIRST_FUN;
  p_asdu->inf = CTRL_FIRST_INF + ginl;
  p_asdu->data[0] = dpi|0x80;
  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.address == p_ied->dev_data[0]&&(t_frame.contral &0x20) != 0)
    {
      if(c103_request_first(p_ied))
      {
        p_asdu =(T_C103_ASDU *)&m_rx_buf[6];
        if(p_asdu->type == ASDU64 && p_asdu->cot == 0x0c &&p_asdu->data[0] == (dpi|0x80))
          return TRUE;
        else
          return FALSE;
      }
      else
        return FALSE;
    }
    else
    {
      if(c103_request_second(p_ied))
      {
        p_asdu =(T_C103_ASDU *)&m_rx_buf[6];
        if(p_asdu->type == ASDU64 && p_asdu->cot == 0x0c &&p_asdu->data[0] == (dpi|0x80))
          return TRUE;
        else
          return FALSE;
      }
      else
        return FALSE;
    }
  }
  else
    return FALSE;
}
//===================================================================
BOOL c103_remote_control(T_IED *p_ied, WORD ctrl_no)
{
  T_C103_FRAME t_frame;
  T_C103_ASDU	*p_asdu;
  BYTE		ginl =(ctrl_no+1)/2;
  BYTE		dpi  =((ctrl_no % 2) != 0)?0x01:0x02;

  p_asdu =(T_C103_ASDU *)&m_tx_buf[6];

  p_asdu->type = ASDU64;
  p_asdu->vsq	 = 0x01;
  p_asdu->cot	 = 0x0c;
  p_asdu->addr = (BYTE)p_ied->dev_data[0];
  p_asdu->fun	 = CTRL_FIRST_FUN;
  p_asdu->inf	 = CTRL_FIRST_INF + ginl;
  p_asdu->data[0] = dpi;
  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.address == p_ied->dev_data[0])
    {
      if(c103_request_first(p_ied))
      {
        p_asdu =(T_C103_ASDU *)&m_rx_buf[6];

⌨️ 快捷键说明

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