zdj9道岔电路实现

This commit is contained in:
xzb 2023-09-05 18:16:36 +08:00
parent ad87ad0bef
commit 4579f6729d

View File

@ -1,5 +1,165 @@
package system
import (
"github.com/yohamta/donburi/filter"
"joylink.club/ecs"
)
// 继电器: true-吸合false-未吸合
type SwitchZdj9State struct {
//定操继电器
DCJ bool
//反操继电器
FCJ bool
//允许操作继电器
YCJ bool
//总定表继电器
ZDBJ bool
//总反表继电器
ZFBJ bool
//表示电路变压器将220V交流电变压后作为为道岔表示电路的电源
//0-无电源规定52端子为正1-输出瞬时正电压;-1 - 输出瞬时负电压
J1_BB int8
//道岔第一启动继电器
J1_1DQJ bool
//道岔保护继电器
J1_BHJ bool
//道岔第二启动继电器
J1_2DQJ bool
//道岔第一启动继电器复示继电器
J1_1DQJF bool
//断相保护器
J1_DBQ DBQState
//定位表示继电器
J1_DBJ bool
//反位表示继电器
J1_FBJ bool
//道岔启动切断继电器
J1_QDJ bool
//道岔启动切断继电器的LC震荡电路保磁剩余时间,单位ms
//最长保持时长3000ms
J1_QDJ_LcTime int64
//总保护继电器
J1_ZBHJ bool
//表示电路变压器将220V交流电变压后作为为道岔表示电路的电源
//0-无电源规定52端子为正1-输出瞬时正电压;-1 - 输出瞬时负电压
J2_BB int8
//道岔第一启动继电器
J2_1DQJ bool
//道岔保护继电器
J2_BHJ bool
//道岔第二启动继电器
J2_2DQJ bool
//道岔第一启动继电器复示继电器
J2_1DQJF bool
//断相保护器
J2_DBQ DBQState
//定位表示继电器
J2_DBJ bool
//反位表示继电器
J2_FBJ bool
}
// 带限时功能断相保护器
// 限时13秒
type DBQState struct {
//是否缺相true-缺相false-三相电正常未缺相
PhaseLoss bool
//剩余限时时间,单位ms
LimitedTime int64
//当三相电正常时断相保护器内的24V直流整流电路会正常输出24V直流电
//当三相电不正常如缺相时断相保护器内的24V直流整流电路不会输出24V直流电
//BHJ道岔保护继电器的励磁线圈由该24V直流供电
Dc24Voltage bool
}
// 道岔ZDJ9电路状态组件
var SwitchZdj9StateComponent = ecs.NewComponentType[SwitchZdj9State]()
// ZDJ9道岔系统
type SwitchZdj9System struct {
zdj9Query *ecs.Query
}
func NewSwitchZdj9System() *SwitchZdj9System {
return &SwitchZdj9System{zdj9Query: ecs.NewQuery(filter.Contains(SwitchZdj9StateComponent))}
}
// world 执行
func (me *SwitchZdj9System) Update(w ecs.World) {
me.zdj9Query.Each(w, func(e *ecs.Entry) {
zdj9State := SwitchZdj9StateComponent.Get(e)
//断相保护器电路
calculateDBQ(w, zdj9State)
//断相保护继电器励磁电路
calculateBHJ(w, zdj9State)
//总保护继电器励磁电路
calculateZBHJ(w, zdj9State)
//道岔转换启动切断继电器励磁电路
calculateQDJ(w, zdj9State)
//道岔一次启动继电器励磁电路
calculateDQJ(w, zdj9State)
})
}
// 断相保护电路运算
func calculateDBQ(w ecs.World, state *SwitchZdj9State) {
if state.J1_DBQ.LimitedTime > 0 {
state.J1_DBQ.LimitedTime -= int64(w.Tick())
} else {
state.J1_DBQ.LimitedTime = 0
}
state.J1_DBQ.Dc24Voltage = !state.J1_DBQ.PhaseLoss
//
if state.J2_DBQ.LimitedTime > 0 {
state.J2_DBQ.LimitedTime -= int64(w.Tick())
} else {
state.J2_DBQ.LimitedTime = 0
}
state.J2_DBQ.Dc24Voltage = !state.J2_DBQ.PhaseLoss
}
// 断相保护继电器运算
func calculateBHJ(w ecs.World, state *SwitchZdj9State) {
state.J1_BHJ = state.J1_DBQ.Dc24Voltage
state.J2_BHJ = state.J2_DBQ.Dc24Voltage
}
// 总保护继电器运算
func calculateZBHJ(w ecs.World, state *SwitchZdj9State) {
//励磁
method1 := state.J1_BHJ && state.J2_BHJ
//励磁
method2 := state.J1_ZBHJ && (state.J1_BHJ || state.J2_BHJ)
//为总保护继电器励磁
state.J1_ZBHJ = method1 || method2
}
// 道岔转换启动切断继电器运算
func calculateQDJ(w ecs.World, state *SwitchZdj9State) {
//LC震荡电路运算
fullLc := (!state.J1_BHJ && !state.J2_BHJ) || state.J1_ZBHJ
if fullLc {
state.J1_QDJ_LcTime = 3000
} else {
state.J1_QDJ_LcTime -= int64(w.Tick())
if state.J1_QDJ_LcTime < 0 {
state.J1_QDJ_LcTime = 0
}
}
//自闭励磁电路
self := state.J1_QDJ && state.J1_ZBHJ
//为启动切断继电器励磁
state.J1_QDJ = self || fullLc || state.J1_QDJ_LcTime > 0
}
// 道岔第一启动继电器运算
func calculateDQJ(w ecs.World, state *SwitchZdj9State) {
//励磁电路
j1DqjMethod1 := state.YCJ && (state.DCJ || state.FCJ)
//自闭电路
j1DqjSelf := state.J1_QDJ && state.J1_BHJ && state.J1_1DQJ
//为J1第一启动继电器励磁
state.J1_1DQJ = j1DqjMethod1 || j1DqjSelf
}