Included the possibility to vary the motor speed.
This commit is contained in:
2
Makefile
2
Makefile
@ -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=mathis_s
|
sinqMotor_VERSION=0.4.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
|
||||||
|
59
README.md
59
README.md
@ -4,50 +4,39 @@
|
|||||||
|
|
||||||
This is a driver for the pmacV3 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.
|
This is a driver for the pmacV3 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.
|
||||||
|
|
||||||
## Usage in IOC shell
|
## User guide
|
||||||
|
|
||||||
|
This driver is a standard sinqMotor-derived driver and does not need any specific configuration. For the general configuration, please see https://git.psi.ch/sinq-epics-modules/sinqmotor/-/blob/main/README.md.
|
||||||
|
|
||||||
|
## Developer guide
|
||||||
|
|
||||||
|
### Usage in IOC shell
|
||||||
|
|
||||||
pmacv3 exposes the following IOC shell functions (all in pmacv3Controller.cpp):
|
pmacv3 exposes the following IOC shell functions (all in pmacv3Controller.cpp):
|
||||||
- `pmacv3Controller`: Create a new controller object.
|
- `pmacv3Controller`: Create a new controller object.
|
||||||
- `pmacv3Axis`: Create a new axis object.
|
- `pmacv3Axis`: Create a new axis object.
|
||||||
The function arguments are documented directly within the source code or are available from the help function of the IOC shell.
|
These functions are parametrized as follows:
|
||||||
|
|
||||||
## Database
|
|
||||||
|
|
||||||
The pmacV3 module provides additional PVs in the database template db/pmacv3.db. It can be parametrized with the `dbLoadTemplate` function from the IOC shell:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
require sinqMotor, y.y.y # The sinqMotor module is needed for the pmacv3 module. The version y.y.y is defined in the Makefile (line sinqMotor_VERSION=x.x.x)
|
pmacv3Controller(
|
||||||
require pmacv3, x.x.x # This is the three-digit version number of the pmacv3 module
|
"$(NAME)", # Name of the MCU, e.g. mcu1. This parameter should be provided by an environment variable.
|
||||||
dbLoadTemplate "motor.substitutions"
|
"$(ASYN_PORT)", # IP-Port of the MCU. This parameter should be provided by an environment variable.
|
||||||
|
8, # Maximum number of axes
|
||||||
|
0.05, # Busy poll period in seconds
|
||||||
|
1, # Idle poll period in seconds
|
||||||
|
0.05 # Communication timeout in seconds
|
||||||
|
);
|
||||||
|
```
|
||||||
|
```
|
||||||
|
pmacv3Axis(
|
||||||
|
"$(NAME)", # Name of the associated MCU, e.g. mcu1. This parameter should be provided by an environment variable.
|
||||||
|
1 # Index of the axis.
|
||||||
|
);
|
||||||
```
|
```
|
||||||
|
|
||||||
The substitutions file can be concatenated with that of sinqMotor:
|
### Versioning
|
||||||
```
|
|
||||||
file "$(sinqMotor_DB)/sinqMotor.db"
|
|
||||||
{
|
|
||||||
pattern
|
|
||||||
...
|
|
||||||
}
|
|
||||||
|
|
||||||
file "$(pmacv3_DB)/pmacv3.db"
|
|
||||||
{
|
|
||||||
pattern
|
|
||||||
{ AXIS, M}
|
|
||||||
{ 1, "lin1"}
|
|
||||||
{ 2, "rot1"}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
The sinqMotor pattern "..." is documented in https://git.psi.ch/sinq-epics-modules/sinqmotor/-/blob/main/README.md.
|
|
||||||
The other parameters have the following meaning:
|
|
||||||
- `AXIS`: Index of the axis, corresponds to the physical connection of the axis to the MCU
|
|
||||||
- `M`: Name of the motor as shown in EPICS
|
|
||||||
|
|
||||||
The axis name should correspond to that of the sinqMotor pattern with the same respective index.
|
|
||||||
|
|
||||||
## Versioning
|
|
||||||
|
|
||||||
Please see the documentation for the module sinqMotor: https://git.psi.ch/sinq-epics-modules/sinqmotor/-/blob/main/README.md.
|
Please see the documentation for the module sinqMotor: https://git.psi.ch/sinq-epics-modules/sinqmotor/-/blob/main/README.md.
|
||||||
|
|
||||||
## How to build it
|
### How to build it
|
||||||
|
|
||||||
Please see the documentation for the module sinqMotor: https://git.psi.ch/sinq-epics-modules/sinqmotor/-/blob/main/README.md.
|
Please see the documentation for the module sinqMotor: https://git.psi.ch/sinq-epics-modules/sinqmotor/-/blob/main/README.md.
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# Read out the encoder type in human-readable form. The output numbers can be
|
# Read out the encoder type in human-readable form. The output numbers can be
|
||||||
# interpreted as ASCII.
|
# interpreted as ASCII.
|
||||||
# This record is coupled to the parameter library via motorEnable_ -> MOTOR_ENABLE.
|
# This record is coupled to the parameter library via encoderType -> ENCODER_TYPE.
|
||||||
record(waveform, "$(INSTR)$(M):Encoder_Type") {
|
record(waveform, "$(INSTR)$(M):Encoder_Type") {
|
||||||
field(DTYP, "asynOctetRead")
|
field(DTYP, "asynOctetRead")
|
||||||
field(INP, "@asyn($(CONTROLLER),$(AXIS),1) ENCODER_TYPE")
|
field(INP, "@asyn($(CONTROLLER),$(AXIS),1) ENCODER_TYPE")
|
||||||
|
@ -951,18 +951,7 @@ asynStatus pmacv3Axis::rereadEncoder() {
|
|||||||
|
|
||||||
// Abort if the axis is incremental
|
// Abort if the axis is incremental
|
||||||
if (strcmp(encoderType, IncrementalEncoder) == 1) {
|
if (strcmp(encoderType, IncrementalEncoder) == 1) {
|
||||||
asynPrint(pC_->pasynUserSelf, ASYN_TRACE_WARNING,
|
return asynSuccess;
|
||||||
"%s => line %d:\nTrying to reread absolute encoder of "
|
|
||||||
"axis %d on controller %s, but it is a relative encoder.\n",
|
|
||||||
__PRETTY_FUNCTION__, __LINE__, axisNo_, pC_->portName);
|
|
||||||
pl_status = setStringParam(pC_->motorMessageText_,
|
|
||||||
"Cannot reread an incremental encoder.");
|
|
||||||
if (pl_status != asynSuccess) {
|
|
||||||
return pC_->paramLibAccessFailed(pl_status, "motorMessageText_",
|
|
||||||
__PRETTY_FUNCTION__, __LINE__);
|
|
||||||
}
|
|
||||||
|
|
||||||
return asynError;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if the axis is disabled. If not, inform the user that this
|
// Check if the axis is disabled. If not, inform the user that this
|
||||||
@ -1062,6 +1051,14 @@ asynStatus pmacv3Axis::enable(bool on) {
|
|||||||
return asynSuccess;
|
return asynSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Reread the encoder, if the axis is going to be enabled
|
||||||
|
if (on != 0) {
|
||||||
|
rw_status = rereadEncoder();
|
||||||
|
if (rw_status != asynSuccess) {
|
||||||
|
return rw_status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Enable / disable the axis if it is not moving
|
// Enable / disable the axis if it is not moving
|
||||||
snprintf(command, sizeof(command), "M%2.2d14=%d", axisNo_, on);
|
snprintf(command, sizeof(command), "M%2.2d14=%d", axisNo_, on);
|
||||||
asynPrint(pC_->pasynUserSelf, ASYN_TRACE_FLOW,
|
asynPrint(pC_->pasynUserSelf, ASYN_TRACE_FLOW,
|
||||||
@ -1077,7 +1074,6 @@ asynStatus pmacv3Axis::enable(bool on) {
|
|||||||
return pC_->paramLibAccessFailed(pl_status, "motorMessageText_",
|
return pC_->paramLibAccessFailed(pl_status, "motorMessageText_",
|
||||||
__PRETTY_FUNCTION__, __LINE__);
|
__PRETTY_FUNCTION__, __LINE__);
|
||||||
}
|
}
|
||||||
|
|
||||||
rw_status = pC_->writeRead(axisNo_, command, response, 0);
|
rw_status = pC_->writeRead(axisNo_, command, response, 0);
|
||||||
if (rw_status != asynSuccess) {
|
if (rw_status != asynSuccess) {
|
||||||
return rw_status;
|
return rw_status;
|
||||||
|
Reference in New Issue
Block a user