using System; using ln.http.api; namespace ln.ethercat.controller.drives { public enum DriveStates { UNDEFINED, BOOT, INIT, READY, ERROR, POWERED, OPERATIONAL, } public enum DriveMode { UNDEFINED, TORQUE, SPEED, POSITION } public abstract class DriveController { protected ECMaster ECMaster { get; } [ESProperty] public UInt16 Slave { get; } [ESProperty] public bool IgnoredByController { get; set; } public DriveController(ECMaster ecMaster, UInt16 slave) { ECMaster = ecMaster; Slave = slave; } public abstract void Initialize(); /* called by controller before control loops and logic */ public abstract void UpdateStates(); /* called by controller after user logic */ public abstract void UpdateDrive(); [ESProperty] public abstract DriveStates DriveState { get; } [ESProperty] public abstract string OEMDriveState { get; } [ESProperty] public abstract Int32 ErrorCode { get; } [ESProperty] public abstract string ErrorText { get; } [ESMethod] public abstract void ClearFault(); [ESProperty] public abstract DriveMode DriveMode { get; set; } [ESProperty] public abstract string OEMDriveMode { get; } [ESMethod] public void PowerOn() => Power(true); [ESMethod] public void PowerOff() => Power(false); [ESMethod] public abstract void Power(bool poweron); [ESMethod] public void EnableDrive() => Enable(true); [ESMethod] public void DisableDrive() => Enable(false); [ESMethod] public abstract void Enable(bool enabled); [ESProperty] public abstract double ActualPosition { get; } [ESProperty] public abstract double ActualSpeed { get; } [ESProperty] public abstract double ActualTorque { get; } [ESProperty] public abstract double TargetPosition { get; set; } [ESProperty] public abstract double TargetSpeed { get; set; } [ESProperty] public abstract double TargetTorque { get; set; } [ESProperty] public abstract double ActualLoad { get; } [ESProperty] public virtual double TargetValue { get { switch (DriveMode) { case DriveMode.POSITION: return TargetPosition; case DriveMode.SPEED: return TargetSpeed; case DriveMode.TORQUE: return TargetTorque; default: return 0; } } set { switch (DriveMode) { case DriveMode.POSITION: TargetPosition = value; break; case DriveMode.SPEED: TargetSpeed = value; break; case DriveMode.TORQUE: TargetTorque = value; break; default: break; } } } } }