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

📄 nsiec104server.c

📁 南瑞的IEC104规约实现的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
         NsIec104Struct.ReceiveYkId=YkObject;
         YkAction=YkInformation&0x03;
         switch(YkAction)
         {
           case  1:   /* Open */
                  NsIec104Struct.YkCellAction=NS_TRIP;
                  break;
           case  2:    /*  close */
                  NsIec104Struct.YkCellAction=NS_CLOSE;       
                  break;     
           default:
                  break;
         }
         NsIec104Struct.YkCellNumber=NsGetYkCell(NS_YK_CELL_NUMBER,NsIec104Struct.ReceiveYkId);
         NsIec104Struct.YkKgNumber=NsGetYkCell(NS_YK_CELL_KG,NsIec104Struct.ReceiveYkId);
         NsIec104Struct.YkNowState=NS_YK_SELECT;
         Media=NsGetYkCell(NS_YK_CELL_CPU,NsIec104Struct.ReceiveYkId); 
         Dear.NsYkPort=NsIec104Struct.Card+NS_IEC_104_YK_BASE_PORT;
         Dear.NsYkSlavePort=Media;
         NsPutDear(&Dear,6);
         NsIec104SendYkMessage(NS_YK_SELECT,NsIec104Struct.YkCellAction);
         NsIec104Struct.YkStartSign=ON;
         getforsecond(&NsIec104Struct.YkStartTime);
         /*
            printf("\n Send Yk SelectId=%d Cell=%d Kg=%d",NsIec104Struct.ReceiveYkId,NsIec104Struct.YkCellNumber,NsIec104Struct.YkKgNumber);
          */
         break;
   case 2:                   /*  YkExe   */
         NsIec104Struct.ReceiveYkId=YkObject;
         YkAction=YkInformation&0x03;
         switch(YkAction)
         {
            case  1:   /* Open */
                  NsIec104Struct.YkCellAction=NS_TRIP;
                  break;
            case  2:    /*  close */
                  NsIec104Struct.YkCellAction=NS_CLOSE;       
                  break;     
            default:
                  NsIec104Struct.YkCellAction=0xff;       
                  break;
          }
          NsIec104Struct.YkCellNumber=NsGetYkCell(NS_YK_CELL_NUMBER,NsIec104Struct.ReceiveYkId);
          NsIec104Struct.YkKgNumber=NsGetYkCell(NS_YK_CELL_KG,NsIec104Struct.ReceiveYkId);
          NsIec104Struct.YkNowState=NS_YK_EXE;
          Media=NsGetYkCell(NS_YK_CELL_CPU,NsIec104Struct.ReceiveYkId); 
          Dear.NsYkPort=NsIec104Struct.Card+NS_IEC_104_YK_BASE_PORT;
          Dear.NsYkSlavePort=Media;
          NsPutDear(&Dear,6);
          NsIec104SendYkMessage(NS_YK_EXE,NsIec104Struct.YkCellAction);
          NsIec104Struct.YkStartSign=ON;
          getforsecond(&NsIec104Struct.YkStartTime);
          /*
           printf("\n Send Yk ExeId=%d Cell=%d Kg=%d",NsIec104Struct.ReceiveYkId,NsIec104Struct.YkCellNumber,NsIec104Struct.YkKgNumber);
           */
          break;
   case 3:
          NsIec104Struct.ReceiveYkId=YkObject;
          YkAction=YkInformation&0x03;
          switch(YkAction)
          {
            case  1:   /* Open */
                  NsIec104Struct.YkCellAction=NS_TRIP;
                  break;
            case  2:    /*  close */
                  NsIec104Struct.YkCellAction=NS_CLOSE;       
                  break;     
            default:
                  NsIec104Struct.YkCellAction=0xff;       
                  break;
          }
          NsIec104Struct.YkCellNumber=NsGetYkCell(NS_YK_CELL_NUMBER,NsIec104Struct.ReceiveYkId);
          NsIec104Struct.YkKgNumber=NsGetYkCell(NS_YK_CELL_KG,NsIec104Struct.ReceiveYkId);
          NsIec104Struct.YkNowState=NS_YK_ESC;
          Media=NsGetYkCell(NS_YK_CELL_CPU,NsIec104Struct.ReceiveYkId); 
          Dear.NsYkPort=NsIec104Struct.Card+NS_IEC_104_YK_BASE_PORT;
          Dear.NsYkSlavePort=Media;
          NsPutDear(&Dear,6);
          NsIec104SendYkMessage(NS_YK_ESC,NsIec104Struct.YkCellAction);
          NsIec104Struct.YkStartSign=ON;
          getforsecond(&NsIec104Struct.YkStartTime);
          /*
           printf("\n Send Yk EscId=%d Cell=%d Kg=%d",NsIec104Struct.ReceiveYkId,NsIec104Struct.YkCellNumber,NsIec104Struct.YkKgNumber);
           */
          break;
   default:
          break;
  } 
}


