列车ITC级别运行相关逻辑完善
This commit is contained in:
parent
38da1d716c
commit
884b312623
@ -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();
|
||||||
|
@ -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())) {
|
||||||
|
@ -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);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -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()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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()) {
|
||||||
|
@ -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();
|
||||||
|
Loading…
Reference in New Issue
Block a user