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

📄 101.c

📁 此源代码为电力系统中的RTU终端反馈!具有GPRS通讯功能!
💻 C
📖 第 1 页 / 共 4 页
字号:
#include "101.h"
#include "yx_key.h"
#include "static.h"
#include "DataDef.h"
void EncodeFixedLenFrame(void)
{
  BYTE temp;
  strcontrol.DIR=1;
  strcontrol.PRM=0;
  
  TCommCode[0]=0x10;                         //start code
  memcpy(&TCommCode[1],&strcontrol,1);
  memcpy(&TCommCode[2],&TTU_RunParam.AddrOfTTU,1);
  temp=CheckSum(&TCommCode[1],2);
  memcpy(&TCommCode[3],&temp,1);
  TCommCode[4]=EndCode;                       //end code 
  m_EnCur=5;
  CommState.TxWait=1;
  TxGap=TTU_RunParam.PWM_SET; ; //发送间隙
   
  CS485TransmitEnable;      //485发送使能
  IE2 |= UTXIE1;
 
}

void EncodeVariableLenFrame(BYTE nTypeIdentity,BYTE nCause,BYTE nFuction,BYTE nGroup)//..........................................0
{
   EncodeASDUFrame(nTypeIdentity,nCause,nFuction,nGroup);
   EncodeStartFrame(nASDULen);  
   EncodeEndFrame(nASDULen);       
   m_EnCur=nASDULen+8;                //length of the whole frame 
   CommState.TxWait=1; 
   TxGap=TTU_RunParam.PWM_SET; ; //发送间隙
   if(TTU_RunParam.TTU_Control_Param & BIT1 )  //发送间隙变长,用于载波通讯
  { 
    if(m_EnCur >128)
      TxGap <<=2; //发送间隙
   else 
    { 
     if(m_EnCur >64)
       TxGap <<=1;  //发送间隙    
    } 
   }  
    CS485TransmitEnable;           
    IE2 |= UTXIE1;     
}

void EncodeStartFrame(BYTE nASDULen)//...........................................................................................2
{
   TCommCode[0]=StartCode;
   TCommCode[1]=nASDULen+2;         //L
   TCommCode[2]=nASDULen+2;         //L
   TCommCode[3]=StartCode;
   memcpy(&TCommCode[4],&strcontrol,1);
   TCommCode[5]=TTU_RunParam.AddrOfTTU;         //the address of substation
}

