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

📄 nsiec104server.c

📁 南瑞的IEC104规约实现的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
                 if(YcNap<0)
                      YcNap=NsIec104Struct.YcLastValue[NsIec104Struct.YcLibIndex+i]-YcValue;
 
                 if(YcNap>NsIec104Struct.YcNap[NsIec104Struct.YcLibIndex+i])
                 {
                      NsIec104Struct.YcChangeCount++;
                      NsIec104Struct.YcLastValue[NsIec104Struct.YcLibIndex+i]=YcValue;*/    
                      /* Information Object Address Now Three Bytes */
                      General=0x701+NsIec104Struct.YcLibIndex+i;
                      P=(unsigned char    *)&General;
                      NsIec104Struct.SendBuffer[Index++]=P[0];
                      NsIec104Struct.SendBuffer[Index++]=P[1];
                      NsIec104Struct.SendBuffer[Index++]=0;

                      /*fYc = YcValue * 1.0;
		      P=(unsigned char    *)&fYc;
			
		      NsIec104Struct.SendBuffer[Index++]=P[0];
                      NsIec104Struct.SendBuffer[Index++]=P[1];
 		      NsIec104Struct.SendBuffer[Index++]=P[2];
                      NsIec104Struct.SendBuffer[Index++]=P[3];*/
 		      NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.DataBuff[2*i];
                      NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.DataBuff[2*i + 1];
                      NsIec104Struct.SendBuffer[Index++]=0x00;  /*qds*/
                  /*}*/
          }

          /* Repair Length  and Count*/
          NsIec104Struct.SendBuffer[1]=Index-2;
          NsIec104Struct.SendBuffer[7]=NsIec104Struct.YcChangeCount;
          if(NsIec104Struct.YcChangeCount>0)
          {/*
             printf("\n Co=%d Ind=%dGe=%d",NsIec104Struct.YcChangeCount,NsIec104Struct.YcLibIndex,General);
			*/
             if((NsIec104Struct.SendLength=send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.SendBuffer[0],Index,0x0))<0)
             {
	               perror ("Client FirstWrite Error");
             }
          }
}


static void  NsIec104SendGroup(void)
{
  if(NsIec104Struct.NeedSendNumber>0&&NsIec104Struct.HasSendNumber<NS_IEC104_MAX_K)
  {
     /*
           printf("\n GroupId=%d",NsIec104Struct.NsNewSocketId);
     */
     if((NsIec104Struct.SendLength=send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.GroupSendBuffer[NsIec104Struct.LeftSendNumber][0],NsIec104Struct.GroupSendLength[NsIec104Struct.LeftSendNumber],0x0))<0)
     {
        perror ("GRoup Erroe");
     }
     
     NsIec104Struct.LeftSendNumber++;  
     /* 
       printf("\n Send Group=%d",NsIec104Struct.SendLength);
      */
    if(NsIec104Struct.LeftSendNumber>=NsIec104Struct.NeedSendNumber)
    {
       NsIec104Struct.HasSendNumber=0;
       NsIec104Struct.NeedSendNumber=0;
       NsIec104Struct.LeftSendNumber=0;
    }
  }
  taskDelay(108);

}


static void  NsIec104Process(void)
{
 int              i;

/*      printf("r:");
      for(i=0;i<NsIec104Struct.ReceiveLength;i++)
          printf("%4x",NsIec104Struct.ReceiveBuffer[i]);
      printf("\n");
*/      
    if(NsIec104Struct.ReceiveLength>=NS_IEC_104_MIN_LENGTH&&NsIec104Struct.ReceiveBuffer[0]==NS_IEC_104_HEAD)
    {                            
       NsIec104Struct.FormatType=NsIec104Struct.ReceiveBuffer[2]&0x03;
       if(NsIec104Struct.FormatType==0||NsIec104Struct.FormatType==2)            /* I */
       {
              NsIec104ProcessFormatI();
       }
       else 
       {
              if(NsIec104Struct.FormatType==1)     /*  S  */ 
                   NsIec104ProcessFormatS();
              else
              {
                   if(NsIec104Struct.FormatType==3)/*  U  */
                      NsIec104ProcessFormatU();
              }
        }
        NsIec104Reset();
    }

}

