|
|
|
@ -1,169 +1,180 @@
|
|
|
|
|
/********************************************
|
|
|
|
|
* pmacAxis.cpp
|
|
|
|
|
*
|
|
|
|
|
* PMAC Asyn motor based on the
|
|
|
|
|
*
|
|
|
|
|
* PMAC Asyn motor based on the
|
|
|
|
|
* asynMotorAxis class.
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
* Matthew Pearson
|
|
|
|
|
* 23 May 2012
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
* Modified to use the MsgTxt field for SINQ
|
|
|
|
|
*
|
|
|
|
|
* Mark Koennecke, January 2019
|
|
|
|
|
*
|
|
|
|
|
* EXtended with special motor axis for the Selene
|
|
|
|
|
* EXtended with special motor axis for the Selene
|
|
|
|
|
* guide, Mark Koennecke, February 2020
|
|
|
|
|
********************************************/
|
|
|
|
|
|
|
|
|
|
#ifndef pmacAxis_H
|
|
|
|
|
#define pmacAxis_H
|
|
|
|
|
|
|
|
|
|
#include "SINQController.h"
|
|
|
|
|
#include "SINQAxis.h"
|
|
|
|
|
#include "SINQController.h"
|
|
|
|
|
|
|
|
|
|
class pmacController;
|
|
|
|
|
class SeleneController;
|
|
|
|
|
|
|
|
|
|
class pmacAxis : public SINQAxis
|
|
|
|
|
{
|
|
|
|
|
class pmacAxis : public SINQAxis {
|
|
|
|
|
public:
|
|
|
|
|
/* These are the methods we override from the base class */
|
|
|
|
|
pmacAxis(pmacController *pController, int axisNo, bool enable=true);
|
|
|
|
|
virtual ~pmacAxis();
|
|
|
|
|
asynStatus move(double position, int relative, double min_velocity, double max_velocity, double acceleration);
|
|
|
|
|
asynStatus moveVelocity(double min_velocity, double max_velocity, double acceleration);
|
|
|
|
|
asynStatus home(double min_velocity, double max_velocity, double acceleration, int forwards);
|
|
|
|
|
asynStatus stop(double acceleration);
|
|
|
|
|
asynStatus poll(bool *moving);
|
|
|
|
|
asynStatus setPosition(double position);
|
|
|
|
|
asynStatus enable(int on);
|
|
|
|
|
/* These are the methods we override from the base class */
|
|
|
|
|
pmacAxis(pmacController *pController, int axisNo, bool enable = true);
|
|
|
|
|
virtual ~pmacAxis();
|
|
|
|
|
asynStatus move(double position, int relative, double min_velocity,
|
|
|
|
|
double max_velocity, double acceleration);
|
|
|
|
|
asynStatus moveVelocity(double min_velocity, double max_velocity,
|
|
|
|
|
double acceleration);
|
|
|
|
|
asynStatus home(double min_velocity, double max_velocity,
|
|
|
|
|
double acceleration, int forwards);
|
|
|
|
|
asynStatus stop(double acceleration);
|
|
|
|
|
asynStatus poll(bool *moving);
|
|
|
|
|
asynStatus setPosition(double position);
|
|
|
|
|
asynStatus enable(int on);
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
pmacController *pC_;
|
|
|
|
|
|
|
|
|
|
asynStatus getAxisStatus(bool *moving);
|
|
|
|
|
asynStatus getAxisInitialStatus(void);
|
|
|
|
|
protected:
|
|
|
|
|
pmacController *pC_;
|
|
|
|
|
|
|
|
|
|
double setpointPosition_;
|
|
|
|
|
double encoderPosition_;
|
|
|
|
|
double currentVelocity_;
|
|
|
|
|
double velocity_;
|
|
|
|
|
double accel_;
|
|
|
|
|
double highLimit_;
|
|
|
|
|
double lowLimit_;
|
|
|
|
|
double scale_;
|
|
|
|
|
double previous_position_;
|
|
|
|
|
int previous_direction_;
|
|
|
|
|
int encoder_axis_;
|
|
|
|
|
int axisErrorCount;
|
|
|
|
|
asynStatus getAxisStatus(bool *moving);
|
|
|
|
|
asynStatus getAxisInitialStatus(void);
|
|
|
|
|
|
|
|
|
|
time_t startTime;
|
|
|
|
|
time_t status6Time;
|
|
|
|
|
int starting;
|
|
|
|
|
int homing;
|
|
|
|
|
double statusPos;
|
|
|
|
|
double setpointPosition_;
|
|
|
|
|
double encoderPosition_;
|
|
|
|
|
double currentVelocity_;
|
|
|
|
|
double velocity_;
|
|
|
|
|
double accel_;
|
|
|
|
|
double highLimit_;
|
|
|
|
|
double lowLimit_;
|
|
|
|
|
double scale_;
|
|
|
|
|
double previous_position_;
|
|
|
|
|
int previous_direction_;
|
|
|
|
|
int encoder_axis_;
|
|
|
|
|
int axisErrorCount;
|
|
|
|
|
|
|
|
|
|
time_t next_poll;
|
|
|
|
|
time_t startTime;
|
|
|
|
|
time_t status6Time;
|
|
|
|
|
int starting;
|
|
|
|
|
int homing;
|
|
|
|
|
double statusPos;
|
|
|
|
|
|
|
|
|
|
bool autoEnable;
|
|
|
|
|
|
|
|
|
|
friend class pmacController;
|
|
|
|
|
friend class pmacV3Controller;
|
|
|
|
|
time_t next_poll;
|
|
|
|
|
|
|
|
|
|
bool autoEnable;
|
|
|
|
|
|
|
|
|
|
friend class pmacController;
|
|
|
|
|
friend class pmacV3Controller;
|
|
|
|
|
};
|
|
|
|
|
/*--------------------------------------------------------------------------------------------*/
|
|
|
|
|
class SeleneAxis : public pmacAxis
|
|
|
|
|
{
|
|
|
|
|
class SeleneAxis : public pmacAxis {
|
|
|
|
|
public:
|
|
|
|
|
SeleneAxis(SeleneController *pController, int axisNo, double limitTarget);
|
|
|
|
|
asynStatus move(double position, int relative, double min_velocity, double max_velocity, double acceleration);
|
|
|
|
|
asynStatus setPosition(double position);
|
|
|
|
|
asynStatus home(double min_velocity, double max_velocity, double acceleration, int forwards);
|
|
|
|
|
SeleneAxis(SeleneController *pController, int axisNo, double limitTarget);
|
|
|
|
|
asynStatus move(double position, int relative, double min_velocity,
|
|
|
|
|
double max_velocity, double acceleration);
|
|
|
|
|
asynStatus setPosition(double position);
|
|
|
|
|
asynStatus home(double min_velocity, double max_velocity,
|
|
|
|
|
double acceleration, int forwards);
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
friend class SeleneController;
|
|
|
|
|
friend class pmacController;
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
double limitTarget;
|
|
|
|
|
asynStatus getSeleneAxisInitialStatus(void);
|
|
|
|
|
protected:
|
|
|
|
|
friend class SeleneController;
|
|
|
|
|
friend class pmacController;
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
double limitTarget;
|
|
|
|
|
asynStatus getSeleneAxisInitialStatus(void);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
Yet another special set of motors for the Selene Guide at AMOR. Each segment can be lifted or tilted. This is
|
|
|
|
|
two motors. One acts as a slave and only writes a new target, the other also sets a new target and sends the
|
|
|
|
|
actual movement command. Both motors are coordianted in the motor controller in order to avoid tension on
|
|
|
|
|
the guide elements. This gaves rise to the function code LIFTSLAVE and LIFTMASTER.
|
|
|
|
|
Yet another special set of motors for the Selene Guide at AMOR. Each segment
|
|
|
|
|
can be lifted or tilted. This is two motors. One acts as a slave and only
|
|
|
|
|
writes a new target, the other also sets a new target and sends the actual
|
|
|
|
|
movement command. Both motors are coordianted in the motor controller in order
|
|
|
|
|
to avoid tension on the guide elements. This gaves rise to the function code
|
|
|
|
|
LIFTSLAVE and LIFTMASTER.
|
|
|
|
|
|
|
|
|
|
In another mode the whole guide can be lifted or tilted. Then motor 1 and 6 get new values and one of them
|
|
|
|
|
sends the drive command. This causes all 6 motors to drive synchronously to their new targets. This is
|
|
|
|
|
implemented through the LIFTSEGMENT function code.
|
|
|
|
|
In another mode the whole guide can be lifted or tilted. Then motor 1 and 6
|
|
|
|
|
get new values and one of them sends the drive command. This causes all 6
|
|
|
|
|
motors to drive synchronously to their new targets. This is implemented
|
|
|
|
|
through the LIFTSEGMENT function code.
|
|
|
|
|
|
|
|
|
|
Mark Koennecke, February 2020
|
|
|
|
|
Mark Koennecke, February 2020
|
|
|
|
|
|
|
|
|
|
The axis should not be enabled automatically
|
|
|
|
|
|
|
|
|
|
Michele Brambilla, February 2020
|
|
|
|
|
Michele Brambilla, February 2020
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
class LiftAxis : public pmacAxis
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
LiftAxis(pmacController *pController, int axisNo) : pmacAxis((pmacController *)pController,axisNo) {};
|
|
|
|
|
asynStatus move(double position, int relative, double min_velocity, double max_velocity, double acceleration);
|
|
|
|
|
asynStatus poll(bool *moving);
|
|
|
|
|
asynStatus stop(double acceleration);
|
|
|
|
|
private:
|
|
|
|
|
int waitStart;
|
|
|
|
|
class LiftAxis : public pmacAxis {
|
|
|
|
|
public:
|
|
|
|
|
/*
|
|
|
|
|
The default constructor of LiftAxis just forwards to the pmacAxis
|
|
|
|
|
constructor, which has an optional argument "autoenable" with the default
|
|
|
|
|
value "true". However, we want that argument to be false, hence we provide
|
|
|
|
|
an explicit constructor.
|
|
|
|
|
*/
|
|
|
|
|
LiftAxis(pmacController *pController, int axisNo)
|
|
|
|
|
: pmacAxis((pmacController *)pController, axisNo, false) {};
|
|
|
|
|
asynStatus move(double position, int relative, double min_velocity,
|
|
|
|
|
double max_velocity, double acceleration);
|
|
|
|
|
asynStatus poll(bool *moving);
|
|
|
|
|
asynStatus stop(double acceleration);
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
int waitStart;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/********************************************
|
|
|
|
|
/********************************************
|
|
|
|
|
* Protocol version 3 requires just some minor change
|
|
|
|
|
*
|
|
|
|
|
* Michele Brambilla, February 2022
|
|
|
|
|
********************************************/
|
|
|
|
|
|
|
|
|
|
class pmacV3Axis : public pmacAxis {
|
|
|
|
|
public:
|
|
|
|
|
public:
|
|
|
|
|
pmacV3Axis(pmacController *pController, int axisNo);
|
|
|
|
|
|
|
|
|
|
pmacV3Axis(pmacController *pController, int axisNo);
|
|
|
|
|
asynStatus move(double position, int relative, double min_velocity,
|
|
|
|
|
double max_velocity, double acceleration);
|
|
|
|
|
asynStatus poll(bool *moving);
|
|
|
|
|
|
|
|
|
|
asynStatus move(double position, int relative, double min_velocity,
|
|
|
|
|
double max_velocity, double acceleration);
|
|
|
|
|
asynStatus poll(bool *moving);
|
|
|
|
|
protected:
|
|
|
|
|
int IsEnable;
|
|
|
|
|
double Speed;
|
|
|
|
|
protected:
|
|
|
|
|
int IsEnable;
|
|
|
|
|
double Speed;
|
|
|
|
|
|
|
|
|
|
asynStatus getAxisStatus(bool *moving);
|
|
|
|
|
asynStatus getAxisStatus(bool *moving);
|
|
|
|
|
|
|
|
|
|
friend class pmacController;
|
|
|
|
|
friend class pmacV3Controller;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------------------------------*/
|
|
|
|
|
class pmacHRPTAxis : public pmacV3Axis
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
pmacHRPTAxis(pmacController *pController, int axisNo) : pmacV3Axis(pController,axisNo) {};
|
|
|
|
|
/**
|
|
|
|
|
* Override getAxisStatus in order to read the special parameter indicating a
|
|
|
|
|
* slit blade crash at HRPT
|
|
|
|
|
*/
|
|
|
|
|
asynStatus getAxisStatus(bool *moving);
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
friend class pmacController;
|
|
|
|
|
|
|
|
|
|
friend class pmacController;
|
|
|
|
|
friend class pmacV3Controller;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------------------------------*/
|
|
|
|
|
class pmacHRPTAxis : public pmacV3Axis {
|
|
|
|
|
public:
|
|
|
|
|
pmacHRPTAxis(pmacController *pController, int axisNo)
|
|
|
|
|
: pmacV3Axis(pController, axisNo) {};
|
|
|
|
|
/**
|
|
|
|
|
* Override getAxisStatus in order to read the special parameter indicating
|
|
|
|
|
* a slit blade crash at HRPT
|
|
|
|
|
*/
|
|
|
|
|
asynStatus getAxisStatus(bool *moving);
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
friend class pmacController;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Special motors for the AMOR detector movement. The whole
|
|
|
|
|
* command set is different but on a pmac controller. This implements
|
|
|
|
|
* a coordinated movement of cox, coz and ftz in order not to break
|
|
|
|
|
* the flight tube which may have been mounted. This is mapped to three
|
|
|
|
|
* motors selected via the function code: com, the detector omega, coz,
|
|
|
|
|
* motors selected via the function code: com, the detector omega, coz,
|
|
|
|
|
* the detector z offset and park, for parking the flightpath.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
@ -171,39 +182,41 @@ class pmacHRPTAxis : public pmacV3Axis
|
|
|
|
|
#define ADCOZ 2
|
|
|
|
|
#define ADPARK 3
|
|
|
|
|
|
|
|
|
|
class AmorDetectorAxis: public pmacAxis {
|
|
|
|
|
public:
|
|
|
|
|
AmorDetectorAxis(pmacController *pController, int axisNo, int function);
|
|
|
|
|
class AmorDetectorAxis : public pmacAxis {
|
|
|
|
|
public:
|
|
|
|
|
AmorDetectorAxis(pmacController *pController, int axisNo, int function);
|
|
|
|
|
|
|
|
|
|
asynStatus move(double position, int relative, double min_velocity,
|
|
|
|
|
double max_velocity, double acceleration);
|
|
|
|
|
asynStatus poll(bool *moving);
|
|
|
|
|
asynStatus moveVelocity(double min_velocity, double max_velocity, double acceleration);
|
|
|
|
|
asynStatus home(double min_velocity, double max_velocity, double acceleration, int forwards);
|
|
|
|
|
asynStatus stop(double acceleration);
|
|
|
|
|
asynStatus setPosition(double position);
|
|
|
|
|
asynStatus move(double position, int relative, double min_velocity,
|
|
|
|
|
double max_velocity, double acceleration);
|
|
|
|
|
asynStatus poll(bool *moving);
|
|
|
|
|
asynStatus moveVelocity(double min_velocity, double max_velocity,
|
|
|
|
|
double acceleration);
|
|
|
|
|
asynStatus home(double min_velocity, double max_velocity,
|
|
|
|
|
double acceleration, int forwards);
|
|
|
|
|
asynStatus stop(double acceleration);
|
|
|
|
|
asynStatus setPosition(double position);
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
int _function;
|
|
|
|
|
int det_starting;
|
|
|
|
|
time_t det_startTime;
|
|
|
|
|
protected:
|
|
|
|
|
int _function;
|
|
|
|
|
int det_starting;
|
|
|
|
|
time_t det_startTime;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class GirderAxis: public pmacV3Axis {
|
|
|
|
|
class GirderAxis : public pmacV3Axis {
|
|
|
|
|
public:
|
|
|
|
|
GirderAxis(pmacController *pController, int axisNo);
|
|
|
|
|
asynStatus move(double position, int relative, double min_velocity, double max_velocity, double acceleration);
|
|
|
|
|
asynStatus move(double position, int relative, double min_velocity,
|
|
|
|
|
double max_velocity, double acceleration);
|
|
|
|
|
asynStatus stop(double acceleration);
|
|
|
|
|
asynStatus poll(bool *moving);
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
int IsEnable;
|
|
|
|
|
|
|
|
|
|
friend class pmacController;
|
|
|
|
|
friend class pmacV3Controller;
|
|
|
|
|
friend class pmacController;
|
|
|
|
|
friend class pmacV3Controller;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#endif /* pmacAxis_H */
|
|
|
|
|