void EncodeASDUFrame(BYTE nTypeIdentity,BYTE nCause,BYTE nFuction,BYTE nGroup)//................................................1
{
  int i;
  BYTE nRecords=0,temp=0;
  BYTE *pd;
  long tt;
         
  strcontrol.DIR=1;
  strcontrol.PRM=0; 
  strcontrol.FUNCTION=nFuction;
  
  nVarQualifier.SQ=1;
  nTransCause.PN=0;
  TCommCode[6]=nTypeIdentity;                    //type indentity
     
  nTransCause.T=0;
  nTransCause.CAUSE=nCause;
  memcpy(&TCommCode[8],&nTransCause,1);
  
  TCommCode[9]=TTU_RunParam.AddrOfTTU;          //application sevice data unit address  
  
  if(nTypeIdentity==C_TS_NB_1)                   //test channel
  {
    nTransCause.T=1;
    memcpy(&TCommCode[8],&nTransCause,1);
    nVarQualifier.SQ=0;
    nVarQualifier.NumsOfObject=1;
    memcpy(&TCommCode[7],&nVarQualifier,1);
    TCommCode[10]=0;                           //INFORMATION OBJECT ADDRESS
    TCommCode[11]=0;
    TCommCode[12]=0xAA;  
    TCommCode[13]=0X55;    
    nASDULen=8;                               
  } 
  
  //DATA UNIT INDENTIFIER
  if(nTypeIdentity==C_IC_NA_1)                 // Total Interrogation command confirm   
  { 
 
   if(nGroup==20)                             //总召唤确认帧 
   {
    nVarQualifier.SQ=0;
    nVarQualifier.NumsOfObject=1;
    memcpy(&TCommCode[7],&nVarQualifier,1);
    TCommCode[10]=0;                      //INFORMATION OBJECT ADDRESS
    TCommCode[11]=0;
    TCommCode[12]=20;                    //QOI                     
   
    nASDULen=7;
    return;
   }
   //************ 
   if(nGroup==29)                           //分组召唤第9组响应 不带品质描述 图105
   {
    nVarQualifier.NumsOfObject= P_YC_MAX;         //32 yc value here (把时间做为最后一个遥测量)
    memcpy(&TCommCode[7],&nVarQualifier,1);
    TCommCode[10]=0x01;                    //INFORMATION OBJECT ADDRESS
    TCommCode[11]=0x07;
    
    memcpy(&TCommCode[12],&BD_data.Ua,58);
    nASDULen= 64;
    return;
   }
   
   if(nGroup==21)                               //第1组分组召唤响应 图106
   {
    TCommCode[6]=0x01;
    nVarQualifier.NumsOfObject=20;            
    memcpy(&TCommCode[7],&nVarQualifier,1);
    TCommCode[10]=0x01;                      //INFORMATION OBJECT ADDRESS
    TCommCode[11]=0x0;    
    //yao xin value     
    for(i=1;i<5;i++)
    {
       TCommCode[11+i] = (YxNew>>i) & (BIT0);            
    }        
    temp=16;
    for(i=0;i<16;i++)
    {
      TCommCode[temp++] = (YxInNew>>i) & (BIT0);      
    }   
    nASDULen=26;//58

    return;
   }
 //*********************
 }

  if(nTypeIdentity==M_SP_NA_1)               //单点遥信或单点遥信变化响应 1
  {
   nVarQualifier.SQ=0;
   strcontrol.FUNCTION=8;
   nVarQualifier.NumsOfObject=20;             //20路遥信
   memcpy(&TCommCode[7],&nVarQualifier,1);  
   temp=10;
   for(i=1;i<5;i++)
   {
      TCommCode[temp++]= i;            //information address    
      TCommCode[temp++]=0;   
      TCommCode[temp++] = (YxNew>>i) & (BIT0);      
   }
   
   for(i=0;i<16;i++)
   {
      TCommCode[temp++]= i+5;            //information address    
      TCommCode[temp++]=0;   
      TCommCode[temp++] = (YxInNew>>i) & (BIT0);      
   }   
   nASDULen=64;
   return;  
  }
  
  if(nTypeIdentity==M_ME_ND_1)             //M_ME_ND_1 , 不带品质描述的遥测
  {             
     nVarQualifier.NumsOfObject=P_YC_MAX;         //32个量
     memcpy(&TCommCode[7],&nVarQualifier,1);
     nTransCause.CAUSE=nCause;
     TCommCode[10]=0x01;                   //information object address
     TCommCode[11]=0x07;  
     memcpy(&TCommCode[12],&BD_data.Ua,58); 
     nASDULen=64;
     return ;
  }

  if(nTypeIdentity==C_IC_NA_1)              // Total Interrogation command end
  { 
   nVarQualifier.NumsOfObject=1;
   memcpy(&TCommCode[7],&nVarQualifier,1);
   TCommCode[10]=0;                        //INFORMATION OBJECT ADDRESS
   TCommCode[11]=0;
   TCommCode[12]=20;                       //QOI                     
   
   nASDULen=7;
   return;   
  }

  if(nTypeIdentity==M_EI_NA_1)             //End of initialisation
  {
   nVarQualifier.SQ=0;
   nTransCause.PN=0;
   nVarQualifier.NumsOfObject=1;
   memcpy(&TCommCode[7],&nVarQualifier,1);
   TCommCode[10]=0;                        //INFORMATION OBJECT ADDRESS
   TCommCode[11]=0;
   
   TCommCode[12]=nCOI;                     //COI   mark the cause of initialisation
   
   nASDULen=7;
   return;
  }
  
  if(nTypeIdentity== 9)                               //无品质描述的遥测数据变化响应
  {
   nTransCause.PN=0;
   nVarQualifier.NumsOfObject=P_YC_MAX;
   memcpy(&TCommCode[7],&nVarQualifier,1);   
   temp=10;
   pd=(BYTE*)(&BD_data);
    TCommCode[temp++]=0x01;   
    TCommCode[temp++]=0x07;
   for(i=0;i<29;i++)
   {
    TCommCode[temp++]=*pd;pd++;
    TCommCode[temp++]=*pd;pd++;
    TCommCode[temp++]=0;    
   }
   nASDULen=temp-6;                                   //29*4+4;
   return;
  }
  
  if(nTypeIdentity==M_SP_TA_1)                   //Single-point information with time tag  (here is SOE)
  {
   nVarQualifier.SQ=0;
    temp=10;
   if(DeviceState.bSOEOverFlow==0)
   {
 
     for(i=0;i<nSOERecords;i++)
     {
        TCommCode[temp++]=soe[i].SOE_ID;                      //INFORMATION OBJECT ADDRESS
        TCommCode[temp++]=0x00;
        TCommCode[temp++]=soe[i].SPI;
        TCommCode[temp++]=(BYTE)soe[i].MillSecond;   //ms
        TCommCode[temp++]=(BYTE)(soe[i].MillSecond>>8);     //ms
        TCommCode[temp++]=soe[i].Minute;              //minu
        
     }   
     nVarQualifier.NumsOfObject=nSOERecords;                 //16 SOE here
   }
   else
   {
     nRecords=nSOERecords;
     for(i=0;i<16;i++)
     {   
        TCommCode[temp++]=soe[nRecords].SOE_ID;                      //INFORMATION OBJECT ADDRESS
        TCommCode[temp++]=0x00;
        TCommCode[temp++]=soe[nRecords].SPI;
        TCommCode[temp++]=(BYTE)soe[nRecords].MillSecond;   //ms
        TCommCode[temp++]=(BYTE)(soe[nRecords].MillSecond>>8);     //ms
        TCommCode[temp++]=soe[nRecords].Minute;              //minu  
        nRecords++;
        if(nRecords>15)
         nRecords=0;
     }
     nVarQualifier.NumsOfObject=16;                 //16 SOE here
   }
    memcpy(&TCommCode[7],&nVarQualifier,1);   
   nASDULen=nVarQualifier.NumsOfObject*6+ 4 ;
   
   return;              
  }
  
  if(nTypeIdentity==M_IT_NA_1)               //某一组的电能脉冲记数量
  { 
   TCommCode[6]=M_IT_NA_1;                      
   if(nGroup==0x41)                         //the first group  电镀量
   {
  
      nVarQualifier.NumsOfObject=MAXDD;         // 4 sequence information
      nVarQualifier.SQ=0;
      memcpy(&TCommCode[7],&nVarQualifier,1); 
      temp=10;
      for(i=0;i<MAXDD;i++)
      {
       TCommCode[temp++]=0x01+i;              //INFORMATION OBJECT ADDRESS
       TCommCode[temp++]=0x0c;   
        tt = ReadOneD2(i);
       //Read1024(0,PVPOWERB+(i<<2),TCommCode+temp,4); 
         memcpy(&TCommCode[temp],&tt,4); 
       temp += 4;     
      }
      nASDULen= 32+8;
      return ;
   }

   if(nGroup==0x42)                             //the second sequence 停电记录
   {
      nVarQualifier.NumsOfObject=RunState.nOffRecords;            // 9 sequence information
      nVarQualifier.SQ=0;
      memcpy(&TCommCode[7],&nVarQualifier,1); 
      temp=10;
      for(i=0;i<RunState.nOffRecords;i++)
      {
       TCommCode[temp++]=0x05+i;                      //INFORMATION OBJECT ADDRESS
       TCommCode[temp++]=0x0C;                      
       memcpy(TCommCode+temp, &off_time[i].DomainFlag,sizeof(OffTimeData) );
       temp+=sizeof(OffTimeData);      
      }
      nASDULen= temp-6;// nOffRecords*8+4 ; 
      return;
   }
              
   if(nGroup==0x43)                     //遥测越县记录
   {
      nVarQualifier.NumsOfObject=RunState.ValidRecords;           // 8 sequence information
      nVarQualifier.SQ=0;
      memcpy(&TCommCode[7],&nVarQualifier,1); 
       temp=10;
      //yc overlimits records  
      for(i=0;i<RunState.ValidRecords;i++)
      {
         TCommCode[temp++]=0x0e+i;                       //INFORMATION OBJECT ADDRESS
         TCommCode[temp++]=0x0C;                         //
         TCommCode[temp++]=over_limit[i].YCcode;        
         TCommCode[temp++]=over_limit[i].OverLimitCode; 
         TCommCode[temp++]=over_limit[i].OverLimitValue;
         TCommCode[temp++]=over_limit[i].OverLimitValue>>8;
         TCommCode[temp++]=over_limit[i].UpTimeStart;
         TCommCode[temp++]=over_limit[i].UpTimeStart>>8;
         TCommCode[temp++]=over_limit[i].UpTimeEnd;
         TCommCode[temp++]=over_limit[i].UpTimeEnd>>8;
         TCommCode[temp++]=i+1;                      //mark sequence     
      }
      nASDULen= RunState.ValidRecords*11+4 ;
      return;
   }     
      
     if(nGroup==0x44)                     //统计数据状态记录    
     {
      nVarQualifier.NumsOfObject=sizeof(RTSTATE);            // 9 sequence information
      nVarQualifier.SQ=0;
      memcpy(&TCommCode[7],&nVarQualifier,1); 
      memcpy(&TCommCode[10],&(RunState.ARunTime),sizeof(RTSTATE)); 
      nASDULen=sizeof(RTSTATE)+4 ;
      return;
     }
  }
  
  if(nTypeIdentity==C_DC_NA_1)                  // yk command   confirm frame  46
  {
     if(nGroup==1)
     {
       nTransCause.PN=1;                       //否定认可
       memcpy(&TCommCode[8],&nTransCause,1);
     } 
     nVarQualifier.SQ=0;

⌨️ 快捷键说明

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