diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/ATP/ground/MaService.java b/src/main/java/club/joylink/rtss/simulation/cbtc/ATP/ground/MaService.java index 5b0b2855b..ed944f8e0 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/ATP/ground/MaService.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/ATP/ground/MaService.java @@ -190,6 +190,8 @@ public class MaService { break; } case Closed_Section: + case UnLock_Section: + case Reverse_Lock_Section: case Fault_Route:{ Section section = (Section) this.device; eoa = new SectionPosition(section, right ? 0 : section.getLen()); @@ -313,6 +315,10 @@ public class MaService { ZC_Boundary, /** 关闭的区段 */ Closed_Section, + /** 进路锁闭反向的区段 */ + Reverse_Lock_Section, + /** 未锁闭的区段 */ + UnLock_Section, /** 进路联锁条件不再完备 */ Fault_Route, /** 站台问题(屏蔽门或紧急停车) */ @@ -416,6 +422,22 @@ public class MaService { // 道岔故障进路,直接构建返回 ma = this.checkAndUpdateMa(ma, new Ma(train, section, MaType.Fault_Route)); } + // 反向锁闭区段 + if (front && right != route.getStart().isRight()) { // 列车方向和区段进路方向相反 + Signal aheadSignal = section.getSignalOf(right); + if (aheadSignal == null || aheadSignal.getLockedRoute() == null || + !aheadSignal.getLockedRoute().isOpen()) { + ma = this.checkAndUpdateMa(ma, new Ma(train, section, MaType.Reverse_Lock_Section)); + } + } + } else if(front) { + if (!section.isRouteLock() && !section.isOverlapLock()) {//列车前方区段未锁闭 + Signal aheadSignal = section.getSignalOf(right); + if (aheadSignal == null || aheadSignal.getLockedRoute() == null || + !aheadSignal.getLockedRoute().isOpen()) { + ma = this.checkAndUpdateMa(ma, new Ma(train, section, MaType.UnLock_Section)); + } + } } if (section.isClosed()) { // 关闭的区段 diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/CI/service/SignalService.java b/src/main/java/club/joylink/rtss/simulation/cbtc/CI/service/SignalService.java index 95a3451f7..1c1326664 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/CI/service/SignalService.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/CI/service/SignalService.java @@ -34,6 +34,7 @@ public class SignalService { public void blockade(Simulation simulation, Signal signal) { if(!signal.isBlockade()) { signal.setBlockade(true); + this.close(simulation, signal); if (signal.getLockedRoute() != null) { signal.setReblockade(true); log.debug(signal.debugStr() + "因信号机封锁且有锁闭的进路而重复封锁"); diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/data/vo/TrainInfo.java b/src/main/java/club/joylink/rtss/simulation/cbtc/data/vo/TrainInfo.java index bf00fdc54..ffc273149 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/data/vo/TrainInfo.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/data/vo/TrainInfo.java @@ -498,9 +498,11 @@ public class TrainInfo extends MapElement { this.actualArriveStandTrack = section.getCode(); this.actualArriveTime = arriveTime; this.parking = true; - if (Objects.nonNull(this.planArriveTime)) { + if (!this.isPlanTrain()) { + this.dt = 0; + } else if (Objects.nonNull(this.planArriveTime)) { this.dt = this.planArriveTime.toSecondOfDay() - arriveTime.toSecondOfDay(); - } else if (this.isPlanTrain()) { + } else { log.warn(String.format("列车[%s-%s|%s|%s]到达车站,没有计划到达,无法更新到达与计划误差时间", groupNumber, serviceNumber, tripNumber, destinationCode)); } diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/onboard/ATP/ATPService.java b/src/main/java/club/joylink/rtss/simulation/cbtc/onboard/ATP/ATPService.java index 56a116f7b..95adfdafc 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/onboard/ATP/ATPService.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/onboard/ATP/ATPService.java @@ -273,6 +273,8 @@ public class ATPService { // 车尾变车头,车头变车尾 train.setHeadPosition(newHeadPosition); train.setRight(!right); + // 清除旧的移动授权 + train.setMa2(null); } public void changeEndsProgress(VirtualRealityTrain train) {