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

📄 ysdrv.c

📁 在Unix平台下完成的电力系统广发使用的IEC103规约的程序
💻 C
字号:
#include "iec103.h"

char           myprocessname[NAME_SIZE+1];
char           mynodename[NAME_SIZE+1];
char           strategy[NAME_SIZE+1];
char           hostname[NAME_SIZE+1];
char           com_tagname[NAME_SIZE+1];
char           diag_tag[NAME_SIZE+1];
char           IEC_TAGNAME[NAME_SIZE+1];
audio_msg      Audio;

SENDDEF        SendDef;
RCVDEF         RcvDef;
MSG_BUF        SendMsg;
MSG_BUF        RcvMsg;
char           recv_data[ BUFSIZE ];

IODEF         *pIODEF;
IECDEF        *pIECDEF[MaxBHNum],*pIEC;
char          *pStr;
int           BhCount,*pBH_Index;
int           GRP[MaxGRPNum];

unsigned      port,RcvTimeOut,IONumber,IECInitMark;
short         AddrIEC;
SHM_BH_DEF    *shm_bh_buf_r;
SHM_BH_DEF1   *shm_bh_buf_w[MaxBHNum];

extern int          fd;
extern char         *rGetSharedMemory();
extern SysDef       *pSysDef;
extern PORT_DEF      port_def[];

extern void RcvTimeOut_hnd();
extern void alarm_handler();
extern void exit_exe();

struct timeb NowTime,EnqTime,ClkTime,FltTest,ValTime;

main(argc,argv)
int argc;
char *argv[];
{
char *pSHM;
int i;

   if ( (argc!=3) && (argc!=4) ) {
      printf("Command Syntax ----- ysdrv com<11-48> TAGNAME [on|off]\n");
      printf("Invalid argc ------- %s\n",argv[0]);
      exit(0);
   }
   port=1;
   while (strcmp(port_def[port].alias,"")!=0)
   {
      if (strcmp(port_def[port].alias,argv[1])==0) break;
      else port++;
   }
   if (strcmp(port_def[port].alias,"")==0) {
      printf("Command Syntax ----- ysdrv com<11-48> TAGNAME [on|off]\n");
      printf("Invalid argument --- %s\n",argv[1]);
      exit(0);
   }
   sprintf(myprocessname,"%s_%s",argv[0],argv[1]);
   strcpy(IEC_TAGNAME,argv[2]);
   get_local_name(hostname);
   if (InitSharedMemory()==-1) {
      printf("InitSharedMemory Failurei --- %s_%s\n",argv[0],argv[1]);
      exit(0);
   }
   if (get_local_aliasname(mynodename)==-1) {
      printf("get_local_aliasname Failure---%s_%s\n",argv[0],argv[1]);
      exit_exe();
   }
   if (get_local_strategy(strategy)==-1) {
      printf("get_local_strategy Failure---%s_%s\n",argv[0],argv[1]);
      exit_exe();
   }
   if (msg_init(myprocessname)==-1) {
      printf("Msg_init failure---%s\n",myprocessname);
      exit_exe();
   }
   get_diag_tag(hostname,diag_tag);

   init_sighandler();
   open_device();
   init_device();
   rLoadDataBase();
   BH_CREATE_SHM_BUF();

   pIEC->DFC     = NO;
   pIEC->ACD     = NO;
   pIEC->CU_Reset= 1;
   pIEC->ClkSet  = 1;
   pIEC->Status  = NODE_ON;
   if (argc==3) pIEC->Display=0;
   else
      if (strcmp(argv[3],"on")==0) pIEC->Display=1;

   setsid();

   main_loop();

}

main_loop()
{
int i,j;
unsigned char addr;

   while (1)
   {
      if (get_redundant_flag(hostname) == 1) {
          if( RxDrvCheckProc()>0 ){
             dbmIEC();
             if (RcvDef.Buf[0] == LPCI_STX){
                 addr = RcvDef.Buf[9];
                 if( addr < MaxBHNum && pBH_Index[addr] != -1)
                     WriteBhShmProc(pBH_Index[addr]);
             }
          }
          ms_sleep(200);
      }
      else{
         ioctl(fd,TCFLSH,0);
         if( shm_bh_buf_r != (SHM_BH_DEF *)-1 ){
             shm_bh_buf_r->rptr = shm_bh_buf_r->wptr;
             shm_bh_buf_r->oflag = 0;
         }
         ms_sleep(500);
      }
   }
}

