diff --git a/sinqMotor b/sinqMotor index 4e30331..2ef20e1 160000 --- a/sinqMotor +++ b/sinqMotor @@ -1 +1 @@ -Subproject commit 4e30331c92a1c212e4b5f46996e4b7853c559136 +Subproject commit 2ef20e1bc2138decc1ba314690ec246a628b2bb9 diff --git a/src/masterMacsAxis.cpp b/src/masterMacsAxis.cpp index 67d7cd0..aed95c5 100644 --- a/src/masterMacsAxis.cpp +++ b/src/masterMacsAxis.cpp @@ -635,13 +635,52 @@ asynStatus masterMacsAxis::doPoll(bool *moving) { int homed = 0; getAxisParamChecked(this, motorStatusHome, &homing); getAxisParamChecked(this, motorStatusHomed, &homed); - if (homing || homed) { + + // DEBUG + if (axisNo_ == 11) { + asynPrint(pC_->pasynUser(), ASYN_TRACE_ERROR, + "Homing: %d, homed: %d, moving: %d\n", homing, homed, + *moving); + } + + /* + Ignore limit switch errors when homing / motor has been homed or when + the motor is moving. + + Background: + MasterMACS controllers move the motor outside the allowed range defined + by the "software limits" defined within the controllers because they + need to hit the physical end switch to determine the motor position. The + motor then rests close to the end switch, which might be outside the + controller-side software limits. This leads to this error, which is then + forwarded to the user even though nothing went wrong. The three checks + are here to prevent this: + - "homing": Is set at the start of a homing maneuver and removed once + the motor does not move anymore => Prevents the error from showing up + during the homing procedure + - "homed": Is set after a homing maneuver has been finished => Prevents + the error from showing up while the motor is resting idle outside the + software limits. + - "moving": Prevents the error from showing up when moving out of the + homing position. + + If the motor hits the limits during normal operation, it is stopped by + the controller. Once stopped, moving is false and then the error is + shown to the user (because "homed" is not set). + + Note: strictly speaking, it is not necessary to check homing because + moving would be set to true anyway. The check is here for clarity / + being explicit. + */ + if (!homing && !homed && !(*moving)) { /* Either the software limits or the end switches of the controller have been hit. Since the EPICS limits are derived from the software limits and are a little bit smaller, these error cases can only happen if either the axis has an incremental encoder which is not - properly homed or if a bug occured. + properly homed or if the motor moved outside the limits while homing + (but in that case, the error is not shown, see previous + if-statement). */ if (positiveLimitSwitch() || negativeLimitSwitch() || positiveSoftwareLimit() || negativeSoftwareLimit()) {