Compare commits

..

6 Commits

Author SHA1 Message Date
mathis_s d90869cbca Added reminder comment
Test And Build / Lint (push) Failing after 4s
Test And Build / Build (push) Successful in 7s
2026-02-10 13:18:43 +01:00
mathis_s eadce0f594 Draft velocity mode
Test And Build / Lint (push) Failing after 4s
Test And Build / Build (push) Successful in 7s
See TODO in src/masterMacsAxis.cpp, line 552. The velocity readback is
the only thing that doesn't work properly, everything else does work.
Once a solution has been found here, this can be a new minor release.
2026-02-10 12:31:01 +01:00
mathis_s 0e1f95a94b Updated sinqMotor and use setLimits 2026-02-10 09:04:04 +01:00
mathis_s b01f398533 Set move flag correctly in velocity / jog mode 2026-02-10 09:00:58 +01:00
mathis_s 56d9d20c3a Simplified handling of velocity mode using standard EPICS motor record fields
Test And Build / Lint (push) Failing after 4s
Test And Build / Build (push) Successful in 7s
2026-02-03 17:57:00 +01:00
mathis_s 4634609891 Rolled back to sinqMotor 1.5.7 2026-02-03 13:35:24 +01:00
4 changed files with 173 additions and 165 deletions
+1 -1
View File
@@ -7,7 +7,7 @@ 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
# These headers allow to depend on this library for derived drivers.
HEADERS += src/masterMacsAxis.h
+135 -118
View File
@@ -29,6 +29,8 @@ struct masterMacsAxisImpl {
bool needInit = true;
bool targetReachedUninitialized;
bool dynamicLimits;
bool canPositionMove;
bool canVelocityMove;
moveMode lastMoveCommand;
};
@@ -38,7 +40,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 +83,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,6 +102,8 @@ masterMacsAxis::masterMacsAxis(masterMacsController *pC, int axisNo)
.timeAtHandshake = 0,
.targetReachedUninitialized = true,
.dynamicLimits = false,
.canPositionMove = true,
.canVelocityMove = false,
.lastMoveCommand = positionMode,
})) {
@@ -154,9 +162,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 "
@@ -194,6 +202,7 @@ asynStatus masterMacsAxis::init() {
double motVmax = 0.0;
double motAccel = 0.0;
int dynamicLimits = 0;
int possibleModes = 0;
// =========================================================================
@@ -307,6 +316,39 @@ asynStatus masterMacsAxis::init() {
}
pMasterMacsA_->dynamicLimits = bool(dynamicLimits);
// Check if the motor can switch its mode
status = pC_->read(axisNo_, 31, response);
if (status != asynSuccess) {
return status;
}
nvals = sscanf(response, "%d", &possibleModes);
if (nvals != 1) {
return pC_->couldNotParseResponse("R31", response, axisNo_,
__PRETTY_FUNCTION__, __LINE__);
}
switch (possibleModes) {
case 1:
pMasterMacsA_->canPositionMove = true;
pMasterMacsA_->canVelocityMove = false;
break;
case 2:
pMasterMacsA_->canPositionMove = false;
pMasterMacsA_->canVelocityMove = true;
break;
case 3:
pMasterMacsA_->canPositionMove = true;
pMasterMacsA_->canVelocityMove = true;
break;
default:
asynPrint(pC_->pasynUser(), ASYN_TRACE_ERROR,
"Controller \"%s\", axis %d => %s, line "
"%d:\nunexpected answer %d for R31 (possible operation "
"modes). Expected one of 1, 2 or 3.\n",
pC_->portName, axisNo_, __PRETTY_FUNCTION__, __LINE__,
possibleModes);
}
status = readEncoderType();
if (status != asynSuccess) {
return status;
@@ -443,12 +485,9 @@ 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;
}
@@ -509,6 +548,9 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
setAxisParamChecked(this, motorEncoderPosition, currentPosition);
if (pMasterMacsA_->lastMoveCommand == velocityMode && !speedEqualZero()) {
// TODO: Not sure whether the RVEL field of the motor record does not
// work - has to be clarified
double actualVelocity = 0.0;
rwStatus = pC_->read(axisNo_, 14, response);
@@ -521,10 +563,8 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
__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);
// Write the actual velocity to the paramLib (TODO: does it though?)
setAxisParamChecked(this, motorVelocity, actualVelocity);
// Motor is moving in velocity mode
*moving = true;
@@ -575,12 +615,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 +626,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 +641,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 +653,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,96 +662,55 @@ 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;
}
/*
If the motor is homing or has been homed, ignore limit switch errors.
*/
int homing = 0;
int at_home = 0;
getAxisParamChecked(this, motorStatusHome, &homing);
getAxisParamChecked(this, motorStatusAtHome, &at_home);
/*
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.
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.
*/
if (!homing && !at_home && !(*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 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()) {
if (positiveLimitSwitch() || negativeLimitSwitch() ||
positiveSoftwareLimit() || negativeSoftwareLimit()) {
// Distinction for developers
if (positiveLimitSwitch()) {
appendErrorMessage(shellMessage, sizeof(shellMessage),
"Positive limit switch.");
}
if (negativeLimitSwitch()) {
appendErrorMessage(shellMessage, sizeof(shellMessage),
"Negative limit switch.");
}
if (positiveSoftwareLimit()) {
appendErrorMessage(shellMessage, sizeof(shellMessage),
"Positive software limit.");
}
if (negativeSoftwareLimit()) {
appendErrorMessage(shellMessage, sizeof(shellMessage),
"Negative software limit.");
}
// Generic error message for user
appendErrorMessage(
errorMessage, sizeof(errorMessage),
"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. ");
poll_status = asynError;
// Distinction for developers
if (positiveLimitSwitch()) {
appendErrorMessage(shellMessage, sizeof(shellMessage),
"Positive limit switch.");
}
if (negativeLimitSwitch()) {
appendErrorMessage(shellMessage, sizeof(shellMessage),
"Negative limit switch.");
}
if (positiveSoftwareLimit()) {
appendErrorMessage(shellMessage, sizeof(shellMessage),
"Positive software limit.");
}
if (negativeSoftwareLimit()) {
appendErrorMessage(shellMessage, sizeof(shellMessage),
"Negative software limit.");
}
// Generic error message for user
appendErrorMessage(
errorMessage, sizeof(errorMessage),
"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.");
poll_status = asynError;
}
if (overCurrent()) {
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 +720,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 +729,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 +738,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 +747,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 +763,7 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
}
}
setAxisParamChecked(this, motorErrorMessage, errorMessage);
setAxisParamChecked(this, motorMessageText, errorMessage);
}
// No error has been detected -> Reset the error count
@@ -828,6 +821,18 @@ asynStatus masterMacsAxis::moveVelocity(double minVelocity, double maxVelocity,
// =========================================================================
// Can the motor be operated in velocity mode?
if (!pMasterMacsA_->canVelocityMove) {
asynPrint(pC_->pasynUser(), ASYN_TRACE_ERROR,
"Controller \"%s\", axis %d => %s, line %d:\nAxis cannot "
"operate in velocity mode.\n",
pC_->portName, axisNo_, __PRETTY_FUNCTION__, __LINE__);
setAxisParamChecked(this, motorStatusProblem, true);
setAxisParamChecked(this, motorMessageText,
"cannot operate in velocity mode");
return asynError;
}
getAxisParamChecked(this, motorEnableRBV, &enabled);
getAxisParamChecked(this, motorRecResolution, &motorRecResolution);
@@ -893,6 +898,18 @@ asynStatus masterMacsAxis::doMove(double position, int relative,
// =========================================================================
// Can the motor be operated in position mode?
if (!pMasterMacsA_->canPositionMove) {
asynPrint(pC_->pasynUser(), ASYN_TRACE_ERROR,
"Controller \"%s\", axis %d => %s, line %d:\nAxis cannot "
"operate in position mode.\n",
pC_->portName, axisNo_, __PRETTY_FUNCTION__, __LINE__);
setAxisParamChecked(this, motorStatusProblem, true);
setAxisParamChecked(this, motorMessageText,
"cannot operate in position mode");
return asynError;
}
getAxisParamChecked(this, motorEnableRBV, &enabled);
getAxisParamChecked(this, motorRecResolution, &motorRecResolution);
@@ -1124,6 +1141,7 @@ asynStatus masterMacsAxis::readEncoderType() {
asynStatus masterMacsAxis::enable(bool on) {
int timeout_enable_disable = 2;
char msg[pC_->MAXBUF_];
// =========================================================================
@@ -1152,7 +1170,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 +1199,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 +1212,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 +1229,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;
}
+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);