static void NsIec104SendYkMessage(short Who,unsigned char Action)
{

     char Dd1Message[16];

     switch(Who)
     {
       case  NS_YK_ESC:
             Dd1Message[0]=SEND_YK_HOST_DD1;     
             Dd1Message[1]=NS_YK_ESC;         
             Dd1Message[2]=NsIec104Struct.YkCellNumber;
             Dd1Message[3]=NsIec104Struct.YkKgNumber;
             Dd1Message[4]=NsIec104Struct.YkCellAction;
             NsHostSendYkMessage(SEND_YK_HOST_DD1,8,Dd1Message);
             break;
       case  NS_YK_EXE:
             Dd1Message[0]=SEND_YK_HOST_DD1;  
             Dd1Message[1]=NS_YK_EXE;      
             Dd1Message[2]=NsIec104Struct.YkCellNumber;
             Dd1Message[3]=NsIec104Struct.YkKgNumber;
             Dd1Message[4]=NsIec104Struct.YkCellAction;
             NsHostSendYkMessage(SEND_YK_HOST_DD1,8,Dd1Message);
             break;
       case  NS_YK_SELECT:
             Dd1Message[0]=SEND_YK_HOST_DD1;  
             Dd1Message[1]=NS_YK_SELECT;      
             Dd1Message[2]=NsIec104Struct.YkCellNumber;
             Dd1Message[3]=NsIec104Struct.YkKgNumber;
             Dd1Message[4]=NsIec104Struct.YkCellAction;
             NsHostSendYkMessage(SEND_YK_HOST_DD1,8,Dd1Message);
             break;
     }
}

static void NsIec104ReceiveYkReturn(void)
{
           char    ReturnMessage[16];
           int     Length,HasMessage;
  NS_RELATION      Dear;

   if(NsIec104Struct.YkStartSign==ON)
   {
       NsGetDear(&Dear);
       if(Dear.NsYkPort==(NsIec104Struct.Card+NS_IEC_104_YK_BASE_PORT))
       {
          /*
            printf("\n Yk Return");
           */
          if(NsHostReceiveYkMessage(SEND_YK_HOST_DD1,ReturnMessage)==1)
          {

               /*      
                           printf("\nYkMes0=%0x--1=%0x--2=%0x---3=%0x---4=%0x",
                           ReturnMessage[0],ReturnMessage[1],ReturnMessage[2],ReturnMessage[3],ReturnMessage[4]);
               */
                     
              if(ReturnMessage[0]==SEND_YK_HOST_DD1)
              { 
                 if(NsIec104Struct.YkNowState==ReturnMessage[1])
                 {
                    if((ReturnMessage[2]==NsIec104Struct.YkCellNumber)&&
                       (ReturnMessage[3]==NsIec104Struct.YkKgNumber)&&
                       (ReturnMessage[4]==NsIec104Struct.YkCellAction))
                    {
                         NsIec104Struct.YkError=ReturnMessage[5];
                         if(NsIec104Struct.YkNowState==NS_YK_SELECT)
                         {   
                            NsIec104SendYkSelectConfirm();
                            /*
                               printf("\n Selec Confim");
                             */
                         }
                         else 
                         {
                           if(NsIec104Struct.YkNowState==NS_YK_EXE)
                              NsIec104SendYkExeConfirm();
                           else 
                           {
                              if(NsIec104Struct.YkNowState==NS_YK_ESC)
                                 NsIec104SendYkEscConfirm();
                           }
                         }
                     } 
                 }
              }
           }
        }
   }
}

static  void       NsIec104SendYkSelectConfirm(void)
{


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++]=0x07;          /*    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       NsIec104SendYkExeConfirm(void)
{


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


          /* YkExe Confirm */
          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++]=0x07;          /*    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++]=0x01;
          else 
               if(NsIec104Struct.YkCellAction==NS_CLOSE)
                  NsIec104Struct.SendBuffer[Index++]=0x02;
               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");
          }
          taskDelay(100);
          /* YkExe  End */
          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++]=10;          /*    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++]=0x01;
          else 
               if(NsIec104Struct.YkCellAction==NS_CLOSE)
                  NsIec104Struct.SendBuffer[Index++]=0x02;
               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");
          }
          taskDelay(8);
}

static  void       NsIec104SendYkEscConfirm(void)
{

⌨️ 快捷键说明

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