[修改]设备状态proto消息中增加计轴区段状态,原“所有区段状态”改为物理区段状态“
This commit is contained in:
parent
272274a5c4
commit
016ce0e8bb
@ -1 +1 @@
|
|||||||
Subproject commit a5ebb6869d51969e5887f1dfceaffe8fcdc27312
|
Subproject commit 4a126b57ac6bb950d764851a27a5ddf4caad0b2a
|
6
third_party/interlock/beijing11/msg.go
vendored
6
third_party/interlock/beijing11/msg.go
vendored
@ -239,12 +239,12 @@ func (t *ToInterlockFrame) encode() []byte {
|
|||||||
//扣车,数量0
|
//扣车,数量0
|
||||||
data = binary.BigEndian.AppendUint16(data, 0)
|
data = binary.BigEndian.AppendUint16(data, 0)
|
||||||
//信号机状态
|
//信号机状态
|
||||||
binary.BigEndian.AppendUint16(data, uint16(len(t.SignalStates)))
|
data = binary.BigEndian.AppendUint16(data, uint16(len(t.SignalStates)))
|
||||||
for _, state := range t.SignalStates {
|
for _, state := range t.SignalStates {
|
||||||
data = state.encode(data)
|
data = state.encode(data)
|
||||||
}
|
}
|
||||||
//计轴区段
|
//计轴区段
|
||||||
binary.BigEndian.AppendUint16(data, uint16(len(t.AxleSectionStates)))
|
data = binary.BigEndian.AppendUint16(data, uint16(len(t.AxleSectionStates)))
|
||||||
for _, state := range t.AxleSectionStates {
|
for _, state := range t.AxleSectionStates {
|
||||||
data = state.encode(data)
|
data = state.encode(data)
|
||||||
}
|
}
|
||||||
@ -259,6 +259,8 @@ func (t *ToInterlockFrame) encode() []byte {
|
|||||||
}
|
}
|
||||||
//车库门,数量0
|
//车库门,数量0
|
||||||
data = binary.BigEndian.AppendUint16(data, 0)
|
data = binary.BigEndian.AppendUint16(data, 0)
|
||||||
|
//填充报文长度
|
||||||
|
binary.BigEndian.PutUint16(data[1:3], uint16(len(data)))
|
||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
|
|
||||||
|
8
third_party/interlock/beijing11/repo.go
vendored
8
third_party/interlock/beijing11/repo.go
vendored
@ -3,7 +3,7 @@ package beijing11
|
|||||||
// StationDeviceIndexTable 联锁站设备索引表
|
// StationDeviceIndexTable 联锁站设备索引表
|
||||||
type StationDeviceIndexTable struct {
|
type StationDeviceIndexTable struct {
|
||||||
StationName string //地图数据中车站的Code属性
|
StationName string //地图数据中车站的Code属性
|
||||||
WaysideCode string //通信数据中的“轨旁编号”
|
InterlockCode uint16 //通信数据中的“联锁编号”
|
||||||
TurnoutMap map[uint16]*Row
|
TurnoutMap map[uint16]*Row
|
||||||
PsdMap map[uint16]*Row
|
PsdMap map[uint16]*Row
|
||||||
EsbMap map[uint16]*Row
|
EsbMap map[uint16]*Row
|
||||||
@ -17,10 +17,10 @@ type StationDeviceIndexTable struct {
|
|||||||
XcjMap map[uint16]*Row
|
XcjMap map[uint16]*Row
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewStationDeviceIndexTable() *StationDeviceIndexTable {
|
func NewStationDeviceIndexTable(stationName string, interlockCode uint16) *StationDeviceIndexTable {
|
||||||
return &StationDeviceIndexTable{
|
return &StationDeviceIndexTable{
|
||||||
StationName: "",
|
StationName: stationName,
|
||||||
WaysideCode: "",
|
InterlockCode: interlockCode,
|
||||||
TurnoutMap: make(map[uint16]*Row),
|
TurnoutMap: make(map[uint16]*Row),
|
||||||
PsdMap: make(map[uint16]*Row),
|
PsdMap: make(map[uint16]*Row),
|
||||||
EsbMap: make(map[uint16]*Row),
|
EsbMap: make(map[uint16]*Row),
|
||||||
|
62
third_party/interlock/beijing11/service.go
vendored
62
third_party/interlock/beijing11/service.go
vendored
@ -25,6 +25,7 @@ var (
|
|||||||
var (
|
var (
|
||||||
mu = sync.Mutex{} //启动任务时使用,避免重复启动任务
|
mu = sync.Mutex{} //启动任务时使用,避免重复启动任务
|
||||||
serviceContextMap = make(map[string]*serviceContext) //每个集中站的服务上下文,key-集中站code
|
serviceContextMap = make(map[string]*serviceContext) //每个集中站的服务上下文,key-集中站code
|
||||||
|
waysideCode uint16 = 0x6301
|
||||||
)
|
)
|
||||||
|
|
||||||
type serviceContext struct {
|
type serviceContext struct {
|
||||||
@ -115,11 +116,29 @@ func makeTable(sim *memory.VerifySimulation, stationCode string) *StationDeviceI
|
|||||||
}
|
}
|
||||||
|
|
||||||
uids := memory.QueryUidStructure[*memory.StationUidStructure](mapId)
|
uids := memory.QueryUidStructure[*memory.StationUidStructure](mapId)
|
||||||
table := NewStationDeviceIndexTable()
|
var table *StationDeviceIndexTable
|
||||||
|
for _, station := range stationGi.Stations {
|
||||||
|
if station.StationName != stationCode {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for _, lianSuoIndexData := range stationGi.LianSuoData.Stations {
|
||||||
|
if lianSuoIndexData.Id == station.Common.Id {
|
||||||
|
table = NewStationDeviceIndexTable(station.StationName, uint16(lianSuoIndexData.Index))
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if table == nil {
|
||||||
|
panic(fmt.Sprintf("联锁配置车站[%s]在地图中没有对应的车站或联锁编号数据", stationCode))
|
||||||
|
}
|
||||||
//道岔
|
//道岔
|
||||||
for _, data := range stationGi.LianSuoData.Switchs {
|
for _, data := range stationGi.LianSuoData.Switchs {
|
||||||
|
if data.Index <= 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
for _, station := range uids.TurnoutIds[data.Id].CentralizedStations {
|
for _, station := range uids.TurnoutIds[data.Id].CentralizedStations {
|
||||||
if station.Code == stationCode {
|
if station.StationName == stationCode {
|
||||||
table.TurnoutMap[uint16(data.Id)] = &Row{
|
table.TurnoutMap[uint16(data.Id)] = &Row{
|
||||||
commonId: data.Id,
|
commonId: data.Id,
|
||||||
uid: uids.TurnoutIds[data.Id].Uid,
|
uid: uids.TurnoutIds[data.Id].Uid,
|
||||||
@ -131,8 +150,11 @@ func makeTable(sim *memory.VerifySimulation, stationCode string) *StationDeviceI
|
|||||||
}
|
}
|
||||||
//屏蔽门
|
//屏蔽门
|
||||||
for _, data := range stationGi.LianSuoData.ScreenDoors {
|
for _, data := range stationGi.LianSuoData.ScreenDoors {
|
||||||
|
if data.Index <= 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
for _, station := range uids.PsdIds[data.Id].CentralizedStations {
|
for _, station := range uids.PsdIds[data.Id].CentralizedStations {
|
||||||
if station.Code == stationCode {
|
if station.StationName == stationCode {
|
||||||
relateDeviceMap := make(map[string]string)
|
relateDeviceMap := make(map[string]string)
|
||||||
for _, mkx := range sim.Repo.MkxList() {
|
for _, mkx := range sim.Repo.MkxList() {
|
||||||
if mkx.Psd().Id() == uids.PsdIds[data.Id].Uid {
|
if mkx.Psd().Id() == uids.PsdIds[data.Id].Uid {
|
||||||
@ -152,8 +174,11 @@ func makeTable(sim *memory.VerifySimulation, stationCode string) *StationDeviceI
|
|||||||
}
|
}
|
||||||
//紧急停车
|
//紧急停车
|
||||||
for _, data := range stationGi.LianSuoData.EsbButtons {
|
for _, data := range stationGi.LianSuoData.EsbButtons {
|
||||||
|
if data.Index <= 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
for _, station := range uids.EsbIds[data.Id].CentralizedStations {
|
for _, station := range uids.EsbIds[data.Id].CentralizedStations {
|
||||||
if station.Code == stationCode {
|
if station.StationName == stationCode {
|
||||||
table.EsbMap[uint16(data.Id)] = &Row{
|
table.EsbMap[uint16(data.Id)] = &Row{
|
||||||
commonId: data.Id,
|
commonId: data.Id,
|
||||||
uid: uids.EsbIds[data.Id].Uid,
|
uid: uids.EsbIds[data.Id].Uid,
|
||||||
@ -166,8 +191,11 @@ func makeTable(sim *memory.VerifySimulation, stationCode string) *StationDeviceI
|
|||||||
//扣车,实际数据中数量为0
|
//扣车,实际数据中数量为0
|
||||||
//信号机
|
//信号机
|
||||||
for _, data := range stationGi.LianSuoData.Signals {
|
for _, data := range stationGi.LianSuoData.Signals {
|
||||||
|
if data.Index <= 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
for _, station := range uids.SignalIds[data.Id].CentralizedStations {
|
for _, station := range uids.SignalIds[data.Id].CentralizedStations {
|
||||||
if station.Code == stationCode {
|
if station.StationName == stationCode {
|
||||||
table.SignalMap[uint16(data.Id)] = &Row{
|
table.SignalMap[uint16(data.Id)] = &Row{
|
||||||
commonId: data.Id,
|
commonId: data.Id,
|
||||||
uid: uids.SignalIds[data.Id].Uid,
|
uid: uids.SignalIds[data.Id].Uid,
|
||||||
@ -179,8 +207,14 @@ func makeTable(sim *memory.VerifySimulation, stationCode string) *StationDeviceI
|
|||||||
}
|
}
|
||||||
//计轴区段
|
//计轴区段
|
||||||
for _, data := range stationGi.LianSuoData.Sections {
|
for _, data := range stationGi.LianSuoData.Sections {
|
||||||
|
if data.Index <= 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if data.Index == 0 { //这是其它线的区段
|
||||||
|
continue
|
||||||
|
}
|
||||||
for _, station := range uids.PhysicalSectionIds[data.Id].CentralizedStations {
|
for _, station := range uids.PhysicalSectionIds[data.Id].CentralizedStations {
|
||||||
if station.Code == stationCode {
|
if station.StationName == stationCode {
|
||||||
table.AxleSectionMap[uint16(data.Id)] = &Row{
|
table.AxleSectionMap[uint16(data.Id)] = &Row{
|
||||||
commonId: data.Id,
|
commonId: data.Id,
|
||||||
uid: uids.PhysicalSectionIds[data.Id].Uid,
|
uid: uids.PhysicalSectionIds[data.Id].Uid,
|
||||||
@ -194,8 +228,11 @@ func makeTable(sim *memory.VerifySimulation, stationCode string) *StationDeviceI
|
|||||||
//防淹门,实际数据中数量为0
|
//防淹门,实际数据中数量为0
|
||||||
//人员防护
|
//人员防护
|
||||||
for _, data := range stationGi.LianSuoData.SpksSwitchs {
|
for _, data := range stationGi.LianSuoData.SpksSwitchs {
|
||||||
|
if data.Index <= 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
for _, station := range uids.SpksIds[data.Id].CentralizedStations {
|
for _, station := range uids.SpksIds[data.Id].CentralizedStations {
|
||||||
if station.Code == stationCode {
|
if station.StationName == stationCode {
|
||||||
table.SpksMap[uint16(data.Id)] = &Row{
|
table.SpksMap[uint16(data.Id)] = &Row{
|
||||||
commonId: data.Id,
|
commonId: data.Id,
|
||||||
uid: uids.SpksIds[data.Id].Uid,
|
uid: uids.SpksIds[data.Id].Uid,
|
||||||
@ -217,27 +254,32 @@ func (s *serviceContext) runCollectTask(ctx context.Context) {
|
|||||||
defer func() {
|
defer func() {
|
||||||
if err := recover(); err != nil {
|
if err := recover(); err != nil {
|
||||||
logger().Error("状态收集任务出错,记录后重启", "error", err, "stack", string(debug.Stack()))
|
logger().Error("状态收集任务出错,记录后重启", "error", err, "stack", string(debug.Stack()))
|
||||||
s.runCollectTask(nil)
|
s.runCollectTask(ctx)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
}()
|
|
||||||
for range time.Tick(time.Duration(s.iConfig.Period) * time.Millisecond) {
|
for range time.Tick(time.Duration(s.iConfig.Period) * time.Millisecond) {
|
||||||
select {
|
select {
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
return
|
return
|
||||||
default:
|
default:
|
||||||
frame := s.collectDeviceState()
|
frame := s.collectDeviceState()
|
||||||
err := s.client.Send(frame.encode())
|
data := frame.encode()
|
||||||
|
err := s.client.Send(data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger().Error("向联锁发送数据失败", "error", err)
|
logger().Error("向联锁发送数据失败", "error", err)
|
||||||
|
} else {
|
||||||
|
logger().Info(fmt.Sprintf("向联锁发送数据:%x", data))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *serviceContext) collectDeviceState() *ToInterlockFrame {
|
func (s *serviceContext) collectDeviceState() *ToInterlockFrame {
|
||||||
wd := entity.GetWorldData(s.sim.World)
|
wd := entity.GetWorldData(s.sim.World)
|
||||||
frame := &ToInterlockFrame{}
|
frame := &ToInterlockFrame{}
|
||||||
|
frame.WaysideCode = waysideCode
|
||||||
|
frame.InterlockCode = s.deviceTable.InterlockCode
|
||||||
//道岔
|
//道岔
|
||||||
for _, row := range s.deviceTable.TurnoutMap {
|
for _, row := range s.deviceTable.TurnoutMap {
|
||||||
entry := wd.EntityMap[row.uid]
|
entry := wd.EntityMap[row.uid]
|
||||||
|
Loading…
Reference in New Issue
Block a user