📄 relay.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 + -