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

📄 relay.lst

📁 此源码为商用的电力抄表系统的从机端源程序。通过电力载波模块
💻 LST
字号:
C51 COMPILER V8.01   RELAY                                                                 12/22/2005 17:08:47 PAGE 1   


C51 COMPILER V8.01, COMPILATION OF MODULE RELAY
OBJECT MODULE PLACED IN relay.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE relay.c ROM(COMPACT) OPTIMIZE(9,SPEED) BROWSE MODP2 DEBUG OBJECTEXTEND PREP
                    -RINT

line level    source

   1          /*=============================================================================*/
   2          // relay.c  - source file for lme2200 API
   3          // 
   4          // Copyright 2005, Leaguer MicroElectronics Co., Ltd
   5          // www.leaguerme.com
   6          /*=============================================================================*/
   7          
   8          #include <REG922.H>
   9          
  10          #include "amr_config.h"
  11          #include "amr_cctr.h"
  12          #include "wr_flash.h"
  13          #include "relay.h"
  14          #include "timer.h"
  15          #include "plc.h"
  16          #include "sart.h"
  17          #include "stdio.h"
  18          
  19          #define uint unsigned int
  20          #define uchar unsigned char
  21          
  22          #define PLC_TIMEOUT     10000     // x basic timer 
  23          idata uchar plc_frame[18];
  24          extern idata uchar amr_frame[];  // AMR frame buffer
  25          uchar code auto_frame[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x06,0x43,0xC3,0xcc,0xcc,0xcc,0xcc,0x8d,0x16
             -};//9999.99
  26          
  27          extern code uchar  METER_ADDR[6];
  28          uchar   RELAY_PATH[6];  // hold the last successful relay path to cctr
  29          idata  uchar   relay_level;         // the last relay levels to cctr
  30          uchar code ADDR_flash[6]; 
  31          idata uchar cur_pos;
  32          uchar L_amr;
  33          uchar check_sum;//自动返回校验和
  34          bit tmout_t1;
  35          extern bit open_com_data;
  36          extern bit NO_METER;
  37          extern bit delay_tx;
  38          /*=============================================================================*/
  39          
  40          /* time-out functions */
  41          /*
  42          void plc_tmout(void)
  43          {
  44            plc_timeout = 1;
  45            disable_t1();
  46          }
  47          
  48          */
  49          
  50          /*=============================================================================*/
  51          
  52          void accept_frame(uchar frame[])
  53          {  
C51 COMPILER V8.01   RELAY                                                                 12/22/2005 17:08:47 PAGE 2   

  54   1        uchar R, L, i;
  55   1       // uchar addr[6];
  56   1        bit  D7; 
  57   1      
  58   1        R = (frame[0] & 0x30) >> 4;     //中继级数 
  59   1                       
  60   1        D7 = (bit)(frame[0] & 0x80);
  61   1        L = frame[2*R + 4]; //数据长度
  62   1         // save relay path
  63   1        relay_level = R;
  64   1        for (i = 0; i < R; i++) {
  65   2          RELAY_PATH[2*i] = frame[2*i+3];
  66   2              RELAY_PATH[2*i+1] = frame[2*i+4];
  67   2        }
  68   1       
  69   1      /*-----------------------仿真校验和----------------------------*/
  70   1        check_sum = 0xd0;
  71   1        for (i = 0; i < 6; i++)
  72   1         check_sum +=  METER_ADDR[i];
  73   1      /*--------------------------------------------------------------*/
  74   1      
  75   1        clr_wdt();
  76   1        // pass the frame to meter
  77   1        if(D7){                  
  78   2            send_to_cctr(frame,0);     //集中器回抄后续帧
  79   2        }  
  80   1      
  81   1         else {
  82   2                 if(NO_METER)amr_send_frame(METER_ADDR, &frame[2*R+4-AMR_OS_L]);      //D7=0发入表端
  83   2                 else send_to_cctr(auto_frame,1);       //自动返回
  84   2      
  85   2         }
  86   1      }
  87          
  88          /*=============================================================================*/
  89          /*                                                      中继转发处理                                                   */
  90          /*=============================================================================*/
  91          
  92          void relay_frame(uchar frame[], bit uplink)
  93          {
  94   1        uchar k;
  95   1      
  96   1      
  97   1        k = frame[0] & 0x03;  //中继次数
  98   1        frame[0] &= 0xfc;
  99   1      
 100   1        if (!uplink) {//<-------下传减一
 101   2              frame[0] |= (k-1);
 102   2        }
 103   1        else {        //<-------上传加一
 104   2              frame[0] |= (k+1);
 105   2        }
 106   1        clr_wdt();
 107   1        while(delay_tx)clr_wdt();  
 108   1         plc_send(frame);     //<----中继载波发送
 109   1         if(open_com_data)tx_com_data(frame,0);               //从串口发出数据  
 110   1      
 111   1      }
 112          /*=============================================================================*/
 113          /*                                                         将信号发入电力网线                                      */
 114          /*=============================================================================*/
 115          
C51 COMPILER V8.01   RELAY                                                                 12/22/2005 17:08:47 PAGE 3   

 116          void send_to_cctr(uchar frame[],bit IL)
 117          {
 118   1        idata uchar buf[16];
 119   1        uchar i, pos, max_bytes;
 120   1        uchar come,R;
 121   1        bit TX;
 122   1       
 123   1        TX = 0;
 124   1        R = 0;
 125   1      
 126   1        if(IL)frame[14] =  check_sum; //自动返回校验和
 127   1              
 128   1        if(IL){
 129   2                  L_amr = frame[7] + 4;come = 6;cur_pos = 0;TX = 1;   /*<-----------------------------表数据*/
 130   2                } 
 131   1         else {       
 132   2                          
 133   2                        switch(plc_frame[2*relay_level + 3]){  //CMD0
 134   3                    
 135   3                      case 0x01: {cur_pos = plc_frame[2*relay_level + 4];come = 2*relay_level +6;R = 0;TX = 1;R = 1;} b
             -reak;  //<--------来自后续W数
 136   3              
 137   3                              case 0x02: {cur_pos =0x02;come = 2*relay_level +4;R = 1;TX = 1;R = 0; L_amr = 14;}break;                
 138   3                      
 139   3                  default:{TX = 0;}break;
 140   3                }
 141   2                }     
 142   1              
 143   1                max_bytes = 18 - (2*relay_level + 4);//4
 144   1              
 145   1                buf[0] = 0x40 | (relay_level << 4); //D6=1 uplink message, R, K  = 0
 146   1               
 147   1                if ((uchar)(L_amr - cur_pos) > max_bytes)   buf[0] |= 0x04;             //设D2为1
 148   1                else  buf[0] &= 0xfb; 
 149   1              
 150   1                buf[1] = METER_ADDR[0];
 151   1                buf[2] = METER_ADDR[1];
 152   1              
 153   1                pos = 3;
 154   1              
 155   1                if (relay_level > 0) {
 156   2                    for (i = 0; i < relay_level; i++) {
 157   3                          buf[2*i+3] = RELAY_PATH[2*i];
 158   3                          buf[2*i+4] = RELAY_PATH[2*i+1];
 159   3                        }     
 160   2                        pos = 2*relay_level + 3;
 161   2                }
 162   1      
 163   1        buf[pos++] = cur_pos;
 164   1      
 165   1        for (i = 0; i < max_bytes; i++) {     //  buf[pos+i] = frame[come +cur_pos++];   
 166   2      
 167   2              if(IL){
 168   3              buf[pos+i] = frame[come++];//*   表端数据
 169   3                cur_pos++;
 170   3              }       
 171   2              else{
 172   3                if(R){
 173   4                      buf[pos+i] = frame[6+cur_pos++];//**是01h时有W
 174   4                }
 175   3            else buf[pos+i] = plc_frame[come++];  //02h---AA
 176   3              }       
C51 COMPILER V8.01   RELAY                                                                 12/22/2005 17:08:47 PAGE 4   

 177   2              if (cur_pos >= L_amr) {
 178   3                buf[pos+i] = 0x00; //剩下的值清零
 179   3                if(cur_pos == max_bytes) cur_pos = 255;                 
 180   3              }
 181   2        }
 182   1      
 183   1        clr_wdt();
 184   1      /*-------------------------------------------------------------------------*/
 185   1        while(delay_tx)clr_wdt(); /*-延迟返回------*/
 186   1        if(TX)plc_send(buf);
 187   1        if(open_com_data) tx_com_data(buf,0);;//从串口发出数据
 188   1       
 189   1      }
 190          
 191          /*=============================================================================*/
 192          /*                                                              取表地址                                                   */
 193          /*=============================================================================*/
 194          
 195          // Get meter address from received amr frame from meter
 196          void get_meter_addr(uchar frame[],bit err)
 197          {
 198   1        uchar i;
 199   1        Rxok  = 0;
 200   1      //  uchar buf[16]
 201   1      //frame --->99 99 99 99 99 99 8A 00 33 33 33 33 33 33 A8 16 
 202   1         for(i = 0;i < 6; i++ )
 203   1            frame[i] =  frame[8 +i];
 204   1      
 205   1         for(i = 0;i < 10; i++ )
 206   1            frame[7 +i] =  0;
 207   1      
 208   1         eviscerate(frame,6);//-33
 209   1         if(err){
 210   2         EA = 0; 
 211   2         FLASH_WriteNByte((int code *)METER_ADDR, frame, 6);
 212   2         EA = 1;
 213   2      //   EA = 0; 
 214   2       //  FLASH_ReadNByte ((int code *)&ADDR_flash, METER_ADDR, 6);
 215   2      //   EA = 1; 
 216   2         }
 217   1         for(i = 0;i < 6; i++ )
 218   1            frame[i] =  METER_ADDR[i];
 219   1      
 220   1         frame[8] = amr_check_cs(frame,0);//校验和
 221   1      
 222   1      }
 223          
 224          /*$$$$$$$$$$$$$$$$$$$$$$$$$$$$<<<<<软件说明>>>>>$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$* /
 225                                  软件修改说明在main.c,敬请留意
 226          
 227          !!!!!!重复特别注意:写表的地址必须从串口写入才有效!!!!!
 228                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 229          
 230          /*$$$$$$$$$$$$$$$$$$$$$$$$$$$$<<<<<软件说明>>>>>$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*/
 231          
 232          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    801    ----
   CONSTANT SIZE    =     22    ----
   XDATA SIZE       =   ----    ----
C51 COMPILER V8.01   RELAY                                                                 12/22/2005 17:08:47 PAGE 5   

   PDATA SIZE       =   ----    ----
   DATA SIZE        =      8      18
   IDATA SIZE       =     20      16
   BIT SIZE         =      1       5
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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