📄 bcd_hex.asm
字号:
;---------------------------
;读帧判断
IS_READ_FRAMES:
CJNE @R0,#01H,READ_BACK_FRAMES ;是主站请求读数据帧否?
LCALL READ_FRAMES_PROC ;请求读数据帧处理
SJMP FRAMES_PROCESS_OVER
READ_BACK_FRAMES:
CJNE @R0,#02H,READ_REPEAT_LAST_FRAMES ;是主站请求读后续数据帧否?
LCALL READ_BACK_FRAMES_PROC ;读请求读后续数据帧处理
SJMP FRAMES_PROCESS_OVER
READ_REPEAT_LAST_FRAMES:
CJNE @R0,#03H,IS_WRITE_FRAMES ;是主站请求从站重发上帧数据帧否?
LCALL READ_REPEAT_LAST_FRAMES_PROC ;主站请求从站重发上帧数据帧处理
SJMP FRAMES_PROCESS_OVER
;---------------------------
;---写数据请求帧判断
IS_WRITE_FRAMES:
CJNE @R0,#04H,IS_GBJS_FRAMES ;是写数据请求帧否?
LCALL WRITE_FRAMES_PROC ;写数据请求帧处理
SJMP FRAMES_PROCESS_OVER
;---广播校时帧
IS_GBJS_FRAMES:
CJNE @R0,#08H,IS_GB_READ_CJQ_ADDR ;是广播校时帧否?
JNB GBJS_OR_ADDR,NOT_GBJS ;判为广播否?
LCALL GBJS_FRAMES_PROC ;广播校时处理
NOT_GBJS:
SJMP FRAMES_PROCESS_OVER
;---广播读采集器地址帧(扩展规约)
IS_GB_READ_CJQ_ADDR:
CJNE @R0,#09H,IS_WRITE_ADDR_FRAMES ;是广播读采集器地址帧否?
JNB GBJS_OR_ADDR,NOT_GB_READ_CJQ_ADDR;判地址为广播否?
LCALL GB_READ_CJQ_FRAMES_PROC ;广播读采集器地址处理
NOT_GB_READ_CJQ_ADDR:
SJMP FRAMES_PROCESS_OVER
;---广播写设备地址帧,建立电表与地址映射表
IS_WRITE_ADDR_FRAMES:
CJNE @R0,#0AH,IS_CHANGE_BAUD_FRAMES ;是写设备地址帧否?
JNB GBJS_OR_ADDR,NOT_GB_ADDR ;判地址为广播否?
LCALL WRITE_ADDR_PROC ;写设备地址(表号)处理
NOT_GB_ADDR:
SJMP FRAMES_PROCESS_OVER
;---更改通信速率帧
IS_CHANGE_BAUD_FRAMES:
CJNE @R0,#0CH,IS_CHANGE_PASSWORD_FRAMES ;是更改通信速率帧否?
LCALL CHANGE_BAUD_PROC ;更改通信速率处理
SJMP FRAMES_PROCESS_OVER
;---修改密码帧
IS_CHANGE_PASSWORD_FRAMES:
CJNE @R0,#0FH,IS_CLEAR_MAST_REQUIRE_FRAMES ;是修改密码帧否?
LCALL CHANGE_PASSWORD_PROC ;修改密码处理
SJMP FRAMES_PROCESS_OVER
IS_CLEAR_MAST_REQUIRE_FRAMES:
CJNE @R0,#10H,FRAMES_PROCESS_OVER ;是最大需量清0帧否?
LCALL CLEAR_MAST_REQUIRE_PROC ;最大需量清0及月转存处理
FRAMES_PROCESS_OVER:
LCALL CLEAR_RECE_SBUF ;清接收缓冲
RET
;--------------------------------------------------------------------------------------------
;***********************************************************************************************
;-----------------------------------------------------------------------------------------------
;读帧处理程序
;-----------------------------------------------------------------------------------------------
READ_FRAMES_PROC:
MOV R0,#REC_DATA_ID1 ;数据标识DI0
MOV DATA_DI0,@R0 ;暂存到RAM
INC R0 ;数据标识DI1
MOV DATA_DI1,@R0
;-------------------------------------------------------------------------------------
;数据标识判断
MOV A,DATA_DI1 ;数据标识
;--------------------------------------------------------------------------------------
;#######################################################################################
; 标准规约部分
;#######################################################################################
; 读电能量数据编码
;--------------------------------------------------------------------------------------
;读当前有功电量
;脉冲表只有一种电量,不分有/无功,也不分正反向,其电量种类的区分由后台来标注,485表4种电能都有.
;---------------------------------------------------------------------------------------
READ_DQ_YG:
JNB NOT_METER_ID,READ_DQ_YG_START ;非电表号标志
AJMP READ_VAR_DATA_LAB1
READ_DQ_YG_START:
CJNE A,#90H,READ_DQ_WG ;判断是当前有功否?
MOV A,DATA_DI0 ;是当前有功,再判断是正向还是反向
ANL A,#0F0H ;屏蔽掉低4位
;当前正向有功:数据标识:DI1:90,DI0:10--------------------------
READ_DQ_ZX_YG:
CJNE A,#10H,READ_DQ_FX_YG ;判断是正向有功否
LCALL JUDGE_WHAT_KIND_RAT_OR_VAR ;判断为何种费率
JNB PULSE_OR_485METER,READ_PULSE_DQ_ZX_YG ;判断是读485表还是脉冲表
LCALL TERMINAL_CONNECT_485METER ;采集器与485表通信.
JNB TERMINAL_METER485_CONNECT_OK,FALSE_RETURN1;判断采集终端与485表通信成功否?
CLR TERMINAL_METER485_CONNECT_OK ;清此标志位
LCALL SEND_ONE_FRAMES_ACK ;发送读回应帧到集中器
MOV DPTR,#RS485_CURRENT_ZA_ENERGY ;485表存贮区当前正向有功首地址
LCALL SAVE_METER485_VAR ;通信成功,存储读出的485电表参数
LJMP READ_FRAMES_OVER ;结束
FALSE_RETURN1:
MOV DPTR,#RS485_CURRENT_ZA_ENERGY ;485表存贮区当前正向有功首地址
JMP MAKE_DQ_ZX_YG_FRAMES ;把当前485表正向有功形成回应帧发送给集中器
READ_PULSE_DQ_ZX_YG:
MOV DPTR,#PULSE_CURRENT_ENERGY ;脉冲表当前电量首地址
MAKE_DQ_ZX_YG_FRAMES:
LCALL READ_FRAMES_ACK ;读当前正向有功回应帧
DZY_READ_METER485_OVER:
LJMP READ_FRAMES_OVER ;回应帧发送完,退出.
;当前反向有功:数据标识:DI1:90,DI0:20-------------------------
READ_DQ_FX_YG:
CJNE A,#20H,READ_DQ_YG_ERR ;判断是反向有功否
LCALL JUDGE_WHAT_KIND_RAT_OR_VAR ;判断为何种费率
JNB PULSE_OR_485METER,READ_PULSE_DQ_FX_YG ;判断是读485表还是脉冲表
LCALL TERMINAL_CONNECT_485METER ;采集器与485表通信.
JNB TERMINAL_METER485_CONNECT_OK,FALSE_RETURN2;判断采集终端与485表通信成功否?
CLR TERMINAL_METER485_CONNECT_OK ;清此标志位
LCALL SEND_ONE_FRAMES_ACK ;发送读回应帧到集中器
MOV DPTR,#RS485_CURRENT_FA_ENERGY ;485表存贮区当前反向有功首地址
LCALL SAVE_METER485_VAR ;通信成功,存储读出的485电表参数
LJMP READ_FRAMES_OVER ;结束
FALSE_RETURN2:
MOV DPTR,#RS485_CURRENT_FA_ENERGY ;485表存贮区当前反向有功首地址
JMP MAKE_DQ_FX_YG_FRAMES ;把当前485表反向有功形成回应帧发送给集中器
READ_PULSE_DQ_FX_YG:
MOV DPTR,#PULSE_CURRENT_ENERGY ;脉冲表当前电量首地址
MAKE_DQ_FX_YG_FRAMES:
LCALL READ_FRAMES_ACK ;读当前反向有功回应帧
READ_DQ_YG_ERR:
LJMP READ_FRAMES_OVER ;标识非法结束帧处理
;------------------------------------
;读当前无功电量
READ_DQ_WG:
CJNE A,#91H,READ_LAST_YG ;判断是当前无功否?
MOV A,DATA_DI0 ;是当前无功,再判断是正向还是反向
ANL A,#0F0H ;屏蔽掉低4位
;当前正向无功:数据标识:DI1:91,DI0:10------------------------------
READ_DQ_ZX_WG:
CJNE A,#10H,READ_DQ_FX_WG ;判断是正向无功否
LCALL JUDGE_WHAT_KIND_RAT_OR_VAR ;判断为何种费率
JNB PULSE_OR_485METER,READ_PULSE_DQ_ZX_WG;判断是读485表还是脉冲表
LCALL TERMINAL_CONNECT_485METER ;采集器与485表通信.
JNB TERMINAL_METER485_CONNECT_OK,FALSE_RETURN3;判断采集终端与485表通信成功否?
CLR TERMINAL_METER485_CONNECT_OK ;清此标志位
LCALL SEND_ONE_FRAMES_ACK ;发送读回应帧到集中器
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -