diff --git a/ln.ethercat/controller/Controller.cs b/ln.ethercat/controller/Controller.cs index eeee2cc..670364a 100644 --- a/ln.ethercat/controller/Controller.cs +++ b/ln.ethercat/controller/Controller.cs @@ -11,6 +11,8 @@ namespace ln.ethercat.controller public delegate void ControllerLogicDelegate(Controller controller); public delegate void ControllerStateChangeDelegate(Controller controller, ControllerStates newState); + public delegate bool ControllerIsSafeToEnable(Controller controller); + public enum ControllerStates { NONE, NOTREADY, @@ -27,6 +29,8 @@ namespace ln.ethercat.controller public event ControllerStateChangeDelegate OnStateChanging; public event ControllerStateChangeDelegate OnStateChanged; + public event ControllerIsSafeToEnable OnIsSafeToEnable; + public ECMaster ECMaster { get; } [ESProperty] @@ -169,12 +173,25 @@ namespace ln.ethercat.controller { if (ControllerState == ControllerStates.READY) { - ChangeState(ControllerStates.ENABLING); + if (!IsSafeToEnable()) + ChangeState(ControllerStates.FAULT); + else + ChangeState(ControllerStates.ENABLING); } else { Logging.Log(LogLevel.INFO, "Controller: EnableDrives(): Current ControllerState={0}. Refusing to enable drives", ControllerState.ToString()); } } + public bool IsSafeToEnable() + { + foreach (ControllerIsSafeToEnable ciste in OnIsSafeToEnable.GetInvocationList()) + { + if (!ciste(this)) + return false; + } + return true; + } + [ESMethod] public void ClearFaults() { diff --git a/ln.ethercat/controller/ControllerRemote.cs b/ln.ethercat/controller/ControllerRemote.cs index 7236748..5eaf613 100644 --- a/ln.ethercat/controller/ControllerRemote.cs +++ b/ln.ethercat/controller/ControllerRemote.cs @@ -70,6 +70,8 @@ namespace ln.ethercat.controller protected abstract void Cycle(); protected abstract void Shutdown(); + public abstract bool IsSafeToEnable(); + private void CycleThread() { CycleCounter = 0; diff --git a/ln.ethercat/controller/remote/StupidSerialRemote.cs b/ln.ethercat/controller/remote/StupidSerialRemote.cs index 917b187..9573fd7 100644 --- a/ln.ethercat/controller/remote/StupidSerialRemote.cs +++ b/ln.ethercat/controller/remote/StupidSerialRemote.cs @@ -241,5 +241,10 @@ namespace ln.ethercat.controller.remote stopReceiverThread = true; serialPort.Close(); } + + public override bool IsSafeToEnable() + { + return (MainTarget==0) && (FeedTarget == 0); + } } } \ No newline at end of file