iscs pscada 一次图 电力传递实现
This commit is contained in:
parent
a9b3c09415
commit
648c8c4554
93
sys/iscs_sys/iscs_pscada_circuit_breaker.go
Normal file
93
sys/iscs_sys/iscs_pscada_circuit_breaker.go
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
package iscs_sys
|
||||||
|
|
||||||
|
import (
|
||||||
|
"joylink.club/ecs"
|
||||||
|
"joylink.club/ecs/filter"
|
||||||
|
"joylink.club/rtsssimulation/component"
|
||||||
|
"joylink.club/rtsssimulation/entity"
|
||||||
|
"joylink.club/rtsssimulation/repository"
|
||||||
|
)
|
||||||
|
|
||||||
|
type CircuitBreakerSystem struct {
|
||||||
|
query *ecs.Query
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewCircuitBreakerSystem() *CircuitBreakerSystem {
|
||||||
|
return &CircuitBreakerSystem{
|
||||||
|
query: ecs.NewQuery(filter.Contains(component.UidType, component.CircuitBreakerType)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func (s *CircuitBreakerSystem) Update(w ecs.World) {
|
||||||
|
s.circuitBreakerTransPower(w)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// 断路器传递电能
|
||||||
|
func (s *CircuitBreakerSystem) circuitBreakerTransPower(w ecs.World) {
|
||||||
|
wd := entity.GetWorldData(w)
|
||||||
|
s.query.Each(w, func(entry *ecs.Entry) {
|
||||||
|
breakerId := component.UidType.Get(entry).Id
|
||||||
|
closed := component.CircuitBreakerType.Get(entry).Closed
|
||||||
|
breakerModel := (wd.Repo.FindById(breakerId)).(*repository.CircuitBreaker)
|
||||||
|
//断路器A端连接的管线
|
||||||
|
breakerPortA := breakerModel.PortA
|
||||||
|
//断路器B端连接的管线
|
||||||
|
breakerPortB := breakerModel.PortB
|
||||||
|
//传递电能
|
||||||
|
towPipePortsTransPower(wd, closed, breakerPortA, breakerPortB)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 两位置开关传递电能(断路器、手车、隔离开关)
|
||||||
|
func towPipePortsTransPower(
|
||||||
|
wd *component.WorldData,
|
||||||
|
closed bool,
|
||||||
|
breakerPortA *repository.PipePort,
|
||||||
|
breakerPortB *repository.PipePort) {
|
||||||
|
//断路器A端连接的管线
|
||||||
|
breakerPortAPipeEntry := wd.EntityMap[breakerPortA.Device().Id()]
|
||||||
|
breakerPortAPipe := component.PowerPipeType.Get(breakerPortAPipeEntry)
|
||||||
|
//断路器B端连接的管线
|
||||||
|
breakerPortBPipeEntry := wd.EntityMap[breakerPortB.Device().Id()]
|
||||||
|
breakerPortBPipe := component.PowerPipeType.Get(breakerPortBPipeEntry)
|
||||||
|
//A->B
|
||||||
|
for portAPipePsId, portAPipePs := range breakerPortAPipe.Sources { //A
|
||||||
|
portBPipePs, ok := breakerPortBPipe.Sources[portAPipePsId] //B
|
||||||
|
if ok {
|
||||||
|
if portAPipePs.Fresh > portBPipePs.Fresh {
|
||||||
|
*breakerPortBPipe.Sources[portAPipePsId] = *portAPipePs
|
||||||
|
breakerPortBPipe.Sources[portAPipePsId].Fresh -= 1
|
||||||
|
if !closed {
|
||||||
|
breakerPortBPipe.Sources[portAPipePsId].Voltage = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
breakerPortBPipe.Sources[portAPipePsId] = &component.ElePower{}
|
||||||
|
*breakerPortBPipe.Sources[portAPipePsId] = *portAPipePs
|
||||||
|
breakerPortBPipe.Sources[portAPipePsId].Fresh -= 1
|
||||||
|
if !closed {
|
||||||
|
breakerPortBPipe.Sources[portAPipePsId].Voltage = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//B->A
|
||||||
|
for portBPipePsId, portBPipePs := range breakerPortBPipe.Sources { //B
|
||||||
|
portAPipePs, ok := breakerPortAPipe.Sources[portBPipePsId] //A
|
||||||
|
if ok {
|
||||||
|
if portBPipePs.Fresh > portAPipePs.Fresh {
|
||||||
|
*breakerPortAPipe.Sources[portBPipePsId] = *portBPipePs
|
||||||
|
breakerPortAPipe.Sources[portBPipePsId].Fresh -= 1
|
||||||
|
if !closed {
|
||||||
|
breakerPortAPipe.Sources[portBPipePsId].Voltage = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
breakerPortAPipe.Sources[portBPipePsId] = &component.ElePower{}
|
||||||
|
*breakerPortAPipe.Sources[portBPipePsId] = *portBPipePs
|
||||||
|
breakerPortAPipe.Sources[portBPipePsId].Fresh -= 1
|
||||||
|
if !closed {
|
||||||
|
breakerPortAPipe.Sources[portBPipePsId].Voltage = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
35
sys/iscs_sys/iscs_pscada_disconnector.go
Normal file
35
sys/iscs_sys/iscs_pscada_disconnector.go
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
package iscs_sys
|
||||||
|
|
||||||
|
import (
|
||||||
|
"joylink.club/ecs"
|
||||||
|
"joylink.club/ecs/filter"
|
||||||
|
"joylink.club/rtsssimulation/component"
|
||||||
|
"joylink.club/rtsssimulation/entity"
|
||||||
|
"joylink.club/rtsssimulation/repository"
|
||||||
|
)
|
||||||
|
|
||||||
|
type DisconnectorSystem struct {
|
||||||
|
query *ecs.Query
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewDisconnectorSystem() *DisconnectorSystem {
|
||||||
|
return &DisconnectorSystem{
|
||||||
|
query: ecs.NewQuery(filter.Contains(component.UidType, component.DisconnectorType)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func (s *DisconnectorSystem) Update(w ecs.World) {
|
||||||
|
s.disconnectorTransPower(w)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 隔离开关传递电能
|
||||||
|
func (s *DisconnectorSystem) disconnectorTransPower(w ecs.World) {
|
||||||
|
wd := entity.GetWorldData(w)
|
||||||
|
s.query.Each(w, func(entry *ecs.Entry) {
|
||||||
|
breakerId := component.UidType.Get(entry).Id
|
||||||
|
closed := component.DisconnectorType.Get(entry).Closed
|
||||||
|
breakerModel := (wd.Repo.FindById(breakerId)).(*repository.Disconnector)
|
||||||
|
breakerPortA := breakerModel.PortA
|
||||||
|
breakerPortB := breakerModel.PortB
|
||||||
|
towPipePortsTransPower(wd, closed, breakerPortA, breakerPortB)
|
||||||
|
})
|
||||||
|
}
|
35
sys/iscs_sys/iscs_pscada_handcart.go
Normal file
35
sys/iscs_sys/iscs_pscada_handcart.go
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
package iscs_sys
|
||||||
|
|
||||||
|
import (
|
||||||
|
"joylink.club/ecs"
|
||||||
|
"joylink.club/ecs/filter"
|
||||||
|
"joylink.club/rtsssimulation/component"
|
||||||
|
"joylink.club/rtsssimulation/entity"
|
||||||
|
"joylink.club/rtsssimulation/repository"
|
||||||
|
)
|
||||||
|
|
||||||
|
type HandcartSystem struct {
|
||||||
|
query *ecs.Query
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewHandcartSystem() *HandcartSystem {
|
||||||
|
return &HandcartSystem{
|
||||||
|
query: ecs.NewQuery(filter.Contains(component.UidType, component.HandcartSwitchType)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func (s *HandcartSystem) Update(w ecs.World) {
|
||||||
|
s.handcartTransPower(w)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 手车传递电能
|
||||||
|
func (s *HandcartSystem) handcartTransPower(w ecs.World) {
|
||||||
|
wd := entity.GetWorldData(w)
|
||||||
|
s.query.Each(w, func(entry *ecs.Entry) {
|
||||||
|
breakerId := component.UidType.Get(entry).Id
|
||||||
|
closed := component.HandcartSwitchType.Get(entry).Position == component.HpClosed
|
||||||
|
breakerModel := (wd.Repo.FindById(breakerId)).(*repository.HandcartSwitch)
|
||||||
|
breakerPortA := breakerModel.PortA
|
||||||
|
breakerPortB := breakerModel.PortB
|
||||||
|
towPipePortsTransPower(wd, closed, breakerPortA, breakerPortB)
|
||||||
|
})
|
||||||
|
}
|
59
sys/iscs_sys/iscs_pscada_pipe_fitting.go
Normal file
59
sys/iscs_sys/iscs_pscada_pipe_fitting.go
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
package iscs_sys
|
||||||
|
|
||||||
|
import (
|
||||||
|
"joylink.club/ecs"
|
||||||
|
"joylink.club/rtsssimulation/component"
|
||||||
|
"joylink.club/rtsssimulation/entity"
|
||||||
|
)
|
||||||
|
|
||||||
|
type PipeFittingSystem struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewPipeFittingSystem() *PipeFittingSystem {
|
||||||
|
return &PipeFittingSystem{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update 母线管件电能传递
|
||||||
|
func (s *PipeFittingSystem) Update(w ecs.World) {
|
||||||
|
wd := entity.GetWorldData(w)
|
||||||
|
for _, pf := range wd.Repo.PipeFittingMap {
|
||||||
|
if pf.IsEle() {
|
||||||
|
//与管件连接的所有管线
|
||||||
|
pipes := pf.Ports()
|
||||||
|
//筛选出相对电源
|
||||||
|
pipePsMap := make(map[string]*component.ElePower)
|
||||||
|
for _, pipePort := range pipes {
|
||||||
|
pipeEntry := wd.EntityMap[pipePort.Device().Id()]
|
||||||
|
powerPipe := component.PowerPipeType.Get(pipeEntry)
|
||||||
|
for epId, ep := range powerPipe.Sources {
|
||||||
|
pipePs, ok := pipePsMap[epId]
|
||||||
|
if ok {
|
||||||
|
if ep.Fresh > pipePs.Fresh {
|
||||||
|
pipePsMap[epId] = ep
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pipePsMap[epId] = ep
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//管件连接的管线间电能传递
|
||||||
|
for _, pipePort := range pipes {
|
||||||
|
for pipePsId, pipePs := range pipePsMap { //相对电源
|
||||||
|
pipeEntry := wd.EntityMap[pipePort.Device().Id()]
|
||||||
|
powerPipe := component.PowerPipeType.Get(pipeEntry)
|
||||||
|
pipePortPs, ok := powerPipe.Sources[pipePsId]
|
||||||
|
if ok {
|
||||||
|
if pipePs.Fresh > pipePortPs.Fresh {
|
||||||
|
*powerPipe.Sources[pipePsId] = *pipePs
|
||||||
|
powerPipe.Sources[pipePsId].Fresh -= 1 //保证相对性
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
powerPipe.Sources[pipePsId] = &component.ElePower{}
|
||||||
|
*powerPipe.Sources[pipePsId] = *pipePs
|
||||||
|
powerPipe.Sources[pipePsId].Fresh -= 1 //保证相对性
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
35
sys/iscs_sys/iscs_pscada_power_pipe.go
Normal file
35
sys/iscs_sys/iscs_pscada_power_pipe.go
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
package iscs_sys
|
||||||
|
|
||||||
|
import (
|
||||||
|
"joylink.club/ecs"
|
||||||
|
"joylink.club/ecs/filter"
|
||||||
|
"joylink.club/rtsssimulation/component"
|
||||||
|
)
|
||||||
|
|
||||||
|
type PowerPipeSystem struct {
|
||||||
|
query *ecs.Query
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewPowerPipeSystem() *PowerPipeSystem {
|
||||||
|
return &PowerPipeSystem{
|
||||||
|
query: ecs.NewQuery(filter.Contains(component.PowerPipeType)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update 电力母线中电力计算
|
||||||
|
func (s *PowerPipeSystem) Update(w ecs.World) {
|
||||||
|
s.query.Each(w, func(entry *ecs.Entry) {
|
||||||
|
pipe := component.PowerPipeType.Get(entry)
|
||||||
|
voltage := uint32(0)
|
||||||
|
ac := false
|
||||||
|
for _, power := range pipe.Sources {
|
||||||
|
if power.Voltage > voltage {
|
||||||
|
voltage = power.Voltage
|
||||||
|
ac = power.Ac
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//
|
||||||
|
pipe.Voltage = voltage
|
||||||
|
pipe.Ac = ac
|
||||||
|
})
|
||||||
|
}
|
34
sys/iscs_sys/iscs_pscada_power_souce.go
Normal file
34
sys/iscs_sys/iscs_pscada_power_souce.go
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
package iscs_sys
|
||||||
|
|
||||||
|
import (
|
||||||
|
"joylink.club/ecs"
|
||||||
|
"joylink.club/ecs/filter"
|
||||||
|
"joylink.club/rtsssimulation/component"
|
||||||
|
"joylink.club/rtsssimulation/entity"
|
||||||
|
"joylink.club/rtsssimulation/repository"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type PowerSourceSystem struct {
|
||||||
|
query *ecs.Query
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewPowerSourceSystem() *PowerSourceSystem {
|
||||||
|
return &PowerSourceSystem{
|
||||||
|
query: ecs.NewQuery(filter.Contains(component.UidType, component.PowerSourceType)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func (s *PowerSourceSystem) Update(w ecs.World) {
|
||||||
|
wd := entity.GetWorldData(w)
|
||||||
|
s.query.Each(w, func(entry *ecs.Entry) {
|
||||||
|
psId := component.UidType.Get(entry).Id
|
||||||
|
ps := component.PowerSourceType.Get(entry)
|
||||||
|
//
|
||||||
|
psModel := (wd.Repo.FindById(psId)).(*repository.PowerSource)
|
||||||
|
pipeId := psModel.PortA.Device().Id()
|
||||||
|
//电源传递电力给母线
|
||||||
|
pipeEntry := wd.EntityMap[pipeId]
|
||||||
|
powerPipe := component.PowerPipeType.Get(pipeEntry)
|
||||||
|
powerPipe.TransPower(psId, &component.ElePower{Ac: ps.Ac, Voltage: ps.Voltage, Fresh: time.Now().UnixMilli()})
|
||||||
|
})
|
||||||
|
}
|
@ -1,283 +0,0 @@
|
|||||||
package iscs_sys
|
|
||||||
|
|
||||||
import (
|
|
||||||
"joylink.club/ecs"
|
|
||||||
"joylink.club/ecs/filter"
|
|
||||||
"joylink.club/rtsssimulation/component"
|
|
||||||
"joylink.club/rtsssimulation/entity"
|
|
||||||
"joylink.club/rtsssimulation/repository"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// PowerTransmissionSystem 电力传递系统(电压传递)
|
|
||||||
type PowerTransmissionSystem struct {
|
|
||||||
queryPowerSource *ecs.Query //电力电源
|
|
||||||
queryPowerPipe *ecs.Query //电力母线
|
|
||||||
queryCircuitBreaker *ecs.Query //断路器
|
|
||||||
queryHandcart *ecs.Query //手车
|
|
||||||
queryDisconnector *ecs.Query //隔离开关
|
|
||||||
query3PositionSwitch *ecs.Query //三工位隔离开关
|
|
||||||
queryRectifier *ecs.Query //整流器
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewPowerTransmissionSystem() *PowerTransmissionSystem {
|
|
||||||
return &PowerTransmissionSystem{
|
|
||||||
queryPowerSource: ecs.NewQuery(filter.Contains(component.UidType, component.PowerSourceType)),
|
|
||||||
queryPowerPipe: ecs.NewQuery(filter.Contains(component.PowerPipeType)),
|
|
||||||
queryCircuitBreaker: ecs.NewQuery(filter.Contains(component.UidType, component.CircuitBreakerType)),
|
|
||||||
queryHandcart: ecs.NewQuery(filter.Contains(component.UidType, component.HandcartSwitchType)),
|
|
||||||
queryDisconnector: ecs.NewQuery(filter.Contains(component.UidType, component.DisconnectorType)),
|
|
||||||
query3PositionSwitch: ecs.NewQuery(filter.Contains(component.UidType, component.ThreePositionSwitchType)),
|
|
||||||
queryRectifier: ecs.NewQuery(filter.Contains(component.UidType, component.RectifierType)),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
func (s *PowerTransmissionSystem) Update(w ecs.World) {
|
|
||||||
s.powerSourceTransPower(w)
|
|
||||||
s.circuitBreakerTransPower(w)
|
|
||||||
s.handcartTransPower(w)
|
|
||||||
s.disconnectorTransPower(w)
|
|
||||||
s.threePositionSwitchTransPower(w)
|
|
||||||
s.pipeFittingTransPower(w)
|
|
||||||
s.rectifierTransPower(w)
|
|
||||||
s.powerPipePower(w)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 整流器电能传递
|
|
||||||
// 当线路接通时零线和负极电压规定值为1,当线路断开时零线和负极电压规定值为0
|
|
||||||
func (s *PowerTransmissionSystem) rectifierTransPower(w ecs.World) {
|
|
||||||
wd := entity.GetWorldData(w)
|
|
||||||
s.queryRectifier.Each(w, func(entry *ecs.Entry) {
|
|
||||||
rectifierId := component.UidType.Get(entry).Id
|
|
||||||
rectifierModel := wd.Repo.FindById(rectifierId).(*repository.Rectifier)
|
|
||||||
//
|
|
||||||
portL := rectifierModel.PortA //交火
|
|
||||||
//portN := rectifierModel.PortB //交零
|
|
||||||
portZ := rectifierModel.PortC //直正
|
|
||||||
portF := rectifierModel.PortD //直负
|
|
||||||
//
|
|
||||||
portLPipeEntry := wd.EntityMap[portL.Device().Id()]
|
|
||||||
portLPipe := component.PowerPipeType.Get(portLPipeEntry)
|
|
||||||
//
|
|
||||||
portZPipeEntry := wd.EntityMap[portZ.Device().Id()]
|
|
||||||
portZPipe := component.PowerPipeType.Get(portZPipeEntry)
|
|
||||||
portFPipeEntry := wd.EntityMap[portF.Device().Id()]
|
|
||||||
portFPipe := component.PowerPipeType.Get(portFPipeEntry)
|
|
||||||
//L->Z、F
|
|
||||||
for lpsId, lps := range portLPipe.Sources {
|
|
||||||
if lps.Ac {
|
|
||||||
dcVoltage := uint32(float64(lps.Voltage) * 0.9) //交流电压转直流电压
|
|
||||||
//L->Z
|
|
||||||
zps, zpsOk := portZPipe.Sources[lpsId]
|
|
||||||
if zpsOk {
|
|
||||||
zps.Voltage = dcVoltage
|
|
||||||
zps.Fresh = lps.Fresh - 1
|
|
||||||
zps.Ac = false
|
|
||||||
} else {
|
|
||||||
portZPipe.Sources[lpsId] = &component.ElePower{Ac: false, Voltage: dcVoltage, Fresh: lps.Fresh - 1}
|
|
||||||
}
|
|
||||||
//L->F
|
|
||||||
fps, fpsOk := portFPipe.Sources[lpsId]
|
|
||||||
dcFVoltage := uint32(0)
|
|
||||||
if dcVoltage > 0 {
|
|
||||||
dcFVoltage = 1
|
|
||||||
}
|
|
||||||
if fpsOk {
|
|
||||||
fps.Voltage = dcFVoltage
|
|
||||||
fps.Fresh = lps.Fresh - 1
|
|
||||||
fps.Ac = false
|
|
||||||
} else {
|
|
||||||
portFPipe.Sources[lpsId] = &component.ElePower{Ac: false, Voltage: dcFVoltage, Fresh: lps.Fresh - 1}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// 三工位隔离开关传递电能
|
|
||||||
func (s *PowerTransmissionSystem) threePositionSwitchTransPower(w ecs.World) {
|
|
||||||
wd := entity.GetWorldData(w)
|
|
||||||
s.query3PositionSwitch.Each(w, func(entry *ecs.Entry) {
|
|
||||||
breakerId := component.UidType.Get(entry).Id
|
|
||||||
closed := component.ThreePositionSwitchType.Get(entry).Position == component.StpClosedWorking
|
|
||||||
breakerModel := (wd.Repo.FindById(breakerId)).(*repository.ThreePositionSwitch)
|
|
||||||
breakerPortA := breakerModel.PortA
|
|
||||||
breakerPortB := breakerModel.PortB
|
|
||||||
s.towPipePortsTransPower(wd, closed, breakerPortA, breakerPortB)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// 隔离开关传递电能
|
|
||||||
func (s *PowerTransmissionSystem) disconnectorTransPower(w ecs.World) {
|
|
||||||
wd := entity.GetWorldData(w)
|
|
||||||
s.queryHandcart.Each(w, func(entry *ecs.Entry) {
|
|
||||||
breakerId := component.UidType.Get(entry).Id
|
|
||||||
closed := component.DisconnectorType.Get(entry).Closed
|
|
||||||
breakerModel := (wd.Repo.FindById(breakerId)).(*repository.Disconnector)
|
|
||||||
breakerPortA := breakerModel.PortA
|
|
||||||
breakerPortB := breakerModel.PortB
|
|
||||||
s.towPipePortsTransPower(wd, closed, breakerPortA, breakerPortB)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// 手车传递电能
|
|
||||||
func (s *PowerTransmissionSystem) handcartTransPower(w ecs.World) {
|
|
||||||
wd := entity.GetWorldData(w)
|
|
||||||
s.queryHandcart.Each(w, func(entry *ecs.Entry) {
|
|
||||||
breakerId := component.UidType.Get(entry).Id
|
|
||||||
closed := component.HandcartSwitchType.Get(entry).Position == component.HpClosed
|
|
||||||
breakerModel := (wd.Repo.FindById(breakerId)).(*repository.HandcartSwitch)
|
|
||||||
breakerPortA := breakerModel.PortA
|
|
||||||
breakerPortB := breakerModel.PortB
|
|
||||||
s.towPipePortsTransPower(wd, closed, breakerPortA, breakerPortB)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// 断路器传递电能
|
|
||||||
func (s *PowerTransmissionSystem) circuitBreakerTransPower(w ecs.World) {
|
|
||||||
wd := entity.GetWorldData(w)
|
|
||||||
s.queryCircuitBreaker.Each(w, func(entry *ecs.Entry) {
|
|
||||||
breakerId := component.UidType.Get(entry).Id
|
|
||||||
closed := component.CircuitBreakerType.Get(entry).Closed
|
|
||||||
breakerModel := (wd.Repo.FindById(breakerId)).(*repository.CircuitBreaker)
|
|
||||||
//断路器A端连接的管线
|
|
||||||
breakerPortA := breakerModel.PortA
|
|
||||||
//断路器B端连接的管线
|
|
||||||
breakerPortB := breakerModel.PortB
|
|
||||||
//传递电能
|
|
||||||
s.towPipePortsTransPower(wd, closed, breakerPortA, breakerPortB)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// 电力母线中电力计算
|
|
||||||
func (s *PowerTransmissionSystem) powerPipePower(w ecs.World) {
|
|
||||||
s.queryPowerPipe.Each(w, func(entry *ecs.Entry) {
|
|
||||||
pipe := component.PowerPipeType.Get(entry)
|
|
||||||
voltage := uint32(0)
|
|
||||||
ac := false
|
|
||||||
for _, power := range pipe.Sources {
|
|
||||||
if power.Voltage > voltage {
|
|
||||||
voltage = power.Voltage
|
|
||||||
ac = power.Ac
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//
|
|
||||||
pipe.Voltage = voltage
|
|
||||||
pipe.Ac = ac
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// 电源传递电能
|
|
||||||
func (s *PowerTransmissionSystem) powerSourceTransPower(w ecs.World) {
|
|
||||||
wd := entity.GetWorldData(w)
|
|
||||||
s.queryPowerSource.Each(w, func(entry *ecs.Entry) {
|
|
||||||
psId := component.UidType.Get(entry).Id
|
|
||||||
ps := component.PowerSourceType.Get(entry)
|
|
||||||
//
|
|
||||||
psModel := (wd.Repo.FindById(psId)).(*repository.PowerSource)
|
|
||||||
pipeId := psModel.PortA.Device().Id()
|
|
||||||
//电源传递电力给母线
|
|
||||||
pipeEntry := wd.EntityMap[pipeId]
|
|
||||||
powerPipe := component.PowerPipeType.Get(pipeEntry)
|
|
||||||
powerPipe.TransPower(psId, &component.ElePower{Ac: ps.Ac, Voltage: ps.Voltage, Fresh: time.Now().UnixMilli()})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// 母线管件传递电能
|
|
||||||
func (s *PowerTransmissionSystem) pipeFittingTransPower(w ecs.World) {
|
|
||||||
wd := entity.GetWorldData(w)
|
|
||||||
for _, pf := range wd.Repo.PipeFittingMap {
|
|
||||||
if pf.IsEle() {
|
|
||||||
//与管件连接的所有管线
|
|
||||||
pipes := pf.Ports()
|
|
||||||
//筛选出相对电源
|
|
||||||
pipePsMap := make(map[string]*component.ElePower)
|
|
||||||
for _, pipePort := range pipes {
|
|
||||||
pipeEntry := wd.EntityMap[pipePort.Device().Id()]
|
|
||||||
powerPipe := component.PowerPipeType.Get(pipeEntry)
|
|
||||||
for epId, ep := range powerPipe.Sources {
|
|
||||||
pipePs, ok := pipePsMap[epId]
|
|
||||||
if ok {
|
|
||||||
if ep.Fresh > pipePs.Fresh {
|
|
||||||
pipePsMap[epId] = ep
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
pipePsMap[epId] = ep
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//管件连接的管线间电能传递
|
|
||||||
for _, pipePort := range pipes {
|
|
||||||
for pipePsId, pipePs := range pipePsMap { //相对电源
|
|
||||||
pipeEntry := wd.EntityMap[pipePort.Device().Id()]
|
|
||||||
powerPipe := component.PowerPipeType.Get(pipeEntry)
|
|
||||||
pipePortPs, ok := powerPipe.Sources[pipePsId]
|
|
||||||
if ok {
|
|
||||||
if pipePs.Fresh > pipePortPs.Fresh {
|
|
||||||
*powerPipe.Sources[pipePsId] = *pipePs
|
|
||||||
powerPipe.Sources[pipePsId].Fresh -= 1 //保证相对性
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
powerPipe.Sources[pipePsId] = &component.ElePower{}
|
|
||||||
*powerPipe.Sources[pipePsId] = *pipePs
|
|
||||||
powerPipe.Sources[pipePsId].Fresh -= 1 //保证相对性
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 两位置开关传递电能(断路器、手车、隔离开关)
|
|
||||||
func (s *PowerTransmissionSystem) towPipePortsTransPower(
|
|
||||||
wd *component.WorldData,
|
|
||||||
closed bool,
|
|
||||||
breakerPortA *repository.PipePort,
|
|
||||||
breakerPortB *repository.PipePort) {
|
|
||||||
//断路器A端连接的管线
|
|
||||||
breakerPortAPipeEntry := wd.EntityMap[breakerPortA.Device().Id()]
|
|
||||||
breakerPortAPipe := component.PowerPipeType.Get(breakerPortAPipeEntry)
|
|
||||||
//断路器B端连接的管线
|
|
||||||
breakerPortBPipeEntry := wd.EntityMap[breakerPortB.Device().Id()]
|
|
||||||
breakerPortBPipe := component.PowerPipeType.Get(breakerPortBPipeEntry)
|
|
||||||
//A->B
|
|
||||||
for portAPipePsId, portAPipePs := range breakerPortAPipe.Sources { //A
|
|
||||||
portBPipePs, ok := breakerPortBPipe.Sources[portAPipePsId] //B
|
|
||||||
if ok {
|
|
||||||
if portAPipePs.Fresh > portBPipePs.Fresh {
|
|
||||||
*breakerPortBPipe.Sources[portAPipePsId] = *portAPipePs
|
|
||||||
breakerPortBPipe.Sources[portAPipePsId].Fresh -= 1
|
|
||||||
if !closed {
|
|
||||||
breakerPortBPipe.Sources[portAPipePsId].Voltage = 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
breakerPortBPipe.Sources[portAPipePsId] = &component.ElePower{}
|
|
||||||
*breakerPortBPipe.Sources[portAPipePsId] = *portAPipePs
|
|
||||||
breakerPortBPipe.Sources[portAPipePsId].Fresh -= 1
|
|
||||||
if !closed {
|
|
||||||
breakerPortBPipe.Sources[portAPipePsId].Voltage = 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//B->A
|
|
||||||
for portBPipePsId, portBPipePs := range breakerPortBPipe.Sources { //B
|
|
||||||
portAPipePs, ok := breakerPortAPipe.Sources[portBPipePsId] //A
|
|
||||||
if ok {
|
|
||||||
if portBPipePs.Fresh > portAPipePs.Fresh {
|
|
||||||
*breakerPortAPipe.Sources[portBPipePsId] = *portBPipePs
|
|
||||||
breakerPortAPipe.Sources[portBPipePsId].Fresh -= 1
|
|
||||||
if !closed {
|
|
||||||
breakerPortAPipe.Sources[portBPipePsId].Voltage = 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
breakerPortAPipe.Sources[portBPipePsId] = &component.ElePower{}
|
|
||||||
*breakerPortAPipe.Sources[portBPipePsId] = *portBPipePs
|
|
||||||
breakerPortAPipe.Sources[portBPipePsId].Fresh -= 1
|
|
||||||
if !closed {
|
|
||||||
breakerPortAPipe.Sources[portBPipePsId].Voltage = 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
74
sys/iscs_sys/iscs_pscada_rectifier.go
Normal file
74
sys/iscs_sys/iscs_pscada_rectifier.go
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
package iscs_sys
|
||||||
|
|
||||||
|
import (
|
||||||
|
"joylink.club/ecs"
|
||||||
|
"joylink.club/ecs/filter"
|
||||||
|
"joylink.club/rtsssimulation/component"
|
||||||
|
"joylink.club/rtsssimulation/entity"
|
||||||
|
"joylink.club/rtsssimulation/repository"
|
||||||
|
)
|
||||||
|
|
||||||
|
type RectifierSystem struct {
|
||||||
|
query *ecs.Query
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewRectifierSystem() *RectifierSystem {
|
||||||
|
return &RectifierSystem{
|
||||||
|
query: ecs.NewQuery(filter.Contains(component.UidType, component.RectifierType)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func (s *RectifierSystem) Update(w ecs.World) {
|
||||||
|
s.rectifierTransPower(w)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 整流器电能传递
|
||||||
|
// 当线路接通时零线和负极电压规定值为1,当线路断开时零线和负极电压规定值为0
|
||||||
|
func (s *RectifierSystem) rectifierTransPower(w ecs.World) {
|
||||||
|
wd := entity.GetWorldData(w)
|
||||||
|
s.query.Each(w, func(entry *ecs.Entry) {
|
||||||
|
rectifierId := component.UidType.Get(entry).Id
|
||||||
|
rectifierModel := wd.Repo.FindById(rectifierId).(*repository.Rectifier)
|
||||||
|
//
|
||||||
|
portL := rectifierModel.PortA //交火
|
||||||
|
//portN := rectifierModel.PortB //交零
|
||||||
|
portZ := rectifierModel.PortC //直正
|
||||||
|
portF := rectifierModel.PortD //直负
|
||||||
|
//
|
||||||
|
portLPipeEntry := wd.EntityMap[portL.Device().Id()]
|
||||||
|
portLPipe := component.PowerPipeType.Get(portLPipeEntry)
|
||||||
|
//
|
||||||
|
portZPipeEntry := wd.EntityMap[portZ.Device().Id()]
|
||||||
|
portZPipe := component.PowerPipeType.Get(portZPipeEntry)
|
||||||
|
portFPipeEntry := wd.EntityMap[portF.Device().Id()]
|
||||||
|
portFPipe := component.PowerPipeType.Get(portFPipeEntry)
|
||||||
|
//L->Z、F
|
||||||
|
for lpsId, lps := range portLPipe.Sources {
|
||||||
|
if lps.Ac {
|
||||||
|
dcVoltage := uint32(float64(lps.Voltage) * 0.9) //交流电压转直流电压
|
||||||
|
//L->Z
|
||||||
|
zps, zpsOk := portZPipe.Sources[lpsId]
|
||||||
|
if zpsOk {
|
||||||
|
zps.Voltage = dcVoltage
|
||||||
|
zps.Fresh = lps.Fresh - 1
|
||||||
|
zps.Ac = false
|
||||||
|
} else {
|
||||||
|
portZPipe.Sources[lpsId] = &component.ElePower{Ac: false, Voltage: dcVoltage, Fresh: lps.Fresh - 1}
|
||||||
|
}
|
||||||
|
//L->F
|
||||||
|
fps, fpsOk := portFPipe.Sources[lpsId]
|
||||||
|
dcFVoltage := uint32(0)
|
||||||
|
if dcVoltage > 0 {
|
||||||
|
dcFVoltage = 1
|
||||||
|
}
|
||||||
|
if fpsOk {
|
||||||
|
fps.Voltage = dcFVoltage
|
||||||
|
fps.Fresh = lps.Fresh - 1
|
||||||
|
fps.Ac = false
|
||||||
|
} else {
|
||||||
|
portFPipe.Sources[lpsId] = &component.ElePower{Ac: false, Voltage: dcFVoltage, Fresh: lps.Fresh - 1}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
@ -1,9 +0,0 @@
|
|||||||
package iscs_sys
|
|
||||||
|
|
||||||
import "joylink.club/ecs"
|
|
||||||
|
|
||||||
// PscadaSwitchSystem ISCS 电力监控系统开关相关
|
|
||||||
type PscadaSwitchSystem struct {
|
|
||||||
queryCircuitBreaker *ecs.Query
|
|
||||||
queryThreePositionSwitch *ecs.Query
|
|
||||||
}
|
|
36
sys/iscs_sys/iscs_pscada_three_position_switch.go
Normal file
36
sys/iscs_sys/iscs_pscada_three_position_switch.go
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
package iscs_sys
|
||||||
|
|
||||||
|
import (
|
||||||
|
"joylink.club/ecs"
|
||||||
|
"joylink.club/ecs/filter"
|
||||||
|
"joylink.club/rtsssimulation/component"
|
||||||
|
"joylink.club/rtsssimulation/entity"
|
||||||
|
"joylink.club/rtsssimulation/repository"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ThreePositionSwitchSystem struct {
|
||||||
|
query *ecs.Query
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewThreePositionSwitchSystem() *ThreePositionSwitchSystem {
|
||||||
|
return &ThreePositionSwitchSystem{
|
||||||
|
query: ecs.NewQuery(filter.Contains(component.UidType, component.ThreePositionSwitchType)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ThreePositionSwitchSystem) Update(w ecs.World) {
|
||||||
|
s.threePositionSwitchTransPower(w)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 三工位隔离开关传递电能
|
||||||
|
func (s *ThreePositionSwitchSystem) threePositionSwitchTransPower(w ecs.World) {
|
||||||
|
wd := entity.GetWorldData(w)
|
||||||
|
s.query.Each(w, func(entry *ecs.Entry) {
|
||||||
|
breakerId := component.UidType.Get(entry).Id
|
||||||
|
closed := component.ThreePositionSwitchType.Get(entry).Position == component.StpClosedWorking
|
||||||
|
breakerModel := (wd.Repo.FindById(breakerId)).(*repository.ThreePositionSwitch)
|
||||||
|
breakerPortA := breakerModel.PortA
|
||||||
|
breakerPortB := breakerModel.PortB
|
||||||
|
towPipePortsTransPower(wd, closed, breakerPortA, breakerPortB)
|
||||||
|
})
|
||||||
|
}
|
25
sys/iscs_sys/iscs_pscada_voltage_transformer.go
Normal file
25
sys/iscs_sys/iscs_pscada_voltage_transformer.go
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
package iscs_sys
|
||||||
|
|
||||||
|
import (
|
||||||
|
"joylink.club/ecs"
|
||||||
|
"joylink.club/ecs/filter"
|
||||||
|
"joylink.club/rtsssimulation/component"
|
||||||
|
)
|
||||||
|
|
||||||
|
type VoltageTransformerSystem struct {
|
||||||
|
query *ecs.Query
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewVoltageTransformerSystem() *VoltageTransformerSystem {
|
||||||
|
return &VoltageTransformerSystem{
|
||||||
|
query: ecs.NewQuery(filter.Contains(component.UidType, component.VoltageTransformerType)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func (s *VoltageTransformerSystem) Update(w ecs.World) {
|
||||||
|
s.voltageTransformerTransPower(w)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 变压器电力传递
|
||||||
|
func (s *VoltageTransformerSystem) voltageTransformerTransPower(w ecs.World) {
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user