关于遥控复归保护

来源:互联网 发布:linux双网卡配置路由 编辑:程序博客网 时间:2024/04/29 13:41

 保护遥控复归主要通过ykrstbh.par(YkResetBhPara标志)和在MyProcedureBase.c中的

1...void MyYkRstBHInit();
2...int  MyYkNoIsRstBH(USHORT yk_id);
3...STATUS MyYkRstBHSignPut(USHORT yk_id);
4...BOOL MyYkRstBHSignGet(UCHAR channel_no,short *pAddr1,short *pAddr2);

函数来实现.

 

 

void MyYkRstBHInit()
{
 BOOL read_ok;
 int  err_code;
 USHORT i;

 read_ok=MyReadParaFile(0,"/Tffs/ykrstbh.par","YkResetBhPara",
      (UCHAR *)&yk_rst,sizeof(YK_RESET_PARA),&err_code);

 if( read_ok )
 {
  /*ykrstbh.par 读取成功,'32'为本机主程序*/
  MyCheckSelfPut(32,518,0);
  yk_rst.num=( yk_rst.num>YK_RST_BH_MAX_NUM ) ? YK_RST_BH_MAX_NUM : yk_rst.num;
 }
 else
 {
  yk_rst.num=0;
 }

 for(i=0; i<MY_MAX_CHANNEL_NUM; i++)
 {
  rst_bh[i].sign=FALSE;
  rst_bh[i].addr1=-1;
  rst_bh[i].addr2=-1;
 }

 return;
}


