From 3ee507086a468975c13aec64a8baa29f2899aa2a Mon Sep 17 00:00:00 2001 From: smathis Date: Thu, 5 Dec 2024 11:16:44 +0100 Subject: [PATCH] Included the possibility to vary the motor speed. --- Makefile | 2 +- README.md | 59 +++++++++++++++++++--------------------------- db/pmacv3.db | 2 +- src/pmacv3Axis.cpp | 22 +++++++---------- 4 files changed, 35 insertions(+), 50 deletions(-) diff --git a/Makefile b/Makefile index 08a4a4e..0d28cbd 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ REQUIRED+=asynMotor REQUIRED+=sinqMotor # 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. HEADERS += src/pmacv3Axis.h diff --git a/README.md b/README.md index e395a08..3abbb30 100644 --- a/README.md +++ b/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. -## 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): - `pmacv3Controller`: Create a new controller 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. - -## 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: - +These functions are parametrized as follows: ``` -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) -require pmacv3, x.x.x # This is the three-digit version number of the pmacv3 module -dbLoadTemplate "motor.substitutions" +pmacv3Controller( + "$(NAME)", # Name of the MCU, e.g. mcu1. This parameter should be provided by an environment variable. + "$(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: -``` -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 +### Versioning 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. diff --git a/db/pmacv3.db b/db/pmacv3.db index 9d6cd4c..81d3d39 100644 --- a/db/pmacv3.db +++ b/db/pmacv3.db @@ -1,6 +1,6 @@ # 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 motorEnable_ -> MOTOR_ENABLE. +# 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") diff --git a/src/pmacv3Axis.cpp b/src/pmacv3Axis.cpp index 0d8aaef..639d1ef 100644 --- a/src/pmacv3Axis.cpp +++ b/src/pmacv3Axis.cpp @@ -951,18 +951,7 @@ asynStatus pmacv3Axis::rereadEncoder() { // Abort if the axis is incremental if (strcmp(encoderType, IncrementalEncoder) == 1) { - asynPrint(pC_->pasynUserSelf, ASYN_TRACE_WARNING, - "%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; + return asynSuccess; } // Check if the axis is disabled. If not, inform the user that this @@ -1062,6 +1051,14 @@ asynStatus pmacv3Axis::enable(bool on) { 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 snprintf(command, sizeof(command), "M%2.2d14=%d", axisNo_, on); asynPrint(pC_->pasynUserSelf, ASYN_TRACE_FLOW, @@ -1077,7 +1074,6 @@ asynStatus pmacv3Axis::enable(bool on) { return pC_->paramLibAccessFailed(pl_status, "motorMessageText_", __PRETTY_FUNCTION__, __LINE__); } - rw_status = pC_->writeRead(axisNo_, command, response, 0); if (rw_status != asynSuccess) { return rw_status;