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%
# 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.
HEADERS += src/masterMacsAxis.h
+95 -139
View File
@@ -11,11 +11,6 @@
#include <string.h>
#include <unistd.h>
enum moveMode {
positionMode,
velocityMode,
};
struct masterMacsAxisImpl {
/*
The axis status and axis error of MasterMACS are given as an integer from
@@ -29,7 +24,6 @@ struct masterMacsAxisImpl {
bool needInit = true;
bool targetReachedUninitialized;
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
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
@@ -81,6 +75,10 @@ void appendErrorMessage(char *fullMessage, size_t capacityFullMessage,
// fullMessage suffices. We need capacity for one additional character
// because of the linebreak.
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
strcat(fullMessage, toBeAppended);
}
@@ -96,7 +94,6 @@ masterMacsAxis::masterMacsAxis(masterMacsController *pC, int axisNo)
.timeAtHandshake = 0,
.targetReachedUninitialized = true,
.dynamicLimits = false,
.lastMoveCommand = positionMode,
})) {
asynStatus status = asynSuccess;
@@ -154,9 +151,9 @@ masterMacsAxis::masterMacsAxis(masterMacsController *pC, int axisNo)
}
// 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?
status = setStringParam(pC_->motorErrorMessage(), "");
status = setStringParam(pC_->motorMessageText(), "");
if (status != asynSuccess) {
asynPrint(pC_->pasynUser(), ASYN_TRACE_ERROR,
"Controller \"%s\", axis %d => %s, line %d:\nFATAL ERROR "
@@ -263,7 +260,7 @@ asynStatus masterMacsAxis::init() {
__PRETTY_FUNCTION__, __LINE__);
}
status = setVeloFields(abs(motVelocity), 0.0, motVmax);
status = setVeloFields(motVelocity, 0.0, motVmax);
if (status != asynSuccess) {
return status;
}
@@ -389,7 +386,10 @@ asynStatus masterMacsAxis::readLimits() {
highLimit = highLimit - limitsOffset;
lowLimit = lowLimit + limitsOffset;
return setLimits(highLimit, lowLimit);
setAxisParamChecked(this, motorHighLimitFromDriver, highLimit);
setAxisParamChecked(this, motorLowLimitFromDriver, lowLimit);
return status;
}
// Perform the actual poll
@@ -399,10 +399,10 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
asynStatus poll_status = asynSuccess;
// Status of read-write-operations of ASCII commands to the controller
asynStatus rwStatus = asynSuccess;
asynStatus rw_status = asynSuccess;
// Status of parameter library operations
asynStatus plStatus = asynSuccess;
asynStatus pl_status = asynSuccess;
char response[pC_->MAXBUF_] = {0};
int nvals = 0;
@@ -443,19 +443,16 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
}
if (timedOut) {
char msg[pC_->MAXBUF_];
snprintf(msg, sizeof(msg),
"Controller \"%s\", axis %d: Timed out while waiting for "
"a handshake. Please call the support.",
pC_->portName, axisNo());
setAxisParamChecked(this, motorErrorMessage, msg);
setAxisParamChecked(this, motorMessageText,
"Timed out while waiting for a handshake. "
"Please call the support.");
poll_status = asynError;
}
pC_->read(axisNo_, 86, response);
if (rwStatus != asynSuccess) {
return rwStatus;
if (rw_status != asynSuccess) {
return rw_status;
}
nvals = sscanf(response, "%lf", &handshakePerformed);
@@ -481,20 +478,38 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
getAxisParamChecked(this, motorRecResolution, &motorRecResolution);
// Read the previous motor position
plStatus = motorPosition(&previousPosition);
if (plStatus != asynSuccess) {
return plStatus;
pl_status = motorPosition(&previousPosition);
if (pl_status != asynSuccess) {
return pl_status;
}
// Update the axis status
rwStatus = readAxisStatus();
if (rwStatus != asynSuccess) {
return rwStatus;
rw_status = readAxisStatus();
if (rw_status != asynSuccess) {
return rw_status;
}
rwStatus = pC_->read(axisNo_, 12, response);
if (rwStatus != asynSuccess) {
return rwStatus;
// 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 the current position
rw_status = pC_->read(axisNo_, 12, response);
if (rw_status != asynSuccess) {
return rw_status;
}
nvals = sscanf(response, "%lf", &currentPosition);
if (nvals != 1) {
@@ -502,59 +517,12 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
__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
or if a movement has just ended.
Read out the error if either a fault condition status flag has been set or
if a movement has just ended.
*/
if (faultConditionSet() || !(*moving)) {
rwStatus = readAxisError();
rw_status = readAxisError();
}
msgPrintControlKey keyError = msgPrintControlKey(
@@ -575,12 +543,9 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
pC_->getMsgPrintControl().getSuffix());
}
char msg[pC_->MAXBUF_];
snprintf(msg, sizeof(msg),
"Controller \"%s\", axis %d: Communication error between IOC "
"and motor controller. Please call the support.",
pC_->portName, axisNo());
setAxisParamChecked(this, motorErrorMessage, msg);
setAxisParamChecked(this, motorMessageText,
"Communication error between PC and motor "
"controller. Please call the support.");
poll_status = asynError;
} else {
@@ -589,16 +554,13 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
// error message by appending strings.
char errorMessage[pC_->MAXBUF_] = {0};
char shellMessage[pC_->MAXBUF_] = {0};
snprintf(errorMessage, sizeof(errorMessage),
"Controller \"%s\", axis %d: ", pC_->portName, axisNo());
// Concatenate all other errors
if (shortCircuit()) {
appendErrorMessage(shellMessage, sizeof(shellMessage),
"Short circuit fault.");
appendErrorMessage(
errorMessage, sizeof(errorMessage),
"Short circuit error. Please call the support. ");
appendErrorMessage(errorMessage, sizeof(errorMessage),
"Short circuit error. Please call the support.");
poll_status = asynError;
}
@@ -607,7 +569,7 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
appendErrorMessage(shellMessage, sizeof(shellMessage),
"Encoder error.");
appendErrorMessage(errorMessage, sizeof(errorMessage),
"Encoder error. Please call the support. ");
"Encoder error. Please call the support.");
poll_status = asynError;
}
@@ -619,7 +581,7 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
errorMessage, sizeof(errorMessage),
"Maximum allowed following error exceeded.Check if "
"movement range is blocked. Otherwise please call the "
"support. ");
"support.");
poll_status = asynError;
}
@@ -628,7 +590,7 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
appendErrorMessage(shellMessage, sizeof(shellMessage),
"Feedback error.");
appendErrorMessage(errorMessage, sizeof(errorMessage),
"Feedback error. Please call the support. ");
"Feedback error. Please call the support.");
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.
*/
int homing = 0;
int at_home = 0;
int homed = 0;
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
@@ -670,7 +632,7 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
moving would be set to true anyway. The check is here for clarity /
being explicit.
*/
if (!homing && !at_home && !(*moving)) {
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
@@ -707,7 +669,7 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
"Software limits or end switch hit. Try homing the motor, "
"moving in the opposite direction or check the SPS for "
"errors (if available). Otherwise please call the "
"support. ");
"support.");
poll_status = asynError;
}
@@ -717,7 +679,7 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
appendErrorMessage(shellMessage, sizeof(shellMessage),
"Overcurrent error.");
appendErrorMessage(errorMessage, sizeof(errorMessage),
"Overcurrent error. Please call the support. ");
"Overcurrent error. Please call the support.");
poll_status = asynError;
}
@@ -727,7 +689,7 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
"Overtemperature error.");
appendErrorMessage(
errorMessage, sizeof(errorMessage),
"Overtemperature error. Please call the support. ");
"Overtemperature error. Please call the support.");
poll_status = asynError;
}
@@ -736,7 +698,7 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
appendErrorMessage(shellMessage, sizeof(shellMessage),
"Overvoltage error.");
appendErrorMessage(errorMessage, sizeof(errorMessage),
"Overvoltage error. Please call the support. ");
"Overvoltage error. Please call the support.");
poll_status = asynError;
}
@@ -745,7 +707,7 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
appendErrorMessage(shellMessage, sizeof(shellMessage),
"Undervoltage error.");
appendErrorMessage(errorMessage, sizeof(errorMessage),
"Undervoltage error. Please call the support. ");
"Undervoltage error. Please call the support.");
poll_status = asynError;
}
@@ -754,7 +716,7 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
appendErrorMessage(shellMessage, sizeof(shellMessage),
"STO input is on disable state.");
appendErrorMessage(errorMessage, sizeof(errorMessage),
"STO fault. Please call the support. ");
"STO fault. Please call the support.");
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
@@ -781,9 +743,9 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
// Read out the limits, if the motor is not moving and if the limits are
// dynamic
if (pMasterMacsA_->dynamicLimits && !(*moving)) {
rwStatus = readLimits();
if (rwStatus != asynSuccess) {
return rwStatus;
rw_status = readLimits();
if (rw_status != asynSuccess) {
return rw_status;
}
}
@@ -808,11 +770,16 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
setAxisParamChecked(this, motorStatusDone, !(*moving));
setAxisParamChecked(this, motorStatusDirection, direction);
pl_status = setMotorPosition(currentPosition);
if (pl_status != asynSuccess) {
return pl_status;
}
return poll_status;
}
asynStatus masterMacsAxis::moveVelocity(double minVelocity, double maxVelocity,
double acceleration) {
asynStatus masterMacsAxis::doMoveVelocity(double minVelocity,
double maxVelocity,
double acceleration) {
// Suppress unused variable warning
(void)minVelocity;
(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
// motor can move for any time in velocity mode.
status = 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;
return pC_->write(axisNo_, 00, "3", timeout);
}
asynStatus masterMacsAxis::doMove(double position, int relative,
@@ -978,8 +938,6 @@ asynStatus masterMacsAxis::doMove(double position, int relative,
return asynError;
}
// Cache the information that the current movement is in position mode
pMasterMacsA_->lastMoveCommand = positionMode;
return status;
}
@@ -1124,6 +1082,7 @@ asynStatus masterMacsAxis::readEncoderType() {
asynStatus masterMacsAxis::enable(bool on) {
int timeout_enable_disable = 2;
char msg[pC_->MAXBUF_];
// =========================================================================
@@ -1152,7 +1111,7 @@ asynStatus masterMacsAxis::enable(bool on) {
"idle and can therefore not be disabled.\n",
pC_->portName, axisNo_, __PRETTY_FUNCTION__, __LINE__);
setAxisParamChecked(this, motorErrorMessage,
setAxisParamChecked(this, motorMessageText,
"Axis cannot be disabled while it is moving.");
return asynError;
@@ -1181,7 +1140,8 @@ asynStatus masterMacsAxis::enable(bool on) {
// hence we wait for a custom timespan in seconds instead of
// pC_->comTimeout_
double timeout = pC_->comTimeout();
if (timeout < PowerCycleTimeout) {
if (pMasterMacsA_->targetReachedUninitialized &&
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
// enabled or until the timeout has been reached
int startTime = time(NULL);
while (time(NULL) < startTime + PowerCycleTimeout) {
while (time(NULL) < startTime + timeout_enable_disable) {
// Read the axis status
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
asynPrint(pC_->pasynUser(), ASYN_TRACE_ERROR,
"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__,
on ? "enable" : "disable", PowerCycleTimeout);
on ? "enable" : "disable", timeout_enable_disable);
// Output message to user
snprintf(msg, sizeof(msg),
"Controller \"%s\", axis %d: Failed to %s within %f seconds",
pC_->portName, axisNo_, on ? "enable" : "disable",
PowerCycleTimeout);
snprintf(msg, sizeof(msg), "Failed to %s within %d seconds",
on ? "enable" : "disable", timeout_enable_disable);
setAxisParamChecked(this, motorErrorMessage, msg);
setAxisParamChecked(this, motorMessageText, msg);
return asynError;
}
@@ -1280,8 +1238,8 @@ asynStatus masterMacsAxis::readAxisStatus() {
// =========================================================================
asynStatus rwStatus = pC_->read(axisNo_, 10, response);
if (rwStatus == asynSuccess) {
asynStatus rw_status = pC_->read(axisNo_, 10, response);
if (rw_status == asynSuccess) {
float axisStatus = 0;
int nvals = sscanf(response, "%f", &axisStatus);
@@ -1293,7 +1251,7 @@ asynStatus masterMacsAxis::readAxisStatus() {
pMasterMacsA_->axisStatus = toBitset(axisStatus);
}
return rwStatus;
return rw_status;
}
asynStatus masterMacsAxis::readAxisError() {
@@ -1301,8 +1259,8 @@ asynStatus masterMacsAxis::readAxisError() {
// =========================================================================
asynStatus rwStatus = pC_->read(axisNo_, 11, response);
if (rwStatus == asynSuccess) {
asynStatus rw_status = pC_->read(axisNo_, 11, response);
if (rw_status == asynSuccess) {
float axisError = 0;
int nvals = sscanf(response, "%f", &axisError);
@@ -1312,7 +1270,7 @@ asynStatus masterMacsAxis::readAxisError() {
}
pMasterMacsA_->axisError = toBitset(axisError);
}
return rwStatus;
return rw_status;
}
bool masterMacsAxis::readyToBeSwitchedOn() {
@@ -1339,8 +1297,6 @@ bool masterMacsAxis::remoteMode() { return pMasterMacsA_->axisStatus[9]; }
bool masterMacsAxis::targetReached() { return pMasterMacsA_->axisStatus[10]; }
bool masterMacsAxis::speedEqualZero() { return pMasterMacsA_->axisStatus[12]; }
bool masterMacsAxis::internalLimitActive() {
return pMasterMacsA_->axisStatus[11];
}
+5 -9
View File
@@ -52,15 +52,17 @@ class HIDDEN masterMacsAxis : public sinqAxis {
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 maxVelocity
* @param acceleration
* @return asynStatus
*/
asynStatus moveVelocity(double minVelocity, double maxVelocity,
double acceleration);
asynStatus doMoveVelocity(double minVelocity, double maxVelocity,
double acceleration);
/**
* @brief Implementation of the `doMove` function from sinqAxis. The
@@ -250,12 +252,6 @@ class HIDDEN masterMacsAxis : public sinqAxis {
*/
bool internalLimitActive();
/**
* @brief Read the property from axisStatus (see masterMacsAxisImpl
* redefinition in masterMacsAxis.cpp)
*/
bool speedEqualZero();
// Bits 12 and 13 are unused
/**
+36 -45
View File
@@ -171,16 +171,17 @@ masterMacsController::masterMacsController(const char *portName,
// Compare to target values
if (firmware_major_version() != major ||
firmware_minor_version() > minor) {
asynPrint(
this->pasynUser(), ASYN_TRACE_ERROR,
"Controller \"%s\" => %s, line %d\nFATAL ERROR "
"(Incorrect version number of firmware: Expected major "
"version equal to %d, got %d. Expected minor version "
"equal to or larger than %d, got %d).\nTerminating "
"IOC.\n",
portName, __PRETTY_FUNCTION__, __LINE__,
firmware_major_version(), major,
firmware_minor_version(), minor);
asynPrint(this->pasynUser(), ASYN_TRACE_ERROR,
"Controller \"%s\" => %s, line %d\nFATAL ERROR "
"(Incorrect "
"version number of firmware: Expected major "
"version equal "
"to %d, got %d. Expected minor version equal to "
"or larger "
"than %d, got %d).\nTerminating IOC",
portName, __PRETTY_FUNCTION__, __LINE__,
firmware_major_version(), major,
firmware_minor_version(), minor);
exit(-1);
}
}
@@ -188,7 +189,7 @@ masterMacsController::masterMacsController(const char *portName,
asynPrint(
this->pasynUser(), ASYN_TRACE_ERROR,
"Controller \"%s\" => %s, line %d\nCould not read firmware "
"version.\n",
"version\n",
portName, __PRETTY_FUNCTION__, __LINE__);
}
}
@@ -247,7 +248,7 @@ asynStatus masterMacsController::writeRead(int axisNo, int tcpCmd,
asynStatus status = asynSuccess;
char fullCommand[MAXBUF_] = {0};
char fullResponse[MAXBUF_] = {0};
char drvMessage[MAXBUF_] = {0};
char drvMessageText[MAXBUF_] = {0};
int motorStatusProblem = 0;
int valueStart = 0;
@@ -305,7 +306,7 @@ asynStatus masterMacsController::writeRead(int axisNo, int tcpCmd,
adjustForPrint(printableCommand, fullCommand, MAXBUF_);
asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR,
"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__,
stringifyAsynStatus(status), printableCommand);
}
@@ -318,7 +319,7 @@ asynStatus masterMacsController::writeRead(int axisNo, int tcpCmd,
case asynSuccess:
// We did get a response, but does it make sense and is it designated as
// OK from the controller? This is checked here.
status = parseResponse(fullCommand, fullResponse, drvMessage,
status = parseResponse(fullCommand, fullResponse, drvMessageText,
&valueStart, &valueStop, axisNo, tcpCmd, isRead);
// Read out the important information from the response
@@ -335,29 +336,23 @@ asynStatus masterMacsController::writeRead(int axisNo, int tcpCmd,
}
break;
case asynTimeout:
snprintf(drvMessage, sizeof(drvMessage),
"Controller \"%s\", axis %d: Connection timeout. Please call "
"the support.",
portName, axisNo);
snprintf(drvMessageText, sizeof(drvMessageText),
"Connection timeout. Please call the support.");
break;
case asynDisconnected:
snprintf(drvMessage, sizeof(drvMessage),
"Controller \"%s\", axis %d: Axis is disconnected.", portName,
axisNo);
snprintf(drvMessageText, sizeof(drvMessageText),
"Axis is not connected.");
break;
case asynDisabled:
snprintf(drvMessage, sizeof(drvMessage),
"Controller \"%s\", axis %d: Axis is disabled.", portName,
axisNo);
snprintf(drvMessageText, sizeof(drvMessageText), "Axis is disabled.");
break;
case asynError:
// Do nothing - error message has already been set.
// Do nothing - error message drvMessageText has already been set.
break;
default:
snprintf(drvMessage, sizeof(drvMessage),
"Controller \"%s\", axis %d: Communication failed (%s). "
"Please call the support.",
portName, axisNo, stringifyAsynStatus(status));
snprintf(drvMessageText, sizeof(drvMessageText),
"Communication failed (%s). Please call the support.",
stringifyAsynStatus(status));
break;
}
@@ -391,7 +386,7 @@ asynStatus masterMacsController::writeRead(int axisNo, int tcpCmd,
getAxisParamChecked(axis, motorStatusProblem, &motorStatusProblem);
if (motorStatusProblem == 0) {
setAxisParamChecked(axis, motorErrorMessage, drvMessage);
setAxisParamChecked(axis, motorMessageText, drvMessageText);
setAxisParamChecked(axis, motorStatusProblem, true);
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[NAK][CR] (Communication failed)
- [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.
*/
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) {
bool responseValid = false;
@@ -474,9 +469,7 @@ asynStatus masterMacsController::parseResponse(
NAK
This indicates that the axis is not connected. This is not an error!
*/
snprintf(drvMessage, MAXBUF_,
"Controller \"%s\", axis %d: Axis is disconnected.",
portName, axisNo);
snprintf(drvMessageText, MAXBUF_, "Axis not connected.");
// Motor was connected before -> Update the paramLib entry and PV
// to show it is now disconnected.
@@ -500,14 +493,12 @@ asynStatus masterMacsController::parseResponse(
}
}
}
return asynDisconnected;
break;
} else if (fullResponse[i] == '\x18') {
// CAN
snprintf(
drvMessage, MAXBUF_,
"Controller \"%s\", axis %d: Tried to write with a "
"read-only command. This is a bug, please call the support.",
portName, axisNo);
snprintf(drvMessageText, MAXBUF_,
"Tried to write with a read-only command. This is a "
"bug, please call the support.");
if (getMsgPrintControl().shouldBePrinted(parseKey, true,
pasynUserSelf)) {
@@ -560,10 +551,10 @@ asynStatus masterMacsController::parseResponse(
getMsgPrintControl().getSuffix());
}
snprintf(drvMessage, MAXBUF_,
"Controller \"%s\", axis %d: Mismatched response %s for "
"command %s. Please call the support.",
portName, axisNo, printableResponse, printableCommand);
snprintf(drvMessageText, MAXBUF_,
"Mismatched response %s to command %s. Please call the "
"support.",
printableResponse, printableCommand);
return asynError;
} else {
getMsgPrintControl().resetCount(responseMatchKey, pasynUserSelf);