Compare commits

...

3 Commits

Author SHA1 Message Date
tiger_zhou
c50b1b640d 列车操控
All checks were successful
local-test分支打包构建docker并发布运行 / Docker-Build (push) Successful in 1m53s
2024-08-27 11:58:08 +08:00
dcdb4610f8 [修改]移除屏蔽门继电器的自保持逻辑(因为自保持会导致12号线联锁宕机) 2024-08-26 11:23:51 +08:00
a165321c39 [新增]设备公里表长短链校正 2024-08-22 14:03:33 +08:00
9 changed files with 704 additions and 687 deletions

File diff suppressed because it is too large Load Diff

@ -1 +1 @@
Subproject commit 12df28cc3716e39d24ddcada44d1d4a4233405d4 Subproject commit 99ebcb04e516eaf0ad52ec35057606c0e52b31fa

@ -1 +1 @@
Subproject commit bc7ca44ffd0a95f8a1ae14b391f93b28b11a452b Subproject commit 30019273c5bb79fa29caab241bb89bd13d238fd9

View File

@ -85,9 +85,14 @@ func (t *BaliseDetector) newDetect(wd *component.WorldData, repo *repository.Rep
curAntennaRi := t.createBtmAntennaRunningInfo(wd, repo, th) //目前车头 curAntennaRi := t.createBtmAntennaRunningInfo(wd, repo, th) //目前车头
curAntennaRi2 := t.createBtmAntennaRunningInfo(wd, repo, th2) //上次车头 curAntennaRi2 := t.createBtmAntennaRunningInfo(wd, repo, th2) //上次车头
var startBalises []*repository.Transponder var startBalises []*repository.Transponder
if th.Link != th2.Link {
startBalises = t.searchBalisesFromBetweenLinkPosition(repo, th.Up, curAntennaRi.LinkId, curAntennaRi.LinkOffset, curAntennaRi.LinkOffset)
} else {
startBalises = t.searchBalisesFromBetweenLinkPosition(repo, th.Up, curAntennaRi.LinkId, curAntennaRi2.LinkOffset, curAntennaRi.LinkOffset)
}
//startBalises = t.searchBalisesFromBetweenLinkPosition(repo, th.Up, curAntennaRi.LinkId, th2.LinkOffset, th.LinkOffset) //startBalises = t.searchBalisesFromBetweenLinkPosition(repo, th.Up, curAntennaRi.LinkId, th2.LinkOffset, th.LinkOffset)
startBalises = t.searchBalisesFromBetweenLinkPosition(repo, th.Up, curAntennaRi.LinkId, curAntennaRi2.LinkOffset, curAntennaRi.LinkOffset) //startBalises = t.searchBalisesFromBetweenLinkPosition(repo, th.Up, curAntennaRi.LinkId, curAntennaRi2.LinkOffset, curAntennaRi.LinkOffset)
balises := make([]*repository.Transponder, 0) balises := make([]*repository.Transponder, 0)
for _, balise := range startBalises { for _, balise := range startBalises {
@ -108,7 +113,6 @@ func (t *BaliseDetector) newDetect(wd *component.WorldData, repo *repository.Rep
//slog.Info(fmt.Sprintf("-----------------id:%v ,offset:%v, up: %v,linkeId:%v ,headoffset:%v,tailOffset:%v", balise.Id(), balise.LinkPosition().Offset(), th.Up, curAntennaRi.LinkId, curAntennaRi.LinkOffset, curAntennaRi2.LinkOffset)) //slog.Info(fmt.Sprintf("-----------------id:%v ,offset:%v, up: %v,linkeId:%v ,headoffset:%v,tailOffset:%v", balise.Id(), balise.LinkPosition().Offset(), th.Up, curAntennaRi.LinkId, curAntennaRi.LinkOffset, curAntennaRi2.LinkOffset))
telegram, utel := t.rcvTelegram(wd, balise.Id()) telegram, utel := t.rcvTelegram(wd, balise.Id())
if t.addNewExpectedBalise(balise, btmCache, telegram, utel) { if t.addNewExpectedBalise(balise, btmCache, telegram, utel) {
//slog.Info(fmt.Sprintf("+++++++++++++id:%v ,offset:%v, up: %v,linkeId:%v ,headoffset:%v,tailOffset:%v", balise.Id(), balise.LinkPosition().Offset(), th.Up, curAntennaRi.LinkId, curAntennaRi.LinkOffset, curAntennaRi2.LinkOffset)) //slog.Info(fmt.Sprintf("+++++++++++++id:%v ,offset:%v, up: %v,linkeId:%v ,headoffset:%v,tailOffset:%v", balise.Id(), balise.LinkPosition().Offset(), th.Up, curAntennaRi.LinkId, curAntennaRi.LinkOffset, curAntennaRi2.LinkOffset))
} }
} }

View File

@ -265,6 +265,18 @@ func (d *dynamics) Start(manager DynamicsMessageManager) error {
d.udpDelayRecorder.Start() d.udpDelayRecorder.Start()
return nil return nil
} }
func (d *dynamics) trainControl(ctx context.Context) {
for {
select {
case <-ctx.Done():
return
default:
time.Sleep(time.Second * 5)
}
}
}
// 初始化客户端、服务等信息 // 初始化客户端、服务等信息
func (d *dynamics) initDynamics() error { func (d *dynamics) initDynamics() error {

View File

@ -101,7 +101,7 @@ func findTrainTccGraphicDataHandler(tccG *data_proto.TccGraphicStorage, id uint3
func initTrainVobc(trainLoad int64, trainIsUp bool) (*state_proto.TrainVobcState, uint32) { func initTrainVobc(trainLoad int64, trainIsUp bool) (*state_proto.TrainVobcState, uint32) {
vobc := &state_proto.TrainVobcState{TrainLoad: int64(trainLoad), BrakingStatus: true, BrakeForce: DEFAULT_BRAKE_FORCE * 100, DirectionForward: true, vobc := &state_proto.TrainVobcState{TrainLoad: int64(trainLoad), BrakingStatus: true, BrakeForce: DEFAULT_BRAKE_FORCE * 100, DirectionForward: true,
AllDoorClose: true, ObstacleCheckBtn: true /*RightDoorCloseCommand: true, LeftDoorCloseCommand: true,*/, BrakeHeavyFault: true, AtpCutSwitch: true, AllDoorClose: true, ObstacleCheckBtn: true, RightDoorCloseCommand: true, LeftDoorCloseCommand: true, BrakeHeavyFault: true, AtpCutSwitch: true,
ConfirmBtn: true, AtpPowerOnBtn: true, DoorModeMM: true, ConfirmBtn: true, AtpPowerOnBtn: true, DoorModeMM: true,
} }
var trainActDir uint32 = 0 var trainActDir uint32 = 0
@ -134,11 +134,10 @@ func initTrainTcc(vs *VerifySimulation) *state_proto.TrainControlState {
for _, b := range tccGI.TccButtons { for _, b := range tccGI.TccButtons {
btn := &state_proto.TrainControlState_ControlButton{Id: b.Common.Id, Passed: false} btn := &state_proto.TrainControlState_ControlButton{Id: b.Common.Id, Passed: false}
switch b.Code { switch b.Code {
case ATPQCKG /*GZM, GYM,*/, ZAWTGJC, ZDZGZ, ATPSD, MSQR: case ATPQCKG, ZAWTGJC, ZDZGZ, ATPSD, MSQR:
btn.Passed = true btn.Passed = true
} }
btns[b.Code] = btn btns[b.Code] = btn
//btns = append(btns, btn)
} }
tcc.Buttons = btns tcc.Buttons = btns
for _, b := range tccGI.TccHandles { for _, b := range tccGI.TccHandles {

View File

@ -25,16 +25,15 @@ const (
//列车总质量(吨) //列车总质量(吨)
DEFULAT_TRAIN_LOAD = 160 DEFULAT_TRAIN_LOAD = 160
//通号最大制动力是-1.21 //通号最大制动力是-1.21
DEFAULT_BRAKE_FORCE = DEFULAT_TRAIN_LOAD * 1000 * 1.21 / 1000 //DEFAULT_BRAKE_FORCE = DEFULAT_TRAIN_LOAD * 1000 * 1.21 / 1000
DEFAULT_BRAKE_FORCE = 1.21
//通号最大加速度是0.97 //通号最大加速度是0.97
DEFAULT_TRAIN_TRACTION = DEFULAT_TRAIN_LOAD * 1000 * 0.97 / 1000 //千牛 DEFAULT_TRAIN_TRACTION_ACC2 = DEFULAT_TRAIN_LOAD * 1000 * 0.97 / 1000 //千牛
DEFAULT_TRAIN_WORK = 2880 * 1000 DEFAULT_TRAIN_TRACTION_ACC = 0.97 //千牛
DEFAULT_TRAIN_STARTED_SPEED = 0.003 TRAIN_MAX_TRACTION_POWER = 2880 * 1000
DEFAULT_TRAIN_STARTED_SPEED float32 = 5.5555556 //列车起步速度单位 米/秒
) )
func culTrainTractionF(sta *state_proto.TrainState) {
}
func CreateMsgTrainConfig(trainId int, trainLen int64, configTrainData dto.ConfigTrainData) *message.TrainOperationConfig { func CreateMsgTrainConfig(trainId int, trainLen int64, configTrainData dto.ConfigTrainData) *message.TrainOperationConfig {
return &message.TrainOperationConfig{TrainIndex: trainId, Length: int(trainLen), return &message.TrainOperationConfig{TrainIndex: trainId, Length: int(trainLen),
DavisParamA: configTrainData.DavisParamA, DavisParamB: configTrainData.DavisParamB, DavisParamA: configTrainData.DavisParamA, DavisParamB: configTrainData.DavisParamB,
@ -371,7 +370,6 @@ func UpdateTrainStateByDynamics(vs *VerifySimulation, trainId string, info *mess
sta.DynamicState.RampResistance = float32(info.SlopeResistance) / 1000 sta.DynamicState.RampResistance = float32(info.SlopeResistance) / 1000
sta.DynamicState.CurveResistance = float32(info.CurveResistance) / 1000 sta.DynamicState.CurveResistance = float32(info.CurveResistance) / 1000
sta.DynamicState.Speed = speedParse(info.Speed) sta.DynamicState.Speed = speedParse(info.Speed)
sta.DynamicState.HeadSensorSpeed1 = speedParse(info.HeadSpeed1) sta.DynamicState.HeadSensorSpeed1 = speedParse(info.HeadSpeed1)
sta.DynamicState.HeadSensorSpeed2 = speedParse(info.HeadSpeed2) sta.DynamicState.HeadSensorSpeed2 = speedParse(info.HeadSpeed2)
sta.DynamicState.TailSensorSpeed1 = speedParse(info.TailSpeed1) sta.DynamicState.TailSensorSpeed1 = speedParse(info.TailSpeed1)

View File

@ -261,6 +261,12 @@ func (s *VerifySimulation) HandleDynamicsTrainInfo(info *message.DynamicsTrainIn
train := t.(*state_proto.TrainState) train := t.(*state_proto.TrainState)
// 更新列车状态 // 更新列车状态
trainState := UpdateTrainStateByDynamics(s, trainId, info) trainState := UpdateTrainStateByDynamics(s, trainId, info)
vs := train.VobcState
if vs.TractionStatus {
//动力学之前是kn * 100 这里*10就是N
tf := float32(vs.TractionPower) / info.Speed
vs.TractionForce = int64(tf / 10)
}
if train.ConnState.Conn && train.ConnState.ConnType == state_proto.TrainConnState_VOBC { if train.ConnState.Conn && train.ConnState.ConnType == state_proto.TrainConnState_VOBC {
semi_physical_train.Default().SendTrainControlMessage(info) semi_physical_train.Default().SendTrainControlMessage(info)
electrical_machinery.Default().SendElectricMachineryMessage2(info, trainState) electrical_machinery.Default().SendElectricMachineryMessage2(info, trainState)
@ -388,6 +394,7 @@ func (s *VerifySimulation) CollectTrainControlState() []message.TrainControlMsg
if train.ConnState.Conn == true && train.ConnState.ConnType == state_proto.TrainConnState_VOBC { if train.ConnState.Conn == true && train.ConnState.ConnType == state_proto.TrainConnState_VOBC {
vobc = true vobc = true
} }
//train.DynamicState.Speed
cms = append(cms, message.TrainControlMsg{ControlInfo: train.VobcState, TrainId: train.Id, FromVobc: vobc}) cms = append(cms, message.TrainControlMsg{ControlInfo: train.VobcState, TrainId: train.Id, FromVobc: vobc})
return true return true
}) })
@ -1297,6 +1304,13 @@ func fillProtoRepository(repo *proto.Repository, storage *data_proto.RtssGraphic
SameTrend: data.SameTrend, SameTrend: data.SameTrend,
}) })
} }
//公里标校准数据
for _, calibration := range storage.KilometerMarkCalibrations {
repo.KilometerCalibrations = append(repo.KilometerCalibrations, &proto.KilometerCalibration{
Design: convertKm(calibration.DesignKm),
Actual: convertKm(calibration.ActualKm),
})
}
//// 初始化站场图按钮 //// 初始化站场图按钮
//for _, data := range storage.EsbButtons { //for _, data := range storage.EsbButtons {
// repo.Buttons = append(repo.Buttons, &proto.Button{ // repo.Buttons = append(repo.Buttons, &proto.Button{

View File

@ -58,7 +58,7 @@ func ControlTrainUpdate(s *VerifySimulation, ct *request_proto.TrainControl) {
oldTraction := sta.VobcState.TractionForce oldTraction := sta.VobcState.TractionForce
oldBrakeForce := sta.VobcState.BrakeForce oldBrakeForce := sta.VobcState.BrakeForce
isTraction := ct.Handler.Val > 0 //是否制动 isTraction := ct.Handler.Val > 0 //是否制动
baseMsg = trainControlHandle(vobc, tcc, ct.Handler, ct.DeviceId, tccGraphicData) baseMsg = trainControlHandle(sta.DynamicState.Speed, vobc, tcc, ct.Handler, ct.DeviceId, tccGraphicData)
train_pc_sim.Default().SendHandleSwitch(oldTraction, oldBrakeForce, isTraction, sta) train_pc_sim.Default().SendHandleSwitch(oldTraction, oldBrakeForce, isTraction, sta)
} else if ct.ControlType == request_proto.TrainControl_TRAIN_DOOR_MODE_CHANGE { } else if ct.ControlType == request_proto.TrainControl_TRAIN_DOOR_MODE_CHANGE {
baseMsg = trainDoorModeChangeHandle(vobc, tcc, ct.SwitchKey, ct.DeviceId, tccGraphicData) baseMsg = trainDoorModeChangeHandle(vobc, tcc, ct.SwitchKey, ct.DeviceId, tccGraphicData)
@ -68,20 +68,6 @@ func ControlTrainUpdate(s *VerifySimulation, ct *request_proto.TrainControl) {
} else { } else {
baseMsg = append(baseMsg, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.DIR_ZERO_FORWARD, 0}}) baseMsg = append(baseMsg, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.DIR_ZERO_FORWARD, 0}})
} }
if vobc.LeftDoorOpenCommand || vobc.RightDoorOpenCommand {
baseMsg = append(baseMsg, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.DOOR_LOCK_STATE, 0}})
if vobc.LeftDoorOpenCommand {
baseMsg = append(baseMsg, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.LEFT_DOOR_STATE, 1}})
baseMsg = append(baseMsg, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.RIGHT_DOOR_STATE, 0}})
} else if vobc.RightDoorOpenCommand {
baseMsg = append(baseMsg, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.LEFT_DOOR_STATE, 0}})
baseMsg = append(baseMsg, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.RIGHT_DOOR_STATE, 1}})
}
}
if vobc.LeftDoorCloseCommand && vobc.RightDoorCloseCommand {
baseMsg = append(baseMsg, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.DOOR_LOCK_STATE, 1}})
}
if !vobc.DirectionForward && !vobc.DirectionBackward { if !vobc.DirectionForward && !vobc.DirectionBackward {
vobc.TractionStatus = false vobc.TractionStatus = false
vobc.TractionForce = 0 vobc.TractionForce = 0
@ -112,12 +98,8 @@ func trainControlButton(vobc *state_proto.TrainVobcState, buttonMap map[string]*
return controlDoorOpenBtn(vobc, active, btn, graphicBtn.Code == KZM) return controlDoorOpenBtn(vobc, active, btn, graphicBtn.Code == KZM)
case GZM, GYM: //关左门按钮 case GZM, GYM: //关左门按钮
return controlDoorCloseBtn(vobc, active, btn, graphicBtn.Code == KZM) return controlDoorCloseBtn(vobc, active, btn, graphicBtn.Code == GZM)
//return controlLeftDoorCloseBtn(vobc, active, btn)
//case KYM: //开右门按钮
// return controlRightDoorBtn(vobc, active, btn)
//case GYM: //关右门按钮
// return controlRightDoorCloseBtn(vobc, active, btn)
case ZF: //折返按钮 case ZF: //折返按钮
return controlReverseBtn(vobc, active, btn) return controlReverseBtn(vobc, active, btn)
case QZMYX: //强制门允许 case QZMYX: //强制门允许
@ -179,6 +161,7 @@ func controlDoorCloseBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *
tccBtn.Passed = active tccBtn.Passed = active
var doorAct byte = message.CLOSE_LEFT_DOOR var doorAct byte = message.CLOSE_LEFT_DOOR
var doorState byte = message.LEFT_DOOR_STATE var doorState byte = message.LEFT_DOOR_STATE
msg := make([]message.TrainPcSimBaseMessage, 0)
if isLeft { if isLeft {
vobc.LeftDoorCloseCommand = active vobc.LeftDoorCloseCommand = active
} else { } else {
@ -186,10 +169,13 @@ func controlDoorCloseBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *
doorAct = message.CLOSE_RIGHT_DOOR doorAct = message.CLOSE_RIGHT_DOOR
doorState = message.RIGHT_DOOR_STATE doorState = message.RIGHT_DOOR_STATE
} }
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{doorAct, status}}, msg = append(msg, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{doorAct, status}})
{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{doorState, 0}}, if vobc.LeftDoorCloseCommand && vobc.RightDoorCloseCommand {
msg = append(msg, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.DOOR_LOCK_STATE, 1}})
} }
msg = append(msg, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{doorState, 0}})
//msg = append(msg, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{doorAct, 0}})
return msg
} }
// 开车门 // 开车门
@ -201,8 +187,10 @@ func controlDoorOpenBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *s
var doorState byte = message.LEFT_DOOR_STATE var doorState byte = message.LEFT_DOOR_STATE
if isLeft { if isLeft {
vobc.LeftDoorOpenCommand = active vobc.LeftDoorOpenCommand = active
vobc.LeftDoorCloseCommand = false
} else { } else {
vobc.RightDoorOpenCommand = active vobc.RightDoorOpenCommand = active
vobc.RightDoorCloseCommand = false
doorAct = message.OPEN_RIGHT_DOOR doorAct = message.OPEN_RIGHT_DOOR
doorState = message.RIGHT_DOOR_STATE doorState = message.RIGHT_DOOR_STATE
} }
@ -214,55 +202,6 @@ func controlDoorOpenBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *s
return msg return msg
} }
// 开左门按钮
func controlLeftDoorBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
var status byte = 0
if active {
status = 1
}
vobc.LeftDoorOpenCommand = active
tccBtn.Passed = active
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.LEFT_OPEN_DOOR, status}},
{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.LEFT_DOOR_STATE, status}},
}
}
// 关左门按钮
func controlLeftDoorCloseBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
var status byte = 0
if active {
status = 1
}
vobc.LeftDoorCloseCommand = active
tccBtn.Passed = active
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.CLOSE_LEFT_DOOR, status}}}
}
// 开右门
func controlRightDoorBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
var status byte = 0
if active {
status = 1
}
vobc.RightDoorOpenCommand = active
tccBtn.Passed = active
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.OPEN_RIGHT_DOOR, status}}}
}
// 关右门按钮
func controlRightDoorCloseBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
var status byte = 0
if active {
status = 1
}
vobc.RightDoorCloseCommand = active
tccBtn.Passed = active
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.CLOSE_RIGHT_DOOR, status}}}
}
// 折返 // 折返
func controlReverseBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage { func controlReverseBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
var status byte = 0 var status byte = 0
@ -377,6 +316,7 @@ func controlOverhaulBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *s
tccBtn.Passed = active tccBtn.Passed = active
vobc.OverhaulBtn = active vobc.OverhaulBtn = active
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.OVERHAUL, status}}} return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.OVERHAUL, status}}}
//return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.ATO_SEND_TRAIN, status}}}
} }
// 休眠按钮 // 休眠按钮
@ -480,19 +420,38 @@ func trainDoorModeChangeHandle(vobc *state_proto.TrainVobcState, tcc *state_prot
return msg return msg
} }
func trainTractionPower(speed int32, traction int64, handleVal int32) int32 {
//速度V可以通过初始速度 加上加速度a乘以时间t来计算即V=V1+at
acc := float32(math.Abs(float64(handleVal)) / 100 * DEFAULT_TRAIN_TRACTION_ACC)
resultSpeed := DEFAULT_TRAIN_STARTED_SPEED + acc
if speed > 0 {
resultSpeed = float32(speed)/3.6/100 + acc
}
// p=fv
p := float32(traction) * resultSpeed
if p >= TRAIN_MAX_TRACTION_POWER {
return TRAIN_MAX_TRACTION_POWER
}
return int32(p)
}
func trainBrakingOrTraction(trainLoad int64, handleVal int32, power float64) int64 {
tl := trainLoad * 10 //列车初始化已经 * 100再*10 就是对应的kg
//F=ma 单位 F单位牛顿m单位千克a单位米/秒²
totalPower := float64(tl) * power / 1000
//DEFULAT_TRAIN_LOAD * 1000 * 0.97 / 1000
n := int64(math.Abs(float64(handleVal))/100*totalPower) * 100
return n
}
// 列车牵引控制 // 列车牵引控制
func trainControlHandle(vobc *state_proto.TrainVobcState, tcc *state_proto.TrainControlState, request *request_proto.TrainControl_PushHandler, deviceId uint32, tccGraphic *data_proto.TccGraphicStorage) []message.TrainPcSimBaseMessage { func trainControlHandle(speed int32, vobc *state_proto.TrainVobcState, tcc *state_proto.TrainControlState, request *request_proto.TrainControl_PushHandler, deviceId uint32, tccGraphic *data_proto.TccGraphicStorage) []message.TrainPcSimBaseMessage {
_, find := findTrainTccGraphicDataHandler(tccGraphic, deviceId) _, find := findTrainTccGraphicDataHandler(tccGraphic, deviceId)
if !find { if !find {
slog.Error("未找到对应的牵引制动手柄设备deviceId:", deviceId) slog.Error("未找到对应的牵引制动手柄设备deviceId:", deviceId)
return nil return nil
} }
/*trainStart := false
if tcc.PushHandler.Val <= 0 {
trainStart = true
} else if tcc.PushHandler.Val > 0 {
}*/
jjzdBtn := tcc.Buttons[JJZD] jjzdBtn := tcc.Buttons[JJZD]
vobc.TractionStatus = false vobc.TractionStatus = false
vobc.TractionForce = 0 vobc.TractionForce = 0
@ -503,14 +462,17 @@ func trainControlHandle(vobc *state_proto.TrainVobcState, tcc *state_proto.Train
var zeroState byte = 0 var zeroState byte = 0
var brakeState byte = 0 var brakeState byte = 0
var traction byte = 0 var traction byte = 0
vobc.TractionPower = 0
if request.Val > 0 { if request.Val > 0 {
vobc.TractionStatus = true vobc.TractionStatus = true
vobc.TractionForce = int64(float32(request.Val)/100*DEFAULT_TRAIN_TRACTION) * 100 vobc.TractionForce = trainBrakingOrTraction(vobc.TrainLoad, request.Val, DEFAULT_TRAIN_TRACTION_ACC)
vobc.TractionPower = trainTractionPower(speed, vobc.TractionForce, request.Val)
notBreak = 1 notBreak = 1
traction = 1 traction = 1
} else if request.Val < 0 { } else if request.Val < 0 {
vobc.BrakingStatus = true vobc.BrakingStatus = true
vobc.BrakeForce = int64(math.Abs(float64(request.Val))/100*DEFAULT_BRAKE_FORCE) * 100 //vobc.BrakeForce = int64(math.Abs(float64(request.Val))/100*DEFAULT_BRAKE_FORCE) * 100
vobc.BrakeForce = trainBrakingOrTraction(vobc.TrainLoad, request.Val, DEFAULT_BRAKE_FORCE)
vobc.EmergencyBrakingStatus = false vobc.EmergencyBrakingStatus = false
jjzdBtn.Passed = false jjzdBtn.Passed = false
brakeState = 1 brakeState = 1
@ -702,7 +664,7 @@ func trainPcSimDigitalOutInfoHandleCode7_0(d byte, vobc *state_proto.TrainVobcSt
vobc.EmergencyBrakingStatus = message.AtpLowPowerByte(message.GetBit(d, 3)) //紧急制动 vobc.EmergencyBrakingStatus = message.AtpLowPowerByte(message.GetBit(d, 3)) //紧急制动
vobc.LeftDoorState = message.IsTrueForByte(message.GetBit(d, 4)) //开左门允许 vobc.LeftDoorState = message.IsTrueForByte(message.GetBit(d, 4)) //开左门允许
vobc.RightDoorState = message.IsTrueForByte(message.GetBit(d, 5)) //开右门允许 vobc.RightDoorState = message.IsTrueForByte(message.GetBit(d, 5)) //开右门允许
vobc.RightDoorCloseCommand = message.IsTrueForByte(message.GetBit(d, 6)) //关右门 vobc.AtoCloseRightDoor = message.IsTrueForByte(message.GetBit(d, 6)) //ATO关右门
vobc.AllDoorClose = message.IsTrueForByte(message.GetBit(d, 7)) //车门保持关闭 vobc.AllDoorClose = message.IsTrueForByte(message.GetBit(d, 7)) //车门保持关闭
vobc.LightTractionSafetyCircuit = vobc.TractionSafetyCircuit //切牵引 vobc.LightTractionSafetyCircuit = vobc.TractionSafetyCircuit //切牵引
vobc.LightEmergencyBrakingStatus = vobc.EmergencyBrakingStatus //紧急制动 vobc.LightEmergencyBrakingStatus = vobc.EmergencyBrakingStatus //紧急制动
@ -894,15 +856,15 @@ func (s *VerifySimulation) ObtainTrainDigitalMockDataForStatus(train *state_prot
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.HANDLE_FORWORD, 0}, Type: message.SENDER_TRAIN_OUTR_INFO}) //方向手柄向前控制 msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.HANDLE_FORWORD, 0}, Type: message.SENDER_TRAIN_OUTR_INFO}) //方向手柄向前控制
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.HANDLE_BACKWORD, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //方向手柄向前控制 msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.HANDLE_BACKWORD, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //方向手柄向前控制
} }
/*if vs.RightDoorCloseCommand { /* if vs.RightDoorCloseCommand {
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.CLOSE_RIGHT_DOOR, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //关右门按钮 msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.CLOSE_RIGHT_DOOR, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //关右门按钮
} }
if vs.LeftDoorCloseCommand { if vs.LeftDoorCloseCommand {
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.CLOSE_LEFT_DOOR, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //关左门按钮 msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.CLOSE_LEFT_DOOR, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //关左门按钮
}*/
if vs.AllDoorClose {
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.DOOR_LOCK_STATE, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //车门锁闭状态
} }
if vs.AllDoorClose {
}*/
if vs.ObstacleCheckBtn { if vs.ObstacleCheckBtn {
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.OBSTACLE_CHECK, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //障碍物检测按钮 msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.OBSTACLE_CHECK, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //障碍物检测按钮
} }
@ -922,18 +884,11 @@ func (s *VerifySimulation) ObtainTrainDigitalMockDataForStatus(train *state_prot
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.EMERGENT_HANDLE_DOWN, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //紧急手柄拉下 msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.EMERGENT_HANDLE_DOWN, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //紧急手柄拉下
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.TRAIN_TRACTION_CUTED, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //紧急手柄拉下 msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.TRAIN_TRACTION_CUTED, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //紧急手柄拉下
if vs.DoorModeAA {
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.DOOR_MODE_AA, 1}, Type: message.SENDER_TRAIN_OUTR_INFO})
} else if vs.DoorModeAM {
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.DOOR_MODE_AM, 1}, Type: message.SENDER_TRAIN_OUTR_INFO})
} else if vs.DoorModeMM {
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.DOOR_MODE_MM, 1}, Type: message.SENDER_TRAIN_OUTR_INFO})
}
return msgArr return msgArr
} }
func (s *VerifySimulation) ObtainTrainDigitalMockData(train *state_proto.TrainState) []message.TrainPcSimBaseMessage { func (s *VerifySimulation) ObtainTrainDigitalMockData(train *state_proto.TrainState) []message.TrainPcSimBaseMessage {
msgArr := make([]message.TrainPcSimBaseMessage, 0) msgArr := make([]message.TrainPcSimBaseMessage, 0)
vs := train.VobcState
stateArr := s.ObtainTrainDigitalMockDataForStatus(train) stateArr := s.ObtainTrainDigitalMockDataForStatus(train)
msgArr = append(msgArr, stateArr...) msgArr = append(msgArr, stateArr...)
@ -947,7 +902,20 @@ func (s *VerifySimulation) ObtainTrainDigitalMockData(train *state_proto.TrainSt
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{38, 0}, Type: message.SENDER_TRAIN_OUTR_INFO}) //只牵引 msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{38, 0}, Type: message.SENDER_TRAIN_OUTR_INFO}) //只牵引
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{40, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //本端机械钩 msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{40, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //本端机械钩
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{41, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //对端机械钩 msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{41, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //对端机械钩
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.DOOR_LOCK_STATE, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //车门锁闭状态
var modeAA, modeAM, modeMM byte = 0, 0, 0
if vs.DoorModeAA {
modeAA = 1
}
if vs.DoorModeAM {
modeAM = 1
}
if vs.DoorModeMM {
modeMM = 1
}
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.DOOR_MODE_AA, modeAA}, Type: message.SENDER_TRAIN_OUTR_INFO})
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.DOOR_MODE_AM, modeAM}, Type: message.SENDER_TRAIN_OUTR_INFO})
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.DOOR_MODE_MM, modeMM}, Type: message.SENDER_TRAIN_OUTR_INFO})
train.BtmState = nil train.BtmState = nil
return msgArr return msgArr
} }