- Fixed a bug at the new counter driver
SKIPPED: psi/el737hpdriv.c psi/el737hpv2driv.c psi/make_gen psi/psi.c psi/tas.c psi/tasdrive.c psi/tasinit.c psi/tasscan.c psi/tasutil.c
This commit is contained in:
@ -11,7 +11,7 @@
|
|||||||
Copyright:
|
Copyright:
|
||||||
|
|
||||||
Labor fuer Neutronenstreuung
|
Labor fuer Neutronenstreuung
|
||||||
Paul Scherrer Institut
|
Paul Scherrer Institut
|
||||||
CH-5423 Villigen-PSI
|
CH-5423 Villigen-PSI
|
||||||
|
|
||||||
|
|
||||||
@ -473,6 +473,7 @@
|
|||||||
SetStatus(eOld);
|
SetStatus(eOld);
|
||||||
return iRet;
|
return iRet;
|
||||||
}
|
}
|
||||||
|
/*-----------------------------------------------------------------------*/
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
|
|
||||||
@ -717,7 +718,7 @@
|
|||||||
{"setexponent",1,{FUPAINT,0}},
|
{"setexponent",1,{FUPAINT,0}},
|
||||||
{"getexponent",0,{0,0}},
|
{"getexponent",0,{0,0}},
|
||||||
{"interest",0,{0,0}},
|
{"interest",0,{0,0}},
|
||||||
{"uninterest",0,{0,0}},
|
{"uninterest",0,{0,0}},
|
||||||
{"status",0,{0,0}},
|
{"status",0,{0,0}},
|
||||||
{"gettime",0,{0,0}},
|
{"gettime",0,{0,0}},
|
||||||
{"countnb",1,{FUPAFLOAT} },
|
{"countnb",1,{FUPAFLOAT} },
|
||||||
|
@ -191,13 +191,8 @@ This document also explains how to get hold the source code for most
|
|||||||
\subsubsection{Backup}
|
\subsubsection{Backup}
|
||||||
The laboratory server is also the central backup server for SINQ. Backups are
|
The laboratory server is also the central backup server for SINQ. Backups are
|
||||||
performed with the Legato networker software onto a tape jukebox holding
|
performed with the Legato networker software onto a tape jukebox holding
|
||||||
5 tapes with 20GB capacity each. The following items are backed up through
|
5 tapes with 20GB capacity each. Currently only the /home (holding
|
||||||
this system:
|
user home directories) and the /lnsarchive hierarchy are backed up.
|
||||||
\begin{itemize}
|
|
||||||
\item The laboratory server.
|
|
||||||
\item The instrument accounts on the instrument computers.
|
|
||||||
\item The lnsdata and lnslib shares of the lns00 Windows--NT server.
|
|
||||||
\end{itemize}
|
|
||||||
This backup system is a protection against a major harddisk failure. It is no
|
This backup system is a protection against a major harddisk failure. It is no
|
||||||
archive system. Though backup tapes are held as long as possible it
|
archive system. Though backup tapes are held as long as possible it
|
||||||
cannot be guaranteed that files older then half a year can be recovered.
|
cannot be guaranteed that files older then half a year can be recovered.
|
||||||
@ -205,6 +200,38 @@ This backup system is a protection against a major harddisk failure. It is no
|
|||||||
system. No further documentation exists, but the setup can be viewed
|
system. No further documentation exists, but the setup can be viewed
|
||||||
through the nwadmin application.
|
through the nwadmin application.
|
||||||
|
|
||||||
|
The instrument accounts on the instrument computers must be backed up
|
||||||
|
as well because they sometimes contain valuable scripts. Unfortunately
|
||||||
|
there are not enough Networker licenses to go round and there is no
|
||||||
|
reliable linux client software for our version of Legato Networker.
|
||||||
|
Therefore the data in the instrument accounts is copied nightly to a
|
||||||
|
special account on lnsa15 which is subjected to the normal
|
||||||
|
backup. More details:
|
||||||
|
\begin{itemize}
|
||||||
|
\item There is a script which does the copying. It is {\bf backupinst}
|
||||||
|
in either /data/lnslib/bin or
|
||||||
|
/afs/.psi.ch/project/sinq/linux/bin. This script is called with {\bf
|
||||||
|
backupinst INST} where INST must be replaced by the instrument name in
|
||||||
|
capitals. This script essentially calls rsync with appropriate
|
||||||
|
arguments to synchronize the instrument account minus the data
|
||||||
|
directory (which is automatically copied anyway).
|
||||||
|
\item backupinst is triggered by a cron job. For this to work each
|
||||||
|
instrument computer must have an entry in crontab reading like:
|
||||||
|
\begin{verbatim}
|
||||||
|
0 3 * * * /data/lnslib/bin/backupinst TOPSI >/tmp/topsi.log 2>&1
|
||||||
|
\end{verbatim}
|
||||||
|
Please replace paths and instrument names to match the instrument.
|
||||||
|
\item The backup account on lnsa15 is named SINQINST, password:
|
||||||
|
333SINQINST555. It contains a directory for each supported
|
||||||
|
instruments. For backupinst to work properly there must be a line in
|
||||||
|
the .rhosts file of this account for each instrument computer which
|
||||||
|
reads:
|
||||||
|
\begin{verbatim}
|
||||||
|
instcomputer.psi.ch root
|
||||||
|
\end{verbatim} Please note that this has to be the pcXXXX name for
|
||||||
|
linux instrument computers, not the DNS alias.
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
|
||||||
\subsubsection{Motor Parameter Backup}
|
\subsubsection{Motor Parameter Backup}
|
||||||
At SINQ the PSI EL--734 motor controllers are used. These motor controllers
|
At SINQ the PSI EL--734 motor controllers are used. These motor controllers
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
\chapter{Writing new SICS Commands}
|
\chapter{Writing new SICS Commands}
|
||||||
If you wish to write a new command or add a completely new piece of hardware to
|
If you wish to write a new command or add a completely new piece of hardware to
|
||||||
SICS, this is the chapter to study. There are two ways to implement
|
SICS, this is the chapter to study. There are two ways to implement
|
||||||
new commands into SICS: hrough the internal Tcl scripting language and
|
new commands into SICS: through the internal Tcl scripting language and
|
||||||
in ANSI--C. This section describes command writing in ANSI--C. You
|
in ANSI--C. This section describes command writing in ANSI--C. You
|
||||||
should consider using Tcl when:
|
should consider using Tcl when:
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
@ -264,12 +264,12 @@ function has to be overloaded to return this interface on demand.
|
|||||||
|
|
||||||
A default object descriptor can be created with:
|
A default object descriptor can be created with:
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
pObjectDescriptor CreateDescriptor(type);
|
pObjectDescriptor CreateDescriptor(type);
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
with type being the object type identifier. A descriptor can be
|
with type being the object type identifier. A descriptor can be
|
||||||
deleted with:
|
deleted with:
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
DeleteDescriptor(pDes);
|
DeleteDescriptor(pDes);
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
|
|
||||||
@ -328,12 +328,12 @@ command in the first place.
|
|||||||
Be careful with commands for deleting objects though. SICS objects may
|
Be careful with commands for deleting objects though. SICS objects may
|
||||||
be aliased, used by other objects or connected through the callback
|
be aliased, used by other objects or connected through the callback
|
||||||
interface (see \ref{inter}). SICS does not implement proper
|
interface (see \ref{inter}). SICS does not implement proper
|
||||||
bookeeping on all these relationships and thus deleting a command from
|
bookkeeping on all these relationships and thus deleting a command from
|
||||||
SICS without taking this into account may cause SICS to dump core on
|
SICS without taking this into account may cause SICS to dump core on
|
||||||
you.
|
you.
|
||||||
|
|
||||||
|
|
||||||
\section{Interacting with the Client Connection}
|
\section{Interacting with the Client Connection}\label{gow}
|
||||||
A SICS command writer needs to interact with the client connection for
|
A SICS command writer needs to interact with the client connection for
|
||||||
a variety of reasons:
|
a variety of reasons:
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
@ -349,7 +349,7 @@ has to be passed frequently into lower level code as an argument.
|
|||||||
\subsection{Writing and Reading to the Client}
|
\subsection{Writing and Reading to the Client}
|
||||||
All I/O to the client has to be processed through the I/O functions
|
All I/O to the client has to be processed through the I/O functions
|
||||||
for connections defined in conman.h and implemented in conman.c. The
|
for connections defined in conman.h and implemented in conman.c. The
|
||||||
most bable of these are SCWrite and SCPrompt.
|
most common of these are SCWrite and SCPrompt.
|
||||||
These function will now be inspected in more detail:
|
These function will now be inspected in more detail:
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
int SCWrite(SConnection *pCon, char *pText, int eCode);
|
int SCWrite(SConnection *pCon, char *pText, int eCode);
|
||||||
@ -370,7 +370,7 @@ SCWrite does with the message:
|
|||||||
code specified.
|
code specified.
|
||||||
\item The message is written to all log files configured for the client
|
\item The message is written to all log files configured for the client
|
||||||
connection.
|
connection.
|
||||||
\item If the client privilege is useer or manager, the data isw ritten
|
\item If the client privilege is user or manager, the data is written
|
||||||
to the command log.
|
to the command log.
|
||||||
\item The message is written to the server log together with the socket
|
\item The message is written to the server log together with the socket
|
||||||
number of the connection.
|
number of the connection.
|
||||||
@ -438,7 +438,7 @@ On occasion a SICS object may come to the conclusion that an error is
|
|||||||
so bad that the measurement needs to be stopped. Clearly a means is
|
so bad that the measurement needs to be stopped. Clearly a means is
|
||||||
needed to communicate this to upper level code. This means is setting
|
needed to communicate this to upper level code. This means is setting
|
||||||
an interrupt on the connection.
|
an interrupt on the connection.
|
||||||
The current interrupt active interrupt is located at the connection object
|
The current active interrupt is located at the connection object
|
||||||
and can be retrieved with {\bf SCGetInterrupt} and set with {\bf
|
and can be retrieved with {\bf SCGetInterrupt} and set with {\bf
|
||||||
SCSetInterrupt}. Interrupt codes are defined in interrupt.h and are ordered
|
SCSetInterrupt}. Interrupt codes are defined in interrupt.h and are ordered
|
||||||
into a hierarchy:
|
into a hierarchy:
|
||||||
@ -511,7 +511,7 @@ StartMotor starts the motor name to run to the new value
|
|||||||
fNew. StartCounter starts the counter name. The counter must have been
|
fNew. StartCounter starts the counter name. The counter must have been
|
||||||
loaded with proper presets etc. with the appropriate function
|
loaded with proper presets etc. with the appropriate function
|
||||||
calls. The device executor hides behind the pExeList pointer. This is
|
calls. The device executor hides behind the pExeList pointer. This is
|
||||||
always accessible through the global pointer: pServ->pExecutor.
|
always accessible through the global pointer: \verb+pServ->pExecutor+.
|
||||||
|
|
||||||
Once a counter or motor has been started, quite often the command can
|
Once a counter or motor has been started, quite often the command can
|
||||||
only continue if the operation has finished. But during this time the
|
only continue if the operation has finished. But during this time the
|
||||||
@ -569,7 +569,7 @@ process. And she might not be all to happy if the new command just
|
|||||||
continues with the next step rather then aborting the process.
|
continues with the next step rather then aborting the process.
|
||||||
|
|
||||||
|
|
||||||
\section{SICS Interfaces}\label{interface}
|
\section{SICS Interfaces}\label{interface}\label{inter}
|
||||||
The point about SICS interfaces can best be deduced from an example:
|
The point about SICS interfaces can best be deduced from an example:
|
||||||
Everybody expects that a motor can be operated through a drive command
|
Everybody expects that a motor can be operated through a drive command
|
||||||
or scanned in a scan. But there are other things which should be
|
or scanned in a scan. But there are other things which should be
|
||||||
@ -605,7 +605,7 @@ considered:
|
|||||||
\item The driveable interface should be implemented by virtual
|
\item The driveable interface should be implemented by virtual
|
||||||
motors. Virtual motors are objects which realize complex movements
|
motors. Virtual motors are objects which realize complex movements
|
||||||
possibly involving multiple motors. Examples include driving
|
possibly involving multiple motors. Examples include driving
|
||||||
wavelength (theta,two theta and possbly curvature motors have to be
|
wavelength (theta,two theta and possibly curvature motors have to be
|
||||||
moved) or omega two theta.
|
moved) or omega two theta.
|
||||||
\item Any time objects are introduced into SICS which repesent
|
\item Any time objects are introduced into SICS which repesent
|
||||||
completely new hardware.
|
completely new hardware.
|
||||||
|
@ -34,11 +34,12 @@ SICS sense is defined by a function, the task function. It is of the type:
|
|||||||
int TaskFunction(void *pData);
|
int TaskFunction(void *pData);
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
When it is time for the task to execute this function is called, with a
|
When it is time for the task to execute this function is called, with a
|
||||||
parameter to a the tasks own data structure. This data structure must have
|
pointer to the tasks own data structure as a parameter. This data
|
||||||
been defined by the user of this module. The task function returns 1, if it
|
structure must have been defined by the user of this module. The task
|
||||||
shall continue to live, or 0 if it should be deleted from the task list.
|
function returns 1, if it shall continue to live, or 0 if it should be
|
||||||
These task functions are kept in a list. The elements of this list are
|
deleted from the task list. These task functions are kept in a
|
||||||
visited cyclically, when the scheduler runs.
|
list. The elements of this list are visited cyclically, when the
|
||||||
|
scheduler runs.
|
||||||
|
|
||||||
The API to this object consists of functions for creating a task manager,
|
The API to this object consists of functions for creating a task manager,
|
||||||
adding tasks to the task list and to run the task list. Other functions
|
adding tasks to the task list and to run the task list. Other functions
|
||||||
@ -102,7 +103,7 @@ SICS should be changed. For instance to Token--Ring or AppleTalk or
|
|||||||
whatever.
|
whatever.
|
||||||
The network reader implements the polling for network message in the SICS
|
The network reader implements the polling for network message in the SICS
|
||||||
server. It is organized as one of the SICS system tasks. Polling in a POSIX
|
server. It is organized as one of the SICS system tasks. Polling in a POSIX
|
||||||
environment is all about the select system call. The select system call
|
environment is all about the select() system call. The select() system call
|
||||||
allows to enquire if an open TCP/IP socket has data pending to be read, can
|
allows to enquire if an open TCP/IP socket has data pending to be read, can
|
||||||
be written to etc. For more details see the unix man pages for the select
|
be written to etc. For more details see the unix man pages for the select
|
||||||
system call. An earlier version of the SICS server had a list of connection
|
system call. An earlier version of the SICS server had a list of connection
|
||||||
@ -135,13 +136,15 @@ the system and the network reader registers a new client command port.
|
|||||||
|
|
||||||
The normal client command ports are accepted connections from a client. The
|
The normal client command ports are accepted connections from a client. The
|
||||||
SICS server expects commands to be sent from the clients. Thus any data
|
SICS server expects commands to be sent from the clients. Thus any data
|
||||||
pending on such a socket will be read, split into single commands at the \\n
|
pending on such a socket will be read and split into single commands at
|
||||||
and put into the connections command stack for execution. At this place
|
the newline character. Now the network reader checks if the command
|
||||||
there is also the check for the special interrupt string on command
|
represents an interrupt(see \ref{prot1}) and if so process the interrupt
|
||||||
connections (see \ref{prot1}).
|
immediately. If not then command is put into the connections command
|
||||||
|
stack for execution.
|
||||||
|
|
||||||
The SICS server accepts only interrupts on its UDP port. This will be checked
|
The SICS server accepts interrupts also on its UDP port. This will be checked
|
||||||
for when handling data pending on the servers UDP port.
|
for when handling data pending on the servers UDP port. This feauture
|
||||||
|
is implemented but not well tested and not used in the moment.
|
||||||
|
|
||||||
User type sockets are a feature for dealing with extremely slow hardware
|
User type sockets are a feature for dealing with extremely slow hardware
|
||||||
connections. Some hardware devices require a long time to answer requests.
|
connections. Some hardware devices require a long time to answer requests.
|
||||||
@ -287,14 +290,15 @@ For the SICS concept for handling sample environment devices see
|
|||||||
\section{The Server}
|
\section{The Server}
|
||||||
The server module defines a server data structure. A pointer to this
|
The server module defines a server data structure. A pointer to this
|
||||||
data structure is the sole global variable in the SICS system. Its name is
|
data structure is the sole global variable in the SICS system. Its name is
|
||||||
{\bf {\huge pServ}}. This data structure contains pointers to the most
|
{\bf pServ}. This data structure contains pointers to the most
|
||||||
important SICS components: the interpreter, the task switcher, the device
|
important SICS components: the interpreter, the task switcher, the device
|
||||||
executor, the environment monitor and the network reader. This module also
|
executor, the environment monitor and the network reader. This module also
|
||||||
contains the code for initializing, running and stopping the server.
|
contains the code for initializing, running and stopping the server.
|
||||||
|
|
||||||
|
|
||||||
\section{The Performance Monitor}
|
\section{The Performance Monitor}
|
||||||
This facility provides the data for the Performance (see user documentation)
|
This facility provides the data for the ``Performance''
|
||||||
|
(see user documentation)
|
||||||
command. The Performance Monitor is a task which increments a counter each
|
command. The Performance Monitor is a task which increments a counter each
|
||||||
time it is executed. After a predefined integration time (20 seconds) a new
|
time it is executed. After a predefined integration time (20 seconds) a new
|
||||||
value cycles/per second is calculated. This is the data retrievable by the
|
value cycles/per second is calculated. This is the data retrievable by the
|
||||||
@ -307,7 +311,7 @@ monitor may well be removed from the system without harm.
|
|||||||
\section{The Object Factory}
|
\section{The Object Factory}
|
||||||
During SICS initialization the SICS interpreters command list needs to be
|
During SICS initialization the SICS interpreters command list needs to be
|
||||||
initialized. This is the task of the object factory. Its function
|
initialized. This is the task of the object factory. Its function
|
||||||
IniIniCommand initializes all fixed, general SICS commands and all object
|
InitIniCommands initializes all fixed, general SICS commands and all object
|
||||||
creation commands. Then the server initialization file is processed from the
|
creation commands. Then the server initialization file is processed from the
|
||||||
server initialization code. After this is done, the server initialization
|
server initialization code. After this is done, the server initialization
|
||||||
code calls KillIniCommands which removes the now surplus object creation
|
code calls KillIniCommands which removes the now surplus object creation
|
||||||
@ -387,3 +391,9 @@ the status file has to implement a function which will
|
|||||||
automatically be called when a status file is written. For details,
|
automatically be called when a status file is written. For details,
|
||||||
consult the chapter on SICS object implementation.
|
consult the chapter on SICS object implementation.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -14,7 +14,8 @@ System, had to meet the following specifications:
|
|||||||
\item Enhanced portability across instrument hardware. This means that it
|
\item Enhanced portability across instrument hardware. This means that it
|
||||||
should be easy to add other types of motors, counters or other hardware to
|
should be easy to add other types of motors, counters or other hardware to
|
||||||
the system.
|
the system.
|
||||||
\item Support authorization on the command and variable level. This means
|
\item Support authorization on the command and parameter modification
|
||||||
|
level. This means
|
||||||
that certain instrument settings can be protected against random changes by
|
that certain instrument settings can be protected against random changes by
|
||||||
less knowledgable users.
|
less knowledgable users.
|
||||||
\item Good maintainability and extendability.
|
\item Good maintainability and extendability.
|
||||||
@ -78,7 +79,7 @@ This is a real concern at SINQ where VMS,
|
|||||||
Intel-PC, Macintosh and Unix users have to be satisfied.
|
Intel-PC, Macintosh and Unix users have to be satisfied.
|
||||||
As many instrument scientists still prefer
|
As many instrument scientists still prefer
|
||||||
the command line for interacting with instruments, the most used client is a
|
the command line for interacting with instruments, the most used client is a
|
||||||
visual command line client. Status displays are another sort of specialized
|
visual command line client. Status displays are another kind of specialized
|
||||||
client programs. Graphical user interfaces are under consideration for some
|
client programs. Graphical user interfaces are under consideration for some
|
||||||
instruments. As an example for a client a screen shot of the status display
|
instruments. As an example for a client a screen shot of the status display
|
||||||
client for a powder diffractometer is given in picture \ref{dmc}
|
client for a powder diffractometer is given in picture \ref{dmc}
|
||||||
@ -86,7 +87,7 @@ client for a powder diffractometer is given in picture \ref{dmc}
|
|||||||
\begin{figure}
|
\begin{figure}
|
||||||
%% \epsfxsize=0.65\textwidth
|
%% \epsfxsize=0.65\textwidth
|
||||||
\epsfxsize=160mm
|
\epsfxsize=160mm
|
||||||
%% \epsffile{dmc.eps}
|
\epsffile{dmccom.eps}
|
||||||
\caption{Example for a SICS client: Powder Diffractometer Status Display}\label{dmc}
|
\caption{Example for a SICS client: Powder Diffractometer Status Display}\label{dmc}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
@ -129,10 +130,10 @@ In more detail the SICS server kernel has the following tasks:
|
|||||||
\item Monitor HW--operations.
|
\item Monitor HW--operations.
|
||||||
\item Monitor environment devices.
|
\item Monitor environment devices.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
Any server serving multiple clients has the problem how to organize multiple
|
Any program serving multiple clients has the problem how to organize multiple
|
||||||
clients accessing the same server and how to stop one client reading data,
|
clients accessing the same server and how to prevent one client from
|
||||||
which another client is just writing. The approach used for the SICS server
|
reading data, while another client is writing. The approach used for
|
||||||
is a combination of polling and cooperative multitasking. This scheme is
|
the SICS server is a combination of polling and cooperative multitasking. This scheme is
|
||||||
simple and can be implemented in an operating system independent manner. One
|
simple and can be implemented in an operating system independent manner. One
|
||||||
way to look at the SICS server is as a series of tasks in a circular queue
|
way to look at the SICS server is as a series of tasks in a circular queue
|
||||||
executing one after another. The servers main loop does nothing but
|
executing one after another. The servers main loop does nothing but
|
||||||
@ -151,8 +152,7 @@ client connection and create the associated data structures. If the port
|
|||||||
belongs to an open client connection the network reader will read the
|
belongs to an open client connection the network reader will read the
|
||||||
command pending and put it onto a command stack existing for each client
|
command pending and put it onto a command stack existing for each client
|
||||||
connection. When it is time for a client task to execute, it will fetch a
|
connection. When it is time for a client task to execute, it will fetch a
|
||||||
command from its very own command stack and execute it. When the net reader
|
command from its very own command stack and execute it.
|
||||||
finds an user interrupt pending, the interrupt is executed.
|
|
||||||
This is how the SICS server deals with client requests.
|
This is how the SICS server deals with client requests.
|
||||||
|
|
||||||
The scheme described above relies on the fact that most SICS command need
|
The scheme described above relies on the fact that most SICS command need
|
||||||
@ -181,7 +181,7 @@ an hardware request all other clients requests to drive the hardware will
|
|||||||
return an error. The device executor is also responsible for monitoring the
|
return an error. The device executor is also responsible for monitoring the
|
||||||
progress of an hardware operation. It does so by adding a special task into
|
progress of an hardware operation. It does so by adding a special task into
|
||||||
the system which checks the status of the operation each time this tasks
|
the system which checks the status of the operation each time this tasks
|
||||||
executes. When the hardware operation is finished (one way or another) this
|
executes. When the hardware operation is finished this
|
||||||
device executor task will end. A special system facility allows a client
|
device executor task will end. A special system facility allows a client
|
||||||
task to wait for the device executor task to end while the rest of the task
|
task to wait for the device executor task to end while the rest of the task
|
||||||
queue is still executing. In this way time intensive hardware operations can
|
queue is still executing. In this way time intensive hardware operations can
|
||||||
@ -258,7 +258,7 @@ can be configured to tell SICS clients or other SICS objects about his new
|
|||||||
position.
|
position.
|
||||||
|
|
||||||
SICS uses NeXus$^{2}$, the upcoming standard for data exchange for neutron
|
SICS uses NeXus$^{2}$, the upcoming standard for data exchange for neutron
|
||||||
and x\_ray scattering as its raw data format.
|
and x--ray scattering as its raw data format.
|
||||||
|
|
||||||
|
|
||||||
\section{SICS Working Examples}
|
\section{SICS Working Examples}
|
||||||
@ -279,10 +279,10 @@ done by a special system component, the task switcher.
|
|||||||
\subsection{The Request for a new Client Connection}
|
\subsection{The Request for a new Client Connection}
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item The network reader recognizes pending data on its main server port.
|
\item The network reader recognizes pending data on its main server port.
|
||||||
\item The network reader accepts the connection and tries to read a
|
\item The network reader accepts the connection and tries to read an
|
||||||
username/password pair.
|
username/password pair.
|
||||||
\item If such a username/password pair comes within a suitable time
|
\item If such an username/password pair comes within a suitable time
|
||||||
intervals it is checked for validity. On failure the connection is closed
|
interval it is checked for validity. On failure the connection is closed
|
||||||
again.
|
again.
|
||||||
\item If a valid connection has been found: A new connection object is
|
\item If a valid connection has been found: A new connection object is
|
||||||
created, a new task for this client connection is introduced into the
|
created, a new task for this client connection is introduced into the
|
||||||
@ -312,7 +312,7 @@ task to the task switcher.
|
|||||||
\item The next task executes.
|
\item The next task executes.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
\subsection{A Drive Command in Blocking Mode}
|
\subsection{A ``Drive'' Command in Blocking Mode}
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item The network reader finds data pending at one of the client ports.
|
\item The network reader finds data pending at one of the client ports.
|
||||||
\item The network reader reads the command, splits it into single lines and
|
\item The network reader reads the command, splits it into single lines and
|
||||||
@ -342,8 +342,8 @@ requesting the wait state. The client connection and task executing the drive co
|
|||||||
\item The device executor task will keep on monitoring the progress of the motor
|
\item The device executor task will keep on monitoring the progress of the motor
|
||||||
driving whenever the task switcher allows it to execute.
|
driving whenever the task switcher allows it to execute.
|
||||||
\item In due time the device executor task will find that the motor finished
|
\item In due time the device executor task will find that the motor finished
|
||||||
driving. The task will then die. The clients grab of the hardware driving
|
driving. The task will then finish executing. The clients grab of the
|
||||||
permission will be released.
|
hardware driving permission will be released.
|
||||||
\item At this stage the drive command wrapper function will awake and
|
\item At this stage the drive command wrapper function will awake and
|
||||||
continue execution. This means inspecting errors and reporting to the client
|
continue execution. This means inspecting errors and reporting to the client
|
||||||
how things worked out.
|
how things worked out.
|
||||||
@ -353,7 +353,7 @@ other commands.
|
|||||||
\item The next task executes.
|
\item The next task executes.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
\subsection{A Drive Command Interrupted}
|
\subsection{A ``Drive Command Interrupted}
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item The network reader finds data pending at one of the client ports.
|
\item The network reader finds data pending at one of the client ports.
|
||||||
\item The network reader reads the command, splits it into single lines and
|
\item The network reader reads the command, splits it into single lines and
|
||||||
@ -396,7 +396,7 @@ task to the task switcher.
|
|||||||
\item The next task executes.
|
\item The next task executes.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
\subsection{A Run Command in Non Blocking Mode}
|
\subsection{A ``Run'' Command in Non Blocking Mode}
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item The network reader finds data pending at one of the client ports.
|
\item The network reader finds data pending at one of the client ports.
|
||||||
\item The network reader reads the command, splits it into single lines and
|
\item The network reader reads the command, splits it into single lines and
|
||||||
@ -408,13 +408,13 @@ itself to the SICS interpreter.
|
|||||||
\item The SICS interpreter inspects the first word of the command. Using
|
\item The SICS interpreter inspects the first word of the command. Using
|
||||||
this key the interpreter finds the drive command wrapper function and passes
|
this key the interpreter finds the drive command wrapper function and passes
|
||||||
control to that function.
|
control to that function.
|
||||||
\item The run command wrapper function will check further arguments,
|
\item The ``run'' command wrapper function will check further arguments,
|
||||||
checks the
|
checks the
|
||||||
clients authorisation if appropriate for the action requested. Depending on
|
clients authorisation if appropriate for the action requested. Depending on
|
||||||
the checks, the wrapper function will create an error message or do its
|
the checks, the wrapper function will create an error message or do its
|
||||||
work.
|
work.
|
||||||
\item Assuming everything is OK, the motor is located in the system.
|
\item Assuming everything is OK, the motor is located in the system.
|
||||||
\item The drive command wrapper function asks the device executor to run the
|
\item The ``run'' command wrapper function asks the device executor to run the
|
||||||
motor.
|
motor.
|
||||||
\item The device executor verifies that nobody else is driving, then starts
|
\item The device executor verifies that nobody else is driving, then starts
|
||||||
the motor and grabs hardware control. The device executor also starts a task
|
the motor and grabs hardware control. The device executor also starts a task
|
||||||
@ -432,10 +432,11 @@ permission will be released. Any errors however, will be reported.
|
|||||||
All this seems to be pretty complex and time consuming. But it is the complexity needed to
|
All this seems to be pretty complex and time consuming. But it is the complexity needed to
|
||||||
do so many things, especially the non blocking mode of operation requested
|
do so many things, especially the non blocking mode of operation requested
|
||||||
by users. Tests have shown that the task switcher manages +900 cycles
|
by users. Tests have shown that the task switcher manages +900 cycles
|
||||||
per second through the task list on a DigitalUnix machine and 50
|
per second through the task list on a DigitalUnix machine and 500
|
||||||
cycles per second on a pentium 133mhz machine running linux. Both data
|
cycles per second on a pentium 2GHZ machine running linux. Both data
|
||||||
were obtained with software simulation of hardware devices. With real
|
were obtained with software simulation of hardware devices. With real
|
||||||
SINQ hardware these numbers drop 4 cycles per second. This shows
|
SINQ hardware these numbers drop to as low as 4 cycles per second if
|
||||||
|
the hardware is slow in responding. This shows
|
||||||
clearly that the communication with the hardware is the systems
|
clearly that the communication with the hardware is the systems
|
||||||
bottleneck and not the task switching scheme.
|
bottleneck and not the task switching scheme.
|
||||||
|
|
||||||
|
@ -14,6 +14,8 @@
|
|||||||
\setlength{\textheight}{8.9in}
|
\setlength{\textheight}{8.9in}
|
||||||
\setlength{\textwidth}{6.2in}
|
\setlength{\textwidth}{6.2in}
|
||||||
\setlength{\marginparwidth}{0.5in}
|
\setlength{\marginparwidth}{0.5in}
|
||||||
|
\setlength{\parindent}{0cm}
|
||||||
|
\setlength{\parskip}{.2cm}
|
||||||
|
|
||||||
\begin{document}
|
\begin{document}
|
||||||
\title{The SICS Programmers Reference}
|
\title{The SICS Programmers Reference}
|
||||||
|
@ -9,20 +9,20 @@ The SICS server implements the most primitive telnet server possible
|
|||||||
and does not support any of the fancy options possible with
|
and does not support any of the fancy options possible with
|
||||||
telnet. Using the telnet protocoll involves:
|
telnet. Using the telnet protocoll involves:
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item Open a scoket conenction to SICS telnet port
|
\item Open a socket connection to SICS's telnet port
|
||||||
\item Send a login word followed by a username and a password. The
|
\item Send a login word followed by a username and a password. The
|
||||||
login word is set in SICS initialization file as the SicsOption
|
login word is set in SICS initialization file as the SicsOption
|
||||||
TelWord.
|
TelWord.
|
||||||
\item On success a welcome message is printed, otherwise SICS
|
\item On success a welcome message is printed, otherwise SICS
|
||||||
terminates the connection.
|
terminates the connection.
|
||||||
\item Now commands can be sent, but watch for the telnet protocoll
|
\item Now commands can be sent, but watch for the telnet protocoll
|
||||||
specification in RFC-?????.
|
specification in the telnet RFC.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
\section{Connection using a plain Connection}
|
\section{Connection using a plain Connection}
|
||||||
This protocoll involves:
|
This protocoll involves:
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item Open a scoket conenction to SICS telnet port
|
\item Open a socket connection to SICS's plain port
|
||||||
\item Send a username and a password.
|
\item Send a username and a password.
|
||||||
\item On success OK is printed, otherwise SICS
|
\item On success OK is printed, otherwise SICS
|
||||||
terminates the connection.
|
terminates the connection.
|
||||||
@ -59,3 +59,5 @@ resolved in file interrupt.h.
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -29,6 +29,23 @@ All drivers use a common pattern for error handling. Please read the
|
|||||||
section on the motor driver where this pattern is explained in more
|
section on the motor driver where this pattern is explained in more
|
||||||
detail. The same pattern is applied in most drivers.
|
detail. The same pattern is applied in most drivers.
|
||||||
|
|
||||||
|
Please be aware that the hardware drivers have a significant impact on
|
||||||
|
SICS's overall performance. Most of the time SICS will be sitting
|
||||||
|
there and wait for a counter or a motor to finish. And often the
|
||||||
|
devices controlling such things respond pretty slow. The most often
|
||||||
|
called function is the status check function of the driver. It is
|
||||||
|
advisable to optimize this is good as possible. Suggestions for this
|
||||||
|
include:
|
||||||
|
\begin{itemize}
|
||||||
|
\item Reduce the amount of data to be read from the controller as much
|
||||||
|
as possible.
|
||||||
|
\item Make the status function a state machine: in the first state a
|
||||||
|
status request command is sent and the second state is entered. In teh
|
||||||
|
second state, the function checks if data is available on the
|
||||||
|
communication port and process if this is so, else it returns the
|
||||||
|
appropriate busy code.
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
This section describes the actual drivers. How these drivers are
|
This section describes the actual drivers. How these drivers are
|
||||||
integrated into SICS is described in the chapter on the site data
|
integrated into SICS is described in the chapter on the site data
|
||||||
structure (see \ref{site}).
|
structure (see \ref{site}).
|
||||||
@ -85,13 +102,16 @@ values are supposed to be identical to the positions of the limit
|
|||||||
switches on the real thing. Read them from the motor or initialize
|
switches on the real thing. Read them from the motor or initialize
|
||||||
them from parameters when initializing the motor driver.
|
them from parameters when initializing the motor driver.
|
||||||
\item[GetPosition] reads the position of the motor and puts the result
|
\item[GetPosition] reads the position of the motor and puts the result
|
||||||
into fPos. This ought to be the position from the motor
|
into fPos. This ought to be the position from the motor
|
||||||
controller. Software zeros are applied later by code in motor.c.
|
controller. Software zeros are applied later by code in
|
||||||
|
motor.c. GetPosition returns either OKOK when the request succeeded
|
||||||
|
or HWFault on failure.
|
||||||
\item[RunTo] Starts the motor to run towards the new position
|
\item[RunTo] Starts the motor to run towards the new position
|
||||||
fNewVal. fNewVal must be a value valid for the controller. Software
|
fNewVal. fNewVal must be a value valid for the controller. Software
|
||||||
zero points have already been taken account of by code in
|
zero points have already been taken account of by code in
|
||||||
motor.c. This function shall NOT wait for the completion of the
|
motor.c. This function shall NOT wait for the completion of the
|
||||||
driving operation.
|
driving operation. RunTo returns either OKOK when the request succeeded
|
||||||
|
or HWFault on failure.
|
||||||
\item[GetStatus] This function is called repeatedly by upper level
|
\item[GetStatus] This function is called repeatedly by upper level
|
||||||
code to poll for the progress of the driving operation. Possible
|
code to poll for the progress of the driving operation. Possible
|
||||||
return values of this function are:
|
return values of this function are:
|
||||||
@ -135,7 +155,7 @@ upper level code in motor.c: If an error in any function occurs,
|
|||||||
GetError gets called. An error message is printed. Then TryAndFixIt is
|
GetError gets called. An error message is printed. Then TryAndFixIt is
|
||||||
called with the error code returned in iCode as a parameter. If
|
called with the error code returned in iCode as a parameter. If
|
||||||
TryAndFixIt returns MOTFAIL, the code gives up. If TryAndFixIt
|
TryAndFixIt returns MOTFAIL, the code gives up. If TryAndFixIt
|
||||||
returns MOTREDO, the failed operation is retried. At max retries are
|
returns MOTREDO, the failed operation is retried. At max 3 retries are
|
||||||
performed. If the operation does not succeed after three
|
performed. If the operation does not succeed after three
|
||||||
retries, a motor failure is reported.
|
retries, a motor failure is reported.
|
||||||
|
|
||||||
@ -149,7 +169,7 @@ no such parameters have these functions do nothing and return 1.
|
|||||||
\section{The Counter Driver}
|
\section{The Counter Driver}
|
||||||
A counter driver is a driver for some box which allows to count for a
|
A counter driver is a driver for some box which allows to count for a
|
||||||
preset time or monitor and manages single counters and monitors. Such
|
preset time or monitor and manages single counters and monitors. Such
|
||||||
a driver is reprsented by a data structure:
|
a driver is represented by a data structure:
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
typedef struct __COUNTER {
|
typedef struct __COUNTER {
|
||||||
/* variables */
|
/* variables */
|
||||||
@ -216,13 +236,13 @@ cached in lCounts.
|
|||||||
paused.
|
paused.
|
||||||
\item[iErrorCode] A private variable holding error codes.
|
\item[iErrorCode] A private variable holding error codes.
|
||||||
\item[GetStatus] This function is called while upper
|
\item[GetStatus] This function is called while upper
|
||||||
elvel code polls for the counter to finish. It has to return the
|
level code polls for the counter to finish. It has to return the
|
||||||
status of the counting operation and update the current value of the
|
status of the counting operation and update the current value of the
|
||||||
control variable in fControl. Possible return values are:
|
control variable in fControl. Possible return values are:
|
||||||
\begin{description}
|
\begin{description}
|
||||||
\item[HWBusy] when counting.
|
\item[HWBusy] when counting.
|
||||||
\item[HWIdle] when finished counting or idle.
|
\item[HWIdle] when finished counting or idle.
|
||||||
\item[HWNoBeam] when counting is interrupted due to lack of beam.
|
\item[HWNoBeam] when counting is halted due to lack of beam.
|
||||||
\item[HWPause] if counting is paused.
|
\item[HWPause] if counting is paused.
|
||||||
\item[HWFault] if the status cannot be obtained.
|
\item[HWFault] if the status cannot be obtained.
|
||||||
\end{description}
|
\end{description}
|
||||||
@ -233,11 +253,11 @@ previously confugured. Do NOT wait for counting to finish!
|
|||||||
\item[Halt] stop counting.
|
\item[Halt] stop counting.
|
||||||
\item[ReadValues] read all counters and monitors into lCounts.
|
\item[ReadValues] read all counters and monitors into lCounts.
|
||||||
\item[GetError] retrieves information about an error which occurred on
|
\item[GetError] retrieves information about an error which occurred on
|
||||||
the counter. An integer error code is returned in iCode. Up to iBufLen
|
the counter. An integer error code is returned in iCode. Up to iErrLen
|
||||||
characters of descriptive error information is copied into
|
characters of descriptive error information is copied into
|
||||||
buffer. This information is printed as error message by upper level
|
error. This information is printed as error message by upper level
|
||||||
code.
|
code.
|
||||||
\item[TryAndFixIt] Given an error code in iError, try to repair the
|
\item[TryAndFixIt] Given an error code in iCode, try to repair the
|
||||||
problem as far as this is possible in software. iError should be an
|
problem as far as this is possible in software. iError should be an
|
||||||
error code as returned by GetError in iCode. This function has the
|
error code as returned by GetError in iCode. This function has the
|
||||||
following return codes:
|
following return codes:
|
||||||
@ -248,8 +268,8 @@ following return codes:
|
|||||||
\item[Set] set parameter name associated with counter iCter to fVal.
|
\item[Set] set parameter name associated with counter iCter to fVal.
|
||||||
\item[Get] return in fVal the value of parameter name associated with
|
\item[Get] return in fVal the value of parameter name associated with
|
||||||
iCter. These two functions allow to set counter driver parameters.
|
iCter. These two functions allow to set counter driver parameters.
|
||||||
\item[Send] send pText to the counter controller and return iReplylen
|
\item[Send] send pText to the counter controller and return iReplyLen
|
||||||
characters of repsonse from the counter controller in pReply. This is
|
characters of response from the counter controller in pReply. This is
|
||||||
a bypass to set controller parameters manually.
|
a bypass to set controller parameters manually.
|
||||||
\item[KillPrivate] properly delete counter driver private data
|
\item[KillPrivate] properly delete counter driver private data
|
||||||
pData. Also close any connections to the hardware.
|
pData. Also close any connections to the hardware.
|
||||||
@ -295,9 +315,9 @@ is replaced by a standard one based on GetValue if not present.
|
|||||||
at max iReplBuflen bytes of result in pReplyBuffer. This is breakout
|
at max iReplBuflen bytes of result in pReplyBuffer. This is breakout
|
||||||
which allows to send arbitray data to the controller.
|
which allows to send arbitray data to the controller.
|
||||||
\item[GetError] retrieves information about an error which occurred on
|
\item[GetError] retrieves information about an error which occurred on
|
||||||
the device. An integer error code is returned in iCode. Up to iBufLen
|
the device. An integer error code is returned in iCode. Up to iErrLen
|
||||||
characters of descriptive error information is copied into
|
characters of descriptive error information is copied into
|
||||||
buffer. This information is printed as error message by upper level
|
pError. This information is printed as error message by upper level
|
||||||
code.
|
code.
|
||||||
\item[TryAndFixIt] Given an error code in iError, try to repair the
|
\item[TryAndFixIt] Given an error code in iError, try to repair the
|
||||||
problem as far as this is possible in software. iError should be an
|
problem as far as this is possible in software. iError should be an
|
||||||
@ -308,7 +328,7 @@ following return codes:
|
|||||||
\item[DEVFAULT] The problem cannot be fixed in software.
|
\item[DEVFAULT] The problem cannot be fixed in software.
|
||||||
\end{description}
|
\end{description}
|
||||||
\item[Init] initializes a connection to a controller and puts the
|
\item[Init] initializes a connection to a controller and puts the
|
||||||
thing into the right mode (or mood?).
|
thing into the right mode.
|
||||||
\item[Close] closes a connection to a controller.
|
\item[Close] closes a connection to a controller.
|
||||||
\item[pPrivate] A pointer to a driver specific data structure which
|
\item[pPrivate] A pointer to a driver specific data structure which
|
||||||
can be filled with meaning by instances of drivers.
|
can be filled with meaning by instances of drivers.
|
||||||
@ -317,7 +337,7 @@ with pPrivate.
|
|||||||
\end{description}
|
\end{description}
|
||||||
|
|
||||||
|
|
||||||
\section{Histogram Memory}
|
\section{Histogram Memory Drivers}
|
||||||
Histogram memories are devices in which neutron events for area
|
Histogram memories are devices in which neutron events for area
|
||||||
detector or time--of--flight detectors are assigned to their correct
|
detector or time--of--flight detectors are assigned to their correct
|
||||||
bins. Then these usually large data sets have to be transferred to
|
bins. Then these usually large data sets have to be transferred to
|
||||||
@ -392,7 +412,7 @@ structure given below:
|
|||||||
} HistDriver;
|
} HistDriver;
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
All functions take a pointer to their driver data structure as an
|
All functions take a pointer to their driver data structure as an
|
||||||
argument. If not stated otherwise they retun 1 on success, 0 on failure.
|
argument. If not stated otherwise they return 1 on success, 0 on failure.
|
||||||
\begin{description}
|
\begin{description}
|
||||||
\item[data] Is a pointer to an HMdata object which does all the
|
\item[data] Is a pointer to an HMdata object which does all the
|
||||||
dimension handling, buffers histogram memory content, deals with time
|
dimension handling, buffers histogram memory content, deals with time
|
||||||
@ -423,8 +443,8 @@ operation. Possible return values to this call are:
|
|||||||
\end{itemize}
|
\end{itemize}
|
||||||
\item[GetError] will be called whenever an error has been detected on
|
\item[GetError] will be called whenever an error has been detected on
|
||||||
the device. The task is to put an internal error code into the iCode
|
the device. The task is to put an internal error code into the iCode
|
||||||
parameter. The string parameter error will be filled with a text description
|
parameter. The string parameter perror will be filled with a text description
|
||||||
of the error. But maximum iLen characters will be transferred to the error
|
of the error. But maximum iErrlen characters will be transferred to the error
|
||||||
string in order to protect against memory corruption. Therefore iLen must be
|
string in order to protect against memory corruption. Therefore iLen must be
|
||||||
the maximum field length of error.
|
the maximum field length of error.
|
||||||
\item[TryAndFixIt] is the next function called in case of an error on
|
\item[TryAndFixIt] is the next function called in case of an error on
|
||||||
@ -435,20 +455,20 @@ TryAndFixIt returns one of the following values:
|
|||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item COREDO when the error could be fixed, but the upper level code will
|
\item COREDO when the error could be fixed, but the upper level code will
|
||||||
need to rerun the command which failed.
|
need to rerun the command which failed.
|
||||||
\item COFAIL when the software is unable to fix the problem and a real
|
\item COTERM when the software is unable to fix the problem and a real
|
||||||
mechanic with a hammer is needed (or somebody able to reboot!).
|
mechanic with a hammer is needed (or somebody able to reboot!).
|
||||||
\item MOTOK when the error was fixed and nor further action is necessary.
|
\item MOTOK when the error was fixed and nor further action is necessary.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
\item[GetData] transfers all the data collected in the HM into the
|
\item[GetData] transfers all the data collected in the HM into the
|
||||||
host computers memory buffer.
|
host computers memory buffer.
|
||||||
\item[GetHistogram] copies data betwen iStart and iend from histogram
|
\item[GetHistogram] copies data between iStart and iEnd from histogram
|
||||||
bank i into the data space pData. Please make sure that pData is big
|
bank i into the data space pData. Please make sure that pData is big
|
||||||
enough to hold the data.
|
enough to hold the data.
|
||||||
\item[SetHistogram] presets the histogram bank i i with the data
|
\item[SetHistogram] presets the histogram bank i with the data
|
||||||
given in lData. A conversion from different binwidth
|
given in lData. A conversion from different binwidth
|
||||||
to long is performed as well. iStart and iStop define the start and end of
|
to long is performed as well. iStart and iStop define the start and end of
|
||||||
the stretch of histogram to replace.
|
the stretch of histogram to replace.
|
||||||
\item[GetMonitor] returns the counts in the monitor i. Returns a
|
\item[GetMonitor] returns the counts in the monitor i. GetMonitor returns a
|
||||||
negative value on error. The error will have been printed to pCon.
|
negative value on error. The error will have been printed to pCon.
|
||||||
\item[GetTime] returns the actual counting time.
|
\item[GetTime] returns the actual counting time.
|
||||||
\item[Preset] initializes the histogram memory to the value given by
|
\item[Preset] initializes the histogram memory to the value given by
|
||||||
@ -496,7 +516,7 @@ described below. The velocity selector driver data structure includes:
|
|||||||
}VelSelDriv;
|
}VelSelDriv;
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
All functions take a pointer to their driver data structure as an
|
All functions take a pointer to their driver data structure as an
|
||||||
argument. If not stated otherwise they retun 1 on success, 0 on failure.
|
argument. If not stated otherwise they return 1 on success, 0 on failure.
|
||||||
The fields:
|
The fields:
|
||||||
\begin{description}
|
\begin{description}
|
||||||
\item[pPrivate] a pointer to a driver private data structure.
|
\item[pPrivate] a pointer to a driver private data structure.
|
||||||
@ -524,7 +544,7 @@ NOT wait until finished.
|
|||||||
operation. It returns:
|
operation. It returns:
|
||||||
\begin{description}
|
\begin{description}
|
||||||
\item[VSACCEL] when the velocity selector is accelerating.
|
\item[VSACCEL] when the velocity selector is accelerating.
|
||||||
\item[VSFAIL] is the status cannot be read.
|
\item[VSFAIL] if the status cannot be read.
|
||||||
\item[VSOK] when the velocity seelctor has reached its target speed.
|
\item[VSOK] when the velocity seelctor has reached its target speed.
|
||||||
\end{description}
|
\end{description}
|
||||||
The current rotation speed is returned in *fCur. iCall is a value
|
The current rotation speed is returned in *fCur. iCall is a value
|
||||||
@ -537,15 +557,15 @@ to be started first.
|
|||||||
\end{description}
|
\end{description}
|
||||||
\item[GetDriverText] returns iTextLen bytes of additional status
|
\item[GetDriverText] returns iTextLen bytes of additional status
|
||||||
information in pText. This is a list name: value pairs separated by
|
information in pText. This is a list name: value pairs separated by
|
||||||
komma. This is meant to hold additional selector readouts such as
|
commata. This is meant to hold additional selector readouts such as
|
||||||
vacuum states, temperatures etc.
|
vacuum states, temperatures etc.
|
||||||
\item[GetLossCurrent] initiates a measurement of the loss current of
|
\item[GetLossCurrent] initiates a measurement of the loss current of
|
||||||
the velocity seelctor. The result is returned in *fLoss.
|
the velocity selector. The result is returned in *fLoss.
|
||||||
\item[Init] initiates a connection to a velocity selector.
|
\item[Init] initiates a connection to a velocity selector.
|
||||||
\end{description}
|
\end{description}
|
||||||
|
|
||||||
It may be possible that this driver is not very general. It was
|
It may be possible that this driver is not very general. It was
|
||||||
developed for Dornier velocity seelctors because these were the only
|
developed for Dornier velocity selectors because these were the only
|
||||||
one seen.
|
one seen.
|
||||||
|
|
||||||
\section{General Controller Driver}
|
\section{General Controller Driver}
|
||||||
@ -583,7 +603,7 @@ restricted to this usage. The driver:
|
|||||||
}Codri;
|
}Codri;
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
All functions take a pointer to their driver data structure as an
|
All functions take a pointer to their driver data structure as an
|
||||||
argument. If not stated otherwise they retun 1 on success, 0 on failure.
|
argument. If not stated otherwise they return 1 on success, 0 on failure.
|
||||||
The fields:
|
The fields:
|
||||||
\begin{description}
|
\begin{description}
|
||||||
\item[Init] initializes a connection to the controller and the driver.
|
\item[Init] initializes a connection to the controller and the driver.
|
||||||
|
@ -82,16 +82,16 @@ Configure in the histogram memory driver.
|
|||||||
\end{itemize}
|
\end{itemize}
|
||||||
On success a pointer to
|
On success a pointer to
|
||||||
new driver is returned, on failure NULL.
|
new driver is returned, on failure NULL.
|
||||||
\item[CreateVelSelDriv] creates a driver for a velocity selector. The
|
\item[CreateVelolcitySelector] creates a driver for a velocity selector. The
|
||||||
driver is identified by nname, array is the name of a Tcl array in
|
driver is identified by nname, array is the name of a Tcl array in
|
||||||
pTcl holding initialization parameters for name.
|
pTcl holding initialization parameters for name.
|
||||||
\item[MakeController] generates a driver for a SICS general controller
|
\item[CreateControllerDriver] generates a driver for a SICS general controller
|
||||||
object. \verb+argv[0]+ is the driver identifier, the rest of argc,
|
object. \verb+argv[0]+ is the driver identifier, the rest of argc,
|
||||||
\verb+argv[]+ are further initialization parameters. Any errors in
|
\verb+argv[]+ are further initialization parameters. Any errors in
|
||||||
parsing argc, argv can be reported to pCon. On success a pointer to
|
parsing argc, argv can be reported to pCon. On success a pointer to
|
||||||
new driver is returned, on failure NULL.
|
new driver is returned, on failure NULL.
|
||||||
\item[InstallEnvironmentController] installs a sample environment
|
\item[InstallEnvironmentController] installs a sample environment
|
||||||
controller into pSics. \verb+argv[3]+ is the driver indentifier,
|
controller into pSics. \verb+argv[3]+ is the driver identifier,
|
||||||
\verb+argv[2]+ is the SICS name of the environment device command, the
|
\verb+argv[2]+ is the SICS name of the environment device command, the
|
||||||
rest are initialization parameters. This function must also install
|
rest are initialization parameters. This function must also install
|
||||||
the command into pSics with AddCommand. This is because for many PSI
|
the command into pSics with AddCommand. This is because for many PSI
|
||||||
@ -103,8 +103,8 @@ controller is returned, on failure NULL.
|
|||||||
to the value of option. Returns 1 on success and 0 on failure. SICS
|
to the value of option. Returns 1 on success and 0 on failure. SICS
|
||||||
general scan object is a data structure holding function pointers for
|
general scan object is a data structure holding function pointers for
|
||||||
various steps in the scan. These functions can be overloaded in order
|
various steps in the scan. These functions can be overloaded in order
|
||||||
to provide for special scans. See the documentation ins scan.tex,
|
to provide for special scans. See the documentation in scan.tex,
|
||||||
scan.h and scan.c from more details.
|
scan.h and scan.c for more details.
|
||||||
\end{description}
|
\end{description}
|
||||||
|
|
||||||
|
|
||||||
@ -115,8 +115,8 @@ controller object.
|
|||||||
|
|
||||||
|
|
||||||
The site data structure suffers a little from inconsistencies
|
The site data structure suffers a little from inconsistencies
|
||||||
introduced through varying concepts for initializing SICS objects introduced
|
introduced through varying concepts for initializing SICS objects implemented
|
||||||
during the development of SICS. If you need to bypass the schemes
|
in various stage of the development of SICS. If you need to bypass the schemes
|
||||||
introduced here, consider implementing an own factory command and
|
introduced here, consider implementing an own factory command and
|
||||||
install it through AddSiteCommand, RemoveSiteCommand.
|
install it through AddSiteCommand, RemoveSiteCommand.
|
||||||
|
|
||||||
|
183
evcontroller.c
183
evcontroller.c
@ -1143,6 +1143,114 @@
|
|||||||
}
|
}
|
||||||
return 0; /* not reached */
|
return 0; /* not reached */
|
||||||
}
|
}
|
||||||
|
/*-----------------------------------------------------------------------*/
|
||||||
|
static pEVControl InstallCommonControllers(SicsInterp *pSics,
|
||||||
|
SConnection *pCon,
|
||||||
|
int argc, char *argv[])
|
||||||
|
{
|
||||||
|
pEVControl pNew = NULL;
|
||||||
|
pEVDriver pDriv = NULL;
|
||||||
|
char pBueffel[512],pError[132];
|
||||||
|
int iRet;
|
||||||
|
int (*Wrapper)(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||||
|
int argc, char *argv[]) = EVControlWrapper;
|
||||||
|
|
||||||
|
if(strcmp(argv[3],"sim") == 0) /* SIM driver */
|
||||||
|
{
|
||||||
|
/* Create a Sim Driver */
|
||||||
|
pDriv = CreateSIMEVDriver(argc-4,&argv[4]);
|
||||||
|
if(!pDriv)
|
||||||
|
{
|
||||||
|
SCWrite(pCon,
|
||||||
|
"ERROR: failed to create Environment Device driver",
|
||||||
|
eError);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(strcmp(argv[3],"tcl") == 0) /* Tcl driver */
|
||||||
|
{
|
||||||
|
/* Create a Tcl driver */
|
||||||
|
pDriv = CreateTclDriver(argc-4,&argv[4],argv[2], pCon);
|
||||||
|
if(!pDriv)
|
||||||
|
{
|
||||||
|
SCWrite(pCon,"ERROR: failed to create TCL device driver",eError);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
/* got a driver, initialise everything */
|
||||||
|
pNew = CreateEVController(pDriv,argv[2],&iRet);
|
||||||
|
if(!pNew)
|
||||||
|
{
|
||||||
|
SCWrite(pCon,"ERROR creating Environment Controller",eError);
|
||||||
|
DeleteEVDriver(pDriv);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if(!iRet)
|
||||||
|
{
|
||||||
|
SCWrite(pCon,"ERROR: problem initialising Environment controller",
|
||||||
|
eError);
|
||||||
|
pDriv->GetError(pDriv,&iRet,pError,131);
|
||||||
|
sprintf(pBueffel,"HW reported: %s",pError);
|
||||||
|
SCWrite(pCon,pBueffel,eError);
|
||||||
|
}
|
||||||
|
Wrapper = TclEnvironmentWrapper;
|
||||||
|
pNew->iTcl = 1;
|
||||||
|
/* make ev parameters available to Tcl */
|
||||||
|
UpdateTclVariable(pNew->pDriv,"tolerance",
|
||||||
|
ObVal(pNew->pParam,TOLERANCE));
|
||||||
|
UpdateTclVariable(pNew->pDriv,"upperlimit",
|
||||||
|
ObVal(pNew->pParam,UPLIMIT));
|
||||||
|
UpdateTclVariable(pNew->pDriv,"lowerlimit",
|
||||||
|
ObVal(pNew->pParam,LOWLIMIT));
|
||||||
|
}
|
||||||
|
else if(strcmp(argv[3],"gencon") == 0) /* general controller */
|
||||||
|
{
|
||||||
|
/* Create a driver */
|
||||||
|
pDriv = MakeControllerEnvironmentDriver(argc-4,&argv[4]);
|
||||||
|
if(!pDriv)
|
||||||
|
{
|
||||||
|
SCWrite(pCon,
|
||||||
|
"ERROR: failed to create Controller Environment driver",
|
||||||
|
eError);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return NULL; /* not recognized */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(pNew == NULL) /* not yet initialized */
|
||||||
|
{
|
||||||
|
pNew = CreateEVController(pDriv,argv[2],&iRet);
|
||||||
|
if(!pNew)
|
||||||
|
{
|
||||||
|
SCWrite(pCon,"ERROR creating Environment Controller",eError);
|
||||||
|
DeleteEVDriver(pDriv);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if(!iRet)
|
||||||
|
{
|
||||||
|
SCWrite(pCon,"ERROR: problem initialising Environment controller",
|
||||||
|
eError);
|
||||||
|
pDriv->GetError(pDriv,&iRet,pError,131);
|
||||||
|
sprintf(pBueffel,"HW reported: %s",pError);
|
||||||
|
SCWrite(pCon,pBueffel,eError);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* install command */
|
||||||
|
iRet = AddCommand(pSics,argv[2],Wrapper,
|
||||||
|
DeleteEVController,
|
||||||
|
pNew);
|
||||||
|
if(!iRet)
|
||||||
|
{
|
||||||
|
sprintf(pBueffel,"ERROR: duplicate command %s not created",
|
||||||
|
argv[2]);
|
||||||
|
DeleteEVController((void *)pNew);
|
||||||
|
SCWrite(pCon,pBueffel,eError);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return pNew;
|
||||||
|
}
|
||||||
/*-------------------------------------------------------------------------
|
/*-------------------------------------------------------------------------
|
||||||
EVControlFactory implements a SICS command which creates and deletes
|
EVControlFactory implements a SICS command which creates and deletes
|
||||||
Controllers at run-time. Syntax:
|
Controllers at run-time. Syntax:
|
||||||
@ -1156,7 +1264,6 @@
|
|||||||
int argc, char *argv[])
|
int argc, char *argv[])
|
||||||
{
|
{
|
||||||
pEVControl pNew = NULL;
|
pEVControl pNew = NULL;
|
||||||
pEVDriver pDriv = NULL;
|
|
||||||
char pBueffel[512],pError[132];
|
char pBueffel[512],pError[132];
|
||||||
int iRet;
|
int iRet;
|
||||||
CommandList *pCom = NULL;
|
CommandList *pCom = NULL;
|
||||||
@ -1223,78 +1330,8 @@
|
|||||||
SCWrite(pCon,pBueffel,eError);
|
SCWrite(pCon,pBueffel,eError);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if(strcmp(argv[3],"sim") == 0) /* SIM driver */
|
pNew = InstallCommonControllers(pSics,pCon,argc,argv);
|
||||||
{
|
if(pNew == NULL)
|
||||||
/* Create a Sim Driver */
|
|
||||||
|
|
||||||
pDriv = CreateSIMEVDriver(argc-4,&argv[4]);
|
|
||||||
if(!pDriv)
|
|
||||||
{
|
|
||||||
SCWrite(pCon,
|
|
||||||
"ERROR: failed to create Environment Device driver",
|
|
||||||
eError);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(strcmp(argv[3],"tcl") == 0) /* Tcl driver */
|
|
||||||
{
|
|
||||||
/* Create a driver */
|
|
||||||
pDriv = CreateTclDriver(argc-4,&argv[4],argv[2], pCon);
|
|
||||||
if(!pDriv)
|
|
||||||
{
|
|
||||||
SCWrite(pCon,"ERROR: failed to create TCL device driver",eError);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/* got a driver, initialise everything */
|
|
||||||
pNew = CreateEVController(pDriv,argv[2],&iRet);
|
|
||||||
if(!pNew)
|
|
||||||
{
|
|
||||||
SCWrite(pCon,"ERROR creating Environment Controller",eError);
|
|
||||||
DeleteEVDriver(pDriv);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if(!iRet)
|
|
||||||
{
|
|
||||||
SCWrite(pCon,"ERROR: problem initialising Environment controller",
|
|
||||||
eError);
|
|
||||||
pDriv->GetError(pDriv,&iRet,pError,131);
|
|
||||||
sprintf(pBueffel,"HW reported: %s",pError);
|
|
||||||
SCWrite(pCon,pBueffel,eError);
|
|
||||||
}
|
|
||||||
/* install command */
|
|
||||||
iRet = AddCommand(pSics,argv[2],TclEnvironmentWrapper,
|
|
||||||
DeleteEVController,
|
|
||||||
pNew);
|
|
||||||
if(!iRet)
|
|
||||||
{
|
|
||||||
sprintf(pBueffel,"ERROR: duplicate command %s not created",
|
|
||||||
argv[2]);
|
|
||||||
DeleteEVController((void *)pNew);
|
|
||||||
SCWrite(pCon,pBueffel,eError);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
pNew->iTcl = 1;
|
|
||||||
/* make ev parameters available to Tcl */
|
|
||||||
UpdateTclVariable(pNew->pDriv,"tolerance",
|
|
||||||
ObVal(pNew->pParam,TOLERANCE));
|
|
||||||
UpdateTclVariable(pNew->pDriv,"upperlimit",
|
|
||||||
ObVal(pNew->pParam,UPLIMIT));
|
|
||||||
UpdateTclVariable(pNew->pDriv,"lowerlimit",
|
|
||||||
ObVal(pNew->pParam,LOWLIMIT));
|
|
||||||
}
|
|
||||||
else if(strcmp(argv[3],"gencon") == 0) /* general controller */
|
|
||||||
{
|
|
||||||
/* Create a driver */
|
|
||||||
pDriv = MakeControllerEnvironmentDriver(argc-4,&argv[4]);
|
|
||||||
if(!pDriv)
|
|
||||||
{
|
|
||||||
SCWrite(pCon,
|
|
||||||
"ERROR: failed to create Controller Environment driver",
|
|
||||||
eError);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
site = getSite();
|
site = getSite();
|
||||||
if(site != NULL){
|
if(site != NULL){
|
||||||
|
535
sicsstatus.tcl
535
sicsstatus.tcl
@ -1,536 +1,3 @@
|
|||||||
a5l.length 80.000000
|
|
||||||
flightpathlength 0.000000
|
|
||||||
flightpathlength setAccess 1
|
|
||||||
flightpath 0.000000
|
|
||||||
flightpath setAccess 1
|
|
||||||
delay 2500.000000
|
|
||||||
delay setAccess 1
|
|
||||||
hm CountMode timer
|
|
||||||
hm preset 100.000000
|
|
||||||
hm genbin 120.000000 35.000000 512
|
|
||||||
hm init
|
|
||||||
datafile focus-1001848.hdf
|
|
||||||
datafile setAccess 3
|
|
||||||
hm2 CountMode timer
|
|
||||||
hm2 preset 10.000000
|
|
||||||
hm1 CountMode timer
|
|
||||||
hm1 preset 100.000000
|
|
||||||
dbfile UNKNOWN
|
|
||||||
dbfile setAccess 2
|
|
||||||
# Motor th
|
|
||||||
th sign 1.000000
|
|
||||||
th SoftZero 0.000000
|
|
||||||
th SoftLowerLim -120.000000
|
|
||||||
th SoftUpperLim 120.000000
|
|
||||||
th Fixed -1.000000
|
|
||||||
th InterruptMode 0.000000
|
|
||||||
th precision 0.010000
|
|
||||||
th AccessCode 2.000000
|
|
||||||
th poscount 20.000000
|
|
||||||
#Crystallographic Settings
|
|
||||||
hkl lambda 0.703790
|
|
||||||
hkl setub -0.124702 0.001618 -0.041357 -0.104448 -0.001326 0.049388 0.000751 0.084094 0.001574
|
|
||||||
hkl hm 0
|
|
||||||
det3dist 300.000000
|
|
||||||
det3dist setAccess 1
|
|
||||||
det3zeroy 128.000000
|
|
||||||
det3zeroy setAccess 1
|
|
||||||
det3zerox 128.000000
|
|
||||||
det3zerox setAccess 1
|
|
||||||
det2dist 300.000000
|
|
||||||
det2dist setAccess 1
|
|
||||||
det2zeroy 128.000000
|
|
||||||
det2zeroy setAccess 1
|
|
||||||
det2zerox 128.000000
|
|
||||||
det2zerox setAccess 1
|
|
||||||
det1dist 300.000000
|
|
||||||
det1dist setAccess 1
|
|
||||||
det1zeroy 128.000000
|
|
||||||
det1zeroy setAccess 1
|
|
||||||
det1zerox 128.000000
|
|
||||||
det1zerox setAccess 1
|
|
||||||
mono2theta 36.77
|
|
||||||
mono2theta setAccess 1
|
|
||||||
monodescription unknownit crystal
|
|
||||||
monodescription setAccess 1
|
|
||||||
# Motor om
|
|
||||||
om sign 1.000000
|
|
||||||
om SoftZero 0.000000
|
|
||||||
om SoftLowerLim -73.000000
|
|
||||||
om SoftUpperLim 134.000000
|
|
||||||
om Fixed -1.000000
|
|
||||||
om InterruptMode 0.000000
|
|
||||||
om precision 0.010000
|
|
||||||
om AccessCode 2.000000
|
|
||||||
om poscount 20.000000
|
|
||||||
# Motor stt
|
|
||||||
stt sign 1.000000
|
|
||||||
stt SoftZero 0.000000
|
|
||||||
stt SoftLowerLim -120.000000
|
|
||||||
stt SoftUpperLim 120.000000
|
|
||||||
stt Fixed -1.000000
|
|
||||||
stt InterruptMode 0.000000
|
|
||||||
stt precision 0.010000
|
|
||||||
stt AccessCode 2.000000
|
|
||||||
stt poscount 20.000000
|
|
||||||
# Motor ch
|
|
||||||
ch sign 1.000000
|
|
||||||
ch SoftZero 0.000000
|
|
||||||
ch SoftLowerLim 0.000000
|
|
||||||
ch SoftUpperLim 360.000000
|
|
||||||
ch Fixed -1.000000
|
|
||||||
ch InterruptMode 0.000000
|
|
||||||
ch precision 0.010000
|
|
||||||
ch AccessCode 2.000000
|
|
||||||
ch poscount 20.000000
|
|
||||||
# Motor ph
|
|
||||||
ph sign 1.000000
|
|
||||||
ph SoftZero 0.000000
|
|
||||||
ph SoftLowerLim -360.000000
|
|
||||||
ph SoftUpperLim 360.000000
|
|
||||||
ph Fixed -1.000000
|
|
||||||
ph InterruptMode 0.000000
|
|
||||||
ph precision 0.010000
|
|
||||||
ph AccessCode 2.000000
|
|
||||||
ph poscount 20.000000
|
|
||||||
# Motor dg3
|
|
||||||
dg3 sign 1.000000
|
|
||||||
dg3 SoftZero 0.000000
|
|
||||||
dg3 SoftLowerLim -10.000000
|
|
||||||
dg3 SoftUpperLim 40.000000
|
|
||||||
dg3 Fixed -1.000000
|
|
||||||
dg3 InterruptMode 0.000000
|
|
||||||
dg3 precision 0.010000
|
|
||||||
dg3 AccessCode 2.000000
|
|
||||||
dg3 poscount 20.000000
|
|
||||||
# Motor dg2
|
|
||||||
dg2 sign 1.000000
|
|
||||||
dg2 SoftZero 0.000000
|
|
||||||
dg2 SoftLowerLim -10.000000
|
|
||||||
dg2 SoftUpperLim 40.000000
|
|
||||||
dg2 Fixed -1.000000
|
|
||||||
dg2 InterruptMode 0.000000
|
|
||||||
dg2 precision 0.010000
|
|
||||||
dg2 AccessCode 2.000000
|
|
||||||
dg2 poscount 20.000000
|
|
||||||
# Motor dg1
|
|
||||||
dg1 sign 1.000000
|
|
||||||
dg1 SoftZero 0.000000
|
|
||||||
dg1 SoftLowerLim -10.000000
|
|
||||||
dg1 SoftUpperLim 40.000000
|
|
||||||
dg1 Fixed -1.000000
|
|
||||||
dg1 InterruptMode 0.000000
|
|
||||||
dg1 precision 0.010000
|
|
||||||
dg1 AccessCode 2.000000
|
|
||||||
dg1 poscount 20.000000
|
|
||||||
# Motor muca
|
|
||||||
muca sign 1.000000
|
|
||||||
muca SoftZero 0.000000
|
|
||||||
muca SoftLowerLim 30.000000
|
|
||||||
muca SoftUpperLim 36.000000
|
|
||||||
muca Fixed -1.000000
|
|
||||||
muca InterruptMode 0.000000
|
|
||||||
muca precision 0.010000
|
|
||||||
muca AccessCode 2.000000
|
|
||||||
muca poscount 20.000000
|
|
||||||
# Motor phi
|
|
||||||
phi sign 1.000000
|
|
||||||
phi SoftZero 0.000000
|
|
||||||
phi SoftLowerLim -360.000000
|
|
||||||
phi SoftUpperLim 360.000000
|
|
||||||
phi Fixed -1.000000
|
|
||||||
phi InterruptMode 0.000000
|
|
||||||
phi precision 0.010000
|
|
||||||
phi AccessCode 2.000000
|
|
||||||
phi poscount 20.000000
|
|
||||||
# Motor chi
|
|
||||||
chi sign 1.000000
|
|
||||||
chi SoftZero 0.000000
|
|
||||||
chi SoftLowerLim 0.000000
|
|
||||||
chi SoftUpperLim 360.000000
|
|
||||||
chi Fixed -1.000000
|
|
||||||
chi InterruptMode 0.000000
|
|
||||||
chi precision 0.010000
|
|
||||||
chi AccessCode 2.000000
|
|
||||||
chi poscount 20.000000
|
|
||||||
# Motor omega
|
|
||||||
omega sign 1.000000
|
|
||||||
omega SoftZero 0.000000
|
|
||||||
omega SoftLowerLim -73.000000
|
|
||||||
omega SoftUpperLim 134.000000
|
|
||||||
omega Fixed -1.000000
|
|
||||||
omega InterruptMode 0.000000
|
|
||||||
omega precision 0.010000
|
|
||||||
omega AccessCode 2.000000
|
|
||||||
omega poscount 20.000000
|
|
||||||
# Motor twotheta
|
|
||||||
twotheta sign 1.000000
|
|
||||||
twotheta SoftZero 0.000000
|
|
||||||
twotheta SoftLowerLim -120.000000
|
|
||||||
twotheta SoftUpperLim 120.000000
|
|
||||||
twotheta Fixed -1.000000
|
|
||||||
twotheta InterruptMode 0.000000
|
|
||||||
twotheta precision 0.010000
|
|
||||||
twotheta AccessCode 2.000000
|
|
||||||
twotheta poscount 20.000000
|
|
||||||
lastscancommand cscan a4 0. .2 10 2
|
|
||||||
lastscancommand setAccess 2
|
|
||||||
banana CountMode timer
|
|
||||||
banana preset 100.000000
|
|
||||||
sample_mur 0.000000
|
|
||||||
sample_mur setAccess 2
|
|
||||||
email UNKNOWN
|
|
||||||
email setAccess 2
|
|
||||||
fax UNKNOWN
|
|
||||||
fax setAccess 2
|
|
||||||
phone UNKNOWN
|
|
||||||
phone setAccess 2
|
|
||||||
adress UNKNOWN
|
|
||||||
adress setAccess 2
|
|
||||||
# Counter counter
|
# Counter counter
|
||||||
counter SetPreset 2.000000
|
counter SetPreset 100.000000
|
||||||
counter SetMode Monitor
|
counter SetMode Monitor
|
||||||
# Motor som
|
|
||||||
som sign 1.000000
|
|
||||||
som SoftZero 0.000000
|
|
||||||
som SoftLowerLim -360.000000
|
|
||||||
som SoftUpperLim 360.000000
|
|
||||||
som Fixed -1.000000
|
|
||||||
som InterruptMode 0.000000
|
|
||||||
som precision 0.010000
|
|
||||||
som AccessCode 2.000000
|
|
||||||
som poscount 20.000000
|
|
||||||
# Motor sax
|
|
||||||
sax sign 1.000000
|
|
||||||
sax SoftZero 0.000000
|
|
||||||
sax SoftLowerLim -30.000000
|
|
||||||
sax SoftUpperLim 30.000000
|
|
||||||
sax Fixed -1.000000
|
|
||||||
sax InterruptMode 0.000000
|
|
||||||
sax precision 0.010000
|
|
||||||
sax AccessCode 2.000000
|
|
||||||
sax poscount 20.000000
|
|
||||||
# Motor tilt
|
|
||||||
tilt sign 1.000000
|
|
||||||
tilt SoftZero 0.000000
|
|
||||||
tilt SoftLowerLim -15.000000
|
|
||||||
tilt SoftUpperLim 15.000000
|
|
||||||
tilt Fixed -1.000000
|
|
||||||
tilt InterruptMode 0.000000
|
|
||||||
tilt precision 0.010000
|
|
||||||
tilt AccessCode 0.000000
|
|
||||||
tilt poscount 20.000000
|
|
||||||
#----- MultiMotor st
|
|
||||||
st recovernampos henry d1r 5. d1l -5. d1t 0.
|
|
||||||
#----- MultiMotor sampletable
|
|
||||||
sampletable recovernampos henry d1r 5. d1l -5. d1t 0.
|
|
||||||
# Motor detectorrotation
|
|
||||||
detectorrotation sign 1.000000
|
|
||||||
detectorrotation SoftZero 0.000000
|
|
||||||
detectorrotation SoftLowerLim -20.000000
|
|
||||||
detectorrotation SoftUpperLim 20.000000
|
|
||||||
detectorrotation Fixed -1.000000
|
|
||||||
detectorrotation InterruptMode 0.000000
|
|
||||||
detectorrotation precision 0.010000
|
|
||||||
detectorrotation AccessCode 2.000000
|
|
||||||
detectorrotation poscount 20.000000
|
|
||||||
# Motor detectory
|
|
||||||
detectory sign 1.000000
|
|
||||||
detectory SoftZero 0.000000
|
|
||||||
detectory SoftLowerLim -20.000000
|
|
||||||
detectory SoftUpperLim 20.000000
|
|
||||||
detectory Fixed -1.000000
|
|
||||||
detectory InterruptMode 0.000000
|
|
||||||
detectory precision 0.010000
|
|
||||||
detectory AccessCode 2.000000
|
|
||||||
detectory poscount 20.000000
|
|
||||||
# Motor detectorx
|
|
||||||
detectorx sign 1.000000
|
|
||||||
detectorx SoftZero 0.000000
|
|
||||||
detectorx SoftLowerLim -20.000000
|
|
||||||
detectorx SoftUpperLim 20.000000
|
|
||||||
detectorx Fixed -1.000000
|
|
||||||
detectorx InterruptMode 0.000000
|
|
||||||
detectorx precision 0.010000
|
|
||||||
detectorx AccessCode 2.000000
|
|
||||||
detectorx poscount 20.000000
|
|
||||||
# Motor beamstopy
|
|
||||||
beamstopy sign 1.000000
|
|
||||||
beamstopy SoftZero 0.000000
|
|
||||||
beamstopy SoftLowerLim -20.000000
|
|
||||||
beamstopy SoftUpperLim 20.000000
|
|
||||||
beamstopy Fixed -1.000000
|
|
||||||
beamstopy InterruptMode 0.000000
|
|
||||||
beamstopy precision 0.010000
|
|
||||||
beamstopy AccessCode 2.000000
|
|
||||||
beamstopy poscount 20.000000
|
|
||||||
# Motor beamstopx
|
|
||||||
beamstopx sign 1.000000
|
|
||||||
beamstopx SoftZero 0.000000
|
|
||||||
beamstopx SoftLowerLim -20.000000
|
|
||||||
beamstopx SoftUpperLim 20.000000
|
|
||||||
beamstopx Fixed -1.000000
|
|
||||||
beamstopx InterruptMode 0.000000
|
|
||||||
beamstopx precision 0.010000
|
|
||||||
beamstopx AccessCode 2.000000
|
|
||||||
beamstopx poscount 20.000000
|
|
||||||
# Motor d2t
|
|
||||||
d2t sign 1.000000
|
|
||||||
d2t SoftZero 0.000000
|
|
||||||
d2t SoftLowerLim -20.000000
|
|
||||||
d2t SoftUpperLim 20.000000
|
|
||||||
d2t Fixed -1.000000
|
|
||||||
d2t InterruptMode 0.000000
|
|
||||||
d2t precision 0.010000
|
|
||||||
d2t AccessCode 2.000000
|
|
||||||
d2t poscount 20.000000
|
|
||||||
# Motor d2l
|
|
||||||
d2l sign 1.000000
|
|
||||||
d2l SoftZero 0.000000
|
|
||||||
d2l SoftLowerLim -20.000000
|
|
||||||
d2l SoftUpperLim 20.000000
|
|
||||||
d2l Fixed -1.000000
|
|
||||||
d2l InterruptMode 0.000000
|
|
||||||
d2l precision 0.010000
|
|
||||||
d2l AccessCode 2.000000
|
|
||||||
d2l poscount 20.000000
|
|
||||||
# Motor d2r
|
|
||||||
d2r sign 1.000000
|
|
||||||
d2r SoftZero 0.000000
|
|
||||||
d2r SoftLowerLim -20.000000
|
|
||||||
d2r SoftUpperLim 20.000000
|
|
||||||
d2r Fixed -1.000000
|
|
||||||
d2r InterruptMode 0.000000
|
|
||||||
d2r precision 0.010000
|
|
||||||
d2r AccessCode 2.000000
|
|
||||||
d2r poscount 20.000000
|
|
||||||
# Motor d1t
|
|
||||||
d1t sign 1.000000
|
|
||||||
d1t SoftZero 0.000000
|
|
||||||
d1t SoftLowerLim -20.000000
|
|
||||||
d1t SoftUpperLim 20.000000
|
|
||||||
d1t Fixed -1.000000
|
|
||||||
d1t InterruptMode 0.000000
|
|
||||||
d1t precision 0.010000
|
|
||||||
d1t AccessCode 2.000000
|
|
||||||
d1t poscount 20.000000
|
|
||||||
# Motor d1l
|
|
||||||
d1l sign 1.000000
|
|
||||||
d1l SoftZero 0.000000
|
|
||||||
d1l SoftLowerLim -20.000000
|
|
||||||
d1l SoftUpperLim 20.000000
|
|
||||||
d1l Fixed -1.000000
|
|
||||||
d1l InterruptMode 0.000000
|
|
||||||
d1l precision 0.010000
|
|
||||||
d1l AccessCode 2.000000
|
|
||||||
d1l poscount 20.000000
|
|
||||||
# Motor d1r
|
|
||||||
d1r sign 1.000000
|
|
||||||
d1r SoftZero 0.000000
|
|
||||||
d1r SoftLowerLim -20.000000
|
|
||||||
d1r SoftUpperLim 20.000000
|
|
||||||
d1r Fixed -1.000000
|
|
||||||
d1r InterruptMode 0.000000
|
|
||||||
d1r precision 0.010000
|
|
||||||
d1r AccessCode 2.000000
|
|
||||||
d1r poscount 20.000000
|
|
||||||
# Motor monochi
|
|
||||||
monochi sign 1.000000
|
|
||||||
monochi SoftZero 0.000000
|
|
||||||
monochi SoftLowerLim -30.000000
|
|
||||||
monochi SoftUpperLim 30.000000
|
|
||||||
monochi Fixed -1.000000
|
|
||||||
monochi InterruptMode 0.000000
|
|
||||||
monochi precision 0.010000
|
|
||||||
monochi AccessCode 2.000000
|
|
||||||
monochi poscount 20.000000
|
|
||||||
# Motor monophi
|
|
||||||
monophi sign 1.000000
|
|
||||||
monophi SoftZero 0.000000
|
|
||||||
monophi SoftLowerLim -30.000000
|
|
||||||
monophi SoftUpperLim 30.000000
|
|
||||||
monophi Fixed -1.000000
|
|
||||||
monophi InterruptMode 0.000000
|
|
||||||
monophi precision 0.010000
|
|
||||||
monophi AccessCode 2.000000
|
|
||||||
monophi poscount 20.000000
|
|
||||||
# Motor monoy
|
|
||||||
monoy sign 1.000000
|
|
||||||
monoy SoftZero 0.000000
|
|
||||||
monoy SoftLowerLim -30.000000
|
|
||||||
monoy SoftUpperLim 30.000000
|
|
||||||
monoy Fixed -1.000000
|
|
||||||
monoy InterruptMode 0.000000
|
|
||||||
monoy precision 0.010000
|
|
||||||
monoy AccessCode 2.000000
|
|
||||||
monoy poscount 20.000000
|
|
||||||
# Motor monox
|
|
||||||
monox sign 1.000000
|
|
||||||
monox SoftZero 0.000000
|
|
||||||
monox SoftLowerLim -30.000000
|
|
||||||
monox SoftUpperLim 30.000000
|
|
||||||
monox Fixed -1.000000
|
|
||||||
monox InterruptMode 0.000000
|
|
||||||
monox precision 0.010000
|
|
||||||
monox AccessCode 2.000000
|
|
||||||
monox poscount 20.000000
|
|
||||||
# Motor tasse
|
|
||||||
tasse sign 1.000000
|
|
||||||
tasse SoftZero 0.000000
|
|
||||||
tasse SoftLowerLim -130.000000
|
|
||||||
tasse SoftUpperLim 130.000000
|
|
||||||
tasse Fixed -1.000000
|
|
||||||
tasse InterruptMode 0.000000
|
|
||||||
tasse precision 0.010000
|
|
||||||
tasse AccessCode 2.000000
|
|
||||||
tasse poscount 20.000000
|
|
||||||
# Motor sdm
|
|
||||||
sdm sign 1.000000
|
|
||||||
sdm SoftZero 0.000000
|
|
||||||
sdm SoftLowerLim -5.000000
|
|
||||||
sdm SoftUpperLim 50.000000
|
|
||||||
sdm Fixed -1.000000
|
|
||||||
sdm InterruptMode 0.000000
|
|
||||||
sdm precision 0.010000
|
|
||||||
sdm AccessCode 2.000000
|
|
||||||
sdm poscount 20.000000
|
|
||||||
# Motor sgu
|
|
||||||
sgu sign 1.000000
|
|
||||||
sgu SoftZero 0.000000
|
|
||||||
sgu SoftLowerLim -20.000000
|
|
||||||
sgu SoftUpperLim 20.000000
|
|
||||||
sgu Fixed -1.000000
|
|
||||||
sgu InterruptMode 0.000000
|
|
||||||
sgu precision 0.010000
|
|
||||||
sgu AccessCode 2.000000
|
|
||||||
sgu poscount 20.000000
|
|
||||||
# Motor sgl
|
|
||||||
sgl sign 1.000000
|
|
||||||
sgl SoftZero 0.000000
|
|
||||||
sgl SoftLowerLim -20.000000
|
|
||||||
sgl SoftUpperLim 20.000000
|
|
||||||
sgl Fixed -1.000000
|
|
||||||
sgl InterruptMode 0.000000
|
|
||||||
sgl precision 0.010000
|
|
||||||
sgl AccessCode 2.000000
|
|
||||||
sgl poscount 20.000000
|
|
||||||
# Motor mgu
|
|
||||||
mgu sign 1.000000
|
|
||||||
mgu SoftZero 0.000000
|
|
||||||
mgu SoftLowerLim -50.000000
|
|
||||||
mgu SoftUpperLim 50.000000
|
|
||||||
mgu Fixed -1.000000
|
|
||||||
mgu InterruptMode 0.000000
|
|
||||||
mgu precision 0.010000
|
|
||||||
mgu AccessCode 2.000000
|
|
||||||
mgu poscount 20.000000
|
|
||||||
# Motor stu
|
|
||||||
stu sign 1.000000
|
|
||||||
stu SoftZero 0.000000
|
|
||||||
stu SoftLowerLim -30.000000
|
|
||||||
stu SoftUpperLim 30.000000
|
|
||||||
stu Fixed -1.000000
|
|
||||||
stu InterruptMode 0.000000
|
|
||||||
stu precision 0.010000
|
|
||||||
stu AccessCode 2.000000
|
|
||||||
stu poscount 20.000000
|
|
||||||
# Motor stl
|
|
||||||
stl sign 1.000000
|
|
||||||
stl SoftZero 0.000000
|
|
||||||
stl SoftLowerLim -30.000000
|
|
||||||
stl SoftUpperLim 30.000000
|
|
||||||
stl Fixed -1.000000
|
|
||||||
stl InterruptMode 0.000000
|
|
||||||
stl precision 0.010000
|
|
||||||
stl AccessCode 2.000000
|
|
||||||
stl poscount 20.000000
|
|
||||||
# Motor mtu
|
|
||||||
mtu sign 1.000000
|
|
||||||
mtu SoftZero 0.000000
|
|
||||||
mtu SoftLowerLim -30.000000
|
|
||||||
mtu SoftUpperLim 30.000000
|
|
||||||
mtu Fixed -1.000000
|
|
||||||
mtu InterruptMode 0.000000
|
|
||||||
mtu precision 0.010000
|
|
||||||
mtu AccessCode 2.000000
|
|
||||||
mtu poscount 20.000000
|
|
||||||
# Motor mtl
|
|
||||||
mtl sign 1.000000
|
|
||||||
mtl SoftZero 0.000000
|
|
||||||
mtl SoftLowerLim -30.000000
|
|
||||||
mtl SoftUpperLim 30.000000
|
|
||||||
mtl Fixed -1.000000
|
|
||||||
mtl InterruptMode 0.000000
|
|
||||||
mtl precision 0.010000
|
|
||||||
mtl AccessCode 2.000000
|
|
||||||
mtl poscount 20.000000
|
|
||||||
# Motor a6
|
|
||||||
a6 sign 1.000000
|
|
||||||
a6 SoftZero 0.000000
|
|
||||||
a6 SoftLowerLim -30.000000
|
|
||||||
a6 SoftUpperLim 30.000000
|
|
||||||
a6 Fixed -1.000000
|
|
||||||
a6 InterruptMode 0.000000
|
|
||||||
a6 precision 0.010000
|
|
||||||
a6 AccessCode 2.000000
|
|
||||||
a6 poscount 20.000000
|
|
||||||
# Motor a5
|
|
||||||
a5 sign 1.000000
|
|
||||||
a5 SoftZero 0.000000
|
|
||||||
a5 SoftLowerLim -30.000000
|
|
||||||
a5 SoftUpperLim 30.000000
|
|
||||||
a5 Fixed -1.000000
|
|
||||||
a5 InterruptMode 0.000000
|
|
||||||
a5 precision 0.010000
|
|
||||||
a5 AccessCode 2.000000
|
|
||||||
a5 poscount 20.000000
|
|
||||||
# Motor a4
|
|
||||||
a4 sign 1.000000
|
|
||||||
a4 SoftZero 0.000000
|
|
||||||
a4 SoftLowerLim -130.000000
|
|
||||||
a4 SoftUpperLim 130.000000
|
|
||||||
a4 Fixed -1.000000
|
|
||||||
a4 InterruptMode 0.000000
|
|
||||||
a4 precision 0.010000
|
|
||||||
a4 AccessCode 2.000000
|
|
||||||
a4 poscount 20.000000
|
|
||||||
# Motor a3
|
|
||||||
a3 sign 1.000000
|
|
||||||
a3 SoftZero 0.000000
|
|
||||||
a3 SoftLowerLim -360.000000
|
|
||||||
a3 SoftUpperLim 360.000000
|
|
||||||
a3 Fixed -1.000000
|
|
||||||
a3 InterruptMode 0.000000
|
|
||||||
a3 precision 0.010000
|
|
||||||
a3 AccessCode 2.000000
|
|
||||||
a3 poscount 20.000000
|
|
||||||
# Motor a2
|
|
||||||
a2 sign 1.000000
|
|
||||||
a2 SoftZero 0.000000
|
|
||||||
a2 SoftLowerLim -73.000000
|
|
||||||
a2 SoftUpperLim 137.000000
|
|
||||||
a2 Fixed -1.000000
|
|
||||||
a2 InterruptMode 0.000000
|
|
||||||
a2 precision 0.010000
|
|
||||||
a2 AccessCode 2.000000
|
|
||||||
a2 poscount 20.000000
|
|
||||||
# Motor a1
|
|
||||||
a1 sign 1.000000
|
|
||||||
a1 SoftZero 0.000000
|
|
||||||
a1 SoftLowerLim 15.000000
|
|
||||||
a1 SoftUpperLim 120.000000
|
|
||||||
a1 Fixed -1.000000
|
|
||||||
a1 InterruptMode 0.000000
|
|
||||||
a1 precision 0.010000
|
|
||||||
a1 AccessCode 2.000000
|
|
||||||
a1 poscount 20.000000
|
|
||||||
batchroot /data/koenneck/src/sics
|
|
||||||
batchroot setAccess 2
|
|
||||||
user Daniel_the_Clementine
|
|
||||||
user setAccess 2
|
|
||||||
sample DanielOxid
|
|
||||||
sample setAccess 2
|
|
||||||
title TopsiTupsiTapsi
|
|
||||||
title setAccess 2
|
|
||||||
starttime UNKNOWN
|
|
||||||
starttime setAccess 2
|
|
||||||
|
Reference in New Issue
Block a user