rts-sim-module/sys/iscs_sys/iscs_bas_fan.go
2023-12-26 14:45:41 +08:00

98 lines
2.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package iscs_sys
import (
"joylink.club/ecs"
"joylink.club/ecs/filter"
"joylink.club/rtsssimulation/component"
)
// FanSystem 风机
type FanSystem struct {
query *ecs.Query
}
// NewFanSystem 风机系统
func NewFanSystem() *FanSystem {
return &FanSystem{
query: ecs.NewQuery(filter.Contains(component.UidType, component.FanDeviceType, component.DeviceExceptionType)),
}
}
func (s *FanSystem) Update(w ecs.World) {
s.query.Each(w, func(entry *ecs.Entry) {
//fanId := component.UidType.Get(entry).Id
fan := component.FanDeviceType.Get(entry)
fan.Forward = fan.Fs.OnForward()
//fmt.Printf("==>>风机[%s] forward=%t speed=%f fan-switch=%d\n", fanId, fan.Forward, fan.Speed, fan.Fs)
//
speed := fan.Speed + s.calculateAc(fan, entry)*float32(w.Tick())
//
if speed <= 0 {
fan.Speed = 0
} else {
switch {
case entry.HasComponent(component.CommonFanTag): //一般风机(3000 r/min)
{
if speed > 3000 {
speed = 3000
}
}
case entry.HasComponent(component.SoftStartFanTag): //软启风机(100 r/min)
{
if speed > 100 {
speed = 100
}
}
case entry.HasComponent(component.HighLowSpeedFanTag): //双速风机(Low 2000 r/min ; High 7000 r/min)
{
highMode := component.FanHighLowSpeedModeType.Get(entry).HighMode
if highMode { //高速模式
if speed > 7000 {
speed = 7000
}
} else { //低速模式
if speed > 2000 {
speed = 2000
}
}
}
case entry.HasComponent(component.FcBypassFanTag):
//变频旁路风机
//电机转速与变频器频率关系 计算公式n=60f/p其中n是同步转速f是频率P是磁极对数
//变频器的额定输出频率一般为0-100HZ
//假设风机磁极对数为1则n=60f
{
fcUnit := component.FanFcUnitType.Get(entry)
SPEED := 60 * float32(fcUnit.F) //当前频率目标转速
if speed > SPEED {
speed = SPEED
}
}
}
//
fan.Speed = speed
}
})
}
// 计算风机加速度
func (s *FanSystem) calculateAc(fan *component.FanDevice, fanEntry *ecs.Entry) float32 {
//大于0加速小于0减速
ac := float32(0)
//
softStart := false
if fanEntry.HasComponent(component.FanSoftStartUnitType) {
softStart = component.FanSoftStartUnitType.Get(fanEntry).SoftStart
}
//
if fan.Fs.On() { //电源---正转或反转启动
if softStart {
ac = 0.02 // r/ms
} else {
ac = 1.5 // r/ms
}
} else { //电源关闭
ac = -3 // r/ms
}
return ac
}