int MyYkNoIsRstBH(USHORT yk_id)
{
 int i;

 for(i=0; i<yk_rst.num; i++)
 {
  if( yk_id == yk_rst.rec[i].yk_no ) break;
 }

 return (i >= yk_rst.num) ? -1 : i;

 

 

 

STATUS MyYkRstBHSignPut(USHORT yk_id)
{
 USHORT i;
 int  rec_off;

 rec_off=MyYkNoIsRstBH(yk_id);
 if( rec_off == -1 ) return ERROR;

 semTake(my_sem_yk_rst_bh,WAIT_FOREVER);

 if( yk_rst.rec[rec_off].bh_type != -1 )
 {
  switch( yk_rst.rec[rec_off].bh_type )
  {
   case 0: /*CAN保护*/

     rst_bh[0].sign=TRUE;
     rst_bh[0].addr1=yk_rst.rec[rec_off].addr1;
     rst_bh[0].addr2=yk_rst.rec[rec_off].addr2;

     break;
   case 1: /*Iec103保护*/

     /*网络103保护*/
     rst_bh[20].sign=TRUE;
     rst_bh[20].addr1=yk_rst.rec[rec_off].addr1;
     rst_bh[20].addr2=yk_rst.rec[rec_off].addr2;

     /*串口103保护*/
     for(i=0; i<SYSTEM_MAX_SERIAL; i++)
     {
      if( NsGetCommType(i) == NS_BH_RCS103 )
      {
       rst_bh[i+2].sign=TRUE;
       rst_bh[i+2].addr1=yk_rst.rec[rec_off].addr1;
       rst_bh[i+2].addr2=yk_rst.rec[rec_off].addr2;
      }
     }

     break;
   case 2: /*RCS_LFP保护*/

     for(i=0; i<SYSTEM_MAX_SERIAL; i++)
     {
      if( NsGetCommType(i) == NS_BH_LFP30 )
      {
       rst_bh[i+2].sign=TRUE;
       rst_bh[i+2].addr1=yk_rst.rec[rec_off].addr1;
       rst_bh[i+2].addr2=yk_rst.rec[rec_off].addr2;
      }
     }

     break;
   case 3: /*ISA_DFP保护*/

     for(i=0; i<SYSTEM_MAX_SERIAL; i++)
     {
      if( NsGetCommType(i) == NS_BH_ISA30CDT ||
          NsGetCommType(i) == NS_BH_ISA30POLLING ||
          NsGetCommType(i) == NS_BH_ISA201 ||
          NsGetCommType(i) == NS_BH_DFP )
      {
       rst_bh[i+2].sign=TRUE;
       rst_bh[i+2].addr1=yk_rst.rec[rec_off].addr1;
       rst_bh[i+2].addr2=yk_rst.rec[rec_off].addr2;
      }
     }

     break;
   case 4: /*南自94保护*/

     for(i=0; i<SYSTEM_MAX_SERIAL; i++)
     {
      if( NsGetCommType(i) == NS_BH_NZ94 )
      {
       rst_bh[i+2].sign=TRUE;
       rst_bh[i+2].addr1=yk_rst.rec[rec_off].addr1;
       rst_bh[i+2].addr2=yk_rst.rec[rec_off].addr2;
      }
     }

     break;
   /*JXY-NEED-MODIFY*/
   case 255: /*07.01.17:jxy*/
     for(i=0; i<MY_MAX_CHANNEL_NUM; i++)
     {
      rst_bh[i].sign=TRUE;
      rst_bh[i].addr1=yk_rst.rec[rec_off].addr1;
      rst_bh[i].addr2=yk_rst.rec[rec_off].addr2;
     }
     break;
   /*JXY-NEED-MODIFY-END*/
   default:
     break;
  }
 }
 else /*按介质复归,0~31号介质*/
 {
  if( yk_rst.rec[rec_off].channel_no>0 && yk_rst.rec[rec_off].channel_no<MY_MAX_CHANNEL_NUM )
  {
   rst_bh[i+2].sign=TRUE;
   rst_bh[i+2].addr1=yk_rst.rec[rec_off].addr1;
   rst_bh[i+2].addr2=yk_rst.rec[rec_off].addr2;
  }
 }

 semGive(my_sem_yk_rst_bh);
 return OK;
}

/*JXY-NEED-MODIFY*/
/*07.03.16:jxy*/

 


void MyNetPutRstBhAll(short addr1,short addr2)
{
 USHORT i;

 semTake(my_sem_yk_rst_bh,WAIT_FOREVER);

 for ( i = 0; i < MY_MAX_CHANNEL_NUM; i++ )
 {
  if ( i == 20 )
  {
   rst_bh[i].sign = FALSE;
   rst_bh[i].addr1 = addr1;
   rst_bh[i].addr2 = addr2;
  }
  else
  {
   rst_bh[i].sign = TRUE;
   rst_bh[i].addr1 = addr1;
   rst_bh[i].addr2 = addr2;
  }
 }

 semGive(my_sem_yk_rst_bh);
}

 

BOOL MyYkRstBHSignGet(UCHAR channel_no,short *pAddr1,short *pAddr2)
{
 BOOL ret_flag;

 semTake(my_sem_yk_rst_bh,WAIT_FOREVER);

 ret_flag=rst_bh[channel_no].sign;
 *pAddr1=rst_bh[channel_no].addr1;
 *pAddr2=rst_bh[channel_no].addr2;

 rst_bh[channel_no].sign=FALSE;
 rst_bh[channel_no].addr1=-1;
 rst_bh[channel_no].addr2=-1;

 semGive(my_sem_yk_rst_bh);

 return ret_flag;
}

 

 

 

 

工作过程为

利用1函数进行初始化,在初始化时首先读取对应的PAR,然后确定该PAR中的遥控数,最后按通道号将

所有通道的遥控标志和地址全部清0; 

for(i=0; i<MY_MAX_CHANNEL_NUM; i++)
 {
  rst_bh[i].sign=FALSE;
  rst_bh[i].addr1=-1;
  rst_bh[i].addr2=-1;
 }

 

 

在NsYkShell.c文件中的/*******************************************************************************************
功能:SCADA请求遥控执行或遥控撤销
参数:Port:SCADA号
   YkId:遥控号
   Cmd:NS_YK_EXE,NS_YK_CANCEL
返回:NS_SCADA_APPLY_YK_RET_OK:成功
   NS_SCADA_APPLY_YK_RET_INVALID:失败
********************************************************************************************/
static int ScadaApplyYkExe(UCHAR Port,USHORT YkId,UCHAR Cmd,UCHAR Prop)

函数调用函数2判断系统正在执行的遥控号是否为PAR中设置的遥控号,是的话返回该遥控号所在的记录号

然后调用函数3根据该记录号读取yk_rst将对应的rst_bh[i]赋值.

 

最后对应的模块通过rst_bh[i]决定是否调用函数4将rst_bh[i]中的地址读过去.

然后组织复归报文发下去.同时将rst_bh[i]标志和地址全部清零。

 

 

 

用到的头文件有

MyProcedureBase.h.定义了

SEM_ID  my_sem_yk_rst_bh; /*MyBHResetSignGet,MyBHResetSignPut函数的互斥量*/

static YK_RESET_PARA yk_rst;
static YK_RST_BH_SIGN rst_bh[MY_MAX_CHANNEL_NUM];

 

MyProcedureExt.h定义了

#define YK_RST_BH_MAX_NUM  200
typedef struct
{
 short yk_no;
 short bh_type;
 short channel_no;
 short addr1;
 short addr2;
}YK_RST_REC;

typedef struct
{
 BOOL sign;
 short addr1;
 short addr2;
}YK_RST_BH_SIGN;

typedef struct
{
 short  num;
 YK_RST_REC rec[YK_RST_BH_MAX_NUM];
 short  no_use[999];
}YK_RESET_PARA;

 

介质对应关系:

case 0: /*CAN保护*/  
case 1: /*Iec103保护*/
            /*网络103保护*/
            /*串口103保护*/
case 2: /*RCS_LFP保护*/

case 3: /*ISA_DFP保护*/

case 4: /*南自94保护*/

 

 

 

CAN 报文中第二字节对应PAR中的地址1,unit_addr对应地址2

串口103保护 addr1对应节点地址

 

 

 

 

 

PAR参数设置说明

保护遥控数:实际需要设置的遥控数目

保护复归遥控表:遥控号:实际的遥控号;

                        复归类型:CAN保护设置为0;IEC103保护(网络和串口)设置为1;LFP保护设置为2;ISA_DFP保护设置为3;南自94保护设置为4。

                        复归介质:使用复归类型时,复归介质设置为-1;否则复归类型设置为-1,复归介质对应关系为通道对应关系,CAN设置为1,串口1---16设置为2到17,以太网保护设置为20;目前代码需要做相应的修改。

                        地址1:对于串口103保护为装置地址;对于CAN保护为报文的第2字节

                        地址2:

 

原创粉丝点击