- Fixed two small issues with evcontroller: no test for privilege on drive - Many changes to AMOR software.
123 lines
4.6 KiB
OpenEdge ABL
123 lines
4.6 KiB
OpenEdge ABL
\subsection{AMOR Two Theta}
|
|
AMOR is SINQ's new reflectometer. It has the peculiar feature that the
|
|
two theta movement of the detector is expressed in translations along
|
|
the reflectometer base axis and the detector height. Additionally the
|
|
detector is tilted. The height of two diaphragms has to be adjusted as
|
|
well. And, in polarizing mode, the analyzer has to be operated as
|
|
well. Quite a complicated movement. I fear this module may only be
|
|
useful for AMOR, but may be, other reflectometers may profit as well.
|
|
This object implements this complex movement as a virtual motor.
|
|
|
|
The following formulas are used for the necessary calculations:
|
|
\begin{eqnarray}
|
|
delta height & = & h_{s} - \sin \alpha \\
|
|
delta x & = & |x_{c} - x_{s}| - R \cos \alpha \\
|
|
omega & = & -2 MOM + 2 SOM \\
|
|
\end{eqnarray}
|
|
with
|
|
\begin{eqnarray}
|
|
h_{s} & = & \tan(2MOM)|x_{c} - x_{s}| \\
|
|
R & = & \sqrt{hs^{2} - |x_{c} - x_{s}|^{2}} \\
|
|
\alpha & = & ATT - 2SOM \\
|
|
\beta & = & 180 - 90 - 2MOM \\
|
|
MOM & = & polarizer \omega \\
|
|
SOM & = & sample \omega \\
|
|
x_{c} & = & counter position \\
|
|
x_{s} & = & sample position\\
|
|
\end{eqnarray}
|
|
The same equations hold true for the calculations of the diaphragm
|
|
heights, just replace the distances. The equations for the analyzer
|
|
are not yet known.
|
|
|
|
Due to this complicated movement this module needs to know about a lot
|
|
of motors and a lot of parameters. The distances of the various
|
|
components need to be modified at run time in order to allow for
|
|
configuration changes. These are not motorized but must be entered
|
|
manually.
|
|
|
|
\subsubsection{Data Structures}
|
|
Consequently data structures are complex. The first data structure
|
|
used is an entry in an array of motors to start:
|
|
@d putput @{
|
|
typedef struct {
|
|
pMotor pMot;
|
|
char pName[80];
|
|
float fTarget;
|
|
}MotEntry, *pMotEntry;
|
|
@}
|
|
\begin{description}
|
|
\item[pMot] is a pointer to the motors data structure.
|
|
\item[pName] is the name of the motor to start.
|
|
\item[fTarget] is the target value for the motor.
|
|
\end{description}
|
|
|
|
The next data structure is the class data structure for amor2t:
|
|
@d amoredata @{
|
|
typedef struct __AMOR2T {
|
|
pObjectDescriptor pDes;
|
|
pIDrivable pDriv;
|
|
pMotor aEngine[MAXMOT];
|
|
MotEntry toStart[MAXMOT];
|
|
int iStart;
|
|
ObPar *aParameter;
|
|
}Amor2T;
|
|
@}
|
|
\begin{description}
|
|
\item[pDes] The standard SICS object descriptor.
|
|
\item[pDriv] The drivable interface. The functions defined for the
|
|
drivable interface implement most of the work of this class.
|
|
\item[aEngine] An array of pointers to the motor data structures this
|
|
class has to deal with. The proper initialization of this is taken
|
|
care of during the initialization of the object.
|
|
\item[toStart] An array of motors to start when all calculations have
|
|
been performed.
|
|
\item[iStart] The number of valid entries in toStart.
|
|
\item[aParameter] An array of parameters for this object.
|
|
\end{description}
|
|
|
|
\subsubsection{The Interface}
|
|
The interface to this module is quite primitive. Most of the
|
|
functionality is hidden in the drivable interface. So there are only
|
|
functions for interacting with the interpreter.
|
|
|
|
@d amorinterface @{
|
|
typedef struct __AMOR2T *pAmor2T;
|
|
|
|
int Amor2TFactory(SConnection *pCon, SicsInterp *pSics, void *pData,
|
|
int argc, char *argv[]);
|
|
int Amor2TAction(SConnection *pCon, SicsInterp *pSics, void *pData,
|
|
int argc, char *argv[]);
|
|
void Amor2TKill(void *pData);
|
|
@}
|
|
|
|
@o amor2t.i @{
|
|
/*--------------------------------------------------------------------------
|
|
A m o r 2 T . i
|
|
Internal data structure definitions for Amor2T. For details see amor2t.tex.
|
|
DO NOT TOUCH! This file is automatically created from amor2t.w.
|
|
|
|
Mark Koennecke, September 1999
|
|
----------------------------------------------------------------------------*/
|
|
@<putput@>
|
|
|
|
@<amoredata@>
|
|
|
|
@}
|
|
|
|
@o amor2t.h @{
|
|
/*-------------------------------------------------------------------------
|
|
A m o r 2 T
|
|
A class for controlling the two theta movement of a reflectometer.
|
|
Especially the AMOR reflectometer at SINQ. For details see the file
|
|
amor2t.tex. DO NOT TOUCH! This file is automatically created from amor2t.w
|
|
with nuweb.
|
|
|
|
Mark Koennecke, September 1999
|
|
---------------------------------------------------------------------------*/
|
|
#ifndef AMOR2T
|
|
#define AMOR2T
|
|
@<amorinterface@>
|
|
#endif
|
|
@}
|
|
|