Merge branch 'master' of github.com:epics-modules/motor

This commit is contained in:
Mark Rivers
2017-03-07 13:41:42 -06:00
4 changed files with 130 additions and 101 deletions
+1 -1
View File
@@ -14,4 +14,4 @@ envPaths
dllPath.bat
auto_settings.sav*
auto_positions.sav*
.ccfxprepdir/
+1 -1
View File
@@ -39,7 +39,7 @@
record, and related EPICS software required to build and use it.  Version
R6-9 of the motor record is compatible with EPICS base R3.14.12.2 and above.
<p>
The motor record is intended to support motors of all kinds, but currently
The motor record is intended to support positioning motors of all kinds, but currently
supports only the following variety of motor controllers (in addition to Soft
Channel support):
</p>
+22 -1
View File
@@ -111,6 +111,13 @@ USAGE... Motor record driver level support for OMS model VME58.
* .41 10-20-11 rls - Added counter in send_mess() to prevent endless loop
* after VME58 reboot.
* .42 07-26-12 rls - Added reboot test to send_mess().
* .43 02-21-16 rls - Added code to send_mess() that test for a VME58 reboot
* after a motion related (ST, MA, MR) command. Found new
* VME58 failure mode where board reboots after the 1st
* motion related command. Since delay between motion
* command and reboot test must be long enough to avoid a
* VMEbus error, delay is excessive for normal operation.
* Hence, the oms58_reboot_test external variable.
*
*/
@@ -167,6 +174,7 @@ static inline void Debug(int level, const char *format, ...) {
/* Global data. */
int oms58_num_cards = 0;
int oms58_reboot_test = 0;
/* Local data required for every driver; see "motordrvComCode.h" */
#include "motordrvComCode.h"
@@ -720,7 +728,20 @@ static RTN_STATUS send_mess(int card, char const *com, char *name)
Debug(4, "send_mess: sent card %d message:", card);
Debug(4, "%s\n", outbuf);
pmotor->outPutIndex = putIndex; /* Message Sent */
pmotor->outPutIndex = putIndex; /* Send message. */
if (oms58_reboot_test != 0) /* Test if board has rebooted after sending message. */
{
epicsThreadSleep(0.300);
if (pmotor->rebootind != 0x4321)
{
errlogPrintf(rebootmsg, card);
/* Disable board. */
motor_state[card] = (struct controller *)NULL;
epicsThreadSleep(1.0);
return (ERROR);
}
}
for (count = 0; (putIndex != pmotor->outGetIndex) && (count < 1000); count++)
{
+106 -98
View File
@@ -24,87 +24,87 @@ Created: 15.12.2010
asynStatus PIGCSMotorController::initAxis(PIasynAxis* pAxis)
{
asynStatus status = hasLimitSwitches(pAxis);
if (asynSuccess != status)
{
return status;
}
status = hasReferenceSensor(pAxis);
if (asynSuccess != status)
{
return status;
}
return PIGCSController::initAxis(pAxis);
asynStatus status = hasLimitSwitches(pAxis);
if (asynSuccess != status)
{
return status;
}
status = hasReferenceSensor(pAxis);
if (asynSuccess != status)
{
return status;
}
return PIGCSController::initAxis(pAxis);
}
asynStatus PIGCSMotorController::setAccelerationCts( PIasynAxis* pAxis, double accelerationCts)
{
double acceleration = fabs(accelerationCts) * pAxis->m_CPUdenominator / pAxis->m_CPUnumerator;
if (acceleration == pAxis->m_acceleration)
return asynSuccess;
if (pAxis->m_maxAcceleration < 0)
{
getMaxAcceleration(pAxis);
}
if (acceleration > pAxis->m_maxAcceleration)
acceleration = pAxis->m_maxAcceleration;
double acceleration = fabs(accelerationCts) * pAxis->m_CPUdenominator / pAxis->m_CPUnumerator;
if (acceleration == pAxis->m_acceleration)
return asynSuccess;
if (pAxis->m_maxAcceleration < 0)
{
getMaxAcceleration(pAxis);
}
if (acceleration > pAxis->m_maxAcceleration)
acceleration = pAxis->m_maxAcceleration;
return setAcceleration(pAxis, acceleration);
return setAcceleration(pAxis, acceleration);
}
asynStatus PIGCSMotorController::referenceVelCts( PIasynAxis* pAxis, double velocity, int forwards)
{
asynStatus status = setServo(pAxis, 1);
asynStatus status = setServo(pAxis, 1);
if (asynSuccess != status)
return status;
return status;
char cmd[100];
if (velocity != 0)
{
velocity = fabs(velocity) * pAxis->m_CPUdenominator / pAxis->m_CPUnumerator;
sprintf(cmd,"SPA %s 0x50 %f", pAxis->m_szAxisName, velocity);
m_pInterface->sendOnly(cmd);
}
char cmd[100];
if (velocity != 0)
{
velocity = fabs(velocity) * pAxis->m_CPUdenominator / pAxis->m_CPUnumerator;
sprintf(cmd,"SPA %s 0x50 %f", pAxis->m_szAxisName, velocity);
m_pInterface->sendOnly(cmd);
}
if (pAxis->m_bHasReference)
{
// call FRF - find reference
sprintf(cmd,"FRF %s", pAxis->m_szAxisName);
}
else if (pAxis->m_bHasLimitSwitches)
{
if (forwards)
{
// call FPL - find positive limit switch
sprintf(cmd,"FPL %s", pAxis->m_szAxisName);
}
else
{
// call FNL - find negative limit switch
sprintf(cmd,"FNL %s", pAxis->m_szAxisName);
}
}
else
{
asynPrint(m_pInterface->m_pCurrentLogSink, ASYN_TRACE_ERROR,
"PIGCSMotorController::referenceVelCts() failed - axis has no reference/limit switch\n");
epicsSnprintf(pAxis->m_pasynUser->errorMessage,pAxis->m_pasynUser->errorMessageSize,
"PIGCSMotorController::referenceVelCts() failed - axis has no reference/limit switch\n");
return asynError;
}
status = m_pInterface->sendOnly(cmd);
if (asynSuccess != status)
return status;
int errorCode = getGCSError();
if (errorCode == 0)
{
return asynSuccess;
}
if (pAxis->m_bHasReference)
{
// call FRF - find reference
sprintf(cmd,"FRF %s", pAxis->m_szAxisName);
}
else if (pAxis->m_bHasLimitSwitches)
{
if (forwards)
{
// call FPL - find positive limit switch
sprintf(cmd,"FPL %s", pAxis->m_szAxisName);
}
else
{
// call FNL - find negative limit switch
sprintf(cmd,"FNL %s", pAxis->m_szAxisName);
}
}
else
{
asynPrint(m_pInterface->m_pCurrentLogSink, ASYN_TRACE_ERROR,
"PIGCSMotorController::referenceVelCts() failed - axis has no reference/limit switch\n");
epicsSnprintf(pAxis->m_pasynUser->errorMessage,pAxis->m_pasynUser->errorMessageSize,
"PIGCSMotorController::referenceVelCts() failed - axis has no reference/limit switch\n");
return asynError;
}
status = m_pInterface->sendOnly(cmd);
if (asynSuccess != status)
return status;
int errorCode = getGCSError();
if (errorCode == 0)
{
return asynSuccess;
}
asynPrint(m_pInterface->m_pCurrentLogSink, ASYN_TRACE_ERROR,
"PIGCSMotorController::referenceVelCts() failed\n");
epicsSnprintf(pAxis->m_pasynUser->errorMessage,pAxis->m_pasynUser->errorMessageSize,
"PIGCSMotorController::referenceVelCts() failed - GCS Error %d\n",errorCode);
return asynError;
"PIGCSMotorController::referenceVelCts() failed\n");
epicsSnprintf(pAxis->m_pasynUser->errorMessage,pAxis->m_pasynUser->errorMessageSize,
"PIGCSMotorController::referenceVelCts() failed - GCS Error %d\n",errorCode);
return asynError;
}
@@ -113,18 +113,18 @@ asynStatus PIGCSMotorController::referenceVelCts( PIasynAxis* pAxis, double velo
*/
asynStatus PIGCSMotorController::getResolution(PIasynAxis* pAxis, double& resolution )
{
// CPU is "Counts Per Unit"
// this is stored as two integers in the controller
// CPU is "Counts Per Unit"
// this is stored as two integers in the controller
double num, denom;
asynStatus status = getGCSParameter(pAxis, PI_PARA_MOT_CPU_Z, num);
if (status != asynSuccess)
{
return status;
return status;
}
status = getGCSParameter(pAxis, PI_PARA_MOT_CPU_N, denom);
if (status != asynSuccess)
{
return status;
return status;
}
pAxis->m_CPUnumerator = num;
pAxis->m_CPUdenominator = denom;
@@ -135,11 +135,11 @@ asynStatus PIGCSMotorController::getResolution(PIasynAxis* pAxis, double& resolu
asynStatus PIGCSMotorController::getStatus(PIasynAxis* pAxis, int& homing, int& moving, int& negLimit, int& posLimit, int& servoControl)
{
char buf[255];
char buf[255];
asynStatus status = m_pInterface->sendAndReceive(char(4), buf, 99);
if (status != asynSuccess)
{
return status;
return status;
}
// TODO this is for a single axis C-863/867 controller!!!!
// TODO a) change it to multi-axis code.
@@ -163,35 +163,43 @@ asynStatus PIGCSMotorController::getStatus(PIasynAxis* pAxis, int& homing, int&
asynStatus PIGCSMotorController::getMaxAcceleration(PIasynAxis* pAxis)
{
double maxAcc, maxDec;
asynStatus status = getGCSParameter(pAxis, PI_PARA_MOT_MAX_ACCEL, maxAcc);
if (asynSuccess != status)
return status;
status = getGCSParameter(pAxis, PI_PARA_MOT_MAX_DECEL, maxDec);
if (asynSuccess != status)
return status;
if (!m_KnowsVELcommand)
{
return asynSuccess;
}
double maxAcc, maxDec;
asynStatus status = getGCSParameter(pAxis, PI_PARA_MOT_MAX_ACCEL, maxAcc);
if (asynSuccess != status)
return status;
status = getGCSParameter(pAxis, PI_PARA_MOT_MAX_DECEL, maxDec);
if (asynSuccess != status)
return status;
if (maxAcc < maxDec)
{
pAxis->m_maxAcceleration = maxAcc;
}
else
{
pAxis->m_maxAcceleration = maxDec;
}
return status;
if (maxAcc < maxDec)
{
pAxis->m_maxAcceleration = maxAcc;
}
else
{
pAxis->m_maxAcceleration = maxDec;
}
return status;
}
asynStatus PIGCSMotorController::setAcceleration( PIasynAxis* pAxis, double acceleration)
{
asynStatus status = setGCSParameter(pAxis, PI_PARA_MOT_CURR_ACCEL, acceleration);
if (asynSuccess != status)
return status;
status = setGCSParameter(pAxis, PI_PARA_MOT_CURR_DECEL, acceleration);
if (asynSuccess != status)
return status;
pAxis->m_acceleration = acceleration;
return status;
if (!m_KnowsVELcommand)
{
return asynSuccess;
}
asynStatus status = setGCSParameter(pAxis, PI_PARA_MOT_CURR_ACCEL, acceleration);
if (asynSuccess != status)
return status;
status = setGCSParameter(pAxis, PI_PARA_MOT_CURR_DECEL, acceleration);
if (asynSuccess != status)
return status;
pAxis->m_acceleration = acceleration;
return status;
}