📄 repeater.bak
字号:
;---------------------------------------
;中继器程序
;载波收发用同一缓冲区
REPEATER_FRM_PROCESS:
CPL WATCH_DOG
LCALL SAVE_JZQ_SEND_FRM_BUF ;将集中器发送的中继抄表帧存入存储器
LCALL SEND_TO_METER_FRM ;将接收到的中继抄表命令转发给电表
LCALL ZJQFRM_PROCESS_OVER ;清接收缓冲
CLR_1S_WAIT_TIME:
CLR INIT_ST7536_FLAG ;清等待30S标志
CLR ZJQ_SEND_WAIT ;清发送等待1秒标志位
IF_TIME_OVER:
JNB ZJQ_SEND_WAIT,JUDGE_REC_FRM ;没超时,判断接收到电表回应帧否?
CLR INIT_ST7536_FLAG ;清等待30S标志
nCLR ZJQ_SEND_WAIT ;超时,清该标识
LJMP THROW_ZJQ_ACK ;转通过中继器抄
JUDGE_REC_FRM:
CPL WATCH_DOG
JNB FRM_PROCESS,IF_TIME_OVER ;是否有来自电表的回应帧
CLR FRM_PROCESS ;清接收帧标识
MOV DPH,#C04_ADDR_H ;FM24C04高位地址
MOV DPL,#ZJQ_REC_FRM_BUF+6 ;存储器中接收帧长度存储地址
LCALL RD_C04_1BYTE
MOV A,REC_ADDR ;接收到的地址低位
CJNE A,B,CLR_1S_WAIT_TIME ;接受到的表地址低位与目标表地址相同否?
INC DPL
LCALL RD_C04_1BYTE ;读出高位
MOV A,REC_ADDR+1 ;接收到的地址高位
CJNE A,B,CLR_1S_WAIT_TIME ;高位相同否
LJMP ACK_TO_JZQ_FRM ;抄到目标表,回应回应集中器命令帧
;--------------------------------------
;通过下级中继器抄当前表
THROW_ZJQ_ACK:
LCALL READ_JZQ_SEND_FRM ;从存储器读出集中器发送的帧并转发给电表
LCALL ZJQFRM_PROCESS_OVER ;清接收缓冲
CLR_WAIT_1S_TIME:
CLR INIT_ST7536_FLAG ;清等待30S标志
MOV COUNTER_1S,#00H ;清1秒计数器
CLR ZJQ_SEND_WAIT ;清发送等待1秒标志位
ZJQ_WAIT_TIME:
JNB ZJQ_SEND_WAIT,JUDGE_ZJQ_REC_FRM1 ;没超时,判断接收到电表回应帧否?
CLR ZJQ_SEND_WAIT ;超时,清该标识
CLR INIT_ST7536_FLAG ;清等待30S标志
MOV COUNTER_1S,#00H ;清1秒计数器
AJMP WAIT_CLOUD
JUDGE_ZJQ_REC_FRM1:
CPL WATCH_DOG
JNB FRM_PROCESS,ZJQ_WAIT_TIME ;是否有来中继器的回应帧
AJMP REC_ZJQ_SEND_FRM ;收到正确帧,转处理
WAIT_CLOUD:
JNB ZJQ_SEND_WAIT,JUDGE_ZJQ_REC_FRM2 ;没超时,判断接收到电表回应帧否?
CLR ZJQ_SEND_WAIT ;超时,清该标识
CLR INIT_ST7536_FLAG ;清等待30S标志
MOV COUNTER_1S,#00H ;清1秒计数器
LJMP ZJQFRM_PROCESS_OVER ;没收到回应帧退出
JUDGE_ZJQ_REC_FRM2:
CPL WATCH_DOG
JNB FRM_PROCESS,WAIT_CLOUD ;是否有来中继器的回应帧
REC_ZJQ_SEND_FRM:
CLR FRM_PROCESS ;
MOV DPL,#REPEATER_ADDR ;2级中继器地址首位地址
MOV DPH,#C04_ADDR_H ;FM24C04高位地址
LCALL RD_C04_1BYTE
MOV A,REC_ADDR ;接收到的地址低位
CJNE A,B,WAIT_CLR_REC_BUF ;接受到的表地址低位与中继器地址相同否?
INC DPL
LCALL RD_C04_1BYTE ;读出高位
MOV A,REC_ADDR+1 ;接收到的地址高位
CJNE A,B,WAIT_CLR_REC_BUF ;高位相同否
MOV SEND_ADDR,REC_DATA_METER ;发送的地址号变为目标表号
MOV SEND_ADDR+1,REC_DATA_METER+1 ;高地址
MOV REC_DATA_METER,#00H ;中继地址变为00
MOV REC_DATA_METER+1,#00H
AJMP ACK_TO_JZQ_FRM ;回应集中器
WAIT_CLR_REC_BUF:
LCALL ZJQFRM_PROCESS_OVER ;清接收缓冲
CLR ZJQ_SEND_WAIT ;超时,清该标识
CLR INIT_ST7536_FLAG ;清等待30S标志
MOV COUNTER_1S,#00H ;清1秒计数器
AJMP WAIT_CLOUD
ACK_TO_JZQ_FRM:
LCALL METER_DATA_REC_PROCESS ;向集中器回应电表回应的数据
ZJQFRM_PROCESS_OVER:
MOV REC_CUR_LEN,#00H ;当前帧长度清0
MOV R0,#REC_BUF ;清接收缓冲
MOV B,#REC_BUF_LEN
CLR_ZJREC_FRM1: MOV @R0,#00H
INC R0
DJNZ B,CLR_ZJREC_FRM1
SETB RX_TX ;ST7536接收状态
CLR FRM_PROCESS
RET ;返回等待处理下一轮中继抄表
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;集中器命令帧处理程序转发给电表
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SEND_TO_METER_FRM:
; MOV R0,#REC_BUF
; MOV R1,#SEND_BUF
; MOV B,#REC_BUF_LEN
UP_FRM1: ; MOV A,@R0
; MOV @R1,A
; INC R0
; INC R1
; DJNZ B,UP_FRM1
MOV SEND_ADDR,REC_DATA_METER ;接收到的中继帧中的表号变为地址号向下发送给电表
MOV SEND_ADDR+1,REC_DATA_METER+1
MOV SEND_DATA_METER,#00H ;向下发送的中继表号为0
MOV SEND_DATA_METER+1,#00H
LCALL PRODUCE_SUM_END ;产生发送帧和校验和帧尾
CLR TXD_READY_FLAG ;清发送准备好标志
SETB R_LEDC ;接收灯灭
CLR S_LEDC ;发送指示亮
LCALL SEND_FRM ;发送写应答帧
SETB S_LEDC ;发送指示灭
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;电表数据帧转发给集中器处理程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
METER_DATA_REC_PROCESS:
; MOV R0,#REC_BUF ;将接收到的电表回应帧,放至发送缓冲区,向集中器发送
; MOV R1,#SEND_BUF
; MOV B,#REC_BUF_LEN
DOWN_FRM1: ; MOV A,@R0
; MOV @R1,A
; INC R0
; INC R1
; DJNZ B,DOWN_FRM1
MOV SEND_DATA_METER,REC_ADDR ;中继地址变为目标表号
MOV SEND_DATA_METER+1,REC_ADDR+1
MOV SEND_ADDR,#LOW(TERMINAL_ID) ;发送的地址号为本采集器号(1级中继)
MOV SEND_ADDR+1,#HIGH(TERMINAL_ID)
LCALL PRODUCE_SUM_END ;产生发送帧和校验和帧尾
CLR TXD_READY_FLAG
SETB R_LEDC ;接收灯灭
CLR S_LEDC ;发送指示亮
LCALL SEND_FRM ;发送写应答帧
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CLR_SEND_BUF:
MOV R0,#SEND_BUF ;清发送缓冲区
MOV B,#SEND_BUF_LEN
CLR_SEND_FRM1: MOV @R0,#00H
INC R0
DJNZ B,CLR_SEND_FRM1
RET
;-----------------------------------------
;将集中器发送的中继抄表帧存入存储器
SAVE_JZQ_SEND_FRM_BUF:
MOV R0,#REC_BUF ;接收到的首个数据
MOV A,REC_DATA_FEILD_LEN ;接收数据域长度
ADD A,#07H ;加固定字节长度7字节
MOV R5,A ;接收帧长度
MOV DPH,#C04_ADDR_H ;FM24C04高位地址
MOV DPL,#ZJQ_REC_FRM_BUF ;存储器首地址低位
SAVE_REC_FRM_LOOP:
MOV B,@R0 ;接收缓冲区内容存到存储器
LCALL WR_C04_1BYTE
INC R0
INC DPL
DJNZ R5,SAVE_REC_FRM_LOOP ;存储完毕否?
RET
;---------------------------------------------
;从存储器读出集中器发送的帧并发送
READ_JZQ_SEND_FRM:
MOV DPH,#C04_ADDR_H ;FM24C04高位地址
MOV DPL,#ZJQ_REC_FRM_BUF+4 ;存储器中接收帧长度存储地址
LCALL RD_C04_1BYTE
MOV A,B ;接收数据域长度送A
ADD A,#07H ;加固定字节长度7字节
MOV R5,A ;接收帧长度
MOV R0,#REC_BUF ;接收到的首个数据
MOV DPH,#C04_ADDR_H ;FM24C04高位地址
MOV DPL,#ZJQ_REC_FRM_BUF ;存储器首地址低位
READ_REC_FRM_LOOP:
LCALL RD_C04_1BYTE
MOV @R0,B ;存到接收缓冲区内容
INC R0
INC DPL
DJNZ R5,READ_REC_FRM_LOOP ;读完否?
MOV DPL,#REPEATER_ADDR ;2级中继器地址首位地址
MOV DPH,#C04_ADDR_H ;FM24C04高位地址
LCALL RD_C04_1BYTE
MOV SEND_ADDR,B ;采集器地址变为2级中继地址低位
INC DPL ;高位
MOV DPH,#C04_ADDR_H ;FM24C04高位地址
LCALL RD_C04_1BYTE
MOV SEND_ADDR+1,B ;2级中继地址低位
LCALL PRODUCE_SUM_END ;产生发送帧和校验和帧尾
CLR TXD_READY_FLAG ;清发送准备好标志
SETB R_LEDC ;接收灯灭
CLR S_LEDC ;发送指示亮
LCALL SEND_FRM ;发送写应答帧
; SETB R_LEDC ;接收灯灭
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -