From c34d71d39b5952190f65a95432a4104d34105d6f Mon Sep 17 00:00:00 2001 From: Kevin Peterson Date: Tue, 5 Mar 2024 08:40:18 -0600 Subject: [PATCH] Added support for vacuum stages --- .../linkamApp/Db/linkam.substitutions | 7 +++ linkamT96App/Db/LinkamVacuum.template | 61 +++++++++++++++++++ linkamT96App/Db/LinkamVacuum_settings.req | 7 +++ linkamT96App/Db/Linkam_settings.req | 18 ++++++ linkamT96App/Db/Makefile | 1 + linkamT96App/src/linkamT96.cpp | 53 +++++++++++++++- linkamT96App/src/linkamT96.h | 18 +++++- 7 files changed, 162 insertions(+), 3 deletions(-) create mode 100644 linkamT96App/Db/LinkamVacuum.template create mode 100644 linkamT96App/Db/LinkamVacuum_settings.req create mode 100644 linkamT96App/Db/Linkam_settings.req diff --git a/iocs/linkamIOC/linkamApp/Db/linkam.substitutions b/iocs/linkamIOC/linkamApp/Db/linkam.substitutions index e8307eb..976926e 100644 --- a/iocs/linkamIOC/linkamApp/Db/linkam.substitutions +++ b/iocs/linkamIOC/linkamApp/Db/linkam.substitutions @@ -9,3 +9,10 @@ file $(LINKAM3)/db/Linkam.template pattern { P, PORT, ADDR, TIMEOUT, name } { "EA-LINKAM-01", "EA-LINKAM-01_AP", "0", "1", "LINKAM1" } } + +### Support for vacuum stages +#!file $(LINKAM3)/db/LinkamVacuum.template +#!{ +#!pattern { P, PORT, ADDR, TIMEOUT, name } +#! { "EA-LINKAM-01", "EA-LINKAM-01_AP", "0", "1", "LINKAM1" } +#!} diff --git a/linkamT96App/Db/LinkamVacuum.template b/linkamT96App/Db/LinkamVacuum.template new file mode 100644 index 0000000..8a03168 --- /dev/null +++ b/linkamT96App/Db/LinkamVacuum.template @@ -0,0 +1,61 @@ +record(bo, "$(P):STARTVAC") +{ + field(DTYP, "asynInt32") + field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))LINKAM_START_VACUUM") + field(ZNAM, "Off") + field(ONAM, "On") + field(SDIS, "$(P):DISABLE") +} + +record(ao, "$(P):VACUUM:SET") +{ + field(DTYP, "asynFloat64") + field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))LINKAM_VACUUM_SET") + field(EGU, "tbdn") + field(SDIS, "$(P):DISABLE") +} + +record(ai, "$(P):VACUUM") +{ + field(SCAN, ".1 second") + field(DTYP, "asynFloat64") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))LINKAM_VACUUM") + field(EGU, "tbd") + field(SDIS, "$(P):DISABLE") +} + +record(mbbo, "$(P):VACUUM:UNIT:SET") +{ + field(DTYP, "asynInt32") + field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))LINKAM_VACUUM_UNIT_SET") + field(ZRST, "mBar") + field(ZRVL, 15) + field(ONST, "kPa") + field(ONVL, 16) + field(TWST, "mTorr") + field(TWVL, 17) + field(VAL, 15) + field(SDIS, "$(P):DISABLE") +} + +record(mbbi, "$(P):VACUUM:UNIT") +{ + field(DTYP, "asynInt32") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))LINKAM_VACUUM_UNIT") + field(ZRST, "mBar") + field(ZRVL, 15) + field(ONST, "kPa") + field(ONVL, 16) + field(TWST, "mTorr") + field(TWVL, 17) + field(SDIS, "$(P):DISABLE") +} + +record(ai, "$(P):PRESSURE") +{ + field(SCAN, ".1 second") + field(DTYP, "asynFloat64") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))LINKAM_PRESSURE") + field(EGU, "mBar") + field(SDIS, "$(P):DISABLE") +} diff --git a/linkamT96App/Db/LinkamVacuum_settings.req b/linkamT96App/Db/LinkamVacuum_settings.req new file mode 100644 index 0000000..9247c57 --- /dev/null +++ b/linkamT96App/Db/LinkamVacuum_settings.req @@ -0,0 +1,7 @@ +$(P):STARTVAC.VAL +$(P):VACUUM:SET.VAL +$(P):VACUUM.SCAN +$(P):PRESSURE.SCAN +$(P):VACUUM:UNIT:SET.VAL +$(P):VACUUM:UNIT.SCAN + diff --git a/linkamT96App/Db/Linkam_settings.req b/linkamT96App/Db/Linkam_settings.req new file mode 100644 index 0000000..c533351 --- /dev/null +++ b/linkamT96App/Db/Linkam_settings.req @@ -0,0 +1,18 @@ +$(P):CONFIG.SCAN +$(P):STATUS.SCAN +$(P):STAGE:CONFIG.SCAN +$(P):TEMP.SCAN +$(P):DISABLE.VAL +$(P):DSC.SCAN +$(P):STARTHEAT.VAL +$(P):RAMPRATE:SET.VAL +$(P):RAMPRATE.SCAN +$(P):HOLDTIME:SET.VAL +$(P):HOLDTIME.SCAN +$(P):SETPOINT:SET.VAL +$(P):SETPOINT.SCAN +$(P):POWER.SCAN +$(P):LNP_SPEED:SET.VAL +$(P):LNP_SPEED.SCAN +$(P):LNP_MODE:SET.VAL + diff --git a/linkamT96App/Db/Makefile b/linkamT96App/Db/Makefile index d0baf2c..a694c28 100644 --- a/linkamT96App/Db/Makefile +++ b/linkamT96App/Db/Makefile @@ -14,6 +14,7 @@ DB += Linkam.template DB += Linkam_detail.template DB += LinkamTensileStage.template DB += LinkamGui.template +DB += LinkamVacuum.template #---------------------------------------------------- # If .db template is not named *.template add diff --git a/linkamT96App/src/linkamT96.cpp b/linkamT96App/src/linkamT96.cpp index cd41b52..5af897a 100644 --- a/linkamT96App/src/linkamT96.cpp +++ b/linkamT96App/src/linkamT96.cpp @@ -123,9 +123,15 @@ linkamPortDriver::linkamPortDriver(const char *portName) createParam(P_TstpVeloString, asynParamFloat64, &P_TstpVelo); createParam(P_TstpValString, asynParamFloat64, &P_TstpVal); - createParam(P_TstfValString, asynParamFloat64, &P_TstfVal); + createParam(P_StartVacuumString, asynParamInt32, &P_StartVacuum); + createParam(P_VacuumSetString, asynParamFloat64, &P_VacuumSet); + createParam(P_VacuumString, asynParamFloat64, &P_Vacuum); + createParam(P_VacuumUnitSetString, asynParamInt32, &P_VacuumUnitSet); + createParam(P_VacuumUnitString, asynParamInt32, &P_VacuumUnit); + createParam(P_PressureString, asynParamFloat64, &P_Pressure); + } asynStatus linkamPortDriver::readFloat64(asynUser *pasynUser, epicsFloat64 *value) @@ -199,6 +205,10 @@ asynStatus linkamPortDriver::readFloat64(asynUser *pasynUser, epicsFloat64 *valu param1.vStageValueType = LinkamSDK::eStageValueTypeTstPidKi; } else if (function == P_TstForceKd){ param1.vStageValueType = LinkamSDK::eStageValueTypeTstPidKd; + } else if (function == P_Vacuum) { + param1.vStageValueType = LinkamSDK::eStageValueTypeVacuum; + } else if (function == P_Pressure) { + param1.vStageValueType = LinkamSDK::eStageValueTypePressure; } if (linkamProcessMessage(LinkamSDK::eLinkamFunctionMsgCode_GetValue, handle, &result, param1, param2)){ @@ -351,6 +361,8 @@ asynStatus linkamPortDriver::writeFloat64(asynUser *pasynUser, epicsFloat64 valu param1.vStageValueType = LinkamSDK::eStageValueTypeTstPidKi; } else if (function == P_TstForceKd) { param1.vStageValueType = LinkamSDK::eStageValueTypeTstPidKd; + } else if (function == P_VacuumSet) { + param1.vStageValueType = LinkamSDK::eStageValueTypeVacuumSetpoint; } @@ -455,6 +467,38 @@ asynStatus linkamPortDriver::writeInt32(asynUser *pasynUser, epicsInt32 value) status = asynError; } } + } else if (function == P_StartVacuum) { + param2.vUint64 = 0; /* unused */ + + if (value > 0){ + param1.vBoolean = true; + } else { + param1.vBoolean = false; + } + + linkamProcessMessage(LinkamSDK::eLinkamFunctionMsgCode_StartVacuum, + handle, &result, param1, param2); + + if (!result.vBoolean) { + status = asynError; + } + } else if (function == P_VacuumUnitSet) { + param1.vStageValueType = LinkamSDK::eStageValueTypeVacuumBoardUnitOfMeasure; + + if (value < 15) { + param2.vUint32 = 15; + } else if (value > 17) { + param2.vUint32 = 17; + } else { + param2.vUint32 = value; + } + + linkamProcessMessage(LinkamSDK::eLinkamFunctionMsgCode_SetValue, + handle, &result, param1, param2); + + if (!result.vBoolean) { + status = asynError; + } } else if (function == P_TstTableModeSet) { switch(value){ case 0: @@ -651,6 +695,13 @@ asynStatus linkamPortDriver::readInt32(asynUser *pasynUser, epicsInt32 *value) } else { status = asynError; } + } else if (function == P_VacuumUnit) { + param1.vStageValueType = LinkamSDK::eStageValueTypeVacuumBoardUnitOfMeasure; + + if (linkamProcessMessage(LinkamSDK::eLinkamFunctionMsgCode_GetValue, handle, &result, param1, param2)) + *value = result.vUint32; + else + status = asynError; } else if (function == P_SampleSize){ param1.vStageValueType = LinkamSDK::eStageValueTypeTstSampleSize; diff --git a/linkamT96App/src/linkamT96.h b/linkamT96App/src/linkamT96.h index e4c6ecd..0655cb4 100644 --- a/linkamT96App/src/linkamT96.h +++ b/linkamT96App/src/linkamT96.h @@ -82,7 +82,6 @@ #define P_TstForceKiString "LINKAM_TST_FORCE_KI" #define P_TstForceKdString "LINKAM_TST_FORCE_KD" - // Position motor variables #define P_TstpVeloString "LINKAM_TSTP_VELO" #define P_TstpValString "LINKAM_TSTP_VAL" @@ -90,6 +89,13 @@ // Force motor variables #define P_TstfValString "LINKAM_TSTF_VAL" +// Vacuum stage parameters +#define P_StartVacuumString "LINKAM_START_VACUUM" +#define P_VacuumSetString "LINKAM_VACUUM_SET" +#define P_VacuumString "LINKAM_VACUUM" +#define P_VacuumUnitSetString "LINKAM_VACUUM_UNIT_SET" +#define P_VacuumUnitString "LINKAM_VACUUM_UNIT" +#define P_PressureString "LINKAM_PRESSURE" struct PositionMotorParams { @@ -204,7 +210,15 @@ class linkamPortDriver : public asynPortDriver { int P_TstfVal; - #define LAST_LINKAM_COMMAND P_TstStartMotor + // Vacuum stage parameters + int P_StartVacuum; + int P_VacuumSet; + int P_Vacuum; + int P_VacuumUnitSet; + int P_VacuumUnit; + int P_Pressure; + + #define LAST_LINKAM_COMMAND P_Pressure // Connection functions bool initUSBConnection(unsigned int vendorID, unsigned int productID);