static  void  NsIec104ProcessFormatI(void)
{
int i;
unsigned  char   *p;
unsigned  short  NoWay;
/* 
       printf("\nFormatI");
*/
       NsIec104Struct.ApduLength=NsIec104Struct.ReceiveBuffer[1];
       if(NsIec104Struct.ApduLength>NS_IEC_104_MIN_LENGTH)
       {
          NsIec104Struct.ReceiveHimNumber[0]=NsIec104Struct.ReceiveBuffer[2];
          NsIec104Struct.ReceiveHimNumber[1]=NsIec104Struct.ReceiveBuffer[3];
          NoWay=*(unsigned short *)&NsIec104Struct.ReceiveHimNumber[0];
          NoWay>>=1;
          NoWay+=1;
          NoWay<<=1;
          p=(unsigned char *)&NoWay;
          NsIec104Struct.ReceiveHimNumber[0]=p[0];
          NsIec104Struct.ReceiveHimNumber[1]=p[1];

          NsIec104Struct.AsduType=NsIec104Struct.ReceiveBuffer[6];  

          for(i=0;i< NS_IEC_104_REASONBYTE;i++)
             NsIec104Struct.TransmitReason[i]=NsIec104Struct.ReceiveBuffer[NS_STARTREASON+i];
         
          for(i=0;i<NS_IEC_104_ASDUADDRESSBYTE;i++)
             NsIec104Struct.CommonAsduAddress[i]=NsIec104Struct.ReceiveBuffer[NS_STARTASDUADDRESS+i];

          for(i=0;i<NS_IEC_104_INFORMATIONBYTE;i++)
             NsIec104Struct.InformationObject[i]=NsIec104Struct.ReceiveBuffer[NS_STARTINFORMATION+i];

          NsIec104Struct.AsduQualifier=NsIec104Struct.ReceiveBuffer[NS_STARTQUALIFIER];  

          switch(NsIec104Struct.AsduType)
          {
             case 46:
             case 47:
                      NsIec104Struct.YkYtType=NsIec104Struct.AsduType;
                      NsIec104ProcessYkYt();
                      break;
             case 100:  /* Interrogation */
                      NsIec104Interrogation();
                      break;
             case 101:
                      NsIec104ProcessPulse();
                      break;
             case 103:
                      NsIec104ProcessTime();
                      /*
                        printf("\n Time1");
                       */
                      break;
             default:
                      break;
          }
       }
}


