package com.dy.rtuMw.server.upgrade; import com.alibaba.fastjson2.annotation.JSONField; import com.dy.common.mw.protocol.Command; import com.dy.common.mw.protocol.CommandType; import com.dy.common.softUpgrade.Com1601Vo; import com.dy.common.util.Callback; import com.dy.common.util.DateTime; import lombok.Data; /** * @Author: liurunyu * @Date: 2024/11/4 15:00 * @Description */ @Data public class UpgradeRtu { @JSONField(serialize = false) public static final int STATE_UNSTART = 0 ; @JSONField(serialize = false) public static final int STATE_RUNNING = 1 ; @JSONField(serialize = false) public static final int STATE_SUCCESS = 2 ; @JSONField(serialize = false) public static final int STATE_FAILONE = 3 ; @JSONField(serialize = false) public static final int STATE_FAIL = 4 ; @JSONField(serialize = false) public static final int RAMADDRADD = 0x20 ;//程序存储内存在址增量 @JSONField(serialize = false) private UpgradeTask task ; public String rtuAddr ; public int state ;// 0-未开始,1-升级中,2-升级成功,3-升级失败(1包死),4-升级失败(非1包死) public int totalPackage ;// 总包数 public int currentPackage ;// 当前下发升级包数 public int currentRamAddr ;// 当前下发升级包RTU存储地址 public String lastDownDt ;// 最后下发升级数据包时间(yyyy-mm-dd HH:HH:SS) public int reTryTimes ;//升级不成功,重试次数 private UpgradeRtu(){ } public UpgradeRtu(UpgradeTask task, String rtuAddr, int totalPackage) { this.task = task ; this.rtuAddr = rtuAddr ; this.state = STATE_UNSTART ; this.totalPackage = totalPackage ; this.currentPackage = 0 ; this.currentRamAddr = 0 ; this.lastDownDt = "" ; this.reTryTimes = 0 ; } /** * 触发升级 * @param code * @param softData * @param callback */ public void trigger(String code, String protocolName, Short protocolVersion, byte[][] softData, Callback callback){ if(this.state == STATE_UNSTART){ //当前未开始升级过程 this.state = STATE_RUNNING; this.lastDownDt = DateTime.yyyy_MM_dd_HH_mm_ss() ; callback.call(createCommand1601(protocolName, protocolVersion));//下发配置指令 }else if(this.state == STATE_RUNNING){ //当前升级过程中 if(code.equals(UpgradeCode.cd_1601)){ //下发配置返回 this.lastDownDt = DateTime.yyyy_MM_dd_HH_mm_ss() ; callback.call(createCommand1602(protocolName, protocolVersion, currentPackage, currentRamAddr, softData));//下发数据包指令 }else if(code.equals(UpgradeCode.cd_1602)){ //下发数据包返回 currentPackage++ ; currentRamAddr += RAMADDRADD ; if(currentPackage < totalPackage){ this.lastDownDt = DateTime.yyyy_MM_dd_HH_mm_ss() ; callback.call(createCommand1602(protocolName, protocolVersion, currentPackage, currentRamAddr, softData)); }else{ this.lastDownDt = DateTime.yyyy_MM_dd_HH_mm_ss() ; callback.call(createCommand1603(protocolName, protocolVersion));//下发校验指令 } }else if(code.equals(UpgradeCode.cd_1603)){ //下发校验返回 this.state = STATE_SUCCESS ; this.lastDownDt = DateTime.yyyy_MM_dd_HH_mm_ss() ; callback.call(createCommand1600(protocolName, protocolVersion));//下发复位指令,此指令无应答 }else{ if(this.state == STATE_FAILONE || this.state == STATE_FAIL){ //已经是升级失败态 if(this.reTryTimes < task.failTryTimes){ //当前未开始升级过程 this.reTryTimes += 1 ; this.state = STATE_RUNNING; this.currentPackage = 0 ; this.lastDownDt = DateTime.yyyy_MM_dd_HH_mm_ss() ; callback.call(createCommand1601(protocolName, protocolVersion));//下发配置指令 } }else{ //非升级功能码,如果在升级过程中收到这个功能码的上行数据,说明升级失败了 if(currentPackage == 0 || currentPackage == 1){ //1包死,升级失败 this.state = STATE_FAILONE ; }else{ //非1包死,升级失败 this.state = STATE_FAIL ; } } } }else{ //在其他状态下,不触发任务工作 } } public Command createCommand1601(String protocolName, Short protocolVersion){ Command com = new Command() ; com.id = Command.defaultId ; com.type = CommandType.outerCommand ; com.rtuAddr = this.rtuAddr ; com.code = UpgradeCode.cd_1601 ; com.protocol = protocolName ; com.protocolVersion = protocolVersion ; com.rtuResultSendWebUrl = Command.ignoreRtuResultSendWebUrl ; Com1601Vo vo = new Com1601Vo() ; vo.softStoreAddr = this.task.softStoreAddr ; vo.softStartAddr = this.task.softStartAddr ; vo.totalByte = this.task.softBytesCalculate ; vo.softCrc = this.task.softByteSrc16; com.param = vo ; return com ; } public Command createCommand1602(String protocolName, Short protocolVersion, int currentPackage, Integer ramAddr, byte[][] softData){ Command com = new Command() ; com.id = Command.defaultId ; com.type = CommandType.outerCommand ; com.rtuAddr = this.rtuAddr ; com.code = UpgradeCode.cd_1602 ; com.protocol = protocolName ; com.protocolVersion = protocolVersion ; com.param = ramAddr ; if(currentPackage < softData.length){ com.attachment = softData[currentPackage] ; } com.rtuResultSendWebUrl = Command.ignoreRtuResultSendWebUrl ; return com ; } public Command createCommand1603(String protocolName, Short protocolVersion){ Command com = new Command() ; com.id = Command.defaultId ; com.type = CommandType.outerCommand ; com.rtuAddr = this.rtuAddr ; com.code = UpgradeCode.cd_1603 ; com.protocol = protocolName ; com.protocolVersion = protocolVersion ; com.rtuResultSendWebUrl = Command.ignoreRtuResultSendWebUrl ; return com ; } public Command createCommand1600(String protocolName, Short protocolVersion){ Command com = new Command() ; com.id = Command.defaultId ; com.type = CommandType.outerCommand ; com.rtuAddr = this.rtuAddr ; com.code = UpgradeCode.cd_1600 ; com.protocol = protocolName ; com.protocolVersion = protocolVersion ; com.rtuResultSendWebUrl = Command.ignoreRtuResultSendWebUrl ; return com ; } }