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

📄 ysrecv.c

📁 在Unix平台下完成的电力系统广发使用的IEC103规约的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
   }
}

C_RFB_NA_3()  /* Reset Frame Count Bit */
{

   pIEC->FCB = 0;
   memset(SendDef.Buf,0,MaxSendBuf);

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

C_RCU_NA_3()  /* Reset Commu Unit */
{

   pIEC->FCB = 0;
   memset(SendDef.Buf,0,MaxSendBuf);

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

}

C_RLK_NA_3()  /* Request Link Status */
{

   memset(SendDef.Buf,0,MaxSendBuf);

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

}

C_PL1_NA_3()  /* Request P1 Data */
{

   memset(SendDef.Buf,0,MaxSendBuf);

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

}

C_PL2_NA_3()  /* Request P2 Data */
{

   memset(SendDef.Buf,0,MaxSendBuf);

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

}

C_IGI_NA_3(addr)  /* General Interrogation */
unsigned char addr;
{

   memset(SendDef.Buf,0,MaxSendBuf);

   SendDef.Buf[0]   = LPCI_STX;
   SendDef.Buf[1]   = 9;
   SendDef.Buf[2]   = 9;
   SendDef.Buf[3]   = LPCI_STX;
   SendDef.Buf[4]   = 0x40 | pIEC->FCB | pIEC->FCV | C_SND_AK;
   SendDef.Buf[5]   = pIEC->IODef.OCCNO;
   SendDef.Buf[6]   = C_IGI_NA;
   SendDef.Buf[7]   = 0x81;
   SendDef.Buf[8]   = COT_IGI;
   SendDef.Buf[9]   = pIECDEF[addr]->IODef.OCCNO;

   SendDef.Buf[10]  = FUN_GLB;
   SendDef.Buf[11]  = 0x00;
   SendDef.Buf[12]  = pIECDEF[addr]->SCN++;

   SendDef.Buf[13]  = sum( &(SendDef.Buf[4]),SendDef.Buf[1] );
   SendDef.Buf[14]  = LPCI_ETX;
   SendDef.SendSize = 15;

}

C_SYN_TA_3()  /* Clock Synchronization */
{
struct timeb CurrentTime;
struct tm *pTime;
int ms;

   memset(SendDef.Buf,0,MaxSendBuf);

   SendDef.Buf[0]   = LPCI_STX;
   SendDef.Buf[1]   = 15;
   SendDef.Buf[2]   = 15;
   SendDef.Buf[3]   = LPCI_STX;
   SendDef.Buf[4]   = 0x40 | pIEC->FCB | pIEC->FCV | C_SYN_NK;
   SendDef.Buf[5]   = 0xff;
   SendDef.Buf[6]   = C_SYN_TA;
   SendDef.Buf[7]   = 0x81;
   SendDef.Buf[8]   = COT_SYN;
   SendDef.Buf[9]   = 0xff;

   SendDef.Buf[10]  = FUN_GLB;
   SendDef.Buf[11]  = 0x00;

   ftime(&CurrentTime);
   pTime=localtime(&CurrentTime.time);
   ms=pTime->tm_sec*60+CurrentTime.millitm;

   SendDef.Buf[12]  = ms & 0xff;
   SendDef.Buf[13]  = ms >> 8;
   SendDef.Buf[14]  = pTime->tm_min;
   SendDef.Buf[15]  = pTime->tm_hour;
   SendDef.Buf[16]  = (pTime->tm_wday<<5) | pTime->tm_mday;
   SendDef.Buf[17]  = pTime->tm_mon+1;
   SendDef.Buf[18]  = pTime->tm_year % 100;

   SendDef.Buf[19]  = sum( &(SendDef.Buf[4]),SendDef.Buf[1] );
   SendDef.Buf[20]  = LPCI_ETX;
   SendDef.SendSize = 21;

}

C_GC_NA_B1(addr)  /* General */
unsigned char addr;
{

   memset(SendDef.Buf,0,MaxSendBuf);

   SendDef.Buf[0]   = LPCI_STX;
   SendDef.Buf[1]   = 10;
   SendDef.Buf[2]   = 10;
   SendDef.Buf[3]   = LPCI_STX;
   SendDef.Buf[4]   = 0x40 | pIEC->FCB | pIEC->FCV | C_SND_AK;
   SendDef.Buf[5]   = pIEC->IODef.OCCNO;
   SendDef.Buf[6]   = C_GC_NA;
   SendDef.Buf[7]   = 0x81;
   SendDef.Buf[8]   = COT_GRD;
   SendDef.Buf[9]   = pIECDEF[addr]->IODef.OCCNO;

   SendDef.Buf[10]  = FUN_GEN;
   SendDef.Buf[11]  = 240;
   SendDef.Buf[12]  = 0;
   SendDef.Buf[13]  = 0;

   SendDef.Buf[14]  = sum( &(SendDef.Buf[4]),SendDef.Buf[1] );
   SendDef.Buf[15]  = LPCI_ETX;
   SendDef.SendSize = 16;

}

C_GC_NA_B3(addr,grp)  /* General */
unsigned char addr;
int grp;
{

   memset(SendDef.Buf,0,MaxSendBuf);

   SendDef.Buf[0]   = LPCI_STX;
   SendDef.Buf[1]   = 13;
   SendDef.Buf[2]   = 13;
   SendDef.Buf[3]   = LPCI_STX;
   SendDef.Buf[4]   = 0x40 | pIEC->FCB | pIEC->FCV | C_SND_AK;
   SendDef.Buf[5]   = pIEC->IODef.OCCNO;
   SendDef.Buf[6]   = C_GC_NA;
   SendDef.Buf[7]   = 0x81;
   SendDef.Buf[8]   = COT_GRD;
   SendDef.Buf[9]   = pIECDEF[addr]->IODef.OCCNO;

   SendDef.Buf[10]  = FUN_GEN;
   SendDef.Buf[11]  = 241;
   SendDef.Buf[12]  = 0;
   if( pIECDEF[addr]->IODef.CONNECTTYPE == mMCD )  SendDef.Buf[12]   = 0x3e;
   SendDef.Buf[13]  = 1;
   SendDef.Buf[14]  = grp;
   SendDef.Buf[15]  = 0x00;
   SendDef.Buf[16]  = 1;

   SendDef.Buf[17]  = sum( &(SendDef.Buf[4]),SendDef.Buf[1] );
   SendDef.Buf[18]  = LPCI_ETX;
   SendDef.SendSize = 19;

}

TxDriver(ptr,len)
unsigned char *ptr;
unsigned short len;
{
int Length;
unsigned short i,k;

   signal(SIGALRM,alarm_handler);
   alarm(4);
   Length=write(fd,ptr,len);
   alarm(0);
   signal(SIGALRM,SIG_DFL);
   if (Length!=len) {
      fprintf(stderr,"s%2x: TxDriver TimeOut\n",HEX_BCD(port));
      ioctl(fd,TCFLSH,1);
      return -1;
   }
   if (Length<0) {
      fprintf(stderr,"s%2x: TxDriver error\n",HEX_BCD(port));
      init_device();
      return -1;
   }
   else {
      if (pIEC->Display != 0) {
         if (ptr[0]==LPCI_STX)
              IEC68dsp('s',ptr[6]);
         else IEC10dsp('s',ptr[1]);
         for (i=0;i<len;i++) {
            printf("%2x ",ptr[i]);
            if ((((i+1) % MaxListDsp)==0) && (i!=len-1))
               printf("\n               ");
         }
         printf("\n");
      }
      return Length;
   }
}

int RxDriver()
{
unsigned char k,temp,ReadNum,CntTmp,ReadNullCount;
unsigned char crcl,crch;
int i,count,RxC;

   RxC=0;
   ReadNullCount=0;
   while (1)
   {
      ReadNum=0;
      ReadNum=read(fd,&temp,1);
      if (ReadNum==1) {
         RcvDef.Buf[RxC]=temp;
         RxC++;
         ReadNullCount=0;
      }
      else if (ReadNum==0) {
         if (RxC) {
            ReadNullCount++;
            if (ReadNullCount>3) {
                printf("r: Breakat RxC=%d\n",RxC);
                for (i=0;i<RxC;i++) {
                    printf("%2x ",RcvDef.Buf[i]);
                    if ((((i+1) % MaxListDsp)==0) && (i!=RxC))
                       printf("\n               ");
                }
                printf("\n");
                ioctl(fd,TCFLSH,0);
                return -2;
            }
         }
         else {
            RxC=0;
            return -1;
         }
      }
      else {
         printf("Error Read File\n");
         init_device();
         return -3;
      }
      if (RxC==1) {
         if ((RcvDef.Buf[0]==LPCI_STX) || (RcvDef.Buf[0]==LPCI_SYN)) continue;
         else {
            RxC=0;
            if (pIEC->Display == 1)
               printf("r%2x: Err STX %2x\n",HEX_BCD(port),RcvDef.Buf[0]);
         }
      }
      else if (RxC==5) {
         if ((RcvDef.Buf[0]==LPCI_STX)&&(RcvDef.Buf[0]==RcvDef.Buf[3])&&(RcvDef.Buf[1]==RcvDef.Buf[2])) continue;
         else if ((RcvDef.Buf[0]==LPCI_SYN) && (RcvDef.Buf[2]==pIEC->IODef.OCCNO) &&
                  (RcvDef.Buf[4]==LPCI_ETX) && (RcvDef.Buf[3]==sum(&RcvDef.Buf[1],2))) {
                   if (pIEC->Display == 1) {
                       IEC10dsp('r',RcvDef.Buf[1]);
                       for (i=0;i<RxC;i++) printf("%2x ",RcvDef.Buf[i]);
                       printf("\n");
                   }
                   if (RcvDef.Buf[1] & LPCI_ACD) pIEC->ACD=YES;
                   else pIEC->ACD=NO;
                   return RxC;
         }
         else {
            printf("r%2x: sync Error-- ",HEX_BCD(port));
            for (i=0;i<RxC;i++) printf("%2x ",RcvDef.Buf[i]);
            printf("\n");
            RxC=0;
         }
      }
      else if( (RxC>14) && (RxC>=RcvDef.Buf[1]+6) ){
         printf("check sum = %2x\n",sum(&RcvDef.Buf[4],RcvDef.Buf[1]));
         if ( (RcvDef.Buf[RxC-1]==LPCI_ETX) && (RcvDef.Buf[RxC-2]==sum(&RcvDef.Buf[4],RcvDef.Buf[1])) ) {
             if (pIEC->Display == 1) {
                 IEC68dsp('r',RcvDef.Buf[6]);
                 for (i=0;i<RxC;i++) {
                    printf("%2x ",RcvDef.Buf[i]);
                    if ((((i+1) % MaxListDsp)==0) && (i!=RxC))
                       printf("\n               ");
                 }
                 printf("\n");
             }
             if (RcvDef.Buf[4] & LPCI_ACD) pIEC->ACD=YES;
             else pIEC->ACD=NO;
             return RxC;
         }
      }
   }
}

drv_recv(delay)
int delay;
{
int i,rtn;

   RcvTimeOut=0;
   signal(SIGALRM,ralarm_handler);
   alarm(delay*2);
   for (i=0;i<delay*5;i++) {
      rtn=RxDriver();
      if (rtn>=0) break;
   }
   alarm(0);
   signal(SIGALRM,SIG_DFL);
   if ( (RcvTimeOut==0) && (rtn>=0) ) return rtn;
   else {
      if (pIEC->Display == 1)
         printf("r%2x: RxDriver Timeout=%d rtn=%d\n",
                        HEX_BCD(port),RcvTimeOut,rtn);
      return -1;
   }
}

RxDrvCheckProc()
{
int rtn,i;
char str[128];

   while ( (rtn=drv_recv(5)) < 0 ) {
      if (SendDef.RepCount<MaxRetry) {
         if (pIEC->Status == NODE_OFF) {
            SendDef.RepCount=0;
            break;
         }
         else {
            SendDef.RepCount++;
            TxDriver(SendDef.Buf,SendDef.SendSize);
         }
      }
      else {
         if (pIEC->Status == NODE_ON) {
             pIEC->Status =  NODE_OFF;
             SendStatusToPeer(NODE_OFF,pIEC->IODef.OCCNO);
             sprintf(str,"%s通讯中断",
                   ((char *)pSysDef+(int)pIEC->FB.pDescript));
             AlarmProc(str,diag_tag);
         }
         SendDef.RepCount=0;
         break;
      }
   }
   if ( rtn > 0 ) {
      SendDef.RepCount=0;
      if (pIEC->Status == NODE_OFF) {
          pIEC->Status =  NODE_ON;
          pIEC->ClkSet =  1;
          SendStatusToPeer(NODE_ON,pIEC->IODef.OCCNO);
          sprintf(str,"%s通讯恢复",
                ((char *)pSysDef+(int)pIEC->FB.pDescript));
          AlarmProc(str,diag_tag);
      }
      pIEC->FCB ^= LPCI_FCB;
      return rtn;
   }
   else return -1;
}

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);
    }
    AddrIEC = pIEC->IODef.INSTNO;
    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);

    IECCount=0;
    for (i=0;i<IONumber;i++) {
       if((pIODEF+i)->POINTTYPE == fIEC)
           IECCount++;
    }
    if (IECCount==0) {
       printf("IECDEF Function (fIEC103) Not in DB\n");
       exit(0);
    }
    if (IECCount>MaxIECNum) {
       printf("IECDEF Function (fIEC) Exceed MaxIECNum\n");
       exit(0);
    }
    for (i=0; i<MaxIECNum; i++) pIECDEF[i]=(IECDEF *)0;
    j=0;
    for (i=0;i<IONumber;i++) {
       if ( (pIODEF+i)->POINTTYPE == fIEC && (pIODEF+i)->ICNNO == 1 ){
          rFoundPointer((long*)&pIODEF[i].TAGNAME,pStr);
          pIODEF[i].DBADDRESS=(char*)get_FB_address(pIODEF[i].TAGNAME);
          if (pIODEF[i].DBADDRESS==(char*)(-1)) {
             printf("IECDEF Tagname: %s Not in DB\n",pIODEF[i].TAGNAME);
             exit(0);
          }
          else {
             if ((pIODEF+i)->OCCNO>MaxIECNum){
               fprintf(stderr,"IECDEF:OCCNO >MaxNum(254)\n");
               exit(0);
             }
             else{
                printf("pIODEF[i].OCCNO==%d\n",pIODEF[i].OCCNO);
                if((pIODEF+i)->CONNECTTYPE != mRCS9692)
                   pIECDEF[pIODEF[i].OCCNO]=(IECDEF *)pIODEF[i].DBADDRESS;
                j++;
             }
          }
       }
    }
    free(pIODEF);
}

⌨️ 快捷键说明

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