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

📄 ysrecv.c

📁 在Unix平台下完成的电力系统广发使用的IEC103规约的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#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[MaxIECNum],*pIEC;
char          *pStr;
int           IECCount,INTCOUNT;
int           Display,Enqflag;
int           GRP[MaxGRPNum];

unsigned       port,RcvTimeOut,IONumber,IECInitMark;
short          AddrIEC;

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

extern void RcvTimeOut_hnd();
extern void alarm_handler();
extern void ralarm_handler();

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 ----- ysrecv 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 ----- ysrecv com<11-48> TAGNAME [on|off]\n");
      printf("Invalid argument --- %s\n",argv[1]);
      exit(0);
   }
   sprintf(myprocessname,"%s_%s",argv[0],argv[2]);
   get_local_name(hostname);
   strcpy(IEC_TAGNAME,argv[2]);
   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(0);
   }
   if (get_local_strategy(strategy)==-1) {
      printf("get_local_strategy Failure---%s_%s\n",argv[0],argv[1]);
      exit(0);
   }
   if (msg_init(myprocessname)==-1) {
      printf("Msg_init failure---%s\n",myprocessname);
      exit(0);
   }
   get_diag_tag(hostname,diag_tag);

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

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

   for(i=0;i<MaxIECNum;i++){
       if(pIECDEF[i] == (IECDEF *)0)continue;
       pIECDEF[i]->Status  = NODE_ON;
   }

   ftime(&EnqTime);
   ftime(&ValTime);
   ftime(&ClkTime);
   ftime(&FltTest);

   setsid();

   main_loop();

}

main_loop()
{
int init_flag,rtn,i,pending;

   init_flag = 0;
   while (1)
   {
      if (get_redundant_flag(hostname) == 1) {
          if (init_flag == 0) {
             M_INIT_Proc();
             sleep(1);
             init_flag=1;
          }
          dbmIEC();
          sleep(1);
      }
      else{
         ioctl(fd,TCFLSH,0);

         RcvMsg.mtype    = MESG_ALL;
         RcvMsg.msg_size = BUFSIZE;
         RcvMsg.msg_data = recv_data;
         pending = msg_recv( &RcvMsg, 0 );
         if (pending>=0) IEC_Status_Proc();
         sleep(2);
      }
   }
}

SendStatusToPeer(code,addr)
unsigned char   code;
{
   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;
   }
}


dbmIEC()
{
int i,j,k;
int pending,wait_times;

   RcvMsg.mtype    = MESG_ALL;
   RcvMsg.msg_size = BUFSIZE;
   RcvMsg.msg_data = recv_data;
   pending = msg_recv( &RcvMsg, 0 );
   if (pending>=0) IECSetupCmdProc();

   ftime(&NowTime);

   if( (pIEC->Status == NODE_ON) && (pIEC->ClkSet == 1) ){
     pIEC->ClkSet = 0;
     C_SYN_TA_3();
     TxDriver(SendDef.Buf,SendDef.SendSize);
     sleep(1);
   }

   for( i=0;i<MaxIECNum;i++ ){
     if( pIECDEF[i] == (IECDEF *)0 ) continue;
     if( pIECDEF[i]->Status == NODE_OFF ) continue;

     if( pIECDEF[i]->ENQFLAG == 1 ){
       pIECDEF[i]->ENQFLAG = 0;
       Find_Relay_GRP(i);
       for( j=0;j<MaxGRPNum;j++ ){
         if( GRP[j] == 1 ){
            wait_times = 0;
            C_GC_NA_B3(i,j);
            TxDriver(SendDef.Buf,SendDef.SendSize);
            sleep(1);
            if (RxDrvCheckProc() < 0)  break;
            while( pIEC->ACD == NO && wait_times < MaxWaitTimes ){
              wait_times ++ ;
              C_PL2_NA_3();
              TxDriver(SendDef.Buf,SendDef.SendSize);
              if (RxDrvCheckProc() > 0) C_PL2_NA_Proc();
              else break;
              sleep(1);
            }
            wait_times = 0;

            while( pIEC->ACD == YES ){
              C_PL1_NA_3();
              TxDriver(SendDef.Buf,SendDef.SendSize);
              if (RxDrvCheckProc() > 0){
                  if( RcvDef.Buf[0] == LPCI_SYN ) break;
                  C_PL1_NA_Proc();
              }
              else break;
              sleep(1);
            }
         }
       }
     }
   }
   if (((NowTime.time-EnqTime.time) > EnqInterval) ||
       ((EnqTime.time-NowTime.time) > EnqInterval) )    {
       ftime(&EnqTime);
       if( pIEC->Status == NODE_ON ){
           C_PL2_NA_3();
           TxDriver(SendDef.Buf,SendDef.SendSize);
           if (RxDrvCheckProc() > 0) C_PL2_NA_Proc();
           while( pIEC->ACD == YES ){
             C_PL1_NA_3();
             TxDriver(SendDef.Buf,SendDef.SendSize);
             if (RxDrvCheckProc() > 0){
                 if( RcvDef.Buf[0] == LPCI_SYN ) break;
                 C_PL1_NA_Proc();
             }
             else break;
             sleep(1);
           }
       }
   }
   else if (((NowTime.time-ClkTime.time) > ClkInterval) ||
            ((ClkTime.time-NowTime.time) > ClkInterval) ) {
            ftime(&ClkTime);
             pIEC->ClkSet = 1;
   }
   else if (((NowTime.time-FltTest.time) > FltInterval) ||
           ((FltTest.time-NowTime.time) > FltInterval) ) {
           ftime(&FltTest);
           if( pIEC->Status == NODE_OFF ){
               M_INIT_Proc();
               sleep(1);
           }
   }

}