SendStatusToPeer(code,addr)
unsigned char   code,addr;
{
   MSG_BUF   sbuf;

   if (code == NODE_ON)
        sbuf.function_code = MSG_IEC_STATUS_ON;
   else sbuf.function_code = MSG_IEC_STATUS_OFF;
   strcpy((char *)sbuf.dest_node_name,mynodename);
   strcpy((char *)sbuf.dest_proc_name,myprocessname);
   sbuf.status_flags = addr;
   sbuf.msg_size = 0;
   sbuf.msg_data = 0;
   if(msg_send(&sbuf,0,8,1,0) < 0)
      printf("%s send: Network Sending Error----.\n",myprocessname);
}

IEC_Status_Proc()
{
unsigned char relay_addr;

   printf("recv msg from node=%s  proc=%s\n",
         RcvMsg.orig_node_name,RcvMsg.orig_proc_name);

   relay_addr = RcvMsg.status_flags;

   switch (RcvMsg.function_code)
   {
      case MSG_IEC_STATUS_ON:
         pIECDEF[relay_addr]->Status = NODE_ON;
         break;
      case MSG_IEC_STATUS_OFF:
         pIECDEF[relay_addr]->Status = NODE_OFF;
         break;
      default:
         printf("Error Set Modify Command by Node=%s Proc=%s\n",
                 RcvMsg.orig_node_name,RcvMsg.orig_proc_name);
         break;
   }
}

M_CON_NA_3()  /* Confirm */
{

   memset(SendDef.Buf,0,MaxSendBuf);

   SendDef.Buf[0]   = LPCI_SYN;
   SendDef.Buf[1]   = M_CON_NA | pIEC->ACD;
   SendDef.Buf[2]   = pIEC->IODef.OCCNO;
   SendDef.Buf[3]   = sum( &(SendDef.Buf[1]),2 );
   SendDef.Buf[4]   = LPCI_ETX;
   SendDef.SendSize = 5;
}

M_NV_NA_3()  /* No Request data */
{

   memset(SendDef.Buf,0,MaxSendBuf);

   SendDef.Buf[0]   = LPCI_SYN;
   SendDef.Buf[1]   = M_NV_NA | pIEC->ACD;
   SendDef.Buf[2]   = pIEC->IODef.OCCNO;
   SendDef.Buf[3]   = sum( &(SendDef.Buf[1]),2 );
   SendDef.Buf[4]   = LPCI_ETX;
   SendDef.SendSize = 5;

}

M_LKR_OK_3()  /* Link Status OK */
{

   memset(SendDef.Buf,0,MaxSendBuf);

   SendDef.Buf[0]   = LPCI_SYN;
   SendDef.Buf[1]   = M_LKR_OK | pIEC->ACD;
   SendDef.Buf[2]   = pIEC->IODef.OCCNO;
   SendDef.Buf[3]   = sum( &(SendDef.Buf[1]),2 );
   SendDef.Buf[4]   = LPCI_ETX;
   SendDef.SendSize = 5;

}

MakeMailPrep(len)
int len;
{
   SendDef.Buf[4]     = SendDef.Buf[4] | pIEC->ACD;
   SendDef.Buf[5]     = pIEC->IODef.OCCNO;
   SendDef.Buf[len-2] = sum( &(SendDef.Buf[4]),SendDef.Buf[1] );
   SendDef.SendSize   = len;
}

M_PL1_NA_3()   /* Send P1 Data */
{
   int rptr,len;

   rptr = shm_bh_buf_r->rptr;

   if( rptr != shm_bh_buf_r->wptr ) {
     memset(SendDef.Buf,0,MaxSendBuf);
     if( shm_bh_buf_r->data[rptr].type != 0 ){
        SendDef.Buf[0]   = LPCI_STX;
        SendDef.Buf[1]   = shm_bh_buf_r->data[rptr].len + 6;
        SendDef.Buf[2]   = shm_bh_buf_r->data[rptr].len + 6;
        SendDef.Buf[3]   = LPCI_STX;
        SendDef.Buf[4]   = 0x08;
        SendDef.Buf[5]   = pIEC->IODef.OCCNO;
        SendDef.Buf[6]   = 196;
        SendDef.Buf[7]   = 0x81;
        SendDef.Buf[8]   = 0x01;
        SendDef.Buf[9]   = shm_bh_buf_r->data[rptr].addr;
        memcpy(&SendDef.Buf[10],shm_bh_buf_r->data[rptr].buf,shm_bh_buf_r->data[rptr].len);
        SendDef.Buf[11+shm_bh_buf_r->data[rptr].len] = LPCI_ETX;
        len = shm_bh_buf_r->data[rptr].len + 12;
     }
     else{
        memcpy(SendDef.Buf,shm_bh_buf_r->data[rptr].buf,shm_bh_buf_r->data[rptr].len);
        len = shm_bh_buf_r->data[rptr].len;
     }
     rptr = (rptr + 1) % (BH_BUF_NUM * 4);
     if( rptr != shm_bh_buf_r->wptr )  pIEC->ACD = LPCI_ACD;
     else pIEC->ACD = NO;
     MakeMailPrep(len);
     shm_bh_buf_r->rptr = rptr;
   }
   else{
     M_NV_NA_3();
   }
}

