106 lines
3.5 KiB
Go
106 lines
3.5 KiB
Go
package component
|
||
|
||
import "joylink.club/ecs"
|
||
|
||
//计轴设备,管理联锁集中站内的所有计轴区段
|
||
//计轴直接复位:计轴的轮对计数清零,区段转换为空闲状态
|
||
//计轴预复位:将计轴的轮对计数清零,但是区段不会立即变成空闲区段,而是处于一种“占用”状态,在压道车通过之后确认区段空闲且计轴正常后,区段转换为空闲状态
|
||
//
|
||
//当CI系统给计轴设备发送计轴直接复零/预复零命令时,连续发送一定时间(具体发送时间调试后确定)的复零/预复零命令。
|
||
//当RAC,RJO,RJT任意一个不为0时,终止发送复零/预复零命令。
|
||
|
||
// AxleSection 计轴物理区段状态
|
||
type AxleSection struct {
|
||
//true-占用,false-出清
|
||
Occ bool
|
||
}
|
||
|
||
// AxleSectionFault 计轴区段故障
|
||
type AxleSectionFault struct {
|
||
//true-设置区段故障占用,false-取消区段故障占用
|
||
SectionFault bool
|
||
}
|
||
|
||
// AxleCounter 计轴区段计轴器
|
||
type AxleCounter struct {
|
||
//计轴区段内车轴数
|
||
Count int
|
||
//记录Count变化波形
|
||
countPulse uint8
|
||
}
|
||
|
||
func NewAxleCounter() *AxleCounter {
|
||
return &AxleCounter{Count: 0, countPulse: 0}
|
||
}
|
||
func (c *AxleCounter) UpdateCount(count int) {
|
||
cp := to1(c.Count)
|
||
np := to1(count)
|
||
//
|
||
if cp != np {
|
||
c.countPulse <<= 1
|
||
if np > 0 {
|
||
c.countPulse |= np
|
||
}
|
||
}
|
||
c.Count = count
|
||
}
|
||
func (c *AxleCounter) ResetCountPulse() {
|
||
c.countPulse = 0x00
|
||
}
|
||
|
||
// IsCount010Pulse true-车进入计轴区段后出清计轴区段
|
||
func (c *AxleCounter) IsCount010Pulse() bool {
|
||
return c.countPulse&0x01 == 0 && c.countPulse&0x02 > 0 && c.countPulse&0x04 == 0
|
||
}
|
||
|
||
type AxleCounterRuntime struct {
|
||
//true-计轴复位反馈,表示计轴设备已收到CI系统发送的直接复零/预复零命令。
|
||
Rac bool
|
||
//true-运营原因拒绝计轴复位,如区段空闲时下发复位命令;或车轮压住传感器时收到复位命令。
|
||
Rjo bool
|
||
//true-技术原因拒绝计轴复位,主要指计轴相关设备故障时收到复位命令,如车轮传感器的导线断开、AEB之间的通信故障等
|
||
Rjt bool
|
||
//true-计轴直接复位
|
||
//计轴的轮对计数清零,区段转换为空闲状态
|
||
Drst bool
|
||
//true-计轴预复位
|
||
//将计轴的轮对计数清零,但是区段不会立即变成空闲区段,而是处于一种“占用”状态,在压道车通过之后确认区段空闲且计轴正常后,区段转换为空闲状态
|
||
Pdrst bool
|
||
//true-计轴系统正在执行直接预复位操作
|
||
DoingPdrst bool
|
||
}
|
||
|
||
// FaDcAxleDevice 车站计轴管理设备
|
||
type FaDcAxleDevice struct {
|
||
//区段计轴器列表,实体(AxleCounterType,AxleCounterRuntimeType,AxleSectionFlag)
|
||
Counters []*ecs.Entry
|
||
//计轴区段实体列表,实体(AxleSectionType,AxleSectionFaultType)
|
||
Sections []*ecs.Entry
|
||
//key-section id ,value-counter
|
||
CounterMap map[string]*ecs.Entry
|
||
}
|
||
|
||
func (f *FaDcAxleDevice) AddAxleSection(counter *ecs.Entry, section *ecs.Entry) {
|
||
f.Counters = append(f.Counters, counter)
|
||
f.Sections = append(f.Sections, section)
|
||
f.CounterMap[AxleSectionFlag.Get(counter).Id] = counter
|
||
}
|
||
|
||
var (
|
||
FaDcAxleDeviceType = ecs.NewComponentType[FaDcAxleDevice]()
|
||
AxleSectionFaultType = ecs.NewComponentType[AxleSectionFault]()
|
||
AxleSectionType = ecs.NewComponentType[AxleSection]()
|
||
AxleCounterType = ecs.NewComponentType[AxleCounter]()
|
||
AxleCounterRuntimeType = ecs.NewComponentType[AxleCounterRuntime]()
|
||
AxleSectionFlag = ecs.NewComponentType[Uid]() //计轴区段id
|
||
)
|
||
|
||
// 归1
|
||
func to1(c int) uint8 {
|
||
if c > 0 {
|
||
return 0x01
|
||
} else {
|
||
return 0x00
|
||
}
|
||
}
|