M_INIT_Proc()
{
int code,i,wait_times;

   C_RCU_NA_3();
   TxDriver(SendDef.Buf,SendDef.SendSize);
   if ((RxDrvCheckProc() < 0) ||
       ((RcvDef.Buf[1] & 0x0f) != M_CON_NA)) return -1;
   sleep(1);

   wait_times = 0;
   while( pIEC->ACD == NO && wait_times < MaxWaitTimes ){
     wait_times ++ ;
     C_PL2_NA_3();
     TxDriver(SendDef.Buf,SendDef.SendSize);
     if (RxDrvCheckProc() > 0) C_PL2_NA_Proc();
     else break;
     sleep(1);
   }
   wait_times = 0;

   while( pIEC->ACD == YES ){
       C_PL1_NA_3();
       TxDriver(SendDef.Buf,SendDef.SendSize);
       if( RxDrvCheckProc() > 0 ) C_PL1_NA_Proc();
       else break;
       ms_sleep(100);
   }

/*
   C_RFB_NA_3();
   TxDriver(SendDef.Buf,SendDef.SendSize);
   if ((RxDrvCheckProc() < 0) ||
       ((RcvDef.Buf[1] & 0x0f) != M_CON_NA)) return -1;
   sleep(1);

   while( pIEC->ACD == YES ){
       C_PL1_NA_3();
       TxDriver(SendDef.Buf,SendDef.SendSize);
       if( RxDrvCheckProc() > 0 ) C_PL1_NA_Proc();
       else break;
       ms_sleep(100);
   }

   for(i=0;i<MaxIECNum;i++){
       if(pIECDEF[i] == (IECDEF *)0) continue;
       if(pIECDEF[i]->Status  == NODE_OFF) continue;
       C_IGI_NA_3(i);
       TxDriver(SendDef.Buf,SendDef.SendSize);
       if ((RxDrvCheckProc() < 0) ||
           ((RcvDef.Buf[1] & 0x0f) != M_CON_NA)) return -1;
   }
*/
   pIEC->ClkSet  = YES;
   return 1;
}

C_SYN_NA_Proc()
{
}

C_RLK_NA_Proc()
{
}

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

C_PL1_NA_Proc()
{

int rptr,wptr,length;
unsigned char addr;

   if (RcvDef.Buf[0]==LPCI_SYN) return;
   addr = RcvDef.Buf[9];
   if(pIECDEF[addr] == (IECDEF *)0) return;

   switch (pIECDEF[addr]->IODef.CONNECTTYPE)
   {
      case mLFP901A:
      case mLFP902A:
      case mLFP951A:
      case mLFP921A:
      case mLFP922:
      case mRCS915C:
      case mRCS915D:
      case mRCS915E:
      case mRCS974A:
      case mRCS978C:
           RCS_PL1_Proc(addr);
           break;
      case mBP2A:
      case mBP2B:
           BP_PL1_Proc(addr);
           break;
      case mMCD:
           MCD_PL1_Proc(addr);
           break;
      case mPSL602:
           PSL_PL1_Proc(addr);
           break;
      default:
          printf("LINKADDR = %d type not defined! \n",pIECDEF[addr]->IODef.OCCNO);
          break;
   }

}

C_PL2_NA_Proc()
{
unsigned char addr;

   if(pIECDEF[addr] == (IECDEF *)0) return;

   switch (pIECDEF[addr]->IODef.CONNECTTYPE)
   {
      case mBP2A:
      case mBP2B:
           BP_PL2_Proc(addr);
           break;
      case mMCD:
           MCD_PL2_Proc(addr);
           break;
      case mPSL602:
           PSL_PL2_Proc(addr);
           break;
      default:
          break;
   }
}

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);
}

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

   for(i=0;i<MaxGRPNum;i++) GRP[i] = 0;

/* 不同型号保护有不同的 cpu */
   switch (pIECDEF[addr]->IODef.CONNECTTYPE)
   {
      case mLFP901A:
      case mLFP902A:
      case mLFP951A:
           GRP[1] = GRP[2] = GRP[3] = GRP[6] = 1;
      case mRCS915C:
      case mRCS915D:
      case mRCS915E:
      case mRCS974A:
      case mRCS978C:
           GRP[1] = GRP[2] = GRP[3] = GRP[4] = GRP[5] = 1;
           GRP[6] = GRP[8] = GRP[9] = 1;
      case mLFP921A:
      case mLFP922:
           GRP[1] = GRP[2] = GRP[3] = 1;
           break;
      case mBP2A:
      case mBP2B:
           GRP[0] = GRP[1] = GRP[2]  = 1;
           break;
      case mMCD:
           GRP[2] = 1;
           break;
      case mPSL602:
           GRP[4] = 1;
           break;
      default:
          printf("LINKADDR = %d type not defined! \n",pIECDEF[addr]->IODef.OCCNO);
          break;

⌨️ 快捷键说明

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