修改:道岔相关移动授权计算

This commit is contained in:
joylink_zhangsai 2021-07-07 16:24:37 +08:00
parent 85091f8af6
commit 65066fe38f
6 changed files with 148 additions and 41 deletions

View File

@ -122,7 +122,9 @@ public class ZCLogicLoop {
return List.of(closedSection); return List.of(closedSection);
// 如果车尾正常从车头开始往前查找 // 如果车尾正常从车头开始往前查找
Section section = headPosition.getSection(); Section section = headPosition.getSection();
MovementAuthority.End switchEnd = checkSwitch(tailSection, section, right);
if (switchEnd != null)
return List.of(switchEnd);
// 检查列车当前所在进路是否锁闭 // 检查列车当前所在进路是否锁闭
MovementAuthority.End end1 = this.checkRouteLock(simulation, section, tailSection, right, train); MovementAuthority.End end1 = this.checkRouteLock(simulation, section, tailSection, right, train);
if (Objects.nonNull(end1)) { if (Objects.nonNull(end1)) {
@ -169,6 +171,10 @@ public class ZCLogicLoop {
endList.add(unlockedOverlapEnd); endList.add(unlockedOverlapEnd);
} }
} }
// 道岔
MovementAuthority.End end = checkSwitch(section);
if (end != null)
endList.add(end);
// 轨道尽头/问题道岔 // 轨道尽头/问题道岔
Section temp = section.getNextRunningSectionOf(right); Section temp = section.getNextRunningSectionOf(right);
if (Objects.isNull(temp)) { // 到尽头 if (Objects.isNull(temp)) { // 到尽头
@ -190,7 +196,7 @@ public class ZCLogicLoop {
if (cs != null) if (cs != null)
endList.add(cs); endList.add(cs);
if (!CollectionUtils.isEmpty(endList)) { if (!CollectionUtils.isEmpty(endList) && endList.size() == 1 && endList.get(0).getType().equals(MovementAuthority.EndType.CLOSED_SIGNAL)) {
break; break;
} }
@ -212,6 +218,40 @@ public class ZCLogicLoop {
return endList; return endList;
} }
private MovementAuthority.End checkSwitch(Section tailSection, Section headSection, boolean right) {
Section section = tailSection;
for (int i = 0; i < 10; i++) {
if (section.equals(headSection))
break;
MovementAuthority.End end = checkSwitch(section);
if (end != null)
return end;
section = section.getNextRunningSectionOf(right);
}
return null;
}
private MovementAuthority.End checkSwitch(Section section) {
Switch relSwitch = section.getRelSwitch();
if (relSwitch != null) {
Route route = relSwitch.getRoute();
if (relSwitch.isLoss()) {
return new MovementAuthority.End(section, MovementAuthority.EndType.FAULT_SWITCH);
} else if (route != null) {
List<RouteFls> flsList = route.getFlsList();
if (!CollectionUtils.isEmpty(flsList)) {
List<RouteFls> fls = flsList.stream()
.filter(routeFls -> routeFls.getBase().getASwitch().equals(relSwitch))
.collect(Collectors.toList());
if (!routeService.isFlsCheckPass(fls)) {
return new MovementAuthority.End(section, MovementAuthority.EndType.FAULT_SWITCH);
}
}
}
}
return null;
}
private MovementAuthority.End checkClosedSection(Section section) { private MovementAuthority.End checkClosedSection(Section section) {
if (section.isClosed()) { if (section.isClosed()) {
return new MovementAuthority.End(section, MovementAuthority.EndType.CLOSED_SECTION); return new MovementAuthority.End(section, MovementAuthority.EndType.CLOSED_SECTION);
@ -427,31 +467,19 @@ public class ZCLogicLoop {
private MovementAuthority.End checkRouteLock(Simulation simulation, Section section, Section tailSection, boolean right, VirtualRealityTrain train) { private MovementAuthority.End checkRouteLock(Simulation simulation, Section section, Section tailSection, boolean right, VirtualRealityTrain train) {
SimulationDataRepository repository = simulation.getRepository(); SimulationDataRepository repository = simulation.getRepository();
// 判断前方是否有信号机(如果存在信号机则不判断进路锁闭以兼容现在列车加载到转换轨没有进路情况) // 判断前方是否有信号机(如果存在信号机则不判断进路锁闭以兼容现在列车加载到转换轨没有进路情况)
if (section.isTransferTrack()) { Signal aheadSignal = section.getSignalOf(right);
if (Objects.nonNull(aheadSignal)) {
return null; return null;
} }
// Signal aheadSignal = section.getSignalOf(right);
// if (Objects.nonNull(aheadSignal)) {
// return null;
// }
// 先查询是否是已排列的锁闭进路 // 先查询是否是已排列的锁闭进路
List<Route> settingRoutes = repository.getSettingRoutes(); List<Route> settingRoutes = repository.getSettingRoutes();
boolean lock = false; boolean lock = false;
if (!CollectionUtils.isEmpty(settingRoutes)) { if (!CollectionUtils.isEmpty(settingRoutes)) {
boolean headRoute = false;
boolean tailRoute = false;
for (Route route : settingRoutes) { for (Route route : settingRoutes) {
if (route.isRight() == right && (route.isRouteSection(section) || route.isRouteSection(tailSection))) { if (route.isRouteSection(section)
if (route.isRouteSection(section)) // && !route.isSetting()
headRoute = true; ) {
if (route.isRouteSection(tailSection))
tailRoute = true;
lock = true; lock = true;
List<Switch> switches = screenSwitchesInFront(route, tailSection);
if (!this.checkRouteSwitchPosition(route, switches) || !this.isFlsCheckPass(route.getFlsList(), switches)) {
return new MovementAuthority.End(section, MovementAuthority.EndType.ROUTE_INTERLOCK_NOT_MET);
}
if (headRoute && tailRoute)
break; break;
} }
} }
@ -475,11 +503,68 @@ public class ZCLogicLoop {
base = pre; base = pre;
} }
} }
if (!lock && section.getSignalOf(right) == null) { if (!lock) {
// 未锁闭进路中设置移动授权终点 // 未锁闭进路中设置移动授权终点
return new MovementAuthority.End(section, MovementAuthority.EndType.UNLOCK_SECTION); return new MovementAuthority.End(section, MovementAuthority.EndType.UNLOCK_SECTION);
} }
return null; return null;
// SimulationDataRepository repository = simulation.getRepository();
// // 判断前方是否有信号机(如果存在信号机则不判断进路锁闭以兼容现在列车加载到转换轨没有进路情况)
// if (section.isTransferTrack()) {
// return null;
// }
//// Signal aheadSignal = section.getSignalOf(right);
//// if (Objects.nonNull(aheadSignal)) {
//// return null;
//// }
// // 先查询是否是已排列的锁闭进路
// List<Route> settingRoutes = repository.getSettingRoutes();
// boolean lock = false;
// if (!CollectionUtils.isEmpty(settingRoutes)) {
// boolean headRoute = false;
// boolean tailRoute = false;
// for (Route route : settingRoutes) {
// if (route.isRight() == right && (route.isRouteSection(section) || route.isRouteSection(tailSection))) {
// if (route.isRouteSection(section))
// headRoute = true;
// if (route.isRouteSection(tailSection))
// tailRoute = true;
// lock = true;
// List<Switch> switches = screenSwitchesInFront(route, tailSection);
// if (!this.checkRouteSwitchPosition(route, switches) || !this.isFlsCheckPass(route.getFlsList(), switches)) {
// return new MovementAuthority.End(section, MovementAuthority.EndType.ROUTE_INTERLOCK_NOT_MET);
// }
// if (headRoute && tailRoute)
// break;
// }
// }
// }
// if (!lock) { // 未找到锁闭进路判断是否自动信号
// Section base = section;
// int count = 0;
// while (Objects.nonNull(base) && count < 20) {
// ++count;
// // 向反方向查找找信号机判断是否自动信号
// Section pre = base.getNextRunningSectionOf(!right);
// if (Objects.nonNull(pre)) {
// Signal signal = pre.getSignalOf(right);
// if (Objects.nonNull(signal)) {
// if (signal.isAutoSignal()) {
// lock = true; // 如果是自动信号也相当于锁闭
// }
// break; // 找到信号机结束
// }
// }
// base = pre;
// }
// }
// if (!lock && section.getSignalOf(right) == null) {
// // 未锁闭进路中设置移动授权终点
// return new MovementAuthority.End(section, MovementAuthority.EndType.UNLOCK_SECTION);
// }
// return null;
} }
private boolean checkRouteSwitchPosition(Route route, List<Switch> switches) { private boolean checkRouteSwitchPosition(Route route, List<Switch> switches) {

View File

@ -388,19 +388,19 @@ public class RouteService {
for (Section section : sectionList) { for (Section section : sectionList) {
if (section.isSwitchTrack()) { if (section.isSwitchTrack()) {
Switch relSwitch = section.getRelSwitch(); Switch relSwitch = section.getRelSwitch();
relSwitch.getA().routeLocking(right); relSwitch.getA().routeLocking(route, right);
if (relSwitch.isNormalPosition()) { // 定位 if (relSwitch.isNormalPosition()) { // 定位
relSwitch.getB().routeLocking(right); relSwitch.getB().routeLocking(route, right);
relSwitch.getC().routeUnlocking(right); relSwitch.getC().routeUnlocking(right);
} else if (relSwitch.isReversePosition()) { // 反位 } else if (relSwitch.isReversePosition()) { // 反位
relSwitch.getC().routeLocking(right); relSwitch.getC().routeLocking(route, right);
relSwitch.getB().routeUnlocking(right); relSwitch.getB().routeUnlocking(right);
} else { // 失表 } else { // 失表
relSwitch.getB().routeLocking(right); relSwitch.getB().routeLocking(route, right);
relSwitch.getC().routeLocking(right); relSwitch.getC().routeLocking(route, right);
} }
} else { } else {
section.routeLocking(right); section.routeLocking(route, right);
} }
// log.debug(section.debugStr() + "因<预先锁闭>锁闭"); // log.debug(section.debugStr() + "因<预先锁闭>锁闭");
} }
@ -412,7 +412,7 @@ public class RouteService {
this.routeFlsControl(simulation, route.getFlsList()); this.routeFlsControl(simulation, route.getFlsList());
if (config.isLockFirst()) { if (config.isLockFirst()) {
for (SwitchElement switchElement : switchList) { for (SwitchElement switchElement : switchList) {
switchElement.getASwitch().routeLock(); switchElement.getASwitch().routeLock(route);
} }
if (!CollectionUtils.isEmpty(route.getFlsList())) { if (!CollectionUtils.isEmpty(route.getFlsList())) {
for (RouteFls routeFls : route.getFlsList()) { for (RouteFls routeFls : route.getFlsList()) {
@ -660,7 +660,7 @@ public class RouteService {
boolean right = route.getStart().isRight(); boolean right = route.getStart().isRight();
// 进路区段锁闭 // 进路区段锁闭
for (Section section : route.getSectionList()) { for (Section section : route.getSectionList()) {
section.routeLocking(right); section.routeLocking(route, right);
if (section.isSwitchTrack()) { if (section.isSwitchTrack()) {
// 道岔锁闭 // 道岔锁闭
Switch relSwitch = section.getRelSwitch(); Switch relSwitch = section.getRelSwitch();
@ -675,7 +675,7 @@ public class RouteService {
// 道岔锁闭 // 道岔锁闭
for (SwitchElement element : route.getSwitchList()) { for (SwitchElement element : route.getSwitchList()) {
Switch aSwitch = element.getASwitch(); Switch aSwitch = element.getASwitch();
aSwitch.routeLock(); aSwitch.routeLock(route);
} }
// 延续保护 // 延续保护
@ -1303,7 +1303,7 @@ public class RouteService {
boolean right = route.getStart().isRight(); boolean right = route.getStart().isRight();
for (Section section : route.getSectionList()) { for (Section section : route.getSectionList()) {
if (!section.isRouteLock()) { if (!section.isRouteLock()) {
section.routeLocking(right); section.routeLocking(route, right);
} }
} }
if (route.isOpen()) { if (route.isOpen()) {

View File

@ -1,6 +1,5 @@
package club.joylink.rtss.simulation.cbtc.data.map; package club.joylink.rtss.simulation.cbtc.data.map;
import club.joylink.rtss.simulation.cbtc.data.CalculateService;
import club.joylink.rtss.simulation.cbtc.data.SimulationDataRepository; import club.joylink.rtss.simulation.cbtc.data.SimulationDataRepository;
import club.joylink.rtss.simulation.cbtc.data.support.RoutePath; import club.joylink.rtss.simulation.cbtc.data.support.RoutePath;
import club.joylink.rtss.simulation.cbtc.data.support.SectionPosition; import club.joylink.rtss.simulation.cbtc.data.support.SectionPosition;
@ -173,6 +172,11 @@ public class Section extends MayOutOfOrderDevice {
*/ */
private boolean routeLock; private boolean routeLock;
/**
* 锁闭该区段的进路
*/
private Route route;
/** /**
* 锁闭方向 * 锁闭方向
*/ */
@ -253,6 +257,7 @@ public class Section extends MayOutOfOrderDevice {
super.reset(); super.reset();
this.blockade = false; this.blockade = false;
this.routeLock = false; this.routeLock = false;
this.route = null;
this.lockRight = false; this.lockRight = false;
this.overlapLock = false; this.overlapLock = false;
this.ctOccupied = false; this.ctOccupied = false;
@ -577,16 +582,18 @@ public class Section extends MayOutOfOrderDevice {
/** /**
* 进路锁闭(连同逻辑区段) * 进路锁闭(连同逻辑区段)
*/ */
public void routeLocking(boolean right) { public void routeLocking(Route route, boolean right) {
//岔心锁闭 //岔心锁闭
if (this.parent != null && this.parent.isCross()) { if (this.parent != null && this.parent.isCross()) {
this.parent.setRoute(route);
this.parent.setRouteLock(true); this.parent.setRouteLock(true);
this.parent.setLockRight(right); this.parent.setLockRight(right);
} }
this.route = route;
this.routeLock = true; this.routeLock = true;
this.lockRight = right; this.lockRight = right;
if (!CollectionUtils.isEmpty(this.logicList)) { if (!CollectionUtils.isEmpty(this.logicList)) {
this.logicList.forEach(logic -> logic.routeLocking(right)); this.logicList.forEach(logic -> logic.routeLocking(route, right));
} }
} }
@ -600,11 +607,13 @@ public class Section extends MayOutOfOrderDevice {
//岔心解锁 //岔心解锁
if (this.parent != null && this.parent.isCross()) { if (this.parent != null && this.parent.isCross()) {
this.parent.setRouteLock(false); this.parent.setRouteLock(false);
this.parent.setRoute(null);
// this.parent.setOverlapLock(false); // this.parent.setOverlapLock(false);
this.parent.setLockRight(false); this.parent.setLockRight(false);
} }
//自身解锁 //自身解锁
this.routeLock = false; this.routeLock = false;
this.route = null;
// this.overlapLock = false; // this.overlapLock = false;
this.lockRight = false; this.lockRight = false;
if (!CollectionUtils.isEmpty(this.logicList)) { if (!CollectionUtils.isEmpty(this.logicList)) {
@ -615,6 +624,7 @@ public class Section extends MayOutOfOrderDevice {
public void forceUnlocking() { public void forceUnlocking() {
this.routeLock = false; this.routeLock = false;
this.route = null;
this.overlapLock = false; this.overlapLock = false;
this.lockRight = false; this.lockRight = false;
if (!isCross() && !CollectionUtils.isEmpty(this.logicList)) { if (!isCross() && !CollectionUtils.isEmpty(this.logicList)) {
@ -836,6 +846,7 @@ public class Section extends MayOutOfOrderDevice {
public void faultUnlock() { public void faultUnlock() {
this.faultLock = false; this.faultLock = false;
this.routeLock = false; this.routeLock = false;
this.route = null;
this.overlapLock = false; this.overlapLock = false;
} }

View File

@ -64,6 +64,11 @@ public class Switch extends MayOutOfOrderDevice {
*/ */
private boolean routeLock; private boolean routeLock;
/**
* 锁闭该道岔的进路
*/
private Route route;
/** /**
* 是否进路侧防锁闭 * 是否进路侧防锁闭
*/ */
@ -140,6 +145,7 @@ public class Switch extends MayOutOfOrderDevice {
this.singleLock = false; this.singleLock = false;
this.blockade = false; this.blockade = false;
this.routeLock = false; this.routeLock = false;
this.route = null;
this.fpLock = false; this.fpLock = false;
this.overlapLock = false; this.overlapLock = false;
this.masterGuideLock = false; this.masterGuideLock = false;
@ -252,12 +258,14 @@ public class Switch extends MayOutOfOrderDevice {
this.c.setSpeedUpLimit(upLimitSpeed); this.c.setSpeedUpLimit(upLimitSpeed);
} }
public void routeLock() { public void routeLock(Route route) {
this.routeLock = true; this.routeLock = true;
this.route = route;
} }
public void routeUnlock() { public void routeUnlock() {
this.routeLock = false; this.routeLock = false;
this.route = null;
} }
public void fpLock() { public void fpLock() {

View File

@ -140,7 +140,12 @@ public class MovementAuthority {
float offset = right ? Math.max(0, section.getLen() - 100) : Math.min(100, section.getLen()); float offset = right ? Math.max(0, section.getLen() - 100) : Math.min(100, section.getLen());
return new SectionPosition(section, offset); return new SectionPosition(section, offset);
} }
case FAULT_SWITCH: case FAULT_SWITCH: {
Section section = (Section) this.device;
float offset = right ? 0 : section.getLen();
SectionPosition stopPosition = new SectionPosition(section, offset);
return CalculateService.calculateNextPositionByStartAndLen(stopPosition, !right, 100);
}
case UNLOCK_SECTION: case UNLOCK_SECTION:
case FAULT_SECTION: case FAULT_SECTION:
case ROUTE_INTERLOCK_NOT_MET: case ROUTE_INTERLOCK_NOT_MET:

View File

@ -5,10 +5,8 @@ import club.joylink.rtss.simulation.cbtc.CI.service.RouteService;
import club.joylink.rtss.simulation.cbtc.Simulation; import club.joylink.rtss.simulation.cbtc.Simulation;
import club.joylink.rtss.simulation.cbtc.data.SimulationDataRepository; import club.joylink.rtss.simulation.cbtc.data.SimulationDataRepository;
import club.joylink.rtss.simulation.cbtc.data.map.*; import club.joylink.rtss.simulation.cbtc.data.map.*;
import club.joylink.rtss.simulation.cbtc.data.support.SectionPosition;
import club.joylink.rtss.simulation.cbtc.data.vr.VirtualRealitySignal; import club.joylink.rtss.simulation.cbtc.data.vr.VirtualRealitySignal;
import club.joylink.rtss.simulation.cbtc.data.vr.VirtualRealitySwitch; import club.joylink.rtss.simulation.cbtc.data.vr.VirtualRealitySwitch;
import club.joylink.rtss.simulation.cbtc.data.vr.VirtualRealityTrain;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -41,7 +39,7 @@ public class DeviceStatusModifyTool {
// 修改进路侧防到指定位置 // 修改进路侧防到指定位置
this.batchSetRouteFlsSwitchPositionAndLock(route.getFlsList()); this.batchSetRouteFlsSwitchPositionAndLock(route.getFlsList());
// 进路元素锁闭 // 进路元素锁闭
route.getSectionList().forEach(section -> section.routeLocking(route.getStart().isRight())); route.getSectionList().forEach(section -> section.routeLocking(route, route.getStart().isRight()));
if (this.routeService.checkCanOverlapSet(simulation, route)) { if (this.routeService.checkCanOverlapSet(simulation, route)) {
SectionPath overlapPath = route.selectOverlapElement(); SectionPath overlapPath = route.selectOverlapElement();
if (Objects.nonNull(overlapPath)) { if (Objects.nonNull(overlapPath)) {
@ -86,7 +84,7 @@ public class DeviceStatusModifyTool {
// 修改进路侧防到指定位置 // 修改进路侧防到指定位置
this.batchSetRouteFlsSwitchPositionAndLock(route.getFlsList()); this.batchSetRouteFlsSwitchPositionAndLock(route.getFlsList());
// 进路元素锁闭 // 进路元素锁闭
route.getSectionList().forEach(section -> section.routeLocking(route.getStart().isRight())); route.getSectionList().forEach(section -> section.routeLocking(route, route.getStart().isRight()));
SectionPath overlapPath = route.selectOverlapElement(); SectionPath overlapPath = route.selectOverlapElement();
if (Objects.nonNull(overlapPath)) { if (Objects.nonNull(overlapPath)) {
this.batchSetRouteSwitchPositionAndLock(route, overlapPath.getSwitchList(), false); this.batchSetRouteSwitchPositionAndLock(route, overlapPath.getSwitchList(), false);
@ -162,7 +160,7 @@ public class DeviceStatusModifyTool {
} }
this.setSingleSwitchPositionDirectly(switchElement.getASwitch(), switchElement.isNormal()); this.setSingleSwitchPositionDirectly(switchElement.getASwitch(), switchElement.isNormal());
if (routeLock) { if (routeLock) {
switchElement.getASwitch().routeLock(); switchElement.getASwitch().routeLock(route);
} else { // 延续保护锁闭 } else { // 延续保护锁闭
switchElement.getASwitch().overlapLock(); switchElement.getASwitch().overlapLock();
} }