Compare commits
3 Commits
Author | SHA1 | Date | |
---|---|---|---|
b6e0f03a17 | |||
5946563372 | |||
da96b4b973 |
@ -75,7 +75,8 @@ dbLoadTemplate("$(TOP)/mcu1.substitutions", "INSTR=$(INSTR)$(NAME):,CONTROLLER=$
|
|||||||
|
|
||||||
### Substitution file
|
### Substitution file
|
||||||
|
|
||||||
The substitution file is a table containing axis-specific information which is used to create the axis-specific PVs. To work with sinqMotor, "mcu1.substitutions" needs to look like this:
|
The substitution file is a table containing axis-specific information which is used to create the axis-specific PVs.
|
||||||
|
To work with sinqMotor, "mcu1.substitutions" needs to look like this (the order of columns does not matter):
|
||||||
```
|
```
|
||||||
file "$(SINQDBPATH)"
|
file "$(SINQDBPATH)"
|
||||||
{
|
{
|
||||||
@ -93,13 +94,13 @@ The variable `SINQDBPATH` has been set in "mcu1.cmd" before calling `dbLoadTempl
|
|||||||
|
|
||||||
- `AXIS`: Index of the axis, corresponds to the physical connection of the axis to the MCU.
|
- `AXIS`: Index of the axis, corresponds to the physical connection of the axis to the MCU.
|
||||||
- `M`: The full PV name is created by concatenating the variables INSTR, NAME and M. For example, the PV of the first axis would be "SQ:SINQTEST:mcu1:lin1".
|
- `M`: The full PV name is created by concatenating the variables INSTR, NAME and M. For example, the PV of the first axis would be "SQ:SINQTEST:mcu1:lin1".
|
||||||
- `DESC`: Description of the motor. This field is just for documentation and is not needed for operating a motor.
|
|
||||||
- `EGU`: Engineering units. For a linear motor, this is mm, for a rotaty motor, this is degree.
|
- `EGU`: Engineering units. For a linear motor, this is mm, for a rotaty motor, this is degree.
|
||||||
- `DIR`: If set to "Neg", the axis direction is inverted.
|
- `DIR`: If set to "Neg", the axis direction is inverted.
|
||||||
- `MRES`: This is a scaling factor determining the resolution of the position readback value. For example, 0.001 means a precision of 1 um. A detailed description can be found in section [Motor record resolution MRES](#motor-record-resolution-mres).
|
- `MRES`: This is a scaling factor determining the resolution of the position readback value. For example, 0.001 means a precision of 1 um. A detailed description can be found in section [Motor record resolution MRES](#motor-record-resolution-mres).
|
||||||
|
|
||||||
#### Optional parameters
|
#### Optional parameters
|
||||||
The default values for those parameters are given for the individual records in db/sinqMotor.db
|
The default values for those parameters are given for the individual records in db/sinqMotor.db
|
||||||
|
- `DESC`: Description of the motor. This field is just for documentation and is not needed for operating a motor.
|
||||||
- `MSGTEXTSIZE`: Buffer size for the motor message record in characters
|
- `MSGTEXTSIZE`: Buffer size for the motor message record in characters
|
||||||
- `ENABLEMOVWATCHDOG`: Sets `setWatchdogEnabled` during IOC startup to the given value.
|
- `ENABLEMOVWATCHDOG`: Sets `setWatchdogEnabled` during IOC startup to the given value.
|
||||||
- `LIMITSOFFSET`: If the motor limits are read out from the controller, they can
|
- `LIMITSOFFSET`: If the motor limits are read out from the controller, they can
|
||||||
|
@ -5,32 +5,63 @@
|
|||||||
|
|
||||||
sinqAxis::sinqAxis(class sinqController *pC, int axisNo)
|
sinqAxis::sinqAxis(class sinqController *pC, int axisNo)
|
||||||
: asynMotorAxis((asynMotorController *)pC, axisNo), pC_(pC) {
|
: asynMotorAxis((asynMotorController *)pC, axisNo), pC_(pC) {
|
||||||
|
asynStatus status = asynSuccess;
|
||||||
|
|
||||||
initial_poll_ = true;
|
initial_poll_ = true;
|
||||||
watchdogMovActive_ = false;
|
watchdogMovActive_ = false;
|
||||||
init_poll_counter_ = 0;
|
init_poll_counter_ = 0;
|
||||||
scaleMovTimeout_ = 2.0;
|
scaleMovTimeout_ = 2.0;
|
||||||
offsetMovTimeout_ = 30;
|
offsetMovTimeout_ = 30;
|
||||||
}
|
|
||||||
|
|
||||||
asynStatus sinqAxis::atFirstPoll() {
|
|
||||||
asynStatus status = asynSuccess;
|
|
||||||
int variableSpeed = 0;
|
|
||||||
|
|
||||||
// Motor is assumed to be enabled
|
// Motor is assumed to be enabled
|
||||||
status = pC_->setIntegerParam(axisNo_, pC_->motorEnableRBV_, 1);
|
status = pC_->setIntegerParam(axisNo_, pC_->motorEnableRBV_, 1);
|
||||||
if (status != asynSuccess) {
|
if (status != asynSuccess) {
|
||||||
return pC_->paramLibAccessFailed(status, "motorEnableRBV_",
|
asynPrint(
|
||||||
__PRETTY_FUNCTION__, __LINE__);
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
// By default, motors cannot be disabled
|
// By default, motors cannot be disabled
|
||||||
status = pC_->setIntegerParam(axisNo_, pC_->motorCanDisable_, 0);
|
status = pC_->setIntegerParam(axisNo_, pC_->motorCanDisable_, 0);
|
||||||
if (status != asynSuccess) {
|
if (status != asynSuccess) {
|
||||||
return pC_->paramLibAccessFailed(status, "motorCanDisable_",
|
asynPrint(
|
||||||
__PRETTY_FUNCTION__, __LINE__);
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Provide a default value for the motor position.
|
||||||
|
status = pC_->setDoubleParam(axisNo_, pC_->motorPosition_, 0.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);
|
||||||
|
}
|
||||||
|
|
||||||
|
// We assume that the motor has no status problems initially
|
||||||
|
status = pC_->setIntegerParam(axisNo_, pC_->motorStatusProblem_, 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
asynStatus sinqAxis::atFirstPoll() {
|
||||||
|
asynStatus status = asynSuccess;
|
||||||
|
int variableSpeed = 0;
|
||||||
|
|
||||||
status =
|
status =
|
||||||
pC_->getIntegerParam(axisNo_, pC_->motorCanSetSpeed_, &variableSpeed);
|
pC_->getIntegerParam(axisNo_, pC_->motorCanSetSpeed_, &variableSpeed);
|
||||||
if (status != asynSuccess) {
|
if (status != asynSuccess) {
|
||||||
|
@ -290,7 +290,7 @@ asynStatus sinqController::errMsgCouldNotParseResponse(const char *command,
|
|||||||
asynStatus pl_status = asynSuccess;
|
asynStatus pl_status = asynSuccess;
|
||||||
|
|
||||||
asynPrint(lowLevelPortUser_, ASYN_TRACE_ERROR,
|
asynPrint(lowLevelPortUser_, ASYN_TRACE_ERROR,
|
||||||
"%s => line %d:\nCould not interpret response %s for "
|
"%s => line %d:\nCould not interpret response '%s' for "
|
||||||
"command %s.\n",
|
"command %s.\n",
|
||||||
functionName, lineNumber, response, command);
|
functionName, lineNumber, response, command);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user