📄 从控测试程序.asm
字号:
; BYTE17=POINT 2/RATE 3
; BYTE18=POINT 3/RATE 3
; BYTE19=POINT JYH
; BYTE20=间隔符
; BYTE21=JYH
;***************************
CMD_2:
CJNE A,#RF_WP,CMD2_00
MOV DPTR,#RD_BUF
MOVX A,@DPTR
CJNE A,#22,CMD2_EX ; 命令长度是否正确
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
ANL A,#0F0H
JZ CMD2_0 ; 电表号是否合理
CMD2_EX:
RET
CMD2_00:
AJMP CMD_3 ;
CMD2_0:
MOV DPTR,#RD_BUF+3
MOV R5,#17
MOV R4,#0
CMD2_1:
MOVX A,@DPTR
ADD A,R4
MOV R4,A
INC DPTR
DJNZ R5,CMD2_1
JNZ CMD2_EX ; 校验电表读数校验和
CMD2_2:
MOV A,#RD_OK
LCALL SendData ; 回送应答信号
;-------保存电表读数到内存中----------------
MOV DPTR,#RD_BUF+3
MOV R4,DPL
MOV R5,DPH
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
MOV B,#17
MUL AB
MOV DPTR,#POINT_BUF
ADD A,DPL
MOV DPL,A
MOV R2,A
MOV A,B
ADDC A,DPH
MOV DPH,A
MOV R3,A
INC DPTR
INC DPTR
MOVX A,@DPTR
CJNE A,#0AAH,CMD2_5
MOV R6,#4
CMD2_3:
MOV DPL,R4
MOV DPH,R5
MOVX A,@DPTR
MOV B,A
INC DPTR
MOV R4,DPL
MOV R5,DPH
MOV DPL,R2
MOV DPH,R3
MOVX A,@DPTR
ADD A,B
DA A
MOVX @DPTR,A
INC DPTR
MOV R2,DPL
MOV R3,DPH ;LSB
MOV DPL,R4
MOV DPH,R5
MOVX A,@DPTR
MOV B,A
INC DPTR
MOV R4,DPL
MOV R5,DPH
MOV DPL,R2
MOV DPH,R3
MOVX A,@DPTR
ADDC A,B
DA A
MOVX @DPTR,A
INC DPTR
MOV R2,DPL
MOV R3,DPH ;MSB
MOV R7,#2
CMD2_4:
MOV DPL,R4
MOV DPH,R5
MOVX A,@DPTR
ADDC A,#0
DA A
INC DPTR
MOV R4,DPL
MOV R5,DPH
MOV DPL,R2
MOV DPH,R3
MOVX @DPTR,A
INC DPTR
MOV R2,DPL
MOV R3,DPH ;HSB
DJNZ R7,CMD2_4
DJNZ R6,CMD2_3
SJMP CMD2_7
CMD2_5:
MOV DPL,R2
MOV DPH,R3
MOV R7,#16
CMD2_6:
MOV DPL,R4
MOV DPH,R5
MOVX A,@DPTR
INC DPTR
MOV R4,DPL
MOV R5,DPH
MOV DPL,R2
MOV DPH,R3
MOVX @DPTR,A
INC DPTR
MOV R2,DPL
MOV R3,DPH
DJNZ R7,CMD2_6
CMD2_7:
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
LCALL MakeJYH
;-------保存电表读数到内存中----------------
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
ANL A,#0FH
LCALL WritePoint
RET
;********************************************************
; 主继电器绝对开
; BYTE0=命令长度
; BYTE1=命令字
; BYTE2=电表号
; BYTE3=校验和
;********************************************************
CMD_3: CJNE A,#RF_MSO,CMD_4
MOV DPTR,#RD_BUF
MOVX A,@DPTR
CJNE A,#4,CMD3_EX ; 命令长度是否正确
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
ANL A,#0F0H
JNZ CMD3_EX ; 电表号是否合理
MOV A,#RD_OK
LCALL SendData ; 应答
MOV A,CTRL_MRY00
CJNE A,CTRL_MRY10,CMD3_11
MOV A,CTRL_MRY01
CJNE A,CTRL_MRY11,CMD3_11
SJMP CMD3_2
CMD3_11:
LCALL ReadCurrRelay
CMD3_2:
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
ANL A,#07H
MOV R7,A
INC R7
CLR A
SETB C
CMD32_00:
RLC A
DJNZ R7,CMD32_00
MOV B,A
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
JB ACC.3,CMD31_1 ; 判断是前8块表还是后8块表
;---前8块
MOV A,CTRL_MRY00
ORL A,B
MOV CTRL_MRY00,A
MOV CTRL_MRY10,A
MOV CURR_MRY00,A
MOV CURR_MRY10,A
SJMP CMD3_3
CMD31_1:;后8块
MOV A,CTRL_MRY01
ORL A,B
MOV CTRL_MRY01,A
MOV CTRL_MRY11,A
MOV CURR_MRY01,A
MOV CURR_MRY11,A
CMD3_3: LCALL WriteCurrRelay ; 更新EEPROM电表状态标志位
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
LCALL OpenMasterRelay ; 更新电表操作队列
MOV DPTR,#METER_INF ; 电表信息区首地址,主继电器状态-从继电器状态-功率-电流
MOV B,#5
MUL AB
ADD A,DPL
MOV DPL,A
MOV A,B
ADDC A,DPH
MOV DPH,A
MOV A,#10000000B
MOVX @DPTR,A
CMD3_EX:
RET
;********************************************************
; 主继电器绝对关
; BYTE0=命令长度
; BYTE1=命令字
; BYTE2=电表号
; BYTE3=校验和
;********************************************************
CMD_4: CJNE A,#RF_MSC,CMD_5
MOV DPTR,#RD_BUF
MOVX A,@DPTR
CJNE A,#4,CMD4_EX ; 命令长度是否正确
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
ANL A,#0F0H
JNZ CMD4_EX ; 电表号是否合理
MOV A,#RD_OK
LCALL SendData ; 应答
MOV A,CTRL_MRY00
CJNE A,CTRL_MRY10,CMD4_1
MOV A,CTRL_MRY01
CJNE A,CTRL_MRY11,CMD4_1
SJMP CMD4_2
CMD4_1: LCALL ReadCurrRelay
CMD4_2:
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
ANL A,#07H
MOV R7,A
INC R7
MOV A,#0FFH
CLR C
CMD4_3:
RLC A
DJNZ R7,CMD4_3
MOV B,A
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
JB ACC.3,CMD4_4 ; 是前8块表,还是后8块表
;----前8
MOV A,CTRL_MRY00
ANL A,B
MOV CTRL_MRY00,A
MOV CTRL_MRY10,A
MOV CURR_MRY00,A
MOV CURR_MRY10,A
SJMP CMD4_5
;-----后8
CMD4_4: MOV A,CTRL_MRY01
ANL A,B
MOV CTRL_MRY01,A
MOV CTRL_MRY11,A
MOV CURR_MRY01,A
MOV CURR_MRY11,A
CMD4_5: LCALL WriteCurrRelay ; 更新EEPROM中电表状态标志位
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
LCALL CloseMasterRelay ; 更新操作队列
MOV DPTR,#METER_INF ; 电表信息区首地址,主继电器状态-从继电器状态-功率-电流
MOV B,#5
MUL AB
ADD A,DPL
MOV DPL,A
MOV A,B
ADDC A,DPH
MOV DPH,A
MOV A,#10000011B ;表示永久关断
MOVX @DPTR,A
CMD4_EX:RET
;********************************************************
; 主继电器开
; BYTE0=命令长度
; BYTE1=命令字
; BYTE2=电表号
; BYTE3=校验和
;********************************************************
CMD_5: CJNE A,#RF_MSOT,CMD_6
MOV DPTR,#RD_BUF
MOVX A,@DPTR
CJNE A,#4,CMD5_EX ; 数据长度是否正确
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
ANL A,#0F0H
JNZ CMD4_EX ; 电表号是否合理
MOV A,#RD_OK
LCALL SendData ; 应答
MOV A,CTRL_MRY00
CJNE A,CTRL_MRY10,CMD5_1
MOV A,CTRL_MRY01
CJNE A,CTRL_MRY11,CMD5_1
SJMP CMD5_2
CMD5_1: LCALL ReadCurrRelay
CMD5_2:
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
ANL A,#07H
MOV R7,A
INC R7
CLR A
SETB C
CMD5_3:
RLC A
DJNZ R7,CMD5_3
MOV B,A
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
JB ACC.3,CMD5_4 ; 是前8块表,还是后8块表
;----前8
MOV A,B
MOV A,CTRL_MRY00
ANL A,B
JZ CMD5_EX
ORL CURR_MRY00,A
ORL CURR_MRY10,A
SJMP CMD5_5
;-----后8
CMD5_4:
MOV A,B
MOV A,CTRL_MRY01
ANL A,B
JZ CMD5_EX
ORL CURR_MRY01,A
ORL CURR_MRY11,A
CMD5_5:
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
LCALL OpenMasterRelay ; 更新操作队列
MOV DPTR,#METER_INF ; 电表信息区首地址,主继电器状态-从继电器状态-功率-电流
MOV B,#5
MUL AB
ADD A,DPL
MOV DPL,A
MOV A,B
ADDC A,DPH
MOV DPH,A
MOV A,#10000000B
MOVX @DPTR,A
CMD5_EX:
RET
;*******************************************************
; 主继电器关
; BYTE0=命令长度
; BYTE1=命令字
; BYTE2=电表号
; BYTE3=校验和
;*******************************************************
CMD_6:
CJNE A,#RF_MSCT,CMD_7
MOV DPTR,#RD_BUF
MOVX A,@DPTR
CJNE A,#4,CMD6_EX ; 数据长度是否正确
MOV DPTR,#RD_BUF+2
MOVX A,@DPTR
ANL A,#0F0H
JNZ CMD6_EX ; 电表号是否合理
MOV A,#RD_OK
LCALL SendData ; 应答
MOV A,CTRL_MRY00
CJNE A,CTRL_MRY10,CMD6_1
MOV A,CTRL_MRY01
CJNE A,CTRL_MRY11,CMD6_1
SJMP CMD6_2
CMD6_1:
LCALL ReadCurrRelay
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -