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

📄 nsiec104server.c

📁 南瑞的IEC104规约实现的源码
💻 C
📖 第 1 页 / 共 5 页
字号:

unsigned short   YkObject,Index;
unsigned char    *P,i;
unsigned short   RealNumber;

          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++]=NsIec104Struct.YkYtType;                 /*    asdu type   */
          NsIec104Struct.SendBuffer[Index++]=1;                  /*    information object count  */

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

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

          /* Information Object Address now three byte:  0xc01---0xc80 */
          YkObject=NsIec104Struct.ReceiveYkId+0xb01;
          P=(unsigned char *)&YkObject;
          NsIec104Struct.SendBuffer[Index++]=P[0];
          NsIec104Struct.SendBuffer[Index++]=P[1];
          NsIec104Struct.SendBuffer[Index++]=0x00;
              /* Value  */
          if(NsIec104Struct.YkCellAction==NS_TRIP)
             NsIec104Struct.SendBuffer[Index++]=0x81;
          else 
               if(NsIec104Struct.YkCellAction==NS_CLOSE)
                  NsIec104Struct.SendBuffer[Index++]=0x82;
               else 
                  NsIec104Struct.YkCellAction=0xff;       
         
          /* Repair Length */
          NsIec104Struct.SendBuffer[1]=Index-2;
          if((NsIec104Struct.SendLength=send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.SendBuffer[0],Index,0x0))<0)
          {
              perror ("Client FirstWrite Error");
          }
}



static  void       NsIec104ProcessPulseAck(void)
{
unsigned short   i,Index,RealNumber;
unsigned char    *P;

          /*  First Send  Confirm */
          Index=0;
          NsIec104Struct.SendBuffer[Index++]=0x68;
          NsIec104Struct.SendBuffer[Index++]=0x0e;

          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++]=101;
          NsIec104Struct.SendBuffer[Index++]=1;

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


          for(i=0;i<NS_IEC_104_INFORMATIONBYTE;i++)
             NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.InformationObject[i];

          NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.Qcc;

          if((NsIec104Struct.SendLength = send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.SendBuffer[0],Index,0x0))<0)
          {
	               perror ("Client Write Error");
          }


}

static  void       NsIec104ProcessPulseEnd(void)
{
unsigned short   i,Index,RealNumber;
unsigned char    *P;

          /*  end confirm*/
          taskDelay(16);
          Index=0;
          NsIec104Struct.SendBuffer[Index++]=0x68;
          NsIec104Struct.SendBuffer[Index++]=0x0e;

          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++]=101;
          NsIec104Struct.SendBuffer[Index++]=1;

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


          for(i=0;i<NS_IEC_104_INFORMATIONBYTE;i++)
             NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.InformationObject[i];

          NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.Qcc;

          if((NsIec104Struct.SendLength = send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.SendBuffer[0],Index,0x0)) < 0)
          {
	               perror ("Client Write Error");
          }

}


static  void       NsIec104ProcessPulse(void)
{
unsigned short   General,Index;
unsigned char    *P;
unsigned short    i,j,RealNumber;



     NsIec104Struct.Qcc=NsIec104Struct.ReceiveBuffer[NS_IEC_104_QCC_POSITION];  
     NsIec104Struct.FreezeSign=NsIec104Struct.Qcc&0xc0;
     
     NsIec104Struct.FreezeSign>>=6;
     NsIec104Struct.PulseGroup=NsIec104Struct.Qcc&0x3f;

     switch(NsIec104Struct.FreezeSign)
     {
        case 0:
               NsIec104ProcessPulseData();
               break;
        case 1:
        case 2:
        case 3:
               NsIec104ProcessPulseAck();
               break;
     }           
}

