Compare commits

...

2 Commits
0.3.0 ... 0.4.1

Author SHA1 Message Date
2f2678546d Bumped the required version of sinqMotor 2024-12-11 09:50:22 +01:00
285fab7587 Refactored some code into sinqMotor:
- Enable, EnableRBV and CanDisable
- EncoderType
- Removed function isEnabled as it is no longer required from sinqMotor
0.5.0
2024-12-09 11:20:16 +01:00
6 changed files with 51 additions and 53 deletions

View File

@ -11,7 +11,7 @@ REQUIRED+=asynMotor
REQUIRED+=sinqMotor REQUIRED+=sinqMotor
# Specify the version of sinqMotor we want to build against # Specify the version of sinqMotor we want to build against
sinqMotor_VERSION=0.4.0 sinqMotor_VERSION=0.6.0
# These headers allow to depend on this library for derived drivers. # These headers allow to depend on this library for derived drivers.
HEADERS += src/pmacv3Axis.h HEADERS += src/pmacv3Axis.h

View File

@ -1,18 +1,7 @@
# Read out the encoder type in human-readable form. The output numbers can be
# interpreted as ASCII.
# This record is coupled to the parameter library via encoderType -> ENCODER_TYPE.
record(waveform, "$(INSTR)$(M):Encoder_Type") {
field(DTYP, "asynOctetRead")
field(INP, "@asyn($(CONTROLLER),$(AXIS),1) ENCODER_TYPE")
field(FTVL, "CHAR")
field(NELM, "80")
field(SCAN, "I/O Intr")
}
# Trigger a rereading of the encoder. This action is sometimes necessary for # Trigger a rereading of the encoder. This action is sometimes necessary for
# absolute encoders after enabling them. For incremental encoders, this is a no-op. # absolute encoders after enabling them. For incremental encoders, this is a no-op.
# This record is coupled to the parameter library via rereadEncoderPosition_ -> REREAD_ENCODER_POSITION. # This record is coupled to the parameter library via rereadEncoderPosition_ -> REREAD_ENCODER_POSITION.
record(longout, "$(INSTR)$(M):Reread_Encoder") { record(longout, "$(INSTR)$(M):RereadEncoder") {
field(DTYP, "asynInt32") field(DTYP, "asynInt32")
field(OUT, "@asyn($(CONTROLLER),$(AXIS),1) REREAD_ENCODER_POSITION") field(OUT, "@asyn($(CONTROLLER),$(AXIS),1) REREAD_ENCODER_POSITION")
field(PINI, "NO") field(PINI, "NO")
@ -23,7 +12,7 @@ record(longout, "$(INSTR)$(M):Reread_Encoder") {
# once at IOC startup during atFirstPoll. However, it can be triggered manually # once at IOC startup during atFirstPoll. However, it can be triggered manually
# by setting this record value to 1. # by setting this record value to 1.
# This record is coupled to the parameter library via readConfig_ -> READ_CONFIG. # This record is coupled to the parameter library via readConfig_ -> READ_CONFIG.
record(longout, "$(INSTR)$(M):Read_Config") { record(longout, "$(INSTR)$(M):ReadConfig") {
field(DTYP, "asynInt32") field(DTYP, "asynInt32")
field(OUT, "@asyn($(CONTROLLER),$(AXIS),1) READ_CONFIG") field(OUT, "@asyn($(CONTROLLER),$(AXIS),1) READ_CONFIG")
field(PINI, "NO") field(PINI, "NO")

View File

@ -50,6 +50,16 @@ pmacv3Axis::pmacv3Axis(pmacv3Controller *pC, int axisNo)
exit(-1); exit(-1);
} }
status = pC_->setIntegerParam(axisNo_, pC_->motorEnableRBV_, 0);
if (status != asynSuccess) {
asynPrint(
pC_->pasynUserSelf, ASYN_TRACE_ERROR,
"%s => line %d:\nFATAL ERROR (setting a parameter value failed "
"with %s)\n. Terminating IOC",
__PRETTY_FUNCTION__, __LINE__, pC_->stringifyAsynStatus(status));
exit(-1);
}
status = pC_->setDoubleParam(axisNo_, pC_->motorPosition_, 0.0); status = pC_->setDoubleParam(axisNo_, pC_->motorPosition_, 0.0);
if (status != asynSuccess) { if (status != asynSuccess) {
asynPrint( asynPrint(
@ -73,7 +83,17 @@ pmacv3Axis::~pmacv3Axis(void) {
/** /**
Read the configuration at the first poll Read the configuration at the first poll
*/ */
asynStatus pmacv3Axis::atFirstPoll() { return readConfig(); } asynStatus pmacv3Axis::atFirstPoll() {
asynStatus status = asynSuccess;
// pmacv3 motors can always be disabled
status = pC_->setIntegerParam(axisNo_, pC_->motorCanDisable_, 1);
if (status != asynSuccess) {
return pC_->paramLibAccessFailed(status, "motorCanDisable_",
__PRETTY_FUNCTION__, __LINE__);
}
return readConfig();
}
/* /*
Read the configuration from the motor control unit and the parameter library. Read the configuration from the motor control unit and the parameter library.
@ -284,6 +304,14 @@ asynStatus pmacv3Axis::doPoll(bool *moving) {
// Store the axis status // Store the axis status
axisStatus_ = axStatus; axisStatus_ = axStatus;
// Update the enablement PV
pl_status = setIntegerParam(pC_->motorEnableRBV_,
(axStatus != -3 && axStatus != -5));
if (pl_status != asynSuccess) {
return pC_->paramLibAccessFailed(pl_status, "motorEnableRBV_",
__PRETTY_FUNCTION__, __LINE__);
}
// Intepret the status // Intepret the status
switch (axStatus) { switch (axStatus) {
case -6: case -6:
@ -608,13 +636,6 @@ asynStatus pmacv3Axis::doPoll(bool *moving) {
} }
} }
pl_status = setIntegerParam(pC_->motorEnableRBV_,
(axStatus != -3 && axStatus != -5));
if (pl_status != asynSuccess) {
return pC_->paramLibAccessFailed(pl_status, "motorEnableRBV_",
__PRETTY_FUNCTION__, __LINE__);
}
pl_status = setIntegerParam(pC_->motorStatusMoving_, *moving); pl_status = setIntegerParam(pC_->motorStatusMoving_, *moving);
if (pl_status != asynSuccess) { if (pl_status != asynSuccess) {
return pC_->paramLibAccessFailed(pl_status, "motorStatusMoving_", return pC_->paramLibAccessFailed(pl_status, "motorStatusMoving_",
@ -950,7 +971,11 @@ asynStatus pmacv3Axis::rereadEncoder() {
} }
// Abort if the axis is incremental // Abort if the axis is incremental
if (strcmp(encoderType, IncrementalEncoder) == 1) { if (strcmp(encoderType, IncrementalEncoder) == 0) {
asynPrint(pC_->pasynUserSelf, ASYN_TRACE_FLOW,
"%s => line %d:\nEncoder of axis %d is not reread because it "
"is incremental.\n",
__PRETTY_FUNCTION__, __LINE__, axisNo_);
return asynSuccess; return asynSuccess;
} }
@ -1123,8 +1148,3 @@ asynStatus pmacv3Axis::enable(bool on) {
} }
return asynError; return asynError;
} }
asynStatus pmacv3Axis::isEnabled(bool *on) {
*on = (axisStatus_ != -3 && axisStatus_ != -5);
return asynSuccess;
}

View File

@ -88,15 +88,6 @@ class pmacv3Axis : public sinqAxis {
*/ */
asynStatus enable(bool on); asynStatus enable(bool on);
/**
* @brief EThis function sets "on" to true, if the motor is enabled, and to
* false otherwise
*
* @param on
* @return asynStatus
*/
asynStatus isEnabled(bool *on);
/** /**
* @brief Read the encoder type (incremental or absolute) for this axis from * @brief Read the encoder type (incremental or absolute) for this axis from
* the MCU and store the information in the PV ENCODER_TYPE. * the MCU and store the information in the PV ENCODER_TYPE.

View File

@ -51,12 +51,10 @@ pmacv3Controller::pmacv3Controller(const char *portName,
portName, ipPortConfigName, numAxes, movingPollPeriod, idlePollPeriod, portName, ipPortConfigName, numAxes, movingPollPeriod, idlePollPeriod,
/* /*
The following parameter library entries are added in this driver: The following parameter library entries are added in this driver:
- ENCODER_TYPE
- REREAD_ENCODER_POSITION - REREAD_ENCODER_POSITION
- READ_CONFIG - READ_CONFIG
- ACCEL_FROM_DRIVER
*/ */
4) NUM_PMACV3_DRIVER_PARAMS)
{ {
@ -85,15 +83,6 @@ pmacv3Controller::pmacv3Controller(const char *portName,
// ========================================================================= // =========================================================================
// Create additional parameter library entries // Create additional parameter library entries
status = createParam("ENCODER_TYPE", asynParamOctet, &encoderType_);
if (status != asynSuccess) {
asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR,
"%s => line %d:\nFATAL ERROR (creating a parameter failed "
"with %s).\nTerminating IOC",
__PRETTY_FUNCTION__, __LINE__, stringifyAsynStatus(status));
exit(-1);
}
status = createParam("REREAD_ENCODER_POSITION", asynParamInt32, status = createParam("REREAD_ENCODER_POSITION", asynParamInt32,
&rereadEncoderPosition_); &rereadEncoderPosition_);
if (status != asynSuccess) { if (status != asynSuccess) {
@ -426,6 +415,16 @@ asynStatus pmacv3Controller::writeInt32(asynUser *pasynUser, epicsInt32 value) {
} }
} }
asynStatus sinqController::readInt32(asynUser *pasynUser, epicsInt32 *value) {
// PMACs can be disabled
if (pasynUser->reason == motorCanDisable_) {
*value = 1;
return asynSuccess;
} else {
return asynMotorController::readInt32(pasynUser, value);
}
}
asynStatus pmacv3Controller::errMsgCouldNotParseResponse( asynStatus pmacv3Controller::errMsgCouldNotParseResponse(
const char *command, const char *response, int axisNo, const char *command, const char *response, int axisNo,
const char *functionName, int lineNumber) { const char *functionName, int lineNumber) {

View File

@ -12,9 +12,6 @@
#include "sinqAxis.h" #include "sinqAxis.h"
#include "sinqController.h" #include "sinqController.h"
#define IncrementalEncoder "Incremental encoder"
#define AbsoluteEncoder "Absolute encoder"
class pmacv3Controller : public sinqController { class pmacv3Controller : public sinqController {
public: public:
@ -127,11 +124,13 @@ class pmacv3Controller : public sinqController {
double comTimeout_; double comTimeout_;
// Indices of additional PVs // Indices of additional PVs
#define FIRST_PMACV3_PARAM rereadEncoderPosition_
int rereadEncoderPosition_; int rereadEncoderPosition_;
int readConfig_; int readConfig_;
int encoderType_; #define LAST_PMACV3_PARAM readConfig_
friend class pmacv3Axis; friend class pmacv3Axis;
}; };
#define NUM_PMACV3_DRIVER_PARAMS (&LAST_PMACV3_PARAM - &FIRST_PMACV3_PARAM + 1)
#endif /* pmacv3Controller_H */ #endif /* pmacv3Controller_H */