static  unsigned  char       NsIec104SendCosSoe(void)
{
unsigned short     Number;
NS_SOE_FORMAT      SoeData;
NS_COS_FORMAT      CosData;   
unsigned short     Index,SendCount;
unsigned char      *P,i,CosSendSign;
unsigned short     RealNumber,Object,Msecond;

  Index=0;
  CosSendSign=0;
  Number=NsCheckDd1Cos();
  if(Number>0)
  {
          if(Number>36)
             Number=36;
          SendCount=0;
          Index=0;
          NsIec104Struct.SendBuffer[Index++]=0x68;
          NsIec104Struct.SendBuffer[Index++]=0x00;

          RealNumber=(NsIec104Struct.SendMeNumber<<1);
          P=(unsigned char *)&RealNumber;
          NsIec104Struct.SendBuffer[Index++]=P[0];              /*     send number       */
          NsIec104Struct.SendBuffer[Index++]=P[1];
          NsIec104Struct.SendMeNumber=(NsIec104Struct.SendMeNumber+1)%65535;


          NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[0];              /*     receive number    */
          NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[1];

          NsIec104Struct.SendBuffer[Index++]=0x01;                 /*    0x01--->0x02 asdu type   */
          NsIec104Struct.SendBuffer[Index++]=1;                  /*    information object count  */

           /*  REASONBYTE  now is two */
          NsIec104Struct.SendBuffer[Index++]=0x03;               /*    reason  */
          NsIec104Struct.SendBuffer[Index++]=0x00;               /*    reason  */

             
          for(i=0;i<NS_IEC_104_ASDUADDRESSBYTE;i++)
             NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.CommonAsduAddress[i];
          for(i=0;i<Number;i++)
          {
               if(NsGetDd1CosLib(&CosData)==ON)
               {
                 SendCount++;
                 /* Information Object Address now three byte:  0xc01---0xc80 */
                 Object=CosData.SendNumber+0x01;
                 P=(unsigned char *)&Object;
                 NsIec104Struct.SendBuffer[Index++]=P[0];
                 NsIec104Struct.SendBuffer[Index++]=P[1];
                 NsIec104Struct.SendBuffer[Index++]=0x00;
                 NsIec104Struct.SendBuffer[Index++]=CosData.State;
               }

          }
          
          /* Repair Length */
          NsIec104Struct.SendBuffer[7]=SendCount;  /* vsq number */
          NsIec104Struct.SendBuffer[1]=Index-2;

  }
  else 
  {
      Number=NsCheckDd1Soe();
      if(Number>0)
      {
         if(Number>18)
            Number=18;
          SendCount=0;
          Index=0;
          NsIec104Struct.SendBuffer[Index++]=0x68;
          NsIec104Struct.SendBuffer[Index++]=0x00;

          RealNumber=(NsIec104Struct.SendMeNumber<<1);
          P=(unsigned char *)&RealNumber;
          NsIec104Struct.SendBuffer[Index++]=P[0];              /*     send number       */
          NsIec104Struct.SendBuffer[Index++]=P[1];
          NsIec104Struct.SendMeNumber=(NsIec104Struct.SendMeNumber+1)%65535;


          NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[0];              /*     receive number    */
          NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[1];

          NsIec104Struct.SendBuffer[Index++]=30;                 /*    asdu type   */
          NsIec104Struct.SendBuffer[Index++]=1;                  /*    information object count  */

           /*  REASONBYTE  now is two */
          NsIec104Struct.SendBuffer[Index++]=0x03;               /*    reason  */
          NsIec104Struct.SendBuffer[Index++]=0x00;               /*    reason  */

             
          for(i=0;i<NS_IEC_104_ASDUADDRESSBYTE;i++)
             NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.CommonAsduAddress[i];

          for(i=0;i<Number;i++)
          {
              if(NsGetDd1SoeLib(&SoeData)==ON)
              {               
                 SendCount++;
                 /* Information Object Address now three byte:  0xc01---0xc80 */
                 Object=SoeData.SendNumber+0x01;
                 P=(unsigned char *)&Object;
                 NsIec104Struct.SendBuffer[Index++]=P[0];
                 NsIec104Struct.SendBuffer[Index++]=P[1];
                 NsIec104Struct.SendBuffer[Index++]=0x00;
                 NsIec104Struct.SendBuffer[Index++]=SoeData.State;
                 Msecond=SoeData.Msecond+SoeData.Second*1000;
                 P=(unsigned char *)&Msecond;
                 NsIec104Struct.SendBuffer[Index++]=P[0];
                 NsIec104Struct.SendBuffer[Index++]=P[1];
                 NsIec104Struct.SendBuffer[Index++]=SoeData.Minute;
                 NsIec104Struct.SendBuffer[Index++]=SoeData.Hour;
                 NsIec104Struct.SendBuffer[Index++]=SoeData.Day;
                 NsIec104Struct.SendBuffer[Index++]=SoeData.Month;
                 NsIec104Struct.SendBuffer[Index++]=(SoeData.Year-2000);

              }
           }
          /* Repair Length */
          NsIec104Struct.SendBuffer[7]=SendCount;  /* vsq number */
          NsIec104Struct.SendBuffer[1]=Index-2;
      }
      else 
      {
         if(NsIec104Cycle[0].TimeSign== ON)
         {
                    Index=0;
                    NsIec104Struct.SendBuffer[Index++]=0x68;
                    NsIec104Struct.SendBuffer[Index++]=0x04;
                    NsIec104Struct.SendBuffer[Index++]=0x43;
                    NsIec104Struct.SendBuffer[Index++]=0x00;
                    NsIec104Struct.SendBuffer[Index++]=0x00;
                    NsIec104Struct.SendBuffer[Index++]=0x00;
                    NsIec104Cycle[0].TimeSign=OFF;
         }
      }
  }
  if(Index>0)
  {
     NsIec104Struct.SendLength=send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.SendBuffer[0],Index,0x0);
     CosSendSign=0x01;
  }
  return CosSendSign;
}



static  void       NsIec104ProcessYkYt(void)
{

unsigned char     YkInformation,YkReason,YkWhat;
unsigned short    YkObject;
unsigned char     Media,YkAction;
NS_RELATION       Dear;

/*
     Information Object Address 0xb01---0xb80  
 for(i=0;i< NS_IEC_104_REASONBYTE;i++)
             NsIec104Struct.TransmitReason[i]=NsIec104Struct.ReceiveBuffer[NS_STARTREASON+i];
for(i=0;i<NS_IEC_104_INFORMATIONBYTE;i++)
             NsIec104Struct.InformationObject[i]=NsIec104Struct.ReceiveBuffer[NS_STARTINFORMATION+i];

*/

 YkInformation=NsIec104Struct.ReceiveBuffer[NS_STARTINFORMATION+NS_IEC_104_INFORMATIONBYTE];
 YkReason=NsIec104Struct.ReceiveBuffer[NS_STARTREASON];

 YkObject=NsIec104Struct.ReceiveBuffer[NS_STARTINFORMATION]+NsIec104Struct.ReceiveBuffer[NS_STARTINFORMATION+1]*256;
 YkObject-=0xb01;

 YkWhat=0;  /* nothing */ 
 if(YkReason==6)
 {
      if(YkInformation&0x80)    /* YkSelect  */
          YkWhat=1;
      else 
          YkWhat=2;             /*  YkExe*/


 }
 else 
     if(YkReason==8)  /* Esc*/
        YkWhat=3;

 switch(YkWhat)
 {
   case 1:  /* select */

⌨️ 快捷键说明

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