- Made the HRPT temperature log lmd200 work

- Added a special el734hp which scales with 1000 for SANSLI
- Added another error to the magnet driver: magnet broken
This commit is contained in:
koennecke
2008-05-08 09:29:48 +00:00
parent 358c121b30
commit 5e96ae6939
7 changed files with 155 additions and 35 deletions

View File

@ -132,15 +132,16 @@ static int takeControl(pDornier pDorn){
if(pDorn->statusMode == STATSEND){ if(pDorn->statusMode == STATSEND){
if(!requestDornierStatus(pDorn)){ if(!requestDornierStatus(pDorn)){
*fPos = -9999.; *fPos = -9999.;
return 0; return 0;
} }
if(!readAndInterpretStatus(pDorn,&DStatus)){ if(!readAndInterpretStatus(pDorn,&DStatus)){
*fPos = -9999.; *fPos = -9999.;
return 0; return 0;
} }
pDorn->lastStatus = DStatus; pDorn->lastStatus = DStatus;
} }
*fPos = pDorn->lastStatus.cur_rpm; *fPos = pDorn->lastStatus.cur_rpm;
pDorn->fLastRPM = pDorn->lastStatus.cur_rpm; pDorn->fLastRPM = pDorn->lastStatus.cur_rpm;
return 1; return 1;

View File

@ -675,6 +675,31 @@ MotorDriver *CreateEL734HP(SConnection *pCon, int argc, char *argv[]){
SCWrite(pCon,pError,eError); SCWrite(pCon,pError,eError);
return (MotorDriver *)pNew; return (MotorDriver *)pNew;
} }
/*================ a 1000 scaled motor for SANSLI =================*/
static int EL734TRun(void *pData,float fValue){
return EL734Run(pData, fValue*1000);
}
/*-----------------------------------------------------------------*/
static int EL734TGetPos(void *pData, float *fPos){
int status;
status = EL734GetPos(pData, fPos);
*fPos /= 1000;
return status;
}
/*-------------------------------------------------------------------*/
MotorDriver *CreateEL734HPT(SConnection *pCon, int argc,
char *argv[]){
MotorDriver *pDriv = NULL;
pDriv = CreateEL734HP(pCon,argc,argv);
if(pDriv != NULL){
pDriv->GetPosition = EL734TGetPos;
pDriv->RunTo = EL734TRun;
pDriv->fLower /= 1000.;
pDriv->fUpper /= 1000.;
}
return pDriv;
}

View File

