📄 rscomm.lst
字号:
206 3 ArrayInit(ComBuf,RS_MaxSize);
207 3
208 3 //数据清零
209 3 for(i=0;i<16;i++)
210 3 {
211 3 Addr[0] = 0xA0;
212 3 Addr[1] = i*16;
213 3 Len[1] = 16;
214 3 WriteEPMData(ComBuf);
215 3
216 3 Addr[0] = 0xA2;
217 3 WriteEPMData(ComBuf);
218 3 }
219 3
220 3 ComBuf[0] = 0x02;
221 3 ComBuf[1] =~0x02;
222 3
223 3 Addr[0] = 0xA0;
224 3 Addr[1] = 0xBE;
225 3 Len[1] = 0x02;
226 3 WriteEPMData(ComBuf);
227 3
228 3 AUXR1 |= 0x08; //复位
229 3 }
230 3 }
231 3 //※※※※※※※※※※※※※※※※※※※※※※※※※※※※
232 3 */
233 3
234 3 else if(TFlag==0x20) //密码修改
235 3 {
236 4 j = PsWdCHK(RS_CmdPtr); //旧密码检查
237 4
238 4 for(i=0;i<4;i++) //构造返回数据
239 4 {
240 5 ComBuf[RS_CmdPtr+i] = ComBuf[RS_CmdPtr+4+i];
C51 COMPILER V7.50 RSCOMM 04/13/2007 13:24:53 PAGE 5
241 5 }
242 4
243 4 ComBuf[RS_CmdPtr+4] = ~SumCHK(&ComBuf[RS_CmdPtr+1],3);//密码的校验和
244 4
245 4 Addr[0] = 0xA0;
246 4 Len[1] = 0x04;
247 4
248 4 if((j==0x10)&&(ComBuf[RS_CmdPtr]==0x00))//清零密码
249 4 {
250 5 Addr[1] = 0xE8;
251 5 WriteEPMData(&ComBuf[RS_CmdPtr+1]);
252 5
253 5 Flag |= 0x0A;
254 5 //TimeProg = 1;
255 5 //TxdFlag = 1;
256 5 }
257 4
258 4 if((j==0x11)&&(ComBuf[RS_CmdPtr]==0x01))//编程密码
259 4 {
260 5 Addr[1] = 0xEC;
261 5 WriteEPMData(&ComBuf[RS_CmdPtr+1]);
262 5
263 5 Flag |= 0x0A;
264 5 //TimeProg = 1;
265 5 //TxdFlag = 1;
266 5 }
267 4 RS_Len = 0x04;
268 4 }
269 3
270 3 else if(TFlag==0x21) ReadMeter(); //读电表数据
271 3 else
272 3 {
273 4 WriteMeter(); //设置电表数据
274 4 RS_Len = 0x00;
275 4 }
276 3 }
277 2
278 2 if( TimeProg==1 ) //编程时间及编程次数
279 2 {
280 3 TimeProg = 0;
281 3
282 3 RTC_Read();
283 3
284 3 //编程时间
285 3 ComBuf[40] = Min; //分
286 3 ComBuf[41] = Hour; //时
287 3 ComBuf[42] = Day; //日
288 3 ComBuf[43] = Month; //月
289 3 ComBuf[44] = SumCHK(&ComBuf[40],4); //校验和
290 3
291 3 //编程次数
292 3 Addr[0] = 0xA0;
293 3 Addr[1] = 0xE5;
294 3 Len[1] = 0x03;
295 3 do
296 3 {
297 4 ReadData(&ComBuf[45]);
298 4 i= ComBuf[45]+ComBuf[46]; //SumCHK(&ComBuf[45],2);
299 4 } while((i!=ComBuf[47])&&(Addr[0]<=0xA4));
300 3
301 3 if(i!=ComBuf[47])
302 3 {
C51 COMPILER V7.50 RSCOMM 04/13/2007 13:24:53 PAGE 6
303 4 ComBuf[45] = 0x00;
304 4 ComBuf[46] = 0x00;
305 4 }
306 3
307 3 BCDINC(&ComBuf[45],2,1); //编程次数+1
308 3 ComBuf[47]=ComBuf[45]+ComBuf[46]; //SumCHK(&ComBuf[45],2);
309 3
310 3 //写编程时间+编程次数
311 3 Addr[0] = 0xA0;
312 3 Addr[1] = 0xE0;
313 3 Len[1] = 0x08;
314 3 WriteEPMData(&ComBuf[40]);
315 3
316 3 //写校时时间
317 3 if(TimeAdj==1)
318 3 {
319 4 TimeAdj = 0;
320 4
321 4 Addr[0] = 0xA2;
322 4 Addr[1] = 0xF8;
323 4 Len[1] = 0x05;
324 4 WriteEPMData(&ComBuf[40]);
325 4 }
326 3 }
327 2
328 2 ComPtr = 0x00; //通讯缓冲区初始指针
329 2
330 2 if(TxdFlag==1) //电表应答
331 2 {
332 3 TxdFlag = 0;
333 3
334 3 LED_COMM = 0;
335 3 CommSec = CommLEDTime; //亮10秒
336 3
337 3 Proc33(0x33); //数据加0x33处理
338 3
339 3 RS_Ctrl |= 0x80; //从机应答标识符
340 3 RS_CRC = SumCHK(ComBuf,RS_CmdPtr+RS_Len);
341 3 RS_End = 0x16;
342 3
343 3 TxdWork = 1; //发送标志
344 3 ES = 1;
345 3
346 3 TB8 = 1; //偶校验
347 3 SBUF = 0xFE; //发送第一个字节值
348 3 }
349 2 else
350 2 {
351 3 COMMSEL = 0; //默认红外通讯方式
352 3 CTRL485 = 1; //RS485接收状态
353 3
354 3 TR1 = 0; //Timer1关闭,无红外载波
355 3 // HW38K = 1; //P0.7置高
356 3 CommFlag= 0;
357 3
358 3 ArrayInit(ComBuf,RS_MaxSize);
359 3
360 3 TR0 = 0;
361 3 TH0 = 0x53; //Timer0定时12mS初值
362 3 TL0 = 0x33;
363 3 TR0 = 1; //打开Timer0
364 3 }
C51 COMPILER V7.50 RSCOMM 04/13/2007 13:24:53 PAGE 7
365 2 }
366 1 }
367
368
369
370 //**********************************************************
371 //名称:ReadMeter()
372 //功能:读电表中的数据
373 //说明:
374 //**********************************************************
375 void ReadMeter(void)
376 {
377 1 uchar Temp[2];
378 1
379 1 TxdFlag = 1; //数据返回标志
380 1
381 1 RS_Len = 2+4; //返回数据长度
382 1
383 1 if((RS_CmdH==0x90)&&(RS_CmdL==0x1F)) //当前有功电量集合
384 1 {
385 2 ReadMeterData(0xA0,0xC0,16); //整数
386 2
387 2 ComBuf[RS_DataPtr+0] = EryTmp[0]; //总电量小数
388 2 ComBuf[RS_DataPtr+4] = EryTmp[1]; //峰电量小数
389 2 ComBuf[RS_DataPtr+8] = EryTmp[2]; //平电量小数
390 2 ComBuf[RS_DataPtr+12] = EryTmp[3]; //谷电量小数
391 2
392 2 RS_Len = 2+16;
393 2 }
394 1
395 1 else if((RS_CmdH==0x90)&&(RS_CmdL==0x20)) //反向累计电量
396 1 {
397 2 ReadMeterData(0xA0,0xD0,0x04); //反向电量整数
398 2 ComBuf[RS_DataPtr] = EryTmp[4]; //反向电量小数
399 2 //RS_Len = 2+4;
400 2 }
401 1
402 1 else if((RS_CmdH==0xB0)&&(RS_CmdL==0x20)) //反向起始时间
403 1 {
404 2 ReadMeterData(0xA0,0xAA,4);
405 2 //RS_Len = 2+4;
406 2 }
407 1
408 1 else if((RS_CmdH==0xB0)&&(RS_CmdL==0x21)) //反向累计时间
409 1 {
410 2 ReadMeterData(0xA0,Ptr[6],3);
411 2 RS_Len = 2+3;
412 2 }
413 1
414 1 else if((RS_CmdH==0xB2)&&(RS_CmdL==0x10)) //编程时间
415 1 {
416 2 ReadMeterData(0xA0,0xE0,4);
417 2 //RS_Len = 2+4;
418 2 }
419 1
420 1 else if((RS_CmdH==0xB2)&&(RS_CmdL==0x12)) //编程次数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -