双机zdj9道岔测试

This commit is contained in:
xzb 2023-09-15 13:48:48 +08:00
parent 3a989ac1b2
commit 32a46687f4
17 changed files with 99 additions and 213 deletions

View File

@ -24,7 +24,7 @@ func main() {
//
worldConfig := simulation.WorldConfig{
ModelManager: worldStorage,
Systems: []ecs.ISystem{system.NewTimerSystem(), system.NewSwitch2jZdj9System(), system.NewRelaySystem(), system.NewMovableSystem(), system.NewDebugSystem()},
Systems: []ecs.ISystem{system.NewSwitch2jZdj9System(), system.NewRelaySystem(), system.NewDebugSystem()},
Tick: 100,
InitTime: time.Now(),
}

View File

@ -1,16 +0,0 @@
package tmodel
import (
"joylink.club/rtsssimulation/umi"
)
// 计轴检测点模型
type AxlePointModel struct {
DeviceModel
//计轴检测点所在轨道
LinkOffset umi.ILinkOffsetRef
}
func NewAxlePointModel(id string) *AxlePointModel {
return &AxlePointModel{DeviceModel: DeviceModel{Id: id, Type: umi.AxlePoint}}
}

View File

@ -1,16 +0,0 @@
package tmodel
import (
"joylink.club/rtsssimulation/umi"
)
// 应答器
type BaliseModel struct {
DeviceModel
//应答器所在轨道
LinkOffset umi.ILinkOffsetRef
}
func NewBaliseModel(id string) *BaliseModel {
return &BaliseModel{DeviceModel: DeviceModel{Id: id, Type: umi.Balise}}
}

View File

@ -1,14 +0,0 @@
package tmodel
import "joylink.club/rtsssimulation/umi"
//两档位按钮
type TowPosButtonModel struct {
DeviceModel
// 按钮名称
Name string
}
func NewTowPosButtonModel(id string) *TowPosButtonModel {
return &TowPosButtonModel{DeviceModel: DeviceModel{Id: id, Type: umi.TowPosButton}}
}

View File

@ -1,56 +0,0 @@
package tmodel
import (
"joylink.club/rtsssimulation/umi"
)
// 站台一侧屏蔽门模型
type PsdModel struct {
DeviceModel
//屏蔽门所包含的单元
Cells []*PsdCellModel
//屏蔽门移动从0-100耗时单位ms
MoveTime int64
}
func NewPsdModel(id string) *PsdModel {
return &PsdModel{DeviceModel: DeviceModel{Id: id, Type: umi.Psd}, Cells: make([]*PsdCellModel, 0)}
}
func (me *PsdModel) addCell(cell *PsdCellModel) {
me.Cells = append(me.Cells, cell)
}
// 屏蔽门移动从0-100耗时单位ms
func (me *PsdModel) MovingTime() int64 {
return me.MoveTime
}
// 屏蔽门的所有单元门
func (me *PsdModel) AllDeviceCells() []umi.IDeviceModel {
rt := make([]umi.IDeviceModel, 0, len(me.Cells))
for _, cell := range me.Cells {
rt = append(rt, cell)
}
return rt
}
/////////////////////////////////////////////
// 站台一侧屏蔽门单元模型
type PsdCellModel struct {
DeviceModel
//该屏蔽门单元所属的屏蔽门
psd umi.IDeviceModel
}
func NewPsdCellModel(id string, psdModel *PsdModel) *PsdCellModel {
cell := &PsdCellModel{
DeviceModel: DeviceModel{Id: id, Type: umi.PsdCell},
psd: psdModel,
}
psdModel.addCell(cell)
return cell
}
func (me *PsdCellModel) Psd() *PsdModel {
return me.psd.(*PsdModel)
}

View File

@ -7,7 +7,7 @@ import (
"joylink.club/rtsssimulation/umi"
)
// 仿真world配置
// WorldConfig 仿真world配置
type WorldConfig struct {
//模型管理器,接收模型仓库管理器实例的指针
ModelManager umi.IModelManager

View File

@ -3,18 +3,20 @@ package simulation
import (
"joylink.club/ecs"
"joylink.club/rtsssimulation/entities"
"joylink.club/rtsssimulation/system"
)
// 初始化仿真world
// InitializeWorld 初始化仿真world
func InitializeWorld(config *WorldConfig) ecs.World {
world := ecs.NewWorld(config.Tick)
// 初始化系统
// 添加系统
world.AddSystem(system.NewTimerSystem())
world.AddSystem(system.NewMovableSystem())
for _, sys := range config.Systems {
world.AddSystem(sys)
}
// 创建world时间实体
// 添加内置实体
entities.CreateSystemTimerEntity(world, config.InitTime)
// 创建world模型仓库实体
entities.CreateModelStorageEntity(world, config.ModelManager)
//
return world

View File

@ -2,8 +2,8 @@ package sysEvent
import "joylink.club/ecs"
//继电器动作事件
//由继电器实体系统产生,表示继电器吸合落下动作
// RelayActionEvent 继电器动作事件
// 由继电器实体系统产生,表示继电器吸合落下动作
type RelayActionEvent struct {
//继电器id
Id string
@ -11,8 +11,8 @@ type RelayActionEvent struct {
Xh bool
}
//继电器状态须改变事件
//由电路系统运算发现某个继电器需要改变,则由电路系统产生该事件来通知对应继电器产生对应动作
// RelayNeedChangeEvent 继电器状态须改变事件
// 由电路系统运算发现某个继电器需要改变,则由电路系统产生该事件来通知对应继电器产生对应动作
type RelayNeedChangeEvent struct {
//继电器id
Id string
@ -20,8 +20,8 @@ type RelayNeedChangeEvent struct {
Xh bool
}
//继电器动作事件总线
// RelayActionEventBus 继电器动作事件总线
var RelayActionEventBus = ecs.NewEventType[RelayActionEvent]()
//继电器状态须改变事件总线
// RelayNeedChangeEventBus 继电器状态须改变事件总线
var RelayNeedChangeEventBus = ecs.NewEventType[RelayNeedChangeEvent]()

View File

@ -2,7 +2,7 @@ package sysEvent
import "joylink.club/ecs"
//信号机3XH1显示状态变化事件
// Signal3XH1AspectChangedEvent 信号机3XH1显示状态变化事件
type Signal3XH1AspectChangedEvent struct {
//信号机id
Id string
@ -14,5 +14,5 @@ type Signal3XH1AspectChangedEvent struct {
H bool
}
//信号机3XH1显示状态变化事件总线
// Signal3XH1AspectChangedEventBus 信号机3XH1显示状态变化事件总线
var Signal3XH1AspectChangedEventBus = ecs.NewEventType[Signal3XH1AspectChangedEvent]()

View File

@ -5,7 +5,7 @@ import (
"joylink.club/ecs"
)
// 时间维度上移动的物体
// MovableObject 一维移动的物体
type MovableObject struct {
Value int64
//移动方向0-不动1-变大,-1 -变小
@ -16,7 +16,7 @@ func NewMovableObject() *MovableObject {
return &MovableObject{Value: 0, direction: 0}
}
// 时间维度上移动物体组件
// MovableObjectComponent 一维移动的物体组件
var MovableObjectComponent = ecs.NewComponentType[MovableObject]()
var MovableObject1Component = ecs.NewComponentType[MovableObject]()
var MovableObject2Component = ecs.NewComponentType[MovableObject]()
@ -31,7 +31,7 @@ func NewMovableSystem() *MovableSystem {
}
}
// world 执行
// Update world 执行
func (me *MovableSystem) Update(w ecs.World) {
me.query.Each(w, func(e *ecs.Entry) {

View File

@ -7,7 +7,7 @@ import (
"log"
)
// 继电器有两个线圈1-2,3-4
// RelayState 继电器有两个线圈1-2,3-4
// 电流方向1->2,3->4或4->3,2->1时产生同向磁场
type RelayState struct {
//继电器是否吸合
@ -21,15 +21,15 @@ func NewRelayState() *RelayState {
return &RelayState{Xh: false, needXh: false}
}
// 使needXh同Xh
// ResetNeedXh 使needXh同Xh
func (me *RelayState) ResetNeedXh() {
me.needXh = me.Xh
}
// 继电器状态组件
// RelayStateComponent 继电器状态组件
var RelayStateComponent = ecs.NewComponentType[RelayState]()
// 继电器系统
// RelaySystem 继电器系统
type RelaySystem struct {
relayQuery *ecs.Query
}
@ -56,7 +56,7 @@ func RelayAddListeners(w ecs.World) {
sysEvent.RelayNeedChangeEventBus.Subscribe(w, RelayNeedChangeEventProcessor)
}
// 继电器须要改变事件处理
// RelayNeedChangeEventProcessor 继电器须要改变事件处理
var RelayNeedChangeEventProcessor = func(w ecs.World, event sysEvent.RelayNeedChangeEvent) {
log.Println("==>>收到继电器须改变事件id = ", event.Id, " xh = ", event.Xh)
relayEntry := FindEntityById(w, event.Id)
@ -64,7 +64,7 @@ var RelayNeedChangeEventProcessor = func(w ecs.World, event sysEvent.RelayNeedCh
relayState.needXh = event.Xh
}
// world 执行
// Update world 执行
func (me *RelaySystem) Update(w ecs.World) {
me.relayQuery.Each(w, func(e *ecs.Entry) {
relayState := RelayStateComponent.Get(e)

View File

@ -27,7 +27,7 @@ const (
SIGNAL_ZXJ = "ZXJ"
)
// 电路状态信号机3XH-1(红-绿-黄) 道岔防护信号机(三显示不封灯,有单黄显示、带引导)
// Signal3XH1State 电路状态信号机3XH-1(红-绿-黄) 道岔防护信号机(三显示不封灯,有单黄显示、带引导)
type Signal3XH1State struct {
// 物理黄灯true-亮
U bool
@ -63,7 +63,7 @@ func NewSignal3XH1State() *Signal3XH1State {
}
}
// 信号机3XH-1电路状态组件
// Signal3XH1StateComponent 信号机3XH-1电路状态组件
var Signal3XH1StateComponent = ecs.NewComponentType[Signal3XH1State]()
var signal3XH1Query = ecs.NewQuery(filter.Contains(EntityIdentityComponent, Signal3XH1StateComponent))
@ -74,7 +74,7 @@ func NewSignal3XH1System() *Signal3XH1System {
return &Signal3XH1System{}
}
// 继电器动作事件处理
// Signal3XH1RelayActionEventProcessor 继电器动作事件处理
// 将继电器动作的结果同步到系统
var Signal3XH1RelayActionEventProcessor = func(w ecs.World, event sysEvent.RelayActionEvent) {
//根据event来更新Signal3XH1State中对应继电器的状态
@ -111,7 +111,7 @@ var Signal3XH1RelayActionEventProcessor = func(w ecs.World, event sysEvent.Relay
})
}
// world 执行
// Update world 执行
func (me *Signal3XH1System) Update(w ecs.World) {
signal3XH1Query.Each(w, func(e *ecs.Entry) {
signal3XH1State := Signal3XH1StateComponent.Get(e)

View File

@ -10,7 +10,7 @@ import (
"joylink.club/rtsssimulation/umi"
)
// 双机ZDJ9道岔电路系统状态定义
// Switch2jZdj9State 双机ZDJ9道岔电路系统状态定义
// 继电器: true-吸合false-未吸合
type Switch2jZdj9State struct {
//定操继电器
@ -100,7 +100,7 @@ type Switch2jZdj9State struct {
J2_Traction int8
}
// 创建ZDJ9道岔状态并初始化
// NewSwitch2jZdj9State 创建ZDJ9道岔状态并初始化
func NewSwitch2jZdj9State() *Switch2jZdj9State {
return &Switch2jZdj9State{
DCJ: false,
@ -148,7 +148,7 @@ func NewSwitch2jZdj9State() *Switch2jZdj9State {
}
}
// 带限时功能断相保护器
// DBQState 带限时功能断相保护器
// 限时13秒
type DBQState struct {
//是否缺相true-缺相false-三相电正常未缺相
@ -161,7 +161,7 @@ type DBQState struct {
Dc24Voltage bool
}
// 表示电路变压器变压比2:1将220V交流电变压后作为为道岔表示电路的电源
// SwitchBB 表示电路变压器变压比2:1将220V交流电变压后作为为道岔表示电路的电源
// 0-无电源规定52端子为正1-输出瞬时正电压;-1 - 输出瞬时负电压
type SwitchBB struct {
//true-变压器初级输入正常
@ -171,7 +171,7 @@ type SwitchBB struct {
OutBb int8
}
// 道岔380V动力交流电源
// Switch380ACPower 道岔380V动力交流电源
type Switch380ACPower struct {
//true-激活
Active bool
@ -183,44 +183,38 @@ type Switch380ACPower struct {
PhaseC bool
}
// 道岔380V动力交流电相位定义
// Switch380ACPhase 道岔380V动力交流电相位定义
type Switch380ACPhase int8
const (
//不存在相位交流电
ACPahseN Switch380ACPhase = iota
//存在A相位交流电
ACPahseA
//存在B相位交流电
ACPahseB
//存在C相位交流电
ACPahseC
ACPahseN Switch380ACPhase = iota //不存在相位交流电
ACPahseA //存在A相位交流电
ACPahseB //存在B相位交流电
ACPahseC //存在C相位交流电
)
// 继电器常量定义
const (
//QDJ 电源切断继电器LC震荡电路有效震荡时间ms
QDJ_LC_TIME int64 = 3000
//断相保护器限时单位ms
DBQ_LIMITED_TIME = 13 * 1000
QDJ_LC_TIME int64 = 3000 //QDJ 电源切断继电器LC震荡电路有效震荡时间ms
DBQ_LIMITED_TIME = 13 * 1000 //断相保护器限时单位ms
)
// 道岔ZDJ9电路状态组件
// Switch2jZdj9StateComponent 道岔ZDJ9电路状态组件
var Switch2jZdj9StateComponent = ecs.NewComponentType[Switch2jZdj9State]()
// zdj9查询
var zdj9Query = ecs.NewQuery(filter.Contains(EntityIdentityComponent, Switch2jZdj9StateComponent))
// 双机ZDJ9道岔系统
// Switch2jZdj9System 双机ZDJ9道岔系统
type Switch2jZdj9System struct {
}
// 双机ZDJ9道岔系统
// NewSwitch2jZdj9System 双机ZDJ9道岔系统
func NewSwitch2jZdj9System() *Switch2jZdj9System {
return &Switch2jZdj9System{}
}
// world 执行
// Update world 执行
func (me *Switch2jZdj9System) Update(w ecs.World) {
zdj9Query.Each(w, func(e *ecs.Entry) {
zdj9State := Switch2jZdj9StateComponent.Get(e)
@ -257,12 +251,11 @@ func (me *Switch2jZdj9System) Update(w ecs.World) {
// SJZDJ9双机zdj9
const (
//继电器组合类型
SJZDJ9_TDC = "TDC"
SJZDJ9_TDC = "TDC" //继电器组合类型
SJZDJ9_TDFJ1 = "TDFJ1"
SJZDJ9_TDFJ2 = "TDFJ2"
//继电器功能名称
SJZDJ9_1DQJ = "1DQJ"
SJZDJ9_1DQJ = "1DQJ" //继电器功能名称
SJZDJ9_BHJ = "BHJ"
SJZDJ9_2DQJ = "2DQJ"
SJZDJ9_1DQJF = "1DQJF"
@ -281,7 +274,7 @@ func Switch2jzdj9AddListeners(w ecs.World) {
sysEvent.RelayActionEventBus.Subscribe(w, Switch2jzdj9RelayActionEventProcessor)
}
// 接收继电器动作事件
// Switch2jzdj9RelayActionEventProcessor 接收继电器动作事件
var Switch2jzdj9RelayActionEventProcessor = func(w ecs.World, event sysEvent.RelayActionEvent) {
log.Println("==>>收到继电器动作事件id = ", event.Id, " xh = ", event.Xh)
zdj9Query.Each(w, func(e *ecs.Entry) {

View File

@ -9,12 +9,12 @@ import (
"joylink.club/rtsssimulation/umi"
)
// 实体身份定义
// EntityIdentity 实体身份定义
type EntityIdentity struct {
Id string
}
// 实体身份组件
// EntityIdentityComponent 实体身份组件
var EntityIdentityComponent = ecs.NewComponentType[EntityIdentity]()
func FindEntityById(world ecs.World, id string) *ecs.Entry {
@ -38,7 +38,7 @@ func QueryEntityById(world ecs.World, q *ecs.Query, id string) *ecs.Entry {
var modelStorageQuery = ecs.NewQuery(filter.Contains(ModelStorageComponent))
// 获取模型仓库
// FindModelStorage 获取模型仓库
func FindModelStorage(world ecs.World) umi.IModelManager {
e, _ := modelStorageQuery.First(world)
return ModelStorageComponent.Get(e).ModelManager

View File

@ -11,7 +11,7 @@ var SystemTimerComponent = ecs.NewComponentType[SystemTimer]()
var timerQuery *ecs.Query = ecs.NewQuery(filter.Contains(SystemTimerComponent))
// 系统时钟操作
// TimerSystem 系统时钟操作
type TimerSystem struct {
}
@ -19,7 +19,7 @@ func NewTimerSystem() *TimerSystem {
return &TimerSystem{}
}
// world 执行
// Update world 执行
func (me *TimerSystem) Update(w ecs.World) {
if e, ok := timerQuery.First(w); ok {
timer := SystemTimerComponent.Get(e)
@ -27,7 +27,7 @@ func (me *TimerSystem) Update(w ecs.World) {
}
}
// 重置world时间
// ResetWorldTimer 重置world时间
func ResetWorldTimer(w ecs.World, time time.Time) {
if e, ok := timerQuery.First(w); ok {
timer := SystemTimerComponent.Get(e)
@ -35,7 +35,7 @@ func ResetWorldTimer(w ecs.World, time time.Time) {
}
}
// 获取world当前时间
// GetWorldNow 获取world当前时间
func GetWorldNow(w ecs.World) *time.Time {
if e, ok := timerQuery.First(w); ok {
timer := SystemTimerComponent.Get(e)
@ -47,29 +47,29 @@ func GetWorldNow(w ecs.World) *time.Time {
/////////////////////////////////////////////////////////////////
// 系统时钟,单例
// SystemTimer 系统时钟,单例
type SystemTimer struct {
timer *time.Time
}
// 以指定时间构建
// NewSystemTimer 以指定时间构建
func NewSystemTimer(time *time.Time) *SystemTimer {
return &SystemTimer{
timer: time,
}
}
// 重置时间
// ResetTime 重置时间
func (me *SystemTimer) ResetTime(time time.Time) {
*me.timer = time
}
// 获取当前时间的副本
// Now 获取当前时间的副本
func (me *SystemTimer) Now() time.Time {
return *me.timer
}
// tick系统时钟,单位ms
// Tick tick系统时钟,单位ms
func (me *SystemTimer) Tick(tick int) {
*me.timer = me.timer.Add(time.Duration(tick) * time.Millisecond)
}

View File

@ -2,11 +2,11 @@ package system
import "joylink.club/ecs"
// 实现列车在link上运行的系统
// TrainSystem 实现列车在link上运行的系统
type TrainSystem struct {
}
// world 执行
// Update world 执行
func (me *TrainSystem) Update(world ecs.World) {
}

View File

@ -2,17 +2,17 @@ package umi
// 用户设备模型与仿真底层设备交互定义
// 模型管理接口
// IModelManager 模型管理接口
type IModelManager interface {
//根据模型的复合id获取模型数据
//FindById 根据模型的复合id获取模型数据
FindById(id string) IDeviceModel
//获取某类型设备的所有模型数据
//FindByType 获取某类型设备的所有模型数据
FindByType(deviceType DeviceType) []IDeviceModel
}
/////////////////////////////////////////////////////////
// 端口定义,如轨道、区段、道岔的端口
// PortEnum 端口定义,如轨道、区段、道岔的端口
type PortEnum = int8
// 具体端口枚举
@ -24,7 +24,7 @@ const (
////////////////////////////////////////////////////////////
//设备类型枚举
// DeviceType 设备类型枚举
type DeviceType = int16
const (
@ -32,86 +32,79 @@ const (
Link
Switch
Signal
Psd
PsdCell
AxlePoint
//应答器
Balise
//两档位按钮
TowPosButton
//继电器设备
Relay
Relay //继电器设备
)
///////////////////////////////////////////////////////////
// 仿真底层设备模型定义
// IDeviceModel 仿真底层设备模型定义
// 用户所有设备模型定义须实现该接口
type IDeviceModel interface {
GetId() string
GetType() DeviceType
}
// 仿真底层道岔模型
// ILinkModel 仿真底层道岔模型
// 用户所有轨道模型定义须实现该接口
type ILinkModel interface {
//获取轨道长度单位mm
//Len 获取轨道长度单位mm
Len() int64
//轨道A端连接的道岔
//PortASwitch 轨道A端连接的道岔
PortASwitch() ISwitchRef
//轨道B端连接的道岔
//PortBSwitch 轨道B端连接的道岔
PortBSwitch() ISwitchRef
}
// 轨道引用
// ILinkRef 轨道引用
type ILinkRef interface {
//被引用的轨道模型
//LinkModel 被引用的轨道模型
LinkModel() ILinkModel
//被引用的轨道的端口
//LinkPort 被引用的轨道的端口
LinkPort() PortEnum
}
// 轨道偏移引用
// ILinkOffsetRef 轨道偏移引用
type ILinkOffsetRef interface {
//被引用的轨道模型
//LinkModel 被引用的轨道模型
LinkModel() ILinkModel
//偏移量单位mm
//GetOffset 偏移量单位mm
GetOffset() int64
}
// 仿真底层道岔模型
// ISwitchModel 仿真底层道岔模型
// 用户所有道岔模型定义须实现该接口
type ISwitchModel interface {
//道岔A端口连接的轨道
//PortALink 道岔A端口连接的轨道
PortALink() ILinkRef
//道岔B端口连接的轨道
//PortBLink 道岔B端口连接的轨道
PortBLink() ILinkRef
//道岔C端口连接的轨道
//PortCLink 道岔C端口连接的轨道
PortCLink() ILinkRef
}
// 道岔引用
// ISwitchRef 道岔引用
type ISwitchRef interface {
//被引用的道岔模型
//SwitchModel 被引用的道岔模型
SwitchModel() ISwitchModel
//被引用的道岔的端口
//SwitchPort 被引用的道岔的端口
SwitchPort() PortEnum
}
// 仿真底层屏蔽门模型
// IPsdModel 仿真底层屏蔽门模型
// 用户所有屏蔽门模型定义须实现该接口
type IPsdModel interface {
//屏蔽门移动从0-100耗时单位ms
//MovingTime 屏蔽门移动从0-100耗时单位ms
MovingTime() int64
//屏蔽门的所有单元门
//AllDeviceCells 屏蔽门的所有单元门
AllDeviceCells() []IDeviceModel
}
////////////////////////////////////////////////////////////
//继电器类型定义
// //////////////////////////////////////////////////////////
// RelayType 继电器类型定义
type RelayType = int8
//继电器类枚举
// 继电器型号枚举
const (
//无极缓放继电器
JWXC_1700 RelayType = iota + 1
@ -135,23 +128,23 @@ const (
JZXC_H18
)
// 继电器模型
// IRelayModel 继电器模型
type IRelayModel interface {
//该继电器类型
//JType 该继电器类型
JType() RelayType
}
// 获取继电器在具体电路中的角色(组合类型、功能名称)
// IRelayCRole 获取继电器在具体电路中的角色(组合类型、功能名称)
// 如信号机3XH-1电路中点灯继电器组合类型-"3XH-1" 功能名称-"DDJ"
// 对应设备电路中有继电器的设备模型须实现该接口
type IRelayCRole interface {
//根据继电器id获取在具体电路中的电路角色
//FindCircuitRoleById 根据继电器id获取在具体电路中的电路角色
//relayId-继电器id
//relayGroup-继电器组合类型
//relayName-继电器在电路中的名称
//find-true找到false未找到
FindCircuitRoleById(relayId string) (relayGroup string, relayName string, find bool)
//根据继电器具体电路角色来获取继电器设备模型
//FindRelayModelByCRole 根据继电器具体电路角色来获取继电器设备模型
//relayGroup-继电器组合类型
//relayName-继电器在电路中的名称
FindRelayModelByCRole(relayGroup string, relayName string) IRelayModel