@ -23,6 +23,9 @@
#include "hardsup/el755_errcodes.h" #include "hardsup/el755_errcodes.h"
#include "hardsup/sinq_prototypes.h" #include "hardsup/sinq_prototypes.h"
#define CAPSIZED -8090
#define ABS(x) (x < 0 ? -(x) : (x))
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
typedef struct { typedef struct {
void *pData; void *pData;
@ -31,6 +34,7 @@
int iChannel; int iChannel;
int iIndex; int iIndex;
int iLastError; int iLastError;
int iCapCount;
} EL755Driv, *pEL755Driv; } EL755Driv, *pEL755Driv;
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
@ -49,6 +53,22 @@
{ {
return 0; return 0;
} }
/**
* This here is a check for the condition when the current breaks down.
* This situation is characterized by the fSoll being something and the
* fPos being 0.
*/
if(ABS(*fPos) < .1 && ABS(fSoll) > .1 ){
pMe->iCapCount++;
if(pMe->iCapCount > 3){
pMe->iLastError = CAPSIZED;
return 0;
}
}
else
{
pMe->iCapCount = 0;
}
return 1; return 1;
} }
/*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/
@ -62,6 +82,7 @@
assert(pMe); assert(pMe);
iRet = EL755_SetCurrent(&(pMe->pData),fVal); iRet = EL755_SetCurrent(&(pMe->pData),fVal);
pMe->iCapCount = 0;
if(iRet != 1) if(iRet != 1)
{ {
return 0; return 0;
@ -84,6 +105,9 @@
EL755_ErrInfo(&pPtr,iCode,&i1,&i2); EL755_ErrInfo(&pPtr,iCode,&i1,&i2);
switch(*iCode) switch(*iCode)
{ {
case CAPSIZED:
strncpy(error,"Powersupply has capsized, try lower current", iErrLen);
break;
case EL755__TURNED_OFF: case EL755__TURNED_OFF:
strncpy(error,"EL755__TURNED_OF",iErrLen); strncpy(error,"EL755__TURNED_OF",iErrLen);
break; break;
@ -215,6 +239,7 @@
switch(iError) switch(iError)
{ {
case CAPSIZED:
case EL755__TURNED_OFF: case EL755__TURNED_OFF:
case EL755__TOO_MANY: case EL755__TOO_MANY:
case EL755__TOO_LARGE: case EL755__TOO_LARGE:

106
lmd200.c
View File

@ -54,15 +54,21 @@
} }
free(priv); free(priv);
} }
/*--------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
static void doAlarm(pSICSOBJ self, char *lineBuffer){ static void setAlarm(pSICSOBJ self, char *text){
hdbValue alarmVal; hdbValue alarmVal;
pHdb node = NULL; pHdb node = NULL;
alarmVal = MakeHdbText(lineBuffer); alarmVal = MakeHdbText(text);
node = GetHipadabaNode(self->objectNode,"alarm"); node = GetHipadabaNode(self->objectNode,"alarm");
assert(node != NULL); assert(node != NULL);
UpdateHipadabaPar(node,alarmVal, NULL); UpdateHipadabaPar(node,alarmVal, NULL);
ReleaseHdbValue(&alarmVal);
}
/*--------------------------------------------------------------------------*/
static void doAlarm(pSICSOBJ self, char *lineBuffer){
setAlarm(self,lineBuffer);
WriteToCommandLog("CERCA>> ", lineBuffer); WriteToCommandLog("CERCA>> ", lineBuffer);
ServerWriteGlobal(lineBuffer,eError); ServerWriteGlobal(lineBuffer,eError);
} }
@ -79,6 +85,7 @@ static void storeData(pSICSOBJ self, int start, char *lineBuffer){
* throw first away * throw first away
*/ */
pPtr = stptok(lineBuffer,number,80," "); pPtr = stptok(lineBuffer,number,80," ");
pPtr = trim(pPtr);
pPtr = stptok(pPtr,number,80," "); pPtr = stptok(pPtr,number,80," ");
while(pPtr != NULL){ while(pPtr != NULL){
if(strstr(number,"noinp") != NULL){ if(strstr(number,"noinp") != NULL){
@ -89,46 +96,76 @@ static void storeData(pSICSOBJ self, int start, char *lineBuffer){
if(pKomma != NULL){ if(pKomma != NULL){
*pKomma = '.'; *pKomma = '.';
} }
pKomma = strchr(number,'(');
if(pKomma != NULL){
*pKomma = ' ';
}
pKomma = strchr(number,')');
if(pKomma != NULL){
*pKomma = ' ';
}
node->value.v.floatArray[start] = atof(trim(number)); node->value.v.floatArray[start] = atof(trim(number));
start++; start++;
} }
pPtr = trim(pPtr);
pPtr = stptok(pPtr,number,80," "); pPtr = stptok(pPtr,number,80," ");
} }
} }
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
static int countTokens(char *lineBuffer){ static int countTokens(char *lineBuffer){
int count = 0; int count = 0;
char myBuffer[BUFLEN]; char myBuffer[BUFLEN], token[60];
char *pPtr = NULL; char *pPtr = NULL;
memset(myBuffer,0,BUFLEN); memset(myBuffer,0,BUFLEN);
strcpy(myBuffer, lineBuffer); strcpy(myBuffer, lineBuffer);
pPtr = myBuffer; pPtr = myBuffer;
pPtr = stptok(pPtr,token, 60," \r\n");
while(pPtr != NULL){ while(pPtr != NULL){
count++; count++;
pPtr = strtok(pPtr," "); pPtr = trim(pPtr);
pPtr = stptok(pPtr,token,60," \r\n");
} }
return count; return count;
} }
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
static void interpretLine(pSICSOBJ self, pLMD200 priv){ static void interpretLine(pSICSOBJ self, pLMD200 priv){
pHdb node = NULL;
switch(priv->state){ switch(priv->state){
case IDLE: case IDLE:
if(countTokens(priv->lineBuffer) == 2){ if(strstr(priv->lineBuffer, "Alarm") != NULL){
priv->state = WAITDATA1; doAlarm(self, priv->lineBuffer);
return; return;
} else if(strstr(priv->lineBuffer,"Pre") != NULL){
setAlarm(self,priv->lineBuffer);
} else { } else {
doAlarm(self, priv->lineBuffer); priv->state = WAITDATA1;
return; setAlarm(self,"I do not feel very alarmed");
return;
} }
break; break;
case WAITDATA1: case WAITDATA1:
if(strstr(priv->lineBuffer,"...0") == NULL){
/* this data is out of order, recover...*/
priv->state == IDLE;
return;
}
storeData(self, 0, priv->lineBuffer); storeData(self, 0, priv->lineBuffer);
priv->state = WAITDATA2; priv->state = WAITDATA2;
break; break;
case WAITDATA2: case WAITDATA2:
if(strstr(priv->lineBuffer,"...0") == NULL){
/* this data is out of order, recover...*/
priv->state == IDLE;
return;
}
storeData(self, 8, priv->lineBuffer); storeData(self, 8, priv->lineBuffer);
priv->state = IDLE; priv->state = IDLE;
node = GetHipadabaNode(self->objectNode,"data");
assert(node != NULL);
NotifyHipadabaPar(node,NULL);
break; break;
} }
} }
@ -139,23 +176,22 @@ static void interpretLine(pSICSOBJ self, pLMD200 priv){
static int LMD200Callback(void *context, int mode){ static int LMD200Callback(void *context, int mode){
pSICSOBJ self = (pSICSOBJ)context; pSICSOBJ self = (pSICSOBJ)context;
pLMD200 priv = NULL; pLMD200 priv = NULL;
char buffer[512], *pPtr = NULL; char buffer[512], *pPtr = NULL, line[132];
assert(self != NULL); assert(self != NULL);
priv = (pLMD200)self->pPrivate; priv = (pLMD200)self->pPrivate;
if(mode == nwatch_read){ if(mode == nwatch_read){
memset(buffer,0,512); memset(buffer,0,512);
memset(line,0,132);
NETRead(priv->pSock, buffer, 512, 0); NETRead(priv->pSock, buffer, 512, 0);
pPtr = strchr(buffer,'\n'); pPtr = stptok(buffer,line,132,"\r");
if(pPtr != NULL){ while(pPtr != NULL){
*pPtr = '\0'; if(strlen(line) > 3){
strncat(priv->lineBuffer,buffer,BUFLEN); strncpy(priv->lineBuffer,line,BUFLEN);
interpretLine(self, priv); interpretLine(self, priv);
priv->lineBuffer[0] = '\0'; priv->lineBuffer[0] = '\0';
pPtr++; }
strncpy(priv->lineBuffer,pPtr,BUFLEN); pPtr = stptok(pPtr,line,132,"\r");
} else {
strncat(priv->lineBuffer,buffer,BUFLEN);
} }
} }
return 1; return 1;
@ -166,17 +202,18 @@ int MakeLMD200(SConnection *pCon, SicsInterp *pSics, void *pData,
pSICSOBJ self = NULL; pSICSOBJ self = NULL;
pLMD200 priv = NULL; pLMD200 priv = NULL;
hdbValue dataValue, textValue; hdbValue dataValue, textValue;
int status;
if(argc < 5){
if(argc < 4){
SCWrite(pCon, SCWrite(pCon,
"ERROR: require name class host and port parameter for initialization", "ERROR: require name host and port parameters for initialization",
eError); eError);
return 0; return 0;
} }
priv = (pLMD200)malloc(sizeof(LMD200)); priv = (pLMD200)malloc(sizeof(LMD200));
memset(priv,0,sizeof(LMD200)); memset(priv,0,sizeof(LMD200));
strncpy(priv->host,argv[3], 256); strncpy(priv->host,argv[2], 256);
priv->port = atoi(argv[4]); priv->port = atoi(argv[3]);
priv->pSock = NETConnect(priv->host,priv->port); priv->pSock = NETConnect(priv->host,priv->port);
if(priv->pSock == NULL){ if(priv->pSock == NULL){
SCWrite(pCon,"ERROR: failed to connect to LMD200",eError); SCWrite(pCon,"ERROR: failed to connect to LMD200",eError);
@ -184,7 +221,7 @@ int MakeLMD200(SConnection *pCon, SicsInterp *pSics, void *pData,
return 0; return 0;
} }
self = SetupSICSOBJ(pCon,pSics, pData,argc, argv); self = MakeSICSOBJv(argv[1],"LMD400",HIPNONE, 0);
if(self == NULL || priv == NULL){ if(self == NULL || priv == NULL){
return 0; return 0;
} }
@ -198,5 +235,18 @@ int MakeLMD200(SConnection *pCon, SicsInterp *pSics, void *pData,
ReleaseHdbValue(&textValue); ReleaseHdbValue(&textValue);
NetWatchRegisterCallback(&priv->watchContext, priv->pSock->sockid, NetWatchRegisterCallback(&priv->watchContext, priv->pSock->sockid,
LMD200Callback, self); LMD200Callback, self);
status = AddCommand(pSics,
argv[1],
InterInvokeSICSOBJ,
KillSICSOBJ,
self);
if(status != 1){
KillSICSOBJ(self);
SCPrintf(pCon,eError,"ERROR: failed create duplicate command %s", argv[1]);
return 0;
}
return 1; return 1;
} }

View File

@ -22,7 +22,7 @@ OBJ=psi.o buffer.o ruli.o dmc.o nxsans.o nextrics.o sps.o pimotor.o \
$(MZOBJ) amordrive.o amorset.o tcpdornier.o sinqhttp.o\ $(MZOBJ) amordrive.o amorset.o tcpdornier.o sinqhttp.o\
dgrambroadcast.o sinq.o tabledrive.o tcpdocho.o julcho.o \ dgrambroadcast.o sinq.o tabledrive.o tcpdocho.o julcho.o \
ritastorage.o poldizug.o audinelib.o delcam.o el737hpdrivsps.o \ ritastorage.o poldizug.o audinelib.o delcam.o el737hpdrivsps.o \
rebin.o sanslirebin.o lmd200.o rebin.o sanslirebin.o lmd200.o slsvme.o
.SECONDARY.: sanslirebin.c .SECONDARY.: sanslirebin.c

View File

@ -11,7 +11,7 @@ include ../sllinux_def
CC = gcc CC = gcc
CFLAGS = -I$(HDFROOT)/include -DHDF4 -DHDF5 $(NI) -Ihardsup \ CFLAGS = -I$(HDFROOT)/include -DHDF4 -DHDF5 $(NI) -Ihardsup \
-I.. -DCYGNUS -DNONINTF -g $(DFORTIFY) \ -I.. -DCYGNUS -DNONINTF -g $(DFORTIFY) \
-Wall -Wno-unused -Wno-comment -Wno-switch -Werror -Wall -Wno-unused -Wno-comment -Wno-switch -Werror
EXTRA=nintf.o EXTRA=nintf.o

21
psi.c
View File

@ -174,6 +174,7 @@ static void RemovePsiCommands(SicsInterp *pSics){
MotorDriver *CreateEL734(SConnection *pCon, int argc, char *argv[]); MotorDriver *CreateEL734(SConnection *pCon, int argc, char *argv[]);
MotorDriver *CreateEL734DC(SConnection *pCon, int argc, char *argv[]); MotorDriver *CreateEL734DC(SConnection *pCon, int argc, char *argv[]);
MotorDriver *CreateEL734HP(SConnection *pCon, int argc, char *argv[]); MotorDriver *CreateEL734HP(SConnection *pCon, int argc, char *argv[]);
MotorDriver *CreateEL734HPT(SConnection *pCon, int argc, char *argv[]);
MotorDriver *MakePiPiezo(Tcl_Interp *pTcl,char *pArray); MotorDriver *MakePiPiezo(Tcl_Interp *pTcl,char *pArray);
/*-------------------------------------------------------------------*/ /*-------------------------------------------------------------------*/
static pMotor CreatePsiMotor(SConnection *pCon, int argc, char *argv[]){ static pMotor CreatePsiMotor(SConnection *pCon, int argc, char *argv[]){
@ -220,6 +221,18 @@ static pMotor CreatePsiMotor(SConnection *pCon, int argc, char *argv[]){
SCWrite(pCon,pBueffel,eError); SCWrite(pCon,pBueffel,eError);
return NULL; return NULL;
} }
} else if(strcmp(argv[1],"el734hpt") == 0){
pDriver = (MotorDriver *)CreateEL734HPT(pCon,argc-2,&argv[2]);
if(!pDriver){
return NULL;
}
/* create the motor */
pNew = MotorInit("EL734HPT",argv[0],pDriver);
if(!pNew){
sprintf(pBueffel,"Failure to create motor %s",argv[1]);
SCWrite(pCon,pBueffel,eError);
return NULL;
}
} else if(strcmp(argv[1],"el734dc") == 0){ } else if(strcmp(argv[1],"el734dc") == 0){
pDriver = (MotorDriver *)CreateEL734DC(pCon,argc-2,&argv[2]); pDriver = (MotorDriver *)CreateEL734DC(pCon,argc-2,&argv[2]);
if(!pDriver){ if(!pDriver){
@ -417,7 +430,7 @@ static void ConfigureController(char *name, pEVControl pNew,
} }
/*-------------------------------------------------------------------*/ /*-------------------------------------------------------------------*/
extern pEVDriver CreateSLSDriv(int argc, char *argv[]); extern pEVDriver CreateSLSDriv(int argc, char *argv[]);
extern pEVDriver CreateSLSVMEDriv(int argc, char *argv[]);
/*------------------------------------------------------------------*/ /*------------------------------------------------------------------*/
static pEVControl InstallPsiEnvironmentController(SicsInterp *pSics, static pEVControl InstallPsiEnvironmentController(SicsInterp *pSics,
@ -506,6 +519,12 @@ static pEVControl InstallPsiEnvironmentController(SicsInterp *pSics,
if(pDriv != NULL){ if(pDriv != NULL){
pNew = CreateEVController(pDriv,argv[2],&status); pNew = CreateEVController(pDriv,argv[2],&status);
} }
} else if(strcmp(argv[3],"vme-dsp") == 0) {
checkError = 1;
pDriv = CreateSLSVMEDriv(argc-4,&argv[4]);
if(pDriv != NULL){
pNew = CreateEVController(pDriv,argv[2],&status);
}
} else if(strcmp(argv[3],"el755") == 0){ } else if(strcmp(argv[3],"el755") == 0){
checkError = 1; checkError = 1;
pDriv = CreateEL755Driv(argc-4,&argv[4]); pDriv = CreateEL755Driv(argc-4,&argv[4]);