static  void       NsIec104ProcessPulseGroup(void)
{
unsigned short   General,Index;
unsigned char    *P,start;
unsigned short    i,j,RealNumber,YmLib;


     for(start=0;start<2;start++)
     {
          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++]=15;                 /*    asdu type   */
          NsIec104Struct.SendBuffer[Index++]=16;           /*    information object count  */

           /*  REASONBYTE  now is two */
          NsIec104Struct.SendBuffer[Index++]=37+NsIec104Struct.PulseGroup;          /*    reason  */
          NsIec104Struct.SendBuffer[Index++]=0x0;               /*    reason  */

             
          for(i=0;i<NS_IEC_104_ASDUADDRESSBYTE;i++)
             NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.CommonAsduAddress[i];
          YmLib=start*16+32*(NsIec104Struct.PulseGroup-1);
          switch(NsIec104Struct.Table)
          {
           case 0:
                 NsGetDd1Lib(NS_YM_DATA,YmLib,NsIec104Struct.DataBuff,16);
                 break;
           case 1:
                 NsGetDd2Lib(NS_YM_DATA,YmLib,NsIec104Struct.DataBuff,16);
                 break;
           case 2:
                 NsGetDd3Lib(NS_YM_DATA,YmLib,NsIec104Struct.DataBuff,16);
                 break;
           case 3:
                 NsGetDd4Lib(NS_YM_DATA,YmLib,NsIec104Struct.DataBuff,16);
                 break;
          }

          for(i=0;i<16;i++)
          {
              /* Information Object Address now three byte:  0xc01---0xc80 */

              NsIec104Struct.SendBuffer[Index++]=0x80+i+start*16+32*(NsIec104Struct.PulseGroup-1);
              NsIec104Struct.SendBuffer[Index++]=0x0c;
              NsIec104Struct.SendBuffer[Index++]=0;
              /* Value  */
              NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.DataBuff[4*i];
              NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.DataBuff[4*i+1];
              NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.DataBuff[4*i+2];
              NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.DataBuff[4*i+3];
              /* sequence number  */
              NsIec104Struct.SendBuffer[Index++]=start*16+i;
          }  
          /* Repair Length */
          NsIec104Struct.SendBuffer[1]=Index-2;
          if((NsIec104Struct.SendLength=send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.SendBuffer[0],Index,0x0))<0)
          {
	               perror ("Client FirstWrite Error");
          }
     }
}

static  void       NsIec104ProcessPulseAll(void)
{
unsigned short      General,Index;
unsigned char       *P,GroupIndex,start;
unsigned short      i,j,RealNumber;
unsigned long       InformationObject;


   GroupIndex=0;
   NsIec104Struct.NeedSendNumber=0;
   NsIec104Struct.HasSendNumber=0;
   NsIec104Struct.LeftSendNumber=0;

   /*  First Send  Confirm */
   Index=0;
   NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=0x68;
   NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=0x0e;

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

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

   NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=101;
   NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=1;

   for(i=0;i< NS_IEC_104_REASONBYTE;i++)
       NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=0x07;
             
   for(i=0;i<NS_IEC_104_ASDUADDRESSBYTE;i++)
       NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.CommonAsduAddress[i];

   for(i=0;i<NS_IEC_104_INFORMATIONBYTE;i++)
       NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.InformationObject[i];

   NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.Qcc;
   NsIec104Struct.GroupSendLength[GroupIndex]=Index;

   GroupIndex++;
   NsIec104Struct.NeedSendNumber++;
   
   for(start=0;start<NS_IEC_104_TOTAL_YM_TIMES;start++)           /* total 128 ym send 8 times */            
   {
          Index=0;
          NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=0x68;
          NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=0x00;

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

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

          NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=15;                            /*    asdu type   */
          NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NS_IEC_104_ONCE_YM ;           /*    information object count  */

           /*  REASONBYTE  now is two */
          NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=37  ;          /*    reason  */
          NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=0x0;               /*    reason  */

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

          switch(NsIec104Struct.Table)
          {
           case 0:
                 NsGetDd1Lib(NS_YM_DATA,start*NS_IEC_104_ONCE_YM,NsIec104Struct.DataBuff,NS_IEC_104_ONCE_YM);
                 break;
           case 1:
                 NsGetDd2Lib(NS_YM_DATA,start*NS_IEC_104_ONCE_YM,NsIec104Struct.DataBuff,NS_IEC_104_ONCE_YM);
                 break;
           case 2:
                 NsGetDd3Lib(NS_YM_DATA,start*NS_IEC_104_ONCE_YM,NsIec104Struct.DataBuff,NS_IEC_104_ONCE_YM);
                 break;
           case 3:
                 NsGetDd4Lib(NS_YM_DATA,start*NS_IEC_104_ONCE_YM,NsIec104Struct.DataBuff,NS_IEC_104_ONCE_YM);
                 break;
          }
          for(i=0;i<NS_IEC_104_ONCE_YM;i++)
          {
              /* Information Object Address now three byte:  0xc01---0xc80 */
              InformationObject=0xc01+i+start*NS_IEC_104_ONCE_YM;
              P=(unsigned char *)&InformationObject;
              NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=P[0];
              NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=P[1];
              NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=P[2];
              /* Value  */
              NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.DataBuff[4*i];
              NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.DataBuff[4*i+1];
              NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.DataBuff[4*i+2];
              NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.DataBuff[4*i+3];
              /* sequence number  */
              NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=i;
          }  
          /* Repair Length */
          NsIec104Struct.GroupSendBuffer[GroupIndex][1]=Index-2;

⌨️ 快捷键说明

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