- Updated author and VERSION label.

- Restored requirement that RPS fields take precedence at initialization
(README item#1)
This commit is contained in:
Ron Sluiter
2000-06-14 15:07:47 +00:00
parent 5093c0dec9
commit 30a4f36525
+108 -33
View File
@@ -2,15 +2,15 @@
FILENAME... motorRecord.c
USAGE... Record Support Routines for the Motor record.
Version: $Revision: 1.1 $
Version: $Revision: 1.2 $
Modified By: $Author: sluiter $
Last Modified: $Date: 2000-02-08 22:18:43 $
Last Modified: $Date: 2000-06-14 15:07:47 $
*/
/*
* Original Author: Jim Kowalkowski
* Current Author: Tim Mooney
* Date: 06/14/95
* Previous Author: Tim Mooney
* Current Author: Ron Sluiter
*
* Experimental Physics and Industrial Control System (EPICS)
*
@@ -115,7 +115,7 @@ Last Modified: $Date: 2000-02-08 22:18:43 $
* when the user "hammers" on the jog request.
*/
#define VERSION 4.1
#define VERSION 4.2
#include <vxWorks.h>
#include <stdlib.h>
@@ -3054,10 +3054,72 @@ STATIC void load_pos(motorRecord * pmr)
SEND_MSG();
}
/*
* FUNCTION... static void check_speed_and_resolution(motorRecord *)
*
* INPUT ARGUMENTS...
* 1 - motor record pointer
*
* RETRUN ARGUMENTS... None.
*
* LOGIC...
*
* IF SREV negative.
* Set SREV <- 200.
* ENDIF
* IF UREV nonzero.
* Set MRES < - |UREV| / SREV.
* ENDIF
* IF MRES zero.
* Set MRES <- 1.0
* ENDIF
* IF UREV does not match MRES.
* Set UREV <- MRES * SREV.
* ENDIF
*
* IF SMAX > 0.
* Set VMAX <- SMAX * |UREV|.
* ELSE IF VMAX > 0.
* Set SMAX <- VMAX / |UREV|.
* ELSE
* Set both SMAX and VMAX to zero.
* ENDIF
*
* IF SBAS is nonzero.
* Range check; 0 < SBAS < SMAX.
* Set VBAS <- SBAS * |UREV|.
* ELSE
* Range check; 0 < VBAS < VMAX.
* Set SBAS <- VBAS / |UREV|.
* ENDIF
*
* IF S is nonzero.
* Range check; SBAS < S < SMAX.
* VELO <- S * |UREV|.
* ELSE
* Range check; VBAS < VELO < VMAX.
* S < - VELO / |UREV|.
* ENDIF
*
* IF SBAK is nonzero.
* Range check; SBAS < SBAK < SMAX.
* BVEL <- SBAK * |UREV|.
* ELSE
* Range check; VBAS < BVEL < VMAX.
* SBAK <- BVEL / |UREV|.
* ENDIF
*
* IF ACCL or BACC is zero.
* Set ACCL/BACC to 0.1
* ENDIF
*
* NORMAL RETURN.
*/
STATIC void check_speed_and_resolution(motorRecord * pmr)
{
const unsigned short monitor_mask = DBE_VALUE;
double temp_dbl, fabs_urev = fabs(pmr->urev);
double fabs_urev = fabs(pmr->urev);
/*
* Reconcile two different ways of specifying speed, resolution, and make
@@ -3089,45 +3151,58 @@ STATIC void check_speed_and_resolution(motorRecord * pmr)
MARK_AUX(M_UREV);
}
/* SBAS (revolutions/sec) <--> VBAS (EGU/sec) */
range_check(pmr, &pmr->vbas, 0.0, pmr->vmax);
if ((pmr->urev != 0.0) && (pmr->sbas != (temp_dbl = pmr->vbas / fabs_urev)))
{
pmr->sbas = temp_dbl;
db_post_events(pmr, &pmr->sbas, monitor_mask);
}
/* SMAX (revolutions/sec) <--> VMAX (EGU/sec) */
if (pmr->vmax < 0.0)
{
pmr->vmax = 0.0;
db_post_events(pmr, &pmr->vmax, monitor_mask);
}
if (pmr->smax > 0.0)
pmr->vmax = pmr->smax * fabs_urev;
else if (pmr->vmax > 0.0)
pmr->smax = pmr->vmax / fabs_urev;
else
pmr->smax = pmr->vmax = 0.0;
db_post_events(pmr, &pmr->vmax, monitor_mask);
db_post_events(pmr, &pmr->smax, monitor_mask);
if ((pmr->urev != 0.0) && (pmr->smax != (temp_dbl = pmr->vmax / fabs_urev)))
/* SBAS (revolutions/sec) <--> VBAS (EGU/sec) */
if (pmr->sbas != 0.0)
{
pmr->smax = temp_dbl;
db_post_events(pmr, &pmr->smax, monitor_mask);
range_check(pmr, &pmr->sbas, 0.0, pmr->smax);
pmr->vbas = pmr->sbas * fabs_urev;
}
else
{
range_check(pmr, &pmr->vbas, 0.0, pmr->vmax);
pmr->sbas = pmr->vbas / fabs_urev;
}
db_post_events(pmr, &pmr->vbas, monitor_mask);
db_post_events(pmr, &pmr->sbas, monitor_mask);
/* S (revolutions/sec) <--> VELO (EGU/sec) */
range_check(pmr, &pmr->velo, pmr->vbas, pmr->vmax);
if ((pmr->urev != 0.0) && (pmr->s != (temp_dbl = pmr->velo / fabs_urev)))
if (pmr->s != 0.0)
{
pmr->s = temp_dbl;
db_post_events(pmr, &pmr->s, monitor_mask);
range_check(pmr, &pmr->s, pmr->sbas, pmr->smax);
pmr->velo = pmr->s * fabs_urev;
}
else
{
range_check(pmr, &pmr->velo, pmr->vbas, pmr->vmax);
pmr->s = pmr->velo / fabs_urev;
}
db_post_events(pmr, &pmr->velo, monitor_mask);
db_post_events(pmr, &pmr->s, monitor_mask);
/* SBAK (revolutions/sec) <--> BVEL (EGU/sec) */
range_check(pmr, &pmr->bvel, pmr->vbas, pmr->vmax);
if ((pmr->urev != 0.0) && (pmr->sbak != (temp_dbl = pmr->bvel / fabs_urev)))
if (pmr->sbak != 0.0)
{
pmr->sbak = temp_dbl;
db_post_events(pmr, &pmr->sbak, monitor_mask);
range_check(pmr, &pmr->sbak, pmr->sbas, pmr->smax);
pmr->bvel = pmr->sbak * fabs_urev;
}
else
{
range_check(pmr, &pmr->bvel, pmr->vbas, pmr->vmax);
pmr->sbak = pmr->bvel / fabs_urev;
}
db_post_events(pmr, &pmr->sbak, monitor_mask);
db_post_events(pmr, &pmr->bvel, monitor_mask);
/* Sanity check on acceleration time. */
if (pmr->accl == 0.0)