Compare commits
3 Commits
Author | SHA1 | Date | |
---|---|---|---|
4c3254687d | |||
eb94379efe | |||
1dd132c709 |
@ -42,13 +42,11 @@ record(motor,"$(INSTR)$(M)")
|
||||
}
|
||||
|
||||
# This PV reads out the 10th bit of the MSTA field of the motor record, which
|
||||
# is the "motorStatusProblem_" bit. The 10th bit is adressed by 0x0200. If the
|
||||
# bit is 0, the .VAL field is 0 as well. If the bit is 1, we need to divide by
|
||||
# 512 (=2^9) in order to set the .VAL field to 1 (and not to 512).
|
||||
# is the "motorStatusProblem_" bit.
|
||||
record(calc, "$(INSTR)$(M):StatusProblem")
|
||||
{
|
||||
field(INPA, "$(INSTR)$(M).MSTA CP")
|
||||
field(CALC, "(A&0x200)/512")
|
||||
field(CALC, "A >> 9")
|
||||
}
|
||||
|
||||
# Call the reset function of the corresponding sinqAxis
|
||||
@ -71,7 +69,7 @@ record(longin, "$(INSTR)$(M):StopRBV")
|
||||
field(FLNK, "$(INSTR)$(M):Stop2Field")
|
||||
}
|
||||
record(longout, "$(INSTR)$(M):Stop2Field") {
|
||||
field(DOL, "$(INSTR)$(M):StopRBV CP")
|
||||
field(DOL, "$(INSTR)$(M):StopRBV NPP")
|
||||
field(OUT, "$(INSTR)$(M).STOP")
|
||||
field(OMSL, "closed_loop")
|
||||
}
|
||||
@ -82,7 +80,7 @@ record(longout, "$(INSTR)$(M):Stop2Field") {
|
||||
# for calculating the estimated time of arrival inside the watchdog).
|
||||
record(ao,"$(INSTR)$(M):RecResolution") {
|
||||
field(DESC, "$(M) resolution")
|
||||
field(DOL, "$(INSTR)$(M).MRES CP MS")
|
||||
field(DOL, "$(INSTR)$(M).MRES CP")
|
||||
field(OMSL, "closed_loop")
|
||||
field(DTYP, "asynFloat64")
|
||||
field(OUT, "@asyn($(CONTROLLER),$(AXIS)) MOTOR_REC_RESOLUTION")
|
||||
@ -175,12 +173,13 @@ record(ao, "$(INSTR)$(M):LimitsOffset") {
|
||||
record(ai, "$(INSTR)$(M):DHLM_RBV")
|
||||
{
|
||||
field(DTYP, "asynFloat64")
|
||||
field(VAL, "$(DHLM=0)")
|
||||
field(INP, "@asyn($(CONTROLLER),$(AXIS)) MOTOR_HIGH_LIMIT_FROM_DRIVER")
|
||||
field(SCAN, "I/O Intr")
|
||||
field(FLNK, "$(INSTR)$(M):PushDHLM2Field")
|
||||
}
|
||||
record(ao, "$(INSTR)$(M):PushDHLM2Field") {
|
||||
field(DOL, "$(INSTR)$(M):DHLM_RBV CP")
|
||||
field(DOL, "$(INSTR)$(M):DHLM_RBV NPP")
|
||||
field(OUT, "$(INSTR)$(M).DHLM")
|
||||
field(OMSL, "closed_loop")
|
||||
}
|
||||
@ -193,12 +192,13 @@ record(ao, "$(INSTR)$(M):PushDHLM2Field") {
|
||||
record(ai, "$(INSTR)$(M):DLLM_RBV")
|
||||
{
|
||||
field(DTYP, "asynFloat64")
|
||||
field(VAL, "$(DLLM=0)")
|
||||
field(INP, "@asyn($(CONTROLLER),$(AXIS)) MOTOR_LOW_LIMIT_FROM_DRIVER")
|
||||
field(SCAN, "I/O Intr")
|
||||
field(FLNK, "$(INSTR)$(M):PushDLLM2Field")
|
||||
}
|
||||
record(ao, "$(INSTR)$(M):PushDLLM2Field") {
|
||||
field(DOL, "$(INSTR)$(M):DLLM_RBV CP")
|
||||
field(DOL, "$(INSTR)$(M):DLLM_RBV NPP")
|
||||
field(OUT, "$(INSTR)$(M).DLLM")
|
||||
field(OMSL, "closed_loop")
|
||||
}
|
||||
@ -216,7 +216,7 @@ record(ai, "$(INSTR)$(M):VELO_RBV")
|
||||
field(FLNK, "$(INSTR)$(M):PushVELO2Field")
|
||||
}
|
||||
record(ao, "$(INSTR)$(M):PushVELO2Field") {
|
||||
field(DOL, "$(INSTR)$(M):VELO_RBV CP")
|
||||
field(DOL, "$(INSTR)$(M):VELO_RBV NPP")
|
||||
field(OUT, "$(INSTR)$(M).VELO")
|
||||
field(OMSL, "closed_loop")
|
||||
}
|
||||
@ -234,7 +234,7 @@ record(ai, "$(INSTR)$(M):VBAS_RBV")
|
||||
field(FLNK, "$(INSTR)$(M):PushVBAS2Field")
|
||||
}
|
||||
record(ao, "$(INSTR)$(M):PushVBAS2Field") {
|
||||
field(DOL, "$(INSTR)$(M):VBAS_RBV CP")
|
||||
field(DOL, "$(INSTR)$(M):VBAS_RBV NPP")
|
||||
field(OUT, "$(INSTR)$(M).VBAS")
|
||||
field(OMSL, "closed_loop")
|
||||
}
|
||||
@ -252,7 +252,7 @@ record(ai, "$(INSTR)$(M):VMAX_RBV")
|
||||
field(FLNK, "$(INSTR)$(M):PushVMAX2Field")
|
||||
}
|
||||
record(ao, "$(INSTR)$(M):PushVMAX2Field") {
|
||||
field(DOL, "$(INSTR)$(M):VMAX_RBV CP")
|
||||
field(DOL, "$(INSTR)$(M):VMAX_RBV NPP")
|
||||
field(OUT, "$(INSTR)$(M).VMAX")
|
||||
field(OMSL, "closed_loop")
|
||||
}
|
||||
@ -270,7 +270,7 @@ record(ai, "$(INSTR)$(M):ACCL_RBV")
|
||||
field(FLNK, "$(INSTR)$(M):PushACCL2Field")
|
||||
}
|
||||
record(ao, "$(INSTR)$(M):PushACCL2Field") {
|
||||
field(DOL, "$(INSTR)$(M):ACCL_RBV CP")
|
||||
field(DOL, "$(INSTR)$(M):ACCL_RBV NPP")
|
||||
field(OUT, "$(INSTR)$(M).ACCL")
|
||||
field(OMSL, "closed_loop")
|
||||
}
|
||||
@ -288,4 +288,4 @@ record(waveform, "$(INSTR)$(M):EncoderType") {
|
||||
field(FTVL, "CHAR")
|
||||
field(NELM, "80")
|
||||
field(SCAN, "I/O Intr")
|
||||
}
|
||||
}
|
||||
|
@ -662,8 +662,7 @@ extern "C" {
|
||||
*/
|
||||
asynStatus setWatchdogEnabled(const char *portName, int axisNo, int enable) {
|
||||
|
||||
sinqController *pC;
|
||||
pC = (sinqController *)findAsynPortDriver(portName);
|
||||
sinqController *pC = (sinqController *)findAsynPortDriver(portName);
|
||||
if (pC == nullptr) {
|
||||
errlogPrintf("Controller \"%s\" => %s, line %d:\nPort %s not found.",
|
||||
portName, __PRETTY_FUNCTION__, __LINE__, portName);
|
||||
|
@ -51,7 +51,9 @@ sinqController::sinqController(const char *portName,
|
||||
msgPrintControl_(4) {
|
||||
|
||||
asynStatus status = asynSuccess;
|
||||
ipPortUser_ = nullptr;
|
||||
|
||||
// Handle to the asynUser of the IP port asyn driver
|
||||
ipPortAsynOctetSyncIO_ = nullptr;
|
||||
|
||||
// Initial values for the average timeout mechanism, can be overwritten
|
||||
// later by a FFI function
|
||||
@ -79,8 +81,9 @@ sinqController::sinqController(const char *portName,
|
||||
We try to connect to the port via the port name provided by the constructor.
|
||||
If this fails, the function is terminated via exit.
|
||||
*/
|
||||
pasynOctetSyncIO->connect(ipPortConfigName, 0, &ipPortUser_, NULL);
|
||||
if (status != asynSuccess || ipPortUser_ == nullptr) {
|
||||
pasynOctetSyncIO->connect(ipPortConfigName, 0, &ipPortAsynOctetSyncIO_,
|
||||
NULL);
|
||||
if (status != asynSuccess || ipPortAsynOctetSyncIO_ == nullptr) {
|
||||
errlogPrintf("Controller \"%s\" => %s, line %d:\nFATAL ERROR (cannot "
|
||||
"connect to MCU controller).\n"
|
||||
"Terminating IOC",
|
||||
@ -353,7 +356,7 @@ asynStatus sinqController::couldNotParseResponse(const char *command,
|
||||
int line) {
|
||||
asynStatus pl_status = asynSuccess;
|
||||
|
||||
asynPrint(ipPortUser_, ASYN_TRACE_ERROR,
|
||||
asynPrint(ipPortAsynOctetSyncIO_, ASYN_TRACE_ERROR,
|
||||
"Controller \"%s\", axis %d => %s, line %d:\nCould not interpret "
|
||||
"response \"%s\" for command \"%s\".\n",
|
||||
portName, axisNo, functionName, line, response, command);
|
||||
@ -382,7 +385,7 @@ asynStatus sinqController::paramLibAccessFailed(asynStatus status,
|
||||
int line) {
|
||||
|
||||
if (status != asynSuccess) {
|
||||
asynPrint(ipPortUser_, ASYN_TRACE_ERROR,
|
||||
asynPrint(ipPortAsynOctetSyncIO_, ASYN_TRACE_ERROR,
|
||||
"Controller \"%s\", axis %d => %s, line %d:\n Accessing the "
|
||||
"parameter library failed for parameter %s with error %s.\n",
|
||||
portName, axisNo, functionName, line, parameter,
|
||||
@ -651,9 +654,9 @@ asynStatus setMaxSubsequentTimeouts(const char *portName,
|
||||
if (ptr == nullptr) {
|
||||
/*
|
||||
We can't use asynPrint here since this macro would require us
|
||||
to get a ipPortUser_ from a pointer to an asynPortDriver.
|
||||
to get a ipPortAsynOctetSyncIO_ from a pointer to an asynPortDriver.
|
||||
However, the given pointer is a nullptr and therefore doesn't
|
||||
have a ipPortUser_! printf is an EPICS alternative which
|
||||
have a ipPortAsynOctetSyncIO_! printf is an EPICS alternative which
|
||||
works w/o that, but doesn't offer the comfort provided
|
||||
by the asynTrace-facility
|
||||
*/
|
||||
|
@ -41,8 +41,8 @@ class epicsShareClass sinqController : public asynMotorController {
|
||||
* @param extraParams Number of extra parameter library entries
|
||||
* created in a concrete driver implementation
|
||||
*/
|
||||
sinqController(const char *portName, const char *SINQPortName, int numAxes,
|
||||
double movingPollPeriod, double idlePollPeriod,
|
||||
sinqController(const char *portName, const char *ipPortConfigName,
|
||||
int numAxes, double movingPollPeriod, double idlePollPeriod,
|
||||
int numExtraParams);
|
||||
|
||||
/**
|
||||
@ -115,9 +115,9 @@ class epicsShareClass sinqController : public asynMotorController {
|
||||
called. It is recommended to use a macro, e.g. __LINE__.
|
||||
* @return asynStatus Returns asynError.
|
||||
*/
|
||||
asynStatus couldNotParseResponse(const char *command,
|
||||
const char *response, int axisNo,
|
||||
const char *functionName, int line);
|
||||
asynStatus couldNotParseResponse(const char *command, const char *response,
|
||||
int axisNo, const char *functionName,
|
||||
int line);
|
||||
|
||||
/**
|
||||
* @brief Convert an asynStatus into a descriptive string.
|
||||
@ -298,14 +298,14 @@ class epicsShareClass sinqController : public asynMotorController {
|
||||
double idlePollPeriod() { return idlePollPeriod_; }
|
||||
double movingPollPeriod() { return movingPollPeriod_; }
|
||||
asynUser *asynUserSelf() { return pasynUserSelf; }
|
||||
asynUser *ipPortUser() { return ipPortUser_; }
|
||||
asynUser *ipPortAsynOctetSyncIO() { return ipPortAsynOctetSyncIO_; }
|
||||
|
||||
// =========================================================================
|
||||
|
||||
protected:
|
||||
// Pointer to the port user which is specified by the char array
|
||||
// `ipPortConfigName` in the constructor
|
||||
asynUser *ipPortUser_;
|
||||
asynUser *ipPortAsynOctetSyncIO_;
|
||||
double movingPollPeriod_;
|
||||
double idlePollPeriod_;
|
||||
msgPrintControl msgPrintControl_;
|
||||
|
Reference in New Issue
Block a user