This commit is contained in:
xzb 2023-12-08 17:44:56 +08:00
commit cd6f50bff5
5 changed files with 131 additions and 171 deletions

View File

@ -13,9 +13,10 @@ var PsdCircuitType = ecs.NewComponentType[PsdCircuit]()
type PsdCircuit struct { type PsdCircuit struct {
//屏蔽门驱动继电器 //屏蔽门驱动继电器
GMJ *ecs.Entry GMJ *ecs.Entry
KMJ4 *ecs.Entry //KMJ4 *ecs.Entry
KMJ8 *ecs.Entry //KMJ8 *ecs.Entry
KMJMap map[int32]*ecs.Entry //开门继电器k-编组
//屏蔽门表示继电器 //屏蔽门表示继电器
MGJ *ecs.Entry MGJ *ecs.Entry
MPLJ *ecs.Entry MPLJ *ecs.Entry
@ -86,10 +87,11 @@ type Mkx struct {
var PscType = ecs.NewComponentType[Psc]() var PscType = ecs.NewComponentType[Psc]()
type Psc struct { type Psc struct {
InterlockKM4 bool //InterlockKM4 bool
InterlockKM8 bool //InterlockKM8 bool
InterlockGM bool InterlockKmGroup map[int32]bool //开门编组。k-编组 v-设置开门
InterlockMPL bool InterlockGM bool
InterlockMPL bool
MkxKM bool MkxKM bool
MkxGM bool MkxGM bool

View File

@ -44,17 +44,19 @@ func loadPsdCircuit(world ecs.World, entry *ecs.Entry, psd *repository.Psd, entr
if len(psd.ComponentGroups()) == 0 { if len(psd.ComponentGroups()) == 0 {
return return
} }
circuit := &component.PsdCircuit{} circuit := &component.PsdCircuit{KMJMap: make(map[int32]*ecs.Entry)}
for _, group := range psd.ComponentGroups() { for _, group := range psd.ComponentGroups() {
for _, ec := range group.Components() { for _, ec := range group.Components() {
relay := ec.(*repository.Relay) relay := ec.(*repository.Relay)
switch ec.Code() { switch ec.Code() {
case "XGMJ", "SGMJ": case "XGMJ", "SGMJ":
circuit.GMJ = NewRelayEntity(world, relay, entryMap) circuit.GMJ = NewRelayEntity(world, relay, entryMap)
case "XKMJ", "SKMJ":
circuit.KMJMap[0] = NewRelayEntity(world, relay, entryMap)
case "4XKMJ", "4SKMJ": case "4XKMJ", "4SKMJ":
circuit.KMJ4 = NewRelayEntity(world, relay, entryMap) circuit.KMJMap[4] = NewRelayEntity(world, relay, entryMap)
case "8XKMJ", "8SKMJ": case "8XKMJ", "8SKMJ":
circuit.KMJ8 = NewRelayEntity(world, relay, entryMap) circuit.KMJMap[8] = NewRelayEntity(world, relay, entryMap)
case "XMGJ", "SMGJ": case "XMGJ", "SMGJ":
circuit.MGJ = NewRelayEntity(world, relay, entryMap) circuit.MGJ = NewRelayEntity(world, relay, entryMap)
case "XMPLJ", "SMPLJ": case "XMPLJ", "SMPLJ":
@ -87,6 +89,7 @@ func NewPsdEntry(world ecs.World, psd *repository.Psd, worldData *component.Worl
asdList.List[i] = NewAsdEntry(world, worldData, psd.Id(), int(i)) asdList.List[i] = NewAsdEntry(world, worldData, psd.Id(), int(i))
} }
component.AsdListType.Set(entry, asdList) component.AsdListType.Set(entry, asdList)
component.PscType.Set(entry, &component.Psc{InterlockKmGroup: make(map[int32]bool)})
} }
return entry return entry
} }

178
fi/psd.go
View File

@ -1,6 +1,7 @@
package fi package fi
import ( import (
"errors"
"fmt" "fmt"
"joylink.club/ecs" "joylink.club/ecs"
"joylink.club/rtsssimulation/component" "joylink.club/rtsssimulation/component"
@ -8,63 +9,29 @@ import (
"joylink.club/rtsssimulation/entity" "joylink.club/rtsssimulation/entity"
) )
func SetInterlockKm4(world ecs.World, id string) error { func SetInterlockKm(world ecs.World, psdId string, group int32) error {
result := <-ecs.Request[ecs.EmptyType](world, func() ecs.Result[ecs.EmptyType] { result := <-ecs.Request[ecs.EmptyType](world, func() ecs.Result[ecs.EmptyType] {
wd := entity.GetWorldData(world) wd := entity.GetWorldData(world)
entry, ok := wd.EntityMap[id] entry, ok := wd.EntityMap[psdId]
if ok { if ok {
err := setInterlockKm(wd, entry, 4) err := setInterlockKm(wd, entry, group)
if err != nil { if err != nil {
return ecs.NewErrResult(err) return ecs.NewErrResult(err)
} }
} else { } else {
return ecs.NewErrResult(fmt.Errorf("未找到id=%s的屏蔽门", id)) return ecs.NewErrResult(fmt.Errorf("未找到id=%s的屏蔽门", psdId))
} }
return ecs.NewOkEmptyResult() return ecs.NewOkEmptyResult()
}) })
return result.Err return result.Err
} }
func CancelInterlockKm4(world ecs.World, id string) error { func CancelInterlockKm(world ecs.World, id string, group int32) error {
result := <-ecs.Request[ecs.EmptyType](world, func() ecs.Result[ecs.EmptyType] { result := <-ecs.Request[ecs.EmptyType](world, func() ecs.Result[ecs.EmptyType] {
wd := entity.GetWorldData(world) wd := entity.GetWorldData(world)
entry, ok := wd.EntityMap[id] entry, ok := wd.EntityMap[id]
if ok { if ok {
err := cancelInterlockKm(wd, entry, 4) err := cancelInterlockKm(wd, entry, group)
if err != nil {
return ecs.NewErrResult(err)
}
} else {
return ecs.NewErrResult(fmt.Errorf("未找到id=%s的屏蔽门", id))
}
return ecs.NewOkEmptyResult()
})
return result.Err
}
func SetInterlockKm8(world ecs.World, id string) error {
result := <-ecs.Request[ecs.EmptyType](world, func() ecs.Result[ecs.EmptyType] {
wd := entity.GetWorldData(world)
entry, ok := wd.EntityMap[id]
if ok {
err := setInterlockKm(wd, entry, 8)
if err != nil {
return ecs.NewErrResult(err)
}
} else {
return ecs.NewErrResult(fmt.Errorf("未找到id=%s的屏蔽门", id))
}
return ecs.NewOkEmptyResult()
})
return result.Err
}
func CancelInterlockKm8(world ecs.World, id string) error {
result := <-ecs.Request[ecs.EmptyType](world, func() ecs.Result[ecs.EmptyType] {
wd := entity.GetWorldData(world)
entry, ok := wd.EntityMap[id]
if ok {
err := cancelInterlockKm(wd, entry, 8)
if err != nil { if err != nil {
return ecs.NewErrResult(err) return ecs.NewErrResult(err)
} }
@ -273,45 +240,43 @@ func setQDTC(wd *component.WorldData, psdEntry *ecs.Entry) error {
} }
// 设置联锁开门 // 设置联锁开门
func setInterlockKm(wd *component.WorldData, psdEntry *ecs.Entry, group int) error { func setInterlockKm(wd *component.WorldData, psdEntry *ecs.Entry, group int32) error {
if psdEntry.HasComponent(component.PsdCircuitType) { //有联锁区段电路 if psdEntry.HasComponent(component.PsdCircuitType) { //有联锁区段电路
circuit := component.PsdCircuitType.Get(psdEntry) circuit := component.PsdCircuitType.Get(psdEntry)
switch group { if circuit.KMJMap[0] != nil { //0编组意味着屏蔽门仅有一个开门继电器
case 4: return setRelayDriveKm(wd, circuit, 0)
return setInterlockDriveKm4(wd, circuit) } else {
case 8: kmj := circuit.KMJMap[group]
return setInterlockDriveKm8(wd, circuit) if kmj == nil {
id := component.UidType.Get(psdEntry).Id
return errors.New(fmt.Sprintf("屏蔽门[id:%s]不支持[%d]编组操作", id, group))
}
return setRelayDriveKm(wd, circuit, group)
} }
} else { } else {
psc := component.PscType.Get(psdEntry) psc := component.PscType.Get(psdEntry)
switch group { psc.InterlockKmGroup[group] = true
case 4:
setPscKm4(psc)
case 8:
setPscKm8(psc)
}
} }
return nil return nil
} }
// 取消联锁开门 // 取消联锁开门
func cancelInterlockKm(wd *component.WorldData, psdEntry *ecs.Entry, group int) error { func cancelInterlockKm(wd *component.WorldData, psdEntry *ecs.Entry, group int32) error {
if psdEntry.HasComponent(component.PsdCircuitType) { //有联锁区段电路 if psdEntry.HasComponent(component.PsdCircuitType) { //有联锁区段电路
circuit := component.PsdCircuitType.Get(psdEntry) circuit := component.PsdCircuitType.Get(psdEntry)
switch group { if circuit.KMJMap[0] != nil { //0编组意味着屏蔽门仅有一个开门继电器
case 4: return cancelRelayDriveKm(wd, circuit, 0)
return wd.SetQdBit(component.UidType.Get(circuit.KMJ4).Id, false) } else {
case 8: kmj := circuit.KMJMap[group]
return wd.SetQdBit(component.UidType.Get(circuit.KMJ8).Id, false) if kmj == nil {
id := component.UidType.Get(psdEntry).Id
return errors.New(fmt.Sprintf("屏蔽门[id:%s]不支持[%d]编组操作", id, group))
}
return cancelRelayDriveKm(wd, circuit, group)
} }
} else { } else {
psc := component.PscType.Get(psdEntry) psc := component.PscType.Get(psdEntry)
switch group { psc.InterlockKmGroup[group] = false
case 4:
psc.InterlockKM4 = false
case 8:
psc.InterlockKM8 = false
}
} }
return nil return nil
} }
@ -320,19 +285,22 @@ func cancelInterlockKm(wd *component.WorldData, psdEntry *ecs.Entry, group int)
func setInterlockGm(wd *component.WorldData, psdEntry *ecs.Entry) error { func setInterlockGm(wd *component.WorldData, psdEntry *ecs.Entry) error {
if psdEntry.HasComponent(component.PsdCircuitType) { //有联锁区段电路 if psdEntry.HasComponent(component.PsdCircuitType) { //有联锁区段电路
circuit := component.PsdCircuitType.Get(psdEntry) circuit := component.PsdCircuitType.Get(psdEntry)
return setInterlockDriveGm(wd, circuit) return setRelayDriveGm(wd, circuit)
} else { } else {
psc := component.PscType.Get(psdEntry) psc := component.PscType.Get(psdEntry)
setPscGm(psc) for i, _ := range psc.InterlockKmGroup {
psc.InterlockKmGroup[i] = false
}
psc.InterlockGM = true
} }
return nil return nil
} }
// 取消联锁关门 // 取消联锁关门
func cancelInterlockGm(wd *component.WorldData, psdEntry *ecs.Entry) error { func cancelInterlockGm(wd *component.WorldData, psdEntry *ecs.Entry) error {
if psdEntry.HasComponent(component.PsdCircuitType) { if psdEntry.HasComponent(component.PsdCircuitType) { //有联锁区段电路
circuit := component.PsdCircuitType.Get(psdEntry) circuit := component.PsdCircuitType.Get(psdEntry)
return wd.SetQdBit(component.UidType.Get(circuit.GMJ).Id, false) return cancelRelayDriveGm(wd, circuit)
} else { } else {
psc := component.PscType.Get(psdEntry) psc := component.PscType.Get(psdEntry)
psc.InterlockGM = false psc.InterlockGM = false
@ -340,50 +308,46 @@ func cancelInterlockGm(wd *component.WorldData, psdEntry *ecs.Entry) error {
return nil return nil
} }
// 联锁驱动4编组开门 // 设置继电器驱动开门
func setInterlockDriveKm4(wd *component.WorldData, circuit *component.PsdCircuit) error { func setRelayDriveKm(wd *component.WorldData, circuit *component.PsdCircuit, group int32) error {
return wd.SetQdBits([]*component.QdBitParam{ var params []*component.QdBitParam
component.NewQdBitParam(component.UidType.Get(circuit.GMJ).Id, false), params = append(params, component.NewQdBitParam(component.UidType.Get(circuit.GMJ).Id, false))
component.NewQdBitParam(component.UidType.Get(circuit.KMJ4).Id, true), for g, entry := range circuit.KMJMap {
component.NewQdBitParam(component.UidType.Get(circuit.KMJ8).Id, false), if g == group {
}) params = append(params, component.NewQdBitParam(component.UidType.Get(entry).Id, true))
} else {
params = append(params, component.NewQdBitParam(component.UidType.Get(entry).Id, false))
}
}
return wd.SetQdBits(params)
} }
// 联锁驱动8编组开门 // 取消继电器驱动开门
func setInterlockDriveKm8(wd *component.WorldData, circuit *component.PsdCircuit) error { func cancelRelayDriveKm(wd *component.WorldData, circuit *component.PsdCircuit, group int32) error {
return wd.SetQdBits([]*component.QdBitParam{ var params []*component.QdBitParam
component.NewQdBitParam(component.UidType.Get(circuit.GMJ).Id, false), for _, entry := range circuit.KMJMap {
component.NewQdBitParam(component.UidType.Get(circuit.KMJ4).Id, false), params = append(params, component.NewQdBitParam(component.UidType.Get(entry).Id, false))
component.NewQdBitParam(component.UidType.Get(circuit.KMJ8).Id, true), }
})
return wd.SetQdBits(params)
} }
// 联锁驱动关门 // 设置继电器驱动关门
func setInterlockDriveGm(wd *component.WorldData, circuit *component.PsdCircuit) error { func setRelayDriveGm(wd *component.WorldData, circuit *component.PsdCircuit) error {
return wd.SetQdBits([]*component.QdBitParam{ var params []*component.QdBitParam
component.NewQdBitParam(component.UidType.Get(circuit.GMJ).Id, true), params = append(params, component.NewQdBitParam(component.UidType.Get(circuit.GMJ).Id, true))
component.NewQdBitParam(component.UidType.Get(circuit.KMJ4).Id, false), for _, entry := range circuit.KMJMap {
component.NewQdBitParam(component.UidType.Get(circuit.KMJ8).Id, false), params = append(params, component.NewQdBitParam(component.UidType.Get(entry).Id, false))
}) }
return wd.SetQdBits(params)
} }
// 直接设置PSC的状态4编组开门。在无屏蔽门电路时使用 // 取消继电器驱动关门
func setPscKm4(psc *component.Psc) { func cancelRelayDriveGm(wd *component.WorldData, circuit *component.PsdCircuit) error {
psc.InterlockKM4 = true var params []*component.QdBitParam
psc.InterlockKM8 = false params = append(params, component.NewQdBitParam(component.UidType.Get(circuit.GMJ).Id, false))
psc.InterlockGM = false
}
// 直接设置PSC的状态8编组开门。在无屏蔽门电路时使用 return wd.SetQdBits(params)
func setPscKm8(psc *component.Psc) {
psc.InterlockKM4 = false
psc.InterlockKM8 = true
psc.InterlockGM = false
}
// 直接设置PSC的状态关门。在无屏蔽门电路时使用
func setPscGm(psc *component.Psc) {
psc.InterlockKM4 = false
psc.InterlockKM8 = false
psc.InterlockGM = true
} }

View File

@ -8,26 +8,30 @@ import (
// ibp 系统 // ibp 系统
type IBPSys struct { type IBPSys struct {
query *ecs.Query empQuery *ecs.Query
spksQuery *ecs.Query
} }
// ibp盘系统 // ibp盘系统
func NewIBPSys() *IBPSys { func NewIBPSys() *IBPSys {
return &IBPSys{ return &IBPSys{
query: ecs.NewQuery(filter.Contains(component.SpkElectronicType, component.EmpElectronicType)), empQuery: ecs.NewQuery(filter.Contains(component.EmpElectronicType)),
spksQuery: ecs.NewQuery(filter.Contains(component.SpkElectronicType)),
} }
} }
// 控制电路更新 // 控制电路更新
func (ibp *IBPSys) Update(w ecs.World) { func (ibp *IBPSys) Update(w ecs.World) {
ibp.query.Each(w, func(entry *ecs.Entry) { ibp.empQuery.Each(w, func(entry *ecs.Entry) {
spkState := component.SpkElectronicType.Get(entry)
ibp.spkControl(entry, spkState)
ibp.spksState(entry, spkState)
empState := component.EmpElectronicType.Get(entry) empState := component.EmpElectronicType.Get(entry)
ibp.empControl(entry, empState) ibp.empControl(entry, empState)
ibp.empState(entry, empState) ibp.empState(entry, empState)
}) })
ibp.spksQuery.Each(w, func(entry *ecs.Entry) {
spkState := component.SpkElectronicType.Get(entry)
ibp.spkControl(entry, spkState)
ibp.spksState(entry, spkState)
})
} }
// 人员防护继电器控制电路逻辑 // 人员防护继电器控制电路逻辑

View File

@ -29,14 +29,15 @@ func (p *PsdSys) Update(world ecs.World) {
if entry.HasComponent(component.PsdCircuitType) { //有屏蔽门电路 if entry.HasComponent(component.PsdCircuitType) { //有屏蔽门电路
psdCircuit := component.PsdCircuitType.Get(entry) psdCircuit := component.PsdCircuitType.Get(entry)
//屏蔽门驱动 //屏蔽门驱动
if psdCircuit.GMJ != nil && psdCircuit.KMJ4 != nil && psdCircuit.KMJ8 != nil { if psdCircuit.GMJ != nil {
p.exciteGMJ(worldData, psdCircuit) p.exciteGMJ(worldData, psdCircuit)
p.exciteKMJ4(worldData, psdCircuit)
p.exciteKMJ8(worldData, psdCircuit)
psc.InterlockGM = component.BitStateType.Get(psdCircuit.GMJ).Val psc.InterlockGM = component.BitStateType.Get(psdCircuit.GMJ).Val
psc.InterlockKM4 = component.BitStateType.Get(psdCircuit.KMJ4).Val
psc.InterlockKM8 = component.BitStateType.Get(psdCircuit.KMJ8).Val
} }
for group, kmj := range psdCircuit.KMJMap {
p.exciteKMJ(worldData, psdCircuit, kmj)
psc.InterlockKmGroup[group] = component.BitStateType.Get(kmj).Val
}
if psdCircuit.MGJ != nil { if psdCircuit.MGJ != nil {
p.exciteMGJ(psdCircuit, asdList) p.exciteMGJ(psdCircuit, asdList)
psdState.Close = component.BitStateType.Get(psdCircuit.MGJ).Val psdState.Close = component.BitStateType.Get(psdCircuit.MGJ).Val
@ -96,12 +97,13 @@ func (p *PsdSys) Update(world ecs.World) {
} else if !psc.InterlockMPL { //联锁操作没有被旁路 } else if !psc.InterlockMPL { //联锁操作没有被旁路
if psc.InterlockGM { if psc.InterlockGM {
p.gm(asdList) p.gm(asdList)
} else if psc.InterlockKM8 { } else {
group := psd.FindAsdGroup(8) for group, km := range psc.InterlockKmGroup {
p.km(group.Start, group.End, asdList) if km {
} else if psc.InterlockKM4 { asdGroup := psd.FindAsdGroup(group)
group := psd.FindAsdGroup(4) p.km(asdGroup.Start, asdGroup.End, asdList)
p.km(group.Start, group.End, asdList) }
}
} }
} }
}) })
@ -127,55 +129,40 @@ func (p *PsdSys) exciteGMJ(data *component.WorldData, circuit *component.PsdCirc
if err != nil { if err != nil {
return return
} }
gmj := component.BitStateType.Get(circuit.GMJ)
kmj4 := component.BitStateType.Get(circuit.KMJ4)
kmj8 := component.BitStateType.Get(circuit.KMJ8)
if bit { //驱动 if bit { //驱动
component.RelayDriveType.Get(circuit.GMJ).Td = true component.RelayDriveType.Get(circuit.GMJ).Td = true
} else if gmj.Val { //自保持 } else if component.BitStateType.Get(circuit.GMJ).Val { //判断自保持
if !kmj4.Val && !kmj8.Val { for _, entry := range circuit.KMJMap {
component.RelayDriveType.Get(circuit.GMJ).Td = true if component.BitStateType.Get(entry).Val { //无法自保持
} else { component.RelayDriveType.Get(circuit.GMJ).Td = false
component.RelayDriveType.Get(circuit.GMJ).Td = false return
}
} }
//自保持
component.RelayDriveType.Get(circuit.GMJ).Td = true
} }
} }
func (p *PsdSys) exciteKMJ4(data *component.WorldData, circuit *component.PsdCircuit) { func (p *PsdSys) exciteKMJ(data *component.WorldData, circuit *component.PsdCircuit, kmj *ecs.Entry) {
bit, err := data.QueryQdBit(component.UidType.Get(circuit.KMJ4).Id) bit, err := data.QueryQdBit(component.UidType.Get(kmj).Id)
if err != nil { if err != nil {
return return
} }
kmj4 := component.BitStateType.Get(circuit.KMJ4)
gmj := component.BitStateType.Get(circuit.GMJ)
kmj8 := component.BitStateType.Get(circuit.KMJ8)
if bit { //驱动 if bit { //驱动
component.RelayDriveType.Get(circuit.KMJ4).Td = true component.RelayDriveType.Get(kmj).Td = true
} else if kmj4.Val { //自保持 } else if component.BitStateType.Get(kmj).Val { //判断自保持
if !gmj.Val && !kmj8.Val { if component.BitStateType.Get(circuit.GMJ).Val {
component.RelayDriveType.Get(circuit.KMJ4).Td = true component.RelayDriveType.Get(kmj).Td = false
} else { return
component.RelayDriveType.Get(circuit.KMJ4).Td = false
} }
} for _, entry := range circuit.KMJMap {
} if entry != kmj && component.BitStateType.Get(entry).Val {
component.RelayDriveType.Get(kmj).Td = false
func (p *PsdSys) exciteKMJ8(data *component.WorldData, circuit *component.PsdCircuit) { return
bit, err := data.QueryQdBit(component.UidType.Get(circuit.KMJ8).Id) }
if err != nil {
return
}
kmj8 := component.BitStateType.Get(circuit.KMJ8)
gmj := component.BitStateType.Get(circuit.GMJ)
kmj4 := component.BitStateType.Get(circuit.KMJ4)
if bit { //驱动
component.RelayDriveType.Get(circuit.KMJ8).Td = true
} else if kmj8.Val { //自保持
if !gmj.Val && !kmj4.Val {
component.RelayDriveType.Get(circuit.KMJ8).Td = true
} else {
component.RelayDriveType.Get(circuit.KMJ8).Td = false
} }
//自保持
component.RelayDriveType.Get(kmj).Td = true
} }
} }