双机zdj9道岔联锁驱动电路实现

This commit is contained in:
xzb 2023-09-15 16:39:11 +08:00
parent 738e10bb25
commit 44ef5bfa6d
3 changed files with 75 additions and 32 deletions

View File

@ -2,7 +2,6 @@ package sjzdj9
import ( import (
"fmt" "fmt"
sysEvent "joylink.club/rtsssimulation/system/event"
"time" "time"
"github.com/yohamta/donburi/filter" "github.com/yohamta/donburi/filter"
@ -26,7 +25,7 @@ func Test() {
worldConfig := simulation.WorldConfig{ worldConfig := simulation.WorldConfig{
ModelManager: worldStorage, ModelManager: worldStorage,
Systems: []ecs.ISystem{system.NewSwitch2jZdj9System(), system.NewRelaySystem(), system.NewDebugSystem()}, Systems: []ecs.ISystem{system.NewSwitch2jZdj9System(), system.NewRelaySystem(), system.NewDebugSystem()},
Tick: 100, Tick: 200,
InitTime: time.Now(), InitTime: time.Now(),
} }
world := simulation.InitializeWorld(&worldConfig) world := simulation.InitializeWorld(&worldConfig)
@ -40,19 +39,19 @@ func Test() {
// //
world.StartUp() world.StartUp()
time.Sleep(1 * time.Second) time.Sleep(1 * time.Second)
//反操 //联锁驱动反操
sysEvent.RelayNeedChangeEventBus.PublishOutWorld(world, &sysEvent.RelayNeedChangeEvent{Id: "sw1-sjzdj9-ycj", Xh: true}) system.Switch2jZdj9DriveYc(world, "sw1", true)
sysEvent.RelayNeedChangeEventBus.PublishOutWorld(world, &sysEvent.RelayNeedChangeEvent{Id: "sw1-sjzdj9-fcj", Xh: true}) system.Switch2jZdj9DriveFc(world, "sw1", true)
// //
time.Sleep(8 * time.Second) time.Sleep(12 * time.Second)
sysEvent.RelayNeedChangeEventBus.PublishOutWorld(world, &sysEvent.RelayNeedChangeEvent{Id: "sw1-sjzdj9-ycj", Xh: false}) system.Switch2jZdj9DriveYc(world, "sw1", false)
sysEvent.RelayNeedChangeEventBus.PublishOutWorld(world, &sysEvent.RelayNeedChangeEvent{Id: "sw1-sjzdj9-fcj", Xh: false}) system.Switch2jZdj9DriveFc(world, "sw1", false)
time.Sleep(1 * time.Second) time.Sleep(1 * time.Second)
//定操 //联锁驱动定操
sysEvent.RelayNeedChangeEventBus.PublishOutWorld(world, &sysEvent.RelayNeedChangeEvent{Id: "sw1-sjzdj9-ycj", Xh: true}) system.Switch2jZdj9DriveYc(world, "sw1", true)
sysEvent.RelayNeedChangeEventBus.PublishOutWorld(world, &sysEvent.RelayNeedChangeEvent{Id: "sw1-sjzdj9-dcj", Xh: true}) system.Switch2jZdj9DriveDc(world, "sw1", true)
// //
time.Sleep(8 * time.Second) time.Sleep(12 * time.Second)
world.Close() world.Close()
} }

View File

@ -10,6 +10,43 @@ import (
"joylink.club/rtsssimulation/umi" "joylink.club/rtsssimulation/umi"
) )
// --------联锁采集---------------
// Switch2jZdj9CjState 双机ZDJ9联锁采集电路状态
type Switch2jZdj9CjState struct {
ZdbjQ bool //采集总定表继电器前接点
ZfbjQ bool //采集总反表继电器前接点
YcjQ bool //采集允许操作继电器前接点
ZdbjHAndZfbjH bool //失表采集:采集总定表继电器后接点和总反表继电器后接点,结果与处理
J1DbjQ bool //采集j1定表继电器前接点
J1FbjQ bool //采集j1反表继电器前接点
J2DbjQ bool //采集j2定表继电器前接点
J2FbjQ bool //采集j2反表继电器前接点
}
func NewSwitch2jZdj9CjState() *Switch2jZdj9CjState {
return &Switch2jZdj9CjState{}
}
// --------联锁驱动-----------------
// Switch2jZdj9DriveYc 联锁驱动YCJ
func Switch2jZdj9DriveYc(w ecs.World, switchId string, xh bool) bool {
return DriveRelay(w, switchId, SJZDJ9_TDC, SJZDJ9_YCJ, xh)
}
// Switch2jZdj9DriveFc 联锁驱动FCJ
func Switch2jZdj9DriveFc(w ecs.World, switchId string, xh bool) bool {
return DriveRelay(w, switchId, SJZDJ9_TDC, SJZDJ9_FCJ, xh)
}
// Switch2jZdj9DriveDc 联锁驱动DCJ
func Switch2jZdj9DriveDc(w ecs.World, switchId string, xh bool) bool {
return DriveRelay(w, switchId, SJZDJ9_TDC, SJZDJ9_DCJ, xh)
}
//////////////////////////////////////////////////////////////////
// Switch2jZdj9State 双机ZDJ9道岔电路系统状态定义 // Switch2jZdj9State 双机ZDJ9道岔电路系统状态定义
// 继电器: true-吸合false-未吸合 // 继电器: true-吸合false-未吸合
type Switch2jZdj9State struct { type Switch2jZdj9State struct {
@ -100,22 +137,6 @@ type Switch2jZdj9State struct {
J2_Traction int8 J2_Traction int8
} }
// Switch2jZdj9CjState 双机ZDJ9联锁采集电路状态
type Switch2jZdj9CjState struct {
ZdbjQ bool //采集总定表继电器前接点
ZfbjQ bool //采集总反表继电器前接点
YcjQ bool //采集允许操作继电器前接点
ZdbjHAndZfbjH bool //失表采集:采集总定表继电器后接点和总反表继电器后接点,结果与处理
J1DbjQ bool //采集j1定表继电器前接点
J1FbjQ bool //采集j1反表继电器前接点
J2DbjQ bool //采集j2定表继电器前接点
J2FbjQ bool //采集j2反表继电器前接点
}
func NewSwitch2jZdj9CjState() *Switch2jZdj9CjState {
return &Switch2jZdj9CjState{}
}
// NewSwitch2jZdj9State 创建ZDJ9道岔状态并初始化 // NewSwitch2jZdj9State 创建ZDJ9道岔状态并初始化
func NewSwitch2jZdj9State() *Switch2jZdj9State { func NewSwitch2jZdj9State() *Switch2jZdj9State {
return &Switch2jZdj9State{ return &Switch2jZdj9State{

View File

@ -2,10 +2,10 @@ package system
import ( import (
"fmt" "fmt"
"github.com/yohamta/donburi/component" "github.com/yohamta/donburi/component"
"github.com/yohamta/donburi/filter" "github.com/yohamta/donburi/filter"
"joylink.club/ecs" "joylink.club/ecs"
sysEvent "joylink.club/rtsssimulation/system/event"
"joylink.club/rtsssimulation/umi" "joylink.club/rtsssimulation/umi"
) )
@ -51,7 +51,7 @@ func simpleRecover() {
///////////////////////////////////////////////////////// /////////////////////////////////////////////////////////
// 实体标签 // EntityTag 实体标签
type EntityTag = component.IComponentType type EntityTag = component.IComponentType
type EntityTagHandler struct { type EntityTagHandler struct {
@ -60,11 +60,34 @@ type EntityTagHandler struct {
///////////////////////////////////////////////////////// /////////////////////////////////////////////////////////
// 模型仓库引用 // ModelStorageRef 模型仓库引用
// 用于world内使用查询模型 // 用于world内使用查询模型
type ModelStorageRef struct { type ModelStorageRef struct {
ModelManager umi.IModelManager ModelManager umi.IModelManager
} }
// 模型仓库组件 // ModelStorageComponent 模型仓库组件
var ModelStorageComponent = ecs.NewComponentType[ModelStorageRef]() var ModelStorageComponent = ecs.NewComponentType[ModelStorageRef]()
/////////////////////////////////////////////////////////
// DriveRelay 驱动继电器
// circuitModelId-如道岔模型id
// relayGroup-继电器组合类型
// relayName-继电器功能名称
// xh-true:吸合false:落下
func DriveRelay(w ecs.World, circuitModelId string, relayGroup string, relayName string, xh bool) bool {
if swModel := FindModelStorage(w).FindById(circuitModelId); swModel != nil {
if roler, isCr := swModel.(umi.IRelayCRole); isCr {
if relayModel := roler.FindRelayModelByCRole(relayGroup, relayName); relayModel != nil {
if deviceModel, isDm := relayModel.(umi.IDeviceModel); isDm {
relayId := deviceModel.GetId()
sysEvent.RelayNeedChangeEventBus.PublishOutWorld(w, &sysEvent.RelayNeedChangeEvent{Id: relayId, Xh: xh})
return true
}
}
}
}
//
return false
}