列车ITC级别运行相关逻辑完善

This commit is contained in:
walker-sheng 2021-08-09 14:28:07 +08:00
parent 38da1d716c
commit 884b312623
10 changed files with 46 additions and 13 deletions

View File

@ -111,15 +111,12 @@ public class MaService {
public float calculateDistanceOfEbTriggerEnd() { public float calculateDistanceOfEbTriggerEnd() {
if (this.type.equals(MaType.ITC_Signal)) { if (this.type.equals(MaType.ITC_Signal)) {
Signal signal = (Signal) this.device;
boolean right = this.train.isRight(); boolean right = this.train.isRight();
if (signal.isNormalOpen()) {
Float distance = CalculateService.calculateDistance(this.train.getHeadPosition(), this.eoaPosition, right); Float distance = CalculateService.calculateDistance(this.train.getHeadPosition(), this.eoaPosition, right);
if (distance == null) { if (distance == null) {
distance = 0f; distance = 0f;
} }
return distance; return distance;
}
} else if (this.type.equals(MaType.Limit_Signal_Without_Overlap)) { } else if (this.type.equals(MaType.Limit_Signal_Without_Overlap)) {
Signal signal = (Signal) this.device; Signal signal = (Signal) this.device;
if (signal.getSection().isJustTurnBackTrack()) { if (signal.getSection().isJustTurnBackTrack()) {
@ -137,7 +134,7 @@ public class MaService {
this.type.equals(MaType.ITC_Signal)) { this.type.equals(MaType.ITC_Signal)) {
Signal signal = (Signal) this.device; Signal signal = (Signal) this.device;
SectionPosition sectionPosition = new SectionPosition(signal.getSection(), signal.getOffset()); SectionPosition sectionPosition = new SectionPosition(signal.getSection(), signal.getOffset());
SectionPosition end = CalculateService.calculateNextPositionByStartAndLen(sectionPosition, !right, 2); SectionPosition end = CalculateService.calculateNextPositionByStartAndLen(sectionPosition, !right, 5);
Float distance = CalculateService.calculateDistance(this.train.getHeadPosition(), end, right); Float distance = CalculateService.calculateDistance(this.train.getHeadPosition(), end, right);
if (distance == null) { if (distance == null) {
return 0; return 0;
@ -341,7 +338,7 @@ public class MaService {
if (signal != null) { // 车头所在区段前方信号机开放 if (signal != null) { // 车头所在区段前方信号机开放
if (signal.isNormalOpen()) { if (signal.isNormalOpen()) {
Float distance = CalculateService.calculateDistance(headPosition, new SectionPosition(section, signal.getOffset()), right); Float distance = CalculateService.calculateDistance(headPosition, new SectionPosition(section, signal.getOffset()), right);
if (distance != null && distance > 0 && distance < 2) { // 此处距离为暂时的估计值 if (distance != null) { // 此处距离为暂时的估计值
Route lockedRoute = signal.getLockedRoute(); Route lockedRoute = signal.getLockedRoute();
if (lockedRoute != null) { // 进路存在取进路终端信号机结束 if (lockedRoute != null) { // 进路存在取进路终端信号机结束
signal = lockedRoute.getDestination(); signal = lockedRoute.getDestination();

View File

@ -6,6 +6,7 @@ import club.joylink.rtss.simulation.cbtc.data.map.Section;
import club.joylink.rtss.simulation.cbtc.data.support.SectionPosition; import club.joylink.rtss.simulation.cbtc.data.support.SectionPosition;
import club.joylink.rtss.simulation.cbtc.data.vr.VirtualRealityTrain; import club.joylink.rtss.simulation.cbtc.data.vr.VirtualRealityTrain;
import club.joylink.rtss.simulation.cbtc.onboard.ATP.OnboardAtpApiService; import club.joylink.rtss.simulation.cbtc.onboard.ATP.OnboardAtpApiService;
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;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
@ -16,6 +17,7 @@ import java.util.Map;
/** /**
* 应答器信号发射 * 应答器信号发射
*/ */
@Slf4j
@Component @Component
public class ResponderService { public class ResponderService {
@ -56,6 +58,7 @@ public class ResponderService {
if (!CollectionUtils.isEmpty(responders)) { if (!CollectionUtils.isEmpty(responders)) {
for (Responder responder : responders) { for (Responder responder : responders) {
if (responder.isBetween(headPosition, headPositionNew)) { // 列车经过应答器 if (responder.isBetween(headPosition, headPositionNew)) { // 列车经过应答器
log.debug(String.format("列车[%s]经过应答器[%s]", train.getGroupNumber(), responder.debugStr()));
train.viaResponder(responder); train.viaResponder(responder);
if (!train.isCommunicable() && if (!train.isCommunicable() &&
(responder.isIB() || responder.isVB())) { (responder.isIB() || responder.isVB())) {

View File

@ -423,8 +423,11 @@ public class AtsTrainLoadService {
this.ciLogicLoop.routeLogic(simulation); this.ciLogicLoop.routeLogic(simulation);
MapConfig config = simulation.getRepository().getConfig(); MapConfig config = simulation.getRepository().getConfig();
if (RunLevel.ITC.equals(config.getRunMode())) { if (RunLevel.ITC.equals(config.getRunMode())) {
loadedList.forEach(train -> { for (VirtualRealityTrain train : simulation.getRepository().getAllVrTrain()) {
train.setCommunication(false); train.setCommunication(false);
train.setNoCommunicateDevice(true);
}
loadedList.forEach(train -> {
this.maService.calculateAndUpdateItcMa(simulation, train); this.maService.calculateAndUpdateItcMa(simulation, train);
}); });
} }

View File

@ -1203,6 +1203,11 @@ public class MapDeviceBuilder {
for (Signal signal : signalList) { for (Signal signal : signalList) {
Responder responder = responderMap.get(signal.getCode()); Responder responder = responderMap.get(signal.getCode());
if (responder == null) { if (responder == null) {
Section section = signal.getSection();
if (section.isNormalStandTrack()) {
errMsgList.add(String.format("没有关联信号机[%s(%s)]的主应答器(VB)",
signal.getName(), signal.getCode()));
}
log.warn(String.format("信号机[%s]没有主应答器", signal.debugStr())); log.warn(String.format("信号机[%s]没有主应答器", signal.debugStr()));
} }
} }

View File

@ -520,7 +520,7 @@ public class Signal extends MayOutOfOrderDevice {
public SectionPosition getItcMaCalPosition() { public SectionPosition getItcMaCalPosition() {
if (this.itcMaCalPosition == null) { if (this.itcMaCalPosition == null) {
this.itcMaCalPosition = new SectionPosition(this.section, this.right ? this.getOffset() - 2 : this.offset + 2); this.itcMaCalPosition = new SectionPosition(this.section, this.right ? this.getOffset() - 1 : this.offset + 1);
} }
return itcMaCalPosition; return itcMaCalPosition;
} }

View File

@ -102,6 +102,10 @@ public class VirtualRealityTrain extends VirtualRealityDevice {
// -----------列车运行属性----------- // -----------列车运行属性-----------
/**
* 是否没有通信设备
*/
private boolean noCommunicateDevice;
/** /**
* 车载服务通讯是否正常在线 * 车载服务通讯是否正常在线
*/ */
@ -425,7 +429,7 @@ public class VirtualRealityTrain extends VirtualRealityDevice {
private boolean released; private boolean released;
public void setCommunication(boolean communication) { public void setCommunication(boolean communication) {
if ((Fault.COMMUNICATION_ABNORMAL.equals(this.fault) || !atpOn) && communication) if ((Fault.COMMUNICATION_ABNORMAL.equals(this.fault) || !atpOn || this.noCommunicateDevice) && communication)
return; return;
this.communication = communication; this.communication = communication;
} }
@ -480,6 +484,7 @@ public class VirtualRealityTrain extends VirtualRealityDevice {
@Override @Override
public void reset() { public void reset() {
this.noCommunicateDevice = false;
this.communication = true; this.communication = true;
this.runLevel = null; this.runLevel = null;
this.driveMode = null; this.driveMode = null;

View File

@ -190,6 +190,7 @@ public class VRTrainRunningService {
if (section.equals(headPositionNew.getSection())) { if (section.equals(headPositionNew.getSection())) {
Signal signal = section.getSignalOf(right); Signal signal = section.getSignalOf(right);
if (signal != null && signal.getItcMaCalPosition().isBetween(headPosition, headPositionNew)) { if (signal != null && signal.getItcMaCalPosition().isBetween(headPosition, headPositionNew)) {
log.debug(String.format("列车[%s]触发ITC-MA计算并更新逻辑(无应答器线路)", train.getGroupNumber()));
this.maService.calculateAndUpdateItcMa(simulation, train); this.maService.calculateAndUpdateItcMa(simulation, train);
} }
} }

View File

@ -72,7 +72,7 @@ public class SpeedCurve {
public static SpeedCurve calculateAtoStopCurveAndUpdate(VirtualRealityTrain train, MaService.Ma ma) { public static SpeedCurve calculateAtoStopCurveAndUpdate(VirtualRealityTrain train, MaService.Ma ma) {
SectionPosition headPosition = train.getHeadPosition(); SectionPosition headPosition = train.getHeadPosition();
SectionPosition tailPosition = train.getTailPosition(); SectionPosition tailPosition = train.calculateTailPosition();
boolean right = train.isRight(); boolean right = train.isRight();
float stopDistance = ma.calculateDistanceOfAtoEnd(); float stopDistance = ma.calculateDistanceOfAtoEnd();
float speedMax = Math.min(train.getAtoSpeedMax(), train.getSpeedLimit() * 0.9f); float speedMax = Math.min(train.getAtoSpeedMax(), train.getSpeedLimit() * 0.9f);

View File

@ -85,6 +85,20 @@ public class ATPLogicLoop {
} }
private void driveLogicRun(Simulation simulation, VirtualRealityTrain train) { private void driveLogicRun(Simulation simulation, VirtualRealityTrain train) {
if (train.isReleased()) {
if (!simulation.getRepository().hasResponder()) { // 没有应答器
// 列车处于释放中如果列车车头已经跨过信号机还没有更新ITC-MA触发EB
SectionPosition headPosition = train.getHeadPosition();
SectionPosition tailPosition = train.calculateTailPosition();
Signal signal = headPosition.getSection().getSignalOf(train.isRight());
if (signal != null) {
if (new SectionPosition(signal.getSection(), signal.getOffset()).isBetween(headPosition, tailPosition)) {
this.atpService.triggerSignalEB(train);
}
}
}
return;
}
MaService.Ma ma2 = train.getMa2(); MaService.Ma ma2 = train.getMa2();
// ITC级别列车停车手动释放操作判断 // ITC级别列车停车手动释放操作判断
if (train.isStop() && train.isITC() && train.isAtoOn() && ma2 != null && !train.isReleased()) { if (train.isStop() && train.isITC() && train.isAtoOn() && ma2 != null && !train.isReleased()) {

View File

@ -35,6 +35,7 @@ public class OnboardAtpApiServiceImpl implements OnboardAtpApiService {
@Override @Override
public void updateCtcMa(Simulation simulation, MaService.Ma ma) { public void updateCtcMa(Simulation simulation, MaService.Ma ma) {
VirtualRealityTrain train = ma.getTrain(); VirtualRealityTrain train = ma.getTrain();
// log.debug(String.format("列车[%s]更新CTC-MA: %s", train.getGroupNumber(), ma.debugStr()));
SpeedCurve.calculateAndUpdate(simulation, train, ma); SpeedCurve.calculateAndUpdate(simulation, train, ma);
train.setCbtcMaMissDuration(0); train.setCbtcMaMissDuration(0);
} }
@ -44,7 +45,11 @@ public class OnboardAtpApiServiceImpl implements OnboardAtpApiService {
if (ma == null) { if (ma == null) {
return; return;
} }
if (train.isCommunicable()) {
log.debug(String.format("列车[%s]是通信车不更新ITC-MA", train.getGroupNumber()));
}
if (!train.isCommunicable()) { if (!train.isCommunicable()) {
log.debug(String.format("列车[%s]更新ITC-MA: %s", train.getGroupNumber(), ma.debugStr()));
boolean update = SpeedCurve.calculateAndUpdate(simulation, train, ma); boolean update = SpeedCurve.calculateAndUpdate(simulation, train, ma);
if (train.isIL()) { if (train.isIL()) {
train.setITCMode(); train.setITCMode();