📄 bcd_hex.asm
字号:
MAKE_LAST_LAST_ZX_YG_FRAMES:
LCALL READ_FRAMES_ACK ;读上上月正向有功回应帧
AJMP READ_LAST_LAST_YG_ERR
;上上月反向有功:数据标识:DI1:98,DI0:20-----------------------------
READ_LAST_LAST_FX_YG:
CJNE A,#20H,READ_LAST_LAST_YG_ERR ;判断是反向有功否
LCALL JUDGE_WHAT_KIND_RAT_OR_VAR ;判断为何种费率
JNB PULSE_OR_485METER,READ_PULSE_LAST_LAST_FX_YG ;判断是读485表还是脉冲表
MOV DPTR,#RS485_LAST_LAST_FA_ENERGY ;485表存贮区上上月反向有功首地址
JMP MAKE_LAST_LAST_FX_YG_FRAMES ;把当前485表上上月反向有功形成回应帧发送给集中器
READ_PULSE_LAST_LAST_FX_YG:
MOV DPTR,#PULSE_LAST_LAST_ENERGY ;脉冲表上上月电量首地址
MAKE_LAST_LAST_FX_YG_FRAMES:
LCALL READ_FRAMES_ACK ;读上上月反向有功回应帧
;---------------------------
READ_LAST_LAST_YG_ERR:
LJMP READ_FRAMES_OVER ;结束帧处理
;------------------------------------
;读上上月无功电量
READ_LAST_LAST_WG:
CJNE A,#99H,READ_VAR_DATA_LAB1 ;判断是上上月无功否?
MOV A,DATA_DI0 ;是上上月无功,再判断是正向还是反向
ANL A,#0F0H ;屏蔽掉低4位
;上上月正向无功:数据标识:DI1:99,DI0:10-------------------------
READ_LAST_LAST_ZX_WG:
CJNE A,#10H,READ_LAST_LAST_FX_WG ;判断是正向无功否
LCALL JUDGE_WHAT_KIND_RAT_OR_VAR ;判断为何种费率
JNB PULSE_OR_485METER,READ_PULSE_LAST_LAST_ZX_WG ;判断是读485表还是脉冲表
MOV DPTR,#RS485_LAST_LAST_ZR_ENERGY ;485表存贮区上上月正向无功首地址
JMP MAKE_LAST_LAST_ZX_WG_FRAMES ;把当前485表上上月正向无功形成回应帧发送给集中器
READ_PULSE_LAST_LAST_ZX_WG:
MOV DPTR,#PULSE_LAST_LAST_ENERGY ;脉冲表上上月电量首地址
MAKE_LAST_LAST_ZX_WG_FRAMES:
LCALL READ_FRAMES_ACK ;读上上月正向无功回应帧
AJMP READ_LAST_LAST_WG_ERR
;上上月反向无功:数据标识:DI1:99,DI0:20--------------------------
READ_LAST_LAST_FX_WG:
CJNE A,#20H,READ_LAST_LAST_WG_ERR ;判断是反向无功否
LCALL JUDGE_WHAT_KIND_RAT_OR_VAR ;判断为何种费率
JNB PULSE_OR_485METER,READ_PULSE_LAST_LAST_FX_WG ;判断是读485表还是脉冲表
MOV DPTR,#RS485_LAST_LAST_FR_ENERGY ;485表存贮区上上月反向无功首地址
JMP MAKE_LAST_LAST_FX_WG_FRAMES ;把当前485表上上月反向无功形成回应帧发送给集中器
READ_PULSE_LAST_LAST_FX_WG:
MOV DPTR,#PULSE_LAST_LAST_ENERGY ;脉冲表上上月电量首地址
MAKE_LAST_LAST_FX_WG_FRAMES:
LCALL READ_FRAMES_ACK ;读上上月反向无功回应帧
;---------------------------
READ_LAST_LAST_WG_ERR:
LJMP READ_FRAMES_OVER ;结束帧处理
;///////////////////////////////////////////////////////////////////////////////////////////
; 读参变量数据标识编码
;//////////////////////////////////////////////////////////////////////////////////////////
;日期,周次/时间/电表运行状态字/电网状态字/周休状态字/电表常数(有功/无功)/表号/用户号/设备码
READ_VAR_DATA_LAB1:
CJNE A,#0C0H,READ_VAR_DATE_LAB2_JUMP ;判断是读参变量数据标识编码1否?
MOV A,DATA_DI0 ;是,再判断是何种参变量标识
ANL A,#0F0H ;屏蔽掉低4位
;读日期,周次:数据标识:DI1:0C0,DI0:10-----------------------------
READ_DATE_AND_WEEK:
CJNE A,#10H,AJMP_READ_METER_STATE ;判断是读日期,周次及时间否?
LCALL JUDGE_WHAT_KIND_RAT_OR_VAR ;判断要读何种变量?
MOV A,DQ_FEILU_OR_VAR ;数据标识DI0低4位
CJNE A,#00H,READ_DQ_TIME ;判断是读当前采集器日期及周次否?
JNB PULSE_OR_485METER,READ_PULSE_METER_DATE_AND_WEEK ;判断是读485表还是脉冲表
LCALL TERMINAL_TO_485METER ;是485表,读出其日期周次等参数发送到集中器
JNB TERMINAL_METER485_CONNECT_OK,READ_PULSE_METER_DATE_AND_WEEK;判断采集终端与485表通信成功否?
CLR TERMINAL_METER485_CONNECT_OK ;清此标志位
AJMP READ_VAR_DATE_LAB2_JUMP ;结束帧处理
AJMP_READ_METER_STATE:
LJMP READ_METER_STATE ;间接跳转
READ_PULSE_METER_DATE_AND_WEEK:
LCALL READ_DATE_WEEK ;读出采集器中当前日期及周次
; LCALL WRITE_CONTROL_ON ;允许写NOVRAM控制操作
MOV DPTR,#SEND_DATA_ITEM ;把当前采集器日期及周次存到发送缓冲区
MOV A,TIME_WEEK ;周次+33H存到发送缓冲区
ADD A,#33H
MOVX @DPTR,A ;存到发送缓冲区
INC DPTR ;下一字节
MOV A,TIME_DATE ;日期+33H存到发送缓冲区
ADD A,#33H
MOVX @DPTR,A
INC DPTR
MOV A,TIME_MONTH ;月份+33H存到发送缓冲区
ADD A,#33H
MOVX @DPTR,A
INC DPTR
MOV A,TIME_YEAR ;年+33H存到发送缓冲区
ADD A,#33H
MOVX @DPTR,A
LCALL CREAT_SEND_FRAMES_HEAD_ADDR ;形成回应帧地址帧
MOV A,#81H
MOV R5,A ;读正常控制码存R5
LCALL PRODUCE_CTRL_CODE ;发送帧的控制码暂存发送缓冲区
MOV A,#06H ;数据域长度
LCALL PRODUCE_DATA_FEILD_LEN ;发送帧的数据长度
LCALL MAKE_AND_SEND_ACK_FRAMES ;产生数据标和校验和及帧结束符并发送回应帧
LJMP READ_FRAMES_OVER ;结束帧处理
READ_VAR_DATE_LAB2_JUMP:
LJMP READ_VAR_DATE_LAB2
;读当前采集器时间:数据标识:DI1:0C0,DI0:11-----------------------
READ_DQ_TIME:
CJNE A,#01H,READ_DQ_TIME_ERR ;判断是读当前采集器时间否?
JNB PULSE_OR_485METER,READ_PULSE_METER_DQ_TIME ;判断是读485表还是脉冲表
LCALL TERMINAL_TO_485METER ;是485表,读出其参数发送到集中器
JNB TERMINAL_METER485_CONNECT_OK,READ_PULSE_METER_DATE_AND_WEEK;判断采集终端与485表通信成功否?
CLR TERMINAL_METER485_CONNECT_OK ;清此标志位
; LJMP READ_FRAMES_OVER ;结束帧处理
READ_PULSE_METER_DQ_TIME:
LCALL READ_TIME ;读出时间
; LCALL WRITE_CONTROL_ON ;允许写NOVRAM控制操作
MOV DPTR,#SEND_DATA_ITEM ;把当前采集器时间存到发送缓冲区
MOV A,TIME_SECOND ;秒+33H存到发送缓冲区
ADD A,#33H
MOVX @DPTR,A
INC DPTR ;下一字节
MOV A,TIME_MINUTE ;分+33H存到发送缓冲区
ADD A,#33H
MOVX @DPTR,A
INC DPTR
MOV A,TIME_HOUR ;时+33H存到发送缓冲区
ADD A,#33H
MOVX @DPTR,A
LCALL CREAT_SEND_FRAMES_HEAD_ADDR ;形成回应帧地址帧
MOV A,#81H
MOV R5,A ;读正常控制码存R5
LCALL PRODUCE_CTRL_CODE ;发送帧的控制码暂存发送缓冲区
MOV A,#05H ;数据域长度
LCALL PRODUCE_DATA_FEILD_LEN ;发送帧的数据长度
LCALL MAKE_AND_SEND_ACK_FRAMES ;产生数据标和校验和及帧结束符并发送回应帧
READ_DQ_TIME_ERR:
LJMP READ_FRAMES_OVER ;结束帧处理
;读电表运行状态字,电网状态字及周休状态字-----------------------------------------------
READ_METER_STATE:
CJNE A,#20H,READ_METER_VARS_JUMP ;判断是读电表运行状态字,电网状态字及周休状态字否
LCALL JUDGE_WHAT_KIND_RAT_OR_VAR ;是,判断要读何种状态字?
MOV A,DQ_FEILU_OR_VAR ;数据标识DI0低4位
;电表运行状态字:数据标识:DI1:0C0,DI0:20----------------------
READ_METER_RUNNING_STATE:
CJNE A,#00H,READ_LINE_RUNNING_STATE ;判断是读当前电表运行状态字否?
JNB PULSE_OR_485METER,READ_PULSE_METER_STATE;判断是读485表还是脉冲表
LCALL TERMINAL_TO_485METER ;是485表,读出其参数发送到集中器
;LJMP READ_FRAMES_OVER ;结束帧处理
MOV DPTR,#RS485_METER_RUN_STATE_WORD ;485表存贮区电表运行状态字首地址
JMP READ_485_METER_STATE ;把当前485表运行状态字形成回应帧
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -