Compare commits

..

1 Commits

Author SHA1 Message Date
mathis_s 488d9c1279 Updated sinqMotor to new 1.6.0
Test And Build / Lint (push) Failing after 4s
Test And Build / Build (push) Successful in 7s
2026-02-11 11:05:48 +01:00
5 changed files with 140 additions and 195 deletions
+3 -1
View File
@@ -7,7 +7,9 @@ EPICS_VERSIONS=7.0.7
ARCH_FILTER=RHEL% ARCH_FILTER=RHEL%
# Specify the version of asynMotor we want to build against # Specify the version of asynMotor we want to build against
motorBase_VERSION=7.3.2 motorBase_VERSION=7.2.2
LIBVERSION=homeerror
# These headers allow to depend on this library for derived drivers. # These headers allow to depend on this library for derived drivers.
HEADERS += src/masterMacsAxis.h HEADERS += src/masterMacsAxis.h
+95 -139
View File
@@ -11,11 +11,6 @@
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
enum moveMode {
positionMode,
velocityMode,
};
struct masterMacsAxisImpl { struct masterMacsAxisImpl {
/* /*
The axis status and axis error of MasterMACS are given as an integer from The axis status and axis error of MasterMACS are given as an integer from
@@ -29,7 +24,6 @@ struct masterMacsAxisImpl {
bool needInit = true; bool needInit = true;
bool targetReachedUninitialized; bool targetReachedUninitialized;
bool dynamicLimits; bool dynamicLimits;
moveMode lastMoveCommand;
}; };
/* /*
@@ -38,7 +32,7 @@ A special communication timeout is used in the following two cases:
2) First move command after enabling the motor 2) First move command after enabling the motor
This is due to MasterMACS running a powerup cycle, which can delay the answer. This is due to MasterMACS running a powerup cycle, which can delay the answer.
*/ */
#define PowerCycleTimeout 6.0 // Value in seconds #define PowerCycleTimeout 10.0 // Value in seconds
/* /*
Contains all instances of turboPmacAxis which have been created and is used in Contains all instances of turboPmacAxis which have been created and is used in
@@ -81,6 +75,10 @@ void appendErrorMessage(char *fullMessage, size_t capacityFullMessage,
// fullMessage suffices. We need capacity for one additional character // fullMessage suffices. We need capacity for one additional character
// because of the linebreak. // because of the linebreak.
if (lenFullMessage + lenToBeAppended + 1 < capacityFullMessage) { if (lenFullMessage + lenToBeAppended + 1 < capacityFullMessage) {
// Append the linebreak and readd the null terminator behind it
// fullMessage[lenFullMessage] = '\n';
// fullMessage[lenFullMessage + 1] = '\0';
// We check before that the capacity of fullMessage is sufficient // We check before that the capacity of fullMessage is sufficient
strcat(fullMessage, toBeAppended); strcat(fullMessage, toBeAppended);
} }
@@ -96,7 +94,6 @@ masterMacsAxis::masterMacsAxis(masterMacsController *pC, int axisNo)
.timeAtHandshake = 0, .timeAtHandshake = 0,
.targetReachedUninitialized = true, .targetReachedUninitialized = true,
.dynamicLimits = false, .dynamicLimits = false,
.lastMoveCommand = positionMode,
})) { })) {
asynStatus status = asynSuccess; asynStatus status = asynSuccess;
@@ -154,9 +151,9 @@ masterMacsAxis::masterMacsAxis(masterMacsController *pC, int axisNo)
} }
// Even though this happens already in sinqAxis, a default value for // Even though this happens already in sinqAxis, a default value for
// motorErrorMessage is set here again, because apparently the sinqAxis // motorMessageText is set here again, because apparently the sinqAxis
// constructor is not run before the string is accessed? // constructor is not run before the string is accessed?
status = setStringParam(pC_->motorErrorMessage(), ""); status = setStringParam(pC_->motorMessageText(), "");
if (status != asynSuccess) { if (status != asynSuccess) {
asynPrint(pC_->pasynUser(), ASYN_TRACE_ERROR, asynPrint(pC_->pasynUser(), ASYN_TRACE_ERROR,
"Controller \"%s\", axis %d => %s, line %d:\nFATAL ERROR " "Controller \"%s\", axis %d => %s, line %d:\nFATAL ERROR "
@@ -263,7 +260,7 @@ asynStatus masterMacsAxis::init() {
__PRETTY_FUNCTION__, __LINE__); __PRETTY_FUNCTION__, __LINE__);
} }
status = setVeloFields(abs(motVelocity), 0.0, motVmax); status = setVeloFields(motVelocity, 0.0, motVmax);
if (status != asynSuccess) { if (status != asynSuccess) {
return status; return status;
} }
@@ -389,7 +386,10 @@ asynStatus masterMacsAxis::readLimits() {
highLimit = highLimit - limitsOffset; highLimit = highLimit - limitsOffset;
lowLimit = lowLimit + limitsOffset; lowLimit = lowLimit + limitsOffset;
return setLimits(highLimit, lowLimit); setAxisParamChecked(this, motorHighLimitFromDriver, highLimit);
setAxisParamChecked(this, motorLowLimitFromDriver, lowLimit);
return status;
} }
// Perform the actual poll // Perform the actual poll
@@ -399,10 +399,10 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
asynStatus poll_status = asynSuccess; asynStatus poll_status = asynSuccess;
// Status of read-write-operations of ASCII commands to the controller // Status of read-write-operations of ASCII commands to the controller
asynStatus rwStatus = asynSuccess; asynStatus rw_status = asynSuccess;
// Status of parameter library operations // Status of parameter library operations
asynStatus plStatus = asynSuccess; asynStatus pl_status = asynSuccess;
char response[pC_->MAXBUF_] = {0}; char response[pC_->MAXBUF_] = {0};
int nvals = 0; int nvals = 0;
@@ -443,19 +443,16 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
} }
if (timedOut) { if (timedOut) {
char msg[pC_->MAXBUF_]; setAxisParamChecked(this, motorMessageText,
snprintf(msg, sizeof(msg), "Timed out while waiting for a handshake. "
"Controller \"%s\", axis %d: Timed out while waiting for " "Please call the support.");
"a handshake. Please call the support.",
pC_->portName, axisNo());
setAxisParamChecked(this, motorErrorMessage, msg);
poll_status = asynError; poll_status = asynError;
} }
pC_->read(axisNo_, 86, response); pC_->read(axisNo_, 86, response);
if (rwStatus != asynSuccess) { if (rw_status != asynSuccess) {
return rwStatus; return rw_status;
} }
nvals = sscanf(response, "%lf", &handshakePerformed); nvals = sscanf(response, "%lf", &handshakePerformed);
@@ -481,20 +478,38 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
getAxisParamChecked(this, motorRecResolution, &motorRecResolution); getAxisParamChecked(this, motorRecResolution, &motorRecResolution);
// Read the previous motor position // Read the previous motor position
plStatus = motorPosition(&previousPosition); pl_status = motorPosition(&previousPosition);
if (plStatus != asynSuccess) { if (pl_status != asynSuccess) {
return plStatus; return pl_status;
} }
// Update the axis status // Update the axis status
rwStatus = readAxisStatus(); rw_status = readAxisStatus();
if (rwStatus != asynSuccess) { if (rw_status != asynSuccess) {
return rwStatus; return rw_status;
} }
rwStatus = pC_->read(axisNo_, 12, response); // If we wait for a handshake, but the motor was moving in its last poll
if (rwStatus != asynSuccess) { // cycle and has reached its target, it is not moving. Otherwise it is
return rwStatus; // considered moving, even if we're still waiting for the handshake.
if (pMasterMacsA_->targetReachedUninitialized) {
*moving = false;
} else {
if (targetReached() || !switchedOn()) {
*moving = false;
} else {
*moving = true;
}
}
if (targetReached()) {
pMasterMacsA_->targetReachedUninitialized = false;
}
// Read the current position
rw_status = pC_->read(axisNo_, 12, response);
if (rw_status != asynSuccess) {
return rw_status;
} }
nvals = sscanf(response, "%lf", &currentPosition); nvals = sscanf(response, "%lf", &currentPosition);
if (nvals != 1) { if (nvals != 1) {
@@ -502,59 +517,12 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
__PRETTY_FUNCTION__, __LINE__); __PRETTY_FUNCTION__, __LINE__);
} }
plStatus = setMotorPosition(currentPosition);
if (plStatus != asynSuccess) {
return plStatus;
}
setAxisParamChecked(this, motorEncoderPosition, currentPosition);
if (pMasterMacsA_->lastMoveCommand == velocityMode && !speedEqualZero()) {
double actualVelocity = 0.0;
rwStatus = pC_->read(axisNo_, 14, response);
if (rwStatus != asynSuccess) {
return rwStatus;
}
nvals = sscanf(response, "%lf", &actualVelocity);
if (nvals != 1) {
return pC_->couldNotParseResponse("R14", response, axisNo_,
__PRETTY_FUNCTION__, __LINE__);
}
// Writes the actual speed in steps per second to the paramLib. This
// value is then returned by the RVEL field of the motor record.
setAxisParamChecked(this, motorVelocity,
actualVelocity / motorRecResolution);
// Motor is moving in velocity mode
*moving = true;
} else {
// If we wait for a handshake, but the motor was moving in its last poll
// cycle and has reached its target, it is not moving. Otherwise it is
// considered moving, even if we're still waiting for the handshake.
if (pMasterMacsA_->targetReachedUninitialized) {
*moving = false;
} else {
if (targetReached() || !switchedOn()) {
*moving = false;
} else {
*moving = true;
}
}
if (targetReached()) {
pMasterMacsA_->targetReachedUninitialized = false;
}
}
/* /*
Read out the error if either a fault condition status flag has been set Read out the error if either a fault condition status flag has been set or
or if a movement has just ended. if a movement has just ended.
*/ */
if (faultConditionSet() || !(*moving)) { if (faultConditionSet() || !(*moving)) {
rwStatus = readAxisError(); rw_status = readAxisError();
} }
msgPrintControlKey keyError = msgPrintControlKey( msgPrintControlKey keyError = msgPrintControlKey(
@@ -575,12 +543,9 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
pC_->getMsgPrintControl().getSuffix()); pC_->getMsgPrintControl().getSuffix());
} }
char msg[pC_->MAXBUF_]; setAxisParamChecked(this, motorMessageText,
snprintf(msg, sizeof(msg), "Communication error between PC and motor "
"Controller \"%s\", axis %d: Communication error between IOC " "controller. Please call the support.");
"and motor controller. Please call the support.",
pC_->portName, axisNo());
setAxisParamChecked(this, motorErrorMessage, msg);
poll_status = asynError; poll_status = asynError;
} else { } else {
@@ -589,16 +554,13 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
// error message by appending strings. // error message by appending strings.
char errorMessage[pC_->MAXBUF_] = {0}; char errorMessage[pC_->MAXBUF_] = {0};
char shellMessage[pC_->MAXBUF_] = {0}; char shellMessage[pC_->MAXBUF_] = {0};
snprintf(errorMessage, sizeof(errorMessage),
"Controller \"%s\", axis %d: ", pC_->portName, axisNo());
// Concatenate all other errors // Concatenate all other errors
if (shortCircuit()) { if (shortCircuit()) {
appendErrorMessage(shellMessage, sizeof(shellMessage), appendErrorMessage(shellMessage, sizeof(shellMessage),
"Short circuit fault."); "Short circuit fault.");
appendErrorMessage( appendErrorMessage(errorMessage, sizeof(errorMessage),
errorMessage, sizeof(errorMessage), "Short circuit error. Please call the support.");
"Short circuit error. Please call the support. ");
poll_status = asynError; poll_status = asynError;
} }
@@ -607,7 +569,7 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
appendErrorMessage(shellMessage, sizeof(shellMessage), appendErrorMessage(shellMessage, sizeof(shellMessage),
"Encoder error."); "Encoder error.");
appendErrorMessage(errorMessage, sizeof(errorMessage), appendErrorMessage(errorMessage, sizeof(errorMessage),
"Encoder error. Please call the support. "); "Encoder error. Please call the support.");
poll_status = asynError; poll_status = asynError;
} }
@@ -619,7 +581,7 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
errorMessage, sizeof(errorMessage), errorMessage, sizeof(errorMessage),
"Maximum allowed following error exceeded.Check if " "Maximum allowed following error exceeded.Check if "
"movement range is blocked. Otherwise please call the " "movement range is blocked. Otherwise please call the "
"support. "); "support.");
poll_status = asynError; poll_status = asynError;
} }
@@ -628,7 +590,7 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
appendErrorMessage(shellMessage, sizeof(shellMessage), appendErrorMessage(shellMessage, sizeof(shellMessage),
"Feedback error."); "Feedback error.");
appendErrorMessage(errorMessage, sizeof(errorMessage), appendErrorMessage(errorMessage, sizeof(errorMessage),
"Feedback error. Please call the support. "); "Feedback error. Please call the support.");
poll_status = asynError; poll_status = asynError;
} }
@@ -637,9 +599,9 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
If the motor is homing or has been homed, ignore limit switch errors. If the motor is homing or has been homed, ignore limit switch errors.
*/ */
int homing = 0; int homing = 0;
int at_home = 0; int homed = 0;
getAxisParamChecked(this, motorStatusHome, &homing); getAxisParamChecked(this, motorStatusHome, &homing);
getAxisParamChecked(this, motorStatusAtHome, &at_home); getAxisParamChecked(this, motorStatusHomed, &homed);
/* /*
Ignore limit switch errors when homing / motor has been homed or when Ignore limit switch errors when homing / motor has been homed or when
@@ -670,7 +632,7 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
moving would be set to true anyway. The check is here for clarity / moving would be set to true anyway. The check is here for clarity /
being explicit. being explicit.
*/ */
if (!homing && !at_home && !(*moving)) { if (!homing && !homed && !(*moving)) {
/* /*
Either the software limits or the end switches of the controller Either the software limits or the end switches of the controller
have been hit. Since the EPICS limits are derived from the software have been hit. Since the EPICS limits are derived from the software
@@ -707,7 +669,7 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
"Software limits or end switch hit. Try homing the motor, " "Software limits or end switch hit. Try homing the motor, "
"moving in the opposite direction or check the SPS for " "moving in the opposite direction or check the SPS for "
"errors (if available). Otherwise please call the " "errors (if available). Otherwise please call the "
"support. "); "support.");
poll_status = asynError; poll_status = asynError;
} }
@@ -717,7 +679,7 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
appendErrorMessage(shellMessage, sizeof(shellMessage), appendErrorMessage(shellMessage, sizeof(shellMessage),
"Overcurrent error."); "Overcurrent error.");
appendErrorMessage(errorMessage, sizeof(errorMessage), appendErrorMessage(errorMessage, sizeof(errorMessage),
"Overcurrent error. Please call the support. "); "Overcurrent error. Please call the support.");
poll_status = asynError; poll_status = asynError;
} }
@@ -727,7 +689,7 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
"Overtemperature error."); "Overtemperature error.");
appendErrorMessage( appendErrorMessage(
errorMessage, sizeof(errorMessage), errorMessage, sizeof(errorMessage),
"Overtemperature error. Please call the support. "); "Overtemperature error. Please call the support.");
poll_status = asynError; poll_status = asynError;
} }
@@ -736,7 +698,7 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
appendErrorMessage(shellMessage, sizeof(shellMessage), appendErrorMessage(shellMessage, sizeof(shellMessage),
"Overvoltage error."); "Overvoltage error.");
appendErrorMessage(errorMessage, sizeof(errorMessage), appendErrorMessage(errorMessage, sizeof(errorMessage),
"Overvoltage error. Please call the support. "); "Overvoltage error. Please call the support.");
poll_status = asynError; poll_status = asynError;
} }
@@ -745,7 +707,7 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
appendErrorMessage(shellMessage, sizeof(shellMessage), appendErrorMessage(shellMessage, sizeof(shellMessage),
"Undervoltage error."); "Undervoltage error.");
appendErrorMessage(errorMessage, sizeof(errorMessage), appendErrorMessage(errorMessage, sizeof(errorMessage),
"Undervoltage error. Please call the support. "); "Undervoltage error. Please call the support.");
poll_status = asynError; poll_status = asynError;
} }
@@ -754,7 +716,7 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
appendErrorMessage(shellMessage, sizeof(shellMessage), appendErrorMessage(shellMessage, sizeof(shellMessage),
"STO input is on disable state."); "STO input is on disable state.");
appendErrorMessage(errorMessage, sizeof(errorMessage), appendErrorMessage(errorMessage, sizeof(errorMessage),
"STO fault. Please call the support. "); "STO fault. Please call the support.");
poll_status = asynError; poll_status = asynError;
} }
@@ -770,7 +732,7 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
} }
} }
setAxisParamChecked(this, motorErrorMessage, errorMessage); setAxisParamChecked(this, motorMessageText, errorMessage);
} }
// No error has been detected -> Reset the error count // No error has been detected -> Reset the error count
@@ -781,9 +743,9 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
// Read out the limits, if the motor is not moving and if the limits are // Read out the limits, if the motor is not moving and if the limits are
// dynamic // dynamic
if (pMasterMacsA_->dynamicLimits && !(*moving)) { if (pMasterMacsA_->dynamicLimits && !(*moving)) {
rwStatus = readLimits(); rw_status = readLimits();
if (rwStatus != asynSuccess) { if (rw_status != asynSuccess) {
return rwStatus; return rw_status;
} }
} }
@@ -808,11 +770,16 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
setAxisParamChecked(this, motorStatusDone, !(*moving)); setAxisParamChecked(this, motorStatusDone, !(*moving));
setAxisParamChecked(this, motorStatusDirection, direction); setAxisParamChecked(this, motorStatusDirection, direction);
pl_status = setMotorPosition(currentPosition);
if (pl_status != asynSuccess) {
return pl_status;
}
return poll_status; return poll_status;
} }
asynStatus masterMacsAxis::moveVelocity(double minVelocity, double maxVelocity, asynStatus masterMacsAxis::doMoveVelocity(double minVelocity,
double acceleration) { double maxVelocity,
double acceleration) {
// Suppress unused variable warning // Suppress unused variable warning
(void)minVelocity; (void)minVelocity;
(void)acceleration; (void)acceleration;
@@ -863,14 +830,7 @@ asynStatus masterMacsAxis::moveVelocity(double minVelocity, double maxVelocity,
// Start the move. We do not use the MovTimeout watchdog here, because the // Start the move. We do not use the MovTimeout watchdog here, because the
// motor can move for any time in velocity mode. // motor can move for any time in velocity mode.
status = pC_->write(axisNo_, 00, "3", timeout); return pC_->write(axisNo_, 00, "3", timeout);
if (status != asynSuccess) {
return status;
}
// Cache the information that the current movement is in velocity mode
pMasterMacsA_->lastMoveCommand = velocityMode;
return status;
} }
asynStatus masterMacsAxis::doMove(double position, int relative, asynStatus masterMacsAxis::doMove(double position, int relative,
@@ -978,8 +938,6 @@ asynStatus masterMacsAxis::doMove(double position, int relative,
return asynError; return asynError;
} }
// Cache the information that the current movement is in position mode
pMasterMacsA_->lastMoveCommand = positionMode;
return status; return status;
} }
@@ -1124,6 +1082,7 @@ asynStatus masterMacsAxis::readEncoderType() {
asynStatus masterMacsAxis::enable(bool on) { asynStatus masterMacsAxis::enable(bool on) {
int timeout_enable_disable = 2;
char msg[pC_->MAXBUF_]; char msg[pC_->MAXBUF_];
// ========================================================================= // =========================================================================
@@ -1152,7 +1111,7 @@ asynStatus masterMacsAxis::enable(bool on) {
"idle and can therefore not be disabled.\n", "idle and can therefore not be disabled.\n",
pC_->portName, axisNo_, __PRETTY_FUNCTION__, __LINE__); pC_->portName, axisNo_, __PRETTY_FUNCTION__, __LINE__);
setAxisParamChecked(this, motorErrorMessage, setAxisParamChecked(this, motorMessageText,
"Axis cannot be disabled while it is moving."); "Axis cannot be disabled while it is moving.");
return asynError; return asynError;
@@ -1181,7 +1140,8 @@ asynStatus masterMacsAxis::enable(bool on) {
// hence we wait for a custom timespan in seconds instead of // hence we wait for a custom timespan in seconds instead of
// pC_->comTimeout_ // pC_->comTimeout_
double timeout = pC_->comTimeout(); double timeout = pC_->comTimeout();
if (timeout < PowerCycleTimeout) { if (pMasterMacsA_->targetReachedUninitialized &&
timeout < PowerCycleTimeout) {
timeout = PowerCycleTimeout; timeout = PowerCycleTimeout;
} }
@@ -1193,7 +1153,7 @@ asynStatus masterMacsAxis::enable(bool on) {
// Query the axis status every few milliseconds until the axis has been // Query the axis status every few milliseconds until the axis has been
// enabled or until the timeout has been reached // enabled or until the timeout has been reached
int startTime = time(NULL); int startTime = time(NULL);
while (time(NULL) < startTime + PowerCycleTimeout) { while (time(NULL) < startTime + timeout_enable_disable) {
// Read the axis status // Read the axis status
usleep(100000); usleep(100000);
@@ -1210,21 +1170,19 @@ asynStatus masterMacsAxis::enable(bool on) {
} }
} }
// Failed to change axis status within PowerCycleTimeout => Send a // Failed to change axis status within timeout_enable_disable => Send a
// corresponding message // corresponding message
asynPrint(pC_->pasynUser(), ASYN_TRACE_ERROR, asynPrint(pC_->pasynUser(), ASYN_TRACE_ERROR,
"Controller \"%s\", axis %d => %s, line %d:\nFailed to %s axis " "Controller \"%s\", axis %d => %s, line %d:\nFailed to %s axis "
"within %f seconds\n", "within %d seconds\n",
pC_->portName, axisNo_, __PRETTY_FUNCTION__, __LINE__, pC_->portName, axisNo_, __PRETTY_FUNCTION__, __LINE__,
on ? "enable" : "disable", PowerCycleTimeout); on ? "enable" : "disable", timeout_enable_disable);
// Output message to user // Output message to user
snprintf(msg, sizeof(msg), snprintf(msg, sizeof(msg), "Failed to %s within %d seconds",
"Controller \"%s\", axis %d: Failed to %s within %f seconds", on ? "enable" : "disable", timeout_enable_disable);
pC_->portName, axisNo_, on ? "enable" : "disable",
PowerCycleTimeout);
setAxisParamChecked(this, motorErrorMessage, msg); setAxisParamChecked(this, motorMessageText, msg);
return asynError; return asynError;
} }
@@ -1280,8 +1238,8 @@ asynStatus masterMacsAxis::readAxisStatus() {
// ========================================================================= // =========================================================================
asynStatus rwStatus = pC_->read(axisNo_, 10, response); asynStatus rw_status = pC_->read(axisNo_, 10, response);
if (rwStatus == asynSuccess) { if (rw_status == asynSuccess) {
float axisStatus = 0; float axisStatus = 0;
int nvals = sscanf(response, "%f", &axisStatus); int nvals = sscanf(response, "%f", &axisStatus);
@@ -1293,7 +1251,7 @@ asynStatus masterMacsAxis::readAxisStatus() {
pMasterMacsA_->axisStatus = toBitset(axisStatus); pMasterMacsA_->axisStatus = toBitset(axisStatus);
} }
return rwStatus; return rw_status;
} }
asynStatus masterMacsAxis::readAxisError() { asynStatus masterMacsAxis::readAxisError() {
@@ -1301,8 +1259,8 @@ asynStatus masterMacsAxis::readAxisError() {
// ========================================================================= // =========================================================================
asynStatus rwStatus = pC_->read(axisNo_, 11, response); asynStatus rw_status = pC_->read(axisNo_, 11, response);
if (rwStatus == asynSuccess) { if (rw_status == asynSuccess) {
float axisError = 0; float axisError = 0;
int nvals = sscanf(response, "%f", &axisError); int nvals = sscanf(response, "%f", &axisError);
@@ -1312,7 +1270,7 @@ asynStatus masterMacsAxis::readAxisError() {
} }
pMasterMacsA_->axisError = toBitset(axisError); pMasterMacsA_->axisError = toBitset(axisError);
} }
return rwStatus; return rw_status;
} }
bool masterMacsAxis::readyToBeSwitchedOn() { bool masterMacsAxis::readyToBeSwitchedOn() {
@@ -1339,8 +1297,6 @@ bool masterMacsAxis::remoteMode() { return pMasterMacsA_->axisStatus[9]; }
bool masterMacsAxis::targetReached() { return pMasterMacsA_->axisStatus[10]; } bool masterMacsAxis::targetReached() { return pMasterMacsA_->axisStatus[10]; }
bool masterMacsAxis::speedEqualZero() { return pMasterMacsA_->axisStatus[12]; }
bool masterMacsAxis::internalLimitActive() { bool masterMacsAxis::internalLimitActive() {
return pMasterMacsA_->axisStatus[11]; return pMasterMacsA_->axisStatus[11];
} }
+5 -9
View File
@@ -52,15 +52,17 @@ class HIDDEN masterMacsAxis : public sinqAxis {
asynStatus doPoll(bool *moving); asynStatus doPoll(bool *moving);
/** /**
* @brief TODO * @brief Implementation of the `doMoveVelocity` function from sinqAxis. The
* parameters are described in the documentation of
* `sinqAxis::doMoveVelocity`.
* *
* @param minVelocity * @param minVelocity
* @param maxVelocity * @param maxVelocity
* @param acceleration * @param acceleration
* @return asynStatus * @return asynStatus
*/ */
asynStatus moveVelocity(double minVelocity, double maxVelocity, asynStatus doMoveVelocity(double minVelocity, double maxVelocity,
double acceleration); double acceleration);
/** /**
* @brief Implementation of the `doMove` function from sinqAxis. The * @brief Implementation of the `doMove` function from sinqAxis. The
@@ -250,12 +252,6 @@ class HIDDEN masterMacsAxis : public sinqAxis {
*/ */
bool internalLimitActive(); bool internalLimitActive();
/**
* @brief Read the property from axisStatus (see masterMacsAxisImpl
* redefinition in masterMacsAxis.cpp)
*/
bool speedEqualZero();
// Bits 12 and 13 are unused // Bits 12 and 13 are unused
/** /**
+36 -45
View File
@@ -171,16 +171,17 @@ masterMacsController::masterMacsController(const char *portName,
// Compare to target values // Compare to target values
if (firmware_major_version() != major || if (firmware_major_version() != major ||
firmware_minor_version() > minor) { firmware_minor_version() > minor) {
asynPrint( asynPrint(this->pasynUser(), ASYN_TRACE_ERROR,
this->pasynUser(), ASYN_TRACE_ERROR, "Controller \"%s\" => %s, line %d\nFATAL ERROR "
"Controller \"%s\" => %s, line %d\nFATAL ERROR " "(Incorrect "
"(Incorrect version number of firmware: Expected major " "version number of firmware: Expected major "
"version equal to %d, got %d. Expected minor version " "version equal "
"equal to or larger than %d, got %d).\nTerminating " "to %d, got %d. Expected minor version equal to "
"IOC.\n", "or larger "
portName, __PRETTY_FUNCTION__, __LINE__, "than %d, got %d).\nTerminating IOC",
firmware_major_version(), major, portName, __PRETTY_FUNCTION__, __LINE__,
firmware_minor_version(), minor); firmware_major_version(), major,
firmware_minor_version(), minor);
exit(-1); exit(-1);
} }
} }
@@ -188,7 +189,7 @@ masterMacsController::masterMacsController(const char *portName,
asynPrint( asynPrint(
this->pasynUser(), ASYN_TRACE_ERROR, this->pasynUser(), ASYN_TRACE_ERROR,
"Controller \"%s\" => %s, line %d\nCould not read firmware " "Controller \"%s\" => %s, line %d\nCould not read firmware "
"version.\n", "version\n",
portName, __PRETTY_FUNCTION__, __LINE__); portName, __PRETTY_FUNCTION__, __LINE__);
} }
} }
@@ -247,7 +248,7 @@ asynStatus masterMacsController::writeRead(int axisNo, int tcpCmd,
asynStatus status = asynSuccess; asynStatus status = asynSuccess;
char fullCommand[MAXBUF_] = {0}; char fullCommand[MAXBUF_] = {0};
char fullResponse[MAXBUF_] = {0}; char fullResponse[MAXBUF_] = {0};
char drvMessage[MAXBUF_] = {0}; char drvMessageText[MAXBUF_] = {0};
int motorStatusProblem = 0; int motorStatusProblem = 0;
int valueStart = 0; int valueStart = 0;
@@ -305,7 +306,7 @@ asynStatus masterMacsController::writeRead(int axisNo, int tcpCmd,
adjustForPrint(printableCommand, fullCommand, MAXBUF_); adjustForPrint(printableCommand, fullCommand, MAXBUF_);
asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR,
"Controller \"%s\", axis %d => %s, line %d:\nError " "Controller \"%s\", axis %d => %s, line %d:\nError "
"%s while sending command %s to the controller.\n", "%s while sending command %s to the controller\n",
portName, axisNo, __PRETTY_FUNCTION__, __LINE__, portName, axisNo, __PRETTY_FUNCTION__, __LINE__,
stringifyAsynStatus(status), printableCommand); stringifyAsynStatus(status), printableCommand);
} }
@@ -318,7 +319,7 @@ asynStatus masterMacsController::writeRead(int axisNo, int tcpCmd,
case asynSuccess: case asynSuccess:
// We did get a response, but does it make sense and is it designated as // We did get a response, but does it make sense and is it designated as
// OK from the controller? This is checked here. // OK from the controller? This is checked here.
status = parseResponse(fullCommand, fullResponse, drvMessage, status = parseResponse(fullCommand, fullResponse, drvMessageText,
&valueStart, &valueStop, axisNo, tcpCmd, isRead); &valueStart, &valueStop, axisNo, tcpCmd, isRead);
// Read out the important information from the response // Read out the important information from the response
@@ -335,29 +336,23 @@ asynStatus masterMacsController::writeRead(int axisNo, int tcpCmd,
} }
break; break;
case asynTimeout: case asynTimeout:
snprintf(drvMessage, sizeof(drvMessage), snprintf(drvMessageText, sizeof(drvMessageText),
"Controller \"%s\", axis %d: Connection timeout. Please call " "Connection timeout. Please call the support.");
"the support.",
portName, axisNo);
break; break;
case asynDisconnected: case asynDisconnected:
snprintf(drvMessage, sizeof(drvMessage), snprintf(drvMessageText, sizeof(drvMessageText),
"Controller \"%s\", axis %d: Axis is disconnected.", portName, "Axis is not connected.");
axisNo);
break; break;
case asynDisabled: case asynDisabled:
snprintf(drvMessage, sizeof(drvMessage), snprintf(drvMessageText, sizeof(drvMessageText), "Axis is disabled.");
"Controller \"%s\", axis %d: Axis is disabled.", portName,
axisNo);
break; break;
case asynError: case asynError:
// Do nothing - error message has already been set. // Do nothing - error message drvMessageText has already been set.
break; break;
default: default:
snprintf(drvMessage, sizeof(drvMessage), snprintf(drvMessageText, sizeof(drvMessageText),
"Controller \"%s\", axis %d: Communication failed (%s). " "Communication failed (%s). Please call the support.",
"Please call the support.", stringifyAsynStatus(status));
portName, axisNo, stringifyAsynStatus(status));
break; break;
} }
@@ -391,7 +386,7 @@ asynStatus masterMacsController::writeRead(int axisNo, int tcpCmd,
getAxisParamChecked(axis, motorStatusProblem, &motorStatusProblem); getAxisParamChecked(axis, motorStatusProblem, &motorStatusProblem);
if (motorStatusProblem == 0) { if (motorStatusProblem == 0) {
setAxisParamChecked(axis, motorErrorMessage, drvMessage); setAxisParamChecked(axis, motorMessageText, drvMessageText);
setAxisParamChecked(axis, motorStatusProblem, true); setAxisParamChecked(axis, motorStatusProblem, true);
setAxisParamChecked(axis, motorStatusCommsError, false); setAxisParamChecked(axis, motorStatusCommsError, false);
} }
@@ -407,11 +402,11 @@ message!):
- [ENQ][LSB][MSB][PDO1] 1 R 2=12.819[ACK][CR] (No error) - [ENQ][LSB][MSB][PDO1] 1 R 2=12.819[ACK][CR] (No error)
- [ENQ][LSB][MSB][PDO1] 1 R 2=12.819[NAK][CR] (Communication failed) - [ENQ][LSB][MSB][PDO1] 1 R 2=12.819[NAK][CR] (Communication failed)
- [ENQ][LSB][MSB][PDO1] 1 S 10 [CAN][CR] (Driver tried to write with - [ENQ][LSB][MSB][PDO1] 1 S 10 [CAN][CR] (Driver tried to write with
a read-only command). Read out the second-to-last char of the a read-only command) Read out the second-to-last char of the
response and check if it is NAK or CAN. response and check if it is NAK or CAN.
*/ */
asynStatus masterMacsController::parseResponse( asynStatus masterMacsController::parseResponse(
const char *fullCommand, const char *fullResponse, char *drvMessage, const char *fullCommand, const char *fullResponse, char *drvMessageText,
int *valueStart, int *valueStop, int axisNo, int tcpCmd, bool isRead) { int *valueStart, int *valueStop, int axisNo, int tcpCmd, bool isRead) {
bool responseValid = false; bool responseValid = false;
@@ -474,9 +469,7 @@ asynStatus masterMacsController::parseResponse(
NAK NAK
This indicates that the axis is not connected. This is not an error! This indicates that the axis is not connected. This is not an error!
*/ */
snprintf(drvMessage, MAXBUF_, snprintf(drvMessageText, MAXBUF_, "Axis not connected.");
"Controller \"%s\", axis %d: Axis is disconnected.",
portName, axisNo);
// Motor was connected before -> Update the paramLib entry and PV // Motor was connected before -> Update the paramLib entry and PV
// to show it is now disconnected. // to show it is now disconnected.
@@ -500,14 +493,12 @@ asynStatus masterMacsController::parseResponse(
} }
} }
} }
return asynDisconnected; break;
} else if (fullResponse[i] == '\x18') { } else if (fullResponse[i] == '\x18') {
// CAN // CAN
snprintf( snprintf(drvMessageText, MAXBUF_,
drvMessage, MAXBUF_, "Tried to write with a read-only command. This is a "
"Controller \"%s\", axis %d: Tried to write with a " "bug, please call the support.");
"read-only command. This is a bug, please call the support.",
portName, axisNo);
if (getMsgPrintControl().shouldBePrinted(parseKey, true, if (getMsgPrintControl().shouldBePrinted(parseKey, true,
pasynUserSelf)) { pasynUserSelf)) {
@@ -560,10 +551,10 @@ asynStatus masterMacsController::parseResponse(
getMsgPrintControl().getSuffix()); getMsgPrintControl().getSuffix());
} }
snprintf(drvMessage, MAXBUF_, snprintf(drvMessageText, MAXBUF_,
"Controller \"%s\", axis %d: Mismatched response %s for " "Mismatched response %s to command %s. Please call the "
"command %s. Please call the support.", "support.",
portName, axisNo, printableResponse, printableCommand); printableResponse, printableCommand);
return asynError; return asynError;
} else { } else {
getMsgPrintControl().resetCount(responseMatchKey, pasynUserSelf); getMsgPrintControl().resetCount(responseMatchKey, pasynUserSelf);