92 lines
2.2 KiB
Go
92 lines
2.2 KiB
Go
package device_sys
|
||
|
||
import (
|
||
"joylink.club/ecs"
|
||
"joylink.club/ecs/filter"
|
||
"joylink.club/rtsssimulation/component"
|
||
"joylink.club/rtsssimulation/entity"
|
||
)
|
||
|
||
// MotorSystem 电机马达
|
||
type MotorSystem struct {
|
||
query *ecs.Query
|
||
}
|
||
|
||
func NewMotorSystem() *MotorSystem {
|
||
return &MotorSystem{
|
||
query: ecs.NewQuery(filter.Contains(component.UidType, component.MotorType)),
|
||
}
|
||
}
|
||
func (s *MotorSystem) Update(w ecs.World) {
|
||
wd := entity.GetWorldData(w)
|
||
s.query.Each(w, func(entry *ecs.Entry) {
|
||
motorId := component.UidType.Get(entry).Id
|
||
motor := component.MotorType.Get(entry)
|
||
if motor.Ms.OnForward() { //正转电源
|
||
if !motor.Forward && motor.Speed == 0 {
|
||
motor.Forward = true
|
||
}
|
||
} else if motor.Ms.OnReverse() { //反转电源
|
||
if motor.Forward && motor.Speed == 0 {
|
||
motor.Forward = false
|
||
}
|
||
}
|
||
//
|
||
model, ok := wd.Repo.FindById(motorId).(motorModel)
|
||
if !ok {
|
||
model = motorImpl //默认工频
|
||
}
|
||
//
|
||
speed := motor.Speed + s.calculateAc(motor, model)*float32(w.Tick())
|
||
if speed <= 0 {
|
||
speed = 0
|
||
}
|
||
//变频器
|
||
if entry.HasComponent(component.MotorFcType) {
|
||
fc := component.MotorFcType.Get(entry)
|
||
SPEED := 60 * float32(fc.F) //当前频率目标转速
|
||
if speed > SPEED {
|
||
speed = SPEED
|
||
}
|
||
} else {
|
||
if speed > model.MotorMaxSpeed() {
|
||
speed = model.MotorMaxSpeed()
|
||
}
|
||
}
|
||
//
|
||
motor.Speed = speed
|
||
})
|
||
}
|
||
|
||
func (s *MotorSystem) calculateAc(motor *component.Motor, model motorModel) float32 {
|
||
//大于0加速,小于0减速
|
||
ac := model.MotorMaxSpeed() / float32(model.MotorAcTime())
|
||
if motor.Ms.On() { //电源---正转或反转启动
|
||
if motor.Ms.OnForward() && motor.RunningReverse() || motor.Ms.OnReverse() && motor.RunningForward() {
|
||
ac = -ac
|
||
}
|
||
} else { //电源关闭
|
||
ac = -ac * 2 // r/ms
|
||
}
|
||
return ac
|
||
}
|
||
|
||
var motorImpl = &motorModelImpl{maxSpeed: 3000, acTime: 2000} //默认工频
|
||
type motorModel interface {
|
||
//MotorMaxSpeed 电机最大转速,r/min
|
||
MotorMaxSpeed() float32
|
||
//MotorAcTime 电机由静止加速到最大转速的时间,ms
|
||
MotorAcTime() uint16
|
||
}
|
||
type motorModelImpl struct {
|
||
maxSpeed float32
|
||
acTime uint16
|
||
}
|
||
|
||
func (m *motorModelImpl) MotorMaxSpeed() float32 {
|
||
return m.maxSpeed
|
||
}
|
||
func (m *motorModelImpl) MotorAcTime() uint16 {
|
||
return m.acTime
|
||
}
|