From eea6efa880ceeea67ad5fbd3090be10ab100bd8f Mon Sep 17 00:00:00 2001 From: kmpeters Date: Fri, 14 Jun 2013 20:50:47 +0000 Subject: [PATCH] Added the ability to move all hexapod motors to new target positions (not using deferred moves). --- README | 1 + iocBoot/iocWithAsyn/motor.cmd.hxp | 5 + motorApp/Db/HXP_extra.db | 91 +- motorApp/NewportSrc/HXPDriver.cpp | 115 +- motorApp/NewportSrc/HXPDriver.h | 22 +- motorApp/op/adl/HXP_moveAll.adl | 1636 +++++++++++++++++++++++++++++ 6 files changed, 1849 insertions(+), 21 deletions(-) create mode 100644 motorApp/op/adl/HXP_moveAll.adl diff --git a/README b/README index 091a4186..ac176234 100644 --- a/README +++ b/README @@ -220,6 +220,7 @@ Modification Log for R6-8 motorApp/NewportSrc/HXPDriver.{cpp,h} motorApp/NewportSrc/hxp_drivers.{cpp,h} motorApp/NewportSrc/hxp_error.h + motorApp/op/adl/HXP_{extra,motors,moveAll}.adl Modification Log for R6-7 diff --git a/iocBoot/iocWithAsyn/motor.cmd.hxp b/iocBoot/iocWithAsyn/motor.cmd.hxp index 077b33b4..b076fd70 100644 --- a/iocBoot/iocWithAsyn/motor.cmd.hxp +++ b/iocBoot/iocWithAsyn/motor.cmd.hxp @@ -1,6 +1,11 @@ dbLoadTemplate("motor.substitutions.hxp") HXPCreateController("HXP1", "192.168.1.42", 5001, 200, 1000) +# A shorter, idle-poll period is desirable if the motors +# are moved using HXP_moveAll.adl, since this period determines +# how long it takes for the motor records to see that an +# external move has been initiated. +#!HXPCreateController("HXP1", "192.168.1.42", 5001, 200, 200) #asynSetTraceIOMask("HXP1", 0, 2) #asynSetTraceMask("HXP1", 0, 255) diff --git a/motorApp/Db/HXP_extra.db b/motorApp/Db/HXP_extra.db index 72ea7fc6..2b8ec60b 100644 --- a/motorApp/Db/HXP_extra.db +++ b/motorApp/Db/HXP_extra.db @@ -1,35 +1,98 @@ record(mbbo,"$(P)$(R)CS") { field(DESC,"Coordinate System") - field(DTYP, "asynInt32") - field(OUT,"@asynMask($(PORT) 0 0xFFFF)HXP_MOVE_COORD_SYS") + field(DTYP,"asynInt32") + field(OUT, "@asynMask($(PORT) 0 0xFFFF)HXP_MOVE_COORD_SYS") field(ZRVL,"0") field(ZRST,"Work") field(ONVL,"1") field(ONST,"Tool") field(VAL, "0") - field(PINI, "YES") + field(PINI,"YES") } record(ai,"$(P)$(R)STATUS") { field(DESC,"HXP Group Status") - field(DTYP, "asynInt32") - field(PINI, "1") + field(DTYP,"asynInt32") + field(PINI,"1") field(PREC,"0") - field(SCAN, "I/O Intr") - field(INP,"@asyn($(PORT),0)HXP_STATUS") + field(SCAN,"I/O Intr") + field(INP, "@asyn($(PORT),0)HXP_STATUS") } record(ai,"$(P)$(R)ERROR") { field(DESC,"HXP Group Error") - field(DTYP, "asynInt32") + field(DTYP,"asynInt32") field(PREC,"0") - field(SCAN, "I/O Intr") - field(INP,"@asyn($(PORT),0)HXP_ERROR") + field(SCAN,"I/O Intr") + field(INP, "@asyn($(PORT),0)HXP_ERROR") } record(stringin, "$(P)$(R)ERR_DESC") { - field(DESC, "Error Description") - field(DTYP, "asynOctetRead") - field(SCAN, "I/O Intr") - field(INP, "@asyn($(PORT),0)HXP_ERROR_DESC") + field(DESC,"Error Description") + field(DTYP,"asynOctetRead") + field(SCAN,"I/O Intr") + field(INP, "@asyn($(PORT),0)HXP_ERROR_DESC") } + +record(bo,"$(P)$(R)MOVE_ALL") { + field(DESC,"Move all motors") + field(DTYP,"asynInt32") + field(ZNAM,"Off") + field(ONAM,"On") + field(OUT, "@asyn($(PORT),0)HXP_MOVE_ALL") +} + +record(ao,"$(P)$(R)T1") { + field(DESC,"X target pos") + field(DTYP,"asynFloat64") + field(OUT, "@asyn($(PORT),0)HXP_MOVE_ALL_TARGET_X") + field(PREC,"5") + field(VAL, "0.0") + field(PINI,"YES") +} + +record(ao,"$(P)$(R)T2") { + field(DESC,"Y target pos") + field(DTYP,"asynFloat64") + field(OUT, "@asyn($(PORT),0)HXP_MOVE_ALL_TARGET_Y") + field(PREC,"5") + field(VAL, "0.0") + field(PINI,"YES") +} + +record(ao,"$(P)$(R)T3") { + field(DESC,"Z target pos") + field(DTYP,"asynFloat64") + field(OUT, "@asyn($(PORT),0)HXP_MOVE_ALL_TARGET_Z") + field(PREC,"5") + field(VAL, "12.0") + field(PINI,"YES") +} + +record(ao,"$(P)$(R)T4") { + field(DESC,"U target pos") + field(DTYP,"asynFloat64") + field(OUT, "@asyn($(PORT),0)HXP_MOVE_ALL_TARGET_U") + field(PREC,"5") + field(VAL, "0.0") + field(PINI,"YES") +} + +record(ao,"$(P)$(R)T5") { + field(DESC,"V target pos") + field(DTYP,"asynFloat64") + field(OUT, "@asyn($(PORT),0)HXP_MOVE_ALL_TARGET_V") + field(PREC,"5") + field(VAL, "0.0") + field(PINI,"YES") +} + +record(ao,"$(P)$(R)T6") { + field(DESC,"W target pos") + field(DTYP,"asynFloat64") + field(OUT, "@asyn($(PORT),0)HXP_MOVE_ALL_TARGET_W") + field(PREC,"5") + field(VAL, "0.0") + field(PINI,"YES") +} + diff --git a/motorApp/NewportSrc/HXPDriver.cpp b/motorApp/NewportSrc/HXPDriver.cpp index e00792fa..845919cd 100644 --- a/motorApp/NewportSrc/HXPDriver.cpp +++ b/motorApp/NewportSrc/HXPDriver.cpp @@ -54,10 +54,17 @@ HXPController::HXPController(const char *portName, const char *IPAddress, int IP IPAddress_ = epicsStrDup(IPAddress); IPPort_ = IPPort; - createParam(HXPMoveCoordSysString, asynParamInt32, &HXPMoveCoordSys_); - createParam(HXPStatusString, asynParamInt32, &HXPStatus_); - createParam(HXPErrorString, asynParamInt32, &HXPError_); - createParam(HXPErrorDescString, asynParamOctet, &HXPErrorDesc_); + createParam(HXPMoveCoordSysString, asynParamInt32, &HXPMoveCoordSys_); + createParam(HXPStatusString, asynParamInt32, &HXPStatus_); + createParam(HXPErrorString, asynParamInt32, &HXPError_); + createParam(HXPErrorDescString, asynParamOctet, &HXPErrorDesc_); + createParam(HXPMoveAllString, asynParamInt32, &HXPMoveAll_); + createParam(HXPMoveAllTargetXString, asynParamFloat64, &HXPMoveAllTargetX_); + createParam(HXPMoveAllTargetYString, asynParamFloat64, &HXPMoveAllTargetY_); + createParam(HXPMoveAllTargetZString, asynParamFloat64, &HXPMoveAllTargetZ_); + createParam(HXPMoveAllTargetUString, asynParamFloat64, &HXPMoveAllTargetU_); + createParam(HXPMoveAllTargetVString, asynParamFloat64, &HXPMoveAllTargetV_); + createParam(HXPMoveAllTargetWString, asynParamFloat64, &HXPMoveAllTargetW_); // This socket is used for polling by the controller and all axes pollSocket_ = HXPTCP_ConnectToServer((char *)IPAddress, IPPort, HXP_POLL_TIMEOUT); @@ -131,6 +138,103 @@ HXPAxis* HXPController::getAxis(int axisNo) } +/** Called when asyn clients call pasynInt32->write(). + * Extracts the function and axis number from pasynUser. + * Sets the value in the parameter library. + * If the function is HXPMoveAll_ then it calls moves all motors with a single command + * For all other functions it calls asynMotorController::writeInt32. + * Calls any registered callbacks for this pasynUser->reason and address. + * \param[in] pasynUser asynUser structure that encodes the reason and address. + * \param[in] value Value to write. */ +asynStatus HXPController::writeInt32(asynUser *pasynUser, epicsInt32 value) +{ + int function = pasynUser->reason; + asynStatus status = asynSuccess; + HXPAxis *pAxis = getAxis(pasynUser); + static const char *functionName = "writeInt32"; + + /* Set the parameter and readback in the parameter library. This may be overwritten when we read back the + * status at the end, but that's OK */ + status = setIntegerParam(pAxis->axisNo_, function, value); + + if (function == HXPMoveAll_) + { + /* if value == 1: motors are moved + if value == 0: nothing is done and parameter is simply reset */ + if (value == 1) + { + moveAll(pAxis); + } + } + else + { + /* Call base class method */ + status = asynMotorController::writeInt32(pasynUser, value); + } + + /* Do callbacks so higher layers see any changes */ + callParamCallbacks(pAxis->axisNo_); + if (status) + asynPrint(pasynUser, ASYN_TRACE_ERROR, + "%s:%s: error, status=%d function=%d, value=%d\n", + driverName, functionName, status, function, value); + else + asynPrint(pasynUser, ASYN_TRACEIO_DRIVER, + "%s:%s: function=%d, value=%d\n", + driverName, functionName, function, value); + return status; +} + + +/** + * Moves all hexpod axes to new target positions + */ +int HXPController::moveAll(HXPAxis *pAxis) +{ + int status; + double x, y, z, u, v, w; + + getDoubleParam(0, HXPMoveAllTargetX_, &x); + getDoubleParam(0, HXPMoveAllTargetY_, &y); + getDoubleParam(0, HXPMoveAllTargetZ_, &z); + getDoubleParam(0, HXPMoveAllTargetU_, &u); + getDoubleParam(0, HXPMoveAllTargetV_, &v); + getDoubleParam(0, HXPMoveAllTargetW_, &w); + + status = HXPHexapodMoveAbsolute(pAxis->moveSocket_, GROUP, "Work", x, y, z, u, v, w); + + /* This is similar to what is done in HXPAxis::move() */ + if (status < 0) + { + /* Set the error */ + setIntegerParam(HXPError_, status); + + /* Get the error string */ + HXPErrorStringGet(pAxis->moveSocket_, status, pAxis->errorDescFull_); + + /* Trim the error string */ + strncpy(pAxis->errorDesc_, pAxis->errorDescFull_, 39); + pAxis->errorDesc_[39] = 0; + + /* Set the error description */ + setStringParam(HXPErrorDesc_, pAxis->errorDesc_); + } + else + { + /* Clear the error */ + setIntegerParam(HXPError_, 0); + setStringParam(HXPErrorDesc_, ""); + + /* If there was a way to force the motor record to switch to the move poll rate, + this would be the place to do it. */ + } + callParamCallbacks(); + + + return status; +} + + // These are the HXPAxis methods /** Creates a new HXPAxis object. @@ -263,7 +367,7 @@ asynStatus HXPAxis::move(double position, int relative, double baseVelocity, dou strncpy(errorDesc_, errorDescFull_, 39); errorDesc_[39] = 0; - /* */ + /* Set the error description */ pC_->setStringParam(pC_->HXPErrorDesc_, errorDesc_); } @@ -374,7 +478,6 @@ asynStatus HXPAxis::poll(bool *moving) /* Set the axis done parameter */ *moving = moving_; - //if (deferredMove_) *moving = true; setIntegerParam(pC_->motorStatusDone_, *moving?0:1); /*Test for states that mean we cannot move an axis (disabled, uninitialised, etc.) diff --git a/motorApp/NewportSrc/HXPDriver.h b/motorApp/NewportSrc/HXPDriver.h index b8a210dd..934d1ad4 100644 --- a/motorApp/NewportSrc/HXPDriver.h +++ b/motorApp/NewportSrc/HXPDriver.h @@ -16,6 +16,13 @@ USAGE... Motor driver support for the Newport Hexapod controller. #define HXPStatusString "HXP_STATUS" #define HXPErrorString "HXP_ERROR" #define HXPErrorDescString "HXP_ERROR_DESC" +#define HXPMoveAllString "HXP_MOVE_ALL" +#define HXPMoveAllTargetXString "HXP_MOVE_ALL_TARGET_X" +#define HXPMoveAllTargetYString "HXP_MOVE_ALL_TARGET_Y" +#define HXPMoveAllTargetZString "HXP_MOVE_ALL_TARGET_Z" +#define HXPMoveAllTargetUString "HXP_MOVE_ALL_TARGET_U" +#define HXPMoveAllTargetVString "HXP_MOVE_ALL_TARGET_V" +#define HXPMoveAllTargetWString "HXP_MOVE_ALL_TARGET_W" class HXPAxis : public asynMotorAxis { @@ -50,17 +57,30 @@ friend class HXPController; class HXPController : public asynMotorController { public: HXPController(const char *portName, const char *HXPPortName, int numAxes, double movingPollPeriod, double idlePollPeriod); + + /* These are the methods that we override from asynMotorDriver */ + asynStatus writeInt32(asynUser *pasynUser, epicsInt32 value); /* needed for implementation of moveAll */ void report(FILE *fp, int level); HXPAxis* getAxis(asynUser *pasynUser); HXPAxis* getAxis(int axisNo); + /* These are the methods that are new to this class */ + int moveAll(HXPAxis* pAxis); + protected: #define FIRST_HXP_PARAM HXPMoveCoordSys_ int HXPMoveCoordSys_; int HXPStatus_; int HXPError_; int HXPErrorDesc_; - #define LAST_HXP_PARAM HXPErrorDesc_ + int HXPMoveAll_; + int HXPMoveAllTargetX_; + int HXPMoveAllTargetY_; + int HXPMoveAllTargetZ_; + int HXPMoveAllTargetU_; + int HXPMoveAllTargetV_; + int HXPMoveAllTargetW_; + #define LAST_HXP_PARAM HXPMoveAllTargetW_ #define NUM_HXP_PARAMS ((int) (&LAST_HXP_PARAM - &FIRST_HXP_PARAM + 1)) diff --git a/motorApp/op/adl/HXP_moveAll.adl b/motorApp/op/adl/HXP_moveAll.adl new file mode 100644 index 00000000..76dc086c --- /dev/null +++ b/motorApp/op/adl/HXP_moveAll.adl @@ -0,0 +1,1636 @@ + +file { + name="/home/oxygen21/KPETERSN/epics/ioc/synApps_5_6/kmp/kmpApp/op/adl/HXP_moveAll.adl" + version=030107 +} +display { + object { + x=411 + y=293 + width=720 + height=165 + } + clr=14 + bclr=3 + cmap="" + gridSpacing=5 + gridOn=0 + snapToGrid=0 +} +"color map" { + ncolors=65 + colors { + ffffff, + ececec, + dadada, + c8c8c8, + bbbbbb, + aeaeae, + 9e9e9e, + 919191, + 858585, + 787878, + 696969, + 5a5a5a, + 464646, + 2d2d2d, + 000000, + 00d800, + 1ebb00, + 339900, + 2d7f00, + 216c00, + fd0000, + de1309, + be190b, + a01207, + 820400, + 5893ff, + 597ee1, + 4b6ec7, + 3a5eab, + 27548d, + fbf34a, + f9da3c, + eeb62b, + e19015, + cd6100, + ffb0ff, + d67fe2, + ae4ebc, + 8b1a96, + 610a75, + a4aaff, + 8793e2, + 6a73c1, + 4d52a4, + 343386, + c7bb6d, + b79d5c, + a47e3c, + 7d5627, + 58340f, + 99ffff, + 73dfff, + 4ea5f9, + 2a63e4, + 0a00b8, + ebf1b5, + d4db9d, + bbc187, + a6a462, + 8b8239, + 73ff6b, + 52da3b, + 3cb420, + 289315, + 1a7309, + } +} +"text update" { + object { + x=0 + y=0 + width=116 + height=20 + } + monitor { + chan="$(P)$(M1).DESC" + clr=54 + bclr=0 + } + align="horiz. centered" + limits { + } +} +rectangle { + object { + x=6 + y=66 + width=104 + height=31 + } + "basic attribute" { + clr=60 + width=2 + } + "dynamic attribute" { + vis="if zero" + chan="$(P)$(M1).DMOV" + } +} +rectangle { + object { + x=6 + y=66 + width=104 + height=31 + } + "basic attribute" { + clr=30 + width=2 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M1).LVIO" + } +} +rectangle { + object { + x=6 + y=66 + width=104 + height=31 + } + "basic attribute" { + clr=14 + width=2 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M1)_able.VAL" + } +} +"message button" { + object { + x=502 + y=106 + width=125 + height=40 + } + control { + chan="$(P)$(M1).STOP" + clr=31 + bclr=20 + } + label="STOP" + press_msg="1" +} +rectangle { + object { + x=0 + y=45 + width=6 + height=50 + } + "basic attribute" { + clr=20 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M1).LLS" + } +} +rectangle { + object { + x=110 + y=45 + width=6 + height=50 + } + "basic attribute" { + clr=20 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M1).HLS" + } +} +"text update" { + object { + x=0 + y=32 + width=116 + height=12 + } + monitor { + chan="$(P)$(M1).EGU" + clr=54 + bclr=3 + } + align="horiz. centered" + limits { + } +} +rectangle { + object { + x=0 + y=20 + width=116 + height=12 + } + "basic attribute" { + clr=54 + width=2 + } +} +text { + object { + x=0 + y=21 + width=116 + height=10 + } + "basic attribute" { + clr=0 + fill="outline" + } + textix="($(P)$(M1))" + align="horiz. centered" +} +rectangle { + object { + x=7 + y=41 + width=102 + height=26 + } + "basic attribute" { + clr=14 + fill="outline" + width=2 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M1).SET" + } +} +rectangle { + object { + x=9 + y=43 + width=98 + height=21 + } + "basic attribute" { + clr=30 + fill="outline" + width=2 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M1).SET" + } +} +"text update" { + object { + x=11 + y=45 + width=94 + height=17 + } + monitor { + chan="$(P)$(M1).RBV" + clr=54 + bclr=3 + } + align="horiz. centered" + limits { + } +} +rectangle { + object { + x=6 + y=66 + width=104 + height=31 + } + "basic attribute" { + clr=20 + style="dash" + fill="outline" + width=2 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M1)_able.VAL" + } +} +"text update" { + object { + x=120 + y=0 + width=116 + height=20 + } + monitor { + chan="$(P)$(M2).DESC" + clr=54 + bclr=0 + } + align="horiz. centered" + limits { + } +} +rectangle { + object { + x=126 + y=66 + width=104 + height=31 + } + "basic attribute" { + clr=60 + width=2 + } + "dynamic attribute" { + vis="if zero" + chan="$(P)$(M2).DMOV" + } +} +rectangle { + object { + x=126 + y=66 + width=104 + height=31 + } + "basic attribute" { + clr=30 + width=2 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M2).LVIO" + } +} +rectangle { + object { + x=126 + y=66 + width=104 + height=31 + } + "basic attribute" { + clr=14 + width=2 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M2)_able.VAL" + } +} +rectangle { + object { + x=120 + y=45 + width=6 + height=50 + } + "basic attribute" { + clr=20 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M2).LLS" + } +} +rectangle { + object { + x=230 + y=45 + width=6 + height=50 + } + "basic attribute" { + clr=20 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M2).HLS" + } +} +"text update" { + object { + x=120 + y=32 + width=116 + height=12 + } + monitor { + chan="$(P)$(M2).EGU" + clr=54 + bclr=3 + } + align="horiz. centered" + limits { + } +} +rectangle { + object { + x=120 + y=20 + width=116 + height=12 + } + "basic attribute" { + clr=54 + width=2 + } +} +text { + object { + x=120 + y=21 + width=116 + height=10 + } + "basic attribute" { + clr=0 + fill="outline" + } + textix="($(P)$(M2))" + align="horiz. centered" +} +rectangle { + object { + x=127 + y=41 + width=102 + height=26 + } + "basic attribute" { + clr=14 + fill="outline" + width=2 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M2).SET" + } +} +rectangle { + object { + x=129 + y=43 + width=98 + height=21 + } + "basic attribute" { + clr=30 + fill="outline" + width=2 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M2).SET" + } +} +"text update" { + object { + x=131 + y=45 + width=94 + height=17 + } + monitor { + chan="$(P)$(M2).RBV" + clr=54 + bclr=3 + } + align="horiz. centered" + limits { + } +} +rectangle { + object { + x=126 + y=66 + width=104 + height=31 + } + "basic attribute" { + clr=20 + style="dash" + fill="outline" + width=2 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M2)_able.VAL" + } +} +"text update" { + object { + x=240 + y=0 + width=116 + height=20 + } + monitor { + chan="$(P)$(M3).DESC" + clr=54 + bclr=0 + } + align="horiz. centered" + limits { + } +} +rectangle { + object { + x=246 + y=66 + width=104 + height=31 + } + "basic attribute" { + clr=60 + width=2 + } + "dynamic attribute" { + vis="if zero" + chan="$(P)$(M3).DMOV" + } +} +rectangle { + object { + x=246 + y=66 + width=104 + height=31 + } + "basic attribute" { + clr=30 + width=2 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M3).LVIO" + } +} +rectangle { + object { + x=246 + y=66 + width=104 + height=31 + } + "basic attribute" { + clr=14 + width=2 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M3)_able.VAL" + } +} +rectangle { + object { + x=240 + y=45 + width=6 + height=50 + } + "basic attribute" { + clr=20 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M3).LLS" + } +} +rectangle { + object { + x=350 + y=45 + width=6 + height=50 + } + "basic attribute" { + clr=20 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M3).HLS" + } +} +"text update" { + object { + x=240 + y=32 + width=116 + height=12 + } + monitor { + chan="$(P)$(M3).EGU" + clr=54 + bclr=3 + } + align="horiz. centered" + limits { + } +} +rectangle { + object { + x=240 + y=20 + width=116 + height=12 + } + "basic attribute" { + clr=54 + width=2 + } +} +text { + object { + x=240 + y=21 + width=116 + height=10 + } + "basic attribute" { + clr=0 + fill="outline" + } + textix="($(P)$(M3))" + align="horiz. centered" +} +rectangle { + object { + x=247 + y=41 + width=102 + height=26 + } + "basic attribute" { + clr=14 + fill="outline" + width=2 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M3).SET" + } +} +rectangle { + object { + x=249 + y=43 + width=98 + height=21 + } + "basic attribute" { + clr=30 + fill="outline" + width=2 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M3).SET" + } +} +"text update" { + object { + x=251 + y=45 + width=94 + height=17 + } + monitor { + chan="$(P)$(M3).RBV" + clr=54 + bclr=3 + } + align="horiz. centered" + limits { + } +} +rectangle { + object { + x=246 + y=66 + width=104 + height=31 + } + "basic attribute" { + clr=20 + style="dash" + fill="outline" + width=2 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M3)_able.VAL" + } +} +"text update" { + object { + x=360 + y=0 + width=116 + height=20 + } + monitor { + chan="$(P)$(M4).DESC" + clr=54 + bclr=0 + } + align="horiz. centered" + limits { + } +} +rectangle { + object { + x=366 + y=66 + width=104 + height=31 + } + "basic attribute" { + clr=60 + width=2 + } + "dynamic attribute" { + vis="if zero" + chan="$(P)$(M4).DMOV" + } +} +rectangle { + object { + x=366 + y=66 + width=104 + height=31 + } + "basic attribute" { + clr=30 + width=2 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M4).LVIO" + } +} +rectangle { + object { + x=366 + y=66 + width=104 + height=31 + } + "basic attribute" { + clr=14 + width=2 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M4)_able.VAL" + } +} +rectangle { + object { + x=360 + y=45 + width=6 + height=50 + } + "basic attribute" { + clr=20 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M4).LLS" + } +} +rectangle { + object { + x=470 + y=45 + width=6 + height=50 + } + "basic attribute" { + clr=20 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M4).HLS" + } +} +"text update" { + object { + x=360 + y=32 + width=116 + height=12 + } + monitor { + chan="$(P)$(M4).EGU" + clr=54 + bclr=3 + } + align="horiz. centered" + limits { + } +} +rectangle { + object { + x=360 + y=20 + width=116 + height=12 + } + "basic attribute" { + clr=54 + width=2 + } +} +text { + object { + x=360 + y=21 + width=116 + height=10 + } + "basic attribute" { + clr=0 + fill="outline" + } + textix="($(P)$(M4))" + align="horiz. centered" +} +rectangle { + object { + x=367 + y=41 + width=102 + height=26 + } + "basic attribute" { + clr=14 + fill="outline" + width=2 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M4).SET" + } +} +rectangle { + object { + x=369 + y=43 + width=98 + height=21 + } + "basic attribute" { + clr=30 + fill="outline" + width=2 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M4).SET" + } +} +"text update" { + object { + x=371 + y=45 + width=94 + height=17 + } + monitor { + chan="$(P)$(M4).RBV" + clr=54 + bclr=3 + } + align="horiz. centered" + limits { + } +} +rectangle { + object { + x=366 + y=66 + width=104 + height=31 + } + "basic attribute" { + clr=20 + style="dash" + fill="outline" + width=2 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M4)_able.VAL" + } +} +"text update" { + object { + x=480 + y=0 + width=116 + height=20 + } + monitor { + chan="$(P)$(M5).DESC" + clr=54 + bclr=0 + } + align="horiz. centered" + limits { + } +} +rectangle { + object { + x=486 + y=66 + width=104 + height=31 + } + "basic attribute" { + clr=60 + width=2 + } + "dynamic attribute" { + vis="if zero" + chan="$(P)$(M5).DMOV" + } +} +rectangle { + object { + x=486 + y=66 + width=104 + height=31 + } + "basic attribute" { + clr=30 + width=2 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M5).LVIO" + } +} +rectangle { + object { + x=486 + y=66 + width=104 + height=31 + } + "basic attribute" { + clr=14 + width=2 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M5)_able.VAL" + } +} +rectangle { + object { + x=480 + y=45 + width=6 + height=50 + } + "basic attribute" { + clr=20 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M5).LLS" + } +} +rectangle { + object { + x=590 + y=45 + width=6 + height=50 + } + "basic attribute" { + clr=20 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M5).HLS" + } +} +"text update" { + object { + x=480 + y=32 + width=116 + height=12 + } + monitor { + chan="$(P)$(M5).EGU" + clr=54 + bclr=3 + } + align="horiz. centered" + limits { + } +} +rectangle { + object { + x=480 + y=20 + width=116 + height=12 + } + "basic attribute" { + clr=54 + width=2 + } +} +text { + object { + x=480 + y=21 + width=116 + height=10 + } + "basic attribute" { + clr=0 + fill="outline" + } + textix="($(P)$(M5))" + align="horiz. centered" +} +rectangle { + object { + x=487 + y=41 + width=102 + height=26 + } + "basic attribute" { + clr=14 + fill="outline" + width=2 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M5).SET" + } +} +rectangle { + object { + x=489 + y=43 + width=98 + height=21 + } + "basic attribute" { + clr=30 + fill="outline" + width=2 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M5).SET" + } +} +"text update" { + object { + x=491 + y=45 + width=94 + height=17 + } + monitor { + chan="$(P)$(M5).RBV" + clr=54 + bclr=3 + } + align="horiz. centered" + limits { + } +} +rectangle { + object { + x=486 + y=66 + width=104 + height=31 + } + "basic attribute" { + clr=20 + style="dash" + fill="outline" + width=2 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M5)_able.VAL" + } +} +"text update" { + object { + x=600 + y=0 + width=116 + height=20 + } + monitor { + chan="$(P)$(M6).DESC" + clr=54 + bclr=0 + } + align="horiz. centered" + limits { + } +} +rectangle { + object { + x=606 + y=66 + width=104 + height=31 + } + "basic attribute" { + clr=60 + width=2 + } + "dynamic attribute" { + vis="if zero" + chan="$(P)$(M6).DMOV" + } +} +rectangle { + object { + x=606 + y=66 + width=104 + height=31 + } + "basic attribute" { + clr=30 + width=2 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M6).LVIO" + } +} +rectangle { + object { + x=606 + y=66 + width=104 + height=31 + } + "basic attribute" { + clr=14 + width=2 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M6)_able.VAL" + } +} +rectangle { + object { + x=600 + y=45 + width=6 + height=50 + } + "basic attribute" { + clr=20 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M6).LLS" + } +} +rectangle { + object { + x=710 + y=45 + width=6 + height=50 + } + "basic attribute" { + clr=20 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M6).HLS" + } +} +"text update" { + object { + x=600 + y=32 + width=116 + height=12 + } + monitor { + chan="$(P)$(M6).EGU" + clr=54 + bclr=3 + } + align="horiz. centered" + limits { + } +} +rectangle { + object { + x=600 + y=20 + width=116 + height=12 + } + "basic attribute" { + clr=54 + width=2 + } +} +text { + object { + x=600 + y=21 + width=116 + height=10 + } + "basic attribute" { + clr=0 + fill="outline" + } + textix="($(P)$(M6))" + align="horiz. centered" +} +rectangle { + object { + x=607 + y=41 + width=102 + height=26 + } + "basic attribute" { + clr=14 + fill="outline" + width=2 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M6).SET" + } +} +rectangle { + object { + x=609 + y=43 + width=98 + height=21 + } + "basic attribute" { + clr=30 + fill="outline" + width=2 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M6).SET" + } +} +"text update" { + object { + x=611 + y=45 + width=94 + height=17 + } + monitor { + chan="$(P)$(M6).RBV" + clr=54 + bclr=3 + } + align="horiz. centered" + limits { + } +} +rectangle { + object { + x=606 + y=66 + width=104 + height=31 + } + "basic attribute" { + clr=20 + style="dash" + fill="outline" + width=2 + } + "dynamic attribute" { + vis="if not zero" + chan="$(P)$(M6)_able.VAL" + } +} +polyline { + object { + x=118 + y=0 + width=2 + height=101 + } + "basic attribute" { + clr=14 + width=2 + } + points { + (119,1) + (119,100) + } +} +polyline { + object { + x=238 + y=0 + width=2 + height=101 + } + "basic attribute" { + clr=14 + width=2 + } + points { + (239,1) + (239,100) + } +} +polyline { + object { + x=358 + y=0 + width=2 + height=101 + } + "basic attribute" { + clr=14 + width=2 + } + points { + (359,1) + (359,100) + } +} +polyline { + object { + x=478 + y=0 + width=2 + height=101 + } + "basic attribute" { + clr=14 + width=2 + } + points { + (479,1) + (479,100) + } +} +polyline { + object { + x=598 + y=0 + width=2 + height=101 + } + "basic attribute" { + clr=14 + width=2 + } + points { + (599,1) + (599,100) + } +} +"text entry" { + object { + x=369 + y=69 + width=98 + height=25 + } + control { + chan="$(P)$(R)T4" + clr=14 + bclr=51 + } + limits { + } +} +"text entry" { + object { + x=489 + y=69 + width=98 + height=25 + } + control { + chan="$(P)$(R)T5" + clr=14 + bclr=51 + } + limits { + } +} +"text entry" { + object { + x=609 + y=69 + width=98 + height=25 + } + control { + chan="$(P)$(R)T6" + clr=14 + bclr=51 + } + limits { + } +} +"related display" { + object { + x=655 + y=140 + width=20 + height=20 + } + display[0] { + label="Help" + } + display[1] { + label="HXP_motors" + name="HXP_motors.adl" + args="P=$(P),R=$(R),M1=$(M1),M2=$(M2),M3=$(M3),M4=$(M4),M5=$(M5),M6=$(M6)" + } + display[2] { + label="HXP_extra" + name="HXP_extra.adl" + args="P=$(P),R=$(R)" + } + clr=14 + bclr=51 +} +text { + object { + x=678 + y=142 + width=31 + height=18 + } + "basic attribute" { + clr=14 + } + textix="More" + align="horiz. centered" +} +"message button" { + object { + x=365 + y=105 + width=125 + height=40 + } + control { + chan="$(P)$(R)MOVE_ALL" + clr=31 + bclr=18 + } + label="Go" + press_msg="1" + release_msg="0" +} +composite { + object { + x=8 + y=104 + width=345 + height=30 + } + "composite name"="" + children { + rectangle { + object { + x=8 + y=104 + width=345 + height=30 + } + "basic attribute" { + clr=20 + fill="outline" + width=2 + } + "dynamic attribute" { + vis="calc" + calc="A<0" + chan="$(P)$(R)ERROR" + } + } + "text update" { + object { + x=13 + y=110 + width=335 + height=20 + } + monitor { + chan="$(P)$(R)ERR_DESC" + clr=20 + bclr=3 + } + align="horiz. centered" + format="string" + limits { + } + } + } +} +composite { + object { + x=10 + y=140 + width=137 + height=20 + } + "composite name"="" + children { + text { + object { + x=10 + y=140 + width=70 + height=20 + } + "basic attribute" { + clr=14 + } + textix="Status" + align="horiz. centered" + } + "text update" { + object { + x=87 + y=140 + width=60 + height=20 + } + monitor { + chan="$(P)$(R)STATUS" + clr=14 + bclr=3 + } + align="horiz. centered" + limits { + } + } + } +} +"text entry" { + object { + x=9 + y=69 + width=98 + height=25 + } + control { + chan="$(P)$(R)T1" + clr=14 + bclr=51 + } + limits { + } +} +"text entry" { + object { + x=129 + y=69 + width=98 + height=25 + } + control { + chan="$(P)$(R)T2" + clr=14 + bclr=51 + } + limits { + } +} +"text entry" { + object { + x=249 + y=69 + width=98 + height=25 + } + control { + chan="$(P)$(R)T3" + clr=14 + bclr=51 + } + limits { + } +}