dbmIEC()
{
   unsigned char code;


   if( RcvDef.Buf[0] == LPCI_SYN )  code = RcvDef.Buf[1];
   else   code = RcvDef.Buf[4];

   if( (code & 0x0f) == C_SYN_NK ) return;

   if( pIEC->CU_Reset == 1 ){
       pIEC->CU_Reset = 0 ;
       pIEC->DFC = (code & LPCI_FCB);
   }
   else{
       if( (code & LPCI_FCV) != 0 ){
          if( pIEC->DFC == (code & LPCI_FCB) ){
              TxDriver(SendDef.Buf,SendDef.SendSize);
              return;
          }
          pIEC->DFC ^= LPCI_FCB;
       }
   }

   if( shm_bh_buf_r == (SHM_BH_DEF *)-1 ) return;

   if( shm_bh_buf_r->oflag == 1 ||
       shm_bh_buf_r->rptr != shm_bh_buf_r->wptr ) {
     if( shm_bh_buf_r->oflag == 1 ){
        shm_bh_buf_r->rptr = shm_bh_buf_r->wptr;
        shm_bh_buf_r->oflag = 0;
        pIEC->ACD = NO;
     }
     else
        pIEC->ACD = LPCI_ACD;
   }

   if( pIEC->Display == 1 )
       printf("YS read: rptr=%d---wptr=%d---\n",shm_bh_buf_r->rptr,shm_bh_buf_r->wptr);

   switch(code&0x0f)
   {
    case C_RCU_NA:
    case C_RFB_NA:
                  pIEC->CU_Reset = 1;
                  M_CON_NA_3();
                  TxDriver(SendDef.Buf,SendDef.SendSize);
                  break;
    case C_SND_AK:
                  M_CON_NA_3();
                  TxDriver(SendDef.Buf,SendDef.SendSize);
                  break;
    case C_RLK_NA:
                  M_LKR_OK_3();
                  TxDriver(SendDef.Buf,SendDef.SendSize);
                  break;
    case C_PL1_NA:
                  M_PL1_NA_3();
                  TxDriver(SendDef.Buf,SendDef.SendSize);
                  break;
    case C_PL2_NA:
                  M_NV_NA_3();
                  TxDriver(SendDef.Buf,SendDef.SendSize);
                  break;
    default:
                  break;
   }

}


WriteBhShmProc(instno)
unsigned char instno;
{
   int rptr,wptr,length;

   if( RcvDef.Buf[0] == LPCI_SYN ) return;
   if( RcvDef.Buf[0] == LPCI_STX && (RcvDef.Buf[6] == 0x05 || RcvDef.Buf[6] == C_SYN_TA) ) return;

   if( shm_bh_buf_w[instno] == (SHM_BH_DEF1 *)-1 ) return;

   if( pIEC->Display == 1 )
       printf("YS write: instno=%d---rptr=%d---wptr=%d---oflag=%d---\n",instno,shm_bh_buf_w[instno]->rptr,
                         shm_bh_buf_w[instno]->wptr,shm_bh_buf_w[instno]->oflag);

   if(RcvDef.Buf[6] == 196)
     length = RcvDef.Buf[1] - 6;
   else
     length = RcvDef.Buf[1] + 6;

   if( length <= 0 ) return;

   wptr = shm_bh_buf_w[instno]->wptr;
   shm_bh_buf_w[instno]->data[wptr].len = length;
   shm_bh_buf_w[instno]->data[wptr].addr = RcvDef.Buf[9];
   RcvDef.Buf[4] = (RcvDef.Buf[4] & 0x4f);
   RcvDef.Buf[5] = RcvDef.Buf[9];
   if(RcvDef.Buf[6] == 196)
     memcpy(shm_bh_buf_w[instno]->data[wptr].buf,&RcvDef.Buf[10],length);
   else
     memcpy(shm_bh_buf_w[instno]->data[wptr].buf,RcvDef.Buf,length);
   shm_bh_buf_w[instno]->wptr = ( wptr + 1 ) % BH_BUF_NUM;
   if( shm_bh_buf_w[instno]->wptr == shm_bh_buf_w[instno]->rptr )   shm_bh_buf_w[instno]->oflag = 1;
   sleep(1);
}

