diff --git a/DUTs/Axis_Structures/ST_AxisInputs.TcDUT b/DUTs/Axis_Structures/ST_AxisInputs.TcDUT index 69818a3..2fd570f 100644 --- a/DUTs/Axis_Structures/ST_AxisInputs.TcDUT +++ b/DUTs/Axis_Structures/ST_AxisInputs.TcDUT @@ -10,6 +10,7 @@ STRUCT bAirpadPressurized AT %I*: BOOL; //Airpad pressurized bBrakeReleased AT %I*: BOOL; //External brake released fExternalPos AT %I*: LREAL; //External measurement tool + wBrakeTerminalDiagnositics AT %I*: WORD; //External brake output terminal diagnostics. END_STRUCT END_TYPE ]]> diff --git a/DUTs/Axis_Structures/ST_AxisStatus.TcDUT b/DUTs/Axis_Structures/ST_AxisStatus.TcDUT index fe4f65b..b5044e0 100644 --- a/DUTs/Axis_Structures/ST_AxisStatus.TcDUT +++ b/DUTs/Axis_Structures/ST_AxisStatus.TcDUT @@ -49,6 +49,8 @@ STRUCT bCommandHandlerMovePermit: BOOL; // True if command handler has given permit to move bCommandHandlerBufferingCommand: BOOL; //True if CommandHandler is waiting on a permit before releasing the command bCommandHandlerTimeoutError: BOOL; //True if CommandHandler did not receive a permit in time + bBrakeDiagnosticsOk: BOOL; //True if Brake Terminal Diagnostics Ok + bBrakeDiagnosticsOverTemperature: BOOL; //True if Brake Terminal has over termperature eInternalMotionCommand: E_MotionFunctions; stSwitchInfo: ST_SwitchInfo; //Trigger/Untrigger positions and values of switches END_STRUCT diff --git a/POUs/Motion/FB_Axis.TcPOU b/POUs/Motion/FB_Axis.TcPOU index 3cf7d83..cb53bbf 100644 --- a/POUs/Motion/FB_Axis.TcPOU +++ b/POUs/Motion/FB_Axis.TcPOU @@ -532,6 +532,7 @@ CASE eExternalBrake OF IF TON_DelayBrakeRelease.Q THEN IF NOT _stAxis.stStatus.bEnabled OR _stAxis.stStatus.bError + OR NOT _stAxis.stStatus.bBrakeDiagnosticsOk OR TON_BrakeOpeningTimeoutWhenFeedback.Q THEN _stAxis.stControl.bEnable := FALSE; _stAxis.stControl.bReleaseBrake := FALSE; @@ -543,6 +544,7 @@ CASE eExternalBrake OF END_IF IF _stAxis.stControl.bReleaseBrake + AND _stAxis.stStatus.bBrakeDiagnosticsOk AND ((_stAxis.stConfig.stAirpadBrake.bExternalBrakeFeedbackConnected AND _stAxis.stInputs.bBrakeReleased) OR NOT _stAxis.stConfig.stAirpadBrake.bExternalBrakeFeedbackConnected) THEN @@ -576,9 +578,10 @@ CASE eExternalBrake OF _stAxis.stControl.bEnable := FALSE; bEnableAmp := FALSE; eExternalBrake := E_ExternalBrake.eBrakeEngaged; - ELSIF _stAxis.stConfig.stAirpadBrake.bExternalBrakeFeedbackConnected - AND _stAxis.stControl.bReleaseBrake - AND NOT _stAxis.stInputs.bBrakeReleased THEN + ELSIF ((_stAxis.stConfig.stAirpadBrake.bExternalBrakeFeedbackConnected + AND NOT _stAxis.stInputs.bBrakeReleased) + OR NOT _stAxis.stStatus.bBrakeDiagnosticsOk) + AND _stAxis.stControl.bReleaseBrake THEN _stAxis.stControl.bReleaseBrake := FALSE; _stAxis.stControl.bEnable := FALSE; bEnableAmp := FALSE; @@ -612,6 +615,7 @@ END_CASE bReady := eExternalBrake = E_ExternalBrake.eBrakeReleased + AND _stAxis.stStatus.bBrakeDiagnosticsOk AND ((_stAxis.stConfig.stAirpadBrake.bExternalBrakeFeedbackConnected AND _stAxis.stInputs.bBrakeReleased) OR NOT _stAxis.stConfig.stAirpadBrake.bExternalBrakeFeedbackConnected); @@ -1640,6 +1644,13 @@ VAR_INST rtrigFwdLimit: R_TRIG; ftrigFwdLimit: F_TRIG; END_VAR + +VAR CONSTANT + BRAKE_OVER_TEMPERATURE : WORD := 16#0001; + BRAKE_OPEN_LOAD : WORD := 16#0002; + BRAKE_OVER_CURRENT : WORD := 16#0003; + BRAKE_SHORT_CIRCUIT : WORD := 16#0004; +END_VAR ]]> 0; +_stAxis.stStatus.bBrakeDiagnosticsOk := + (_stAxis.stInputs.wBrakeTerminalDiagnositics AND BRAKE_OPEN_LOAD) = 0 + AND (_stAxis.stInputs.wBrakeTerminalDiagnositics AND BRAKE_OVER_CURRENT) = 0 + AND (_stAxis.stInputs.wBrakeTerminalDiagnositics AND BRAKE_SHORT_CIRCUIT) = 0; + +{info 'NOTE: If terminal diagnostics is not used, a risk constitutes for an airpad/brake without feedback.'} IF _stAxis.stConfig.stAirpadBrake.bAirpadConnected AND NOT _stAxis.stConfig.stAirpadBrake.bExternalBrakeConnected THEN _stAxis.stStatus.bAxisReadyToMove :=