实现联锁驱采卡系统功能

调整道岔驱动电路逻辑
This commit is contained in:
walker 2023-11-03 17:26:32 +08:00
parent 8cf9e419b8
commit a0352ee5e8
17 changed files with 673 additions and 420 deletions

View File

@ -1,29 +0,0 @@
package component
import (
"joylink.club/ecs"
"joylink.club/rtsssimulation/component/component_proto"
"joylink.club/rtsssimulation/repository"
"joylink.club/rtsssimulation/repository/model/proto"
)
var (
// 联锁驱动状态表
CiQdStateType = ecs.NewComponentType[component_proto.CiQdState]()
// 联锁采集状态表
CiCjStateType = ecs.NewComponentType[component_proto.CiCjState]()
)
// 联锁驱采数据表
type CiQcTable struct {
// 所属集中站
station *repository.Station
// 驱动码表
QdBits []proto.CjDataItem
// 采集码表
CjBits []proto.CjData
}
func GetCiQdBitOfRelay(ci *ecs.Entry, uid string) (bool, error) {
return false, nil
}

63
component/ci_qc.go Normal file
View File

@ -0,0 +1,63 @@
package component
import (
"fmt"
"joylink.club/ecs"
"joylink.club/rtsssimulation/component/component_proto"
"joylink.club/rtsssimulation/repository/model/proto"
)
var (
// 驱采表引用
CiQcTableType = ecs.NewComponentType[CiQcTable]()
// 联锁驱动、采集状态表
CiQcStateType = ecs.NewComponentType[CiQcState]()
)
// 联锁驱采数据表
type CiQcTable struct {
// 驱动码表
QdBits []*proto.QdData
// 采集码表
CjBits []*proto.CjData
// 驱动索引
QdIndex map[string]int
}
func (qc *CiQcTable) BuildQcIndex() error {
qc.QdIndex = make(map[string]int)
for i, qd := range qc.QdBits {
if len(qd.RefRelays) > 0 {
key := qd.RefRelays[0]
if _, ok := qc.QdIndex[key]; ok {
return fmt.Errorf("联锁驱动数据重复,驱动码表存在多个相同继电器: '%s'", key)
} else {
qc.QdIndex[key] = i
}
}
}
return nil
}
func (qc *CiQcTable) QueryQdIndex(uid string) (int, bool) {
idx, ok := qc.QdIndex[uid]
return idx, ok
}
type CiQcState struct {
component_proto.CiQcState
}
func NewCiQcState(qlen int, clen int) *CiQcState {
return &CiQcState{
component_proto.CiQcState{
Qbs: make([]byte, qlen),
Cbs: make([]byte, clen),
},
}
}
func GetCiQdBitOfRelay(ci *ecs.Entry, uid string) (bool, error) {
return false, nil
}

View File

@ -20,18 +20,20 @@ const (
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
// 联锁驱动状态表
type CiQdState struct {
// 联锁驱动、采集状态表
type CiQcState struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// 驱动bit列表
Bits []bool `protobuf:"varint,1,rep,packed,name=bits,proto3" json:"bits,omitempty"`
// 驱动bit表
Qbs []byte `protobuf:"bytes,1,opt,name=qbs,proto3" json:"qbs,omitempty"`
// 采集bit表
Cbs []byte `protobuf:"bytes,2,opt,name=cbs,proto3" json:"cbs,omitempty"`
}
func (x *CiQdState) Reset() {
*x = CiQdState{}
func (x *CiQcState) Reset() {
*x = CiQcState{}
if protoimpl.UnsafeEnabled {
mi := &file_component_ci_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@ -39,13 +41,13 @@ func (x *CiQdState) Reset() {
}
}
func (x *CiQdState) String() string {
func (x *CiQcState) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*CiQdState) ProtoMessage() {}
func (*CiQcState) ProtoMessage() {}
func (x *CiQdState) ProtoReflect() protoreflect.Message {
func (x *CiQcState) ProtoReflect() protoreflect.Message {
mi := &file_component_ci_proto_msgTypes[0]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@ -57,62 +59,21 @@ func (x *CiQdState) ProtoReflect() protoreflect.Message {
return mi.MessageOf(x)
}
// Deprecated: Use CiQdState.ProtoReflect.Descriptor instead.
func (*CiQdState) Descriptor() ([]byte, []int) {
// Deprecated: Use CiQcState.ProtoReflect.Descriptor instead.
func (*CiQcState) Descriptor() ([]byte, []int) {
return file_component_ci_proto_rawDescGZIP(), []int{0}
}
func (x *CiQdState) GetBits() []bool {
func (x *CiQcState) GetQbs() []byte {
if x != nil {
return x.Bits
return x.Qbs
}
return nil
}
// 联锁采集状态表
type CiCjState struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Bits []bool `protobuf:"varint,1,rep,packed,name=bits,proto3" json:"bits,omitempty"`
}
func (x *CiCjState) Reset() {
*x = CiCjState{}
if protoimpl.UnsafeEnabled {
mi := &file_component_ci_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *CiCjState) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*CiCjState) ProtoMessage() {}
func (x *CiCjState) ProtoReflect() protoreflect.Message {
mi := &file_component_ci_proto_msgTypes[1]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use CiCjState.ProtoReflect.Descriptor instead.
func (*CiCjState) Descriptor() ([]byte, []int) {
return file_component_ci_proto_rawDescGZIP(), []int{1}
}
func (x *CiCjState) GetBits() []bool {
func (x *CiQcState) GetCbs() []byte {
if x != nil {
return x.Bits
return x.Cbs
}
return nil
}
@ -122,13 +83,12 @@ var File_component_ci_proto protoreflect.FileDescriptor
var file_component_ci_proto_rawDesc = []byte{
0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f, 0x63, 0x69, 0x2e, 0x70,
0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x22,
0x1f, 0x0a, 0x09, 0x43, 0x69, 0x51, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04,
0x62, 0x69, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x08, 0x52, 0x04, 0x62, 0x69, 0x74, 0x73,
0x22, 0x1f, 0x0a, 0x09, 0x43, 0x69, 0x43, 0x6a, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a,
0x04, 0x62, 0x69, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x08, 0x52, 0x04, 0x62, 0x69, 0x74,
0x73, 0x42, 0x1d, 0x5a, 0x1b, 0x2e, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74,
0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
0x2f, 0x0a, 0x09, 0x43, 0x69, 0x51, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x10, 0x0a, 0x03,
0x71, 0x62, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x71, 0x62, 0x73, 0x12, 0x10,
0x0a, 0x03, 0x63, 0x62, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x63, 0x62, 0x73,
0x42, 0x1d, 0x5a, 0x1b, 0x2e, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f,
0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
@ -143,10 +103,9 @@ func file_component_ci_proto_rawDescGZIP() []byte {
return file_component_ci_proto_rawDescData
}
var file_component_ci_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
var file_component_ci_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_component_ci_proto_goTypes = []interface{}{
(*CiQdState)(nil), // 0: component.CiQdState
(*CiCjState)(nil), // 1: component.CiCjState
(*CiQcState)(nil), // 0: component.CiQcState
}
var file_component_ci_proto_depIdxs = []int32{
0, // [0:0] is the sub-list for method output_type
@ -163,19 +122,7 @@ func file_component_ci_proto_init() {
}
if !protoimpl.UnsafeEnabled {
file_component_ci_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*CiQdState); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_component_ci_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*CiCjState); i {
switch v := v.(*CiQcState); i {
case 0:
return &v.state
case 1:
@ -193,7 +140,7 @@ func file_component_ci_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_component_ci_proto_rawDesc,
NumEnums: 0,
NumMessages: 2,
NumMessages: 1,
NumExtensions: 0,
NumServices: 0,
},

View File

@ -1,18 +1,104 @@
package component
import (
"fmt"
"joylink.club/ecs"
"joylink.club/rtsssimulation/consts"
"joylink.club/rtsssimulation/repository"
)
// 世界公共数据
var WorldDataType = ecs.NewComponentType[WorldData]()
// 世界数据单例组件
type WorldData struct {
Repo *repository.Repository
// 世界时间,时间戳,单位ms
Time int64
// uid为key的实体对象map
EntityMap map[string]*ecs.Entry
// 联锁驱采卡实体
CiQcEntities []*ecs.Entry
}
// 世界公共数据
var WorldDataType = ecs.NewComponentType[WorldData]()
// 是否在驱动码表中
func (wd *WorldData) IsDefinedInQdTable(uid string) bool {
for _, entry := range wd.CiQcEntities {
qc := CiQcTableType.Get(entry)
_, ok := qc.QueryQdIndex(uid)
if ok {
return true
}
}
return false
}
// 查询驱动位值
func (wd *WorldData) QueryQdBit(uid string) (bool, error) {
for _, entry := range wd.CiQcEntities {
qc := CiQcTableType.Get(entry)
idx, ok := qc.QueryQdIndex(uid)
if ok {
states := CiQcStateType.Get(entry)
return consts.GetBitOfBytes(states.Qbs, idx), nil
}
}
return false, fmt.Errorf("没有定义id=%s的继电器的驱动码表", uid)
}
// 根据uid获取对应设备的驱动位值
// 注意: 若找不到uid驱动码位会panic
func (wd *WorldData) GetQdBit(uid string) bool {
bit, err := wd.QueryQdBit(uid)
if err != nil {
panic(err)
}
return bit
}
// 获取继电器驱动位值
// 注意: 若没有uid组件或者找不到uid驱动码位会panic
func (wd *WorldData) GetRelayEntityQdBit(entry *ecs.Entry) bool {
if !entry.HasComponent(UidType) {
panic(fmt.Errorf("获取继电器实体驱动位值异常,实体没有uid组件"))
}
return wd.GetQdBit(UidType.Get(entry).Id)
}
// 根据uid获取对应设备的驱动位值
func (wd *WorldData) SetQdBit(uid string, v bool) error {
for _, entry := range wd.CiQcEntities {
qc := CiQcTableType.Get(entry)
idx, ok := qc.QueryQdIndex(uid)
if ok {
states := CiQcStateType.Get(entry)
consts.SetBitOfBytes(states.Qbs, idx, v)
return nil
}
}
return fmt.Errorf("没有定义id=%s的继电器的驱动码表", uid)
}
type QdBitParam struct {
Uid string
Val bool
}
func NewQdBitParam(uid string, v bool) *QdBitParam {
return &QdBitParam{
Uid: uid,
Val: v,
}
}
func (wd *WorldData) SetQdBits(params []*QdBitParam) error {
for _, param := range params {
err := wd.SetQdBit(param.Uid, param.Val)
if err != nil {
return err
}
}
return nil
}

View File

@ -177,43 +177,43 @@ func (te *Zdj9TwoElectronic) HasNilReference() bool {
return len(nils) > 0
}
// ZDJ9双机驱动状态组件
type Zdj9TwoDrive struct {
// 定操继电器驱动
DCJ bool
// 反操继电器驱动
FCJ bool
// 允操继电器驱动
YCJ bool
}
// // ZDJ9双机驱动状态组件
// type Zdj9TwoDrive struct {
// // 定操继电器驱动
// DCJ bool
// // 反操继电器驱动
// FCJ bool
// // 允操继电器驱动
// YCJ bool
// }
// ZDJ9双机采集状态组件
type Zdj9TwoCollect struct {
// 总定表继电器吸起采集
TDC_ZDBJ_XQ bool
// 总反表继电器吸起采集
TDC_ZFBJ_XQ bool
// 允操继电器吸起采集
TDC_YCJ_XQ bool
// 总定表继电器和总反表继电器都落下采集
TDC_ZDBJ_ZFBJ_LX bool
// 1机定表继电器吸起采集
TDFJ1_DBJ_XQ bool
// 1机反表继电器吸起采集
TDFJ1_FBJ_XQ bool
// 2机定表继电器吸起采集
TDFJ2_DBJ_XQ bool
// 2机反表继电器吸起采集
TDFJ2_FBJ_XQ bool
}
// // ZDJ9双机采集状态组件
// type Zdj9TwoCollect struct {
// // 总定表继电器吸起采集
// TDC_ZDBJ_XQ bool
// // 总反表继电器吸起采集
// TDC_ZFBJ_XQ bool
// // 允操继电器吸起采集
// TDC_YCJ_XQ bool
// // 总定表继电器和总反表继电器都落下采集
// TDC_ZDBJ_ZFBJ_LX bool
// // 1机定表继电器吸起采集
// TDFJ1_DBJ_XQ bool
// // 1机反表继电器吸起采集
// TDFJ1_FBJ_XQ bool
// // 2机定表继电器吸起采集
// TDFJ2_DBJ_XQ bool
// // 2机反表继电器吸起采集
// TDFJ2_FBJ_XQ bool
// }
var (
// ZDJ9双机电路元器件组件类型
Zdj9TwoElectronicType = ecs.NewComponentType[Zdj9TwoElectronic]()
// ZDJ9双机驱动状态组件类型
Zdj9TwoDriveType = ecs.NewComponentType[Zdj9TwoDrive]()
// ZDJ9双机采集状态组件类型
Zdj9TwoCollectType = ecs.NewComponentType[Zdj9TwoCollect]()
// // ZDJ9双机驱动状态组件类型
// Zdj9TwoDriveType = ecs.NewComponentType[Zdj9TwoDrive]()
// // ZDJ9双机采集状态组件类型
// Zdj9TwoCollectType = ecs.NewComponentType[Zdj9TwoCollect]()
)
// 转辙机状态

37
consts/bit.go Normal file
View File

@ -0,0 +1,37 @@
package consts
import "fmt"
// 获取字节数组中的位值
// bs - 原始字节数组
// bitIndex - 位索引
func GetBitOfBytes(bs []byte, bitIndex int) bool {
bi := bitIndex / 8
i := bitIndex % 8
if bi >= len(bs) {
panic(fmt.Errorf("从字节数组获取位值错误,位索引超出字节数组范围: 数组len=%d,位索引=%d", len(bs), bitIndex))
}
by := bs[bi]
v := byte(1 << (7 - i))
return (by & v) == v
}
// 设置字节数组中的位值
// bs - 原始字节数组
// bitIndex - 位索引
// v - 位值
func SetBitOfBytes(bs []byte, bitIndex int, v bool) []byte {
bi := bitIndex / 8
i := bitIndex % 8
if bi >= len(bs) {
panic(fmt.Errorf("设置字节数组位值错误,位索引超出字节数组范围: 数组len=%d,位索引=%d", len(bs), bitIndex))
}
by := bs[bi]
if v {
by |= (1 << (7 - i))
} else {
by &= ((1 << (7 - i)) ^ byte(0xff))
}
bs[bi] = by
return bs
}

117
consts/bit_test.go Normal file
View File

@ -0,0 +1,117 @@
package consts
import (
"fmt"
"strconv"
"testing"
"github.com/stretchr/testify/assert"
)
func TestGetBitOfBytes(t *testing.T) {
tests := []struct {
give []byte
giveBitIndex int
want bool
wantPanic bool
}{
{
give: []byte{0b00000010, 0b00011111},
giveBitIndex: 2,
want: false,
},
{
give: []byte{0b00000010, 0b00011111},
giveBitIndex: 6,
want: true,
},
{
give: []byte{0b00000010, 0b00011111},
giveBitIndex: 8,
want: false,
},
{
give: []byte{0b00000010, 0b00011111},
giveBitIndex: 10,
want: false,
},
{
give: []byte{0b00000010, 0b00011111},
giveBitIndex: 11,
want: true,
},
{
give: []byte{0b00000010, 0b00011111},
giveBitIndex: 16,
wantPanic: true,
},
}
for _, v := range tests {
t.Run(string(v.give), func(t *testing.T) {
if v.wantPanic {
assert.Panics(t, func() { GetBitOfBytes(v.give, v.giveBitIndex) })
} else {
assert.Equal(t, v.want, GetBitOfBytes(v.give, v.giveBitIndex))
}
})
}
}
func TestSetBitOfBytes(t *testing.T) {
tests := []struct {
give []byte
giveBitIndex int
giveVal bool
want []byte
wantPanic bool
}{
{
give: []byte{0b00000010, 0b00011111},
giveBitIndex: 2,
giveVal: true,
want: []byte{0b00100010, 0b00011111},
},
{
give: []byte{0b00000010, 0b00011111},
giveBitIndex: 6,
giveVal: false,
want: []byte{0b00000000, 0b00011111},
},
{
give: []byte{0b00000010, 0b00011111},
giveBitIndex: 8,
giveVal: false,
want: []byte{0b00000010, 0b00011111},
},
{
give: []byte{0b00000010, 0b00011111},
giveBitIndex: 10,
giveVal: true,
want: []byte{0b00000010, 0b00111111},
},
{
give: []byte{0b00000010, 0b00011111},
giveBitIndex: 11,
giveVal: false,
want: []byte{0b00000010, 0b00001111},
},
{
give: []byte{0b00000010, 0b00011111},
giveBitIndex: 16,
wantPanic: true,
},
}
for _, v := range tests {
t.Run(strconv.Itoa(v.giveBitIndex), func(t *testing.T) {
if v.wantPanic {
assert.Panics(t, func() { SetBitOfBytes(v.give, v.giveBitIndex, v.giveVal) })
} else {
assert.Equal(t, v.want, SetBitOfBytes(v.give, v.giveBitIndex, v.giveVal))
}
})
}
}
func TestBitOperation(t *testing.T) {
assert.Equal(t, fmt.Sprintf("%b", 0b11111101), fmt.Sprintf("%b", (1<<(7-6))^0xff))
}

44
entity/ci_qc.go Normal file
View File

@ -0,0 +1,44 @@
package entity
import (
"log/slog"
"joylink.club/ecs"
"joylink.club/rtsssimulation/component"
)
func newCiQC(w ecs.World, data *component.WorldData) *ecs.Entry {
entry := w.Entry(w.Create(component.CiQcTableType, component.CiQcStateType))
data.CiQcEntities = append(data.CiQcEntities, entry)
return entry
}
// 加载联锁驱动、采集卡
func LoadCiQC(w ecs.World) error {
data := GetWorldData(w)
for _, csr := range data.Repo.CiQcList() {
// if len(csr.CjList) == 0 {
// return fmt.Errorf("加载联锁驱采卡实体失败,车站'%s'无采集码表数据", csr.StationId)
// }
// if len(csr.QdList) == 0 {
// return fmt.Errorf("加载联锁驱采卡实体失败,车站'%s'无驱动码表数据", csr.StationId)
// }
if len(csr.CjList) == 0 || len(csr.QdList) == 0 {
slog.Warn("加载联锁驱采卡实体失败,无驱动/采集码表数据", "车站", csr.StationId)
continue
}
entry := newCiQC(w, data)
qctable := &component.CiQcTable{
QdBits: csr.QdList,
CjBits: csr.CjList,
}
err := qctable.BuildQcIndex()
if err != nil {
return err
}
component.CiQcTableType.Set(entry, qctable)
component.CiQcStateType.Set(entry, component.NewCiQcState(len(csr.QdList), len(csr.CjList)))
}
// TODO: 不同联锁驱动码位索引唯一检查
return nil
}

View File

@ -9,8 +9,12 @@ import (
func Load(w ecs.World, repo *repository.Repository) error {
// 初始化世界数据单例组件
LoadWorldData(w, repo)
err := LoadCiQC(w)
if err != nil {
return err
}
// 加载道岔相关实体
err := LoadTurnouts(w)
err = LoadTurnouts(w)
if err != nil {
return err
}

View File

@ -11,6 +11,17 @@ import (
"joylink.club/rtsssimulation/repository/model/proto"
)
// 新建道岔实体
func NewTurnoutEntity(w ecs.World, uid string, worldData *component.WorldData) *ecs.Entry {
entry, ok := worldData.EntityMap[uid]
if !ok {
entry = w.Entry(w.Create(component.TurnoutTag, component.UidType, component.TurnoutPositionType))
component.UidType.SetValue(entry, component.Uid{Id: uid})
worldData.EntityMap[uid] = entry
}
return entry
}
// 加载道岔实体
func LoadTurnouts(w ecs.World) error {
data := GetWorldData(w)
@ -133,22 +144,9 @@ func LoadTurnoutZdj9Two(w ecs.World, turnout *repository.Turnout, entry *ecs.Ent
} else {
// 给道岔添加电路组件
entry.AddComponent(component.Zdj9TwoElectronicType, unsafe.Pointer(zdj9TwoElectronic))
entry.AddComponent(component.Zdj9TwoCollectType)
entry.AddComponent(component.Zdj9TwoDriveType)
}
} else if size > 0 && size < 3 {
return fmt.Errorf("id=[%s]的道岔是ZDJ9双机牵引,继电器组合类型应为3个,现有%d个", turnout.Id(), size)
}
return nil
}
// 新建道岔实体
func NewTurnoutEntity(w ecs.World, uid string, worldData *component.WorldData) *ecs.Entry {
entry, ok := worldData.EntityMap[uid]
if !ok {
entry = w.Entry(w.Create(component.TurnoutTag, component.UidType, component.TurnoutPositionType))
component.UidType.SetValue(entry, component.Uid{Id: uid})
worldData.EntityMap[uid] = entry
}
return entry
}

View File

@ -62,23 +62,40 @@ func updateTurnoutFault(w ecs.World, id string, fault component_proto.Turnout_Fa
// on - 设置/取消
func driveTurnoutZzj(w ecs.World, id string, dc bool, on bool) error {
result := <-ecs.Request[ecs.EmptyType](w, func() ecs.Result[ecs.EmptyType] {
defer func() {
if err := recover(); err != nil {
}
}()
wd := entity.GetWorldData(w)
entry, ok := wd.EntityMap[id]
if ok {
if entry.HasComponent(component.Zdj9TwoDriveType) { // 有电路,驱动继电器
drive := component.Zdj9TwoDriveType.Get(entry)
if dc {
drive.YCJ = on
drive.DCJ = on
if on {
drive.FCJ = !on
if entry.HasComponent(component.Zdj9TwoElectronicType) { // 有电路,驱动继电器
elec := component.Zdj9TwoElectronicType.Get(entry)
var err error
if on {
if dc {
err = wd.SetQdBits([]*component.QdBitParam{
component.NewQdBitParam(component.UidType.Get(elec.TDC_FCJ).Id, false),
component.NewQdBitParam(component.UidType.Get(elec.TDC_DCJ).Id, true),
component.NewQdBitParam(component.UidType.Get(elec.TDC_YCJ).Id, true),
})
} else {
err = wd.SetQdBits([]*component.QdBitParam{
component.NewQdBitParam(component.UidType.Get(elec.TDC_DCJ).Id, false),
component.NewQdBitParam(component.UidType.Get(elec.TDC_FCJ).Id, true),
component.NewQdBitParam(component.UidType.Get(elec.TDC_YCJ).Id, true),
})
}
} else {
drive.YCJ = on
drive.FCJ = on
if on {
drive.DCJ = !on
}
err = wd.SetQdBits([]*component.QdBitParam{
component.NewQdBitParam(component.UidType.Get(elec.TDC_DCJ).Id, false),
component.NewQdBitParam(component.UidType.Get(elec.TDC_FCJ).Id, false),
component.NewQdBitParam(component.UidType.Get(elec.TDC_YCJ).Id, false),
})
}
if err != nil {
return ecs.NewErrResult(err)
}
} else { // 无电路,直接驱动转辙机
if entry.HasComponent(component.TurnoutFaultCiqdType) {
@ -167,7 +184,7 @@ func forceTurnout(w ecs.World, id string, pos ForceTurnoutPos) error {
if !entry.HasComponent(component.TurnoutFaultCiqdType) {
entry.AddComponent(component.TurnoutFaultCiqdType)
}
if entry.HasComponent(component.Zdj9TwoDriveType) { // 有电路,驱动继电器
if entry.HasComponent(component.Zdj9TwoElectronicType) { // 有电路,驱动继电器
elec := component.Zdj9TwoElectronicType.Get(entry)
if pos == TurnoutForceDw {
component.RelayDriveType.Get(elec.TDC_FCJ).Td = false
@ -178,9 +195,6 @@ func forceTurnout(w ecs.World, id string, pos ForceTurnoutPos) error {
component.RelayDriveType.Get(elec.TDC_YCJ).Td = true
component.RelayDriveType.Get(elec.TDC_FCJ).Td = true
}
// else if pos == ForceTurnoutSb {
// elec.Sb = true
// }
} else { // 无电路,直接驱动转辙机
tz := component.TurnoutZzjType.Get(entry)
for _, zzj := range tz.ZzjList {

View File

@ -4,13 +4,10 @@ package component;
option go_package = "./component/component_proto";
//
message CiQdState {
// bit列表
repeated bool bits = 1;
}
//
message CiCjState {
repeated bool bits = 1;
//
message CiQcState {
// bit表
bytes qbs = 1;
// bit表
bytes cbs = 2;
}

View File

@ -309,12 +309,8 @@ message CjData {
}
message CjDataItem {
enum PostionType {
Q=0;
H=1;
}
string relayId = 1;//Id
PostionType position = 2;//QH对应着吸合
bool q = 2;//(/)
}
message QdData {

View File

@ -561,52 +561,6 @@ func (Light_LightAspect) EnumDescriptor() ([]byte, []int) {
return file_model_proto_rawDescGZIP(), []int{16, 0}
}
type CjDataItem_PostionType int32
const (
CjDataItem_Q CjDataItem_PostionType = 0
CjDataItem_H CjDataItem_PostionType = 1
)
// Enum value maps for CjDataItem_PostionType.
var (
CjDataItem_PostionType_name = map[int32]string{
0: "Q",
1: "H",
}
CjDataItem_PostionType_value = map[string]int32{
"Q": 0,
"H": 1,
}
)
func (x CjDataItem_PostionType) Enum() *CjDataItem_PostionType {
p := new(CjDataItem_PostionType)
*p = x
return p
}
func (x CjDataItem_PostionType) String() string {
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}
func (CjDataItem_PostionType) Descriptor() protoreflect.EnumDescriptor {
return file_model_proto_enumTypes[9].Descriptor()
}
func (CjDataItem_PostionType) Type() protoreflect.EnumType {
return &file_model_proto_enumTypes[9]
}
func (x CjDataItem_PostionType) Number() protoreflect.EnumNumber {
return protoreflect.EnumNumber(x)
}
// Deprecated: Use CjDataItem_PostionType.Descriptor instead.
func (CjDataItem_PostionType) EnumDescriptor() ([]byte, []int) {
return file_model_proto_rawDescGZIP(), []int{26, 0}
}
type Repository struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@ -2570,8 +2524,8 @@ type CjDataItem struct {
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
RelayId string `protobuf:"bytes,1,opt,name=relayId,proto3" json:"relayId,omitempty"` //采集对应的继电器Id
Position CjDataItem_PostionType `protobuf:"varint,2,opt,name=position,proto3,enum=model.CjDataItem_PostionType" json:"position,omitempty"` //继电器的位置QH对应着吸合
RelayId string `protobuf:"bytes,1,opt,name=relayId,proto3" json:"relayId,omitempty"` //采集对应的继电器Id
Q bool `protobuf:"varint,2,opt,name=q,proto3" json:"q,omitempty"` //继电器的位置,是否前接点(即吸起位/定位)
}
func (x *CjDataItem) Reset() {
@ -2613,11 +2567,11 @@ func (x *CjDataItem) GetRelayId() string {
return ""
}
func (x *CjDataItem) GetPosition() CjDataItem_PostionType {
func (x *CjDataItem) GetQ() bool {
if x != nil {
return x.Position
return x.Q
}
return CjDataItem_Q
return false
}
type QdData struct {
@ -3067,67 +3021,62 @@ var file_model_proto_rawDesc = []byte{
0x2f, 0x0a, 0x09, 0x72, 0x65, 0x66, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x73, 0x18, 0x03, 0x20, 0x03,
0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6a, 0x44, 0x61, 0x74,
0x61, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x09, 0x72, 0x65, 0x66, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x73,
0x22, 0x7e, 0x0a, 0x0a, 0x43, 0x6a, 0x44, 0x61, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x18,
0x22, 0x34, 0x0a, 0x0a, 0x43, 0x6a, 0x44, 0x61, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x18,
0x0a, 0x07, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
0x07, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69,
0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x6d, 0x6f, 0x64,
0x65, 0x6c, 0x2e, 0x43, 0x6a, 0x44, 0x61, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x50, 0x6f,
0x73, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74,
0x69, 0x6f, 0x6e, 0x22, 0x1b, 0x0a, 0x0b, 0x50, 0x6f, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79,
0x70, 0x65, 0x12, 0x05, 0x0a, 0x01, 0x51, 0x10, 0x00, 0x12, 0x05, 0x0a, 0x01, 0x48, 0x10, 0x01,
0x22, 0x4a, 0x0a, 0x06, 0x51, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x6f,
0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x72, 0x6f, 0x77, 0x12, 0x10, 0x0a, 0x03,
0x63, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x63, 0x6f, 0x6c, 0x12, 0x1c,
0x0a, 0x09, 0x72, 0x65, 0x66, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28,
0x09, 0x52, 0x09, 0x72, 0x65, 0x66, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x73, 0x22, 0x48, 0x0a, 0x08,
0x41, 0x73, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75,
0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x14,
0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73,
0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28,
0x05, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x2a, 0xfd, 0x03, 0x0a, 0x0a, 0x44, 0x65, 0x76, 0x69, 0x63,
0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54,
0x79, 0x70, 0x65, 0x5f, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x1e, 0x0a,
0x1a, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x50, 0x68, 0x79, 0x73,
0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x01, 0x12, 0x19, 0x0a,
0x15, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x43, 0x68, 0x65, 0x63,
0x6b, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x65, 0x76, 0x69,
0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x54, 0x75, 0x72, 0x6e, 0x6f, 0x75, 0x74, 0x10, 0x03,
0x12, 0x15, 0x0a, 0x11, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x53,
0x69, 0x67, 0x6e, 0x61, 0x6c, 0x10, 0x04, 0x12, 0x1a, 0x0a, 0x16, 0x44, 0x65, 0x76, 0x69, 0x63,
0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x65,
0x72, 0x10, 0x05, 0x12, 0x14, 0x0a, 0x10, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70,
0x65, 0x5f, 0x53, 0x6c, 0x6f, 0x70, 0x65, 0x10, 0x06, 0x12, 0x21, 0x0a, 0x1d, 0x44, 0x65, 0x76,
0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61,
0x6c, 0x43, 0x75, 0x72, 0x76, 0x61, 0x74, 0x75, 0x72, 0x65, 0x10, 0x07, 0x12, 0x13, 0x0a, 0x0f,
0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x4c, 0x69, 0x6e, 0x6b, 0x10,
0x08, 0x12, 0x17, 0x0a, 0x13, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f,
0x4c, 0x69, 0x6e, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x10, 0x09, 0x12, 0x14, 0x0a, 0x10, 0x44, 0x65,
0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x10, 0x0a,
0x12, 0x24, 0x0a, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x50,
0x68, 0x61, 0x73, 0x65, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x65,
0x63, 0x74, 0x6f, 0x72, 0x10, 0x0b, 0x12, 0x15, 0x0a, 0x11, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65,
0x54, 0x79, 0x70, 0x65, 0x5f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x10, 0x0c, 0x12, 0x14, 0x0a,
0x10, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x4c, 0x69, 0x67, 0x68,
0x74, 0x10, 0x0d, 0x12, 0x14, 0x0a, 0x10, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70,
0x65, 0x5f, 0x41, 0x6c, 0x61, 0x72, 0x6d, 0x10, 0x0e, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x65, 0x76,
0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x50, 0x73, 0x64, 0x10, 0x0f, 0x12, 0x16, 0x0a,
0x12, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x53, 0x74, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x10, 0x10, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54,
0x79, 0x70, 0x65, 0x5f, 0x4d, 0x6b, 0x78, 0x10, 0x11, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x65, 0x76,
0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x4b, 0x65, 0x79, 0x10, 0x12, 0x12, 0x17, 0x0a,
0x13, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x50, 0x6c, 0x61, 0x74,
0x66, 0x6f, 0x72, 0x6d, 0x10, 0x13, 0x2a, 0x25, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x08,
0x0a, 0x04, 0x4e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x05, 0x0a, 0x01, 0x41, 0x10, 0x01, 0x12,
0x05, 0x0a, 0x01, 0x42, 0x10, 0x02, 0x12, 0x05, 0x0a, 0x01, 0x43, 0x10, 0x03, 0x2a, 0x20, 0x0a,
0x09, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x45,
0x46, 0x54, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x49, 0x47, 0x48, 0x54, 0x10, 0x01, 0x2a,
0x43, 0x0a, 0x0e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x54, 0x79, 0x70,
0x65, 0x12, 0x0c, 0x0a, 0x08, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x10, 0x00, 0x12,
0x0f, 0x0a, 0x0b, 0x41, 0x78, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x10, 0x01,
0x12, 0x12, 0x0a, 0x0e, 0x49, 0x6e, 0x73, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x4a, 0x6f, 0x69,
0x6e, 0x74, 0x10, 0x02, 0x42, 0x1a, 0x5a, 0x18, 0x2e, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69,
0x74, 0x6f, 0x72, 0x79, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
0x07, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x49, 0x64, 0x12, 0x0c, 0x0a, 0x01, 0x71, 0x18, 0x02, 0x20,
0x01, 0x28, 0x08, 0x52, 0x01, 0x71, 0x22, 0x4a, 0x0a, 0x06, 0x51, 0x64, 0x44, 0x61, 0x74, 0x61,
0x12, 0x10, 0x0a, 0x03, 0x72, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x72,
0x6f, 0x77, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52,
0x03, 0x63, 0x6f, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x66, 0x52, 0x65, 0x6c, 0x61, 0x79,
0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x66, 0x52, 0x65, 0x6c, 0x61,
0x79, 0x73, 0x22, 0x48, 0x0a, 0x08, 0x41, 0x73, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x14,
0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x67,
0x72, 0x6f, 0x75, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x02, 0x20,
0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e,
0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x2a, 0xfd, 0x03, 0x0a,
0x0a, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x44,
0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77,
0x6e, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70,
0x65, 0x5f, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f,
0x6e, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70,
0x65, 0x5f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x10, 0x02, 0x12, 0x16,
0x0a, 0x12, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x54, 0x75, 0x72,
0x6e, 0x6f, 0x75, 0x74, 0x10, 0x03, 0x12, 0x15, 0x0a, 0x11, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65,
0x54, 0x79, 0x70, 0x65, 0x5f, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x10, 0x04, 0x12, 0x1a, 0x0a,
0x16, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x54, 0x72, 0x61, 0x6e,
0x73, 0x70, 0x6f, 0x6e, 0x64, 0x65, 0x72, 0x10, 0x05, 0x12, 0x14, 0x0a, 0x10, 0x44, 0x65, 0x76,
0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x53, 0x6c, 0x6f, 0x70, 0x65, 0x10, 0x06, 0x12,
0x21, 0x0a, 0x1d, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x53, 0x65,
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x43, 0x75, 0x72, 0x76, 0x61, 0x74, 0x75, 0x72, 0x65,
0x10, 0x07, 0x12, 0x13, 0x0a, 0x0f, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65,
0x5f, 0x4c, 0x69, 0x6e, 0x6b, 0x10, 0x08, 0x12, 0x17, 0x0a, 0x13, 0x44, 0x65, 0x76, 0x69, 0x63,
0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x4c, 0x69, 0x6e, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x10, 0x09,
0x12, 0x14, 0x0a, 0x10, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x52,
0x65, 0x6c, 0x61, 0x79, 0x10, 0x0a, 0x12, 0x24, 0x0a, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65,
0x54, 0x79, 0x70, 0x65, 0x5f, 0x50, 0x68, 0x61, 0x73, 0x65, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72,
0x65, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x10, 0x0b, 0x12, 0x15, 0x0a, 0x11,
0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x42, 0x75, 0x74, 0x74, 0x6f,
0x6e, 0x10, 0x0c, 0x12, 0x14, 0x0a, 0x10, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70,
0x65, 0x5f, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x10, 0x0d, 0x12, 0x14, 0x0a, 0x10, 0x44, 0x65, 0x76,
0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x41, 0x6c, 0x61, 0x72, 0x6d, 0x10, 0x0e, 0x12,
0x12, 0x0a, 0x0e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x50, 0x73,
0x64, 0x10, 0x0f, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70,
0x65, 0x5f, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x10, 0x12, 0x12, 0x0a, 0x0e, 0x44,
0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x4d, 0x6b, 0x78, 0x10, 0x11, 0x12,
0x12, 0x0a, 0x0e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x4b, 0x65,
0x79, 0x10, 0x12, 0x12, 0x17, 0x0a, 0x13, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70,
0x65, 0x5f, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x10, 0x13, 0x2a, 0x25, 0x0a, 0x04,
0x50, 0x6f, 0x72, 0x74, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x05,
0x0a, 0x01, 0x41, 0x10, 0x01, 0x12, 0x05, 0x0a, 0x01, 0x42, 0x10, 0x02, 0x12, 0x05, 0x0a, 0x01,
0x43, 0x10, 0x03, 0x2a, 0x20, 0x0a, 0x09, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
0x12, 0x08, 0x0a, 0x04, 0x4c, 0x45, 0x46, 0x54, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x49,
0x47, 0x48, 0x54, 0x10, 0x01, 0x2a, 0x43, 0x0a, 0x0e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x6f,
0x69, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x42, 0x6f, 0x75, 0x6e, 0x64,
0x61, 0x72, 0x79, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x78, 0x6c, 0x65, 0x43, 0x6f, 0x75,
0x6e, 0x74, 0x65, 0x72, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x6e, 0x73, 0x75, 0x6c, 0x61,
0x74, 0x65, 0x64, 0x4a, 0x6f, 0x69, 0x6e, 0x74, 0x10, 0x02, 0x42, 0x1a, 0x5a, 0x18, 0x2e, 0x2f,
0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c,
0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
@ -3142,7 +3091,7 @@ func file_model_proto_rawDescGZIP() []byte {
return file_model_proto_rawDescData
}
var file_model_proto_enumTypes = make([]protoimpl.EnumInfo, 10)
var file_model_proto_enumTypes = make([]protoimpl.EnumInfo, 9)
var file_model_proto_msgTypes = make([]protoimpl.MessageInfo, 29)
var file_model_proto_goTypes = []interface{}{
(DeviceType)(0), // 0: model.DeviceType
@ -3154,98 +3103,96 @@ var file_model_proto_goTypes = []interface{}{
(Relay_Model)(0), // 6: model.Relay.Model
(Button_ButtonType)(0), // 7: model.Button.ButtonType
(Light_LightAspect)(0), // 8: model.Light.LightAspect
(CjDataItem_PostionType)(0), // 9: model.CjDataItem.PostionType
(*Repository)(nil), // 10: model.Repository
(*PhysicalSection)(nil), // 11: model.PhysicalSection
(*CheckPoint)(nil), // 12: model.CheckPoint
(*Turnout)(nil), // 13: model.Turnout
(*Signal)(nil), // 14: model.Signal
(*Psd)(nil), // 15: model.Psd
(*Transponder)(nil), // 16: model.Transponder
(*Slope)(nil), // 17: model.Slope
(*SectionalCurvature)(nil), // 18: model.SectionalCurvature
(*DevicePort)(nil), // 19: model.DevicePort
(*Kilometer)(nil), // 20: model.Kilometer
(*KilometerConvert)(nil), // 21: model.KilometerConvert
(*Relay)(nil), // 22: model.Relay
(*PhaseFailureProtector)(nil), // 23: model.PhaseFailureProtector
(*ElectronicComponentGroup)(nil), // 24: model.ElectronicComponentGroup
(*Button)(nil), // 25: model.Button
(*Light)(nil), // 26: model.Light
(*Alarm)(nil), // 27: model.Alarm
(*Station)(nil), // 28: model.Station
(*ElectronicGroup)(nil), // 29: model.ElectronicGroup
(*ElectronicComponent)(nil), // 30: model.ElectronicComponent
(*Mkx)(nil), // 31: model.Mkx
(*Platform)(nil), // 32: model.Platform
(*Key)(nil), // 33: model.Key
(*CentralizedStationRef)(nil), // 34: model.CentralizedStationRef
(*CjData)(nil), // 35: model.CjData
(*CjDataItem)(nil), // 36: model.CjDataItem
(*QdData)(nil), // 37: model.QdData
(*AsdGroup)(nil), // 38: model.AsdGroup
(*Repository)(nil), // 9: model.Repository
(*PhysicalSection)(nil), // 10: model.PhysicalSection
(*CheckPoint)(nil), // 11: model.CheckPoint
(*Turnout)(nil), // 12: model.Turnout
(*Signal)(nil), // 13: model.Signal
(*Psd)(nil), // 14: model.Psd
(*Transponder)(nil), // 15: model.Transponder
(*Slope)(nil), // 16: model.Slope
(*SectionalCurvature)(nil), // 17: model.SectionalCurvature
(*DevicePort)(nil), // 18: model.DevicePort
(*Kilometer)(nil), // 19: model.Kilometer
(*KilometerConvert)(nil), // 20: model.KilometerConvert
(*Relay)(nil), // 21: model.Relay
(*PhaseFailureProtector)(nil), // 22: model.PhaseFailureProtector
(*ElectronicComponentGroup)(nil), // 23: model.ElectronicComponentGroup
(*Button)(nil), // 24: model.Button
(*Light)(nil), // 25: model.Light
(*Alarm)(nil), // 26: model.Alarm
(*Station)(nil), // 27: model.Station
(*ElectronicGroup)(nil), // 28: model.ElectronicGroup
(*ElectronicComponent)(nil), // 29: model.ElectronicComponent
(*Mkx)(nil), // 30: model.Mkx
(*Platform)(nil), // 31: model.Platform
(*Key)(nil), // 32: model.Key
(*CentralizedStationRef)(nil), // 33: model.CentralizedStationRef
(*CjData)(nil), // 34: model.CjData
(*CjDataItem)(nil), // 35: model.CjDataItem
(*QdData)(nil), // 36: model.QdData
(*AsdGroup)(nil), // 37: model.AsdGroup
}
var file_model_proto_depIdxs = []int32{
11, // 0: model.Repository.physicalSections:type_name -> model.PhysicalSection
12, // 1: model.Repository.checkPoints:type_name -> model.CheckPoint
13, // 2: model.Repository.turnouts:type_name -> model.Turnout
14, // 3: model.Repository.signals:type_name -> model.Signal
16, // 4: model.Repository.transponders:type_name -> model.Transponder
17, // 5: model.Repository.slopes:type_name -> model.Slope
18, // 6: model.Repository.sectionalCurvatures:type_name -> model.SectionalCurvature
21, // 7: model.Repository.kilometerConverts:type_name -> model.KilometerConvert
22, // 8: model.Repository.relays:type_name -> model.Relay
23, // 9: model.Repository.phaseFailureProtectors:type_name -> model.PhaseFailureProtector
25, // 10: model.Repository.buttons:type_name -> model.Button
15, // 11: model.Repository.psds:type_name -> model.Psd
26, // 12: model.Repository.lights:type_name -> model.Light
27, // 13: model.Repository.alarms:type_name -> model.Alarm
28, // 14: model.Repository.stations:type_name -> model.Station
31, // 15: model.Repository.mkxs:type_name -> model.Mkx
32, // 16: model.Repository.platforms:type_name -> model.Platform
33, // 17: model.Repository.Keys:type_name -> model.Key
34, // 18: model.Repository.CentralizedStationRefs:type_name -> model.CentralizedStationRef
19, // 19: model.PhysicalSection.aDevicePort:type_name -> model.DevicePort
19, // 20: model.PhysicalSection.bDevicePort:type_name -> model.DevicePort
20, // 21: model.CheckPoint.km:type_name -> model.Kilometer
10, // 0: model.Repository.physicalSections:type_name -> model.PhysicalSection
11, // 1: model.Repository.checkPoints:type_name -> model.CheckPoint
12, // 2: model.Repository.turnouts:type_name -> model.Turnout
13, // 3: model.Repository.signals:type_name -> model.Signal
15, // 4: model.Repository.transponders:type_name -> model.Transponder
16, // 5: model.Repository.slopes:type_name -> model.Slope
17, // 6: model.Repository.sectionalCurvatures:type_name -> model.SectionalCurvature
20, // 7: model.Repository.kilometerConverts:type_name -> model.KilometerConvert
21, // 8: model.Repository.relays:type_name -> model.Relay
22, // 9: model.Repository.phaseFailureProtectors:type_name -> model.PhaseFailureProtector
24, // 10: model.Repository.buttons:type_name -> model.Button
14, // 11: model.Repository.psds:type_name -> model.Psd
25, // 12: model.Repository.lights:type_name -> model.Light
26, // 13: model.Repository.alarms:type_name -> model.Alarm
27, // 14: model.Repository.stations:type_name -> model.Station
30, // 15: model.Repository.mkxs:type_name -> model.Mkx
31, // 16: model.Repository.platforms:type_name -> model.Platform
32, // 17: model.Repository.Keys:type_name -> model.Key
33, // 18: model.Repository.CentralizedStationRefs:type_name -> model.CentralizedStationRef
18, // 19: model.PhysicalSection.aDevicePort:type_name -> model.DevicePort
18, // 20: model.PhysicalSection.bDevicePort:type_name -> model.DevicePort
19, // 21: model.CheckPoint.km:type_name -> model.Kilometer
3, // 22: model.CheckPoint.type:type_name -> model.CheckPointType
19, // 23: model.CheckPoint.devicePorts:type_name -> model.DevicePort
20, // 24: model.Turnout.km:type_name -> model.Kilometer
19, // 25: model.Turnout.aDevicePort:type_name -> model.DevicePort
19, // 26: model.Turnout.bDevicePort:type_name -> model.DevicePort
19, // 27: model.Turnout.cDevicePort:type_name -> model.DevicePort
18, // 23: model.CheckPoint.devicePorts:type_name -> model.DevicePort
19, // 24: model.Turnout.km:type_name -> model.Kilometer
18, // 25: model.Turnout.aDevicePort:type_name -> model.DevicePort
18, // 26: model.Turnout.bDevicePort:type_name -> model.DevicePort
18, // 27: model.Turnout.cDevicePort:type_name -> model.DevicePort
4, // 28: model.Turnout.switchMachineType:type_name -> model.Turnout.SwitchMachineType
24, // 29: model.Turnout.electronicComponentGroups:type_name -> model.ElectronicComponentGroup
20, // 30: model.Signal.km:type_name -> model.Kilometer
19, // 31: model.Signal.turnoutPort:type_name -> model.DevicePort
24, // 32: model.Signal.electronicComponentGroups:type_name -> model.ElectronicComponentGroup
23, // 29: model.Turnout.electronicComponentGroups:type_name -> model.ElectronicComponentGroup
19, // 30: model.Signal.km:type_name -> model.Kilometer
18, // 31: model.Signal.turnoutPort:type_name -> model.DevicePort
23, // 32: model.Signal.electronicComponentGroups:type_name -> model.ElectronicComponentGroup
5, // 33: model.Signal.model:type_name -> model.Signal.Model
38, // 34: model.Psd.asdGroups:type_name -> model.AsdGroup
24, // 35: model.Psd.electronicComponentGroups:type_name -> model.ElectronicComponentGroup
20, // 36: model.Transponder.km:type_name -> model.Kilometer
19, // 37: model.Transponder.turnoutPort:type_name -> model.DevicePort
20, // 38: model.Slope.kms:type_name -> model.Kilometer
20, // 39: model.SectionalCurvature.kms:type_name -> model.Kilometer
37, // 34: model.Psd.asdGroups:type_name -> model.AsdGroup
23, // 35: model.Psd.electronicComponentGroups:type_name -> model.ElectronicComponentGroup
19, // 36: model.Transponder.km:type_name -> model.Kilometer
18, // 37: model.Transponder.turnoutPort:type_name -> model.DevicePort
19, // 38: model.Slope.kms:type_name -> model.Kilometer
19, // 39: model.SectionalCurvature.kms:type_name -> model.Kilometer
0, // 40: model.DevicePort.deviceType:type_name -> model.DeviceType
1, // 41: model.DevicePort.port:type_name -> model.Port
2, // 42: model.Kilometer.direction:type_name -> model.Direction
20, // 43: model.KilometerConvert.kmA:type_name -> model.Kilometer
20, // 44: model.KilometerConvert.kmB:type_name -> model.Kilometer
19, // 43: model.KilometerConvert.kmA:type_name -> model.Kilometer
19, // 44: model.KilometerConvert.kmB:type_name -> model.Kilometer
6, // 45: model.Relay.model:type_name -> model.Relay.Model
7, // 46: model.Button.buttonType:type_name -> model.Button.ButtonType
8, // 47: model.Light.aspect:type_name -> model.Light.LightAspect
29, // 48: model.Station.electronicGroup:type_name -> model.ElectronicGroup
30, // 49: model.ElectronicGroup.components:type_name -> model.ElectronicComponent
28, // 48: model.Station.electronicGroup:type_name -> model.ElectronicGroup
29, // 49: model.ElectronicGroup.components:type_name -> model.ElectronicComponent
0, // 50: model.ElectronicComponent.deviceType:type_name -> model.DeviceType
35, // 51: model.CentralizedStationRef.cjList:type_name -> model.CjData
37, // 52: model.CentralizedStationRef.qdList:type_name -> model.QdData
36, // 53: model.CjData.refRelays:type_name -> model.CjDataItem
9, // 54: model.CjDataItem.position:type_name -> model.CjDataItem.PostionType
55, // [55:55] is the sub-list for method output_type
55, // [55:55] is the sub-list for method input_type
55, // [55:55] is the sub-list for extension type_name
55, // [55:55] is the sub-list for extension extendee
0, // [0:55] is the sub-list for field type_name
34, // 51: model.CentralizedStationRef.cjList:type_name -> model.CjData
36, // 52: model.CentralizedStationRef.qdList:type_name -> model.QdData
35, // 53: model.CjData.refRelays:type_name -> model.CjDataItem
54, // [54:54] is the sub-list for method output_type
54, // [54:54] is the sub-list for method input_type
54, // [54:54] is the sub-list for extension type_name
54, // [54:54] is the sub-list for extension extendee
0, // [0:54] is the sub-list for field type_name
}
func init() { file_model_proto_init() }
@ -3608,7 +3555,7 @@ func file_model_proto_init() {
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_model_proto_rawDesc,
NumEnums: 10,
NumEnums: 9,
NumMessages: 29,
NumExtensions: 0,
NumServices: 0,

View File

@ -183,7 +183,7 @@ func (repo *Repository) KeyList() []*Key {
return list
}
func (repo *Repository) CentralizedList() []*proto.CentralizedStationRef {
func (repo *Repository) CiQcList() []*proto.CentralizedStationRef {
var list []*proto.CentralizedStationRef
for _, model := range repo.centralizedMap {
list = append(list, model)

View File

@ -8,6 +8,7 @@ import (
"joylink.club/ecs/filter"
"joylink.club/rtsssimulation/component"
"joylink.club/rtsssimulation/consts"
"joylink.club/rtsssimulation/entity"
)
// ZDJ9双机牵引道岔电路系统
@ -19,19 +20,16 @@ func NewZdj9TwoDragSys() *ZDJ9TwoDragSys {
return &ZDJ9TwoDragSys{
query: ecs.NewQuery(filter.Contains(
component.Zdj9TwoElectronicType,
component.Zdj9TwoDriveType,
component.Zdj9TwoCollectType,
component.TurnoutZzjType)),
}
}
// 电路更新
func (zdj9 *ZDJ9TwoDragSys) Update(w ecs.World) {
wd := entity.GetWorldData(w)
zdj9.query.Each(w, func(entry *ecs.Entry) {
elec := component.Zdj9TwoElectronicType.Get(entry)
drive := component.Zdj9TwoDriveType.Get(entry)
collect := component.Zdj9TwoCollectType.Get(entry)
zdj9.exciteDriveElectronic(entry, elec, drive)
zdj9.exciteDriveElectronic(entry, elec, wd)
// 转辙机一机电路相关动作
// 1DQJ励磁状态控制
zdj9.exciteM1_TDFJ_1DQJ(elec)
@ -66,49 +64,31 @@ func (zdj9 *ZDJ9TwoDragSys) Update(w ecs.World) {
// 总定表/反表继电器
zdj9.exciteZDFBJ(entry, elec)
zdj9.exciteCollectElectronic(entry, elec, collect)
})
}
// 处理采集电路状态
func (zdj9 *ZDJ9TwoDragSys) exciteCollectElectronic(entry *ecs.Entry, elec *component.Zdj9TwoElectronic, collect *component.Zdj9TwoCollect) {
zdbj := component.BitStateType.Get(elec.TDC_ZDBJ)
zfbj := component.BitStateType.Get(elec.TDC_ZFBJ)
ycj := component.BitStateType.Get(elec.TDC_YCJ)
tdfj1_dbj := component.BitStateType.Get(elec.TDFJ1_DBJ)
tdfj1_fbj := component.BitStateType.Get(elec.TDFJ1_FBJ)
tdfj2_dbj := component.BitStateType.Get(elec.TDFJ2_DBJ)
tdfj2_fbj := component.BitStateType.Get(elec.TDFJ2_FBJ)
collect.TDC_ZDBJ_XQ = zdbj.Val
collect.TDC_ZFBJ_XQ = zfbj.Val
collect.TDC_YCJ_XQ = ycj.Val
collect.TDC_ZDBJ_ZFBJ_LX = !zdbj.Val && !zfbj.Val
collect.TDFJ1_DBJ_XQ = tdfj1_dbj.Val
collect.TDFJ1_FBJ_XQ = tdfj1_fbj.Val
collect.TDFJ2_DBJ_XQ = tdfj2_dbj.Val
collect.TDFJ2_FBJ_XQ = tdfj2_fbj.Val
func (zdj9 *ZDJ9TwoDragSys) handleCiQdRelay(entry *ecs.Entry, wd *component.WorldData) {
if entry.HasComponent(component.UidType) {
bit, err := wd.QueryQdBit(component.UidType.Get(entry).Id)
if err != nil {
// slog.Debug(err.Error())
return
}
dcj_drive := component.RelayDriveType.Get(entry)
if dcj_drive.Td != bit {
dcj_drive.Td = bit
}
}
}
// 处理驱动电路励磁相关继电器
func (zdj9 *ZDJ9TwoDragSys) exciteDriveElectronic(entry *ecs.Entry, elec *component.Zdj9TwoElectronic, driveElec *component.Zdj9TwoDrive) {
func (zdj9 *ZDJ9TwoDragSys) exciteDriveElectronic(entry *ecs.Entry, elec *component.Zdj9TwoElectronic, wd *component.WorldData) {
if entry.HasComponent(component.TurnoutFaultCiqdType) { // 联锁驱动失效
return
}
dcj_drive := component.RelayDriveType.Get(elec.TDC_DCJ)
fcj_drive := component.RelayDriveType.Get(elec.TDC_FCJ)
ycj_drive := component.RelayDriveType.Get(elec.TDC_YCJ)
if dcj_drive.Td != driveElec.DCJ {
dcj_drive.Td = driveElec.DCJ
}
if fcj_drive.Td != driveElec.FCJ {
fcj_drive.Td = driveElec.FCJ
}
if ycj_drive.Td != driveElec.YCJ {
ycj_drive.Td = driveElec.YCJ
}
zdj9.handleCiQdRelay(elec.TDC_DCJ, wd)
zdj9.handleCiQdRelay(elec.TDC_FCJ, wd)
zdj9.handleCiQdRelay(elec.TDC_YCJ, wd)
}
// 总定表、反表继电器控制

52
sys/device_sys/ci_qc.go Normal file
View File

@ -0,0 +1,52 @@
package device_sys
import (
"fmt"
"joylink.club/ecs"
"joylink.club/ecs/filter"
"joylink.club/rtsssimulation/component"
"joylink.club/rtsssimulation/consts"
"joylink.club/rtsssimulation/entity"
)
type CiQcSys struct {
query *ecs.Query
}
func NewCiQcSys() *CiQcSys {
return &CiQcSys{
query: ecs.NewQuery(filter.Contains(component.CiQcTableType, component.CiQcStateType)),
}
}
func (s *CiQcSys) Update(w ecs.World) {
s.query.Each(w, func(entry *ecs.Entry) {
// 采集设备状态
data := entity.GetWorldData(w)
table := component.CiQcTableType.Get(entry)
state := component.CiQcStateType.Get(entry)
for i, cj := range table.CjBits {
bit := true
if len(cj.RefRelays) > 0 {
for _, cdi := range cj.RefRelays {
re, ok := data.EntityMap[cdi.RelayId]
if !ok {
panic(fmt.Errorf("联锁码位采集系统运行异常,没有id=%s的继电器实体", cdi.RelayId))
}
if !re.HasComponent(component.BitStateType) {
panic(fmt.Errorf("联锁码位采集系统运行异常,id=%s的继电器实体没有BitState组件", cdi.RelayId))
}
s := component.BitStateType.Get(re)
if cdi.Q != s.Val {
bit = false
break
}
}
} else {
bit = false
}
consts.SetBitOfBytes(state.Cbs, i, bit)
}
})
}