📄 hwframe.asm
字号:
RET
;------------------------------
;;读电表常数
READ_METER_RESOLUTION:
MOV DPH,#C04_ADDR_H
MOV A,R7
DEC A
MOV B,#2
MUL AB
ADD A,#C04_CONSTANT_0
MOV DPL,A
LCALL RD_C04_1BYTE
PUSH B ;第一字节送堆栈区
MOV DPH,#C04_ADDR_H
INC DPL
LCALL RD_C04_1BYTE
MOV R6,B ;高位送R6
POP B
MOV R7,B ;低位在R7
LCALL HEX_BCD_2BYTES ;整数位由16进制转换为十进制数
MOV R0,#HW_SEND_DATA_ITEM ;发送缓冲区数据第1字节
MOV A,R5
ADD A,#33H
MOV @R0,A
INC R0
MOV A,R4
ADD A,#33H
MOV @R0,A
INC R0
MOV A,R3
ADD A,#33H
MOV @R0,A
RET
;--------------------------------------
;读电表底数
READ_METER_BOTTOM:
MOV A,R7
DEC A
MOV B,#4 ;每表底数为4字节
MUL AB
ADD A,#C04_INIT_VAL_0
MOV DPL,A
MOV DPH,#C04_ADDR_H
LCALL RD_C04_1BYTE
MOV A,B
LCALL HEX_BCD_1BYTE ;小数由16进制数转换为十进制
ADD A,#33H ;加33H
MOV R0,#HW_SEND_DATA_ITEM
MOV @R0,A ;送发送缓冲区数据域
INC DPL ;当前表底数的整数首字节
MOV DPH,#C04_ADDR_H ;存储器高位
LCALL RD_C04_1BYTE
PUSH B ;第一字节送堆栈区
MOV DPH,#C04_ADDR_H
INC DPL
LCALL RD_C04_1BYTE
PUSH B ;送第二字节
MOV DPH,#C04_ADDR_H
INC DPL
LCALL RD_C04_1BYTE
MOV R4,B ;高位送R4
POP B
MOV R5,B
POP B
MOV R6,B
LCALL HEX_BCD_3BYTES ;整数位由16进制转换为十进制数
MOV R0,#HW_SEND_DATA_ITEM+1 ;发送缓冲区数据第2字节
MOV A,R3
ADD A,#33H
MOV @R0,A
INC R0
MOV A,R2
ADD A,#33H
MOV @R0,A
INC R0
MOV A,R1
ADD A,#33H
MOV @R0,A
RET
;----------------------------------
;读继电器状态字
HW_READ_JDQ_BYTE:
MOV A,R7 ;当前表号
DEC A ;得出通道号
ADD A,#C04_RELAY_STATE_0 ;得出当前表的继电器状态字的地址
MOV DPL,A
MOV DPH,#C04_ADDR_H ;FM24C04高位控制字
LCALL RD_C04_1BYTE
MOV A,B
LCALL HEX_BCD_1BYTE ;16进制数转换为十进制
ADD A,#33H ;加33H
MOV R0,#HW_SEND_DATA_ITEM
MOV @R0,A
RET
;************************************************************************
;-----------------------------------------------
;写请求帧处理
HW_WR_FRM_PROC:
MOV R0,#HW_REC_DATA_ID2 ;数据标识2
HW_WR_RESOLUTION:
CJNE @R0,#0C0H,HW_WR_BOTTOM ;判断是写电表常数否?
MOV R0,#HW_REC_DATA_ID1 ;数据标识1
CJNE @R0,#30H,WR_FRAME_ERR ;判断是写电表常数否?
LCALL WR_METER_RESOLUTION ;写电表常数
MOV R5,#84H ;写正常回应标志
MOV R6,#00H ;数据域长度
LCALL FORM_SEND_READ_FRAMES ;发送回应帧
RET
HW_WR_BOTTOM:
CJNE @R0,#0C1H,HW_WR_ZJQ_ADDR ;判断是电表底数否?
MOV R0,#HW_REC_DATA_ID1 ;数据标识1
CJNE @R0,#19H,WR_FRAME_ERR ;判断是写电表底数否?
LCALL WR_METER_BOTTOM ;写电表底数
MOV R5,#84H ;写正常回应标志
MOV R6,#00H ;数据域长度
LCALL FORM_SEND_READ_FRAMES ;发送回应帧
RET
HW_WR_ZJQ_ADDR:
CJNE @R0,#0E6H,HW_WR_JDQ_STATE ;判断是写中继器地址否?
MOV R0,#HW_REC_DATA_ID1 ;数据标识1
CJNE @R0,#01H,WR_FRAME_ERR ;判断是写中继器地址否?
LCALL WR_ZJQ_ADDR ;写中继器地址
MOV R5,#84H ;写正常回应标志
MOV R6,#00H ;数据域长度
LCALL FORM_SEND_READ_FRAMES ;发送回应帧
RET
HW_WR_JDQ_STATE:
CJNE @R0,#0E7H,WR_FRAME_ERR ;判断是写继电器状态字否?
MOV R0,#HW_REC_DATA_ID1 ;数据标识1
CJNE @R0,#01H,WR_FRAME_ERR ;判断是写继电器状态字否?
LCALL HW_WR_JDQ_BYTE ;写继电器状态字
MOV R5,#84H ;写正常回应标志
MOV R6,#00H ;数据域长度
LCALL FORM_SEND_READ_FRAMES ;发送回应帧
RET
WR_FRAME_ERR:
LJMP WRITE_FRAMES_ERR_ACK ;数据标识错误回应
;------------------------------------------------------
;写电表常数
WR_METER_RESOLUTION:
MOV R0,#HW_REC_DATA_ITEM
MOV A,@R0
MOV R6,A ;将电表常数低1位存R6
INC R0
MOV A,@R0
MOV R5,A ;将电表常数2位存R5
INC R0
MOV A,@R0
MOV R4,A ;将电表常数高位存R4
PUSH 07H ;保存当前表通道号
LCALL BCD_HEX_3BYTES ;电表常数由十进制转换为16进制数
POP 07H ;取出当前表号
MOV A,R7
DEC A
MOV B,#2
MUL AB
ADD A,#C04_CONSTANT_0
MOV DPL,A ;计算出当前表电表常数首地址
MOV DPH,#C04_ADDR_H
MOV B,R6 ;转换后数据仍在R4R5R6 ,转换后的R4一般情况下为0
LCALL WR_C04_1BYTE
MOV DPH,#C04_ADDR_H
INC DPL
MOV B,R5
LCALL WR_C04_1BYTE
MOV A,R5 ;写电表分辨率时电表常数放在R4R5
MOV R4,A
MOV A,R6
MOV R5,A
MOV DPH,R7 ;表号暂存DPH
LCALL COMPUTE_RESOLUTION ;写入电表分辨率
RET
;------------------------------------------------------
;写电表底数
WR_METER_BOTTOM:
PUSH 07H ;保存当前表号
MOV R0,#HW_REC_DATA_ITEM
MOV A,@R0
LCALL BCD_HEX_1BYTE
MOV @R0,A ;转换后的小数重存回接收缓冲
INC R0 ;整数位
MOV A,@R0
MOV R6,A ;将电表常数低1位存R6
INC R0
MOV A,@R0
MOV R5,A ;将电表常数2位存R5
INC R0
MOV A,@R0
MOV R4,A ;将电表常数高位存R4
LCALL BCD_HEX_3BYTES ;电表常数由十进制转换为16进制数
MOV A,R4 ;转换后的值重存回接收缓冲区
MOV @R0,A
DEC R0
MOV A,R5
MOV @R0,A
DEC R0
MOV A,R6
MOV @R0,A
;--写表底
MOV R0,#HW_REC_DATA_ITEM
POP 07H ;取出当前表号
MOV A,R7
DEC A
MOV B,#4
MUL AB
ADD A,#C04_INIT_VAL_0 ;表底小数位地址
MOV DPL,A
MOV DPH,#C04_ADDR_H
MOV B,@R0 ;表底小数弹出到B
LCALL WR_C04_1BYTE
INC R0 ;整数低位字节
MOV B,@R0 ;表底整数第一字节
MOV DPH,#C04_ADDR_H
INC DPL
LCALL WR_C04_1BYTE
INC R0
MOV B,@R0
MOV DPH,#C04_ADDR_H
INC DPL
LCALL WR_C04_1BYTE
INC R0
MOV B,@R0
MOV DPH,#C04_ADDR_H
INC DPL
LCALL WR_C04_1BYTE
;改变当前表的当前电量//04-03-24
MOV A,R7
DEC A
ADD A,#RAM_COUNTER_DECIMAL_0 ;当前电量小数寄存器地址
MOV R1,A
MOV R0,#HW_REC_DATA_ITEM ;接收缓冲区数据首地址
MOV A,@R0
MOV @R1,A ;RAM内小数位更新
MOV B,A ;存储器内小数位更新
MOV DPH,#C04_ADDR_L
MOV A,R7
DEC A
ADD A,#C04_COUNTER_DECIMAL_0 ;当前电量小数存储器地址
MOV DPL,A
LCALL WR_C04_1BYTE
;---------------------------
;存储器中当前电量整数位更新
MOV A,R7
DEC A
MOV B,#3
MUL AB
ADD A,#C04_COUNTER_INTEGER_0 ;存储器中当前电量整数
MOV DPL,A
MOV DPH,#C04_ADDR_L
INC R0
MOV B,@R0
LCALL WR_C04_1BYTE
MOV DPH,#C04_ADDR_L
INC R0
INC DPL
MOV B,@R0
LCALL WR_C04_1BYTE
MOV DPH,#C04_ADDR_L
INC R0
INC DPL
MOV B,@R0
LCALL WR_C04_1BYTE
LCALL CLR_PULSE_AND_OTHER ;当前脉冲数,存0.1度电到标志,0.1度电计数器清零
RET
;-----------------------------------------------------
;写本采集器的中继器地址
WR_ZJQ_ADDR:
MOV R0,#HW_REC_DATA_ITEM
MOV A,@R0
LCALL BCD_HEX_1BYTE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -