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

📄 ps600.c

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

extern  SENDDEF       SendDef;
extern  RCVDEF        RcvDef;
extern  IECDEF        *pIECDEF[MaxIECNum],*pIEC;
extern  char          hostname[NAME_SIZE+1];
extern  SysDef        *pSysDef;
extern  int           Enqflag;

PSL_PL1_Proc(addr)
unsigned char addr;
{
alarm_msg Alarm_Msg;
audio_msg Audio;
unsigned char i,j,typeid,funtype,infno,dpi,cpu,width,dot,*p;
char str[128],pStr[128],file1[32];
int audio,ms,set_num;
float tmpdata;
int rptr,wptr,length;
int len,kod;
FILE *fp1;

      Alarm_Msg.alarm  = 1;
      Alarm_Msg.log    = 1;
      Alarm_Msg.n      = 0;
      Alarm_Msg.state  = 0x80;
      Alarm_Msg.data1  = 0;
      Alarm_Msg.data2  = 0;
      Alarm_Msg.data3  = 0;

      typeid  = RcvDef.Buf[6];
      funtype = RcvDef.Buf[10];
      infno   = RcvDef.Buf[11];

      switch (typeid)
      {
      case M_TTM_TA:
         if( RcvDef.Buf[8] != COT_SPN ) break;
         Alarm_Msg.hour   = RcvDef.Buf[16] & 0x3f;
         Alarm_Msg.minute = RcvDef.Buf[15] & 0x3f;
         Alarm_Msg.second =  (RcvDef.Buf[14]*256+RcvDef.Buf[13])/1000;
         Alarm_Msg.ms     = ((RcvDef.Buf[14]*256+RcvDef.Buf[13])%1000)*10;
         strcpy(Alarm_Msg.alarm_tag,(char *)pSysDef+(int)pIECDEF[addr]->alarmtag);

         switch (funtype)
         {
           case 0xb8:
              for( i=0;i<sizeof(PSL_B8_Event)/sizeof(EVTALM);i++ )
                   if( PSL_B8_Event[i].index == infno ) break;
              strcpy(pStr,PSL_B8_Event[i].text);
              audio = PSL_B8_Event[i].audio;
              dpi = PSL_B8_Event[i].dpi;
              break;
           /*
           case 0xf5:
              for( i=0;i<sizeof(PSL_F5_Event)/sizeof(EVTALM);i++ )
                   if( PSL_F5_Event[i].index == infno ) break;
              strcpy(pStr,PSL_F5_Event[i].text);
              audio = PSL_F5_Event[i].audio;
              dpi = PSL_F5_Event[i].dpi;
              break;
           case 0xf6:
              for( i=0;i<sizeof(PSL_F6_Event)/sizeof(EVTALM);i++ )
                   if( PSL_F6_Event[i].index == infno ) break;
              strcpy(pStr,PSL_F6_Event[i].text);
              audio = PSL_F6_Event[i].audio;
              dpi = PSL_F6_Event[i].dpi;
              break;
           case 0xf7:
              for( i=0;i<sizeof(PSL_F7_Event)/sizeof(EVTALM);i++ )
                   if( PSL_F7_Event[i].index == infno ) break;
              strcpy(pStr,PSL_F7_Event[i].text);
              audio = PSL_F7_Event[i].audio;
              dpi = PSL_F7_Event[i].dpi;
              break;
           */
           default:
              printf("functione no define!\n");
              break;
         }

         if( RcvDef.Buf[12]==2 )  strcpy(str,"动作");
         else
           if( RcvDef.Buf[12]==1 )  strcpy(str,"复归");
         else strcpy(str,"无效");

         sprintf(Alarm_Msg.msg,"%s%s%s(%s)",
            ((char *)pSysDef+(int)pIECDEF[addr]->FB.pDescript),pStr,str,hostname);
         build_alarm(&Alarm_Msg,0);
         if( audio !=0 ){
             Audio.audio_no =audio;
             audio_alarm(&Audio);
         }
         break;
      case M_TMR_TA:
         if( RcvDef.Buf[8] != COT_SPN ) break;
         Alarm_Msg.hour   = RcvDef.Buf[20] & 0x3f;
         Alarm_Msg.minute = RcvDef.Buf[19] & 0x3f;
         Alarm_Msg.second =  (RcvDef.Buf[18]*256+RcvDef.Buf[17])/1000;
         Alarm_Msg.ms     = ((RcvDef.Buf[18]*256+RcvDef.Buf[17])%1000)*10;
         strcpy(Alarm_Msg.alarm_tag,(char *)pSysDef+(int)pIECDEF[addr]->alarmtag);

         switch (funtype)
         {
           case 0xb8:
              for( i=0;i<sizeof(PSL_B8_Event)/sizeof(EVTALM);i++ )
                   if( PSL_B8_Event[i].index == infno ) break;
              strcpy(pStr,PSL_B8_Event[i].text);
              audio = PSL_B8_Event[i].audio;
              dpi = PSL_B8_Event[i].dpi;
              break;
           /*
           case 0xf5:
              for( i=0;i<sizeof(PSL_F5_Event)/sizeof(EVTALM);i++ )
                   if( PSL_F5_Event[i].index == infno ) break;
              strcpy(pStr,PSL_F5_Event[i].text);
              audio = PSL_F5_Event[i].audio;
              dpi = PSL_F5_Event[i].dpi;
              break;
           case 0xf6:
              for( i=0;i<sizeof(PSL_F6_Event)/sizeof(EVTALM);i++ )
                   if( PSL_F6_Event[i].index == infno ) break;
              strcpy(pStr,PSL_F6_Event[i].text);
              audio = PSL_F6_Event[i].audio;
              dpi = PSL_F6_Event[i].dpi;
              break;
           case 0xf7:
              for( i=0;i<sizeof(PSL_F7_Event)/sizeof(EVTALM);i++ )
                   if( PSL_F7_Event[i].index == infno ) break;
              strcpy(pStr,PSL_F7_Event[i].text);
              audio = PSL_F7_Event[i].audio;
              dpi = PSL_F7_Event[i].dpi;
              break;
           */
           default:
              printf("functione no define!\n");
              break;
         }

         if( RcvDef.Buf[12]==2 )  strcpy(str,"动作");
         else
           if( RcvDef.Buf[12]==1 )  strcpy(str,"复归");
         else strcpy(str,"无效");


         ms = (RcvDef.Buf[14]*256+RcvDef.Buf[13])/1000;

         sprintf(Alarm_Msg.msg,"%s%s%s(相对时间%dms)(%s)",
            ((char *)pSysDef+(int)pIECDEF[addr]->FB.pDescript),pStr,str,ms,hostname);
         build_alarm(&Alarm_Msg,0);
         if( audio !=0 ){
             Audio.audio_no =audio;
             audio_alarm(&Audio);
         }
         break;
      case M_GD_NTA:                             /* 通用分类标识 */
         sprintf(file1,"%s",((char *)pSysDef+(int)pIECDEF[addr]->FB.pTag));
         fp1 = fopen(file1,"a");
         if(RcvDef.Buf[8] == COT_GRD){           /* 对通用分类数据读命令的有效数据响应 */
             set_num = RcvDef.Buf[13]&0x3f;      /* 本cpu定值个数 NGD */
             p=(unsigned char*)&RcvDef.Buf[14];  /* p指向每一项定值的序号 */
             for(i=0;i<set_num;i++){
               cpu = *p;
               p = p+1;
               dot = *p;
               kod = *(p+1);
               p += 3;
               width=*p;
               p += 2;
               if( kod == 0x0a ){
                  strncpy( str, (char*)(p) , width);
                  *(str + width) = '\0';
                  fprintf(fp1,"%d %d %s\n",cpu,dot,str);
               }
               else if(width == 4) {                /* 实际定值的长度(字节数) */
                  switch(cpu){
                     case 1:
                         pIECDEF[addr]->SET1[dot] = *((float *)p);
                     break;
                     case 2:
                         pIECDEF[addr]->SET2[dot] = *((float *)p);
                     break;
                     case 3:
                         pIECDEF[addr]->SET3[dot] = *((float *)p);
                     break;
                     case 4:
                         pIECDEF[addr]->SET4[dot] = *((float *)p);
                     break;
                     case 5:
                         pIECDEF[addr]->SET5[dot] = *((float *)p);
                     break;
                     case 6:
                         pIECDEF[addr]->SET6[dot] = *((float *)p);
                     break;
                     case 7:
                         pIECDEF[addr]->SET7[dot] = *((float *)p);
                     break;
                     default:
                         printf(" The cpu num is Err ! cpu = %d \n",cpu);
                     break;
                  }
               }
               else if(width == 2){
                  tmpdata = (*p);
                  tmpdata = (*(p+1))*256 + tmpdata;
                  switch(cpu){
                     case 1:
                         pIECDEF[addr]->SET1[dot] = (float)tmpdata;
                     break;
                     case 2:
                         pIECDEF[addr]->SET2[dot] = (float)tmpdata;
                     break;
                     case 3:
                         pIECDEF[addr]->SET3[dot] = (float)tmpdata;
                     break;
                     case 4:
                         pIECDEF[addr]->SET4[dot] = (float)tmpdata;
                     break;
                     case 5:
                         pIECDEF[addr]->SET5[dot] = (float)tmpdata;
                     break;
                     case 6:
                         pIECDEF[addr]->SET6[dot] = (float)tmpdata;
                     break;
                     case 7:
                         pIECDEF[addr]->SET7[dot] = (float)tmpdata;
                     break;
                     default:
                         printf(" The cpu num is Err ! cpu = %d \n",cpu);
                     break;
                  }
               }
               else printf("SET[%d] datasize = %d is not define ! \n",dot+1,width);
               p = p + width ;
             }
         }
         fclose(fp1);
         break;
      default:
         break;
      }
}

PSL_PL2_Proc(addr)
unsigned char addr;
{
}

⌨️ 快捷键说明

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