AlarmProc(str,tab)
char str[],tab[];
{
alarm_msg Alarm_Msg;
audio_msg Audio;
struct tm *time_ptr;
time_t Sclock;

     Sclock=time((time_t *) NULL);
     time_ptr=localtime(&Sclock);
     Alarm_Msg.alarm  = 1;
     Alarm_Msg.log    = 1;
     Alarm_Msg.hour   = time_ptr->tm_hour;
     Alarm_Msg.minute = time_ptr->tm_min;
     Alarm_Msg.second = time_ptr->tm_sec;
     Alarm_Msg.ms     = 0;
     Alarm_Msg.n      = 0;
     Alarm_Msg.state  = 0x80;
     strcpy(Alarm_Msg.alarm_tag,tab);
     sprintf(Alarm_Msg.msg,"%s (%s)",str,hostname);
     build_alarm(&Alarm_Msg,0);
     Audio.audio_no=2;
     audio_alarm(&Audio);
}

rLoadDataBase()
{
 int   i,j,fd,FileLen,ionumber;
 char  io_file[100];
 FILE  *fp;

    pIEC=(IECDEF *)get_FB_address(IEC_TAGNAME);
    if(pIEC == (IECDEF *)(-1)){
       printf("IECDEF tagname: %s Does Not Exist!\n",IEC_TAGNAME);
       exit(0);
    }
    sprintf(io_file,"%s/%s/%s/%s.%s",PROJECT_PREFIX,strategy,
           DBDIR,strategy,IO_SUFFIX);

    if ((fp=fopen(io_file,"r"))==NULL) {
       printf("IO_File : %s Does Not Exist!\n",io_file);
       exit(0);
    }
    fseek(fp,0,SEEK_END);
    FileLen = ftell(fp);
    rewind(fp);
    fread(&ionumber,sizeof(int),1,fp);
    fclose(fp);

    if ((fd=open(io_file,O_RDONLY))<=0) {
       printf("IO_File : %s Does Not Exist!\n",io_file);
       exit(0);
    }
    pIODEF=(IODEF*)malloc(FileLen+4);
    read(fd,(char*)&IONumber,sizeof(int));
    read(fd,(char*)pIODEF,FileLen);
    close(fd);
    pStr=(char*)((char*)pIODEF+sizeof(IODEF)*IONumber);

    BhCount=0;
    for (i=0;i<IONumber;i++) {
       if((pIODEF+i)->POINTTYPE == fIEC || (pIODEF+i)->POINTTYPE == fWXB)
           BhCount++;
    }
    if (BhCount==0) {
       printf("IECDEF Function (fIEC fWXB) Not in DB\n");
       exit(0);
    }
    if (BhCount>MaxBHNum) {
       printf("IECDEF Function (fIEC fWXB) Exceed MaxBHNum\n");
       exit(0);
    }

    pBH_Index = (int *)malloc(MaxBHNum*sizeof(int));
    memset(pBH_Index,-1,MaxBHNum*sizeof(int));
    for (i=0;i<IONumber;i++) {
       if((pIODEF+i)->ICNNO == 1){
           switch((pIODEF+i)->POINTTYPE)
           {
              case fIEC:
              case fWXB:
                   if((pIODEF+i)->INSTNO<MaxBHNum && (pIODEF+i)->OCCNO<MaxBHNum)
                       pBH_Index[(pIODEF+i)->OCCNO] = (pIODEF+i)->INSTNO;
                   break;
              default:
                   break;

           }
       }
    }
    free(pIODEF);
}

BH_CREATE_SHM_BUF()
{
  int i,j,instno;
  SHM_BH_DEF  *pshm1;
  SHM_BH_DEF1 *pshm2;

  i = sizeof(SHM_BH_DEF);
  pshm1 = (SHM_BH_DEF *)rGetSharedMemory(0x700000 , i);
  if( pshm1 == (SHM_BH_DEF *)-1 )  {
    printf("CREATE sharedmemory(YS_BH) failed\n");
    return;
  }
  shm_bh_buf_r = (SHM_BH_DEF *)pshm1;
  memset(pshm1,0,i);

  i = sizeof(SHM_BH_DEF1);
  for(j=0;j<MaxBHNum;j++){
     if(pBH_Index[j] == -1 ) continue;
     instno = pBH_Index[j];
     pshm2 = (SHM_BH_DEF1 *)rGetSharedMemory(0x600001+instno , i);
     if( pshm2 == (SHM_BH_DEF1 *)-1 )  {
       printf("CREATE sharedmemory(YS_BH_%d) failed\n",instno);
       return;
     }
     shm_bh_buf_w[instno]=(SHM_BH_DEF1 *)pshm2;
     memset(pshm2,0,i);
  }
}

⌨️ 快捷键说明

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