Compare commits
12 Commits
5298b5ef69
...
0.15.1
Author | SHA1 | Date | |
---|---|---|---|
55b523ddaa | |||
75292a6a9c | |||
53bbe2aae8 | |||
1597dc34e0 | |||
dde7066f40 | |||
b4d6447b32 | |||
2f83060ec1 | |||
a3e3a79788 | |||
2c5fdc7d0a | |||
7bf31ac256 | |||
63a5fcd518 | |||
47e72d65a9 |
@ -54,11 +54,11 @@ setMaxSubsequentTimeouts("$(DRIVER_PORT)", 20);
|
||||
setThresholdComTimeout("$(DRIVER_PORT)", 300, 10);
|
||||
|
||||
# Parametrize the EPICS record database with the substitution file named after the MCU.
|
||||
epicsEnvSet("SINQDBPATH","$(sinqMotor_DB)/sinqMotor.db")
|
||||
epicsEnvSet("SINQDBPATH","$(turboPmac_DB)/sinqMotor.db")
|
||||
dbLoadTemplate("$(TOP)/$(DRIVER_PORT).substitutions", "INSTR=$(INSTR)$(DRIVER_PORT):,CONTROLLER=$(DRIVER_PORT)")
|
||||
epicsEnvSet("SINQDBPATH","$(turboPmac_DB)/turboPmac.db")
|
||||
dbLoadTemplate("$(TOP)/$(DRIVER_PORT).substitutions", "INSTR=$(INSTR)$(DRIVER_PORT):,CONTROLLER=$(DRIVER_PORT)")
|
||||
dbLoadRecords("$(sinqMotor_DB)/asynRecord.db","P=$(INSTR)$(DRIVER_PORT),PORT=$(IP_PORT)")
|
||||
dbLoadRecords("$(turboPmac_DB)/asynRecord.db","P=$(INSTR)$(DRIVER_PORT),PORT=$(IP_PORT)")
|
||||
```
|
||||
|
||||
### Additional records
|
||||
|
Submodule sinqMotor updated: 5689402375...e088bfbbcb
@ -71,6 +71,20 @@ turboPmacAxis::turboPmacAxis(turboPmacController *pC, int axisNo,
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
// Even though this happens already in sinqAxis, a default value for
|
||||
// motorMessageText is set here again, because apparently the sinqAxis
|
||||
// constructor is not run before the string is accessed?
|
||||
status = setStringParam(pC_->motorMessageText(), "");
|
||||
if (status != asynSuccess) {
|
||||
asynPrint(pC_->pasynUser(), ASYN_TRACE_ERROR,
|
||||
"Controller \"%s\", axis %d => %s, line %d:\nFATAL ERROR "
|
||||
"(setting a parameter value failed "
|
||||
"with %s)\n. Terminating IOC",
|
||||
pC_->portName, axisNo_, __PRETTY_FUNCTION__, __LINE__,
|
||||
pC_->stringifyAsynStatus(status));
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
// turboPmac motors can always be disabled
|
||||
status = pC_->setIntegerParam(axisNo_, pC_->motorCanDisable(), 1);
|
||||
if (status != asynSuccess) {
|
||||
@ -397,13 +411,6 @@ asynStatus turboPmacAxis::doPoll(bool *moving) {
|
||||
case -5:
|
||||
// Axis is deactivated
|
||||
*moving = false;
|
||||
|
||||
pl_status = setStringParam(pC_->motorMessageText(), "Deactivated");
|
||||
if (pl_status != asynSuccess) {
|
||||
return pC_->paramLibAccessFailed(pl_status, "motorMessageText_",
|
||||
axisNo_, __PRETTY_FUNCTION__,
|
||||
__LINE__);
|
||||
}
|
||||
break;
|
||||
case -4:
|
||||
// Emergency stop
|
||||
@ -426,19 +433,10 @@ asynStatus turboPmacAxis::doPoll(bool *moving) {
|
||||
axisNo_, __PRETTY_FUNCTION__,
|
||||
__LINE__);
|
||||
}
|
||||
|
||||
break;
|
||||
case -3:
|
||||
// Disabled
|
||||
*moving = false;
|
||||
|
||||
pl_status = setStringParam(pC_->motorMessageText(), "Disabled");
|
||||
if (pl_status != asynSuccess) {
|
||||
return pC_->paramLibAccessFailed(pl_status, "motorMessageText_",
|
||||
axisNo_, __PRETTY_FUNCTION__,
|
||||
__LINE__);
|
||||
}
|
||||
|
||||
break;
|
||||
case 0:
|
||||
// Idle
|
||||
@ -599,8 +597,7 @@ asynStatus turboPmacAxis::handleError(int error, char *userMessage,
|
||||
resetError = false;
|
||||
|
||||
status = setStringParam(pC_->motorMessageText(),
|
||||
"Target position would exceed software "
|
||||
"limits. Please call the support.");
|
||||
"Target position would exceed software limits");
|
||||
if (status != asynSuccess) {
|
||||
return pC_->paramLibAccessFailed(status, "motorMessageText_",
|
||||
axisNo_, __PRETTY_FUNCTION__,
|
||||
@ -783,10 +780,10 @@ asynStatus turboPmacAxis::handleError(int error, char *userMessage,
|
||||
}
|
||||
resetError = false;
|
||||
|
||||
snprintf(userMessage, sizeUserMessage,
|
||||
"Driver hardware error (P%2.2d01 = 13). "
|
||||
"Please call the support.",
|
||||
axisNo_);
|
||||
snprintf(
|
||||
userMessage, sizeUserMessage,
|
||||
"Driver hardware error (P%2.2d01 = 13). Please call the support.",
|
||||
axisNo_);
|
||||
status = setStringParam(pC_->motorMessageText(), userMessage);
|
||||
if (status != asynSuccess) {
|
||||
return pC_->paramLibAccessFailed(status, "motorMessageText_",
|
||||
@ -1084,22 +1081,7 @@ asynStatus turboPmacAxis::doHome(double min_velocity, double max_velocity,
|
||||
axisNo_, __PRETTY_FUNCTION__,
|
||||
__LINE__);
|
||||
}
|
||||
|
||||
pl_status = setStringParam(pC_->motorMessageText(), "Homing");
|
||||
if (pl_status != asynSuccess) {
|
||||
return pC_->paramLibAccessFailed(pl_status, "motorMessageText_",
|
||||
axisNo_, __PRETTY_FUNCTION__,
|
||||
__LINE__);
|
||||
}
|
||||
return callParamCallbacks();
|
||||
} else {
|
||||
pl_status = setStringParam(pC_->motorMessageText(),
|
||||
"Can't home a motor with absolute encoder");
|
||||
if (pl_status != asynSuccess) {
|
||||
return pC_->paramLibAccessFailed(pl_status, "motorMessageText_",
|
||||
axisNo_, __PRETTY_FUNCTION__,
|
||||
__LINE__);
|
||||
}
|
||||
}
|
||||
|
||||
return asynSuccess;
|
||||
@ -1271,14 +1253,17 @@ asynStatus turboPmacAxis::enable(bool on) {
|
||||
// Status of parameter library operations
|
||||
asynStatus pl_status = asynSuccess;
|
||||
|
||||
bool moving = false;
|
||||
rw_status = doPoll(&moving);
|
||||
if (rw_status != asynSuccess) {
|
||||
return rw_status;
|
||||
}
|
||||
|
||||
// =========================================================================
|
||||
|
||||
/*
|
||||
Continue regardless of the status returned by the poll; we just want to
|
||||
find out whether the motor is currently moving or not. If the poll
|
||||
function fails before it can determine that, it is assumed that the motor
|
||||
is not moving.
|
||||
*/
|
||||
bool moving = false;
|
||||
doPoll(&moving);
|
||||
|
||||
// If the axis is currently moving, it cannot be disabled. Ignore the
|
||||
// command and inform the user. We check the last known status of the axis
|
||||
// instead of "moving", since status -6 is also moving, but the motor can
|
||||
@ -1327,16 +1312,7 @@ asynStatus turboPmacAxis::enable(bool on) {
|
||||
"Controller \"%s\", axis %d => %s, line %d\n%s axis\n",
|
||||
pC_->portName, axisNo_, __PRETTY_FUNCTION__, __LINE__,
|
||||
on ? "Enable" : "Disable");
|
||||
if (on == 0) {
|
||||
pl_status = setStringParam(pC_->motorMessageText(), "Disabling ...");
|
||||
} else {
|
||||
pl_status = setStringParam(pC_->motorMessageText(), "Enabling ...");
|
||||
}
|
||||
if (pl_status != asynSuccess) {
|
||||
return pC_->paramLibAccessFailed(pl_status, "motorMessageText_",
|
||||
axisNo_, __PRETTY_FUNCTION__,
|
||||
__LINE__);
|
||||
}
|
||||
|
||||
rw_status = pC_->writeRead(axisNo_, command, response, 0);
|
||||
if (rw_status != asynSuccess) {
|
||||
return rw_status;
|
||||
@ -1379,7 +1355,7 @@ asynStatus turboPmacAxis::enable(bool on) {
|
||||
// Output message to user
|
||||
snprintf(command, sizeof(command), "Failed to %s within %d seconds",
|
||||
on ? "enable" : "disable", timeout_enable_disable);
|
||||
pl_status = setStringParam(pC_->motorMessageText(), "Enabling ...");
|
||||
pl_status = setStringParam(pC_->motorMessageText(), command);
|
||||
if (pl_status != asynSuccess) {
|
||||
return pC_->paramLibAccessFailed(pl_status, "motorMessageText_",
|
||||
axisNo_, __PRETTY_FUNCTION__,
|
||||
|
@ -31,7 +31,7 @@ class turboPmacAxis : public sinqAxis {
|
||||
* value is currently not used.
|
||||
* @return asynStatus
|
||||
*/
|
||||
asynStatus stop(double acceleration);
|
||||
virtual asynStatus stop(double acceleration);
|
||||
|
||||
/**
|
||||
* @brief Implementation of the `doHome` function from sinqAxis. The
|
||||
@ -43,8 +43,8 @@ class turboPmacAxis : public sinqAxis {
|
||||
* @param forwards
|
||||
* @return asynStatus
|
||||
*/
|
||||
asynStatus doHome(double minVelocity, double maxVelocity,
|
||||
double acceleration, int forwards);
|
||||
virtual asynStatus doHome(double minVelocity, double maxVelocity,
|
||||
double acceleration, int forwards);
|
||||
|
||||
/**
|
||||
* @brief Implementation of the `doPoll` function from sinqAxis. The
|
||||
@ -53,7 +53,7 @@ class turboPmacAxis : public sinqAxis {
|
||||
* @param moving
|
||||
* @return asynStatus
|
||||
*/
|
||||
asynStatus doPoll(bool *moving);
|
||||
virtual asynStatus doPoll(bool *moving);
|
||||
|
||||
/**
|
||||
* @brief Implementation of the `doMove` function from sinqAxis. The
|
||||
@ -66,8 +66,9 @@ class turboPmacAxis : public sinqAxis {
|
||||
* @param acceleration
|
||||
* @return asynStatus
|
||||
*/
|
||||
asynStatus doMove(double position, int relative, double min_velocity,
|
||||
double max_velocity, double acceleration);
|
||||
virtual asynStatus doMove(double position, int relative,
|
||||
double min_velocity, double max_velocity,
|
||||
double acceleration);
|
||||
|
||||
/**
|
||||
* @brief Readout of some values from the controller at IOC startup
|
||||
@ -79,7 +80,7 @@ class turboPmacAxis : public sinqAxis {
|
||||
*
|
||||
* @return asynStatus
|
||||
*/
|
||||
asynStatus init();
|
||||
virtual asynStatus init();
|
||||
|
||||
/**
|
||||
* @brief Implementation of the `doReset` function from sinqAxis.
|
||||
@ -87,7 +88,7 @@ class turboPmacAxis : public sinqAxis {
|
||||
* @param on
|
||||
* @return asynStatus
|
||||
*/
|
||||
asynStatus doReset();
|
||||
virtual asynStatus doReset();
|
||||
|
||||
/**
|
||||
* @brief Enable / disable the axis.
|
||||
@ -95,7 +96,7 @@ class turboPmacAxis : public sinqAxis {
|
||||
* @param on
|
||||
* @return asynStatus
|
||||
*/
|
||||
asynStatus enable(bool on);
|
||||
virtual asynStatus enable(bool on);
|
||||
|
||||
/**
|
||||
* @brief Read the encoder type (incremental or absolute) for this axis from
|
||||
@ -103,14 +104,14 @@ class turboPmacAxis : public sinqAxis {
|
||||
*
|
||||
* @return asynStatus
|
||||
*/
|
||||
asynStatus readEncoderType();
|
||||
virtual asynStatus readEncoderType();
|
||||
|
||||
/**
|
||||
* @brief Trigger a rereading of the encoder position.
|
||||
*
|
||||
* @return asynStatus
|
||||
*/
|
||||
asynStatus rereadEncoder();
|
||||
virtual asynStatus rereadEncoder();
|
||||
|
||||
/**
|
||||
* @brief Interpret the error code and populate the user message accordingly
|
||||
|
@ -120,17 +120,10 @@ class turboPmacController : public sinqController {
|
||||
int readConfig() { return readConfig_; }
|
||||
int flushHardware() { return flushHardware_; }
|
||||
|
||||
// Set the maximum buffer size. This is an empirical value which must be
|
||||
// large enough to avoid overflows for all commands to the device /
|
||||
// responses from it.
|
||||
static const uint32_t MAXBUF_ = 200;
|
||||
|
||||
asynUser *pasynInt32SyncIOipPort() { return pasynInt32SyncIOipPort_; }
|
||||
|
||||
protected:
|
||||
/*
|
||||
Timeout for the communication process in seconds
|
||||
*/
|
||||
// Timeout for the communication process in seconds
|
||||
double comTimeout_;
|
||||
|
||||
char lastResponse[MAXBUF_];
|
||||
|
Reference in New Issue
Block a user