diff --git a/Makefile b/Makefile index 5373d33..03994fb 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,7 @@ REQUIRED+=sinqMotor motorBase_VERSION=7.2.2 # Specify the version of sinqMotor we want to build against -sinqMotor_VERSION=0.9.0 +sinqMotor_VERSION=0.10.0 # These headers allow to depend on this library for derived drivers. HEADERS += src/turboPmacAxis.h diff --git a/README.md b/README.md index 6483063..7f5521b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # turboPmac +## Please read the documentation of sinqMotor first: https://git.psi.ch/sinq-epics-modules/sinqmotor + ## Overview This is a driver for the Turbo PMAC motion controller with the SINQ communication protocol. It is based on the sinqMotor shared library (https://git.psi.ch/sinq-epics-modules/sinqmotor). The header files contain detailed documentation for all public functions. The headers themselves are exported when building the library to allow other drivers to depend on this one. @@ -21,11 +23,11 @@ turboPmac exports the following IOC shell functions: - `turboPmacController`: Create a new controller object. - `turboPmacAxis`: Create a new axis object. -The full mcu.cmd file looks like this: +The full turboPmacX.cmd file looks like this: ``` # Define the name of the controller and the corresponding port -epicsEnvSet("NAME","mcu") +epicsEnvSet("NAME","turboPmacX") epicsEnvSet("ASYN_PORT","p$(NAME)") # Create the TCP/IP socket used to talk with the controller. The socket can be adressed from within the IOC shell via the port name @@ -47,8 +49,8 @@ turboPmacAxis("$(NAME)",5); # Set the number of subsequent timeouts setMaxSubsequentTimeouts("$(NAME)", 20); -# Configure the timeout frequency watchdog: -setThresholdComTimeout("$(NAME)", 100, 1); +# Configure the timeout frequency watchdog: A maximum of 10 timeouts are allowed in 300 seconds before an alarm message is sent. +setThresholdComTimeout("$(NAME)", 300, 10); # Parametrize the EPICS record database with the substitution file named after the MCU. epicsEnvSet("SINQDBPATH","$(sinqMotor_DB)/sinqMotor.db") diff --git a/src/turboPmacAxis.cpp b/src/turboPmacAxis.cpp index 81db20a..6688ade 100644 --- a/src/turboPmacAxis.cpp +++ b/src/turboPmacAxis.cpp @@ -122,7 +122,7 @@ asynStatus turboPmacAxis::init() { char command[pC_->MAXBUF_], response[pC_->MAXBUF_]; int nvals = 0; double motorRecResolution = 0.0; - double motorPosition = 0.0; + double motorPos = 0.0; double motorVelocity = 0.0; double motorVmax = 0.0; double motorAccel = 0.0; @@ -166,7 +166,7 @@ asynStatus turboPmacAxis::init() { if (status != asynSuccess) { return status; } - nvals = sscanf(response, "%d %lf %lf %lf %lf %d", &axStatus, &motorPosition, + nvals = sscanf(response, "%d %lf %lf %lf %lf %d", &axStatus, &motorPos, &motorVmax, &motorVelocity, &motorAccel, &acoDelay); // The acoDelay is given in milliseconds -> Convert to seconds, rounded up @@ -178,18 +178,14 @@ asynStatus turboPmacAxis::init() { motorAccel = motorAccel * 1000; if (nvals != 6) { - return pC_->errMsgCouldNotParseResponse(command, response, axisNo_, - __PRETTY_FUNCTION__, __LINE__); + return pC_->couldNotParseResponse(command, response, axisNo_, + __PRETTY_FUNCTION__, __LINE__); } - // Transform from motor to parameter library coordinates - motorPosition = motorPosition / motorRecResolution; - // Store these values in the parameter library - status = pC_->setDoubleParam(axisNo_, pC_->motorPosition(), motorPosition); + status = setMotorPosition(motorPos); if (status != asynSuccess) { - return pC_->paramLibAccessFailed(status, "motorPosition_", axisNo_, - __PRETTY_FUNCTION__, __LINE__); + return status; } // Initial motor status is idle @@ -297,8 +293,8 @@ asynStatus turboPmacAxis::doPoll(bool *moving) { nvals = sscanf(response, "%d %d", &handshakePerformed, &error); if (nvals != 2) { - return pC_->errMsgCouldNotParseResponse( - command, response, axisNo_, __PRETTY_FUNCTION__, __LINE__); + return pC_->couldNotParseResponse(command, response, axisNo_, + __PRETTY_FUNCTION__, __LINE__); } if (error != 0) { @@ -333,7 +329,6 @@ asynStatus turboPmacAxis::doPoll(bool *moving) { } } - // Motor resolution from parameter library pl_status = pC_->getDoubleParam(axisNo_, pC_->motorRecResolution(), &motorRecResolution); if (pl_status != asynSuccess) { @@ -343,14 +338,11 @@ asynStatus turboPmacAxis::doPoll(bool *moving) { } // Read the previous motor position - pl_status = - pC_->getDoubleParam(axisNo_, pC_->motorPosition(), &previousPosition); + pl_status = motorPosition(&previousPosition); if (pl_status != asynSuccess) { - return pC_->paramLibAccessFailed(pl_status, "motorPosition_", axisNo_, - __PRETTY_FUNCTION__, __LINE__); + return pl_status; } - // Read the previous motor position pl_status = pC_->getIntegerParam(axisNo_, pC_->motorStatusDone(), &previousStatusDone); if (pl_status != asynSuccess) { @@ -358,10 +350,6 @@ asynStatus turboPmacAxis::doPoll(bool *moving) { __PRETTY_FUNCTION__, __LINE__); } - // Transform from EPICS to motor coordinates (see comment in - // turboPmacAxis::atFirstPoll) - previousPosition = previousPosition * motorRecResolution; - // Query the axis status snprintf(command, sizeof(command), "P%2.2d00 Q%2.2d10 P%2.2d01 Q%2.2d13 Q%2.2d14", axisNo_, axisNo_, @@ -374,8 +362,8 @@ asynStatus turboPmacAxis::doPoll(bool *moving) { nvals = sscanf(response, "%d %lf %d %lf %lf", &axStatus, ¤tPosition, &error, &highLimit, &lowLimit); if (nvals != 5) { - return pC_->errMsgCouldNotParseResponse(command, response, axisNo_, - __PRETTY_FUNCTION__, __LINE__); + return pC_->couldNotParseResponse(command, response, axisNo_, + __PRETTY_FUNCTION__, __LINE__); } /* @@ -876,16 +864,10 @@ asynStatus turboPmacAxis::doPoll(bool *moving) { __PRETTY_FUNCTION__, __LINE__); } - // Transform from motor to EPICS coordinates (see comment in - // turboPmacAxis::init()) - currentPosition = currentPosition / motorRecResolution; - - pl_status = setDoubleParam(pC_->motorPosition(), currentPosition); + pl_status = setMotorPosition(currentPosition); if (pl_status != asynSuccess) { - return pC_->paramLibAccessFailed(pl_status, "motorPosition_", axisNo_, - __PRETTY_FUNCTION__, __LINE__); + return pl_status; } - return poll_status; } @@ -1042,7 +1024,7 @@ asynStatus turboPmacAxis::stop(double acceleration) { return rw_status; } -asynStatus turboPmacAxis::reset() { +asynStatus turboPmacAxis::doReset() { // Status of read-write-operations of ASCII commands to the controller asynStatus rw_status = asynSuccess; @@ -1160,16 +1142,16 @@ asynStatus turboPmacAxis::readEncoderType() { int reponse_length = strlen(response); if (reponse_length < 3) { - return pC_->errMsgCouldNotParseResponse(command, response, axisNo_, - __PRETTY_FUNCTION__, __LINE__); + return pC_->couldNotParseResponse(command, response, axisNo_, + __PRETTY_FUNCTION__, __LINE__); } // We are only interested in the last two digits and the last value in // the string before the terminator is \r nvals = sscanf(response + (reponse_length - 3), "%2X", &encoder_id); if (nvals != 1) { - return pC_->errMsgCouldNotParseResponse(command, response, axisNo_, - __PRETTY_FUNCTION__, __LINE__); + return pC_->couldNotParseResponse(command, response, axisNo_, + __PRETTY_FUNCTION__, __LINE__); } snprintf(command, sizeof(command), "P46"); @@ -1380,8 +1362,8 @@ asynStatus turboPmacAxis::enable(bool on) { } nvals = sscanf(response, "%d", &axisStatus_); if (nvals != 1) { - return pC_->errMsgCouldNotParseResponse( - command, response, axisNo_, __PRETTY_FUNCTION__, __LINE__); + return pC_->couldNotParseResponse(command, response, axisNo_, + __PRETTY_FUNCTION__, __LINE__); } if ((axisStatus_ != -3) == on) { diff --git a/src/turboPmacAxis.h b/src/turboPmacAxis.h index f8a5bcb..35125cb 100644 --- a/src/turboPmacAxis.h +++ b/src/turboPmacAxis.h @@ -82,12 +82,12 @@ class turboPmacAxis : public sinqAxis { asynStatus init(); /** - * @brief Reset the axis error + * @brief Implementation of the `doReset` function from sinqAxis. * * @param on * @return asynStatus */ - asynStatus reset(); + asynStatus doReset(); /** * @brief Enable / disable the axis. diff --git a/src/turboPmacController.cpp b/src/turboPmacController.cpp index bf9bbb0..13effa4 100644 --- a/src/turboPmacController.cpp +++ b/src/turboPmacController.cpp @@ -495,12 +495,12 @@ asynStatus turboPmacController::readInt32(asynUser *pasynUser, } } -asynStatus turboPmacController::errMsgCouldNotParseResponse( +asynStatus turboPmacController::couldNotParseResponse( const char *command, const char *response, int axisNo, const char *functionName, int lineNumber) { char modifiedResponse[MAXBUF_] = {0}; adjustResponseForPrint(modifiedResponse, response, MAXBUF_); - return sinqController::errMsgCouldNotParseResponse( + return sinqController::couldNotParseResponse( command, modifiedResponse, axisNo, functionName, lineNumber); } diff --git a/src/turboPmacController.h b/src/turboPmacController.h index 3a046d0..69281ff 100644 --- a/src/turboPmacController.h +++ b/src/turboPmacController.h @@ -93,13 +93,13 @@ class turboPmacController : public sinqController { int numExpectedResponses); /** - * @brief Specialized version of sinqController::errMsgCouldNotParseResponse + * @brief Specialized version of sinqController::couldNotParseResponse * for turboPmac * * This is an overloaded version of - * sinqController::errMsgCouldNotParseResponse which calls + * sinqController::couldNotParseResponse which calls * adjustResponseForLogging on response before handing it over to - * sinqController::errMsgCouldNotParseResponse. + * sinqController::couldNotParseResponse. * * @param command Command which led to the unparseable message * @param response Response which wasn't parseable @@ -110,7 +110,7 @@ class turboPmacController : public sinqController { called. It is recommended to use a macro, e.g. __LINE__. * @return asynStatus Returns asynError. */ - asynStatus errMsgCouldNotParseResponse(const char *command, + asynStatus couldNotParseResponse(const char *command, const char *response, int axisNo_, const char *functionName, int lineNumber);