Merge remote-tracking branch 'origin' into PSI-7.0

Conflicts:
	configure/os/CONFIG_SITE.Common.linuxCommon
	modules/libcom/src/log/iocLog.c
	modules/libcom/src/log/logClient.c
	modules/pvAccess
	modules/pvData
	modules/pvDatabase
This commit is contained in:
2020-02-06 17:28:40 +01:00
374 changed files with 16167 additions and 9000 deletions
+5 -2
View File
@@ -6,11 +6,14 @@
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
STDDIR := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))
TOP = ../../../..
TOP = ../..
include $(TOP)/configure/CONFIG
STDDIR=$(TOP)/src/std
USR_CPPFLAGS += -DUSE_TYPED_RSET
SHRLIB_VERSION = 3.17.0
LIBRARY_IOC += dbRecStd
dbRecStd_LIBS = dbCore ca Com
@@ -34,7 +34,7 @@
/* The following is provided for access security*/
/*It allows a CA client to force access security initialization*/
static void myCallback(CALLBACK *pcallback)
static void myCallback(epicsCallback *pcallback)
{
ASDBCALLBACK *pasdbcallback = (ASDBCALLBACK *)pcallback;
subRecord *precord;
@@ -36,7 +36,7 @@
typedef struct devPvt {
processNotify pn;
CALLBACK callback;
epicsCallback callback;
long options;
int status;
int smooth;
@@ -35,7 +35,7 @@
typedef struct devPvt {
processNotify pn;
CALLBACK callback;
epicsCallback callback;
long options;
int status;
struct {
@@ -35,7 +35,7 @@
typedef struct devPvt {
processNotify pn;
CALLBACK callback;
epicsCallback callback;
long options;
int status;
struct {
@@ -35,7 +35,7 @@
typedef struct devPvt {
processNotify pn;
CALLBACK callback;
epicsCallback callback;
long options;
int status;
struct {
@@ -35,7 +35,7 @@
typedef struct devPvt {
processNotify pn;
CALLBACK callback;
epicsCallback callback;
long options;
int status;
struct {
@@ -37,7 +37,7 @@
typedef struct devPvt {
DBADDR dbaddr;
processNotify pn;
CALLBACK callback;
epicsCallback callback;
long options;
int status;
struct {
@@ -15,6 +15,7 @@ dbRecStd_SRCS += ts.c
dbRecStd_SRCS += dbnd.c
dbRecStd_SRCS += arr.c
dbRecStd_SRCS += sync.c
dbRecStd_SRCS += decimate.c
HTMLS += filters.html
+117
View File
@@ -0,0 +1,117 @@
/*************************************************************************\
* Copyright (c) 2019 UChicago Argonne LLC, as Operator of Argonne
* National Laboratory.
* Copyright (c) 2010 Brookhaven National Laboratory.
* Copyright (c) 2010 Helmholtz-Zentrum Berlin
* fuer Materialien und Energie GmbH.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
* Authors: Ralph Lange <Ralph.Lange@bessy.de>,
* Andrew Johnson <anj@anl.gov>
*/
#include <stdio.h>
#include "freeList.h"
#include "db_field_log.h"
#include "chfPlugin.h"
#include "epicsExport.h"
typedef struct myStruct {
epicsInt32 n, i;
} myStruct;
static void *myStructFreeList;
static const
chfPluginArgDef opts[] = {
chfInt32(myStruct, n, "n", 1, 0),
chfPluginArgEnd
};
static void * allocPvt(void)
{
myStruct *my = (myStruct*) freeListCalloc(myStructFreeList);
return (void *) my;
}
static void freePvt(void *pvt)
{
freeListFree(myStructFreeList, pvt);
}
static int parse_ok(void *pvt)
{
myStruct *my = (myStruct*) pvt;
if (my->n < 1)
return -1;
return 0;
}
static db_field_log* filter(void* pvt, dbChannel *chan, db_field_log *pfl) {
db_field_log *passfl = NULL;
myStruct *my = (myStruct*) pvt;
epicsInt32 i = my->i;
if (pfl->ctx == dbfl_context_read)
return pfl;
if (i++ == 0)
passfl = pfl;
else
db_delete_field_log(pfl);
if (i >= my->n)
i = 0;
my->i = i;
return passfl;
}
static void channelRegisterPre(dbChannel *chan, void *pvt,
chPostEventFunc **cb_out, void **arg_out, db_field_log *probe)
{
*cb_out = filter;
*arg_out = pvt;
}
static void channel_report(dbChannel *chan, void *pvt, int level, const unsigned short indent)
{
myStruct *my = (myStruct*) pvt;
printf("%*sDecimate (dec): n=%d, i=%d\n", indent, "",
my->n, my->i);
}
static chfPluginIf pif = {
allocPvt,
freePvt,
NULL, /* parse_error, */
parse_ok,
NULL, /* channel_open, */
channelRegisterPre,
NULL, /* channelRegisterPost, */
channel_report,
NULL /* channel_close */
};
static void decInitialize(void)
{
static int firstTime = 1;
if (!firstTime) return;
firstTime = 0;
if (!myStructFreeList)
freeListInitPvt(&myStructFreeList, sizeof(myStruct), 64);
chfPluginRegister("dec", &pif, opts);
}
epicsExportRegistrar(decInitialize);
@@ -14,6 +14,8 @@ The following filters are available in this release:
=item * L<Synchronize|/"Synchronize Filter sync">
=item * L<Decimation|/"Decimation Filter dec">
=back
=head2 Using Filters
@@ -245,3 +247,41 @@ periods only when "blue" is true by using
...
=cut
registrar(decInitialize)
=head3 Decimation Filter C<"dec">
This filter is used to reduce the number or rate of monitor updates from a
channel by an integer factor C<n> that is provided as a filter argument,
discarding the other updates. A true decimation following the original meaning
of the word would be achieved by giving C<n> as 10, to only allow every tenth
update through.
=head4 Parameters
=over
=item Number C<"n">
The decimation factor, a positive integer. Giving n=1 is equivalent to a no-op
that allows all updates to be passed to the client.
=back
This filter is intentionally very simplistic. It passes on the first monitor
event that it sees after the channel connects, then discards the next N-1 events
before sending the next event. If several clients connect to a channel using the
same filter settings they may see completely different data streams since each
client gets its own instance of the filter whose event counter starts when that
client connects.
=head4 Example
To sample a 60Hz channel at 1Hz, a 10Hz channel every 6 seconds or a 1Hz channel
once every minute:
Hal$ camonitor 'test:channel' 'test:channel.{"dec":{"n":60}}'
...
=cut
+16 -8
View File
@@ -110,7 +110,9 @@ static db_field_log* filter(void* pvt, dbChannel *chan, db_field_log *pfl) {
passfl = pfl;
pfl = NULL;
}
break;
else
db_delete_field_log(pfl);
goto save_state;
case syncModeLast:
if (!actstate && my->laststate) {
passfl = my->lastfl;
@@ -122,28 +124,34 @@ static db_field_log* filter(void* pvt, dbChannel *chan, db_field_log *pfl) {
passfl = pfl;
pfl = NULL;
}
break;
else
db_delete_field_log(pfl);
goto save_state;
case syncModeWhile:
if (actstate) {
if (actstate)
passfl = pfl;
}
else
db_delete_field_log(pfl);
goto no_shift;
case syncModeUnless:
if (!actstate) {
if (!actstate)
passfl = pfl;
}
else
db_delete_field_log(pfl);
goto no_shift;
}
if (my->lastfl)
db_delete_field_log(my->lastfl);
my->lastfl = pfl;
my->laststate = actstate;
/* since no copy is made we can't keep a reference to the returned fl */
assert(my->lastfl != passfl);
no_shift:
save_state:
my->laststate = actstate;
no_shift:
return passfl;
}
+4
View File
@@ -55,3 +55,7 @@ stdRecords_DBD = $(patsubst %,%.dbd,$(stdRecords))
dbRecStd_SRCS += $(patsubst %,%.c,$(stdRecords))
HTMLS += $(patsubst %.dbd.pod,%.html,$(notdir $(wildcard ../rec/*Record.dbd.pod)))
vpath %.png $(SRC_DIRS)
HTMLS += image/compress-1.png
HTMLS += image/compress-2.png
+2 -2
View File
@@ -356,10 +356,10 @@ static long readValue(aaiRecord *prec)
recGblSetSevr(prec, SIMM_ALARM, prec->sims);
if (prec->sdly >= 0) {
CALLBACK *pvt = prec->simpvt;
epicsCallback *pvt = prec->simpvt;
if (!pvt) { /* very lazy allocation of callback structure */
pvt = calloc(1, sizeof(CALLBACK));
pvt = calloc(1, sizeof(epicsCallback));
prec->simpvt = pvt;
}
if (pvt)
+1 -1
View File
@@ -122,7 +122,7 @@ recordtype(aai) {
prompt("Sim. Mode Private")
special(SPC_NOMOD)
interest(4)
extra("CALLBACK *simpvt")
extra("epicsCallback *simpvt")
}
field(MPST,DBF_MENU) {
prompt("Post Value Monitors")
+2 -2
View File
@@ -367,9 +367,9 @@ static long writeValue(aaoRecord *prec)
status = pdset->write_aao(prec);
prec->pact = FALSE;
} else { /* !prec->pact && delay >= 0. */
CALLBACK *pvt = prec->simpvt;
epicsCallback *pvt = prec->simpvt;
if (!pvt) {
pvt = calloc(1, sizeof(CALLBACK)); /* very lazy allocation of callback structure */
pvt = calloc(1, sizeof(epicsCallback)); /* very lazy allocation of callback structure */
prec->simpvt = pvt;
}
if (pvt) callbackRequestProcessCallbackDelayed(pvt, prec->prio, prec, prec->sdly);
+1 -1
View File
@@ -122,7 +122,7 @@ recordtype(aao) {
prompt("Sim. Mode Private")
special(SPC_NOMOD)
interest(4)
extra("CALLBACK *simpvt")
extra("epicsCallback *simpvt")
}
field(MPST,DBF_MENU) {
prompt("Post Value Monitors")
+2 -2
View File
@@ -508,9 +508,9 @@ static long readValue(aiRecord *prec)
}
prec->pact = FALSE;
} else { /* !prec->pact && delay >= 0. */
CALLBACK *pvt = prec->simpvt;
epicsCallback *pvt = prec->simpvt;
if (!pvt) {
pvt = calloc(1, sizeof(CALLBACK)); /* very lazy allocation of callback structure */
pvt = calloc(1, sizeof(epicsCallback)); /* very lazy allocation of callback structure */
prec->simpvt = pvt;
}
if (pvt) callbackRequestProcessCallbackDelayed(pvt, prec->prio, prec, prec->sdly);
@@ -4,7 +4,7 @@
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
# in file LICENSE that is included with this distribution.
#*************************************************************************
=title Analog Input Record (ai)
@@ -214,7 +214,7 @@ monitoring functionality.
=cut
include "dbCommon.dbd"
include "dbCommon.dbd"
field(VAL,DBF_DOUBLE) {
prompt("Current EGU Value")
promptgroup("40 - Input")
@@ -516,7 +516,7 @@ simulation mode.
prompt("Sim. Mode Private")
special(SPC_NOMOD)
interest(4)
extra("CALLBACK *simpvt")
extra("epicsCallback *simpvt")
}
}
@@ -547,7 +547,7 @@ The individual routines are described below.
=head3 Device Support Routines
=head4 long report(int level)
long report(int level)
This optional routine is called by the IOC command C<dbior> and is passed the
report level that was requested by the user.
@@ -557,7 +557,7 @@ information at higher levels, or to select different types of information with
different levels.
Level zero should print no more than a small summary.
=head4 long init(int after)
long init(int after)
This optional routine is called twice at IOC initialization time.
The first call happens before any of the C<init_record()> calls are made, with
@@ -565,7 +565,7 @@ the integer parameter C<after> set to 0.
The second call happens after all of the C<init_record()> calls have been made,
with C<after> set to 1.
=head4 long init_record(aiRecord *prec)
long init_record(aiRecord *prec)
This optional routine is called by the record initialization code for each ai
record instance that has its DTYP field set to use this device support.
@@ -582,7 +582,7 @@ C<LINEAR>, but it is not necessary to check that condition first.
This same calculation takes place in the C<special_linconv()> routine, so the
implementation can usually just call that routine to perform the task.
=head4 long get_ioint_info(int cmd, aiRecord *prec, IOSCANPVT *piosl)
long get_ioint_info(int cmd, aiRecord *prec, IOSCANPVT *piosl)
This optional routine is called whenever the record's SCAN field is being
changed to or from the value C<I/O Intr> to find out which I/O Interrupt Scan
@@ -611,7 +611,7 @@ thread.
The C<scanIoRequest()> routine is safe to call from an interrupt service routine
on embedded architectures (vxWorks and RTEMS).
=head4 long read_ai(aiRecord *prec)
long read_ai(aiRecord *prec)
This essential routine is called when the record wants a new value from the
addressed device.
@@ -622,7 +622,7 @@ It is responsible for performing (or at least initiating) a read operation, and
... return value ...
=head4 long special_linconv(aiRecord *prec, int after)
long special_linconv(aiRecord *prec, int after)
This optional routine should be provided if the record type's unit conversion
features are used by the device support's C<read_ai()> routine returning a
+2 -2
View File
@@ -574,9 +574,9 @@ static long writeValue(aoRecord *prec)
status = dbPutLink(&prec->siol, DBR_DOUBLE, &prec->oval, 1);
prec->pact = FALSE;
} else { /* !prec->pact && delay >= 0. */
CALLBACK *pvt = prec->simpvt;
epicsCallback *pvt = prec->simpvt;
if (!pvt) {
pvt = calloc(1, sizeof(CALLBACK)); /* very lazy allocation of callback structure */
pvt = calloc(1, sizeof(epicsCallback)); /* very lazy allocation of callback structure */
prec->simpvt = pvt;
}
if (pvt) callbackRequestProcessCallbackDelayed(pvt, prec->prio, prec, prec->sdly);
+5 -11
View File
@@ -70,7 +70,7 @@ output value PVAL is added to it.
=head4 Drive Limits
The output value is now clipped to the range DRVL to DRVH inclusive, provided
that DRVH > DRVL.
that DRVH E<gt> DRVL.
The result is copied into both the VAL and PVAL fields.
=head4 Limit Rate of Change
@@ -164,9 +164,7 @@ OUT field must specify the address of the I/O card. In addition, the
DTYP field must contain the name of the device support module. Be aware
that the address format differs according to the I/O bus used. See
Address Specification for information on the format of hardware
addresses. The user can see a list of the device support modules
currently supported at the user's local site by using the dbst utility
in R3.13.
addresses.
For soft records the output link can be a database link, a channel
access link, or a constant value. If the link is a constant, no output
@@ -573,7 +571,7 @@ information on these fields.
prompt("Sim. Mode Private")
special(SPC_NOMOD)
interest(4)
extra("CALLBACK *simpvt")
extra("epicsCallback *simpvt")
}
field(IVOA,DBF_MENU) {
prompt("INVALID output action")
@@ -620,7 +618,7 @@ terminated.
For compatibility with old device supports that don't know EOFF, if
both EOFF and ESLO have their default value, EOFF is set to EGUL.
If device support includes init_record, it is called.
If device support includes C<init_record()>, it is called.
INIT is set TRUE. This causes PBRK, LBRK, and smoothing to be
re-initialized. If "backwards" linear conversion is requested, then VAL
@@ -647,10 +645,6 @@ called.
INIT is set TRUE. This causes PBRK, LBRK, and smoothing to be
re-initialized.
=item get_value
Fills in the values of struct valueDes so that they refer to VAL.
=item get_alarm_double
Sets the following values:
@@ -930,7 +924,7 @@ OUT link type must be either a CONSTANT, DB_LINK, or CA_LINK.
This module writes the current value of OVAL.
If the OUT link type is PV_LINK, then dbCaAddInlink is called by
init_record. init_record always returns a value of 2, which means that
C<init_record()>. C<init_record()> always returns a value of 2, which means that
no conversion will ever be attempted.
write_ao calls recGblPutLinkValue to write the current value of VAL.
+2 -2
View File
@@ -304,9 +304,9 @@ static long readValue(biRecord *prec)
}
prec->pact = FALSE;
} else { /* !prec->pact && delay >= 0. */
CALLBACK *pvt = prec->simpvt;
epicsCallback *pvt = prec->simpvt;
if (!pvt) {
pvt = calloc(1, sizeof(CALLBACK)); /* very lazy allocation of callback structure */
pvt = calloc(1, sizeof(epicsCallback)); /* very lazy allocation of callback structure */
prec->simpvt = pvt;
}
if (pvt) callbackRequestProcessCallbackDelayed(pvt, prec->prio, prec, prec->sdly);
+51 -47
View File
@@ -69,9 +69,7 @@ If the binary input record gets its value from hardware, the address of the
card must be entered in the INP field, and the name of the device support
module must be entered in the DTYP field. See L<Address Specification> for
information on the format of the hardware address. Be aware that the format
differs between types of cards. You can see a list of device support
modules currently supported at the user's local site by using C<dbst>
utility (R3.13).
differs between types of cards.
For records that specify C<Soft Channel> or C<Raw Soft Channel> device
support routines, the INP field can be a channel or a database link, or a
@@ -94,18 +92,18 @@ the device support module reads a value directly into VAL or the
C<Soft Channel> device support is used. The value can also be fetched as one of
the strings specified in the ZNAM or ONAM fields. The ZNAM field has a
string that corresponds to the 0 state, so when the value is fetched as
this string, C<put_enum_str> will return a 0. The ONAM field hold the
this string, C<put_enum_str()> will return a 0. The ONAM field hold the
string that corresponds to the 1 state, so when the value is fetched as
this string, C<put_enum_str> returns a 1.
this string, C<put_enum_str()> returns a 1.
=fields ZNAM, ONAM
=head3 Operator Display Parameters
These parameters are used to present meaningful data to the operator. The
C<get_enum_str> record support routine can retrieve the state string
corresponding to the VAL's state. If the value is 1, C<get_enum_str> will
return the string in the ONAM field; and if 0, C<get_enum_str> will return
C<get_enum_str()> record support routine can retrieve the state string
corresponding to the VAL's state. If the value is 1, C<get_enum_str()> will
return the string in the ONAM field; and if 0, C<get_enum_str()> will return
the ZNAM string.
See L<Fields Common to All Record Types> for more on the record name (NAME)
@@ -149,7 +147,7 @@ The LALM fields holds the value of the last occurence of the change of
state alarm. It is used to implement the change of state alarm, and thus
only has meaning if COSV is MAJOR or MINOR.
The MSLT field is used by the C<process> record support routine to
The MSLT field is used by the C<process()> record support routine to
determine if archive and value change monitors are invoked. They are if MSLT
is not equal to VAL.
@@ -164,7 +162,7 @@ these fields.
=cut
include "dbCommon.dbd"
include "dbCommon.dbd"
field(INP,DBF_INLINK) {
prompt("Input Specification")
promptgroup("40 - Input")
@@ -286,14 +284,14 @@ these fields.
prompt("Sim. Mode Private")
special(SPC_NOMOD)
interest(4)
extra("CALLBACK *simpvt")
extra("epicsCallback *simpvt")
}
=head2 Record Support
=head3 Record Support Routines
=head2 C<init_record>
long init_record(struct dbCommon *precord, int pass);
This routine initializes SIMM with the value of SIML if SIML type is a
CONSTANT link or creates a channel access link if SIML type is PV_LINK.
@@ -303,25 +301,21 @@ This routine next checks to see that device support is available and a
device support routine is defined. If neither exist, an error is issued and
processing is terminated.
If device support includes C<init_record>, it is called.
If device support includes C<init_record()>, it is called.
=head2 C<process>
long process(struct dbCommon *precord);
See next section.
See L<Record Processing> below.
=head2 C<get_value>
Fills in the values of struct valueDes so that they refer to VAL.
=head2 C<get_enum_str>
long get_enum_str(const struct dbAddr *paddr, char *pbuffer);
Retrieves ASCII string corresponding to VAL.
=head2 C<get_enum_strs>
long get_enum_strs(const struct dbAddr *paddr, struct dbr_enumStrs *p);
Retrieves ASCII strings for ZNAM and ONAM.
=head2 C<put_enum_str>
long put_enum_str(const struct dbAddr *paddr, const char *pbuffer);
Check if string matches ZNAM or ONAM, and if it does, sets VAL.
@@ -329,7 +323,7 @@ Check if string matches ZNAM or ONAM, and if it does, sets VAL.
Routine process implements the following algorithm:
=over 1
=over
=item 1.
Check to see that the appropriate device support module exists. If it
@@ -338,7 +332,7 @@ the PACT field still set to TRUE. This ensures that processes will no
longer be called for this record. Thus error storms will not occur.
=item 2.
C<readValue> is called. See L<Input Records> for details.
C<readValue()> is called. See L<Input Records> for details.
=item 3.
If PACT has been changed to TRUE, the device support read routine has
@@ -350,7 +344,7 @@ Convert.
=back
=over 1
=over
=item *
status = read_bi
@@ -359,7 +353,7 @@ status = read_bi
PACT = TRUE
=item *
TIME = tslocaltime
C<recGblGetTimeStamp()> is called.
=item *
if status is 0, then set VAL=(0,1) if RVAL is (0, not 0) and UDF = False.
@@ -369,7 +363,7 @@ if status is 2, set status = 0
=back
=over 1
=over
=item 5.
Check alarms: This routine checks to see if the new VAL causes the alarm
@@ -381,7 +375,7 @@ Check if monitors should be invoked:
=back
=over 1
=over
=item *
Alarm monitors are invoked if the alarm status or severity has changed.
@@ -397,7 +391,7 @@ NSEV and NSTA are reset to 0.
=back
=over 1
=over
=item 7.
Scan forward link if necessary, set PACT FALSE, and return.
@@ -410,7 +404,7 @@ Scan forward link if necessary, set PACT FALSE, and return.
Each binary input record must have an associated set of device support
routines. The primary resposibility of the device support routines is to
obtain a new raw input value whenever C<read_bi> is called. The device
obtain a new raw input value whenever C<read_bi()> is called. The device
support routines are primarily interested in the following fields:
=fields PACT, DPVT, UDF, NSEV, NSTA, VAL, INP, RVAL, MASK
@@ -419,27 +413,37 @@ support routines are primarily interested in the following fields:
Device support consists of the following routines:
=head2 C<report(FILE fp, paddr)>
long report(int level);
Not currently used.
This optional routine is called by the IOC command C<dbior> and is passed the
report level that was requested by the user.
It should print a report on the state of the device support to stdout.
The C<level> parameter may be used to output increasingly more detailed
information at higher levels, or to select different types of information with
different levels.
Level zero should print no more than a small summary.
=head2 C<init()>
long init(int after);
This routine is called once during IOC initialization.
This optional routine is called twice at IOC initialization time.
The first call happens before any of the C<init_record()> calls are made, with
the integer parameter C<after> set to 0.
The second call happens after all of the C<init_record()> calls have been made,
with C<after> set to 1.
=head2 C<init_record(precord)>
long init_record(struct dbCommon *precord);
This routine is optional. If provided, it is called by the record support
C<init_record> routine.
C<init_record()> routine.
=head2 C<get_ioint_info(int cmd, struct dbCommon *precord, IOSCANPVT *ppvt)>
long get_ioint_info(int cmd, struct dbCommon *precord, IOSCANPVT *ppvt);
This routine is called by the C<ioEventScan> system each time the record is
This routine is called by the ioEventScan system each time the record is
added or deleted from an I/O event scan list. C<cmd> has the value (0,1) if
the record is being (added to, deleted from) and I/O event list. It must be
provided for any device type that can use the ioEvent scanner.
=head2 C<read_bi(precord)>
long read_bi(struct dbCommon *precord);
This routine must provide a new input value. It returns the following
values:
@@ -466,25 +470,25 @@ link type must be either CONSTANT, DB_LINK, or CA_LINK.
=head3 Soft Channel
C<read_bi> always returns a value of 2, which means that no conversion is
C<read_bi()> always returns a value of 2, which means that no conversion is
performed.
If the INP link type is CONSTANT, then the constant value is stored in VAL
by C<init_record>, and the UDF is set to FALSE. VAL can be changed via
C<dbPut> requests. If the INP link type is PV_LINK, the C<dbCaAddInlink> is
called by C<init_record>.
by C<init_record()>, and the UDF is set to FALSE. VAL can be changed via
C<dbPut()> requests. If the INP link type is PV_LINK, the C<dbCaAddInlink()> is
called by C<init_record()>.
C<read_bi> calls C<recGbleGetLinkValue> to read the current value of VAL.
C<read_bi()> calls C<dbGetLinkValue> to read the current value of VAL.
See L<Soft Input> for details.
If the return status of C<recGblGetLinkValue> is zero, then C<read_bi> sets
UDF to FALSE. The status of C<recGblGetLinkValue> is returned.
If the return status of C<dbGetLinkValue()> is zero, then C<read_bi()> sets
UDF to FALSE. The status of C<dbGetLinkValue()> is returned.
=head3 Raw Soft Channel
This module is like the previous except that values are read into RVAL.
C<read_bi> returns a value of 0. Thus the record processing routine will
C<read_bi()> returns a value of 0. Thus the record processing routine will
force VAL to be 0 or 1.
=cut
+4 -4
View File
@@ -98,7 +98,7 @@ struct bodset { /* binary output dset */
/* control block for callback*/
typedef struct myCallback {
CALLBACK callback;
epicsCallback callback;
struct dbCommon *precord;
}myCallback;
@@ -106,7 +106,7 @@ static void checkAlarms(boRecord *);
static void monitor(boRecord *);
static long writeValue(boRecord *);
static void myCallbackFunc(CALLBACK *arg)
static void myCallbackFunc(epicsCallback *arg)
{
myCallback *pcallback;
boRecord *prec;
@@ -439,9 +439,9 @@ static long writeValue(boRecord *prec)
status = dbPutLink(&prec->siol, DBR_USHORT, &prec->val, 1);
prec->pact = FALSE;
} else { /* !prec->pact && delay >= 0. */
CALLBACK *pvt = prec->simpvt;
epicsCallback *pvt = prec->simpvt;
if (!pvt) {
pvt = calloc(1, sizeof(CALLBACK)); /* very lazy allocation of callback structure */
pvt = calloc(1, sizeof(epicsCallback)); /* very lazy allocation of callback structure */
prec->simpvt = pvt;
}
if (pvt) callbackRequestProcessCallbackDelayed(pvt, prec->prio, prec, prec->sdly);
+32 -27
View File
@@ -65,9 +65,9 @@ C<losed_loop> or C<supervisory>. If C<supervisory> is specified, the value
in the VAL field can be set externally via dbPuts at run-time. If
C<closed_loop> is specified, the VAL field's value is obtained from the
address specified in the desired output location (DOL) field which can be a
database link, a channel access link, or a constant. To achieve continuous
control, a database link to a control algorithm record should be entered in
the DOL field.
database link or a channel access link, but not a constant. To achieve
continuous control, a database link to a control algorithm record should be
entered in the DOL field.
L<Address Specification> presents more information on database addresses
and links. L<Scanning Specification> explaines the effect of database
@@ -130,8 +130,7 @@ It must specify the address of an I/O card if the record sends its output
to hardware, and the DTYP field must contain the corresponding device
support module. Be aware that the address format differs according to the
I/O bus used. See L<Address Specification> for information on the format of
hardware addresses. You can see a list of device support modules currently
supported at the user's local site by using the C<dbst> utility in R3.13.
hardware addresses.
Otherwise, if the record is configured to use the soft device support
modules, then it can be either a database link, a channel access link, or a
@@ -143,9 +142,9 @@ this chapter for more on output to other records.
=head3 Operator Display Parameters
These parameters are used to present meaningful data to the operator, The
C<get_enum_str> record support routine can retrieve the state string
corresponding to the VAL's state. So, if the value is 1, C<get_enum_str>
will return the string in the ONAM field: and if 0, C<get_enum_str> will
C<get_enum_str()> record support routine can retrieve the state string
corresponding to the VAL's state. So, if the value is 1, C<get_enum_str()>
will return the string in the ONAM field: and if 0, C<get_enum_str()> will
return the ZNAM string.
See L<Fields Common to All Record Types> for more on the record name (NAME)
@@ -194,7 +193,7 @@ The LALM field holds the value of the last occurrence of the change of
state alarm. It is used to implement the change of state alarm, and thus
only has meaning if COSV is MINOR or MAJOR.
The MLST is used by the C<process> record support routine to determine if
The MLST is used by the C<process()> record support routine to determine if
archive and value change monitors are invoked. They are if MLST is not
equal to VAL.
@@ -366,7 +365,7 @@ information on these fields.
prompt("Sim. Mode Private")
special(SPC_NOMOD)
interest(4)
extra("CALLBACK *simpvt")
extra("epicsCallback *simpvt")
}
field(IVOA,DBF_MENU) {
prompt("INVALID outpt action")
@@ -400,17 +399,13 @@ exist, and error message is issued and processing is terminated.
If DOL is a constant, then VAL is initialized to 1 if its value is nonzero
or initialzed to 0 if DOL is zero, and UDF is set to FALSE.
If device support includes C<init_record>, it is called. VAL is set using
If device support includes C<init_record()>, it is called. VAL is set using
RVAL, and UDF is set to FALSE.
=head2 C<process>
See next section.
=head2 C<get_value>
Fills in the values of struct valueDes so that they refer to VAL.
=head2 C<get_enum_str>
Retrieves ASCII string corresponding to VAL.
@@ -443,7 +438,7 @@ If PACT is FALSE
=over
=item *
If DOL is DB_LINK and OMSL is CLOSED_LOOP
If DOL holds a link and OMSL is C<closed_loop>
=over
@@ -527,27 +522,37 @@ Scan forward link if necessary, set PACT FALSE, and return
Each binary output record must have an associated set of device support
routines. The primary responsibility of the device support routines is to
write a new value whenever C<write_bo> is called. The device support routines
write a new value whenever C<write_bo()> is called. The device support routines
are primarily interested in the following fields:
=fields PACT, DPVT, NSEV, NSTA, VAL, OUT, RVAL, MASK, RBV
=head3 Decive Support Routines
=head3 Device Support Routines
Device support consists of the following routines:
=head2 C<report(FILE fp, paddr)>
=head4 long report(int level)
Not currently used.
This optional routine is called by the IOC command C<dbior> and is passed the
report level that was requested by the user.
It should print a report on the state of the device support to stdout.
The C<level> parameter may be used to output increasingly more detailed
information at higher levels, or to select different types of information with
different levels.
Level zero should print no more than a small summary.
=head2 C<init()>
=head4 long init(int after)
This routine is called once during IOC initialization.
This optional routine is called twice at IOC initialization time.
The first call happens before any of the C<init_record()> calls are made, with
the integer parameter C<after> set to 0.
The second call happens after all of the C<init_record()> calls have been made,
with C<after> set to 1.
=head2 C<init_record(precord)>
This routine is optional. If provided, it is called by record support
C<init_record> routine. It should determine MASK if it is needed.
C<init_record()> routine. It should determine MASK if it is needed.
=over
@@ -593,10 +598,10 @@ link type must be either CONSTANT, DB_LINK, or CA_LINK.
This module writes the current value of VAL.
If the OUT link type is PV_LINK, then C<dbCaAddInlink> is called by
C<init_record>. C<init_record> always returns a value of 2, which means
that no conversion will ever be attempted. C<write_bo> calls
C<recGblPutLinkValue> to write the current value of VAL. See L<Soft Output>
If the OUT link type is PV_LINK, then C<dbCaAddInlink()> is called by
C<init_record()>. C<init_record()> always returns a value of 2, which means
that no conversion will ever be attempted. C<write_bo()> calls
C<recGblPutLinkValue()> to write the current value of VAL. See L<Soft Output>
for details.
=head3 Raw Soft Channel
+23 -27
View File
@@ -261,22 +261,22 @@ ATAN: Arc tangent
=over 1
=item *
>= : Greater than or equal to
C<<< >= >>> : Greater than or equal to
=item *
> : Greater than
C<<< > >>> : Greater than
=item *
<= : Less than or equal to
C<<< <= >>> : Less than or equal to
=item *
< : Less than
C<<< < >>> : Less than
=item *
# : Not equal to
C<<< # >>> : Not equal to
=item *
= : Equal to
C<<< = >>> : Equal to
=back
@@ -285,13 +285,13 @@ ATAN: Arc tangent
=over 1
=item *
&& : And
C<&&> : And
=item *
|| : Or
C<||> : Or
=item *
! : Not
C<!> : Not
=back
@@ -300,10 +300,10 @@ ATAN: Arc tangent
=over 1
=item *
| : Bitwise Or
C<|> : Bitwise Or
=item *
& : Bitwise And
C<&> : Bitwise And
=item *
OR : Bitwise Or
@@ -315,13 +315,13 @@ AND : Bitwise And
XOR : Bitwise Exclusive Or
=item *
~ : One's Complement
C<~> : One's Complement
=item *
<< : Left shift
C<<< << >>> : Left shift
=item *
>> : Right shift
C<<< >> >>> : Right shift
=back
@@ -330,7 +330,7 @@ XOR : Bitwise Exclusive Or
=over 1
=item *
:= : assigns a value (right hand side) to a variable (i.e. field)
C<:=> : assigns a value (right hand side) to a variable (i.e. field)
=back
@@ -360,35 +360,35 @@ C<A + B + 10>
=over 1
=item *
Result is A + B + 10
Result is C<A + B + 10>
=back
=head3 Relational
C<(A + B) < (C + D)>
C<<< (A + B) < (C + D) >>>
=over 1
=item *
Result is 1 if (A + B) < (C + D)
Result is 1 if C<<< (A + B) < (C + D) >>>
=item *
Result is 0 if (A + B) >= (C + D)
Result is 0 if C<<< (A + B) >= (C + D) >>>
=back
=head3 Question Mark
C<(A + B) < (C + D) ? E : F + L + 10>
C<<< (A + B) < (C + D) ? E : F + L + 10 >>>
=over 1
=item *
Result is E if (A + B) < (C + D)
Result is C<E> if C<<< (A + B) < (C + D) >>>
=item *
Result is F + L + 10 if (A + B) >= (C + D)
Result is C<F + L + 10> if C<<< (A + B) >= (C + D) >>>
=back
@@ -412,7 +412,7 @@ C<(A + B) < (C + D) ? E : VAL>
=head3 Logical
C<A&B>
C<A & B>
=over 1
@@ -851,10 +851,6 @@ See next section.
This is called if CALC is changed. C<special> calls postfix.
=head2 C<get_value>
Fills in the values of struct valueDes so that the refer to VAL.
=head2 C<get_units>
Retrieves EGU.
+5 -5
View File
@@ -117,8 +117,8 @@ typedef struct calcoutDSET {
#define CA_LINKS_NOT_OK 2
typedef struct rpvtStruct {
CALLBACK doOutCb;
CALLBACK checkLinkCb;
epicsCallback doOutCb;
epicsCallback checkLinkCb;
short cbScheduled;
short caLinkStat; /* NO_CA_LINKS, CA_LINKS_ALL_OK, CA_LINKS_NOT_OK */
} rpvtStruct;
@@ -128,7 +128,7 @@ static void monitor(calcoutRecord *prec);
static int fetch_values(calcoutRecord *prec);
static void execOutput(calcoutRecord *prec);
static void checkLinks(calcoutRecord *prec);
static void checkLinksCallback(CALLBACK *arg);
static void checkLinksCallback(epicsCallback *arg);
static long writeValue(calcoutRecord *prec);
int calcoutRecDebug;
@@ -702,7 +702,7 @@ static int fetch_values(calcoutRecord *prec)
return(status);
}
static void checkLinksCallback(CALLBACK *arg)
static void checkLinksCallback(epicsCallback *arg)
{
calcoutRecord *prec;
@@ -760,7 +760,7 @@ static void checkLinks(calcoutRecord *prec)
prpvt->caLinkStat = NO_CA_LINKS;
if (!prpvt->cbScheduled && caLinkNc) {
/* Schedule another CALLBACK */
/* Schedule another epicsCallback */
prpvt->cbScheduled = 1;
callbackRequestDelayed(&prpvt->checkLinkCb, .5);
}
@@ -293,22 +293,22 @@ ATAN: Arc tangent
=over 1
=item *
>= : Greater than or equal to
C<<< >= >>> : Greater than or equal to
=item *
> : Greater than
C<<< > >>> : Greater than
=item *
<= : Less than or equal to
C<<< <= >>> : Less than or equal to
=item *
< : Less than
C<<< < >>> : Less than
=item *
# : Not equal to
C<<< # >>> : Not equal to
=item *
= : Equal to
C<<< = >>> : Equal to
=back
@@ -332,10 +332,10 @@ ATAN: Arc tangent
=over 1
=item *
| : Bitwise Or
C<|> : Bitwise Or
=item *
& : Bitwise And
C<&> : Bitwise And
=item *
OR : Bitwise Or
@@ -347,13 +347,13 @@ AND : Bitwise And
XOR : Bitwise Exclusive Or
=item *
~ : One's Complement
C<~> : One's Complement
=item *
<< : Left shift
C<<< << >>> : Left shift
=item *
>> : Right shift
C<<< >> >>> : Right shift
=back
@@ -362,11 +362,11 @@ XOR : Bitwise Exclusive Or
=over 1
=item *
:= : assigns a value (right hand side) to a variable (i.e. field)
C<:=> : assigns a value (right hand side) to a variable (i.e. field)
=back
=head3 Parentheses and Comma
=head3 Parentheses, Comma, and Semicolon
The open and close parentheses are supported. Nested parentheses are
supported.
@@ -374,6 +374,10 @@ supported.
The comma is supported when used to separate the arguments of a binary
function.
The semicolon is used to separate expressions. Although only one
traditional calculation expression is allowed, multiple assignment
expressions are allowed.
=head3 Conditional Expression
The C language's question mark operator is supported. The format is:
@@ -388,41 +392,59 @@ C<A + B + 10>
=over 1
=item *
Result is A + B + 10
Result is C<A + B + 10>
=back
=head3 Relational
C<(A + B) < (C + D)>
C<<< (A + B) < (C + D) >>>
=over 1
=item *
Result is 1 if (A + B) < (C + D)
Result is 1 if C<<< (A + B) < (C + D) >>>
=item *
Result is 0 if (A + B) >= (C + D)
Result is 0 if C<<< (A + B) >= (C + D) >>>
=back
=head3 Question Mark
C<(A + B) < (C + D) ? E : F + L + 10>
C<<< (A + B) < (C + D) ? E : F + L + 10 >>>
=over 1
=item *
Result is E if (A + B) < (C + D)
Result is C<E> if C<<< (A + B) < (C + D) >>>
=item *
Result is F + L + 10 if (A + B) >= (C + D)
Result is C<F + L + 10> if C<<< (A + B) >= (C + D) >>>
=back
Prior to Base 3.14.9 it was legal to omit the : and the second (else) part
of the conditional, like this:
C<(A + B)<(C + D) ? E>
=over 1
=item
Result is E if (A + B)<(C + D)
=item
Result is unchanged if (A + B)>=(C + D)
From 3.14.9 onwards, this expression must be written as
C<(A + B) < (C + D) ? E : VAL>
=back
=head3 Logical
C<A&B>
C<A & B>
=over 1
@@ -447,6 +469,18 @@ Convert result to floating point
=back
=head3 Assignment
C<sin(a); a:=a+D2R>
=over 1
=item *
Causes the Calc record to output the successive values of a sine curve in
1 degree intervals.
=back
=head3 Output Parameters
These parameters specify and control the output capabilities of the Calcout
@@ -471,7 +505,7 @@ C<On Change> -- write output every time VAL changes, i.e., every time the
result of the expression changes.
=item *
C<When Zero> -- when record is preocessed, write output if VAL is zero.
C<When Zero> -- when record is processed, write output if VAL is zero.
=item *
C<When Non-zero> -- when record is processed, write output if VAL is
@@ -497,9 +531,9 @@ output is executed. The field is a menu field with two options:
If C<Use CALC> is specified, when the record writes its
output it will write the result of the expression in the CALC field, that
is, it will write the value of the VAL field. If C<Use OCAL> is specified,
the record will instead write the result of the expresion in the OCAL
the record will instead write the result of the expression in the OCAL
field, which is contained in the OVAL field. The OCAL field is exactly like
the CALC field and has the same fuctionality it can contain the string
the CALC field and has the same functionality it can contain the string
representation of an expression which is evaluated at run-time. Thus, if
necessary, the record can use the result of the CALC expression to
determine if data should be written and can use the result of the OCAL
@@ -514,7 +548,7 @@ the wait is over. The field DLYA is equal to 1 during the delay period. The
resolution of the delay entry system dependent.
The IVOA field specifies what action to take with the OUT link if the
Calcout record eneters an INVALID alarm status. The options are
Calcout record enters an INVALID alarm status. The options are
C<Continue normally>, C<Don't drive outputs>, and C<Set output to IVOV>.
If the IVOA field is C<Set output to IVOV>, the data entered into the
IVOV field is written to the OUT link if the record alarm severity is
@@ -529,7 +563,7 @@ are also meant to represent the status of the record at run-time.
The EGU field contains a string of up to 16 characters which is supplied by
the user and which describes the values being operated upon. The string is
retrieved whenever the routine C<get_units> is called. The EGU string is
retrieved whenever the routine C<get_units()> is called. The EGU string is
solely for an operator's sake and does not have to be used.
The HOPR and LOPR fields on;y refer to the limits if the VAL, HIHI, HIGH,
@@ -568,7 +602,7 @@ The CLCV and OLCV fields indicate the validity of the expression in the
CALC and OCAL fields respectfully. If the expression in invalid, the field
is set to one.
The DYLA field is set to one during the delay specified in ODLY.
The DLYA field is set to one during the delay specified in ODLY.
See L<Fields Common to All Record Types> for more information on the record
name (NAME) and description (DESC) fields.
@@ -583,7 +617,7 @@ record support routines. The Calculation alarm is called by the record
processing routine when the CALC expression is an invalid one, upon which
an error message is generated.
The following alarm parametersi, which are configured by the user, define the
The following alarm parameters, which are configured by the user, define the
limit alarms for the VAL field and the severity corresponding to those
conditions.
@@ -599,7 +633,7 @@ common to all record types.
These parameters are used to determine when to send monitors for the value
fields. These monitors are sent when the value field exceeds the last
monitored field by the appropriate deadband, the ADEL for archiver monitors
and the MDEL field for all aother types of monitors. If these fields have a
and the MDEL field for all other types of monitors. If these fields have a
value of zero, every time the value changes, monitors are triggered; if
they have a value of -1, every time the record is scanned, monitors are
triggered. See L<Monitor Specification> for a complete explanation of
@@ -1146,10 +1180,6 @@ See next section.
This is called id CALC or OCAL is changed. C<special> calls postfix.
=head2 C<get_value>
Fills in the values of struct valueDes so that they refer to VAL.
=head2 C<get_units>
Retrieves EGU.
@@ -1163,13 +1193,13 @@ Retrieves PREC.
Sets the upper display and lower display limits for a field. If the field
is VAL, HIHI, HIGH, LOW, or LOLO, the limits are set to HOPR and LOPR, else
if the field has upper and lower limits defined they will be used, else the
upper and lower macimum values for the field type will be used.
upper and lower maximum values for the field type will be used.
=head2 C<get_control_double>
Sets the upper control and lower control limits for a field. If the VAL,
HIHI, HIGH, LOW, or LOLO, the limits are set to HOPR and LOPR, else if the
field has upper and lower limits defimed they will be used, else the upper
field has upper and lower limits defined they will be used, else the upper
and lower maximum values for the field will be used.
=head2 C<get_alarm_double>
@@ -1211,7 +1241,7 @@ honors the alarm hysteresis factor (HYST). Thus the value must change by at
least HYST before the alarm status and severity changes.
=item 4.
Determin if the Output Execution Option (OOPT) is met. If it met, either
Determine if the Output Execution Option (OOPT) is met. If it met, either
execute the output link (and output event) immediately (if ODLY = 0), or
schedule a callback after the specified interval. See the explanation for
the C<execOutput()> routine below.
@@ -1237,7 +1267,7 @@ NSEV and NSTA are reset to 0
=back
=item 6.
If no output delay was specified, scan forwark link if necessaru, set PACT
If no output delay was specified, scan forward link if necessary, set PACT
FALSE, and return.
=back
@@ -1260,7 +1290,7 @@ put the value of OVAL to the OUT link and post the event in OEVT (if
non-zero).
=item 4.
If an output delay was implemented, process the forwark link.
If an output delay was implemented, process the forward link.
=back
@@ -4,10 +4,10 @@
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
# in file LICENSE that is included with this distribution.
#*************************************************************************
=title Compress Record (compress)
=title Compression Record (compress)
The data compression record is used to collect and compress data from arrays.
When the INP field references a data array field, it immediately compresses the
@@ -62,11 +62,299 @@ menu(bufferingALG) {
}
recordtype(compress) {
=fields VAL
=head2 Parameter Fields
The record-specific fields are described below, grouped by functionality.
=head3 Scanning Parameters
The compression record has the standard fields for specifying under what
circumstances the record will be processed. These fields are listed in
L<Scan Fields>. In addition, L<Scanning Specification>
explains how these fields are used. Since the compression record supports no
direct interfaces to hardware, its SCAN field cannot specify C<<< I/O Intr >>>.
=head3 Algorithms and Related Parameters
The user specifies the algorithm to be used in the ALG field. There are six possible
algorithms which can be specified as follows:
=head4 Menu compressALG
=menu compressALG
The following fields determine what channel to read and how to compress the data:
=fields ALG, INP, NSAM, N, ILIL, IHIL, OFF, RES
As stated above, the ALG field specifies which algorithm to be performed on the data.
The INP should be a database or channel access link. Though INP can be a constant,
the data compression algorithms are supported only when INP is a database link. See
L<Address Specification> for information on specifying links.
IHIL and ILIL can be set to provide an initial value filter on the input array.
If ILIL E<lt> IHIL, the input elements will be skipped until a value is found
that is in the range of ILIL to IHIL. Note that ILIL and IHIL are used only in
C<<< N to 1 >>> algorithms.
OFF provides the offset to the current beginning of the array data.
Note that OFF is used only in C<<< N to 1 >>> algorithms.
The RES field can be accessed at run time to cause the algorithm to reset
itself before the maximum number of samples are reached.
=head4 Algorithms
B<Circular Buffer> algorithm keeps a circular buffer of length NSAM.
Each time the record is processed, it gets the data referenced by INP and puts
it into the circular buffer referenced by VAL. The INP can refer to both scalar or
array data and VAL is just a time ordered circular buffer of values obtained
from INP.
Note that N, ILIL, IHIL and OFF are not used in C<<< Circular Buffer >>> algorithm.
B<Average> takes an average of every element of the array obtained from
INP over time; that is, the entire array referenced by INP is retrieved, and for
each element, the new average is calculated and placed in the corresponding
element of the value buffer. The retrieved array is truncated to be of length
NSAM. N successive arrays are averaged and placed in the buffer. Thus, VAL[0]
holds the average of the first element of INP over N samples, VAL[1] holds the
average of the next element of INP over N samples, and so on. The following
shows the equation:
=for comment Latex form of equation bellow : VAL[i] \leftarrow \frac{1}{N}\sum_{n=1}^NINP_{n}[i]
=begin html
<img src="image/compress-1.png">
=end html
B<N to 1> If any of the C<<< N to 1 >>> algorithms are chosen, then VAL is a circular
buffer of NSAM samples.
The actual algorithm depends on whether INP references a scalar or an array.
If INP refers to a scalar, then N successive time ordered samples of INP are taken.
After the Nth sample is obtained, a new value determined by the algorithm
(Lowest, Highest, or Average), is written to the circular buffer referenced by
VAL. If C<<< Low Value >>> the lowest value of all the samples is written; if
C<<< High Value >>> the highest value is written; and if C<<< Average >>>, the
average of all the samples are written. The C<<< Median >>> setting behaves
like C<<< Average >>> with scalar input data.
If INP refers to an array, then the following applies:
=over
=item C<<< N to 1 Low Value >>>
Compress N to 1 samples, keeping the lowest value.
=item C<<< N to 1 High Value >>>
Compress N to 1 samples, keeping the highest value.
=item C<<< N to 1 Average >>>
Compress N to 1 samples, taking the average value.
=item C<<< N to 1 Median >>>
Compress N to 1 samples, taking the median value.
=back
The compression record keeps NSAM data samples.
The field N determines the number of elements to compress into each result.
Thus, if NSAM was 3, and N was also equal to 3, then the algorithms would work
as in the following diagram:
=begin html
<img src="image/compress-2.png">
=end html
=head3 Operator Display Parameters
These parameters are used to present meaningful data to the operator. They
display the value and other parameters of the record either textually or
graphically.
=fields EGU, HOPR, LOPR, PREC, NAME, DESC
The EGU field should be given a string that describes the value of VAL, but is
used whenever the C<<< get_units >>> record support routine is called.
The HOPR and LOPR fields only specify the upper and lower display limits for
VAL, HIHI, HIGH, LOLO and LOW fields.
PREC controls the floating-point precision whenever C<<< get_precision >>> is
called, and the field being referenced is the VAL field (i.e., one of the values
contained in the circular buffer).
See L<Fields Common to All Record Types>
for more on the record name (NAME) and description (DESC) fields.
=head3 Alarm Parameters
The compression record has the alarm parameters common to all record types
described in L<Alarm Fields>.
=head3 Run-time Parameters
These parameters are used by the run-time code for processing the data
compression algorithm. They are not configurable by the user, though some are
accessible at run-time. They can represent the current state of the waveform or
of the record whose field is referenced by the INP field.
=fields NUSE, OUSE, BPTR, SPTR, WPTR, CVB, INPN, INX
NUSE and OUSE hold the current and previous number of elements stored in VAL.
BPTR is a pointer that refers to the buffer referenced by VAL.
SPTR points to an array that is used for array averages.
WPTR is used by the dbGetlinks routines.
=head2 Record Support
=head3 Record Support Routines
long init_record(struct dbCommon *precord, int pass)
Space for all necessary arrays is allocated. The addresses are stored in the
appropriate fields in the record.
long process(struct dbCommon *precord)
See L<Record Processing> below.
long special(struct dbAddr *paddr, int after)
This routine is called when RSET, ALG, or N are set. It performs a reset.
long cvt_dbaddr(struct dbAddr *paddr)
This is called by dbNameToAddr. It makes the dbAddr structure refer to the
actual buffer holding the result.
long get_array_info(struct dbAddr *paddr, long *no_elements, long *offset)
Obtains values from the circular buffer referenced by VAL.
long put_array_info(struct dbAddr *paddr, long nNew);
Writes values into the circular buffer referenced by VAL.
long get_units(struct dbAddr *paddr, char *units);
Retrieves EGU.
long get_precision(const struct dbAddr *paddr, long *precision);
Retrieves PREC.
long get_graphic_double(struct dbAddr *paddr, struct dbr_grDouble *p);
Sets the upper display and lower display limits for a field. If the field is
VAL, the limits are set to HOPR and LOPR, else if the field has upper and lower
limits defined they will be used, else the upper and lower maximum values for
the field type will be used.
long get_control_double(struct dbAddr *paddr, struct dbr_ctrlDouble *p);
Sets the upper control and the lower control limits for a field. If the field is
VAL, the limits are set to HOPR and LOPR, else if the field has upper and lower
limits defined they will be used, else the upper and lower maximum values for
the field type will be used.
=head3 Record Processing
Routine process implements the following algorithm:
=over
=item 1.
If INP is not a database link, check monitors and the forward link and return.
=item 2.
Get the current data referenced by INP.
=item 3.
Perform the appropriate algorithm:
=over
=item *
Average: Read N successive instances of INP and perform an element by element
average. Until N instances have been obtained it just return without checking
monitors or the forward link. When N instances have been obtained complete the
algorithm, store the result in the VAL array, check monitors and the forward
link, and return.
=item *
Circular Buffer: Write the values obtained from INP into the VAL array as a
circular buffer, check monitors and the forward link, and return.
=item *
N to 1 xxx when INP refers to a scalar: Obtain N successive values from INP and
apply the N to 1 xxx algorithm to these values. Until N values are obtained
monitors and forward links are not triggered. When N successive values have been
obtained, complete the algorithm, check monitors and trigger the forward link,
and return.
=item *
N to 1 xxx when INP refers to an array: The ILIL and IHIL are honored if ILIL
E<lt> IHIL. The input array is divided into subarrays of length N. The specified
N to 1 xxx compression algorithm is applied to each sub-array and the result
stored in the array referenced by VAL. The monitors and forward link are
checked.
=back
=item 4.
If success, set UDF to FALSE.
=item 5.
Check to see if monitors should be invoked:
=over
=item *
Alarm monitors are invoked if the alarm status or severity has changed.
=item *
NSEV and NSTA are reset to 0.
=back
=item 6.
Scan forward link if necessary, set PACT FALSE, and return.
=back
=cut
include "dbCommon.dbd"
include "dbCommon.dbd"
field(VAL,DBF_NOACCESS) {
prompt("Value")
asl(ASL0)
@@ -128,7 +128,7 @@ value on the VAL field.
The HOPR and LOPR fields determine the upper and lower display limits for
graphic displays and the upper and lower control limits for control
displays. They apply to the VAL, HIHI, HIGH, LOW, and LOLO fields. The
record support routines C<get_graphic_double> or C<get_control_double>
record support routines C<get_graphic_double()> and C<get_control_double()>
retrieve HOPR and LOPR.
See L<Fields Common to All Record Types> for more on the record name (NAME)
@@ -379,11 +379,6 @@ and the DOL link, a non-zero value is returned if an error occurs.
See next section.
=head2 C<get_value()>
This routine fills in the members of C<struct valueDes> with the VAL fields
value and characteristics.
=head2 C<get_units()>
The routine copies the string specified in the EGU field to the location
@@ -399,13 +394,13 @@ routine is called.
=head2 C<get_control_double()>
Same as the C<get_graphic_double> routine except that it uses the
Same as the C<get_graphic_double()> routine except that it uses the
C<dbr_ctrlDouble> structure.
=head2 C<get_alarm_double()>
This sets the members of the C<dbr_alDouble> structure to the specified
alarm limits if the referenced field is VAL:
alarm limits when the referenced field is VAL:
=over
@@ -427,26 +422,32 @@ is called.
=over
=item 1.
The C<process()> routine first retrieves a value for DOL and places it in
VAL if OMSL is set to colsed loop mode. If an error occurs, then UDF is set
to FALSE.
The C<process()> routine first checks that DOL is not a constant link and
that OMSL is set to "closed_loop". If so, it retrieves a value through DOL
and places it into VAL. If no errors occur, UDF is set to FALSE.
=item 2.
PACT is set TRUE
PACT is set TRUE, and the record's timestamp is set.
=item 3.
VAL is then sent to all the records specified in the OUTA-OUTH fields by
calling C<recGblePutLinkValue()> for each link.
A value is fetched from SELL and placed into SELN.
=item 4.
Alarms are checked and monitors are called if conditions apply.
Alarms ranges are checked against the contents of the VAL field.
=item 5.
The data fanout's own forward link is then processed.
VAL is then sent through the OUTA-OUTH links by calling C<dbPutLink()> for
each link, conditional on the setting of SELM and the value in SELN.
=item 6.
PACT is set FALSE, and the C<process()> routine returns. A -1 is returned
if there was an error writing values to one of the output links.
Value and archive monitors are posted on the VAL field if appropriate based on
the settings of MDEL and ADEL respectively.
=item 7.
The data fanout's forward link FLNK is processed.
=item 6.
PACT is set FALSE, and the C<process()> routine returns.
=back
+2 -2
View File
@@ -199,9 +199,9 @@ static long readValue(eventRecord *prec)
}
prec->pact = FALSE;
} else { /* !prec->pact && delay >= 0. */
CALLBACK *pvt = prec->simpvt;
epicsCallback *pvt = prec->simpvt;
if (!pvt) {
pvt = calloc(1, sizeof(CALLBACK)); /* very lazy allocation of callback structure */
pvt = calloc(1, sizeof(epicsCallback)); /* very lazy allocation of callback structure */
prec->simpvt = pvt;
}
if (pvt) callbackRequestProcessCallbackDelayed(pvt, prec->prio, prec, prec->sdly);
@@ -1,82 +0,0 @@
#*************************************************************************
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
recordtype(event) {
include "dbCommon.dbd"
field(VAL,DBF_STRING) {
prompt("Event Name To Post")
promptgroup("40 - Input")
special(SPC_MOD)
asl(ASL0)
size(40)
}
%#include "dbScan.h"
field(EPVT, DBF_NOACCESS) {
prompt("Event private")
special(SPC_NOMOD)
interest(4)
extra("EVENTPVT epvt")
}
field(INP,DBF_INLINK) {
prompt("Input Specification")
promptgroup("40 - Input")
interest(1)
}
field(SIOL,DBF_INLINK) {
prompt("Simulation Input Link")
promptgroup("90 - Simulate")
interest(1)
}
field(SVAL,DBF_STRING) {
prompt("Simulation Value")
size(40)
}
field(SIML,DBF_INLINK) {
prompt("Simulation Mode Link")
promptgroup("90 - Simulate")
interest(1)
}
field(SIMM,DBF_MENU) {
prompt("Simulation Mode")
special(SPC_MOD)
interest(1)
menu(menuYesNo)
}
field(SIMS,DBF_MENU) {
prompt("Simulation Mode Severity")
promptgroup("90 - Simulate")
interest(2)
menu(menuAlarmSevr)
}
field(OLDSIMM,DBF_MENU) {
prompt("Prev. Simulation Mode")
special(SPC_NOMOD)
interest(4)
menu(menuSimm)
}
field(SSCN,DBF_MENU) {
prompt("Sim. Mode Scan")
promptgroup("90 - Simulate")
interest(1)
menu(menuScan)
initial("65535")
}
field(SDLY,DBF_DOUBLE) {
prompt("Sim. Mode Async Delay")
promptgroup("90 - Simulate")
interest(2)
initial("-1.0")
}
%#include "callback.h"
field(SIMPVT,DBF_NOACCESS) {
prompt("Sim. Mode Private")
special(SPC_NOMOD)
interest(4)
extra("CALLBACK *simpvt")
}
}
@@ -0,0 +1,305 @@
#*************************************************************************
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
=title Event Record (event)
The normal use for this record type is to post an event and/or process a
forward link. Device support for this record can provide a hardware interrupt
handler routine for I/O Event-scanned records.
=head2 Parameter Fields
The records in this field fall into the following groups of parameters:
=over
=item *
scan parameters
=item *
read parameters
=item *
event number parameters
=item *
simulation mode parameters
=back
=recordtype event
=cut
recordtype(event) {
include "dbCommon.dbd"
=head3 Scan Parameters
The event record has the standard fields for specifying under what circumstances
it will be processed. If the SCAN field specifies C<I/O Intr>, then device
support will provide an interrupt handler, posting an event number when an I/O
interrupt occurs. These fields are listed in L<Scan Fields>. In addition,
L<Scanning Specification> explains how the scanning fields work. Note that I/O
event scanning is only supported for those card types that interrupt.
=head3 Event Number Parameters
The VAL field contains the event number read by the device support routines. It
is this number which is posted. For records that use C<Soft Channel> device
support, it can be configured before run-time or set via dbPuts.
=fields VAL
=cut
field(VAL,DBF_STRING) {
prompt("Event Name To Post")
promptgroup("40 - Input")
special(SPC_MOD)
asl(ASL0)
size(40)
}
%#include "dbScan.h"
field(EPVT, DBF_NOACCESS) {
prompt("Event private")
special(SPC_NOMOD)
interest(4)
extra("EVENTPVT epvt")
}
=head3 Input Specification
The device support routines use the address in this record to obtain input. For
records that provide an interrupt handler, the INP field should specify the
address of the I/O card, and the DTYP field should specify a valid device
support module. Be aware that the address format differs according to the card
type used. See L<Address Specification> for information on the format of
hardware addresses and specifying links.
For soft records, the INP field can be a constant, a database link, or a channel
access link. For soft records, the DTYP field should specify C<Soft Channel>.
=fields INP, DTYP
=cut
field(INP,DBF_INLINK) {
prompt("Input Specification")
promptgroup("40 - Input")
interest(1)
}
=head3 Operator Display Parameters
See L<Fields Common to All Record Types> for more on the record name (NAME) and
description (DESC) fields.
=fields NAME, DESC
=head3 Alarm Parameters
The Event record has the alarm parameters common to all record types. L<Alarm
Fields> lists other fields related to alarms that are common to all record
types.
=head3 Simulation Mode Parameters
The following fields are used to operate the event record in the simulation
mode. See L<Fields Common to Many Record Types> for more information on these
fields.
=fields SIOL, SVAL, SIML, SIMM, SIMS
=cut
field(SIOL,DBF_INLINK) {
prompt("Sim Input Specifctn")
promptgroup("90 - Simulate")
interest(1)
}
field(SVAL,DBF_STRING) {
prompt("Simulation Value")
size(40)
}
field(SIML,DBF_INLINK) {
prompt("Sim Mode Location")
promptgroup("90 - Simulate")
interest(1)
}
field(SIMM,DBF_MENU) {
prompt("Simulation Mode")
special(SPC_MOD)
interest(1)
menu(menuYesNo)
}
field(SIMS,DBF_MENU) {
prompt("Sim mode Alarm Svrty")
promptgroup("90 - Simulate")
interest(2)
menu(menuAlarmSevr)
}
field(OLDSIMM,DBF_MENU) {
prompt("Prev. Simulation Mode")
special(SPC_NOMOD)
interest(4)
menu(menuSimm)
}
field(SSCN,DBF_MENU) {
prompt("Sim. Mode Scan")
promptgroup("90 - Simulate")
interest(1)
menu(menuScan)
initial("65535")
}
field(SDLY,DBF_DOUBLE) {
prompt("Sim. Mode Async Delay")
promptgroup("90 - Simulate")
interest(2)
initial("-1.0")
}
%#include "callback.h"
field(SIMPVT,DBF_NOACCESS) {
prompt("Sim. Mode Private")
special(SPC_NOMOD)
interest(4)
extra("epicsCallback *simpvt")
}
=head2 Record Support
=head3 Record Support Routines
=head4 init_record
This routine initializes SIMM with the value of SIML if SIML type is a CONSTANT
link or creates a channel access link if SIML type is PV_LINK. SVAL is likewise
initialized if SIOL is CONSTANT or PV_LINK.
If device support includes C<init_record()>, it is called.
=head4 process
See next section.
=head3 Record Processing
Routine process implements the following algorithm:
=over
=item 1.
readValue is called. See L<Input Records> for more information.
=item 2.
If PACT has been changed to TRUE, the device support read routine has started
but has not completed reading a new input value. In this case, the processing
routine merely returns, leaving PACT TRUE.
=item 3.
If VAL E<gt> 0, post event number VAL.
=item 4.
Check to see if monitors should be invoked. Alarm monitors are invoked if the
alarm status or severity has chanet to 0.
=item 5.
Scan forward link if necessary, set PACT FALSE, and return.
=back
=head2 Device Support
=head3 Fields of Interest To Device Support
Each record must have an associated set of device support routines. The device
support routines are primarily interested in the following fields:
=fields PACT, DPVT, UDF, NSEV, NSTA, INP, PRIO
=head3 Device Support Routines
Device support consists of the following routines:
=head4 long report(int level)
This optional routine is called by the IOC command C<dbior> and is passed the
report level that was requested by the user.
It should print a report on the state of the device support to stdout.
The C<level> parameter may be used to output increasingly more detailed
information at higher levels, or to select different types of information with
different levels.
Level zero should print no more than a small summary.
=head4 long init(int after)
This optional routine is called twice at IOC initialization time.
The first call happens before any of the C<init_record()> calls are made, with
the integer parameter C<after> set to 0.
The second call happens after all of the C<init_record()> calls have been made,
with C<after> set to 1.
=head4 init_record
init_record(precord)
This routine is optional. If provided, it is called by the record support
C<init_record()> routine.
=head4 get_ioint_info
get_ioint_info(int cmd, struct dbCommon *precord, IOSCANPVT *ppvt)
This routine is called by the ioEventScan system each time the record is added
or deleted from an I/O event scan list. cmd has the value (0,1) if the record is
being (added to, deleted from) an I/O event list. It must be provided for any
device type that can use the ioEvent scanner.
=head4 read_event
read_event(precord)
This routine returns the following values:
=over
=item *
0: Success.
=item *
Other: Error.
=back
=head3 Device Support For Soft Records
The C<Soft Channel> device support module is available. The INP link type must
be either CONSTANT, DB_LINK, or CA_LINK.
If the INP link type is CONSTANT, then the constant value is stored into VAL by
C<init_record()>, and UDF is set to FALSE. If the INP link type is PV_LINK, then
dbCaAddInlink is called by C<init_record()>.
C<read_event> calls recGblGetLinkValue to read the current value of VAL. See
L<Input Records> for details on soft input.
=cut
}
@@ -1,129 +0,0 @@
#*************************************************************************
# Copyright (c) 2012 UChicago Argonne LLC, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
menu(fanoutSELM) {
choice(fanoutSELM_All,"All")
choice(fanoutSELM_Specified,"Specified")
choice(fanoutSELM_Mask,"Mask")
}
recordtype(fanout) {
include "dbCommon.dbd"
field(VAL,DBF_LONG) {
prompt("Used to trigger")
asl(ASL0)
pp(TRUE)
}
field(SELM,DBF_MENU) {
prompt("Select Mechanism")
promptgroup("30 - Action")
interest(1)
menu(fanoutSELM)
}
field(SELN,DBF_USHORT) {
prompt("Link Selection")
interest(1)
initial("1")
}
field(SELL,DBF_INLINK) {
prompt("Link Selection Loc")
promptgroup("30 - Action")
interest(1)
}
field(OFFS,DBF_SHORT) {
prompt("Offset for Specified")
promptgroup("30 - Action")
interest(1)
initial("0")
}
field(SHFT,DBF_SHORT) {
prompt("Shift for Mask mode")
promptgroup("30 - Action")
interest(1)
initial("-1")
}
field(LNK0,DBF_FWDLINK) {
prompt("Forward Link 0")
promptgroup("51 - Output 0-7")
interest(1)
}
field(LNK1,DBF_FWDLINK) {
prompt("Forward Link 1")
promptgroup("51 - Output 0-7")
interest(1)
}
field(LNK2,DBF_FWDLINK) {
prompt("Forward Link 2")
promptgroup("51 - Output 0-7")
interest(1)
}
field(LNK3,DBF_FWDLINK) {
prompt("Forward Link 3")
promptgroup("51 - Output 0-7")
interest(1)
}
field(LNK4,DBF_FWDLINK) {
prompt("Forward Link 4")
promptgroup("51 - Output 0-7")
interest(1)
}
field(LNK5,DBF_FWDLINK) {
prompt("Forward Link 5")
promptgroup("51 - Output 0-7")
interest(1)
}
field(LNK6,DBF_FWDLINK) {
prompt("Forward Link 6")
promptgroup("51 - Output 0-7")
interest(1)
}
field(LNK7,DBF_FWDLINK) {
prompt("Forward Link 7")
promptgroup("51 - Output 0-7")
interest(1)
}
field(LNK8,DBF_FWDLINK) {
prompt("Forward Link 8")
promptgroup("52 - Output 8-F")
interest(1)
}
field(LNK9,DBF_FWDLINK) {
prompt("Forward Link 9")
promptgroup("52 - Output 8-F")
interest(1)
}
field(LNKA,DBF_FWDLINK) {
prompt("Forward Link 10")
promptgroup("52 - Output 8-F")
interest(1)
}
field(LNKB,DBF_FWDLINK) {
prompt("Forward Link 11")
promptgroup("52 - Output 8-F")
interest(1)
}
field(LNKC,DBF_FWDLINK) {
prompt("Forward Link 12")
promptgroup("52 - Output 8-F")
interest(1)
}
field(LNKD,DBF_FWDLINK) {
prompt("Forward Link 13")
promptgroup("52 - Output 8-F")
interest(1)
}
field(LNKE,DBF_FWDLINK) {
prompt("Forward Link 14")
promptgroup("52 - Output 8-F")
interest(1)
}
field(LNKF,DBF_FWDLINK) {
prompt("Forward Link 15")
promptgroup("52 - Output 8-F")
interest(1)
}
}
@@ -0,0 +1,314 @@
#*************************************************************************
# Copyright (c) 2012 UChicago Argonne LLC, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
=title Fanout Record (fanout)
The fanout record uses several forward processing links to force multiple
passive records to scan. When more than one record needs to be scanned as the
result of a record being processed, the forward link of that record can specify
a fanout record. The fanout record can specify up to sixteen other records to
process. If more than sixteen are needed, one of the forward links in the fanout
record (or its FLNK field) can point to another fanout record.
B<NOTE: Fanout records only propagate processing, not data.> The dfanout or
data fanout record can, on the other hand, send data to other records.
=head2 Parameter Fields
The fanout record's fields fall into the following categories:
=over
=item *
scan parameters
=item *
operator display parameters
=item *
run-time parameters.
=back
=recordtype fanout
=cut
menu(fanoutSELM) {
choice(fanoutSELM_All,"All")
choice(fanoutSELM_Specified,"Specified")
choice(fanoutSELM_Mask,"Mask")
}
recordtype(fanout) {
include "dbCommon.dbd"
=head3 Scan Parameters
The forward link fields of the fanout record (LNK0-LNK9, LNKA-LNKF) specify
records to be scanned. The records to be processed must specify C<Passive> in
their SCAN fields; otherwise the forward link will not cause them to process.
Also when specifying database links for the fanout record, the user needs only
to specify the record name. As no value is being sent or retrieved, a field name
is only required when the link will be over Channel Access, in which case the
field PROC must be named.
The SELM, SELN, and SELL fields specify the order of processing for the forward
links. The select mechanism menu field (SELM) has three choices:
=menu fanoutSELM
How the SELM value affects which links to process and in which order is as
follows:
=over
=item *
B<All>
Links are processed in numerical order - LNK0, LNK1, etc.
=item *
B<Specified> The sum of the values in the SELN and OFFS fields is used as the
specifier of which link to process. For instance, with OFFS=0 and SELN=1, the
record targeted by LNK1 will be processed.
=item *
B<Mask> The individual bits in SELN are shifted by SHFT bits (negative means
shift left) and the result used to select which links to process as follows:
=over
=item *
If bit 0 (LSB) is set, LNK0 is processed.
=item *
If bit 1 is set, LNK2 is processed.
=item *
If bit 2 is set, LNK3 is processed, etc.
=back
=back
SELN reads its value from SELL. SELL can be a constant, a database link, or a
channel access link. If a constant, SELN is initialized with the constant value
and can be changed via dbPuts. For database/channel access links, SELN is
retrieved from SELL each time the record is processed and can also be changed
via dbPuts.
The Fanout record also has the standard scanning fields common to all records.
These fields are listed in L<Scan Fields>. In addition,
L<Scanning Specification> explains in more detail how forward links and the
scanning algorithms work.
=fields SELM, SELN, SELL, OFFS, SHFT, LNK0, LNK1, LNK2, LNK3, LNK4, LNK5, LNK6, LNK7, LNK8, LNK9, LNKA, LNKB, LNKC, LNKD, LNKE, LNKF
=cut
field(VAL,DBF_LONG) {
prompt("Used to trigger")
asl(ASL0)
pp(TRUE)
}
field(SELM,DBF_MENU) {
prompt("Select Mechanism")
promptgroup("30 - Action")
interest(1)
menu(fanoutSELM)
}
field(SELN,DBF_USHORT) {
prompt("Link Selection")
interest(1)
initial("1")
}
field(SELL,DBF_INLINK) {
prompt("Link Selection Loc")
promptgroup("30 - Action")
interest(1)
}
field(OFFS,DBF_SHORT) {
prompt("Offset for Specified")
promptgroup("30 - Action")
interest(1)
initial("0")
}
field(SHFT,DBF_SHORT) {
prompt("Shift for Mask mode")
promptgroup("30 - Action")
interest(1)
initial("-1")
}
field(LNK0,DBF_FWDLINK) {
prompt("Forward Link 0")
promptgroup("51 - Output 0-7")
interest(1)
}
field(LNK1,DBF_FWDLINK) {
prompt("Forward Link 1")
promptgroup("51 - Output 0-7")
interest(1)
}
field(LNK2,DBF_FWDLINK) {
prompt("Forward Link 2")
promptgroup("51 - Output 0-7")
interest(1)
}
field(LNK3,DBF_FWDLINK) {
prompt("Forward Link 3")
promptgroup("51 - Output 0-7")
interest(1)
}
field(LNK4,DBF_FWDLINK) {
prompt("Forward Link 4")
promptgroup("51 - Output 0-7")
interest(1)
}
field(LNK5,DBF_FWDLINK) {
prompt("Forward Link 5")
promptgroup("51 - Output 0-7")
interest(1)
}
field(LNK6,DBF_FWDLINK) {
prompt("Forward Link 6")
promptgroup("51 - Output 0-7")
interest(1)
}
field(LNK7,DBF_FWDLINK) {
prompt("Forward Link 7")
promptgroup("51 - Output 0-7")
interest(1)
}
field(LNK8,DBF_FWDLINK) {
prompt("Forward Link 8")
promptgroup("52 - Output 8-F")
interest(1)
}
field(LNK9,DBF_FWDLINK) {
prompt("Forward Link 9")
promptgroup("52 - Output 8-F")
interest(1)
}
field(LNKA,DBF_FWDLINK) {
prompt("Forward Link 10")
promptgroup("52 - Output 8-F")
interest(1)
}
field(LNKB,DBF_FWDLINK) {
prompt("Forward Link 11")
promptgroup("52 - Output 8-F")
interest(1)
}
field(LNKC,DBF_FWDLINK) {
prompt("Forward Link 12")
promptgroup("52 - Output 8-F")
interest(1)
}
field(LNKD,DBF_FWDLINK) {
prompt("Forward Link 13")
promptgroup("52 - Output 8-F")
interest(1)
}
field(LNKE,DBF_FWDLINK) {
prompt("Forward Link 14")
promptgroup("52 - Output 8-F")
interest(1)
}
field(LNKF,DBF_FWDLINK) {
prompt("Forward Link 15")
promptgroup("52 - Output 8-F")
interest(1)
}
=head3 Operator Display Parameters
These parameters are used to present meaningful data to the operator. See
L<Fields Common to All Record Types> for more on these fields.
=fields NAME, DESC
=head3 Alarm Parameters
The Fanout record has the alarm parameters common to all record types.
L<Alarm Fields> lists other fields related to a alarms that are common to all
record types.
=head3 Run-time Parameters
The VAL field performs no specific function, but a Channel Access put to it will
cause the record to process.
=fields VAL
=head2 Record Support
=head3 Record Support Routines
=head4 init_record
This routine initializes SELN with the value of SELL, if SELL type is CONSTANT
link, or creates a channel access link if SELL type is PV_LINK.
=head4 process
See next section.
=head3 Record Processing
Routine process implements the following algorithm:
=over
=item 1.
PACT is set to TRUE.
=item 2.
The link selection SELN is fetched.
=item 3.
Depending on the selection mechanism, the link selection forward links are
processed, and UDF is set to FALSE.
=item 4.
Check to see if monitors should be invoked:
=over
=item *
Alarm monitors are invoked if the alarm status or severity has changed.
=item *
NSEV and NSTA are reset to 0.
=back
=item 5.
Scan forward link field FLNK if used, set PACT FALSE, and return.
=back
=cut
}
@@ -100,7 +100,7 @@ struct histogramdset { /* histogram input dset */
/* control block for callback*/
typedef struct myCallback {
CALLBACK callback;
epicsCallback callback;
histogramRecord *prec;
} myCallback;
@@ -110,7 +110,7 @@ static void monitor(histogramRecord *);
static long readValue(histogramRecord *);
static void wdogCallback(CALLBACK *arg)
static void wdogCallback(epicsCallback *arg)
{
myCallback *pcallback;
histogramRecord *prec;
@@ -403,9 +403,9 @@ static long readValue(histogramRecord *prec)
}
prec->pact = FALSE;
} else { /* !prec->pact && delay >= 0. */
CALLBACK *pvt = prec->simpvt;
epicsCallback *pvt = prec->simpvt;
if (!pvt) {
pvt = calloc(1, sizeof(CALLBACK)); /* very lazy allocation of callback structure */
pvt = calloc(1, sizeof(epicsCallback)); /* very lazy allocation of callback structure */
prec->simpvt = pvt;
}
if (pvt) callbackRequestProcessCallbackDelayed(pvt, prec->prio, prec, prec->sdly);
@@ -154,7 +154,7 @@ recordtype(histogram) {
prompt("Sim. Mode Private")
special(SPC_NOMOD)
interest(4)
extra("CALLBACK *simpvt")
extra("epicsCallback *simpvt")
}
field(HOPR,DBF_ULONG) {
prompt("High Operating Range")
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

+2 -2
View File
@@ -420,9 +420,9 @@ static long readValue(int64inRecord *prec)
}
prec->pact = FALSE;
} else { /* !prec->pact && delay >= 0. */
CALLBACK *pvt = prec->simpvt;
epicsCallback *pvt = prec->simpvt;
if (!pvt) {
pvt = calloc(1, sizeof(CALLBACK)); /* very lazy allocation of callback structure */
pvt = calloc(1, sizeof(epicsCallback)); /* very lazy allocation of callback structure */
prec->simpvt = pvt;
}
if (pvt) callbackRequestProcessCallbackDelayed(pvt, prec->prio, prec, prec->sdly);
@@ -313,7 +313,7 @@ simulation mode.
prompt("Sim. Mode Private")
special(SPC_NOMOD)
interest(4)
extra("CALLBACK *simpvt")
extra("epicsCallback *simpvt")
}
}
@@ -396,9 +396,9 @@ static long writeValue(int64outRecord *prec)
status = dbPutLink(&prec->siol, DBR_INT64, &prec->val, 1);
prec->pact = FALSE;
} else { /* !prec->pact && delay >= 0. */
CALLBACK *pvt = prec->simpvt;
epicsCallback *pvt = prec->simpvt;
if (!pvt) {
pvt = calloc(1, sizeof(CALLBACK)); /* very lazy allocation of callback structure */
pvt = calloc(1, sizeof(epicsCallback)); /* very lazy allocation of callback structure */
prec->simpvt = pvt;
}
if (pvt) callbackRequestProcessCallbackDelayed(pvt, prec->prio, prec, prec->sdly);
@@ -350,7 +350,7 @@ simulation mode.
prompt("Sim. Mode Private")
special(SPC_NOMOD)
interest(4)
extra("CALLBACK *simpvt")
extra("epicsCallback *simpvt")
}
=head3 Invalid Alarm Output Action
+2 -2
View File
@@ -428,9 +428,9 @@ static long readValue(longinRecord *prec)
}
prec->pact = FALSE;
} else { /* !prec->pact && delay >= 0. */
CALLBACK *pvt = prec->simpvt;
epicsCallback *pvt = prec->simpvt;
if (!pvt) {
pvt = calloc(1, sizeof(CALLBACK)); /* very lazy allocation of callback structure */
pvt = calloc(1, sizeof(epicsCallback)); /* very lazy allocation of callback structure */
prec->simpvt = pvt;
}
if (pvt) callbackRequestProcessCallbackDelayed(pvt, prec->prio, prec, prec->sdly);
@@ -1,188 +0,0 @@
#*************************************************************************
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
recordtype(longin) {
include "dbCommon.dbd"
field(VAL,DBF_LONG) {
prompt("Current value")
promptgroup("40 - Input")
asl(ASL0)
pp(TRUE)
}
field(INP,DBF_INLINK) {
prompt("Input Specification")
promptgroup("40 - Input")
interest(1)
}
field(EGU,DBF_STRING) {
prompt("Engineering Units")
promptgroup("80 - Display")
interest(1)
size(16)
prop(YES)
}
field(HOPR,DBF_LONG) {
prompt("High Operating Range")
promptgroup("80 - Display")
interest(1)
prop(YES)
}
field(LOPR,DBF_LONG) {
prompt("Low Operating Range")
promptgroup("80 - Display")
interest(1)
prop(YES)
}
field(HIHI,DBF_LONG) {
prompt("Hihi Alarm Limit")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
}
field(LOLO,DBF_LONG) {
prompt("Lolo Alarm Limit")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
}
field(HIGH,DBF_LONG) {
prompt("High Alarm Limit")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
}
field(LOW,DBF_LONG) {
prompt("Low Alarm Limit")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
}
field(HHSV,DBF_MENU) {
prompt("Hihi Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(LLSV,DBF_MENU) {
prompt("Lolo Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(HSV,DBF_MENU) {
prompt("High Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(LSV,DBF_MENU) {
prompt("Low Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(HYST,DBF_LONG) {
prompt("Alarm Deadband")
promptgroup("70 - Alarm")
interest(1)
}
field(AFTC, DBF_DOUBLE) {
prompt("Alarm Filter Time Constant")
promptgroup("70 - Alarm")
interest(1)
}
field(AFVL, DBF_DOUBLE) {
prompt("Alarm Filter Value")
special(SPC_NOMOD)
interest(3)
}
field(ADEL,DBF_LONG) {
prompt("Archive Deadband")
promptgroup("80 - Display")
interest(1)
}
field(MDEL,DBF_LONG) {
prompt("Monitor Deadband")
promptgroup("80 - Display")
interest(1)
}
field(LALM,DBF_LONG) {
prompt("Last Value Alarmed")
special(SPC_NOMOD)
interest(3)
}
field(ALST,DBF_LONG) {
prompt("Last Value Archived")
special(SPC_NOMOD)
interest(3)
}
field(MLST,DBF_LONG) {
prompt("Last Val Monitored")
special(SPC_NOMOD)
interest(3)
}
field(SIOL,DBF_INLINK) {
prompt("Simulation Input Link")
promptgroup("90 - Simulate")
interest(1)
}
field(SVAL,DBF_LONG) {
prompt("Simulation Value")
}
field(SIML,DBF_INLINK) {
prompt("Simulation Mode Link")
promptgroup("90 - Simulate")
interest(1)
}
field(SIMM,DBF_MENU) {
prompt("Simulation Mode")
special(SPC_MOD)
interest(1)
menu(menuYesNo)
}
field(SIMS,DBF_MENU) {
prompt("Simulation Mode Severity")
promptgroup("90 - Simulate")
interest(2)
menu(menuAlarmSevr)
}
field(OLDSIMM,DBF_MENU) {
prompt("Prev. Simulation Mode")
special(SPC_NOMOD)
interest(4)
menu(menuSimm)
}
field(SSCN,DBF_MENU) {
prompt("Sim. Mode Scan")
promptgroup("90 - Simulate")
interest(1)
menu(menuScan)
initial("65535")
}
field(SDLY,DBF_DOUBLE) {
prompt("Sim. Mode Async Delay")
promptgroup("90 - Simulate")
interest(2)
initial("-1.0")
}
%#include "callback.h"
field(SIMPVT,DBF_NOACCESS) {
prompt("Sim. Mode Private")
special(SPC_NOMOD)
interest(4)
extra("CALLBACK *simpvt")
}
}
@@ -0,0 +1,485 @@
#*************************************************************************
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
=title Long Input Record (longin)
The normal use for the long input record or "longin" record is to retrieve a
long integer value of up to 32 bits. Device support routines are provided to
support direct interfaces to hardware. In addition, the C<<< Soft Channel >>>
device module is provided to obtain input via database or channel access links
or via dbPutField or dbPutLink requests.
=recordtype longin
=cut
recordtype(longin) {
=head2 Parameter Fields
The record-specific fields are described below, grouped by functionality.
=head3 Scan Parameters
The long input record has the standard fields for specifying under what
circumstances the record will be processed. These fields are listed in L<Scan
Fields>. In addition, L<Scanning Specification> explains how these fields are
used. Note that I/O event scanning is only supported for those card types
that interrupt.
=head3 Read Parameters
The device support routines use the INP field to obtain the record's input. For
records that obtain their input from devices, the INP field must contain the
address of the I/O card, and the DTYP field must specify the proper device
support module. Be aware that the address format differs according to the
I/O bus used.
For soft records, the INP can be a constant, a database link, or a channel
access link. The value is read directly into VAL. The C<<< Soft Channel >>>
device support module is available for longin records. See L<Address
Specification> for information on the format of hardware addresses and a
database links.
=fields VAL, INP, DTYP
=head3 Operator Display Parameters
These parameters are used to present meaningful data to the operator. These
fields are used to display the value and other parameters of the long input
either textually or graphically.
EGU is a string of up to 16 characters describing the units that the long input
measures. It is retrieved by the C<<< get_units >>> record support routine.
The HOPR and LOPR fields set the upper and lower display limits for the VAL,
HIHI, HIGH, LOW, and LOLO fields. Both the C<<< get_graphic_double >>> and C<<<
get_control_double >>> record support routines retrieve these fields.
See L<Fields Common to All Record Types> for more on the record name (NAME) and
description (DESC) fields.
=fields EGU, HOPR, LOPR, NAME, DESC
=head3 Alarm Parameters
The possible alarm conditions for long inputs are the SCAN, READ, and limit
alarms. The SCAN and READ alarms are called by the record or device support
routines.
The limit alarms are configured by the user in the HIHI, LOLO, HIGH, and LOW
fields using numerical values. For each of these fields, there is a
corresponding severity field which can be either NO_ALARM, MINOR, or MAJOR. The
HYST field can be used to specify a deadband around each limit. See L<Alarm
Specification> for a complete explanation of alarms and these fields. L<Alarm
Fields> lists other fields related to a alarms that are common to all record
types.
=fields HIHI, HIGH, LOW, LOLO, HHSV, HSV, LSV, LLSV, HYST
=head3 Monitor Parameters
These parameters are used to determine when to send monitors placed on the value
field. The monitors are sent when the value field exceeds the last monitored
field (see the next section) by the appropriate deadband. If these fields have a
value of zero, everytime the value changes, a monitor will be triggered; if they
have a value of -1, everytime the record is scanned, monitors are triggered. The
ADEL field is used by archive monitors and the MDEL field for all other types of
monitors. See L<Monitor Specification> for a complete explanation of monitors.
=fields ADEL, MDEL
=head3 Run-time and Simulation Mode Parameters
The LALM, MLST, and ALST fields are used to implement the hysteresis factors for
monitor callbacks. Only if the difference between these fields and the
corresponding value field is greater than the appropriate delta (MDEL, ADEL,
HYST)--only then are monitors triggered. For instance, only if the difference
between VAL and MLST is greater than MDEL are the monitors triggered for VAL.
=fields LALM, ALST, MLST
The following fields are used to operate the long input in the simulation mode.
See L<Fields Common to Many Record Types> for more information on these fields.
=fields SIOL, SVAL, SIML, SIMM, SIMS
=head2 Record Support
=head3 Record Support Routines
=head4 init_record
This routine initializes SIMM with the value of SIML if SIML type is CONSTANT
link or creates a channel access link if SIML type is PV_LINK. SVAL is likewise
initialized if SIOL is CONSTANT or PV_LINK.
This routine next checks to see that device support is available and a device
support read routine is defined. If either does not exist, an error message is
issued and processing is terminated.
If device support includes C<init_record()>, it is called.
=head4 process
See next section.
=head4 get_units
Retrieves EGU.
=head4 get_graphic_double
Sets the upper display and lower display limits for a field. If the field is
VAL, HIHI, HIGH, LOW, or LOLO, the limits are set to HOPR and LOPR, else if the
field has upper and lower limits defined they will be used, else the upper and
lower maximum values for the field type will be used.
=head4 get_control_double
Sets the upper control and the lower control limits for a field. If the field is
VAL, HIHI, HIGH, LOW, or LOLO, the limits are set to HOPR and LOPR, else if the
field has upper and lower limits defined they will be used, else the upper and
lower maximum values for the field type will be used.
=head4 get_alarm_double
Sets the following values:
upper_alarm_limit = HIHI
upper_warning_limit = HIGH
lower_warning_limit = LOW
lower_alarm_limit = LOLO
=head3 Record Processing
Routine process implements the following algorithm:
=over
=item 1.
Check to see that the appropriate device support module exists. If it doesn't,
an error message is issued and processing is terminated with the PACT field
still set to TRUE. This ensures that processes will no longer be called for this
record. Thus error storms will not occur.
=item 2.
readValue is called. See L<Input Records> for more information.
=item 3.
If PACT has been changed to TRUE, the device support read routine has started
but has not completed reading a new input value. In this case, the processing
routine merely returns, leaving PACT TRUE.
=item 4.
Check alarms. This routine checks to see if the new VAL causes the alarm status
and severity to change. If so, NSEV, NSTA and LALM are set. It also honors the
alarm hysteresis factor (HYST). Thus the value must change by more than HYST
before the alarm status and severity is lowered.
=item 5.
Check to see if monitors should be invoked:
=over
=item *
Alarm monitors are invoked if the alarm status or severity has changed.
=item *
Archive and value change monitors are invoked if ADEL and MDEL conditions are
met.
=item *
NSEV and NSTA are reset to 0.
=back
=item 6.
Scan forward link if necessary, set PACT FALSE, and return.
=back
=begin html
<br><hr><br>
=end html
=head2 Device Support
=head3 Fields Of Interest To Device Support
Each long input record must have an associated set of device support routines.
The primary responsibility of the device support routines is to obtain a new
input value whenever read_longin is called. The device support routines are
primarily interested in the following fields:
=fields PACT, DPVT, UDF, NSEV, NSTA, VAL, INP
=head3 Device Support Routines
Device support consists of the following routines:
=head4 long report(int level)
This optional routine is called by the IOC command C<dbior> and is passed the
report level that was requested by the user.
It should print a report on the state of the device support to stdout.
The C<level> parameter may be used to output increasingly more detailed
information at higher levels, or to select different types of information with
different levels.
Level zero should print no more than a small summary.
=head4 long init(int after)
This optional routine is called twice at IOC initialization time.
The first call happens before any of the C<init_record()> calls are made, with
the integer parameter C<after> set to 0.
The second call happens after all of the C<init_record()> calls have been made,
with C<after> set to 1.
=head4 init_record
init_record(precord)
This routine is optional. If provided, it is called by the record support
C<init_record()> routine.
=head4 get_ioint_info
get_ioint_info(int cmd,struct dbCommon *precord,IOSCANPVT *ppvt)
This routine is called by the ioEventScan system each time the record is added
or deleted from an I/O event scan list. cmd has the value (0,1) if the
record is being (added to, deleted from) an I/O event list. It must be
provided for any device type that can use the ioEvent scanner.
=head4 read_longin
read_longin(precord)
This routine must provide a new input value. It returns the following values:
=over
=item *
0: Success. A new value is placed in VAL.
=item *
Other: Error.
=back
=head3 Device Support For Soft Records
The C<<< Soft Channel >>> device support module places a value directly in VAL.
If the INP link type is constant, then the constant value is stored into VAL by
C<init_record()>, and UDF is set to FALSE. If the INP link type is PV_LINK, then
dbCaAddInlink is called by C<init_record()>.
C<<< read_longin >>> calls recGblGetLinkValue to read the current value of VAL.
See L<Soft Input> for more information
If the return status of C<<< recGblGetLinkValue >>> is zero then read_longin
sets UDF to FALSE. read_longin returns the status of C<recGblGetLinkValue>.
=cut
include "dbCommon.dbd"
field(VAL,DBF_LONG) {
prompt("Current value")
promptgroup("40 - Input")
asl(ASL0)
pp(TRUE)
}
field(INP,DBF_INLINK) {
prompt("Input Specification")
promptgroup("40 - Input")
interest(1)
}
field(EGU,DBF_STRING) {
prompt("Engineering Units")
promptgroup("80 - Display")
interest(1)
size(16)
prop(YES)
}
field(HOPR,DBF_LONG) {
prompt("High Operating Range")
promptgroup("80 - Display")
interest(1)
prop(YES)
}
field(LOPR,DBF_LONG) {
prompt("Low Operating Range")
promptgroup("80 - Display")
interest(1)
prop(YES)
}
field(HIHI,DBF_LONG) {
prompt("Hihi Alarm Limit")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
}
field(LOLO,DBF_LONG) {
prompt("Lolo Alarm Limit")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
}
field(HIGH,DBF_LONG) {
prompt("High Alarm Limit")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
}
field(LOW,DBF_LONG) {
prompt("Low Alarm Limit")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
}
field(HHSV,DBF_MENU) {
prompt("Hihi Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(LLSV,DBF_MENU) {
prompt("Lolo Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(HSV,DBF_MENU) {
prompt("High Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(LSV,DBF_MENU) {
prompt("Low Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(HYST,DBF_LONG) {
prompt("Alarm Deadband")
promptgroup("70 - Alarm")
interest(1)
}
field(AFTC, DBF_DOUBLE) {
prompt("Alarm Filter Time Constant")
promptgroup("70 - Alarm")
interest(1)
}
field(AFVL, DBF_DOUBLE) {
prompt("Alarm Filter Value")
special(SPC_NOMOD)
interest(3)
}
field(ADEL,DBF_LONG) {
prompt("Archive Deadband")
promptgroup("80 - Display")
interest(1)
}
field(MDEL,DBF_LONG) {
prompt("Monitor Deadband")
promptgroup("80 - Display")
interest(1)
}
field(LALM,DBF_LONG) {
prompt("Last Value Alarmed")
special(SPC_NOMOD)
interest(3)
}
field(ALST,DBF_LONG) {
prompt("Last Value Archived")
special(SPC_NOMOD)
interest(3)
}
field(MLST,DBF_LONG) {
prompt("Last Val Monitored")
special(SPC_NOMOD)
interest(3)
}
field(SIOL,DBF_INLINK) {
prompt("Sim Input Specifctn")
promptgroup("90 - Simulate")
interest(1)
}
field(SVAL,DBF_LONG) {
prompt("Simulation Value")
}
field(SIML,DBF_INLINK) {
prompt("Sim Mode Location")
promptgroup("90 - Simulate")
interest(1)
}
field(SIMM,DBF_MENU) {
prompt("Simulation Mode")
special(SPC_MOD)
interest(1)
menu(menuYesNo)
}
field(SIMS,DBF_MENU) {
prompt("Sim mode Alarm Svrty")
promptgroup("90 - Simulate")
interest(2)
menu(menuAlarmSevr)
}
field(OLDSIMM,DBF_MENU) {
prompt("Prev. Simulation Mode")
special(SPC_NOMOD)
interest(4)
menu(menuSimm)
}
field(SSCN,DBF_MENU) {
prompt("Sim. Mode Scan")
promptgroup("90 - Simulate")
interest(1)
menu(menuScan)
initial("65535")
}
field(SDLY,DBF_DOUBLE) {
prompt("Sim. Mode Async Delay")
promptgroup("90 - Simulate")
interest(2)
initial("-1.0")
}
%#include "callback.h"
field(SIMPVT,DBF_NOACCESS) {
prompt("Sim. Mode Private")
special(SPC_NOMOD)
interest(4)
extra("epicsCallback *simpvt")
}
}
+2 -2
View File
@@ -401,9 +401,9 @@ static long writeValue(longoutRecord *prec)
status = dbPutLink(&prec->siol, DBR_LONG, &prec->val, 1);
prec->pact = FALSE;
} else { /* !prec->pact && delay >= 0. */
CALLBACK *pvt = prec->simpvt;
epicsCallback *pvt = prec->simpvt;
if (!pvt) {
pvt = calloc(1, sizeof(CALLBACK)); /* very lazy allocation of callback structure */
pvt = calloc(1, sizeof(epicsCallback)); /* very lazy allocation of callback structure */
prec->simpvt = pvt;
}
if (pvt) callbackRequestProcessCallbackDelayed(pvt, prec->prio, prec, prec->sdly);
@@ -1,211 +0,0 @@
#*************************************************************************
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
recordtype(longout) {
include "dbCommon.dbd"
field(VAL,DBF_LONG) {
prompt("Desired Output")
promptgroup("50 - Output")
asl(ASL0)
pp(TRUE)
}
field(OUT,DBF_OUTLINK) {
prompt("Output Specification")
promptgroup("50 - Output")
interest(1)
}
field(DOL,DBF_INLINK) {
prompt("Desired Output Loc")
promptgroup("40 - Input")
interest(1)
}
field(OMSL,DBF_MENU) {
prompt("Output Mode Select")
promptgroup("50 - Output")
interest(1)
menu(menuOmsl)
}
field(EGU,DBF_STRING) {
prompt("Engineering Units")
promptgroup("80 - Display")
interest(1)
size(16)
prop(YES)
}
field(DRVH,DBF_LONG) {
prompt("Drive High Limit")
promptgroup("30 - Action")
pp(TRUE)
interest(1)
prop(YES)
}
field(DRVL,DBF_LONG) {
prompt("Drive Low Limit")
promptgroup("30 - Action")
pp(TRUE)
interest(1)
prop(YES)
}
field(HOPR,DBF_LONG) {
prompt("High Operating Range")
promptgroup("80 - Display")
interest(1)
prop(YES)
}
field(LOPR,DBF_LONG) {
prompt("Low Operating Range")
promptgroup("80 - Display")
interest(1)
prop(YES)
}
field(HIHI,DBF_LONG) {
prompt("Hihi Alarm Limit")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
}
field(LOLO,DBF_LONG) {
prompt("Lolo Alarm Limit")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
}
field(HIGH,DBF_LONG) {
prompt("High Alarm Limit")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
}
field(LOW,DBF_LONG) {
prompt("Low Alarm Limit")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
}
field(HHSV,DBF_MENU) {
prompt("Hihi Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(LLSV,DBF_MENU) {
prompt("Lolo Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(HSV,DBF_MENU) {
prompt("High Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(LSV,DBF_MENU) {
prompt("Low Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(HYST,DBF_LONG) {
prompt("Alarm Deadband")
promptgroup("70 - Alarm")
interest(1)
}
field(ADEL,DBF_LONG) {
prompt("Archive Deadband")
promptgroup("80 - Display")
interest(1)
}
field(MDEL,DBF_LONG) {
prompt("Monitor Deadband")
promptgroup("80 - Display")
interest(1)
}
field(LALM,DBF_LONG) {
prompt("Last Value Alarmed")
special(SPC_NOMOD)
interest(3)
}
field(ALST,DBF_LONG) {
prompt("Last Value Archived")
special(SPC_NOMOD)
interest(3)
}
field(MLST,DBF_LONG) {
prompt("Last Val Monitored")
special(SPC_NOMOD)
interest(3)
}
field(SIOL,DBF_OUTLINK) {
prompt("Simulation Output Link")
promptgroup("90 - Simulate")
interest(1)
}
field(SIML,DBF_INLINK) {
prompt("Simulation Mode Link")
promptgroup("90 - Simulate")
interest(1)
}
field(SIMM,DBF_MENU) {
prompt("Simulation Mode")
special(SPC_MOD)
interest(1)
menu(menuYesNo)
}
field(SIMS,DBF_MENU) {
prompt("Simulation Mode Severity")
promptgroup("90 - Simulate")
interest(2)
menu(menuAlarmSevr)
}
field(OLDSIMM,DBF_MENU) {
prompt("Prev. Simulation Mode")
special(SPC_NOMOD)
interest(4)
menu(menuSimm)
}
field(SSCN,DBF_MENU) {
prompt("Sim. Mode Scan")
promptgroup("90 - Simulate")
interest(1)
menu(menuScan)
initial("65535")
}
field(SDLY,DBF_DOUBLE) {
prompt("Sim. Mode Async Delay")
promptgroup("90 - Simulate")
interest(2)
initial("-1.0")
}
%#include "callback.h"
field(SIMPVT,DBF_NOACCESS) {
prompt("Sim. Mode Private")
special(SPC_NOMOD)
interest(4)
extra("CALLBACK *simpvt")
}
field(IVOA,DBF_MENU) {
prompt("INVALID output action")
promptgroup("50 - Output")
interest(2)
menu(menuIvoa)
}
field(IVOV,DBF_LONG) {
prompt("INVALID output value")
promptgroup("50 - Output")
interest(2)
}
}
@@ -0,0 +1,589 @@
#*************************************************************************
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
=title Long Output Record (longout)
The normal use for the long output or "longout" record type is to store long
integer values of up to 32 bits and write them to hardware devices. The C<<<
Soft Channel >>> device support layer can also be used to write values to
other records via database or channel access links. The OUT field determines how
the record is used. The record supports alarm limits and graphics and control
limits.
=recordtype longout
=cut
recordtype(longout) {
=head2 Parameter Fields
The fields in this record fall into the following categories:
=over
=item * L<Scan Parameters>
=item * L<Desired Output Parameters>
=item * L<Write Parameters>
=item * L<Operator Display Parameters>
=item * L<Alarm Parameters>
=item * L<Monitor Parameters>
=item * L<Simulation Mode Parameters>
=back
=head3 Scan Parameters
The longout record has the standard fields for specifying under what
circumstances it will be processed. These fields are listed in L<Scan Fields>.
In addition, L<Scanning Specification> explains how these fields are used. Note
that I/O event scanning is only supported for those card types that
interrupt.
=head3 Desired Output Parameters
The record must specify where the desired output originates, i.e., the 32 bit
integer value it is to write. The output mode select (OMSL) field determines
whether the output originates from another record or from database access. When
set to C<<< closed_loop >>>, the desired output is retrieved from the link
specified in the desired output (DOL) field (which can specify either a database
or channel access link) and placed into the VAL field. When set to C<<<
supervisory >>>, the desired output can be written into the VAL field via dpPuts
at run-time.
A third type of value for the DOL field is a constant in which case, when the
record is initialized, the VAL field will be initialized with this constant
value.
The VAL field's value will be clipped within limits specified in the fields DRVH
and DRVL if these have been configured by the database designer:
DRVL <= VAL <= DRVH
Note: These limits are only enforced as long as DRVH E<gt> DRVL. If they are not
set or DRVH E<lt>= DRVL they will not be used.
=fields DOL, OMSL, DRVH, DRVL, VAL
=head3 Write Parameters
The OUT link field determines where the record is to send its output. For
records that write values to hardware devices, the OUT output link field must
specify the address of the I/O card, and the DTYP field must specify the
name of the corresponding device support module.
For soft records, the OUT output link can be a constant, a database link, or a
channel access link. If the link is a constant, the result is no output. The
DTYP field must then specify the C<<< Soft Channel >>> device support routine.
See L<Address Specification> for information on the format of hardware addresses
and database links.
=fields OUT, DTYP
=cut
include "dbCommon.dbd"
field(VAL,DBF_LONG) {
prompt("Desired Output")
promptgroup("50 - Output")
asl(ASL0)
pp(TRUE)
}
field(OUT,DBF_OUTLINK) {
prompt("Output Specification")
promptgroup("50 - Output")
interest(1)
}
field(DOL,DBF_INLINK) {
prompt("Desired Output Loc")
promptgroup("40 - Input")
interest(1)
}
field(OMSL,DBF_MENU) {
prompt("Output Mode Select")
promptgroup("50 - Output")
interest(1)
menu(menuOmsl)
}
=head3 Operator Display Parameters
These parameters are used to present meaningful data to the operator. They
display the value and other parameters of the long output either textually or
graphically.
EGU is a string of up to 16 characters describing the units that the long output
measures. It is retrieved by the C<<< get_units >>> record support routine.
The HOPR and LOPR fields set the upper and lower display limits for the VAL,
HIHI, HIGH, LOW, and LOLO fields. Both the C<<< get_graphic_double >>> and C<<<
get_control_double >>> record support routines retrieve these fields.
See L<Fields Common to All Record Types> for more on the record name (NAME) and
description (DESC) fields.
=fields EGU, HOPR, LOPR, NAME, DESC
=cut
field(EGU,DBF_STRING) {
prompt("Engineering Units")
promptgroup("80 - Display")
interest(1)
size(16)
prop(YES)
}
field(DRVH,DBF_LONG) {
prompt("Drive High Limit")
promptgroup("30 - Action")
pp(TRUE)
interest(1)
prop(YES)
}
field(DRVL,DBF_LONG) {
prompt("Drive Low Limit")
promptgroup("30 - Action")
pp(TRUE)
interest(1)
prop(YES)
}
field(HOPR,DBF_LONG) {
prompt("High Operating Range")
promptgroup("80 - Display")
interest(1)
prop(YES)
}
field(LOPR,DBF_LONG) {
prompt("Low Operating Range")
promptgroup("80 - Display")
interest(1)
prop(YES)
}
=head3 Alarm Parameters
The possible alarm conditions for long inputs are the SCAN, READ, INVALID, and
limit alarms. The SCAN and READ alarms are not configurable by the user because
their severity is always MAJOR. The INVALID alarm is called by the record
support routine when the record or device support routines cannot write the
record's output. The IVOA field specifies the action to take in this case.
The limit alarms are configured by the user in the HIHI, LOLO, HIGH, and LOW
fields using floating-point values. For each of these fields, there is a
corresponding severity field which can be either NO_ALARM, MINOR, or MAJOR. The
HYST field contains the alarm deadband around each limit alarm.
See the See L<Alarm Specification> for a complete explanation of alarms and
these fields. For an explanation of the IVOA and IVOV fields, see L<Output
Records>. L<Alarm Fields> lists other fields related to a alarms that are common
to all record types.
=fields HIHI, HIGH, LOW, LOLO, HHSV, HSV, LSV, LLSV, HYST, IVOA, IVOV
=cut
field(HIHI,DBF_LONG) {
prompt("Hihi Alarm Limit")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
}
field(LOLO,DBF_LONG) {
prompt("Lolo Alarm Limit")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
}
field(HIGH,DBF_LONG) {
prompt("High Alarm Limit")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
}
field(LOW,DBF_LONG) {
prompt("Low Alarm Limit")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
}
field(HHSV,DBF_MENU) {
prompt("Hihi Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(LLSV,DBF_MENU) {
prompt("Lolo Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(HSV,DBF_MENU) {
prompt("High Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(LSV,DBF_MENU) {
prompt("Low Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(HYST,DBF_LONG) {
prompt("Alarm Deadband")
promptgroup("70 - Alarm")
interest(1)
}
=head3 Monitor Parameters
These parameters are used to determine when to send monitors placed on the value
field. The monitors are sent when the value field exceeds the last monitored
field by the appropriate delta. If these fields have a value of zero, everytime
the value changes, a monitor will be triggered; if they have a value of -1,
everytime the record is scanned, monitors are triggered. The ADEL field is the
delta for archive monitors, and the MDEL field is the delta for all other types
of monitors. See L<Monitor Specification> for a complete explanation of
monitors.
=fields ADEL, MDEL
=cut
field(ADEL,DBF_LONG) {
prompt("Archive Deadband")
promptgroup("80 - Display")
interest(1)
}
field(MDEL,DBF_LONG) {
prompt("Monitor Deadband")
promptgroup("80 - Display")
interest(1)
}
field(LALM,DBF_LONG) {
prompt("Last Value Alarmed")
special(SPC_NOMOD)
interest(3)
}
field(ALST,DBF_LONG) {
prompt("Last Value Archived")
special(SPC_NOMOD)
interest(3)
}
field(MLST,DBF_LONG) {
prompt("Last Val Monitored")
special(SPC_NOMOD)
interest(3)
}
=head3 Run-time and Simulation Mode Parameters
The LALM, MLST, and ALST fields are used to implement the hysteresis factors for
monitor callbacks. Only if the difference between these fields and the
corresponding value field is greater than the appropriate delta (MDEL, ADEL,
HYST)--only then are monitors triggered. For instance, only if the difference
between VAL and MLST is greater than MDEL are the monitors triggered for VAL.
=fields LALM, ALST, MLST
The following fields are used to operate the long output in the simulation mode.
See L<Fields Common to Many Record Types> for more information on the simulation
mode fields
=fields SIOL, SIML, SIMM, SIMS
=cut
field(SIOL,DBF_OUTLINK) {
prompt("Sim Output Specifctn")
promptgroup("90 - Simulate")
interest(1)
}
field(SIML,DBF_INLINK) {
prompt("Sim Mode Location")
promptgroup("90 - Simulate")
interest(1)
}
field(SIMM,DBF_MENU) {
prompt("Simulation Mode")
special(SPC_MOD)
interest(1)
menu(menuYesNo)
}
field(SIMS,DBF_MENU) {
prompt("Sim mode Alarm Svrty")
promptgroup("90 - Simulate")
interest(2)
menu(menuAlarmSevr)
}
field(OLDSIMM,DBF_MENU) {
prompt("Prev. Simulation Mode")
special(SPC_NOMOD)
interest(4)
menu(menuSimm)
}
field(SSCN,DBF_MENU) {
prompt("Sim. Mode Scan")
promptgroup("90 - Simulate")
interest(1)
menu(menuScan)
initial("65535")
}
field(SDLY,DBF_DOUBLE) {
prompt("Sim. Mode Async Delay")
promptgroup("90 - Simulate")
interest(2)
initial("-1.0")
}
%#include "callback.h"
field(SIMPVT,DBF_NOACCESS) {
prompt("Sim. Mode Private")
special(SPC_NOMOD)
interest(4)
extra("epicsCallback *simpvt")
}
field(IVOA,DBF_MENU) {
prompt("INVALID output action")
promptgroup("50 - Output")
interest(2)
menu(menuIvoa)
}
field(IVOV,DBF_LONG) {
prompt("INVALID output value")
promptgroup("50 - Output")
interest(2)
}
=begin html
<br><hr><br>
=end html
=head2 Record Support
=head3 Record Support Routines
=head4 init_record
This routine initializes SIMM if SIML is a constant or creates a channel access
link if SIML is PV_LINK. If SIOL is PV_LINK a channel access link is created.
This routine next checks to see that device support is available. The routine
next checks to see if the device support write routine is defined.
If either device support or the device support write routine does not exist, an
error message is issued and processing is terminated.
If DOL is a constant, then VAL is initialized to its value and UDF is set to
FALSE. If DOL type is a PV_LINK then dbCaAddInlink is called to create a channel
access link.
If device support includes C<init_record()>, it is called.
=head4 process
See next section.
=head4 get_units
Retrieves EGU.
=head4 get_graphic_double
Sets the upper display and lower display limits for a field. If the field is
VAL, HIHI, HIGH, LOW, or LOLO, the limits are set to HOPR and LOPR, else if the
field has upper and lower limits defined they will be used, else the upper and
lower maximum values for the field type will be used.
=head4 get_control_double
Sets the upper control and the lower control limits for a field. If the field is
VAL, HIHI, HIGH, LOW, or LOLO, the limits are set to HOPR and LOPR, else if the
field has upper and lower limits defined they will be used, else the upper and
lower maximum values for the field type will be used.
=head4 get_alarm_double
Sets the following values:
upper_alarm_limit = HIHI
upper_warning_limit = HIGH
lower_warning_limit = LOW
lower_alarm_limit = LOLO
=head3 Record Processing
Routine process implements the following algorithm:
=over
=item 1.
Check to see that the appropriate device support module exists. If it doesn't,
an error message is issued and processing is terminated with the PACT field
still set to TRUE. This ensures that processes will no longer be called for this
record. Thus error storms will not occur.
=item 2.
If PACT is FALSE and OMSL is CLOSED_LOOP recGblGetLinkValue is called to read
the current value of VAL. See L<Output Records> for more information. If the
return status of recGblGetLinkValue is zero then UDF is set to FALSE.
=item 3.
Check alarms. This routine checks to see if the new VAL causes the alarm status
and severity to change. If so, NSEV, NSTA and LALM are set. It also honors the
alarm hysteresis factor (HYST). Thus the value must change by more than HYST
before the alarm status and severity is lowered.
=item 4.
Check severity and write the new value. See L<Invalid Alarm Output Action> for
information on how INVALID alarms affect output records.
=item 5.
If PACT has been changed to TRUE, the device support write output routine has
started but has not completed writing the new value. In this case, the
processing routine merely returns, leaving PACT TRUE.
=item 6.
Check to see if monitors should be invoked:
=over
=item *
Alarm monitors are invoked if the alarm status or severity has changed.
=item *
Archive and value change monitors are invoked if ADEL and MDEL conditions are
met.
=item *
NSEV and NSTA are reset to 0.
=back
=item 7.
Scan forward link if necessary, set PACT FALSE, and return.
=back
=begin html
<br><hr><br>
=end html
=head2 Device Support
=head3 Fields Of Interest To Device Support
Each long output record must have an associated set of device support routines.
The primary responsibility of the device support routines is to output a new
value whenever write_longout is called. The device support routines are
primarily interested in the following fields:
=fields PACT, DPVT, NSEV, NSTA, OUT
=head3 Device Support Routines
Device support consists of the following routines:
=head4 long report(int level)
This optional routine is called by the IOC command C<dbior> and is passed the
report level that was requested by the user.
It should print a report on the state of the device support to stdout.
The C<level> parameter may be used to output increasingly more detailed
information at higher levels, or to select different types of information with
different levels.
Level zero should print no more than a small summary.
=head4 long init(int after)
This optional routine is called twice at IOC initialization time.
The first call happens before any of the C<init_record()> calls are made, with
the integer parameter C<after> set to 0.
The second call happens after all of the C<init_record()> calls have been made,
with C<after> set to 1.
=head4 init_record
init_record(precord)
This routine is optional. If provided, it is called by the record support
C<init_record()> routine.
=head4 get_ioint_info
get_ioint_info(int cmd,struct dbCommon *precord,IOSCANPVT *ppvt)
This routine is called by the ioEventScan system each time the record is added
or deleted from an I/O event scan list. cmd has the value (0,1) if the
record is being (added to, deleted from) an I/O event list. It must be
provided for any device type that can use the ioEvent scanner.
=head4 write_longout
write_longout(precord)
This routine must output a new value. It returns the following values:
=over
=item *
0: Success.
=item *
Other: Error.
=back
=head3 Device Support For Soft Records
The C<<< Soft Channel >>> module writes the current value of VAL.
If the OUT link type is PV_LINK, then dbCaAddInlink is called by
C<init_record()>.
write_longout calls recGblPutLinkValue to write the current value of VAL.
See L<Soft Output> for a further explanation.
=cut
} #end of the DBD file
+2 -2
View File
@@ -241,9 +241,9 @@ static long readValue(lsiRecord *prec)
if (status == 0) prec->udf = FALSE;
prec->pact = FALSE;
} else { /* !prec->pact && delay >= 0. */
CALLBACK *pvt = prec->simpvt;
epicsCallback *pvt = prec->simpvt;
if (!pvt) {
pvt = calloc(1, sizeof(CALLBACK)); /* very lazy allocation of callback structure */
pvt = calloc(1, sizeof(epicsCallback)); /* very lazy allocation of callback structure */
prec->simpvt = pvt;
}
if (pvt) callbackRequestProcessCallbackDelayed(pvt, prec->prio, prec, prec->sdly);
+1 -1
View File
@@ -110,6 +110,6 @@ recordtype(lsi) {
prompt("Sim. Mode Private")
special(SPC_NOMOD)
interest(4)
extra("CALLBACK *simpvt")
extra("epicsCallback *simpvt")
}
}
+2 -2
View File
@@ -282,9 +282,9 @@ static long writeValue(lsoRecord *prec)
status = dbPutLinkLS(&prec->siol, prec->val, prec->len);
prec->pact = FALSE;
} else { /* !prec->pact && delay >= 0. */
CALLBACK *pvt = prec->simpvt;
epicsCallback *pvt = prec->simpvt;
if (!pvt) {
pvt = calloc(1, sizeof(CALLBACK)); /* very lazy allocation of callback structure */
pvt = calloc(1, sizeof(epicsCallback)); /* very lazy allocation of callback structure */
prec->simpvt = pvt;
}
if (pvt) callbackRequestProcessCallbackDelayed(pvt, prec->prio, prec, prec->sdly);
+1 -1
View File
@@ -134,6 +134,6 @@ recordtype(lso) {
prompt("Sim. Mode Private")
special(SPC_NOMOD)
interest(4)
extra("CALLBACK *simpvt")
extra("epicsCallback *simpvt")
}
}
@@ -277,9 +277,9 @@ static long readValue(mbbiDirectRecord *prec)
}
prec->pact = FALSE;
} else { /* !prec->pact && delay >= 0. */
CALLBACK *pvt = prec->simpvt;
epicsCallback *pvt = prec->simpvt;
if (!pvt) {
pvt = calloc(1, sizeof(CALLBACK)); /* very lazy allocation of callback structure */
pvt = calloc(1, sizeof(epicsCallback)); /* very lazy allocation of callback structure */
prec->simpvt = pvt;
}
if (pvt) callbackRequestProcessCallbackDelayed(pvt, prec->prio, prec, prec->sdly);
@@ -1,263 +0,0 @@
#*************************************************************************
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
recordtype(mbbiDirect) {
include "dbCommon.dbd"
field(VAL,DBF_LONG) {
prompt("Current Value")
promptgroup("40 - Input")
asl(ASL0)
pp(TRUE)
}
field(NOBT,DBF_SHORT) {
prompt("Number of Bits")
promptgroup("40 - Input")
special(SPC_NOMOD)
interest(1)
}
field(INP,DBF_INLINK) {
prompt("Input Specification")
promptgroup("40 - Input")
interest(1)
}
field(RVAL,DBF_ULONG) {
prompt("Raw Value")
pp(TRUE)
}
field(ORAW,DBF_ULONG) {
prompt("Prev Raw Value")
special(SPC_NOMOD)
interest(3)
}
field(MASK,DBF_ULONG) {
prompt("Hardware Mask")
special(SPC_NOMOD)
interest(1)
}
field(MLST,DBF_LONG) {
prompt("Last Value Monitored")
special(SPC_NOMOD)
interest(3)
}
field(SHFT,DBF_USHORT) {
prompt("Shift")
promptgroup("40 - Input")
interest(1)
}
field(SIOL,DBF_INLINK) {
prompt("Simulation Input Link")
promptgroup("90 - Simulate")
interest(1)
}
field(SVAL,DBF_LONG) {
prompt("Simulation Value")
}
field(SIML,DBF_INLINK) {
prompt("Simulation Mode Link")
promptgroup("90 - Simulate")
interest(1)
}
field(SIMM,DBF_MENU) {
prompt("Simulation Mode")
special(SPC_MOD)
interest(1)
menu(menuSimm)
}
field(SIMS,DBF_MENU) {
prompt("Simulation Mode Severity")
promptgroup("90 - Simulate")
interest(2)
menu(menuAlarmSevr)
}
field(OLDSIMM,DBF_MENU) {
prompt("Prev. Simulation Mode")
special(SPC_NOMOD)
interest(4)
menu(menuSimm)
}
field(SSCN,DBF_MENU) {
prompt("Sim. Mode Scan")
promptgroup("90 - Simulate")
interest(1)
menu(menuScan)
initial("65535")
}
field(SDLY,DBF_DOUBLE) {
prompt("Sim. Mode Async Delay")
promptgroup("90 - Simulate")
interest(2)
initial("-1.0")
}
%#include "callback.h"
field(SIMPVT,DBF_NOACCESS) {
prompt("Sim. Mode Private")
special(SPC_NOMOD)
interest(4)
extra("CALLBACK *simpvt")
}
field(B0,DBF_UCHAR) {
prompt("Bit 0")
pp(TRUE)
interest(1)
}
field(B1,DBF_UCHAR) {
prompt("Bit 1")
pp(TRUE)
interest(1)
}
field(B2,DBF_UCHAR) {
prompt("Bit 2")
pp(TRUE)
interest(1)
}
field(B3,DBF_UCHAR) {
prompt("Bit 3")
pp(TRUE)
interest(1)
}
field(B4,DBF_UCHAR) {
prompt("Bit 4")
pp(TRUE)
interest(1)
}
field(B5,DBF_UCHAR) {
prompt("Bit 5")
pp(TRUE)
interest(1)
}
field(B6,DBF_UCHAR) {
prompt("Bit 6")
pp(TRUE)
interest(1)
}
field(B7,DBF_UCHAR) {
prompt("Bit 7")
pp(TRUE)
interest(1)
}
field(B8,DBF_UCHAR) {
prompt("Bit 8")
pp(TRUE)
interest(1)
}
field(B9,DBF_UCHAR) {
prompt("Bit 9")
pp(TRUE)
interest(1)
}
field(BA,DBF_UCHAR) {
prompt("Bit 10")
pp(TRUE)
interest(1)
}
field(BB,DBF_UCHAR) {
prompt("Bit 11")
pp(TRUE)
interest(1)
}
field(BC,DBF_UCHAR) {
prompt("Bit 12")
pp(TRUE)
interest(1)
}
field(BD,DBF_UCHAR) {
prompt("Bit 13")
pp(TRUE)
interest(1)
}
field(BE,DBF_UCHAR) {
prompt("Bit 14")
pp(TRUE)
interest(1)
}
field(BF,DBF_UCHAR) {
prompt("Bit 15")
pp(TRUE)
interest(1)
}
field(B10,DBF_UCHAR) {
prompt("Bit 16")
pp(TRUE)
interest(1)
}
field(B11,DBF_UCHAR) {
prompt("Bit 17")
pp(TRUE)
interest(1)
}
field(B12,DBF_UCHAR) {
prompt("Bit 18")
pp(TRUE)
interest(1)
}
field(B13,DBF_UCHAR) {
prompt("Bit 19")
pp(TRUE)
interest(1)
}
field(B14,DBF_UCHAR) {
prompt("Bit 20")
pp(TRUE)
interest(1)
}
field(B15,DBF_UCHAR) {
prompt("Bit 21")
pp(TRUE)
interest(1)
}
field(B16,DBF_UCHAR) {
prompt("Bit 22")
pp(TRUE)
interest(1)
}
field(B17,DBF_UCHAR) {
prompt("Bit 23")
pp(TRUE)
interest(1)
}
field(B18,DBF_UCHAR) {
prompt("Bit 24")
pp(TRUE)
interest(1)
}
field(B19,DBF_UCHAR) {
prompt("Bit 25")
pp(TRUE)
interest(1)
}
field(B1A,DBF_UCHAR) {
prompt("Bit 26")
pp(TRUE)
interest(1)
}
field(B1B,DBF_UCHAR) {
prompt("Bit 27")
pp(TRUE)
interest(1)
}
field(B1C,DBF_UCHAR) {
prompt("Bit 28")
pp(TRUE)
interest(1)
}
field(B1D,DBF_UCHAR) {
prompt("Bit 29")
pp(TRUE)
interest(1)
}
field(B1E,DBF_UCHAR) {
prompt("Bit 30")
pp(TRUE)
interest(1)
}
field(B1F,DBF_UCHAR) {
prompt("Bit 31")
pp(TRUE)
interest(1)
}
}
@@ -0,0 +1,588 @@
#*************************************************************************
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
=title Multi-Bit Binary Input Direct Record (mbbiDirect)
The mbbiDirect record retrieves a 32-bit hardware value and converts it to
an array of 32 unsigned characters, each representing a bit of the word.
These fields (B0-B9, BA-BF, B10-B19, B1A-B1F) are set to 1 if the corresponding
bit is set, and 0 if not.
This record's operation is similar to that of the multi-bit binary input record,
and it has many fields in common with it. This record also has two available
soft device support modules: C<Soft Channel> and C<Raw Soft Channel>.
=recordtype mbbiDirect
=cut
recordtype(mbbiDirect) {
=head2 Parameter Fields
The record-specific fields are described below, grouped by functionality.
=head3 Scan Parameters
The mbbiDirect record has the standard fields for specifying under what
circumstances the record will be processed. These fields are listed in L<Scan
Fields>. In addition, L<Scanning Specification> explains how these fields are
used. Note that I/O event scanning is only supported for those card types
that interrupt.
=head3 Read and Convert Parameters
The device support routines obtain the record's input from the device or link
specified in the INP field. For records that obtain their input from devices,
the INP field must contain the address of the I/O card, and the DTYP field
must specify the proper device support module. Be aware that the address format
differs according to the I/O bus used. See L<Address Specification> for
information on the format of hardware addresses.
Two soft device support modules can be specified in DTYP C<Soft Channel> and
C<<< Raw Soft Channel >>>.
C<<< Raw Soft Channel >>> reads the value into RVAL,
upon which the normal conversion process is undergone. C<<< Soft Channel >>>
reads any unsigned integer directly into VAL. For a soft mbbiDirect record, the
INP field can be a constant, a database, or a channel access link. If INP is a
constant, then the VAL is initialized to the INP value but can be changed at
run-time via dbPutField or dbPutLink. See L<Address Specification> for
information on how to database links.
For records that don't use C<<< Soft Channel >>> device support, RVAL is used to
determine VAL as follows:
=over
=item 1. RVAL is assigned to a temporary variable I<rval> = RVAL
=item 2. I<rval> is shifted right SHFT number of bits.
=item 3. VAL is set equal to I<rval>.
=back
Each of the fields, B0-BF and B10-B1F, represents one bit of the word.
=fields VAL, INP, RVAL, SHFT, B0, B1, B2, B3, B4, B5, B6, B7, B8, B9, BA, BB, BC, BD, BE, BF, B10, B11, B12, B13, B14, B15, B16, B17, B18, B19, B1A, B1B, B1C, B1D, B1E, B1F
=head3 Operator Display Parameters
These parameters are used to present meaningful data to the operator.
See L<Fields Common to All Record Types> for more on the record name (NAME) and
description (DESC) fields.
=fields NAME, DESC
=cut
include "dbCommon.dbd"
field(VAL,DBF_LONG) {
prompt("Current Value")
promptgroup("40 - Input")
asl(ASL0)
pp(TRUE)
}
field(NOBT,DBF_SHORT) {
prompt("Number of Bits")
promptgroup("40 - Input")
special(SPC_NOMOD)
interest(1)
}
field(INP,DBF_INLINK) {
prompt("Input Specification")
promptgroup("40 - Input")
interest(1)
}
field(RVAL,DBF_ULONG) {
prompt("Raw Value")
pp(TRUE)
}
field(ORAW,DBF_ULONG) {
prompt("Prev Raw Value")
special(SPC_NOMOD)
interest(3)
}
field(MASK,DBF_ULONG) {
prompt("Hardware Mask")
special(SPC_NOMOD)
interest(1)
}
field(MLST,DBF_LONG) {
prompt("Last Value Monitored")
special(SPC_NOMOD)
interest(3)
}
field(SHFT,DBF_USHORT) {
prompt("Shift")
promptgroup("40 - Input")
interest(1)
}
=head3 Run-time and Simulation Mode Parameters
These parameters are used by the run-time code for processing the mbbi direct
record. They are not configurable prior to run-time.
MASK is used by device support routine to read hardware register. Record support
sets low order NOBT bits in MASK. Device support can shift this value.
MLST holds the value when the last monitor for value change was triggered.
=fields NOBT, ORAW, MASK, MLST
The following fields are used to operate the mbbiDirect record in the simulation
mode. See L<Fields Common to Many Record Types> for more information on these
fields.
=fields SIOL, SVAL, SIML, SIMM, SIMS, SSCN, SDLY
=cut
field(SIOL,DBF_INLINK) {
prompt("Simulation Input Link")
promptgroup("90 - Simulate")
interest(1)
}
field(SVAL,DBF_LONG) {
prompt("Simulation Value")
}
field(SIML,DBF_INLINK) {
prompt("Simulation Mode Link")
promptgroup("90 - Simulate")
interest(1)
}
field(SIMM,DBF_MENU) {
prompt("Simulation Mode")
special(SPC_MOD)
interest(1)
menu(menuSimm)
}
field(SIMS,DBF_MENU) {
prompt("Simulation Mode Severity")
promptgroup("90 - Simulate")
interest(2)
menu(menuAlarmSevr)
}
field(OLDSIMM,DBF_MENU) {
prompt("Prev. Simulation Mode")
special(SPC_NOMOD)
interest(4)
menu(menuSimm)
}
field(SSCN,DBF_MENU) {
prompt("Sim. Mode Scan")
promptgroup("90 - Simulate")
interest(1)
menu(menuScan)
initial("65535")
}
field(SDLY,DBF_DOUBLE) {
prompt("Sim. Mode Async Delay")
promptgroup("90 - Simulate")
interest(2)
initial("-1.0")
}
%#include "callback.h"
field(SIMPVT,DBF_NOACCESS) {
prompt("Sim. Mode Private")
special(SPC_NOMOD)
interest(4)
extra("epicsCallback *simpvt")
}
=head3 Alarm Parameters
The possible alarm conditions for multi-bit binary input direct records are the
SCAN and READ alarms. These alarms are not configurable by the user since they
are always of MAJOR severity. See L<Alarm Specification> for a complete
explanation of Scan and Read alarms. No fields exist for the mbbi direct record
to have state alarms.
L<Alarm Fields> lists other fields related to a alarms that are common to all
record types.
=cut
field(B0,DBF_UCHAR) {
prompt("Bit 0")
pp(TRUE)
interest(1)
}
field(B1,DBF_UCHAR) {
prompt("Bit 1")
pp(TRUE)
interest(1)
}
field(B2,DBF_UCHAR) {
prompt("Bit 2")
pp(TRUE)
interest(1)
}
field(B3,DBF_UCHAR) {
prompt("Bit 3")
pp(TRUE)
interest(1)
}
field(B4,DBF_UCHAR) {
prompt("Bit 4")
pp(TRUE)
interest(1)
}
field(B5,DBF_UCHAR) {
prompt("Bit 5")
pp(TRUE)
interest(1)
}
field(B6,DBF_UCHAR) {
prompt("Bit 6")
pp(TRUE)
interest(1)
}
field(B7,DBF_UCHAR) {
prompt("Bit 7")
pp(TRUE)
interest(1)
}
field(B8,DBF_UCHAR) {
prompt("Bit 8")
pp(TRUE)
interest(1)
}
field(B9,DBF_UCHAR) {
prompt("Bit 9")
pp(TRUE)
interest(1)
}
field(BA,DBF_UCHAR) {
prompt("Bit 10")
pp(TRUE)
interest(1)
}
field(BB,DBF_UCHAR) {
prompt("Bit 11")
pp(TRUE)
interest(1)
}
field(BC,DBF_UCHAR) {
prompt("Bit 12")
pp(TRUE)
interest(1)
}
field(BD,DBF_UCHAR) {
prompt("Bit 13")
pp(TRUE)
interest(1)
}
field(BE,DBF_UCHAR) {
prompt("Bit 14")
pp(TRUE)
interest(1)
}
field(BF,DBF_UCHAR) {
prompt("Bit 15")
pp(TRUE)
interest(1)
}
field(B10,DBF_UCHAR) {
prompt("Bit 16")
pp(TRUE)
interest(1)
}
field(B11,DBF_UCHAR) {
prompt("Bit 17")
pp(TRUE)
interest(1)
}
field(B12,DBF_UCHAR) {
prompt("Bit 18")
pp(TRUE)
interest(1)
}
field(B13,DBF_UCHAR) {
prompt("Bit 19")
pp(TRUE)
interest(1)
}
field(B14,DBF_UCHAR) {
prompt("Bit 20")
pp(TRUE)
interest(1)
}
field(B15,DBF_UCHAR) {
prompt("Bit 21")
pp(TRUE)
interest(1)
}
field(B16,DBF_UCHAR) {
prompt("Bit 22")
pp(TRUE)
interest(1)
}
field(B17,DBF_UCHAR) {
prompt("Bit 23")
pp(TRUE)
interest(1)
}
field(B18,DBF_UCHAR) {
prompt("Bit 24")
pp(TRUE)
interest(1)
}
field(B19,DBF_UCHAR) {
prompt("Bit 25")
pp(TRUE)
interest(1)
}
field(B1A,DBF_UCHAR) {
prompt("Bit 26")
pp(TRUE)
interest(1)
}
field(B1B,DBF_UCHAR) {
prompt("Bit 27")
pp(TRUE)
interest(1)
}
field(B1C,DBF_UCHAR) {
prompt("Bit 28")
pp(TRUE)
interest(1)
}
field(B1D,DBF_UCHAR) {
prompt("Bit 29")
pp(TRUE)
interest(1)
}
field(B1E,DBF_UCHAR) {
prompt("Bit 30")
pp(TRUE)
interest(1)
}
field(B1F,DBF_UCHAR) {
prompt("Bit 31")
pp(TRUE)
interest(1)
}
=head2 Record Support
=head3 Record Support Routines
=head4 init_record
This routine initializes SIMM with the value of SIML if SIML type is CONSTANT
link or creates a channel access link if SIML type is PV_LINK. SVAL is likewise
initialized if SIOL is CONSTANT or PV_LINK.
This routine next checks to see that device support is available and a device
support read routine is defined. If either does not exist, an error message is
issued and processing is terminated.
Clears MASK and then sets the NOBT low order bits.
If device support includes C<init_record()>, it is called.
refresh_bits is then called to refresh all the bit fields based on a hardware
value.
=head4 process
See next section.
=head3 Record Processing
Routine process implements the following algorithm:
=over
=item 1.
Check to see that the appropriate device support module exists. If it doesn't,
an error message is issued and processing is terminated with the PACT field
still set to TRUE. This ensures that processes will no longer be called for this
record. Thus error storms will not occur.
=item 2.
readValue is called. See L<Output Records> for information.
=item 3.
If PACT has been changed to TRUE, the device support read routine has started
but has not completed reading a new input value. In this case, the processing
routine merely returns, leaving PACT TRUE.
=item 4.
Convert.
=over
=item * status = read_mbbiDirect
=item * PACT = TRUE
=item * C<recGblGetTimeStamp()> is called.
=item * If status is 0, then determine VAL
=over
=item * Set rval = RVAL
=item * Shift rval right SHFT bits
=item * Set VAL = RVAL
=back
=item * If status is 1, return 0
=item * If status is 2, set status = 0
=back
=item 5.
Check to see if monitors should be invoked.
=over
=item * Alarm monitors are invoked if the alarm status or severity has changed.
=item * Archive and value change monitors are invoked if MLST is not equal to VAL.
=item * Monitors for RVAL are checked whenever other monitors are invoked.
=item * NSEV and NSTA are reset to 0.
=back
=item 6.
Scan forward link if necessary, set PACT FALSE, and return.
=back
=begin html
<br><hr><br>
=end html
=head2 Device Support
=head3 Fields Of Interest To Device Support
Each input record must have an associated set of device support routines.
The primary responsibility of the device support routines is to obtain a new raw
input value whenever read_mbbiDirect is called. The device support routines are
primarily interested in the following fields:
=fields PACT, DPVT, UDF, NSEV, NSTA, NOBT, VAL, INP, RVAL, MASK, SHFT
=head3 Device Support Routines
Device support consists of the following routines:
=head4 long report(int level)
This optional routine is called by the IOC command C<dbior> and is passed the
report level that was requested by the user.
It should print a report on the state of the device support to stdout.
The C<level> parameter may be used to output increasingly more detailed
information at higher levels, or to select different types of information with
different levels.
Level zero should print no more than a small summary.
=head4 long init(int after)
This optional routine is called twice at IOC initialization time.
The first call happens before any of the C<init_record()> calls are made, with
the integer parameter C<after> set to 0.
The second call happens after all of the C<init_record()> calls have been made,
with C<after> set to 1.
=head4 init_record
init_record(precord)
This routine is optional. If provided, it is called by the record support
C<init_record()> routine. If it uses MASK, it should shift it as necessary and
also give SHFT a value.
=head4 get_ioint_info
get_ioint_info(int cmd,struct dbCommon *precord,IOSCANPVT *ppvt)
This routine is called by the ioEventScan system each time the record is added
or deleted from an IE<sol>O event scan list. cmd has the value (0,1) if the
record is being (added to, deleted from) an IE<sol>O event list. It must be
provided for any device type that can use the ioEvent scanner.
=head4 read_mbbiDirect
read_mbbiDirect(precord)
This routine must provide a new input value. It returns the following values:
=over
=item *
0: Success. A new raw value is placed in RVAL. The record support module
determines VAL from RVAL and SHFT.
=item *
2: Success, but don't modify VAL.
=item *
Other: Error.
=back
=head3 Device Support For Soft Records
Two soft device support modules, C<<< Soft Channel >>> and C<<< Raw Soft Channel
>>>, are provided for multi-bit binary input direct records not related to
actual hardware devices. The INP link type must be either CONSTANT, DB_LINK, or
CA_LINK.
=head4 Soft Channel
For this module, read_mbbiDirect always returns a value of 2, which means that
no conversion is performed.
If the INP link type is constant, then the constant value is stored into VAL by
C<init_record()>, and UDF is set to FALSE. VAL can be changed via dbPut
requests. If the INP link type is PV_LINK, then dbCaAddInlink is called by
C<init_record()>.
read_mbbiDirect calls recGblGetLinkValue to read the current value of VAL.
See L<Input Records> for a further explanation.
If the return status of recGblGetLinkValue is zero, then read_mbbi sets UDF to
FALSE. The status of recGblGetLinkValue is returned.
=head4 Raw Soft Channel
This module is like the previous except that values are read into RVAL, VAL is
computed from RVAL, and read_mbbiDirect returns a value of 0. Thus the record
processing routine will determine VAL in the normal way.
=cut
}
+2 -2
View File
@@ -409,9 +409,9 @@ static long readValue(mbbiRecord *prec)
}
prec->pact = FALSE;
} else { /* !prec->pact && delay >= 0. */
CALLBACK *pvt = prec->simpvt;
epicsCallback *pvt = prec->simpvt;
if (!pvt) {
pvt = calloc(1, sizeof(CALLBACK)); /* very lazy allocation of callback structure */
pvt = calloc(1, sizeof(epicsCallback)); /* very lazy allocation of callback structure */
prec->simpvt = pvt;
}
if (pvt) callbackRequestProcessCallbackDelayed(pvt, prec->prio, prec, prec->sdly);
-505
View File
@@ -1,505 +0,0 @@
#*************************************************************************
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
recordtype(mbbi) {
include "dbCommon.dbd"
field(VAL,DBF_ENUM) {
prompt("Current Value")
promptgroup("40 - Input")
asl(ASL0)
pp(TRUE)
}
field(NOBT,DBF_USHORT) {
prompt("Number of Bits")
promptgroup("40 - Input")
special(SPC_NOMOD)
interest(1)
}
field(INP,DBF_INLINK) {
prompt("Input Specification")
promptgroup("40 - Input")
interest(1)
}
field(ZRVL,DBF_ULONG) {
prompt("Zero Value")
promptgroup("41 - Input 0-7")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(ONVL,DBF_ULONG) {
prompt("One Value")
promptgroup("41 - Input 0-7")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(TWVL,DBF_ULONG) {
prompt("Two Value")
promptgroup("41 - Input 0-7")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(THVL,DBF_ULONG) {
prompt("Three Value")
promptgroup("41 - Input 0-7")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(FRVL,DBF_ULONG) {
prompt("Four Value")
promptgroup("41 - Input 0-7")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(FVVL,DBF_ULONG) {
prompt("Five Value")
promptgroup("41 - Input 0-7")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(SXVL,DBF_ULONG) {
prompt("Six Value")
promptgroup("41 - Input 0-7")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(SVVL,DBF_ULONG) {
prompt("Seven Value")
promptgroup("41 - Input 0-7")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(EIVL,DBF_ULONG) {
prompt("Eight Value")
promptgroup("42 - Input 8-15")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(NIVL,DBF_ULONG) {
prompt("Nine Value")
promptgroup("42 - Input 8-15")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(TEVL,DBF_ULONG) {
prompt("Ten Value")
promptgroup("42 - Input 8-15")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(ELVL,DBF_ULONG) {
prompt("Eleven Value")
promptgroup("42 - Input 8-15")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(TVVL,DBF_ULONG) {
prompt("Twelve Value")
promptgroup("42 - Input 8-15")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(TTVL,DBF_ULONG) {
prompt("Thirteen Value")
promptgroup("42 - Input 8-15")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(FTVL,DBF_ULONG) {
prompt("Fourteen Value")
promptgroup("42 - Input 8-15")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(FFVL,DBF_ULONG) {
prompt("Fifteen Value")
promptgroup("42 - Input 8-15")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(ZRST,DBF_STRING) {
prompt("Zero String")
promptgroup("81 - Display 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(ONST,DBF_STRING) {
prompt("One String")
promptgroup("81 - Display 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(TWST,DBF_STRING) {
prompt("Two String")
promptgroup("81 - Display 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(THST,DBF_STRING) {
prompt("Three String")
promptgroup("81 - Display 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(FRST,DBF_STRING) {
prompt("Four String")
promptgroup("81 - Display 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(FVST,DBF_STRING) {
prompt("Five String")
promptgroup("81 - Display 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(SXST,DBF_STRING) {
prompt("Six String")
promptgroup("81 - Display 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(SVST,DBF_STRING) {
prompt("Seven String")
promptgroup("81 - Display 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(EIST,DBF_STRING) {
prompt("Eight String")
promptgroup("82 - Display 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(NIST,DBF_STRING) {
prompt("Nine String")
promptgroup("82 - Display 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(TEST,DBF_STRING) {
prompt("Ten String")
promptgroup("82 - Display 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(ELST,DBF_STRING) {
prompt("Eleven String")
promptgroup("82 - Display 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(TVST,DBF_STRING) {
prompt("Twelve String")
promptgroup("82 - Display 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(TTST,DBF_STRING) {
prompt("Thirteen String")
promptgroup("82 - Display 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(FTST,DBF_STRING) {
prompt("Fourteen String")
promptgroup("82 - Display 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(FFST,DBF_STRING) {
prompt("Fifteen String")
promptgroup("82 - Display 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(ZRSV,DBF_MENU) {
prompt("State Zero Severity")
promptgroup("71 - Alarm 0-7")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(ONSV,DBF_MENU) {
prompt("State One Severity")
promptgroup("71 - Alarm 0-7")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(TWSV,DBF_MENU) {
prompt("State Two Severity")
promptgroup("71 - Alarm 0-7")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(THSV,DBF_MENU) {
prompt("State Three Severity")
promptgroup("71 - Alarm 0-7")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(FRSV,DBF_MENU) {
prompt("State Four Severity")
promptgroup("71 - Alarm 0-7")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(FVSV,DBF_MENU) {
prompt("State Five Severity")
promptgroup("71 - Alarm 0-7")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(SXSV,DBF_MENU) {
prompt("State Six Severity")
promptgroup("71 - Alarm 0-7")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(SVSV,DBF_MENU) {
prompt("State Seven Severity")
promptgroup("71 - Alarm 0-7")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(EISV,DBF_MENU) {
prompt("State Eight Severity")
promptgroup("72 - Alarm 8-15")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(NISV,DBF_MENU) {
prompt("State Nine Severity")
promptgroup("72 - Alarm 8-15")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(TESV,DBF_MENU) {
prompt("State Ten Severity")
promptgroup("72 - Alarm 8-15")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(ELSV,DBF_MENU) {
prompt("State Eleven Severity")
promptgroup("72 - Alarm 8-15")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(TVSV,DBF_MENU) {
prompt("State Twelve Severity")
promptgroup("72 - Alarm 8-15")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(TTSV,DBF_MENU) {
prompt("State Thirteen Sevr")
promptgroup("72 - Alarm 8-15")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(FTSV,DBF_MENU) {
prompt("State Fourteen Sevr")
promptgroup("72 - Alarm 8-15")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(FFSV,DBF_MENU) {
prompt("State Fifteen Severity")
promptgroup("72 - Alarm 8-15")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(AFTC, DBF_DOUBLE) {
prompt("Alarm Filter Time Constant")
promptgroup("70 - Alarm")
interest(1)
}
field(AFVL, DBF_DOUBLE) {
prompt("Alarm Filter Value")
special(SPC_NOMOD)
interest(3)
}
field(UNSV,DBF_MENU) {
prompt("Unknown State Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(COSV,DBF_MENU) {
prompt("Change of State Svr")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(RVAL,DBF_ULONG) {
prompt("Raw Value")
pp(TRUE)
}
field(ORAW,DBF_ULONG) {
prompt("Prev Raw Value")
special(SPC_NOMOD)
interest(3)
}
field(MASK,DBF_ULONG) {
prompt("Hardware Mask")
special(SPC_NOMOD)
interest(1)
}
field(MLST,DBF_USHORT) {
prompt("Last Value Monitored")
special(SPC_NOMOD)
interest(3)
}
field(LALM,DBF_USHORT) {
prompt("Last Value Alarmed")
special(SPC_NOMOD)
interest(3)
}
field(SDEF,DBF_SHORT) {
prompt("States Defined")
special(SPC_NOMOD)
interest(3)
}
field(SHFT,DBF_USHORT) {
prompt("Shift")
promptgroup("40 - Input")
interest(1)
}
field(SIOL,DBF_INLINK) {
prompt("Simulation Input Link")
promptgroup("90 - Simulate")
interest(1)
}
field(SVAL,DBF_ULONG) {
prompt("Simulation Value")
}
field(SIML,DBF_INLINK) {
prompt("Simulation Mode Link")
promptgroup("90 - Simulate")
interest(1)
}
field(SIMM,DBF_MENU) {
prompt("Simulation Mode")
special(SPC_MOD)
interest(1)
menu(menuSimm)
}
field(SIMS,DBF_MENU) {
prompt("Simulation Mode Severity")
promptgroup("90 - Simulate")
interest(2)
menu(menuAlarmSevr)
}
field(OLDSIMM,DBF_MENU) {
prompt("Prev. Simulation Mode")
special(SPC_NOMOD)
interest(4)
menu(menuSimm)
}
field(SSCN,DBF_MENU) {
prompt("Sim. Mode Scan")
promptgroup("90 - Simulate")
interest(1)
menu(menuScan)
initial("65535")
}
field(SDLY,DBF_DOUBLE) {
prompt("Sim. Mode Async Delay")
promptgroup("90 - Simulate")
interest(2)
initial("-1.0")
}
%#include "callback.h"
field(SIMPVT,DBF_NOACCESS) {
prompt("Sim. Mode Private")
special(SPC_NOMOD)
interest(4)
extra("CALLBACK *simpvt")
}
}
@@ -0,0 +1,928 @@
#*************************************************************************
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
=title Multi-Bit Binary Input Record (mbbi)
The normal use for the multi-bit binary input record is to read contiguous,
multiple bit inputs from hardware. The binary value represents a state from a
range of up to 16 states. The multi-bit input record interfaces with devices
that use more than one bit.
Most device support modules obtain values from hardware and place the value in
RVAL. For these device support modules record processing uses RVAL to determine
the current state (VAL is given a value between 0 and 15). Device support
modules may optionally read a value directly into VAL.
Soft device modules are provided to obtain input via database or channel access
links or via dbPutField or dbPutLink requests. Two soft device support modules
are provided: C<<< Soft Channel >>> allows VAL to be an arbitrary unsigned short
integer. C<<< Raw Soft Channel >>> reads the value into RVAL just like normal
device support modules.
=recordtype mbbi
=cut
recordtype(mbbi) {
=head2 Parameter Fields
The record-specific fields are described below, grouped by functionality.
=head3 Scan Parameters
The multi-bit binary input record has the standard fields for specifying under
what circumstances it will be processed. These fields are listed in L<Scan
Fields>. In addition, L<Scanning Specification> explains how these fields are
used. Note that I/O event scanning is only supported for those card types that
interrupt.
=head3 Read and Convert Parameters
The device support routines obtain the record's input from the device or link
specified in the INP field. For records that obtain their input from devices,
the INP field must contain the address of the I/O card, and the DTYP field must
specify the proper device support module. Be aware that the address format
differs according to the I/O bus used. See L<Address Specification> for
information on the format of hardware addresses.
Two soft device support modules can be specified in DTYP C<Soft Channel> and
C<<< Raw Soft Channel >>>.
C<<< Raw Soft Channel >>> reads the value into RVAL,
upon which the normal conversion process is undergone. C<<< Soft Channel >>>
reads any unsigned integer directly into VAL. For a soft mbbi record, the INP
field can be a constant, a database, or a channel access link. If INP is a
constant, then the VAL is initialized to the constant value but can be changed
at run-time via dbPutField or dbPutLink. See L<Address Specification> for
information on the format of database addresses.
MASK is used by the raw soft channel read routine, and by typical device support
read routines, to select only the desired bits when reading the hardware
register. It is initialized to ((1 E<lt>E<lt> NOBT) - 1) by record
initialization. The user can configure the NOBT field, but the device support
routines may set it, in which case the value given to it by the user is simply
overridden. The device support routines may also override MASK or shift it
left by SHFT bits. If MASK is non-zero, only the bits specified by MASK will
appear in RVAL.
Unless the device support routine specifies no conversion, RVAL is used to
determine VAL as follows:
=over
=item 1.
RVAL is assigned to a temporary variable -- rval = RVAL
=item 2.
rval is shifted right SHFT number of bits.
=item 3.
A match is sought between rval and one of the state value fields, ZRVL-FFVL.
=back
Each of the fields, ZRVL-FFVL, represents one of the possible sixteen states
(not all sixteen have to be used).
Alternatively, the input value can be read as a string, in which case, a match
is sought with one of the strings specified in the ZRST-FFST fields. Then RVAL
is set equal to the corresponding value for that string, and the conversion
process occurs.
=fields VAL, INP, MASK, NOBT, RVAL, SHFT, ZRVL, ONVL, TWVL, THVL, FRVL, FVVL, SXVL, SVVL, EIVL, NIVL, TEVL, ELVL, TVVL, TTVL, FTVL, FFVL
=head3 Operator Display Parameters
These parameters are used to present meaningful data to the operator. They
display the value and other parameters of the mbbi record either textually or
graphically. The ZRST-FFST fields contain strings describing one of the possible
states of the record. The C<<< get_enum_str >>> and C<<< get_enum_strs >>>
record routines retrieve these strings for the operator. C<<< Get_enum_str >>>
gets the string corresponding to the value set in VAL, and C<<< get_enum_strs
>>> retrieves all the strings.
See L<Fields Common to All Record Types> for more on the record name (NAME) and
description (DESC) fields.
=fields NAME, DESC, ZRST, ONST, TWST, THST, FRST, FVST, SXST, SVST, EIST, NIST, TEST, ELST, TVST, TTST, FTST, FFST
=cut
include "dbCommon.dbd"
field(VAL,DBF_ENUM) {
prompt("Current Value")
promptgroup("40 - Input")
asl(ASL0)
pp(TRUE)
}
field(NOBT,DBF_USHORT) {
prompt("Number of Bits")
promptgroup("40 - Input")
special(SPC_NOMOD)
interest(1)
}
field(INP,DBF_INLINK) {
prompt("Input Specification")
promptgroup("40 - Input")
interest(1)
}
field(ZRVL,DBF_ULONG) {
prompt("Zero Value")
promptgroup("41 - Input 0-7")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(ONVL,DBF_ULONG) {
prompt("One Value")
promptgroup("41 - Input 0-7")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(TWVL,DBF_ULONG) {
prompt("Two Value")
promptgroup("41 - Input 0-7")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(THVL,DBF_ULONG) {
prompt("Three Value")
promptgroup("41 - Input 0-7")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(FRVL,DBF_ULONG) {
prompt("Four Value")
promptgroup("41 - Input 0-7")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(FVVL,DBF_ULONG) {
prompt("Five Value")
promptgroup("41 - Input 0-7")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(SXVL,DBF_ULONG) {
prompt("Six Value")
promptgroup("41 - Input 0-7")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(SVVL,DBF_ULONG) {
prompt("Seven Value")
promptgroup("41 - Input 0-7")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(EIVL,DBF_ULONG) {
prompt("Eight Value")
promptgroup("42 - Input 8-15")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(NIVL,DBF_ULONG) {
prompt("Nine Value")
promptgroup("42 - Input 8-15")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(TEVL,DBF_ULONG) {
prompt("Ten Value")
promptgroup("42 - Input 8-15")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(ELVL,DBF_ULONG) {
prompt("Eleven Value")
promptgroup("42 - Input 8-15")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(TVVL,DBF_ULONG) {
prompt("Twelve Value")
promptgroup("42 - Input 8-15")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(TTVL,DBF_ULONG) {
prompt("Thirteen Value")
promptgroup("42 - Input 8-15")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(FTVL,DBF_ULONG) {
prompt("Fourteen Value")
promptgroup("42 - Input 8-15")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(FFVL,DBF_ULONG) {
prompt("Fifteen Value")
promptgroup("42 - Input 8-15")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(ZRST,DBF_STRING) {
prompt("Zero String")
promptgroup("81 - Display 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(ONST,DBF_STRING) {
prompt("One String")
promptgroup("81 - Display 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(TWST,DBF_STRING) {
prompt("Two String")
promptgroup("81 - Display 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(THST,DBF_STRING) {
prompt("Three String")
promptgroup("81 - Display 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(FRST,DBF_STRING) {
prompt("Four String")
promptgroup("81 - Display 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(FVST,DBF_STRING) {
prompt("Five String")
promptgroup("81 - Display 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(SXST,DBF_STRING) {
prompt("Six String")
promptgroup("81 - Display 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(SVST,DBF_STRING) {
prompt("Seven String")
promptgroup("81 - Display 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(EIST,DBF_STRING) {
prompt("Eight String")
promptgroup("82 - Display 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(NIST,DBF_STRING) {
prompt("Nine String")
promptgroup("82 - Display 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(TEST,DBF_STRING) {
prompt("Ten String")
promptgroup("82 - Display 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(ELST,DBF_STRING) {
prompt("Eleven String")
promptgroup("82 - Display 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(TVST,DBF_STRING) {
prompt("Twelve String")
promptgroup("82 - Display 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(TTST,DBF_STRING) {
prompt("Thirteen String")
promptgroup("82 - Display 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(FTST,DBF_STRING) {
prompt("Fourteen String")
promptgroup("82 - Display 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(FFST,DBF_STRING) {
prompt("Fifteen String")
promptgroup("82 - Display 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
=head3 Alarm Parameters
The possible alarm conditions for multi-bit binary inputs are the SCAN, READ,
and state alarms. The state alarms are configured in the below severity fields.
These fields have the usual possible values for severity fields: NO_ALARM,
MINOR, and MAJOR.
The unknown state severity (UNSV) field, if set to MINOR or MAJOR, triggers an
alarm when the record support routine cannot find a matching value in the state
value fields for C<<< rval >>>.
The change of state severity (COSV) field triggers an alarm when any change of
state occurs, if set to MAJOR or MINOR.
The other fields, when set to MAJOR or MINOR, trigger an alarm when VAL equals
the corresponding state. See the See L<Alarm Specification> for a complete
explanation of discrete alarms and these fields. L<Alarm Fields> lists other
fields related to a alarms that are common to all record types.
=fields UNSV, COSV, ZRSV, ONSV, TWSV, THSV, FRSV, FVSV, SXSV, SVSV, EISV, NISV, TESV, ELSV, TVSV, TTSV, FTSV, FFSV
=cut
field(ZRSV,DBF_MENU) {
prompt("State Zero Severity")
promptgroup("71 - Alarm 0-7")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(ONSV,DBF_MENU) {
prompt("State One Severity")
promptgroup("71 - Alarm 0-7")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(TWSV,DBF_MENU) {
prompt("State Two Severity")
promptgroup("71 - Alarm 0-7")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(THSV,DBF_MENU) {
prompt("State Three Severity")
promptgroup("71 - Alarm 0-7")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(FRSV,DBF_MENU) {
prompt("State Four Severity")
promptgroup("71 - Alarm 0-7")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(FVSV,DBF_MENU) {
prompt("State Five Severity")
promptgroup("71 - Alarm 0-7")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(SXSV,DBF_MENU) {
prompt("State Six Severity")
promptgroup("71 - Alarm 0-7")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(SVSV,DBF_MENU) {
prompt("State Seven Severity")
promptgroup("71 - Alarm 0-7")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(EISV,DBF_MENU) {
prompt("State Eight Severity")
promptgroup("72 - Alarm 8-15")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(NISV,DBF_MENU) {
prompt("State Nine Severity")
promptgroup("72 - Alarm 8-15")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(TESV,DBF_MENU) {
prompt("State Ten Severity")
promptgroup("72 - Alarm 8-15")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(ELSV,DBF_MENU) {
prompt("State Eleven Severity")
promptgroup("72 - Alarm 8-15")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(TVSV,DBF_MENU) {
prompt("State Twelve Severity")
promptgroup("72 - Alarm 8-15")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(TTSV,DBF_MENU) {
prompt("State Thirteen Sevr")
promptgroup("72 - Alarm 8-15")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(FTSV,DBF_MENU) {
prompt("State Fourteen Sevr")
promptgroup("72 - Alarm 8-15")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(FFSV,DBF_MENU) {
prompt("State Fifteen Severity")
promptgroup("72 - Alarm 8-15")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(AFTC, DBF_DOUBLE) {
prompt("Alarm Filter Time Constant")
promptgroup("70 - Alarm")
interest(1)
}
field(AFVL, DBF_DOUBLE) {
prompt("Alarm Filter Value")
special(SPC_NOMOD)
interest(3)
}
field(UNSV,DBF_MENU) {
prompt("Unknown State Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(COSV,DBF_MENU) {
prompt("Change of State Svr")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
=head3 Run-time Parameters
These parameters are used by the run-time code for processing the multi-bit
binary input.
ORAW is used by record processing to hold the prior RVAL for use in determining
when to post a monitor event for the RVAL field.
The LALM field implements the change of state alarm severity by holding the
value of VAL when the previous change of state alarm was issued.
MLST holds the value when the last monitor for value change was triggered.
SDEF is used by record support to save time if no states are defined.
=fields ORAW, LALM, MLST, SDEF
=cut
field(RVAL,DBF_ULONG) {
prompt("Raw Value")
pp(TRUE)
}
field(ORAW,DBF_ULONG) {
prompt("Prev Raw Value")
special(SPC_NOMOD)
interest(3)
}
field(MASK,DBF_ULONG) {
prompt("Hardware Mask")
special(SPC_NOMOD)
interest(1)
}
field(MLST,DBF_USHORT) {
prompt("Last Value Monitored")
special(SPC_NOMOD)
interest(3)
}
field(LALM,DBF_USHORT) {
prompt("Last Value Alarmed")
special(SPC_NOMOD)
interest(3)
}
field(SDEF,DBF_SHORT) {
prompt("States Defined")
special(SPC_NOMOD)
interest(3)
}
field(SHFT,DBF_USHORT) {
prompt("Shift")
promptgroup("40 - Input")
interest(1)
}
=head3 Simulation Mode Parameters
The following fields are used to operate the mbbi record in the simulation mode.
See L<Fields Common to Many Record Types> for more information on these fields.
=fields SIOL, SVAL, SIML, SIMM, SIMS, SSCN, SDLY
=cut
field(SIOL,DBF_INLINK) {
prompt("Simulation Input Link")
promptgroup("90 - Simulate")
interest(1)
}
field(SVAL,DBF_ULONG) {
prompt("Simulation Value")
}
field(SIML,DBF_INLINK) {
prompt("Simulation Mode Link")
promptgroup("90 - Simulate")
interest(1)
}
field(SIMM,DBF_MENU) {
prompt("Simulation Mode")
special(SPC_MOD)
interest(1)
menu(menuSimm)
}
field(SIMS,DBF_MENU) {
prompt("Simulation Mode Severity")
promptgroup("90 - Simulate")
interest(2)
menu(menuAlarmSevr)
}
field(OLDSIMM,DBF_MENU) {
prompt("Prev. Simulation Mode")
special(SPC_NOMOD)
interest(4)
menu(menuSimm)
}
field(SSCN,DBF_MENU) {
prompt("Sim. Mode Scan")
promptgroup("90 - Simulate")
interest(1)
menu(menuScan)
initial("65535")
}
field(SDLY,DBF_DOUBLE) {
prompt("Sim. Mode Async Delay")
promptgroup("90 - Simulate")
interest(2)
initial("-1.0")
}
%#include "callback.h"
field(SIMPVT,DBF_NOACCESS) {
prompt("Sim. Mode Private")
special(SPC_NOMOD)
interest(4)
extra("epicsCallback *simpvt")
}
=head2 Record Support
=head3 Record Support Routines
=head4 init_record
This routine initializes SIMM with the value of SIML if SIML type is CONSTANT
link or creates a channel access link if SIML type is PV_LINK. SVAL is likewise
initialized if SIOL is CONSTANT or PV_LINK.
This routine next checks to see that device support is available and a device
support read routine is defined. If either does not exist, an error message is
issued and processing is terminated.
Clears MASK and then sets the NOBT low order bits.
If device support includes C<init_record()>, it is called.
init_common is then called to determine if any states are defined. If states are
defined, SDEF is set to TRUE.
=head4 process
See next section.
=head4 special
Calls init_common to compute SDEF when any of the fields ZRVL, ... FFVL change
value.
=head4 get_enum_str
Retrieves ASCII string corresponding to VAL.
=head4 get_enum_strs
Retrieves ASCII strings for ZRST,...FFST.
=head4 put_enum_str
Checks if string matches ZRST,...FFST and if it does, sets VAL.
=head3 Record Processing
Routine process implements the following algorithm:
=over
=item 1.
Check to see that the appropriate device support module exists. If it doesn't,
an error message is issued and processing is terminated with the PACT field
still set to TRUE. This ensures that processes will no longer be called for this
record. Thus error storms will not occur.
=item 2.
readValue is called. See L<Input Records> for more information.
=item 3.
If PACT has been changed to TRUE, the device support read routine has started
but has not completed reading a new input value. In this case, the processing
routine merely returns, leaving PACT TRUE.
=item 4.
Convert:
=over
=item * status=read_mbbi
=item * PACT = TRUE
=item * C<recGblGetTimeStamp()> is called.
=item * If status is 0, then determine VAL
=over
=item * Set rval = RVAL
=item * Shift rval right SHFT bits
=back
=item * If at least one state value is defined
=over
=item * Set UDF to TRUE
=back
=item * If RVAL is ZRVL,...,FFVL then set
=over
=item * VAL equals index of state
=item * UDF set to FALSE
=back
=item * Else set VAL = undefined
=over
=item * Else set VAL = RVAL
=back
=item * Set UDF to FALSE
=over
=item * If status is 1, return 0
=item * If status is 2, set status = 0
=back
=back
=item 5.
Check alarms. This routine checks to see if the new VAL causes the alarm status
and severity to change. If so, NSEV, NSTA and LALM are set.
=item 6.
Check to see if monitors should be invoked.
=over
=item * Alarm monitors are invoked if the alarm status or severity has changed.
=item * Archive and value change monitors are invoked if MLST is not equal to VAL.
=item * Monitors for RVAL are checked whenever other monitors are invoked.
=item * NSEV and NSTA are reset to 0.
=back
=item 7.
Scan forward link if necessary, set PACT FALSE, and return.
=back
=head2 Device Support
=head3 Fields Of Interest To Device Support
Each input record must have an associated set of device support routines.
The primary responsibility of the device support routines is to obtain a new raw
input value whenever read_mbbi is called. The device support routines are
primarily interested in the following fields:
=fields PACT, DPVT, UDF, NSEV, NSTA, NOBT, VAL, INP, RVAL, MASK, SHFT
=head3 Device Support Routines
Device support consists of the following routines:
=head4 long report(int level)
This optional routine is called by the IOC command C<dbior> and is passed the
report level that was requested by the user.
It should print a report on the state of the device support to stdout.
The C<level> parameter may be used to output increasingly more detailed
information at higher levels, or to select different types of information with
different levels.
Level zero should print no more than a small summary.
=head4 long init(int after)
This optional routine is called twice at IOC initialization time.
The first call happens before any of the C<init_record()> calls are made, with
the integer parameter C<after> set to 0.
The second call happens after all of the C<init_record()> calls have been made,
with C<after> set to 1.
=head4 init_record
init_record(precord)
This routine is optional. If provided, it is called by the record support
C<init_record()> routine. If it uses MASK, it should shift it as necessary and
also give SHFT a value.
=head4 get_ioint_info
get_ioint_info(int cmd,struct dbCommon *precord,IOSCANPVT *ppvt)
This routine is called by the ioEventScan system each time the record is added
or deleted from an I/O event scan list. cmd has the value (0,1) if the record is
being (added to, deleted from) an I/O event list. It must be provided for any
device type that can use the I/O Event scanner.
=head4 read_mbbi
read_mbbi(precord)
This routine must provide a new input value. It returns the following values:
=over
=item *
0: Success. A new raw value is placed in RVAL. The record support module
determines VAL from RVAL, SHFT, and ZEVL ... FFVL.
=item *
2: Success, but don't modify VAL.
=item *
Other: Error.
=back
=head3 Device Support For Soft Records
Two soft device support modules C<<< Soft Channel >>> and C<<< Raw Soft Channel
>>> are provided for multi-bit binary input records not related to actual
hardware devices. The INP link type must be either CONSTANT, DB_LINK, or
CA_LINK.
=head4 Soft Channel
read_mbbi always returns a value of 2, which means that no conversion is
performed.
If the INP link type is constant, then the constant value is stored into VAL by
C<init_record()>, and UDF is set to FALSE. VAL can be changed via dbPut
requests. If the INP link type is PV_LINK, then dbCaAddInlink is called by
C<init_record()>.
read_mbbi calls recGblGetLinkValue to read the current value of VAL. See L<Soft
Input>.
If the return status of recGblGetLinkValue is zero, then read_mbbi sets UDF to
FALSE. The status of recGblGetLinkValue is returned.
=head4 Raw Soft Channel
This module is like the previous except that values are read into RVAL, VAL is
computed from RVAL, and read_mbbi returns a value of 0. Thus the record
processing routine will determine VAL in the normal way.
=cut
}
@@ -375,9 +375,9 @@ static long writeValue(mbboDirectRecord *prec)
status = dbPutLink(&prec->siol, DBR_ULONG, &prec->val, 1);
prec->pact = FALSE;
} else { /* !prec->pact && delay >= 0. */
CALLBACK *pvt = prec->simpvt;
epicsCallback *pvt = prec->simpvt;
if (!pvt) {
pvt = calloc(1, sizeof(CALLBACK)); /* very lazy allocation of callback structure */
pvt = calloc(1, sizeof(epicsCallback)); /* very lazy allocation of callback structure */
prec->simpvt = pvt;
}
if (pvt) callbackRequestProcessCallbackDelayed(pvt, prec->prio, prec, prec->sdly);
@@ -1,358 +0,0 @@
#*************************************************************************
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
recordtype(mbboDirect) {
include "dbCommon.dbd"
field(VAL,DBF_LONG) {
prompt("Word")
promptgroup("50 - Output")
asl(ASL0)
pp(TRUE)
}
field(OMSL,DBF_MENU) {
prompt("Output Mode Select")
promptgroup("50 - Output")
special(SPC_RESET)
pp(TRUE)
interest(1)
menu(menuOmsl)
}
field(NOBT,DBF_SHORT) {
prompt("Number of Bits")
promptgroup("50 - Output")
special(SPC_NOMOD)
interest(1)
}
field(DOL,DBF_INLINK) {
prompt("Desired Output Loc")
promptgroup("40 - Input")
interest(1)
}
field(OUT,DBF_OUTLINK) {
prompt("Output Specification")
promptgroup("50 - Output")
interest(1)
}
field(RVAL,DBF_ULONG) {
prompt("Raw Value")
special(SPC_NOMOD)
pp(TRUE)
}
field(ORAW,DBF_ULONG) {
prompt("Prev Raw Value")
special(SPC_NOMOD)
interest(3)
}
field(RBV,DBF_ULONG) {
prompt("Readback Value")
special(SPC_NOMOD)
}
field(ORBV,DBF_ULONG) {
prompt("Prev Readback Value")
special(SPC_NOMOD)
interest(3)
}
field(MASK,DBF_ULONG) {
prompt("Hardware Mask")
special(SPC_NOMOD)
interest(1)
}
field(MLST,DBF_LONG) {
prompt("Last Value Monitored")
special(SPC_NOMOD)
interest(3)
}
field(SHFT,DBF_USHORT) {
prompt("Shift")
promptgroup("50 - Output")
interest(1)
}
field(SIOL,DBF_OUTLINK) {
prompt("Simulation Output Link")
promptgroup("90 - Simulate")
interest(1)
}
field(SIML,DBF_INLINK) {
prompt("Simulation Mode Link")
promptgroup("90 - Simulate")
interest(1)
}
field(SIMM,DBF_MENU) {
prompt("Simulation Mode")
special(SPC_MOD)
interest(1)
menu(menuYesNo)
}
field(SIMS,DBF_MENU) {
prompt("Simulation Mode Severity")
promptgroup("90 - Simulate")
interest(2)
menu(menuAlarmSevr)
}
field(OLDSIMM,DBF_MENU) {
prompt("Prev. Simulation Mode")
special(SPC_NOMOD)
interest(4)
menu(menuSimm)
}
field(SSCN,DBF_MENU) {
prompt("Sim. Mode Scan")
promptgroup("90 - Simulate")
interest(1)
menu(menuScan)
initial("65535")
}
field(SDLY,DBF_DOUBLE) {
prompt("Sim. Mode Async Delay")
promptgroup("90 - Simulate")
interest(2)
initial("-1.0")
}
%#include "callback.h"
field(SIMPVT,DBF_NOACCESS) {
prompt("Sim. Mode Private")
special(SPC_NOMOD)
interest(4)
extra("CALLBACK *simpvt")
}
field(IVOA,DBF_MENU) {
prompt("INVALID outpt action")
promptgroup("50 - Output")
interest(2)
menu(menuIvoa)
}
field(IVOV,DBF_LONG) {
prompt("INVALID output value")
promptgroup("50 - Output")
interest(2)
}
field(B0,DBF_UCHAR) {
prompt("Bit 0")
promptgroup("51 - Output 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B1,DBF_UCHAR) {
prompt("Bit 1")
promptgroup("51 - Output 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B2,DBF_UCHAR) {
prompt("Bit 2")
promptgroup("51 - Output 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B3,DBF_UCHAR) {
prompt("Bit 3")
promptgroup("51 - Output 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B4,DBF_UCHAR) {
prompt("Bit 4")
promptgroup("51 - Output 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B5,DBF_UCHAR) {
prompt("Bit 5")
promptgroup("51 - Output 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B6,DBF_UCHAR) {
prompt("Bit 6")
promptgroup("51 - Output 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B7,DBF_UCHAR) {
prompt("Bit 7")
promptgroup("51 - Output 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B8,DBF_UCHAR) {
prompt("Bit 8")
promptgroup("52 - Output 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B9,DBF_UCHAR) {
prompt("Bit 9")
promptgroup("52 - Output 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(BA,DBF_UCHAR) {
prompt("Bit 10")
promptgroup("52 - Output 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(BB,DBF_UCHAR) {
prompt("Bit 11")
promptgroup("52 - Output 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(BC,DBF_UCHAR) {
prompt("Bit 12")
promptgroup("52 - Output 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(BD,DBF_UCHAR) {
prompt("Bit 13")
promptgroup("52 - Output 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(BE,DBF_UCHAR) {
prompt("Bit 14")
promptgroup("52 - Output 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(BF,DBF_UCHAR) {
prompt("Bit 15")
promptgroup("52 - Output 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B10,DBF_UCHAR) {
prompt("Bit 16")
promptgroup("53 - Output 16-23")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B11,DBF_UCHAR) {
prompt("Bit 17")
promptgroup("53 - Output 16-23")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B12,DBF_UCHAR) {
prompt("Bit 18")
promptgroup("53 - Output 16-23")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B13,DBF_UCHAR) {
prompt("Bit 19")
promptgroup("53 - Output 16-23")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B14,DBF_UCHAR) {
prompt("Bit 20")
promptgroup("53 - Output 16-23")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B15,DBF_UCHAR) {
prompt("Bit 21")
promptgroup("53 - Output 16-23")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B16,DBF_UCHAR) {
prompt("Bit 22")
promptgroup("53 - Output 16-23")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B17,DBF_UCHAR) {
prompt("Bit 23")
promptgroup("53 - Output 16-23")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B18,DBF_UCHAR) {
prompt("Bit 24")
promptgroup("54 - Output 24-31")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B19,DBF_UCHAR) {
prompt("Bit 25")
promptgroup("54 - Output 24-31")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B1A,DBF_UCHAR) {
prompt("Bit 26")
promptgroup("54 - Output 24-31")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B1B,DBF_UCHAR) {
prompt("Bit 27")
promptgroup("54 - Output 24-31")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B1C,DBF_UCHAR) {
prompt("Bit 28")
promptgroup("54 - Output 24-31")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B1D,DBF_UCHAR) {
prompt("Bit 29")
promptgroup("54 - Output 24-31")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B1E,DBF_UCHAR) {
prompt("Bit 30")
promptgroup("54 - Output 24-31")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B1F,DBF_UCHAR) {
prompt("Bit 31")
promptgroup("54 - Output 24-31")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
}
@@ -0,0 +1,672 @@
#*************************************************************************
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
=title Multi-Bit Binary Output Direct Record (mbboDirect)
The mbboDirect record performs the opposite function to that of the mbbiDirect
record. It accumulates bits (in the fields B0 - BF) as unsigned characters, and
converts them to a word which is then written out to hardware. If a bit field is
non-zero, it is interpreted as a binary 1. On the other hand, if it is zero, it
is interpreted as a binary 0.
=recordtype mbboDirect
=cut
recordtype(mbboDirect) {
=head2 Parameter Fields
The record-specific fields are described below, grouped by functionality.
=head3 Scan Parameters
The mbboDirect record has the standard fields for specifying under what
circumstances it will be processed. These fields are listed in L<Scan Fields>.
In addition, L<Scanning Specification> explains how these fields are used. Note
that I/O event scanning is only supported for those card types that
interrupt.
=head3 Desired Output Parameters
The mbboDirect record, like all output records, must specify where its output
originates. The output mode select field (OMSL) determines whether the output
originates from another record or from database access. When set to C<<<
closed_loop >>>, the desired output is retrieved from the link specified in the
desired output (DOL) field--which can specify either a database or channel
access link--and placed into the VAL field. When set to C<<< supervisory >>>,
the DOL field is ignored and the current value of VAL is used. The desired
output can be written into the VAL field via dpPuts at run-time when the record
is in C<<< supervisory >>> mode. DOL can also be a constant, in which case VAL
is initialized to the constant value. Note that OMSL cannot be C<<< closed_loop
>>> when DOL is a constant. See L<Address Specification> for information on how
to specify database links.
VAL is then converted to RVAL in the routine described in the next section.
However, the C<<< Soft Channel >>> device support module for the mbboDirect
record writes the VAL field's value without any conversion.
=fields OMSL, DOL, VAL
=head3 Convert and Write Parameters
For records that are to write values to hardware devices, the OUT output link
must contain the address of the I/O card, and the DTYP field must specify
the proper device support module. Be aware that the address format differs
according to the I/O bus used. See L<Address Specification> for information
on the format of hardware addresses.
If the mbboDirect record does not use the C<<< Soft Channel >>> device support
module, then VAL is converted to RVAL, and RVAL is the actual 16-bit word sent
out. RVAL is set equal to VAL and then shifted left by the number of bits
specified in the SHFT field (the SHFT value is set by device support and is not
configurable by the user). RVAL is then sent out to the location specified in
the OUT field.
For mbboDirect records that specify a database link, a channel access link, or a
constant, the DTYP field must specify either one of two soft device support
routines--{Soft Channel} or C<<< Raw Soft Channel >>>. The difference between
the two is that C<<< Soft Channel >>> writes the desired output value from VAL
directly to the output link while C<<< Raw Soft Channel >>> writes the value
from RVAL to the output link after it has undergone the conversion described
above. See L<Address Specification> for information on how to specify database
links.
=fields OUT, RVAL, SHFT, B0, B1, B2, B3, B4, B5, B6, B7, B8, B9, BA, BB, BC, BD, BE, BF
=head3 Operator Display Parameters
See L<Fields Common to All Record Types> for more on the record name (NAME) and
description (DESC) fields.
=fields NAME, DESC
=cut
include "dbCommon.dbd"
field(VAL,DBF_LONG) {
prompt("Word")
promptgroup("50 - Output")
asl(ASL0)
pp(TRUE)
}
field(OMSL,DBF_MENU) {
prompt("Output Mode Select")
promptgroup("50 - Output")
special(SPC_RESET)
pp(TRUE)
interest(1)
menu(menuOmsl)
}
field(NOBT,DBF_SHORT) {
prompt("Number of Bits")
promptgroup("50 - Output")
special(SPC_NOMOD)
interest(1)
}
field(DOL,DBF_INLINK) {
prompt("Desired Output Loc")
promptgroup("40 - Input")
interest(1)
}
field(OUT,DBF_OUTLINK) {
prompt("Output Specification")
promptgroup("50 - Output")
interest(1)
}
field(RVAL,DBF_ULONG) {
prompt("Raw Value")
special(SPC_NOMOD)
pp(TRUE)
}
field(ORAW,DBF_ULONG) {
prompt("Prev Raw Value")
special(SPC_NOMOD)
interest(3)
}
field(RBV,DBF_ULONG) {
prompt("Readback Value")
special(SPC_NOMOD)
}
field(ORBV,DBF_ULONG) {
prompt("Prev Readback Value")
special(SPC_NOMOD)
interest(3)
}
field(MASK,DBF_ULONG) {
prompt("Hardware Mask")
special(SPC_NOMOD)
interest(1)
}
field(MLST,DBF_LONG) {
prompt("Last Value Monitored")
special(SPC_NOMOD)
interest(3)
}
field(SHFT,DBF_USHORT) {
prompt("Shift")
promptgroup("50 - Output")
interest(1)
}
=head3 Run-time and Simulation Mode Parameters
These parameters are used by the run-time code for processing the mbbo Direct
record.
MASK is used by device support routine to read the hardware register. Record
support sets low order NOBT bits. Device support can shift this value.
MLST holds the value when the last monitor for value change was triggered.
=fields NOBT, ORAW, MASK, MLST
The following fields are used to operate the mbboDirect record in the simulation
mode. See L<Simulation Mode> for more information on the simulation mode fields.
=fields SIOL, SIML, SIMM, SIMS, SSCN, SDLY
=cut
field(SIOL,DBF_OUTLINK) {
prompt("Simulation Output Link")
promptgroup("90 - Simulate")
interest(1)
}
field(SIML,DBF_INLINK) {
prompt("Simulation Mode Link")
promptgroup("90 - Simulate")
interest(1)
}
field(SIMM,DBF_MENU) {
prompt("Simulation Mode")
special(SPC_MOD)
interest(1)
menu(menuYesNo)
}
field(SIMS,DBF_MENU) {
prompt("Simulation Mode Severity")
promptgroup("90 - Simulate")
interest(2)
menu(menuAlarmSevr)
}
field(OLDSIMM,DBF_MENU) {
prompt("Prev. Simulation Mode")
special(SPC_NOMOD)
interest(4)
menu(menuSimm)
}
field(SSCN,DBF_MENU) {
prompt("Sim. Mode Scan")
promptgroup("90 - Simulate")
interest(1)
menu(menuScan)
initial("65535")
}
field(SDLY,DBF_DOUBLE) {
prompt("Sim. Mode Async Delay")
promptgroup("90 - Simulate")
interest(2)
initial("-1.0")
}
%#include "callback.h"
field(SIMPVT,DBF_NOACCESS) {
prompt("Sim. Mode Private")
special(SPC_NOMOD)
interest(4)
extra("epicsCallback *simpvt")
}
=head3 Alarm Parameters
The possible alarm conditions for mbboDirect records are the SCAN, READ, and
INVALID alarms. The SCAN and READ alarms are not configurable by the user since
they are always of MAJOR severity. See L<Alarm Specification> for a complete
explanation of Scan and Read alarms.
The IVOA field specifies an action to take when the INVALID alarm is triggered.
There are three possible actions: C<<< Continue normally >>>, C<<< Don't drive
outputs >>>, or C<<< Set output to IVOV >>>. When C<<< Set output to IVOV >>> is
specified and a INVALID alarm is triggered, the record will write the value in
the IVOV field to output. See L<Invalid Alarm Output Action> for more
information. L<Alarm Fields> lists other fields related to a alarms that are
common to all record types.
=fields IVOA, IVOV
=cut
field(IVOA,DBF_MENU) {
prompt("INVALID outpt action")
promptgroup("50 - Output")
interest(2)
menu(menuIvoa)
}
field(IVOV,DBF_LONG) {
prompt("INVALID output value")
promptgroup("50 - Output")
interest(2)
}
field(B0,DBF_UCHAR) {
prompt("Bit 0")
promptgroup("51 - Output 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B1,DBF_UCHAR) {
prompt("Bit 1")
promptgroup("51 - Output 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B2,DBF_UCHAR) {
prompt("Bit 2")
promptgroup("51 - Output 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B3,DBF_UCHAR) {
prompt("Bit 3")
promptgroup("51 - Output 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B4,DBF_UCHAR) {
prompt("Bit 4")
promptgroup("51 - Output 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B5,DBF_UCHAR) {
prompt("Bit 5")
promptgroup("51 - Output 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B6,DBF_UCHAR) {
prompt("Bit 6")
promptgroup("51 - Output 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B7,DBF_UCHAR) {
prompt("Bit 7")
promptgroup("51 - Output 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B8,DBF_UCHAR) {
prompt("Bit 8")
promptgroup("52 - Output 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B9,DBF_UCHAR) {
prompt("Bit 9")
promptgroup("52 - Output 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(BA,DBF_UCHAR) {
prompt("Bit 10")
promptgroup("52 - Output 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(BB,DBF_UCHAR) {
prompt("Bit 11")
promptgroup("52 - Output 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(BC,DBF_UCHAR) {
prompt("Bit 12")
promptgroup("52 - Output 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(BD,DBF_UCHAR) {
prompt("Bit 13")
promptgroup("52 - Output 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(BE,DBF_UCHAR) {
prompt("Bit 14")
promptgroup("52 - Output 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(BF,DBF_UCHAR) {
prompt("Bit 15")
promptgroup("52 - Output 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B10,DBF_UCHAR) {
prompt("Bit 16")
promptgroup("53 - Output 16-23")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B11,DBF_UCHAR) {
prompt("Bit 17")
promptgroup("53 - Output 16-23")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B12,DBF_UCHAR) {
prompt("Bit 18")
promptgroup("53 - Output 16-23")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B13,DBF_UCHAR) {
prompt("Bit 19")
promptgroup("53 - Output 16-23")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B14,DBF_UCHAR) {
prompt("Bit 20")
promptgroup("53 - Output 16-23")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B15,DBF_UCHAR) {
prompt("Bit 21")
promptgroup("53 - Output 16-23")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B16,DBF_UCHAR) {
prompt("Bit 22")
promptgroup("53 - Output 16-23")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B17,DBF_UCHAR) {
prompt("Bit 23")
promptgroup("53 - Output 16-23")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B18,DBF_UCHAR) {
prompt("Bit 24")
promptgroup("54 - Output 24-31")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B19,DBF_UCHAR) {
prompt("Bit 25")
promptgroup("54 - Output 24-31")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B1A,DBF_UCHAR) {
prompt("Bit 26")
promptgroup("54 - Output 24-31")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B1B,DBF_UCHAR) {
prompt("Bit 27")
promptgroup("54 - Output 24-31")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B1C,DBF_UCHAR) {
prompt("Bit 28")
promptgroup("54 - Output 24-31")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B1D,DBF_UCHAR) {
prompt("Bit 29")
promptgroup("54 - Output 24-31")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B1E,DBF_UCHAR) {
prompt("Bit 30")
promptgroup("54 - Output 24-31")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
field(B1F,DBF_UCHAR) {
prompt("Bit 31")
promptgroup("54 - Output 24-31")
special(SPC_MOD)
pp(TRUE)
interest(1)
}
=head2 Record Support
=head3 Record Support Routines
=head4 init_record
This routine initializes SIMM if SIML is a constant or creates a channel access
link if SIML is PV_LINK. If SIOL is PV_LINK a channel access link is created.
This routine next checks to see that device support is available.The routine
next checks to see if the device support write routine is defined. If either
device support or the device support write routine does not exist, an error
message is issued and processing is terminated.
If DOL is a constant, then VAL is initialized to its value and UDF is set to
FALSE.
MASK is cleared and then the NOBT low order bits are set.
If device support includes C<init_record()>, it is called.
If device support returns success, VAL is then set from RVAL and UDF is set to
FALSE.
=head4 Process
See next section.
=head3 Record Processing
Routine process implements the following algorithm:
=over
=item 1.
Check to see that the appropriate device support module exists. If it doesn't,
an error message is issued and processing is terminated with the PACT field
still set to TRUE. This ensures that processes will no longer be called for this
record. Thus error storms will not occur.
=item 2.
If PACT is FALSE
=over
=item * If DOL is DB_LINK and OMSL is CLOSED_LOOP
=over
=item * Get value from DOL
=item * Set PACT to FALSE
=back
=back
=item 3.
Convert
=over
=item * If PACT is FALSE, compute RVAL
=over
=item * Set RVAL = VAL
=item * Shift RVAL left SHFT bits
=back
=item * Status=write_mbboDirect
=back
=item 4.
If PACT has been changed to TRUE, the device support write output routine has
started but has not completed writing the new value. In this case, the
processing routine merely returns, leaving PACT TRUE.
=item 5.
Check to see if monitors should be invoked.
=over
=item * Alarm monitors are invoked if the alarm status or severity has changed.
=item * Archive and value change monitors are invoked if MLST is not equal to VAL.
=item * Monitors for RVAL and RBV are checked whenever other monitors are invoked.
=item * NSEV and NSTA are reset to 0.
=back
=item 6.
Scan forward link if necessary, set PACT FALSE, and return.
=back
=begin html
<br><hr><br>
=end html
=head2 Device Support
=head3 Fields Of Interest To Device Support
Each mbboDirect record must have an associated set of device support routines.
The primary responsibility of the device support routines is to obtain a new raw
mbbo value whenever write_mbboDirect is called. The device support routines are
primarily interested in the following fields:
=fields PACT, DPVT, UDF, NSEV, NSTA, NOBT, OUT, RVAL, RBV, MASK, SHFT
=head3 Device Support Routines
Device support consists of the following routines:
=head4 long report(int level)
This optional routine is called by the IOC command C<dbior> and is passed the
report level that was requested by the user.
It should print a report on the state of the device support to stdout.
The C<level> parameter may be used to output increasingly more detailed
information at higher levels, or to select different types of information with
different levels.
Level zero should print no more than a small summary.
=head4 long init(int after)
This optional routine is called twice at IOC initialization time.
The first call happens before any of the C<init_record()> calls are made, with
the integer parameter C<after> set to 0.
The second call happens after all of the C<init_record()> calls have been made,
with C<after> set to 1.
=head4 init_record
init_record(precord)
This routine is optional. If provided, it is called by the record support
C<init_record()> routine. If MASK is used, it should be shifted if necessary and
SHFT given a value.
=head4 get_ioint_info
get_ioint_info(int cmd,struct dbCommon *precord,IOSCANPVT *ppvt)
This routine is called by the ioEventScan system each time the record is added
or deleted from an I/O event scan list. cmd has the value (0,1) if the
record is being (added to, deleted from) an I/O event list. It must be
provided for any device type that can use the ioEvent scanner.
=head4 write_mbboDirect
write_mbboDirect(precord)
This routine must output a new value. It returns the following values:
=over
=item * 0: Success.
=item * Other: Error.
=back
=head3 Device Support For Soft Records
This C<<< SOft Channel >>> module writes the current value of VAL.
If the OUT link type is PV_LINK, then dbCaAddInlink is called by
C<init_record()>.
write_mbboDirect calls recGblPutLinkValue to write the current value of VAL.
See L<Soft Output|Soft_Output>.
=cut
}
+2 -2
View File
@@ -458,9 +458,9 @@ static long writeValue(mbboRecord *prec)
status = dbPutLink(&prec->siol, DBR_USHORT, &prec->val, 1);
prec->pact = FALSE;
} else { /* !prec->pact && delay >= 0. */
CALLBACK *pvt = prec->simpvt;
epicsCallback *pvt = prec->simpvt;
if (!pvt) {
pvt = calloc(1, sizeof(CALLBACK)); /* very lazy allocation of callback structure */
pvt = calloc(1, sizeof(epicsCallback)); /* very lazy allocation of callback structure */
prec->simpvt = pvt;
}
if (pvt) callbackRequestProcessCallbackDelayed(pvt, prec->prio, prec, prec->sdly);
-526
View File
@@ -1,526 +0,0 @@
#*************************************************************************
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
recordtype(mbbo) {
include "dbCommon.dbd"
field(VAL,DBF_ENUM) {
prompt("Desired Value")
promptgroup("50 - Output")
special(SPC_DBADDR)
asl(ASL0)
pp(TRUE)
#=read Yes
#=write Yes
}
field(DOL,DBF_INLINK) {
prompt("Desired Output Loc")
promptgroup("40 - Input")
interest(1)
}
field(OMSL,DBF_MENU) {
prompt("Output Mode Select")
promptgroup("50 - Output")
interest(1)
menu(menuOmsl)
}
field(NOBT,DBF_USHORT) {
prompt("Number of Bits")
promptgroup("50 - Output")
special(SPC_NOMOD)
interest(1)
}
field(OUT,DBF_OUTLINK) {
prompt("Output Specification")
promptgroup("50 - Output")
interest(1)
}
field(ZRVL,DBF_ULONG) {
prompt("Zero Value")
promptgroup("51 - Output 0-7")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(ONVL,DBF_ULONG) {
prompt("One Value")
promptgroup("51 - Output 0-7")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(TWVL,DBF_ULONG) {
prompt("Two Value")
promptgroup("51 - Output 0-7")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(THVL,DBF_ULONG) {
prompt("Three Value")
promptgroup("51 - Output 0-7")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(FRVL,DBF_ULONG) {
prompt("Four Value")
promptgroup("51 - Output 0-7")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(FVVL,DBF_ULONG) {
prompt("Five Value")
promptgroup("51 - Output 0-7")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(SXVL,DBF_ULONG) {
prompt("Six Value")
promptgroup("51 - Output 0-7")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(SVVL,DBF_ULONG) {
prompt("Seven Value")
promptgroup("51 - Output 0-7")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(EIVL,DBF_ULONG) {
prompt("Eight Value")
promptgroup("52 - Output 8-15")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(NIVL,DBF_ULONG) {
prompt("Nine Value")
promptgroup("52 - Output 8-15")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(TEVL,DBF_ULONG) {
prompt("Ten Value")
promptgroup("52 - Output 8-15")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(ELVL,DBF_ULONG) {
prompt("Eleven Value")
promptgroup("52 - Output 8-15")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(TVVL,DBF_ULONG) {
prompt("Twelve Value")
promptgroup("52 - Output 8-15")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(TTVL,DBF_ULONG) {
prompt("Thirteen Value")
promptgroup("52 - Output 8-15")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(FTVL,DBF_ULONG) {
prompt("Fourteen Value")
promptgroup("52 - Output 8-15")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(FFVL,DBF_ULONG) {
prompt("Fifteen Value")
promptgroup("52 - Output 8-15")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(ZRST,DBF_STRING) {
prompt("Zero String")
promptgroup("81 - Display 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(ONST,DBF_STRING) {
prompt("One String")
promptgroup("81 - Display 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(TWST,DBF_STRING) {
prompt("Two String")
promptgroup("81 - Display 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(THST,DBF_STRING) {
prompt("Three String")
promptgroup("81 - Display 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(FRST,DBF_STRING) {
prompt("Four String")
promptgroup("81 - Display 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(FVST,DBF_STRING) {
prompt("Five String")
promptgroup("81 - Display 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(SXST,DBF_STRING) {
prompt("Six String")
promptgroup("81 - Display 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(SVST,DBF_STRING) {
prompt("Seven String")
promptgroup("81 - Display 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(EIST,DBF_STRING) {
prompt("Eight String")
promptgroup("82 - Display 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(NIST,DBF_STRING) {
prompt("Nine String")
promptgroup("82 - Display 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(TEST,DBF_STRING) {
prompt("Ten String")
promptgroup("82 - Display 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(ELST,DBF_STRING) {
prompt("Eleven String")
promptgroup("82 - Display 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(TVST,DBF_STRING) {
prompt("Twelve String")
promptgroup("82 - Display 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(TTST,DBF_STRING) {
prompt("Thirteen String")
promptgroup("82 - Display 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(FTST,DBF_STRING) {
prompt("Fourteen String")
promptgroup("82 - Display 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(FFST,DBF_STRING) {
prompt("Fifteen String")
promptgroup("82 - Display 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(ZRSV,DBF_MENU) {
prompt("State Zero Severity")
promptgroup("71 - Alarm 0-7")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(ONSV,DBF_MENU) {
prompt("State One Severity")
promptgroup("71 - Alarm 0-7")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(TWSV,DBF_MENU) {
prompt("State Two Severity")
promptgroup("71 - Alarm 0-7")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(THSV,DBF_MENU) {
prompt("State Three Severity")
promptgroup("71 - Alarm 0-7")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(FRSV,DBF_MENU) {
prompt("State Four Severity")
promptgroup("71 - Alarm 0-7")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(FVSV,DBF_MENU) {
prompt("State Five Severity")
promptgroup("71 - Alarm 0-7")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(SXSV,DBF_MENU) {
prompt("State Six Severity")
promptgroup("71 - Alarm 0-7")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(SVSV,DBF_MENU) {
prompt("State Seven Severity")
promptgroup("71 - Alarm 0-7")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(EISV,DBF_MENU) {
prompt("State Eight Severity")
promptgroup("72 - Alarm 8-15")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(NISV,DBF_MENU) {
prompt("State Nine Severity")
promptgroup("72 - Alarm 8-15")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(TESV,DBF_MENU) {
prompt("State Ten Severity")
promptgroup("72 - Alarm 8-15")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(ELSV,DBF_MENU) {
prompt("State Eleven Severity")
promptgroup("72 - Alarm 8-15")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(TVSV,DBF_MENU) {
prompt("State Twelve Severity")
promptgroup("72 - Alarm 8-15")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(TTSV,DBF_MENU) {
prompt("State Thirteen Sevr")
promptgroup("72 - Alarm 8-15")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(FTSV,DBF_MENU) {
prompt("State Fourteen Sevr")
promptgroup("72 - Alarm 8-15")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(FFSV,DBF_MENU) {
prompt("State Fifteen Sevr")
promptgroup("72 - Alarm 8-15")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(UNSV,DBF_MENU) {
prompt("Unknown State Sevr")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(COSV,DBF_MENU) {
prompt("Change of State Sevr")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(RVAL,DBF_ULONG) {
prompt("Raw Value")
pp(TRUE)
}
field(ORAW,DBF_ULONG) {
prompt("Prev Raw Value")
special(SPC_NOMOD)
interest(3)
}
field(RBV,DBF_ULONG) {
prompt("Readback Value")
special(SPC_NOMOD)
}
field(ORBV,DBF_ULONG) {
prompt("Prev Readback Value")
special(SPC_NOMOD)
interest(3)
}
field(MASK,DBF_ULONG) {
prompt("Hardware Mask")
special(SPC_NOMOD)
interest(1)
}
field(MLST,DBF_USHORT) {
prompt("Last Value Monitored")
special(SPC_NOMOD)
interest(3)
}
field(LALM,DBF_USHORT) {
prompt("Last Value Alarmed")
special(SPC_NOMOD)
interest(3)
}
field(SDEF,DBF_SHORT) {
prompt("States Defined")
special(SPC_NOMOD)
interest(3)
}
field(SHFT,DBF_USHORT) {
prompt("Shift")
promptgroup("50 - Output")
interest(1)
}
field(SIOL,DBF_OUTLINK) {
prompt("Simulation Output Link")
promptgroup("90 - Simulate")
interest(1)
}
field(SIML,DBF_INLINK) {
prompt("Simulation Mode Link")
promptgroup("90 - Simulate")
interest(1)
}
field(SIMM,DBF_MENU) {
prompt("Simulation Mode")
special(SPC_MOD)
interest(1)
menu(menuYesNo)
}
field(SIMS,DBF_MENU) {
prompt("Simulation Mode Severity")
promptgroup("90 - Simulate")
interest(2)
menu(menuAlarmSevr)
}
field(OLDSIMM,DBF_MENU) {
prompt("Prev. Simulation Mode")
special(SPC_NOMOD)
interest(4)
menu(menuSimm)
}
field(SSCN,DBF_MENU) {
prompt("Sim. Mode Scan")
promptgroup("90 - Simulate")
interest(1)
menu(menuScan)
initial("65535")
}
field(SDLY,DBF_DOUBLE) {
prompt("Sim. Mode Async Delay")
promptgroup("90 - Simulate")
interest(2)
initial("-1.0")
}
%#include "callback.h"
field(SIMPVT,DBF_NOACCESS) {
prompt("Sim. Mode Private")
special(SPC_NOMOD)
interest(4)
extra("CALLBACK *simpvt")
}
field(IVOA,DBF_MENU) {
prompt("INVALID outpt action")
promptgroup("50 - Output")
interest(2)
menu(menuIvoa)
}
field(IVOV,DBF_USHORT) {
prompt("INVALID output value")
promptgroup("50 - Output")
interest(2)
}
}
@@ -0,0 +1,969 @@
#*************************************************************************
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
=title Multi-Bit Binary Output Record (mbbo)
The normal use for the mbbo record type is to send a binary value (representing
one of up to 16 states) to a Digital Output module. It is used for any device
that uses more than one contiguous bit to control it. The mbbo record can also
be used to write discrete values to other records via database or channel access
links.
=recordtype mbbo
=cut
recordtype(mbbo) {
=head2 Parameter Fields
The record-specific fields are described below, grouped by functionality.
=head3 Scan Parameters
The mbbo record has the standard fields for specifying under what circumstances
it will be processed. These fields are listed in L<Scan Fields>. In addition,
L<Scanning Specification> explains how these fields are used. Note that I/O
event scanning is only supported for those card types that interrupt.
=head3 Desired Output Parameters
The multi-bit binary output record, like all output records, must specify where
its output originates. The output mode select (OMSL) field determines whether
the output originates from another record or from database access (i.e., the
operator). When set to C<<< closed_loop >>>, the desired output is retrieved
from the link specified in the desired output (DOL) field--which can specify
either a database or channel access link--and placed into the VAL field. When
set to C<<< supervisory >>>, the DOL field is ignored and the current value of
VAL is simply written. VAL can be changed via dpPuts at run-time when OMSL is
C<<< supervisory >>>. The DOL field can also be a constant, in which case the
VAL field is initialized to the constant value. If DOL is a constant, OMSL
cannot be set to C<<< closed_loop >>>.
The VAL field itself usually consists of an index that specifies one of the
states. The actual output written is the value of RVAL, which is converted from
VAL following the routine explained in the next section. However, records that
use the C<<< Soft Channel >>> device support module write the VAL field's value
without any conversion.
=fields OMSL, DOL, VAL
=head3 Convert and Write Parameters
The device support routines write the desired output to the location specified
in the OUT field. If the record uses soft device support, OUT can contain a
constant, a database link, or a channel access link; however, if OUT is a
constant, no value will be written.
For records that write their values to hardware devices, the OUT output link
must specify the address of the I/O card, and the DTYP field must specify
the corresponding device support module. Be aware that the address format
differs according to the I/O bus used. See L<Address Specification> for
information on the format of hardware addresses.
For mbbo records that write to hardware, the value written to the output
location is the value contained in RVAL, which is converted from VAL, VAL
containing an index of one of the 16 states (0-15). RVAL is then set to the
corresponding state value, the value in one of the fields ZRVL through FFVL.
Then this value is shifted left according to the number in the SHFT field so
that the value is in the correct position for the bits being used (the SHFT
value is set by device support and is not configurable by the user).
The state value fields ZRVL through FFVL must be configured by the user before
run-time. When the state values are not defined, the states defined (SDEF) field
is set to FALSE at initialization time by the record routines. When SDEF is
FALSE, then the record processing routine does not try to find a match, RVAL is
set equal to VAL, the bits are shifted using the number in SHFT, and the value
is written thus.
If the OUT output link specifies a database link, channel access link, or
constant, then the DTYP field must specify either one of the two soft device
support modules-- C<<< Soft Channel >>> or C<<< Raw Soft Channel >>>. C<<< Soft
>>> C<<< Channel >>> writes the value of VAL to the output link, without any
conversion, while C<<< Raw Soft Channel >>> writes the value from RVAL after it
has undergone the above conversion. See L<Address Specification> for information
on specifying links.
Note also that when a string is retrieved as the desired output, a record
support routine is provided (C<<< put_enum_str() >>>) that will check to see
if the string matches one of the strings in the ZRST through FFST fields. If a
match is found, RVAL is set equal to the corresponding state value of that
string.
=fields OUT, DTYP, RVAL, SHFT, SDEF, ZRVL, ONVL, TWVL, THVL, FRVL, FVVL, SXVL, SVVL, EIVL, NIVL, TEVL, ELVL, TVVL, TTVL, FTVL, FFVL
=head3 Operator Display Parameters
These parameters are used to present meaningful data to the operator. These
fields are used to display the value and other parameters of the mbbo record
either textually or graphically. The ZRST-FFST fields contain strings describing
each of the corresponding states. The C<<< get_enum_str() >>> and
C<<< get_enum_strs() >>> record routines retrieve these strings for the
operator. C<<< get_enum_str() >>> gets the string corresponding to the value in
VAL, and C<<< get_enum_strs() >>> retrieves all the strings.
See L<Fields Common to All Record Types> for more on the record name (NAME) and
description (DESC) fields.
=fields NAME, DESC, ZRST, ONST, TWST, THST, FRST, FVST, SXST, SVST, EIST, NIST, TEST, ELST, TVST, TTST, FTST, FFST
=head3 Alarm Parameters
The possible alarm conditions for multi-bit binary outputs are the SCAN, READ,
INVALID, and state alarms. The SCAN and READ alarms are called by the support
modules and are not configurable by the user, as their severity is always MAJOR.
The IVOA field specifies an action to take from a number of possible choices
when the INVALID alarm is triggered. The IVOV field contains a value to be
written once the INVALID alarm has been triggered if C<<< Set output to IVOV >>>
has been chosen in the IVOA field. The severity of the INVALID alarm is not
configurable by the user.
The state alarms are configured in the below severity fields. These fields have
the usual possible values for severity fields: NO_ALARM, MINOR, and MAJOR.
The unknown state severity field (UNSV), if set to MINOR or MAJOR, triggers an
alarm when the record support routine cannot find a matching value in the state
value fields for VAL or when VAL is out of range.
The change of state severity field (COSV) triggers an alarm when the record's
state changes, if set to MAJOR or MINOR.
The state severity (ZRSV-FFSV) fields, when set to MAJOR or MINOR, trigger an
alarm when VAL equals the corresponding field.
See L<Alarm Specification> for a complete explanation of discrete alarms and
these fields. See L<Invalid Alarm Output Action> for an explanation of the IVOA
and IVOV fields. L<Alarm Fields> lists other fields related to a alarms that are
common to all record types.
=fields UNSV, COSV, IVOA, IVOV, ZRSV, ONSV, TWSV, THSV, FRSV, FVSV, SXSV, SVSV, EISV, NISV, TESV, ELSV, TVSV, TTSV, FTSV, FFSV
=head3 Run-Time and Simulation Mode Parameters
These parameters are used by the run-time code for processing the multi-bit
binary output.
MASK is used by device support routine to read the hardware register. Record
support sets low order of MASK the number of bits specified in NOBT. Device
support can shift this value.
The LALM field implements the change of state alarm severity by holding the
value of VAL when the previous change of state alarm was issued.
MLST holds the value when the last monitor for value change was triggered.
SDEF is used by record support to save time if no states are defined; it is used
for converting VAL to RVAL.
=fields NOBT, ORAW, MASK, LALM, MLST, SDEF
The following fields are used to operate the mbbo record in the simulation mode.
See L<Fields Common to Many Record Types> for more information on the simulation
mode fields.
=fields SIOL, SIML, SIMM, SIMS, SSCN, SDLY
=cut
include "dbCommon.dbd"
field(VAL,DBF_ENUM) {
prompt("Desired Value")
promptgroup("50 - Output")
special(SPC_DBADDR)
asl(ASL0)
pp(TRUE)
#=read Yes
#=write Yes
}
field(DOL,DBF_INLINK) {
prompt("Desired Output Loc")
promptgroup("40 - Input")
interest(1)
}
field(OMSL,DBF_MENU) {
prompt("Output Mode Select")
promptgroup("50 - Output")
interest(1)
menu(menuOmsl)
}
field(NOBT,DBF_USHORT) {
prompt("Number of Bits")
promptgroup("50 - Output")
special(SPC_NOMOD)
interest(1)
}
field(OUT,DBF_OUTLINK) {
prompt("Output Specification")
promptgroup("50 - Output")
interest(1)
}
field(ZRVL,DBF_ULONG) {
prompt("Zero Value")
promptgroup("51 - Output 0-7")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(ONVL,DBF_ULONG) {
prompt("One Value")
promptgroup("51 - Output 0-7")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(TWVL,DBF_ULONG) {
prompt("Two Value")
promptgroup("51 - Output 0-7")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(THVL,DBF_ULONG) {
prompt("Three Value")
promptgroup("51 - Output 0-7")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(FRVL,DBF_ULONG) {
prompt("Four Value")
promptgroup("51 - Output 0-7")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(FVVL,DBF_ULONG) {
prompt("Five Value")
promptgroup("51 - Output 0-7")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(SXVL,DBF_ULONG) {
prompt("Six Value")
promptgroup("51 - Output 0-7")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(SVVL,DBF_ULONG) {
prompt("Seven Value")
promptgroup("51 - Output 0-7")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(EIVL,DBF_ULONG) {
prompt("Eight Value")
promptgroup("52 - Output 8-15")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(NIVL,DBF_ULONG) {
prompt("Nine Value")
promptgroup("52 - Output 8-15")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(TEVL,DBF_ULONG) {
prompt("Ten Value")
promptgroup("52 - Output 8-15")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(ELVL,DBF_ULONG) {
prompt("Eleven Value")
promptgroup("52 - Output 8-15")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(TVVL,DBF_ULONG) {
prompt("Twelve Value")
promptgroup("52 - Output 8-15")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(TTVL,DBF_ULONG) {
prompt("Thirteen Value")
promptgroup("52 - Output 8-15")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(FTVL,DBF_ULONG) {
prompt("Fourteen Value")
promptgroup("52 - Output 8-15")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(FFVL,DBF_ULONG) {
prompt("Fifteen Value")
promptgroup("52 - Output 8-15")
special(SPC_MOD)
pp(TRUE)
base(HEX)
interest(1)
}
field(ZRST,DBF_STRING) {
prompt("Zero String")
promptgroup("81 - Display 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(ONST,DBF_STRING) {
prompt("One String")
promptgroup("81 - Display 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(TWST,DBF_STRING) {
prompt("Two String")
promptgroup("81 - Display 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(THST,DBF_STRING) {
prompt("Three String")
promptgroup("81 - Display 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(FRST,DBF_STRING) {
prompt("Four String")
promptgroup("81 - Display 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(FVST,DBF_STRING) {
prompt("Five String")
promptgroup("81 - Display 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(SXST,DBF_STRING) {
prompt("Six String")
promptgroup("81 - Display 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(SVST,DBF_STRING) {
prompt("Seven String")
promptgroup("81 - Display 0-7")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(EIST,DBF_STRING) {
prompt("Eight String")
promptgroup("82 - Display 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(NIST,DBF_STRING) {
prompt("Nine String")
promptgroup("82 - Display 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(TEST,DBF_STRING) {
prompt("Ten String")
promptgroup("82 - Display 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(ELST,DBF_STRING) {
prompt("Eleven String")
promptgroup("82 - Display 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(TVST,DBF_STRING) {
prompt("Twelve String")
promptgroup("82 - Display 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(TTST,DBF_STRING) {
prompt("Thirteen String")
promptgroup("82 - Display 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(FTST,DBF_STRING) {
prompt("Fourteen String")
promptgroup("82 - Display 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(FFST,DBF_STRING) {
prompt("Fifteen String")
promptgroup("82 - Display 8-15")
special(SPC_MOD)
pp(TRUE)
interest(1)
size(26)
}
field(ZRSV,DBF_MENU) {
prompt("State Zero Severity")
promptgroup("71 - Alarm 0-7")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(ONSV,DBF_MENU) {
prompt("State One Severity")
promptgroup("71 - Alarm 0-7")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(TWSV,DBF_MENU) {
prompt("State Two Severity")
promptgroup("71 - Alarm 0-7")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(THSV,DBF_MENU) {
prompt("State Three Severity")
promptgroup("71 - Alarm 0-7")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(FRSV,DBF_MENU) {
prompt("State Four Severity")
promptgroup("71 - Alarm 0-7")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(FVSV,DBF_MENU) {
prompt("State Five Severity")
promptgroup("71 - Alarm 0-7")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(SXSV,DBF_MENU) {
prompt("State Six Severity")
promptgroup("71 - Alarm 0-7")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(SVSV,DBF_MENU) {
prompt("State Seven Severity")
promptgroup("71 - Alarm 0-7")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(EISV,DBF_MENU) {
prompt("State Eight Severity")
promptgroup("72 - Alarm 8-15")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(NISV,DBF_MENU) {
prompt("State Nine Severity")
promptgroup("72 - Alarm 8-15")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(TESV,DBF_MENU) {
prompt("State Ten Severity")
promptgroup("72 - Alarm 8-15")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(ELSV,DBF_MENU) {
prompt("State Eleven Severity")
promptgroup("72 - Alarm 8-15")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(TVSV,DBF_MENU) {
prompt("State Twelve Severity")
promptgroup("72 - Alarm 8-15")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(TTSV,DBF_MENU) {
prompt("State Thirteen Sevr")
promptgroup("72 - Alarm 8-15")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(FTSV,DBF_MENU) {
prompt("State Fourteen Sevr")
promptgroup("72 - Alarm 8-15")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(FFSV,DBF_MENU) {
prompt("State Fifteen Sevr")
promptgroup("72 - Alarm 8-15")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(UNSV,DBF_MENU) {
prompt("Unknown State Sevr")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(COSV,DBF_MENU) {
prompt("Change of State Sevr")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(RVAL,DBF_ULONG) {
prompt("Raw Value")
pp(TRUE)
}
field(ORAW,DBF_ULONG) {
prompt("Prev Raw Value")
special(SPC_NOMOD)
interest(3)
}
field(RBV,DBF_ULONG) {
prompt("Readback Value")
special(SPC_NOMOD)
}
field(ORBV,DBF_ULONG) {
prompt("Prev Readback Value")
special(SPC_NOMOD)
interest(3)
}
field(MASK,DBF_ULONG) {
prompt("Hardware Mask")
special(SPC_NOMOD)
interest(1)
}
field(MLST,DBF_USHORT) {
prompt("Last Value Monitored")
special(SPC_NOMOD)
interest(3)
}
field(LALM,DBF_USHORT) {
prompt("Last Value Alarmed")
special(SPC_NOMOD)
interest(3)
}
field(SDEF,DBF_SHORT) {
prompt("States Defined")
special(SPC_NOMOD)
interest(3)
}
field(SHFT,DBF_USHORT) {
prompt("Shift")
promptgroup("50 - Output")
interest(1)
}
field(SIOL,DBF_OUTLINK) {
prompt("Simulation Output Link")
promptgroup("90 - Simulate")
interest(1)
}
field(SIML,DBF_INLINK) {
prompt("Simulation Mode Link")
promptgroup("90 - Simulate")
interest(1)
}
field(SIMM,DBF_MENU) {
prompt("Simulation Mode")
special(SPC_MOD)
interest(1)
menu(menuYesNo)
}
field(SIMS,DBF_MENU) {
prompt("Simulation Mode Severity")
promptgroup("90 - Simulate")
interest(2)
menu(menuAlarmSevr)
}
field(OLDSIMM,DBF_MENU) {
prompt("Prev. Simulation Mode")
special(SPC_NOMOD)
interest(4)
menu(menuSimm)
}
field(SSCN,DBF_MENU) {
prompt("Sim. Mode Scan")
promptgroup("90 - Simulate")
interest(1)
menu(menuScan)
initial("65535")
}
field(SDLY,DBF_DOUBLE) {
prompt("Sim. Mode Async Delay")
promptgroup("90 - Simulate")
interest(2)
initial("-1.0")
}
%#include "callback.h"
field(SIMPVT,DBF_NOACCESS) {
prompt("Sim. Mode Private")
special(SPC_NOMOD)
interest(4)
extra("epicsCallback *simpvt")
}
field(IVOA,DBF_MENU) {
prompt("INVALID outpt action")
promptgroup("50 - Output")
interest(2)
menu(menuIvoa)
}
field(IVOV,DBF_USHORT) {
prompt("INVALID output value")
promptgroup("50 - Output")
interest(2)
}
}
=head2 Record Support
=head3 Record Support Routines
=head4 init_record
This routine initializes SIMM if SIML is a constant or creates a channel access
link if SIML is PV_LINK. If SIOL is PV_LINK a channel access link is created.
This routine next checks to see that device support is available. The routine
next checks to see if the device support write routine is defined. If either
device support or the device support write routine does not exist, an error
message is issued and processing is terminated.
If DOL is a constant, then VAL is initialized to its value and UDF is set to
FALSE.
MASK is cleared and then the NOBT low order bits are set.
If device support includes C<init_record()>, it is called.
init_common is then called to determine if any states are defined. If states are
defined, SDEF is set to TRUE.
If device support returns success, VAL is then set from RVAL and UDF is set to
FALSE.
=head4 process
See next section.
=head4 special
Computes SDEF when any of the fields ZRVL,...FFVL change value.
=head4 get_value
Fills in the values of struct valueDes so that they refer to VAL.
=head4 get_enum_str
Retrieves ASCII string corresponding to VAL.
=head4 get_enum_strs
Retrieves ASCII strings for ZRST,...FFST.
=head4 put_enum_str
Checks if string matches ZRST,...FFST and if it does, sets VAL.
=head3 Record Processing
Routine process implements the following algorithm:
=over
=item 1.
Check to see that the appropriate device support module exists. If it doesn't,
an error message is issued and processing is terminated with the PACT field
still set to TRUE. This ensures that processes will not longer be called for
this record. Thus error storms will not occur.
=item 2.
If PACT is FALSE
=over
=item *
If DOL is DB_LINK and OMSL is CLOSED_LOOP
=over
=item *
Get value from DOL
=item *
Set UDF to FALSE
=item *
Check for link alarm
=back
=item *
If any state values are defined
=over
=item *
If VAL E<gt> 15, then raise alarm and go to 4
=item *
Else using VAL as index set RVAL = one of ZRVL,...FFVL
=back
=item *
Else set RVAL = VAL
=item *
Shift RVAL left SHFT bits
=back
=item 3.
Convert
=over
=item *
If PACT is FALSE, compute RVAL
=over
=item *
If VAL is 0,...,15, set RVAL from ZRVL,...,FFVL
=item *
If VAL out of range, set RVAL = undefined
=back
=item *
Status = write_mbbo
=back
=item 4.
Check alarms. This routine checks to see if the new VAL causes the alarm status
and severity to change. If so, NSEV, NSTA and LALM are set.
=item 5.
Check severity and write the new value. See L<Simulation Mode> and L<Invalid
Alarm Output Action> for more information.
=item 6.
If PACT has been changed to TRUE, the device support write output routine has
started but has not completed writing the new value. In this case, the
processing routine merely returns, leaving PACT TRUE.
=item 7.
Check to see if monitors should be invoked.
=over
=item *
Alarm monitors are invoked if the alarm status or severity has changed.
=item *
Archive and value change monitors are invoked if MLST is not equal to VAL.
=item *
Monitors for RVAL and RBV are checked whenever other monitors are invoked.
=item *
NSEV and NSTA are reset to 0.
=back
=item 8.
Scan forward link if necessary, set PACT FALSE, and return.
=back
=head2 Device Support
=head3 Fields Of Interest To Device Support
Each mbbo record must have an associated set of device support routines. The
primary responsibility of the device support routines is to obtain a new raw
mbbo value whenever write_mbbo is called. The device support routines are
primarily interested in the following fields:
=fields PACT, DPVT, NSEV, NSTA, NOBT, OUT, RVAL, RBV, MASK, SHFT
=head3 Device Support Routines
Device support consists of the following routines:
=head4 long report(int level)
This optional routine is called by the IOC command C<dbior> and is passed the
report level that was requested by the user.
It should print a report on the state of the device support to stdout.
The C<level> parameter may be used to output increasingly more detailed
information at higher levels, or to select different types of information with
different levels.
Level zero should print no more than a small summary.
=head4 long init(int after)
This optional routine is called twice at IOC initialization time.
The first call happens before any of the C<init_record()> calls are made, with
the integer parameter C<after> set to 0.
The second call happens after all of the C<init_record()> calls have been made,
with C<after> set to 1.
=head4 init_record
init_record(precord)
This routine is optional. If provided, it is called by the record support's
C<init_record()> routine. If MASK is used, it should be shifted if necessary and SHFT
given a value.
=head4 get_ioint_info
get_ioint_info(int cmd,struct dbCommon *precord,IOSCANPVT *ppvt)
This routine is called by the ioEventScan system each time the record is added
or deleted from an I/O event scan list. cmd has the value (0,1) if the
record is being (added to, deleted from) an I/O event list. It must be
provided for any device type that can use the ioEvent scanner.
=head4 write_mbbo
write_mbbo(precord)
This routine must output a new value. It returns the following values:
=over
=item *
0: Success.
=item *
Other: Error.
=back
=head3 Device Support For Soft Records
=head4 Soft Channel
The C<<< Soft Channel >>> module writes the current value of VAL.
If the OUT link type is PV_LINK, then dbCaAddInlink is called by
C<init_record()>.
write_mbbo calls recGblPutLinkValue to write the current value of VAL. See
L<Soft Output> for more information.
=head4 Raw Soft Channel
This module writes RVAL to the location specified in the output link. It returns
a 0.
=cut
@@ -1,38 +0,0 @@
#*************************************************************************
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
recordtype(permissive) {
include "dbCommon.dbd"
field(LABL,DBF_STRING) {
prompt("Button Label")
promptgroup("80 - Display")
pp(TRUE)
interest(1)
size(20)
}
field(VAL,DBF_USHORT) {
prompt("Status")
promptgroup("40 - Input")
asl(ASL0)
pp(TRUE)
}
field(OVAL,DBF_USHORT) {
prompt("Old Status")
special(SPC_NOMOD)
interest(3)
}
field(WFLG,DBF_USHORT) {
prompt("Wait Flag")
pp(TRUE)
}
field(OFLG,DBF_USHORT) {
prompt("Old Flag")
special(SPC_NOMOD)
interest(3)
}
}
@@ -0,0 +1,128 @@
#*************************************************************************
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
=title Permissive Record (permissive)
The permissive record is for communication between a server and a client. An
example would be a sequence program server and an operator interface client. By
using multiple permissive records a sequence program can communicate its current
state to the client.
B<Note this record is deprecated and may be removed in a future EPICS release.>
=recordtype permissive
=cut
recordtype(permissive) {
include "dbCommon.dbd"
=head2 Parameter Fields
The record-specific fields are described below, grouped by functionality.
=head3 Scan Parameters
The permissive record has the standard fields for specifying under what
circumstances the record will be processed. These fields are listed in
L<Scan Fields>. In addition, L<Scanning Specification> explains how these
fields are used. Since the permissive record supports no direct interfaces to
hardware, its SCAN field cannot be C<<< I/O Intr >>>.
=head3 Client-server Parameters
The client and server communicate through the VAL and watchdog flag (WFLG)
fields. At initialization, both fields are set equal to 0, which means OFF. The
server sets WFLG equal to ON when it is ready to accept a request. The client
monitors WFLG and when WFLG equals 1, the client-server action is performed (a
private matter between server and client).
When WFLG is off--when the server is busy--the client program may turn the VAL
field from OFF to ON. After the server finishes its task, it will notice that
VAL is ON and will turn both WFLG and VAL OFF and performs the requested
service.
Note that when WFLG is ON, the client program ''must not'' turn VAL to on.
=fields VAL, WFLG
=cut
field(VAL,DBF_USHORT) {
prompt("Status")
promptgroup("40 - Input")
asl(ASL0)
pp(TRUE)
}
field(WFLG,DBF_USHORT) {
prompt("Wait Flag")
pp(TRUE)
}
=head3 Operator Display Parameters
The label field (LABL) contains a string given to it that should describe the
record in further detail. In addition to the DESC field. See
L<Fields Common to All Record Types> for more on the record name (NAME) and
description (DESC) fields.
=fields LABL, NAME, DESC
=cut
field(LABL,DBF_STRING) {
prompt("Button Label")
promptgroup("80 - Display")
pp(TRUE)
interest(1)
size(20)
}
=head3 Alarm Parameters
The Permissive record has the alarm parameters common to all record types.
L<Alarm Fields> lists other fields related to a alarms that are common to all
record types.
=head3 Run-time Parameters
These fields are used to trigger monitors for each field. Monitors for the VAL
field are triggered when OVAL, the old value field, does not equal VAL.
Likewise, OFLG causes monitors to be invoked for WFLG when WFLG does not equal
OLFG.
=fields OVAL, OFLG
=cut
field(OVAL,DBF_USHORT) {
prompt("Old Status")
special(SPC_NOMOD)
interest(3)
}
field(OFLG,DBF_USHORT) {
prompt("Old Flag")
special(SPC_NOMOD)
interest(3)
}
=head2 Record Support
=head3 Record Support Routines
=head4 process
long (*process)(struct dbCommon *precord)
C<<< process() >>> sets UDF to FALSE, triggers monitors on VAL and WFLG when
they change, and scans the forward link if necessary.
=cut
}
-323
View File
@@ -1,323 +0,0 @@
#*************************************************************************
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
menu(selSELM) {
choice(selSELM_Specified,"Specified")
choice(selSELM_High_Signal,"High Signal")
choice(selSELM_Low_Signal,"Low Signal")
choice(selSELM_Median_Signal,"Median Signal")
}
recordtype(sel) {
include "dbCommon.dbd"
field(VAL,DBF_DOUBLE) {
prompt("Result")
promptgroup("40 - Input")
asl(ASL0)
special(SPC_NOMOD)
}
field(SELM,DBF_MENU) {
prompt("Select Mechanism")
promptgroup("30 - Action")
menu(selSELM)
}
field(SELN,DBF_USHORT) {
prompt("Index value")
}
field(PREC,DBF_SHORT) {
prompt("Display Precision")
promptgroup("80 - Display")
interest(1)
}
field(NVL,DBF_INLINK) {
prompt("Index Value Location")
promptgroup("30 - Action")
interest(1)
}
field(INPA,DBF_INLINK) {
prompt("Input A")
promptgroup("41 - Input A-F")
interest(1)
}
field(INPB,DBF_INLINK) {
prompt("Input B")
promptgroup("41 - Input A-F")
interest(1)
}
field(INPC,DBF_INLINK) {
prompt("Input C")
promptgroup("41 - Input A-F")
interest(1)
}
field(INPD,DBF_INLINK) {
prompt("Input D")
promptgroup("41 - Input A-F")
interest(1)
}
field(INPE,DBF_INLINK) {
prompt("Input E")
promptgroup("41 - Input A-F")
interest(1)
}
field(INPF,DBF_INLINK) {
prompt("Input F")
promptgroup("41 - Input A-F")
interest(1)
}
field(INPG,DBF_INLINK) {
prompt("Input G")
promptgroup("42 - Input G-L")
interest(1)
}
field(INPH,DBF_INLINK) {
prompt("Input H")
promptgroup("42 - Input G-L")
interest(1)
}
field(INPI,DBF_INLINK) {
prompt("Input I")
promptgroup("42 - Input G-L")
interest(1)
}
field(INPJ,DBF_INLINK) {
prompt("Input J")
promptgroup("42 - Input G-L")
interest(1)
}
field(INPK,DBF_INLINK) {
prompt("Input K")
promptgroup("42 - Input G-L")
interest(1)
}
field(INPL,DBF_INLINK) {
prompt("Input L")
promptgroup("42 - Input G-L")
interest(1)
}
field(EGU,DBF_STRING) {
prompt("Engineering Units")
promptgroup("80 - Display")
interest(1)
size(16)
prop(YES)
}
field(HOPR,DBF_DOUBLE) {
prompt("High Operating Rng")
promptgroup("80 - Display")
interest(1)
prop(YES)
}
field(LOPR,DBF_DOUBLE) {
prompt("Low Operating Range")
promptgroup("80 - Display")
interest(1)
prop(YES)
}
field(HIHI,DBF_DOUBLE) {
prompt("Hihi Alarm Limit")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
}
field(LOLO,DBF_DOUBLE) {
prompt("Lolo Alarm Limit")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
}
field(HIGH,DBF_DOUBLE) {
prompt("High Alarm Limit")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
}
field(LOW,DBF_DOUBLE) {
prompt("Low Alarm Limit")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
}
field(HHSV,DBF_MENU) {
prompt("Hihi Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
menu(menuAlarmSevr)
}
field(LLSV,DBF_MENU) {
prompt("Lolo Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
menu(menuAlarmSevr)
}
field(HSV,DBF_MENU) {
prompt("High Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
menu(menuAlarmSevr)
}
field(LSV,DBF_MENU) {
prompt("Low Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
menu(menuAlarmSevr)
}
field(HYST,DBF_DOUBLE) {
prompt("Alarm Deadband")
promptgroup("70 - Alarm")
interest(1)
}
field(ADEL,DBF_DOUBLE) {
prompt("Archive Deadband")
promptgroup("80 - Display")
interest(1)
}
field(MDEL,DBF_DOUBLE) {
prompt("Monitor Deadband")
promptgroup("80 - Display")
interest(1)
}
field(A,DBF_DOUBLE) {
prompt("Value of Input A")
pp(TRUE)
}
field(B,DBF_DOUBLE) {
prompt("Value of Input B")
pp(TRUE)
}
field(C,DBF_DOUBLE) {
prompt("Value of Input C")
pp(TRUE)
}
field(D,DBF_DOUBLE) {
prompt("Value of Input D")
pp(TRUE)
}
field(E,DBF_DOUBLE) {
prompt("Value of Input E")
pp(TRUE)
}
field(F,DBF_DOUBLE) {
prompt("Value of Input F")
pp(TRUE)
}
field(G,DBF_DOUBLE) {
prompt("Value of Input G")
pp(TRUE)
}
field(H,DBF_DOUBLE) {
prompt("Value of Input H")
pp(TRUE)
}
field(I,DBF_DOUBLE) {
prompt("Value of Input I")
pp(TRUE)
}
field(J,DBF_DOUBLE) {
prompt("Value of Input J")
pp(TRUE)
}
field(K,DBF_DOUBLE) {
prompt("Value of Input K")
pp(TRUE)
}
field(L,DBF_DOUBLE) {
prompt("Value of Input L")
pp(TRUE)
}
field(LA,DBF_DOUBLE) {
prompt("Prev Value of A")
special(SPC_NOMOD)
interest(3)
}
field(LB,DBF_DOUBLE) {
prompt("Prev Value of B")
special(SPC_NOMOD)
interest(3)
}
field(LC,DBF_DOUBLE) {
prompt("Prev Value of C")
special(SPC_NOMOD)
interest(3)
}
field(LD,DBF_DOUBLE) {
prompt("Prev Value of D")
special(SPC_NOMOD)
interest(3)
}
field(LE,DBF_DOUBLE) {
prompt("Prev Value of E")
special(SPC_NOMOD)
interest(3)
}
field(LF,DBF_DOUBLE) {
prompt("Prev Value of F")
special(SPC_NOMOD)
interest(3)
}
field(LG,DBF_DOUBLE) {
prompt("Prev Value of G")
special(SPC_NOMOD)
interest(3)
}
field(LH,DBF_DOUBLE) {
prompt("Prev Value of H")
special(SPC_NOMOD)
interest(3)
}
field(LI,DBF_DOUBLE) {
prompt("Prev Value of I")
special(SPC_NOMOD)
interest(3)
}
field(LJ,DBF_DOUBLE) {
prompt("Prev Value of J")
special(SPC_NOMOD)
interest(3)
}
field(LK,DBF_DOUBLE) {
prompt("Prev Value of K")
special(SPC_NOMOD)
interest(3)
}
field(LL,DBF_DOUBLE) {
prompt("Prev Value of L")
special(SPC_NOMOD)
interest(3)
}
field(LALM,DBF_DOUBLE) {
prompt("Last Value Alarmed")
special(SPC_NOMOD)
interest(3)
}
field(ALST,DBF_DOUBLE) {
prompt("Last Value Archived")
special(SPC_NOMOD)
interest(3)
}
field(MLST,DBF_DOUBLE) {
prompt("Last Val Monitored")
special(SPC_NOMOD)
interest(3)
}
field(NLST,DBF_USHORT) {
prompt("Last Index Monitored")
special(SPC_NOMOD)
interest(3)
}
}
@@ -0,0 +1,594 @@
#*************************************************************************
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
=title Select Record (sel)
The select record computes a value based on input obtained from up to 12
locations. The selection algorithm can be one of the following: C<<< Specified
>>>, C<<< High Signal >>>, C<<< Low Signal >>>, C<<< Median Signal >>>. Each
input can be a constant, a database link, or a channel access link.
=recordtype sel
=cut
menu(selSELM) {
choice(selSELM_Specified,"Specified")
choice(selSELM_High_Signal,"High Signal")
choice(selSELM_Low_Signal,"Low Signal")
choice(selSELM_Median_Signal,"Median Signal")
}
recordtype(sel) {
=head2 Parameter Fields
The record-specific fields are described below, grouped by functionality.
=head3 Scan Parameters
The select record has the standard fields for specifying under what
circumstances the record will be processed. These fields are listed in
L<Scan Fields>. In addition, L<Scanning Specification>
explains how these fields work.
=head3 Read Parameters
The INPA-L links determine where the selection record retrieves the values from
which it is to select or compute its final value. The INPA-L links are input
links configured by the user to be either constants, channel access links, or
database links. If channel access or database links, a value is retrieved for
each link and placed in the corresponding value field, A-L. If any input link is
a constant, the value field for that link will be initialized with the constant
value given to it and can be modified via dbPuts. See L<Address Specification>
for information on how to specify database links.
Any links not defined are ignored by the selection record and its algorithm. An
undefined link is any constant link whose value is 0. At initialization time,
the corresponding value links for such fields are set to NaN, which means
MISSING. The value field of an undefined link can be changed at run-time from
NaN to another value in order to define the link and its field. Note that all
undefined links must be recognized as such if the selection algorithm is to work
as expected.
=fields INPA, INPB, INPC, INPD, INPE, INPF, INPG, INPH, INPI, INPJ, INPK, INPL, A, B, C, D, E, F, G, H, I, J, K, L
=head3 Select Parameters
The selection algorithm is determined by three fields configurable by the user:
the select mechanism (SELM) field, the select number (SELN) field, and the index
value location (NVL) field.
The SELM field has four choices, i.e., four algorithms as follows:
=head4 Menu selSELM
=menu selSELM
The selection record's VAL field is determined differently for each algorithm.
For C<<< Specified >>>, the VAL field is set equal to the value field (A, B, C,
D, E, F, G, H, I, J, K, or L) specified by the SELN field. The SELN field
contains a
number from 0-11 which corresponds to the value field to be used (0 means use A;
1 means use B, etc.). How the NVL field is configured determines, in turn,
SELN's value. NVL is an input link from which a value for SELN can be retrieved,
Like most other input links NVL can be a constant, or a channel access or
database link. If NVL is a link, SELN is retrieved from the location in NVL. If
a constant, SELN is initialized to the value given to the constant and can be
changed via dbPuts. See L<Address Specification> for information on how to
specify database links.
The C<<< High Signal >>>, C<<< Low Signal >>>, and C<<< Median Signal >>>
algorithms do not use SELN or NVL. If C<<< High Signal >>> is chosen, VAL is set
equal to the highest value out of all the defined value fields (A-L). If C<<<
Low Signal >>> is chosen, VAL is set equal to lowest value of all the defined
fields (A-L). And if C<<< Median Signal >>> is chosen, VAL is set equal to the
median value of the defined value fields (A-L). (Note that these algorithms
select from the value fields; they do not select from the value field index. For
instance, C<<< Low Signal >>> will not select the A field's value unless the
value itself is the lowest of all the defined values.)
=fields SELM, SELN, NVL
=head3 Operator Display Parameters
These parameters are used to present meaningful data to the operator. They
display the value and other parameters of the select record either textually or
graphically.
EGU is a string of up to 16 characters describing the units that the selection
record manipulates. It is retrieved by the C<<< get_units >>> record support
routine.
The HOPR and LOPR fields set the upper and lower display limits for the VAL,
HIHI, HIGH, LOW, and LOLO fields. Both the C<<< get_graphic_double >>> and C<<<
get_control_double >>> record support routines retrieve these fields.
The PREC field determines the floating point precision with which to display
VAL. It is used whenever the C<<< get_precision >>> record support routine is
called.
See L<Fields Common to All Record Types> for more on the record name (NAME)
and description (DESC) fields.
=fields EGU, HOPR, LOPR, PREC, NAME, DESC
=head3 Alarm Parameters
The possible alarm conditions for select records are the SCAN, READ, and limit
alarms. The SCAN and READ alarms are called by the record or device support
routines. The limit alarms are configured by the user in the HIHI, LOLO, HIGH,
and LOW fields using numerical values. They specify conditions for the VAL
field. For each of these fields, there is a corresponding severity field which
can be either NO_ALARM, MINOR, or MAJOR. See L<Alarm Specification>
for a complete explanation of alarms and these fields. L<Alarm Fields>
lists other fields related to a alarms that are common to all record types.
=fields HIHI, HIGH, LOW, LOLO, HHSV, HSV, LSV, LLSV, HYST
=head3 Monitor Parameters
These fields are configurable by the user. They are used as deadbands for the
archiver and monitor calls for the VAL field. Unless, VAL changes by more than
the value specified by each, then the respective monitors will not be called. If
these fields have a value of zero, everytime the VAL changes, monitors are
triggered; if they have a value of -1, everytime the record is processed,
monitors are triggered. L<Monitor Specification>
gives a complete explanation of alarms and deadbands.
=fields ADEL, MDEL
=head3 Run-time Parameters
These parameters are used by the run-time code for processing the selection
record. They are not configurable prior to run-time, nor are they modifiable at
run-time. They represent the current state of the record. The record support
routines use some of them for more efficient processing.
The VAL field is the result of the selection record's processing. It can be
accessed in the normal way by another record or through database access, but is
not modifiable except by the record itself. The LALM, ALST, and the MLST are
used to implement the HYST, ADEL, and MDEL hysteresis factors for the alarms,
archiver, and monitors, respectively.
The LA-LL fields are used to implement the monitors for each of the value
fields, A-L. They represent previous input values. For example, unless LA is not
equal to A, no monitor is invoked for A.
=fields VAL, LALM, ALST, MLST, LA, LB, LC, LD, LE, LF, LG, LH, LI, LJ, LK, LL
=head2 Record Support
=head3 Record Support Routines
=head4 init_record
long (*init_record)(struct dbCommon *precord, int pass)
IF NVL is a constant, SELN is set to its value. If NVL is a PV_LINK a channel
access link is created.
For each constant input link, the corresponding value field is initialized with
the constant value (or NaN if the constant has the value 0).
For each input link that is of type PV_LINK, a database or channel access link
is created.
=head4 process
long (*process)(struct dbCommon *precord)
See L<Record Processing>.
=head4 get_units
long (*get_units)(struct dbAddr *paddr, char *units)
Retrieves EGU.
=head4 get_precision
long (*get_precision)(const struct dbAddr *paddr, long *precision)
Retrieves PREC.
=head4 get_graphic_double
long (*get_graphic_double)(struct dbAddr *paddr, struct dbr_grDouble *p)
Sets the upper display and lower display limits for a field. If the field is
VAL, HIHI, HIGH, LOW, or LOLO, the limits are set to HOPR and LOPR, else if the
field has upper and lower limits defined they will be used, else the upper and
lower maximum values for the field type will be used.
=head4 get_control_double
long (*get_control_double)(struct dbAddr *paddr, struct dbr_ctrlDouble *p)
Sets the upper control and the lower control limits for a field. If the field is
VAL, HIHI, HIGH, LOW, or LOLO, the limits are set to HOPR and LOPR, else if the
field has upper and lower limits defined they will be used, else the upper and
lower maximum values for the field type will be used.
=head4 get_alarm_double
long (*get_alarm_double)(struct dbAddr *paddr, struct dbr_alDouble *p)
Sets the following values:
upper_alarm_limit = HIHI
upper_warning_limit = HIGH
lower_warning_limit = LOW
lower_alarm_limit = LOLO
=head3 Record Processing
Routine process implements the following algorithm:
=over
=item 1.
If NVL is a database or channel access link, SELN is obtained from NVL. Fetch
all values if database or channel access links. If SELM is SELECTED, then only
the selected link is fetched.
=item 2.
Implement the appropriate selection algorithm. For SELECT_HIGH, SELECT_LOW, and
SELECT_MEDIAN, input fields are ignored if they are undefined. If success, UDF
is set to FALSE.
=item 3.
Check alarms. This routine checks to see if the new VAL causes the alarm status
and severity to change. If so, NSEV, NSTA, and LALM are set. It also honors the
alarm hysteresis factor (HYST). Thus the value must change by more than HYST
before the alarm status and severity is lowered.
=item 4.
Check to see if monitors should be invoked.
=over
=item *
Alarm monitors are invoked if the alarm status or severity has changed.
=item *
Archive and value change monitors are invoked if ADEL and MDEL conditions are
met
=item *
Monitors for A-L are checked whenever other monitors are invoked
=item *
NSEV and NSTA are reset to 0.
=back
=item 5.
Scan forward link if necessary, set PACT FALSE, and return.
=back
=cut
include "dbCommon.dbd"
field(VAL,DBF_DOUBLE) {
prompt("Result")
promptgroup("40 - Input")
asl(ASL0)
special(SPC_NOMOD)
}
field(SELM,DBF_MENU) {
prompt("Select Mechanism")
promptgroup("30 - Action")
menu(selSELM)
}
field(SELN,DBF_USHORT) {
prompt("Index value")
}
field(PREC,DBF_SHORT) {
prompt("Display Precision")
promptgroup("80 - Display")
interest(1)
}
field(NVL,DBF_INLINK) {
prompt("Index Value Location")
promptgroup("30 - Action")
interest(1)
}
field(INPA,DBF_INLINK) {
prompt("Input A")
promptgroup("41 - Input A-F")
interest(1)
}
field(INPB,DBF_INLINK) {
prompt("Input B")
promptgroup("41 - Input A-F")
interest(1)
}
field(INPC,DBF_INLINK) {
prompt("Input C")
promptgroup("41 - Input A-F")
interest(1)
}
field(INPD,DBF_INLINK) {
prompt("Input D")
promptgroup("41 - Input A-F")
interest(1)
}
field(INPE,DBF_INLINK) {
prompt("Input E")
promptgroup("41 - Input A-F")
interest(1)
}
field(INPF,DBF_INLINK) {
prompt("Input F")
promptgroup("41 - Input A-F")
interest(1)
}
field(INPG,DBF_INLINK) {
prompt("Input G")
promptgroup("42 - Input G-L")
interest(1)
}
field(INPH,DBF_INLINK) {
prompt("Input H")
promptgroup("42 - Input G-L")
interest(1)
}
field(INPI,DBF_INLINK) {
prompt("Input I")
promptgroup("42 - Input G-L")
interest(1)
}
field(INPJ,DBF_INLINK) {
prompt("Input J")
promptgroup("42 - Input G-L")
interest(1)
}
field(INPK,DBF_INLINK) {
prompt("Input K")
promptgroup("42 - Input G-L")
interest(1)
}
field(INPL,DBF_INLINK) {
prompt("Input L")
promptgroup("42 - Input G-L")
interest(1)
}
field(EGU,DBF_STRING) {
prompt("Engineering Units")
promptgroup("80 - Display")
interest(1)
size(16)
prop(YES)
}
field(HOPR,DBF_DOUBLE) {
prompt("High Operating Rng")
promptgroup("80 - Display")
interest(1)
prop(YES)
}
field(LOPR,DBF_DOUBLE) {
prompt("Low Operating Range")
promptgroup("80 - Display")
interest(1)
prop(YES)
}
field(HIHI,DBF_DOUBLE) {
prompt("Hihi Alarm Limit")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
}
field(LOLO,DBF_DOUBLE) {
prompt("Lolo Alarm Limit")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
}
field(HIGH,DBF_DOUBLE) {
prompt("High Alarm Limit")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
}
field(LOW,DBF_DOUBLE) {
prompt("Low Alarm Limit")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
}
field(HHSV,DBF_MENU) {
prompt("Hihi Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
menu(menuAlarmSevr)
}
field(LLSV,DBF_MENU) {
prompt("Lolo Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
menu(menuAlarmSevr)
}
field(HSV,DBF_MENU) {
prompt("High Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
menu(menuAlarmSevr)
}
field(LSV,DBF_MENU) {
prompt("Low Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
menu(menuAlarmSevr)
}
field(HYST,DBF_DOUBLE) {
prompt("Alarm Deadband")
promptgroup("70 - Alarm")
interest(1)
}
field(ADEL,DBF_DOUBLE) {
prompt("Archive Deadband")
promptgroup("80 - Display")
interest(1)
}
field(MDEL,DBF_DOUBLE) {
prompt("Monitor Deadband")
promptgroup("80 - Display")
interest(1)
}
field(A,DBF_DOUBLE) {
prompt("Value of Input A")
pp(TRUE)
}
field(B,DBF_DOUBLE) {
prompt("Value of Input B")
pp(TRUE)
}
field(C,DBF_DOUBLE) {
prompt("Value of Input C")
pp(TRUE)
}
field(D,DBF_DOUBLE) {
prompt("Value of Input D")
pp(TRUE)
}
field(E,DBF_DOUBLE) {
prompt("Value of Input E")
pp(TRUE)
}
field(F,DBF_DOUBLE) {
prompt("Value of Input F")
pp(TRUE)
}
field(G,DBF_DOUBLE) {
prompt("Value of Input G")
pp(TRUE)
}
field(H,DBF_DOUBLE) {
prompt("Value of Input H")
pp(TRUE)
}
field(I,DBF_DOUBLE) {
prompt("Value of Input I")
pp(TRUE)
}
field(J,DBF_DOUBLE) {
prompt("Value of Input J")
pp(TRUE)
}
field(K,DBF_DOUBLE) {
prompt("Value of Input K")
pp(TRUE)
}
field(L,DBF_DOUBLE) {
prompt("Value of Input L")
pp(TRUE)
}
field(LA,DBF_DOUBLE) {
prompt("Prev Value of A")
special(SPC_NOMOD)
interest(3)
}
field(LB,DBF_DOUBLE) {
prompt("Prev Value of B")
special(SPC_NOMOD)
interest(3)
}
field(LC,DBF_DOUBLE) {
prompt("Prev Value of C")
special(SPC_NOMOD)
interest(3)
}
field(LD,DBF_DOUBLE) {
prompt("Prev Value of D")
special(SPC_NOMOD)
interest(3)
}
field(LE,DBF_DOUBLE) {
prompt("Prev Value of E")
special(SPC_NOMOD)
interest(3)
}
field(LF,DBF_DOUBLE) {
prompt("Prev Value of F")
special(SPC_NOMOD)
interest(3)
}
field(LG,DBF_DOUBLE) {
prompt("Prev Value of G")
special(SPC_NOMOD)
interest(3)
}
field(LH,DBF_DOUBLE) {
prompt("Prev Value of H")
special(SPC_NOMOD)
interest(3)
}
field(LI,DBF_DOUBLE) {
prompt("Prev Value of I")
special(SPC_NOMOD)
interest(3)
}
field(LJ,DBF_DOUBLE) {
prompt("Prev Value of J")
special(SPC_NOMOD)
interest(3)
}
field(LK,DBF_DOUBLE) {
prompt("Prev Value of K")
special(SPC_NOMOD)
interest(3)
}
field(LL,DBF_DOUBLE) {
prompt("Prev Value of L")
special(SPC_NOMOD)
interest(3)
}
field(LALM,DBF_DOUBLE) {
prompt("Last Value Alarmed")
special(SPC_NOMOD)
interest(3)
}
field(ALST,DBF_DOUBLE) {
prompt("Last Value Archived")
special(SPC_NOMOD)
interest(3)
}
field(MLST,DBF_DOUBLE) {
prompt("Last Val Monitored")
special(SPC_NOMOD)
interest(3)
}
field(NLST,DBF_USHORT) {
prompt("Last Index Monitored")
special(SPC_NOMOD)
interest(3)
}
}
+3 -3
View File
@@ -31,7 +31,7 @@
static void processNextLink(seqRecord *prec);
static long asyncFinish(seqRecord *prec);
static void processCallback(CALLBACK *arg);
static void processCallback(epicsCallback *arg);
/* Create RSET - Record Support Entry Table*/
#define report NULL
@@ -94,7 +94,7 @@ typedef struct linkGrp {
/* The list of link-groups for processing */
typedef struct seqRecPvt {
CALLBACK callback;
epicsCallback callback;
seqRecord *prec;
linkGrp *grps[NUM_LINKS + 1]; /* List of link-groups */
int index; /* Where we are now */
@@ -241,7 +241,7 @@ static long asyncFinish(seqRecord *prec)
}
static void processCallback(CALLBACK *arg)
static void processCallback(epicsCallback *arg)
{
seqRecPvt *pcb;
seqRecord *prec;
-365
View File
@@ -1,365 +0,0 @@
#*************************************************************************
# Copyright (c) 2012 UChicago Argonne LLC, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
menu(seqSELM) {
choice(seqSELM_All,"All")
choice(seqSELM_Specified,"Specified")
choice(seqSELM_Mask,"Mask")
}
recordtype(seq) {
include "dbCommon.dbd"
field(VAL,DBF_LONG) {
prompt("Used to trigger")
asl(ASL0)
pp(TRUE)
}
field(SELM,DBF_MENU) {
prompt("Select Mechanism")
promptgroup("30 - Action")
interest(1)
menu(seqSELM)
}
field(SELN,DBF_USHORT) {
prompt("Link Selection")
interest(1)
initial("1")
}
field(SELL,DBF_INLINK) {
prompt("Link Selection Loc")
promptgroup("30 - Action")
interest(1)
}
field(OFFS,DBF_SHORT) {
prompt("Offset for Specified")
promptgroup("30 - Action")
interest(1)
initial("0")
}
field(SHFT,DBF_SHORT) {
prompt("Shift for Mask mode")
promptgroup("30 - Action")
interest(1)
initial("-1")
}
field(OLDN,DBF_USHORT) {
prompt("Old Selection")
interest(4)
}
field(PREC,DBF_SHORT) {
prompt("Display Precision")
promptgroup("80 - Display")
interest(1)
}
field(DLY0,DBF_DOUBLE) {
prompt("Delay 0")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DOL0,DBF_INLINK) {
prompt("Input link 0")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DO0,DBF_DOUBLE) {
prompt("Value 0")
interest(1)
}
field(LNK0,DBF_OUTLINK) {
prompt("Output Link 0")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DLY1,DBF_DOUBLE) {
prompt("Delay 1")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DOL1,DBF_INLINK) {
prompt("Input link1")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DO1,DBF_DOUBLE) {
prompt("Value 1")
interest(1)
}
field(LNK1,DBF_OUTLINK) {
prompt("Output Link 1")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DLY2,DBF_DOUBLE) {
prompt("Delay 2")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DOL2,DBF_INLINK) {
prompt("Input link 2")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DO2,DBF_DOUBLE) {
prompt("Value 2")
interest(1)
}
field(LNK2,DBF_OUTLINK) {
prompt("Output Link 2")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DLY3,DBF_DOUBLE) {
prompt("Delay 3")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DOL3,DBF_INLINK) {
prompt("Input link 3")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DO3,DBF_DOUBLE) {
prompt("Value 3")
interest(1)
}
field(LNK3,DBF_OUTLINK) {
prompt("Output Link 3")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DLY4,DBF_DOUBLE) {
prompt("Delay 4")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DOL4,DBF_INLINK) {
prompt("Input link 4")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DO4,DBF_DOUBLE) {
prompt("Value 4")
interest(1)
}
field(LNK4,DBF_OUTLINK) {
prompt("Output Link 4")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DLY5,DBF_DOUBLE) {
prompt("Delay 5")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DOL5,DBF_INLINK) {
prompt("Input link 5")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DO5,DBF_DOUBLE) {
prompt("Value 5")
interest(1)
}
field(LNK5,DBF_OUTLINK) {
prompt("Output Link 5")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DLY6,DBF_DOUBLE) {
prompt("Delay 6")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DOL6,DBF_INLINK) {
prompt("Input link 6")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DO6,DBF_DOUBLE) {
prompt("Value 6")
interest(1)
}
field(LNK6,DBF_OUTLINK) {
prompt("Output Link 6")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DLY7,DBF_DOUBLE) {
prompt("Delay 7")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DOL7,DBF_INLINK) {
prompt("Input link 7")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DO7,DBF_DOUBLE) {
prompt("Value 7")
interest(1)
}
field(LNK7,DBF_OUTLINK) {
prompt("Output Link 7")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DLY8,DBF_DOUBLE) {
prompt("Delay 8")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DOL8,DBF_INLINK) {
prompt("Input link 8")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DO8,DBF_DOUBLE) {
prompt("Value 8")
interest(1)
}
field(LNK8,DBF_OUTLINK) {
prompt("Output Link 8")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DLY9,DBF_DOUBLE) {
prompt("Delay 9")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DOL9,DBF_INLINK) {
prompt("Input link 9")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DO9,DBF_DOUBLE) {
prompt("Value 9")
interest(1)
}
field(LNK9,DBF_OUTLINK) {
prompt("Output Link 9")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DLYA,DBF_DOUBLE) {
prompt("Delay 10")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DOLA,DBF_INLINK) {
prompt("Input link 10")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DOA,DBF_DOUBLE) {
prompt("Value 10")
interest(1)
}
field(LNKA,DBF_OUTLINK) {
prompt("Output Link 10")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DLYB,DBF_DOUBLE) {
prompt("Delay 11")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DOLB,DBF_INLINK) {
prompt("Input link 11")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DOB,DBF_DOUBLE) {
prompt("Value 11")
interest(1)
}
field(LNKB,DBF_OUTLINK) {
prompt("Output Link 11")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DLYC,DBF_DOUBLE) {
prompt("Delay 12")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DOLC,DBF_INLINK) {
prompt("Input link 12")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DOC,DBF_DOUBLE) {
prompt("Value 12")
interest(1)
}
field(LNKC,DBF_OUTLINK) {
prompt("Output Link 12")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DLYD,DBF_DOUBLE) {
prompt("Delay 13")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DOLD,DBF_INLINK) {
prompt("Input link 13")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DOD,DBF_DOUBLE) {
prompt("Value 13")
interest(1)
}
field(LNKD,DBF_OUTLINK) {
prompt("Output Link 13")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DLYE,DBF_DOUBLE) {
prompt("Delay 14")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DOLE,DBF_INLINK) {
prompt("Input link 14")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DOE,DBF_DOUBLE) {
prompt("Value 14")
interest(1)
}
field(LNKE,DBF_OUTLINK) {
prompt("Output Link 14")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DLYF,DBF_DOUBLE) {
prompt("Delay 15")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DOLF,DBF_INLINK) {
prompt("Input link 15")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DOF,DBF_DOUBLE) {
prompt("Value 15")
interest(1)
}
field(LNKF,DBF_OUTLINK) {
prompt("Output Link 15")
promptgroup("42 - Link 8-F")
interest(1)
}
}
variable(seqDLYprecision, int)
variable(seqDLYlimit, double)
@@ -0,0 +1,593 @@
#*************************************************************************
# Copyright (c) 2012 UChicago Argonne LLC, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
=title Sequence Record (seq)
The Sequence record is used to trigger the processing of up to ten other records
and send values to those records. It is similar to the fanout record, except
that it will fetch an input value and write an output value instead of simply
processing a collection of forward links. It can also specify one of several
selection algorithms that determine which values to write. It has no associated
device support.
=recordtype seq
=cut
menu(seqSELM) {
choice(seqSELM_All,"All")
choice(seqSELM_Specified,"Specified")
choice(seqSELM_Mask,"Mask")
}
recordtype(seq) {
=head2 Parameter Fields
The record-specific fields are described below, grouped by functionality.
=head3 Scan Parameters
The sequence record has the standard fields for specifying under what
circumstances it will be processed. These fields are listed in L<Scan Fields>.
In addition, L<Scanning Specification> explains how these fields are used.
=head3 Desired Output Parameters
These fields determine where the record retrieves the values it is to write to
other records. All of these values are not necessarily used, depending on the
selection algorithm.
The sequence record can retrieve up to 16 values from 16 locations. The user
specifies the locations in the Desired Output Link fields (DOL0-DOLF), which can
be either constants, database links, or channel access links. If a Desired
Output Link is a constant, the corresponding value field for that link is
initialized to the constant value and ''cannot'' be changed via dbputs.
Otherwise, if the Desired Output Link is a database or channel access link, a
value is fetched from the link each time the record is processed (provided that
the output link is part of the record's selection algorithm). See L<Address
Specification> for information on how to specify database links.
The value fetched from the Desired Output Links are stored in the corresponding
Desired Output Value fields (DO0-DOF). These fields can be initialized to a
constant value, but they cannot be changed via dbPuts.
=head4 Desired Output Link Fields
=fields DOL0, DOL1, DOL2, DOL3, DOL4, DOL5, DOL6, DOL7, DOL8, DOL9, DOLA, DOLB, DOLC, DOLD, DOLE, DOLF
=head4 Desired Output Value Fields
=fields DO0, DO1, DO2, DO3, DO4, DO5, DO6, DO7, DO8, DO9, DOA, DOB, DOC, DOD, DOE, DOF
=head3 Output Parameters
When the record is processed, the desired output values are retrieved for the
links in the record's selection algorithm and are written to the corresponding
output link (LNK0-LNKF). These output links can be database links or channel
access links; they cannot be device addresses. There are sixteen output links, one
for each desired output link. Only those that are defined are used.
=fields LNK0, LNK1, LNK2, LNK3, LNK4, LNK5, LNK6, LNK7, LNK8, LNK9, LNKA, LNKB, LNKC, LNKD, LNKE, LNKF
=head3 Selection Algorithm Parameters
When the sequence record is processed, it uses a selection algorithm similar to
that of the selection record to decide which links to process.The select
mechanism field (SELM) has three algorithms to choose from: C<<< All >>>,
C<<<Specified >>> or C<<< Mask >>>.
=head4 Record fields related to the Selection Algorithm
=fields SELM, SELN, SELL, SHFT, OFFS
=head4 Fields Description
B<SELM - Selection Mode>
=menu seqSELM
See L<Selection Algorithms Description> below;
B<SELL - Link Selection Location>
This field can be initialized as a CONSTANT or as a LINK to any other record. SELN will fetch its value from this field when the seq record is processed.
Thus, when using I<Mask> or I<Specified> modes, the links that seq will process can be dinamically changed by the record pointed by SELL.
B<SELN - Link Selection>
When B<C<SELM = Specified>> this is the index number of the link that will be processed, used in combination with the C<OFFS> field:
SELN = SELN + OFFS
I<(By default, the OFFS is initalized to ZERO)>
When B<C<SELM = Mask>> this field is the bitmask that will be used to determine which links will be processed by the seq record,
in combination with the C<SHFT> field:
if (SHFT >= 0)
SELN = SELN << -SHFT
else
SELN = SELN >> SHFT
I<(By default, the SHFT is initalized to -1)>
=head4 B<Note about SHFT and OFFS fields>
The first versions of seq record had DO, DOL, LNK and DLY fields starting with index ONE (DO1, DOL1, LNK1 and DLY1).
New version of the seq record now supports 16 links, starting by index ZERO (DO0, DOL0, LNK0 and DLY0). The SHFT and OFFS fields
were introduced to keep compatibility of old databases that used seq record with its links indexed from one onwards.
B<If one wants to use DO0, DOL0, LNK0, DLY0 fields when SELM = Mask, SHFT field must be set to ZERO>
=head4 Selection Algorithms Description
B<All>
The C<<< All >>> algorithm causes the record to process each input and output
link each time the record is processed, in order from 0 to 15. So when SELM is
C<<< All >>>, the desired output value from DOL0 will fetched and sent to LNK0,
then the desired output value from DOL1 will be fetched and sent to the location
in LNK1, and so on until the last input and output link DOF and LNKF. (Note that
undefined links are not used.) If DOLI<x> is a constant, the current value
field is simply used and the desired output link is ignored. The SELN field is
not used when C<<< All >>> is the algorithm.
B<Specified>
When the C<<< Specified >>> algorithm is chosen, each time the record is
processed it gets the integer value in the Link Selection (SELN) field and uses
that as the index of the link to process. For instance, if SELN is 4, the
desired output value from DO4 will be retrieved and sent to LNK4. If DOLI<x> is
a constant, DOI<x> is simply used without the value being fetched from the
input link.
B<Mask>
When C<<< Mask >>> is chosen, the record uses the individual bits of the SELN
field to determine the links to process. When bit 0 of SELN is set, the value
from DO0 will be written to the location in LNK0; when bit 1 is set, the valud
from DO1 will be written to the location in LNK1 etc. Thus for example if SELN
is 3, the record will retrieve the values from DO0 and DO1 and write them to the
locations in LNK0 and LNK1, respectively. If SELN is 63, DO0...DO5 will be
written to LNK0...LNK5.
=head3 Delay Parameters
The delay parameters consist of 16 fields, one for each I/O link discussed
above. These fields can be configured to cause the record to delay processing
the link. For instance, if the user gives the DLY1 field a value of 3.0, each
time the record is processed at run-time, the record will delay processing the
DOL1, DOV1, and LNK1 fields for three seconds. That is, the desired output value
will not be fetched and written to the output link until three seconds have
lapsed.
=fields DLY0, DLY1, DLY2, DLY3, DLY4, DLY5, DLY6, DLY7, DLY8, DLY9, DLYA, DLYB, DLYC, DLYD, DLYE, DLYF
=head3 Operator Display Parameters
These parameters are used to present meaningful data to the operator. The
Precision field (PREC) determines the decimal precision for the VAL field when
it is displayed. It is used when the C<<< get_precision >>> record routine is
called.
See L<Fields Common to All Record Types> for more on the record name (NAME) and
description (DESC) fields.
=fields PREC, NAME, DESC
=head3 Alarm Parameters
The sequence record has the alarm parameters common to all record types.
L<Alarm Fields> lists other fields related to a alarms that are common to all
record types.
=head2 Record Support
=head3 Record Processing
Routine process implements the following algorithm:
=over
=item 1.
First, PACT is set to TRUE, and the link selection is fetched. Depending on the
selection mechanism, the link selection output links are processed in order from
LNK0 to LNKF. When LNKI<x> is processed, the corresponding DLYI<x> value is
used to generate a delay via watchdog timer.
=item 2.
After DLYI<x> seconds have expired, the input value is fetched from DOI<x> (if
DOLI<x> is constant) or DOLI<x> (if DOLI<x> is a database link or channel
access link) and written to LNKI<x>.
=item 3.
When all links are completed, an asynchronous completion call back to dbProcess
is made (see the Application Developer's Guide for more information on
asynchronous processing.)
=item 4.
Then UDF is set to FALSE.
=item 5.
Monitors are checked.
=item 6.
The forward link is scanned, PACT is set FALSE, and the process routine returns.
=back
For the delay mechanism to operate properly, the record is processed
asynchronously. The only time the record will not be processed asynchronously is
when there are no non-NULL output links selected (i.e. when it has nothing to
do.) The processing of the links is done via callback tasks at the priority set
in the PRIO field in dbCommon (see the Application Developer's Guide for more
information on call
=cut
include "dbCommon.dbd"
field(VAL,DBF_LONG) {
prompt("Used to trigger")
asl(ASL0)
pp(TRUE)
}
field(SELM,DBF_MENU) {
prompt("Select Mechanism")
promptgroup("30 - Action")
interest(1)
menu(seqSELM)
}
field(SELN,DBF_USHORT) {
prompt("Link Selection")
interest(1)
initial("1")
}
field(SELL,DBF_INLINK) {
prompt("Link Selection Loc")
promptgroup("30 - Action")
interest(1)
}
field(OFFS,DBF_SHORT) {
prompt("Offset for Specified")
promptgroup("30 - Action")
interest(1)
initial("0")
}
field(SHFT,DBF_SHORT) {
prompt("Shift for Mask mode")
promptgroup("30 - Action")
interest(1)
initial("-1")
}
field(OLDN,DBF_USHORT) {
prompt("Old Selection")
interest(4)
}
field(PREC,DBF_SHORT) {
prompt("Display Precision")
promptgroup("80 - Display")
interest(1)
}
field(DLY0,DBF_DOUBLE) {
prompt("Delay 0")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DOL0,DBF_INLINK) {
prompt("Input link 0")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DO0,DBF_DOUBLE) {
prompt("Value 0")
interest(1)
}
field(LNK0,DBF_OUTLINK) {
prompt("Output Link 0")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DLY1,DBF_DOUBLE) {
prompt("Delay 1")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DOL1,DBF_INLINK) {
prompt("Input link1")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DO1,DBF_DOUBLE) {
prompt("Value 1")
interest(1)
}
field(LNK1,DBF_OUTLINK) {
prompt("Output Link 1")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DLY2,DBF_DOUBLE) {
prompt("Delay 2")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DOL2,DBF_INLINK) {
prompt("Input link 2")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DO2,DBF_DOUBLE) {
prompt("Value 2")
interest(1)
}
field(LNK2,DBF_OUTLINK) {
prompt("Output Link 2")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DLY3,DBF_DOUBLE) {
prompt("Delay 3")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DOL3,DBF_INLINK) {
prompt("Input link 3")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DO3,DBF_DOUBLE) {
prompt("Value 3")
interest(1)
}
field(LNK3,DBF_OUTLINK) {
prompt("Output Link 3")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DLY4,DBF_DOUBLE) {
prompt("Delay 4")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DOL4,DBF_INLINK) {
prompt("Input link 4")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DO4,DBF_DOUBLE) {
prompt("Value 4")
interest(1)
}
field(LNK4,DBF_OUTLINK) {
prompt("Output Link 4")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DLY5,DBF_DOUBLE) {
prompt("Delay 5")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DOL5,DBF_INLINK) {
prompt("Input link 5")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DO5,DBF_DOUBLE) {
prompt("Value 5")
interest(1)
}
field(LNK5,DBF_OUTLINK) {
prompt("Output Link 5")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DLY6,DBF_DOUBLE) {
prompt("Delay 6")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DOL6,DBF_INLINK) {
prompt("Input link 6")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DO6,DBF_DOUBLE) {
prompt("Value 6")
interest(1)
}
field(LNK6,DBF_OUTLINK) {
prompt("Output Link 6")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DLY7,DBF_DOUBLE) {
prompt("Delay 7")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DOL7,DBF_INLINK) {
prompt("Input link 7")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DO7,DBF_DOUBLE) {
prompt("Value 7")
interest(1)
}
field(LNK7,DBF_OUTLINK) {
prompt("Output Link 7")
promptgroup("41 - Link 0-7")
interest(1)
}
field(DLY8,DBF_DOUBLE) {
prompt("Delay 8")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DOL8,DBF_INLINK) {
prompt("Input link 8")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DO8,DBF_DOUBLE) {
prompt("Value 8")
interest(1)
}
field(LNK8,DBF_OUTLINK) {
prompt("Output Link 8")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DLY9,DBF_DOUBLE) {
prompt("Delay 9")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DOL9,DBF_INLINK) {
prompt("Input link 9")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DO9,DBF_DOUBLE) {
prompt("Value 9")
interest(1)
}
field(LNK9,DBF_OUTLINK) {
prompt("Output Link 9")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DLYA,DBF_DOUBLE) {
prompt("Delay 10")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DOLA,DBF_INLINK) {
prompt("Input link 10")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DOA,DBF_DOUBLE) {
prompt("Value 10")
interest(1)
}
field(LNKA,DBF_OUTLINK) {
prompt("Output Link 10")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DLYB,DBF_DOUBLE) {
prompt("Delay 11")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DOLB,DBF_INLINK) {
prompt("Input link 11")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DOB,DBF_DOUBLE) {
prompt("Value 11")
interest(1)
}
field(LNKB,DBF_OUTLINK) {
prompt("Output Link 11")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DLYC,DBF_DOUBLE) {
prompt("Delay 12")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DOLC,DBF_INLINK) {
prompt("Input link 12")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DOC,DBF_DOUBLE) {
prompt("Value 12")
interest(1)
}
field(LNKC,DBF_OUTLINK) {
prompt("Output Link 12")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DLYD,DBF_DOUBLE) {
prompt("Delay 13")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DOLD,DBF_INLINK) {
prompt("Input link 13")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DOD,DBF_DOUBLE) {
prompt("Value 13")
interest(1)
}
field(LNKD,DBF_OUTLINK) {
prompt("Output Link 13")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DLYE,DBF_DOUBLE) {
prompt("Delay 14")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DOLE,DBF_INLINK) {
prompt("Input link 14")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DOE,DBF_DOUBLE) {
prompt("Value 14")
interest(1)
}
field(LNKE,DBF_OUTLINK) {
prompt("Output Link 14")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DLYF,DBF_DOUBLE) {
prompt("Delay 15")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DOLF,DBF_INLINK) {
prompt("Input link 15")
promptgroup("42 - Link 8-F")
interest(1)
}
field(DOF,DBF_DOUBLE) {
prompt("Value 15")
interest(1)
}
field(LNKF,DBF_OUTLINK) {
prompt("Output Link 15")
promptgroup("42 - Link 8-F")
interest(1)
}
}
variable(seqDLYprecision, int)
variable(seqDLYlimit, double)
@@ -1,24 +0,0 @@
#*************************************************************************
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
recordtype(state) {
include "dbCommon.dbd"
field(VAL,DBF_STRING) {
prompt("Value")
promptgroup("40 - Input")
asl(ASL0)
pp(TRUE)
size(20)
}
field(OVAL,DBF_STRING) {
prompt("Prev Value")
special(SPC_NOMOD)
interest(3)
size(20)
}
}
@@ -0,0 +1,88 @@
#*************************************************************************
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
=title State Record (state)
The state record is a means for a state program to communicate with the operator
interface. Its only function is to provide a place in the database through which
the state program can inform the operator interface of its state by storing an
arbitrary ASCII string in its VAL field.
B<Note this record is deprecated and may be removed in a future EPICS release.>
=recordtype state
=cut
recordtype(state) {
include "dbCommon.dbd"
=head2 Parameter Fields
The record-specific fields are described below, grouped by functionality.
=head3 Scan Parameters
The state record has the standard fields for specifying under what circumstances
it will be processed. These fields are listed in L<Scan Fields>. In addition,
L<Scanning Specification> explains how these fields are used.
=head3 Operator Display Parameters
See L<Fields Common to All Record Types> for more on the record name (NAME) and
description (DESC) fields.
=fields NAME, DESC
=head3 Alarm Parameters
The state record has the alarm parameters common to all record types.
L<Alarm Fields> lists other fields related to a alarms that are common to all
record types.
=head3 Run-time Parameters
These parameters are used by the application code to convey the state of the
program to the operator interface. The VAL field holds the string retrieved from
the state program. The OVAL is used to implement monitors for the VAL field.
When the string in OVAL differs from the one in VAL, monitors are triggered.
They represent the current state of the sequence program.
=fields VAL, OVAL
=cut
field(VAL,DBF_STRING) {
prompt("Value")
promptgroup("40 - Input")
asl(ASL0)
pp(TRUE)
size(20)
}
field(OVAL,DBF_STRING) {
prompt("Prev Value")
special(SPC_NOMOD)
interest(3)
size(20)
}
=head2 Record Support
=head3 Record Support Routines
=head4 process
long (*process)(struct dbCommon *precord)
C<process()> triggers monitors on VAL when it changes and scans the forward
link if necessary.
=cut
}
@@ -219,9 +219,9 @@ static long readValue(stringinRecord *prec)
}
prec->pact = FALSE;
} else { /* !prec->pact && delay >= 0. */
CALLBACK *pvt = prec->simpvt;
epicsCallback *pvt = prec->simpvt;
if (!pvt) {
pvt = calloc(1, sizeof(CALLBACK)); /* very lazy allocation of callback structure */
pvt = calloc(1, sizeof(epicsCallback)); /* very lazy allocation of callback structure */
prec->simpvt = pvt;
}
if (pvt) callbackRequestProcessCallbackDelayed(pvt, prec->prio, prec, prec->sdly);
@@ -1,98 +0,0 @@
#*************************************************************************
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
menu(stringinPOST) {
choice(stringinPOST_OnChange,"On Change")
choice(stringinPOST_Always,"Always")
}
recordtype(stringin) {
include "dbCommon.dbd"
field(VAL,DBF_STRING) {
prompt("Current Value")
promptgroup("40 - Input")
asl(ASL0)
pp(TRUE)
size(40)
}
field(OVAL,DBF_STRING) {
prompt("Previous Value")
special(SPC_NOMOD)
interest(3)
size(40)
}
field(INP,DBF_INLINK) {
prompt("Input Specification")
promptgroup("40 - Input")
interest(1)
}
field(MPST,DBF_MENU) {
prompt("Post Value Monitors")
promptgroup("80 - Display")
interest(1)
menu(stringinPOST)
}
field(APST,DBF_MENU) {
prompt("Post Archive Monitors")
promptgroup("80 - Display")
interest(1)
menu(stringinPOST)
}
field(SIOL,DBF_INLINK) {
prompt("Simulation Input Link")
promptgroup("90 - Simulate")
interest(1)
}
field(SVAL,DBF_STRING) {
prompt("Simulation Value")
pp(TRUE)
size(40)
}
field(SIML,DBF_INLINK) {
prompt("Simulation Mode Link")
promptgroup("90 - Simulate")
interest(1)
}
field(SIMM,DBF_MENU) {
prompt("Simulation Mode")
special(SPC_MOD)
interest(1)
menu(menuYesNo)
}
field(SIMS,DBF_MENU) {
prompt("Simulation Mode Severity")
promptgroup("90 - Simulate")
interest(2)
menu(menuAlarmSevr)
}
field(OLDSIMM,DBF_MENU) {
prompt("Prev. Simulation Mode")
special(SPC_NOMOD)
interest(4)
menu(menuSimm)
}
field(SSCN,DBF_MENU) {
prompt("Sim. Mode Scan")
promptgroup("90 - Simulate")
interest(1)
menu(menuScan)
initial("65535")
}
field(SDLY,DBF_DOUBLE) {
prompt("Sim. Mode Async Delay")
promptgroup("90 - Simulate")
interest(2)
initial("-1.0")
}
%#include "callback.h"
field(SIMPVT,DBF_NOACCESS) {
prompt("Sim. Mode Private")
special(SPC_NOMOD)
interest(4)
extra("CALLBACK *simpvt")
}
}
@@ -0,0 +1,319 @@
#*************************************************************************
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
=title String Input Record (stringin)
The string input record retrieves an arbitrary ASCII string of up to 40
characters. Several device support routines are available, all of which are soft
device support for retrieving values from other records or other software
components.
=recordtype stringin
=cut
menu(stringinPOST) {
choice(stringinPOST_OnChange,"On Change")
choice(stringinPOST_Always,"Always")
}
recordtype(stringin) {
include "dbCommon.dbd"
field(VAL,DBF_STRING) {
prompt("Current Value")
promptgroup("40 - Input")
asl(ASL0)
pp(TRUE)
size(40)
}
field(OVAL,DBF_STRING) {
prompt("Previous Value")
special(SPC_NOMOD)
interest(3)
size(40)
}
=head2 Parameter Fields
The record-specific fields are described below, grouped by functionality.
=head3 Scan Parameters
The string input record has the standard fields for specifying under what
circumstances it will be processed. These fields are listed in L<Scan Fields>.
In addition, L<Scanning Specification> explains how these fields are used.
=head3 Read Parameters
The INP field determines where the string input record gets its string. It can
be a database or channel access link, or a constant. If constant, the VAL field
is initialized with the constant and can be changed via dbPuts. Otherwise, the
string is read from the specified location each time the record is processed and
placed in the VAL field. The maximum number of characters that the string in VAL
can be is 40. In addition, the appropriate device support module must be entered
into the DTYP field.
See L<Address Specification> for information on specifying links.
=fields VAL, INP, DTYP
=cut
field(INP,DBF_INLINK) {
prompt("Input Specification")
promptgroup("40 - Input")
interest(1)
}
=head3 Monitor Parameters
These parameters are used to specify when the monitor post should be sent by
C<monitor()> routine. There are two possible choices:
=head4 Menu stringinPOST
=menu stringinPOST
APST is used for archiver monitors and MPST is for all other type of monitors.
=fields MPST, APST
=cut
field(MPST,DBF_MENU) {
prompt("Post Value Monitors")
promptgroup("80 - Display")
interest(1)
menu(stringinPOST)
}
field(APST,DBF_MENU) {
prompt("Post Archive Monitors")
promptgroup("80 - Display")
interest(1)
menu(stringinPOST)
}
=head3 Operator Display Parameters
See L<Fields Common to All Record Types> for more on the record name (NAME) and
description (DESC) fields.
=fields NAME, DESC
=head3 Alarm Parameters
The string input record has the alarm parameters common to all record types.
L<Alarm Fields> lists other fields related to a alarms that are common to all
record types.
=head3 Run-time and Simulation Mode Parameters
The old value field (OVAL) of the string input is used to implement value change
monitors for VAL. If VAL is not equal to OVAL, then monitors are triggered.
=fields OVAL
The following fields are used to operate the string input in the simulation
mode. See L<Simulation Mode> for more information on simulation mode fields.
=fields SIOL, SVAL, SIML, SIMM, SIMS, SSCN, SDLY
=cut
field(SIOL,DBF_INLINK) {
prompt("Simulation Input Link")
promptgroup("90 - Simulate")
interest(1)
}
field(SVAL,DBF_STRING) {
prompt("Simulation Value")
pp(TRUE)
size(40)
}
field(SIML,DBF_INLINK) {
prompt("Simulation Mode Link")
promptgroup("90 - Simulate")
interest(1)
}
field(SIMM,DBF_MENU) {
prompt("Simulation Mode")
special(SPC_MOD)
interest(1)
menu(menuYesNo)
}
field(SIMS,DBF_MENU) {
prompt("Simulation Mode Severity")
promptgroup("90 - Simulate")
interest(2)
menu(menuAlarmSevr)
}
field(OLDSIMM,DBF_MENU) {
prompt("Prev. Simulation Mode")
special(SPC_NOMOD)
interest(4)
menu(menuSimm)
}
field(SSCN,DBF_MENU) {
prompt("Sim. Mode Scan")
promptgroup("90 - Simulate")
interest(1)
menu(menuScan)
initial("65535")
}
field(SDLY,DBF_DOUBLE) {
prompt("Sim. Mode Async Delay")
promptgroup("90 - Simulate")
interest(2)
initial("-1.0")
}
%#include "callback.h"
field(SIMPVT,DBF_NOACCESS) {
prompt("Sim. Mode Private")
special(SPC_NOMOD)
interest(4)
extra("epicsCallback *simpvt")
}
=head2 Record Support
=head3 Record Support Routines
=head4 init_record
long (*init_record)(struct dbCommon *precord, int pass)
This routine initializes SIMM with the value of SIML if SIML type is CONSTANT
link or creates a channel access link if SIML type is PV_LINK. SVAL is likewise
initialized if SIOL is CONSTANT or PV_LINK.
This routine next checks to see that device support is available and a record
support read routine is defined. If either does not exist, an error message is
issued and processing is terminated.
If device support includes an C<init_record()> routine it is called.
=head4 process
long (*process)(struct dbCommon *precord)
See L<Record Processing>.
=head3 Record Processing
Routine process implements the following algorithm:
=over
=item 1.
Check to see that the appropriate device support module exists. If it doesn't,
an error message is issued and processing is terminated with the PACT field
still set to TRUE. This ensures that processes will no longer be called for this
record. Thus error storms will not occur.
=item 2.
readValue is called. See L<Simulation Mode> for more information on simulation
mode fields and how they affect input.
=item 3.
If PACT has been changed to TRUE, the device support read routine has started
but has not completed reading a new input value. In this case, the processing
routine merely returns, leaving PACT TRUE.
=item 4.
C<recGblGetTimeStamp()> is called.
=item 5.
Check to see if monitors should be invoked.
=over
=item *
Alarm monitors are invoked if the alarm status or severity has changed.
=item *
Archive and value change monitors are invoked if OVAL is not equal to VAL.
=item *
NSEV and NSTA are reset to 0.
=back
=item 6.
Scan forward link if necessary, set PACT FALSE, and return.
=back
=begin html
<br>
<hr>
<br>
=end html
=head2 Device Support
=head3 Fields Of Interest To Device Support
Each stringin input record must have an associated set of device support
routines. The primary responsibility of the device support routines is to obtain
a new ASCII string value whenever read_stringin is called. The device support
routines are primarily interested in the following fields:
=fields PACT, DPVT, UDF, VAL, INP
=head3 Device Support Routines (devSiSoft.c)
=head4 init_record
long init_record(stringinRecord *prec)
This routine is optional. If provided, it is called by the record support
C<init_record()> routine.
=head4 read_stringin
long read_stringin(stringinRecord *prec)
This routine must provide a new input value. It returns the following values:
=over
=item * 0: Success. A new ASCII string is stored into VAL.
=item * Other: Error.
=back
=head3 Device Support for Soft Records
The C<<< Soft Channel >>> module places a value directly in VAL.
If the INP link type is constant, the double constant, if non-zero, is converted
to a string and stored into VAL by C<init_record()>, and UDF is set to FALSE. If
the INP link type is PV_LINK, then dbCaAddInlink is called by C<init_record()>.
read_stringin calls recGblGetLinkValue to read the current value of VAL. See
L<Soft Input>.
If the return status of recGblGetLinkValue is zero, then read_stringin sets UDF
to FALSE. The status of recGblGetLinkValue is returned.
=cut
}
@@ -247,9 +247,9 @@ static long writeValue(stringoutRecord *prec)
status = dbPutLink(&prec->siol, DBR_STRING, &prec->val, 1);
prec->pact = FALSE;
} else { /* !prec->pact && delay >= 0. */
CALLBACK *pvt = prec->simpvt;
epicsCallback *pvt = prec->simpvt;
if (!pvt) {
pvt = calloc(1, sizeof(CALLBACK)); /* very lazy allocation of callback structure */
pvt = calloc(1, sizeof(epicsCallback)); /* very lazy allocation of callback structure */
prec->simpvt = pvt;
}
if (pvt) callbackRequestProcessCallbackDelayed(pvt, prec->prio, prec, prec->sdly);
@@ -1,116 +0,0 @@
#*************************************************************************
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
menu(stringoutPOST) {
choice(stringoutPOST_OnChange,"On Change")
choice(stringoutPOST_Always,"Always")
}
recordtype(stringout) {
include "dbCommon.dbd"
field(VAL,DBF_STRING) {
prompt("Current Value")
promptgroup("50 - Output")
asl(ASL0)
pp(TRUE)
size(40)
}
field(OVAL,DBF_STRING) {
prompt("Previous Value")
special(SPC_NOMOD)
interest(3)
size(40)
}
field(DOL,DBF_INLINK) {
prompt("Desired Output Loc")
promptgroup("40 - Input")
interest(1)
}
field(OMSL,DBF_MENU) {
prompt("Output Mode Select")
promptgroup("50 - Output")
interest(1)
menu(menuOmsl)
}
field(OUT,DBF_OUTLINK) {
prompt("Output Specification")
promptgroup("50 - Output")
interest(1)
}
field(MPST,DBF_MENU) {
prompt("Post Value Monitors")
promptgroup("80 - Display")
interest(1)
menu(stringoutPOST)
}
field(APST,DBF_MENU) {
prompt("Post Archive Monitors")
promptgroup("80 - Display")
interest(1)
menu(stringoutPOST)
}
field(SIOL,DBF_OUTLINK) {
prompt("Simulation Output Link")
promptgroup("90 - Simulate")
interest(1)
}
field(SIML,DBF_INLINK) {
prompt("Simulation Mode Link")
promptgroup("90 - Simulate")
interest(1)
}
field(SIMM,DBF_MENU) {
prompt("Simulation Mode")
special(SPC_MOD)
interest(1)
menu(menuYesNo)
}
field(SIMS,DBF_MENU) {
prompt("Simulation Mode Severity")
promptgroup("90 - Simulate")
interest(2)
menu(menuAlarmSevr)
}
field(OLDSIMM,DBF_MENU) {
prompt("Prev. Simulation Mode")
special(SPC_NOMOD)
interest(4)
menu(menuSimm)
}
field(SSCN,DBF_MENU) {
prompt("Sim. Mode Scan")
promptgroup("90 - Simulate")
interest(1)
menu(menuScan)
initial("65535")
}
field(SDLY,DBF_DOUBLE) {
prompt("Sim. Mode Async Delay")
promptgroup("90 - Simulate")
interest(2)
initial("-1.0")
}
%#include "callback.h"
field(SIMPVT,DBF_NOACCESS) {
prompt("Sim. Mode Private")
special(SPC_NOMOD)
interest(4)
extra("CALLBACK *simpvt")
}
field(IVOA,DBF_MENU) {
prompt("INVALID output action")
promptgroup("50 - Output")
interest(2)
menu(menuIvoa)
}
field(IVOV,DBF_STRING) {
prompt("INVALID output value")
promptgroup("50 - Output")
interest(2)
size(40)
}
}
@@ -0,0 +1,384 @@
#*************************************************************************
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
=title String Output Record (stringout)
The stringout record is used to write an arbitrary ASCII string of up to 40
characters to other records or software variables.
=recordtype stringout
=cut
include "menuIvoa.dbd"
menu(stringoutPOST) {
choice(stringoutPOST_OnChange,"On Change")
choice(stringoutPOST_Always,"Always")
}
recordtype(stringout) {
include "dbCommon.dbd"
field(VAL,DBF_STRING) {
prompt("Current Value")
promptgroup("50 - Output")
asl(ASL0)
pp(TRUE)
size(40)
}
field(OVAL,DBF_STRING) {
prompt("Previous Value")
special(SPC_NOMOD)
interest(3)
size(40)
}
=head2 Parameter Fields
The record-specific fields are described below, grouped by functionality.
=head3 Scan Parameters
The string output record has the standard fields for specifying under what
circumstances it will be processed. These fields are listed in
L<Scan Fields>.
In addition, L<Scanning Specification>
explains how these fields are used.
=head3 Desired Output Parameters
The string output record must specify from where it gets its desired output
string. The first field that determines where the desired output originates is
the output mode select (OSML) field, which can have two possible value: C<<<
closed_loop >>> or C<<< supervisory >>>. If C<<< supervisory >>> is specified,
DOL is ignored, the current value of VAL is written, and the VAL can be changed
externally via dbPuts at run-time. If C<<< closed_loop >>> is specified, the VAL
field's value is obtained from the address specified in the desired output
location field (DOL) which can be either a database link or a channel access
link.
DOL can also be a constant in addition to a link, in which case VAL is
initialized to the constant value. However, your string constant may be
interpreted as a CA link name, so if you want to initialize your string output
record, it's best to use the VAL field. Note that if DOL is a constant, OMSL
cannot be C<<< closed_loop. >>> See
L<Address Specification>
for information on specifying links.
=fields VAL, DOL, OMSL
=cut
field(DOL,DBF_INLINK) {
prompt("Desired Output Loc")
promptgroup("40 - Input")
interest(1)
}
field(OMSL,DBF_MENU) {
prompt("Output Mode Select")
promptgroup("50 - Output")
interest(1)
menu(menuOmsl)
}
=head3 Write Parameters
The output link specified in the OUT field specifies where the string output
record is to write its string. The link can be a database or channel access
link. If the OUT field is a constant, no output will be written. See L<Address
Specification> for information on specifying links.
In addition, the appropriate device support module must be entered into the DTYP
field.
=fields OUT, DTYP
=cut
field(OUT,DBF_OUTLINK) {
prompt("Output Specification")
promptgroup("50 - Output")
interest(1)
}
=head3 Monitor Parameters
These parameters are used to specify when the monitor post should be sent by
C<monitor()> routine. There are two possible choices:
=head4 Menu stringoutPOST
=menu stringoutPOST
APST is used for archiver monitors and MPST is for all other type of monitors.
=fields MPST, APST
=cut
field(MPST,DBF_MENU) {
prompt("Post Value Monitors")
promptgroup("80 - Display")
interest(1)
menu(stringoutPOST)
}
field(APST,DBF_MENU) {
prompt("Post Archive Monitors")
promptgroup("80 - Display")
interest(1)
menu(stringoutPOST)
}
=head3 Operator Display Parameters
These parameters are used to present meaningful data to the operator. These
fields are used to display the value and other parameters of the string output
either textually or graphically.
See L<Fields Common to All Record Types>
for more on the record name (NAME) and description (DESC) fields.
=fields NAME, DESC
=head3 Run-time and Simulation Mode Parameters
The old value field (OVAL) of the string input is used to implement value change
monitors for VAL. If VAL is not equal to OVAL, then monitors are triggered.
=fields OVAL
The following fields are used to operate the string output in the simulation
mode. See
L<Simulation Mode>
for more information on these fields.
=fields SIOL, SIML, SIMM, SIMS, SSCN, SDLY
=cut
field(SIOL,DBF_OUTLINK) {
prompt("Simulation Output Link")
promptgroup("90 - Simulate")
interest(1)
}
field(SIML,DBF_INLINK) {
prompt("Simulation Mode Link")
promptgroup("90 - Simulate")
interest(1)
}
field(SIMM,DBF_MENU) {
prompt("Simulation Mode")
special(SPC_MOD)
interest(1)
menu(menuYesNo)
}
field(SIMS,DBF_MENU) {
prompt("Simulation Mode Severity")
promptgroup("90 - Simulate")
interest(2)
menu(menuAlarmSevr)
}
field(OLDSIMM,DBF_MENU) {
prompt("Prev. Simulation Mode")
special(SPC_NOMOD)
interest(4)
menu(menuSimm)
}
field(SSCN,DBF_MENU) {
prompt("Sim. Mode Scan")
promptgroup("90 - Simulate")
interest(1)
menu(menuScan)
initial("65535")
}
field(SDLY,DBF_DOUBLE) {
prompt("Sim. Mode Async Delay")
promptgroup("90 - Simulate")
interest(2)
initial("-1.0")
}
%#include "callback.h"
field(SIMPVT,DBF_NOACCESS) {
prompt("Sim. Mode Private")
special(SPC_NOMOD)
interest(4)
extra("epicsCallback *simpvt")
}
=head3 Alarm Parameters
The possible alarm conditions for the string output record are the SCAN, READ,
and INVALID alarms. The severity of the first two is always MAJOR and not
configurable.
The IVOA field specifies an action to take when the INVALID alarm is triggered.
There are three possible actions:
=head4 Menu menuIvoa
=menu menuIvoa
When C<<< Set output to IVOV >>>, the value contained in the IVOV field is
written to the output link during an alarm condition. See
L<Invalid Alarm Output Action>
for more information on the IVOA and IVOV fields.
L<Alarm Fields>
lists other fields related to a alarms that are common to all record types.
=fields IVOA, IVOV
=cut
field(IVOA,DBF_MENU) {
prompt("INVALID output action")
promptgroup("50 - Output")
interest(2)
menu(menuIvoa)
}
field(IVOV,DBF_STRING) {
prompt("INVALID output value")
promptgroup("50 - Output")
interest(2)
size(40)
}
=head2 Record Support
=head3 Record Support Routines
=head4 init_record
long (*init_record)(struct dbCommon *precord, int pass)
This routine initializes SIMM if SIML is a constant or creates a channel access
link if SIML is PV_LINK. If SIOL is PV_LINK a channel access link is created.
This routine next checks to see that device support is available. The routine
next checks to see if the device support write routine is defined. If either
device support or the device support write routine does not exist, an error
message is issued and processing is terminated.
If DOL is a constant, then the type double constant, if non-zero, is converted
to a string and stored into VAL and UDF is set to FALSE. If DOL type is a
PV_LINK then dbCaAddInlink is called to create a channel access link.
If device support includes C<init_record()>, it is called.
=head4 process
long (*process)(struct dbCommon *precord)
See L<Record Processing>.
=head3 Record Processing
Routine process implements the following algorithm:
=over
=item 1.
Check to see that the appropriate device support module exists. If it doesn't,
an error message is issued and processing is terminated with the PACT field
still set to TRUE. This ensures that processes will no longer be called for this
record. Thus error storms will not occur.
=item 2.
If PACT is FALSE and OMSL is CLOSED_LOOP, recGblGetLinkValue is called to read
the current value of VAL. See L<Soft Output>.
If the return status of recGblGetLinkValue is zero then UDF is set to FALSE.
=item 3.
Check severity and write the new value. See
L<Simulation Mode>
and L<Invalid Alarm Output Action>
for details on how the simulation mode and the INVALID alarm conditions affect output.
=item 4.
If PACT has been changed to TRUE, the device support write output routine has
started but has not completed writing the new value. In this case, the
processing routine merely returns, leaving PACT TRUE.
=item 5.
Check to see if monitors should be invoked.
=over
=item *
Alarm monitors are invoked if the alarm status or severity has changed.
=item *
Archive and value change monitors are invoked if OVAL is not equal to VAL.
=item *
NSEV and NSTA are reset to 0.
=back
=item 6.
Scan forward link if necessary, set PACT FALSE, and return.
=back
=begin html
<br>
<hr>
<br>
=end html
=head2 Device Support
=head3 Fields Of Interest To Device Support
Each stringout output record must have an associated set of device support
routines. The primary responsibility of the device support routines is to write
a new value whenever write_stringout is called. The device support routines are
primarily interested in the following fields:
=fields PACT, DPVT, NSEV, NSTA, VAL, OUT
=head3 Device Support Routines (devSoSoft.c)
=head4 write_stringout
long write_stringout(stringoutRecord *prec)
This routine must output a new value. It returns the following values:
=over
=item * 0: Success.
=item * Other: Error.
=back
=head3 Device Support for Soft Records
The C<<< Soft Channel >>> device support module writes the current value of VAL.
If the OUT link type is PV_LINK, then dbCaAddInlink is called by
C<init_record()>.
write_so calls recGblPutLinkValue to write the current value of VAL. See
L<Soft Output>.
=cut
}
@@ -1,90 +0,0 @@
#*************************************************************************
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
recordtype(subArray) {
include "dbCommon.dbd"
field(VAL,DBF_NOACCESS) {
prompt("Value")
asl(ASL0)
special(SPC_DBADDR)
pp(TRUE)
extra("void * val")
#=type Set by FTVL
#=read Yes
#=write Yes
}
field(PREC,DBF_SHORT) {
prompt("Display Precision")
promptgroup("80 - Display")
interest(1)
prop(YES)
}
field(FTVL,DBF_MENU) {
prompt("Field Type of Value")
promptgroup("30 - Action")
special(SPC_NOMOD)
interest(1)
menu(menuFtype)
}
field(INP,DBF_INLINK) {
prompt("Input Specification")
promptgroup("40 - Input")
interest(1)
}
field(EGU,DBF_STRING) {
prompt("Engineering Units")
promptgroup("80 - Display")
interest(1)
size(16)
prop(YES)
}
field(HOPR,DBF_DOUBLE) {
prompt("High Operating Range")
promptgroup("80 - Display")
interest(1)
prop(YES)
}
field(LOPR,DBF_DOUBLE) {
prompt("Low Operating Range")
promptgroup("80 - Display")
interest(1)
prop(YES)
}
field(MALM,DBF_ULONG) {
prompt("Maximum Elements")
promptgroup("30 - Action")
special(SPC_NOMOD)
interest(1)
initial("1")
}
field(NELM,DBF_ULONG) {
prompt("Number of Elements")
promptgroup("30 - Action")
pp(TRUE)
initial("1")
}
field(INDX,DBF_ULONG) {
prompt("Substring Index")
promptgroup("30 - Action")
pp(TRUE)
}
field(BUSY,DBF_SHORT) {
prompt("Busy Indicator")
special(SPC_NOMOD)
}
field(NORD,DBF_LONG) {
prompt("Number elements read")
special(SPC_NOMOD)
}
field(BPTR,DBF_NOACCESS) {
prompt("Buffer Pointer")
special(SPC_NOMOD)
interest(4)
extra("void * bptr")
}
}
@@ -0,0 +1,397 @@
#*************************************************************************
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
=title Sub-Array Record (subArray)
The normal use for the subArray record type is to obtain sub-arrays from
waveform records. Setting either the number of elements (NELM) or index (INDX)
fields causes the record to be processed anew so that applications in which the
length and position of a sub-array in a waveform record vary dynamically can be
implemented using standard EPICS operator interface tools.
The first element of the sub-array, that at location INDX in the referenced
waveform record, can be displayed as a scalar, or the entire subarray (of length
NELM) can be displayed in the same way as a waveform record. If there are fewer
than NELM elements in the referenced waveform after the INDX, only the number of
elements actually available are returned, and the number of elements read field
(NORD) is set to reflect this. This record type does not support writing new
values into waveform records.
=recordtype subArray
=cut
recordtype(subArray) {
=head2 Parameter Fields
The record-specific fields are described below, grouped by functionality.
=head3 Scan Parameters
The subArray record has the standard fields for specifying under what
circumstances the record will be processed. These fields are listed in
L<Scan Fields>.
In addition, L<Scanning Specification> explains how these fields are used.
=head3 Read Parameters
The subArray's input link (INP) should be configured to reference the Waveform
record. It should specify the VAL field of a Waveform record. The INP field can
be a channel access link, in addition to a database link. See
L<Address Specification>
for information on specifying links.
In addition, the DTYP field must specify a device support module. Currently, the
only device support module is C<<< Soft Channel >>>.
=fields INP, DTYP
=head3 Array Parameters
These parameters determine the number of array elements (the array length) and
the data type of those elements. The Field Type of Value (FTVL) field determines
the data type of the array.
The user specifies the maximum number of elements allowed in the subarray in the
MALM field. Generally, the number should be equal to the number of elements of
the Waveform array (found in the Waveform's NELM field). The MALM field is used
to allocate memory. The subArray's Number of Elements (NELM) field is where the
user specifies the actual number of elements that the subArray will contain. It
should of course be no greater than MALM; if it is, the record processing
routine sets it equal to MALM.
The INDX field determines the offset of the subArray record's array in relation
to the Waveform's. For instance, if INDX is 2, then the subArray will read NELM
elements starting with the third element of the Waveform's array. Thus, it
equals the index number of the Waveform's array.
The actual sub-array is referenced by the VAL field.
=fields FTVL, VAL, MALM, NELM, INDX
=head3 Operator Display Parameters
These parameters are used to present meaningful data to the operator. They
display the value and other parameters of the subarray record either textually
or graphically.
EGU is a string of up to 16 characters describing the engineering units (if any)
of the values which the subArray holds. It is retrieved by the C<<< get_units
>>> record support routine.
The HOPR and LOPR fields set the upper and lower display limits for the
sub-array elements. Both the C<<< get_graphic_double >>> and C<<<
get_control_double >>> record support routines retrieve these fields.
The PREC field determines the floating point precision with which to display
VAL. It is used whenever the C<<< get_precision >>> record support routine is
called.
See L<Fields Common to All Record Types>
for more on the record name (NAME) and description (DESC) fields.
=fields EGU, HOPR, LOPR, PREC, NAME, DESC
=head3 Alarm Parameters
The subarray record has the alarm parameters common to all record types.
L<Alarm Fields> lists other fields related to a alarms that are common to all
record types.
=head3 Run-time Parameters
These fields are not configurable by the user. They are used for the record's
internal processing or to represent the current state of the record.
The NORD field holds a counter of the number of elements read into the array. It
can be less than NELM even after the array is full if NELM exceeds the number of
existing elements in the referenced array, i.e., the Waveform's array.
BPTR contains a pointer to the record's array.
=fields NORD, BPTR
=begin html
<br>
<hr>
<br>
=end html
=head2 Record Support
=head3 Record Support Routines
=head4 init_record
long (*init_record)(struct dbCommon *precord, int pass)
Using MALM and FTVL, space for the array is allocated. The array address is
stored in BPTR. This routine checks to see that device support is available and
a device support read routine is defined. If either does not exist, an error
message is issued and processing is terminated. If device support includes
C<init_record()>, it is called.
=head4 process
long (*process)(struct dbCommon *precord)
See L<Record Processing>.
=head4 cvt_dbaddr
long (*cvt_dbaddr)(struct dbAddr *paddr)
This is called by dbNameToAddr. It makes the dbAddr structure refer to the
actual buffer holding the result.
=head4 get_array_info
long (*get_array_info)(struct dbAddr *paddr, long *no_elements, long *offset)
Retrieves NELM.
=head4 put_array_info
long (*put_array_info)(struct dbAddr *paddr, long nNew)
Sets NORD.
=head4 get_graphic_double
long (*get_graphic_double)(struct dbAddr *paddr, struct dbr_grDouble *p)
For the elements in the array, this routine routines HOPR and LOPR. For the INDX
field, this routine returns MALM - 1 and 0. For NELM, it returns MALM and 1. For
other fields, it calls C<<< recGblGetGraphicDouble() >>>.
=head4 get_control_double
long (*get_control_double)(struct dbAddr *paddr, struct dbr_ctrlDouble *p)
For array elements, this routine retrieves HOPR and LOPR. Otherwise, C<<<
recGblGetControlDouble() >>> is called.
=head4 get_units
long (*get_units)(struct dbAddr *paddr, char *units)
Retrieves EGU.
=head4 get_precision
long (*get_precision)(const struct dbAddr *paddr, long *precision)
Retrieves PREC.
=head3 Record Processing
Routine process implements the following algorithm:
=over
=item 1.
Check to see that the appropriate device support module exists. If it doesn't,
an error message is issued and processing is terminated with the PACT field
still set to TRUE. This ensures that processes will no longer be called for this
record. Thus error storms will not occur.
=item 2.
Sanity check NELM and INDX. If NELM is greater than MALM it is set to MALM. If
INDX is greater than or equal to MALM it is set to MALM-1.
=item 3.
Call device support read routine. This routine is expected to place the desired
sub-array at the beginning of the buffer and set NORD to the number of elements
of the sub-array that were read.
=item 4.
If PACT has been changed to TRUE, the device support read routine has started
but has not completed writing the new value. In this case, the processing
routine merely returns, leaving PACT TRUE. Otherwise, process sets PACT TRUE at
this time. This asynchronous processing logic is not currently used but has been
left in place.
=item 5.
Check to see if monitors should be invoked.
=over
=item *
Alarm monitors are invoked if the alarm status or severity has changed.
=item *
Archive and value change monitors are always invoked.
=item *
NSEV and NSTA are reset to 0.
=back
=item 6.
Scan forward link if necessary, set PACT FALSE, and return.
=back
=begin html
<br>
<hr>
<br>
=end html
=head2 Device Support
=head3 Fields Of Interest To Device Support
The device support routines are primarily interested in the following fields:
=fields PACT, DPVT, UDF, NSEV, NSTA, INP, FTVL, MALM, NELM, INDX, BPTR, NORD
=head3 Device Support Routines (devSASoft.c)
Device support consists of the following routines:
=head4 long report(int level)
This optional routine is called by the IOC command C<dbior> and is passed the
report level that was requested by the user.
It should print a report on the state of the device support to stdout.
The C<level> parameter may be used to output increasingly more detailed
information at higher levels, or to select different types of information with
different levels.
Level zero should print no more than a small summary.
=head4 long init(int after)
This optional routine is called twice at IOC initialization time.
The first call happens before any of the C<init_record()> calls are made, with
the integer parameter C<after> set to 0.
The second call happens after all of the C<init_record()> calls have been made,
with C<after> set to 1.
=head4 init_record
long init_record(subArrayRecord *prec)
This routine is called by the record support C<init_record()> routine.
=head4 read_sa
long read_sa(subArrayRecord *prec)
Enough of the source waveform is read into BPTR, from the beginning of the
source, to include the requested sub-array. The sub-array is then copied to the
beginning of the buffer. NORD is set to indicate how many elements of the
sub-array were acquired.
=head3 Device Support For Soft Records
Only the device support module C<<< Soft Channel >>> is currently provided. The
INP link type must be either DB_LINK or CA_LINK.
=head4 Soft Channel
INP is expected to point to a waveform record.
=cut
include "dbCommon.dbd"
field(VAL,DBF_NOACCESS) {
prompt("Value")
asl(ASL0)
special(SPC_DBADDR)
pp(TRUE)
extra("void * val")
#=type Set by FTVL
#=read Yes
#=write Yes
}
field(PREC,DBF_SHORT) {
prompt("Display Precision")
promptgroup("80 - Display")
interest(1)
prop(YES)
}
field(FTVL,DBF_MENU) {
prompt("Field Type of Value")
promptgroup("30 - Action")
special(SPC_NOMOD)
interest(1)
menu(menuFtype)
}
field(INP,DBF_INLINK) {
prompt("Input Specification")
promptgroup("40 - Input")
interest(1)
}
field(EGU,DBF_STRING) {
prompt("Engineering Units")
promptgroup("80 - Display")
interest(1)
size(16)
prop(YES)
}
field(HOPR,DBF_DOUBLE) {
prompt("High Operating Range")
promptgroup("80 - Display")
interest(1)
prop(YES)
}
field(LOPR,DBF_DOUBLE) {
prompt("Low Operating Range")
promptgroup("80 - Display")
interest(1)
prop(YES)
}
field(MALM,DBF_ULONG) {
prompt("Maximum Elements")
promptgroup("30 - Action")
special(SPC_NOMOD)
interest(1)
initial("1")
}
field(NELM,DBF_ULONG) {
prompt("Number of Elements")
promptgroup("30 - Action")
pp(TRUE)
initial("1")
}
field(INDX,DBF_ULONG) {
prompt("Substring Index")
promptgroup("30 - Action")
pp(TRUE)
}
field(BUSY,DBF_SHORT) {
prompt("Busy Indicator")
special(SPC_NOMOD)
}
field(NORD,DBF_LONG) {
prompt("Number elements read")
special(SPC_NOMOD)
}
field(BPTR,DBF_NOACCESS) {
prompt("Buffer Pointer")
special(SPC_NOMOD)
interest(4)
extra("void * bptr")
}
}
-328
View File
@@ -1,328 +0,0 @@
#*************************************************************************
# Copyright (c) 2008 UChicago Argonne LLC, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
recordtype(sub) {
include "dbCommon.dbd"
field(VAL,DBF_DOUBLE) {
prompt("Result")
asl(ASL0)
pp(TRUE)
}
field(INAM,DBF_STRING) {
prompt("Init Routine Name")
promptgroup("30 - Action")
special(SPC_NOMOD)
interest(1)
size(40)
}
field(SNAM,DBF_STRING) {
prompt("Subroutine Name")
promptgroup("30 - Action")
special(SPC_MOD)
interest(1)
size(40)
}
%struct subRecord;
%typedef long (*SUBFUNCPTR)(struct subRecord *);
field(SADR,DBF_NOACCESS) {
prompt("Subroutine Address")
special(SPC_NOMOD)
interest(4)
extra("SUBFUNCPTR sadr")
}
field(INPA,DBF_INLINK) {
prompt("Input A")
promptgroup("41 - Input A-F")
interest(1)
}
field(INPB,DBF_INLINK) {
prompt("Input B")
promptgroup("41 - Input A-F")
interest(1)
}
field(INPC,DBF_INLINK) {
prompt("Input C")
promptgroup("41 - Input A-F")
interest(1)
}
field(INPD,DBF_INLINK) {
prompt("Input D")
promptgroup("41 - Input A-F")
interest(1)
}
field(INPE,DBF_INLINK) {
prompt("Input E")
promptgroup("41 - Input A-F")
interest(1)
}
field(INPF,DBF_INLINK) {
prompt("Input F")
promptgroup("41 - Input A-F")
interest(1)
}
field(INPG,DBF_INLINK) {
prompt("Input G")
promptgroup("42 - Input G-L")
interest(1)
}
field(INPH,DBF_INLINK) {
prompt("Input H")
promptgroup("42 - Input G-L")
interest(1)
}
field(INPI,DBF_INLINK) {
prompt("Input I")
promptgroup("42 - Input G-L")
interest(1)
}
field(INPJ,DBF_INLINK) {
prompt("Input J")
promptgroup("42 - Input G-L")
interest(1)
}
field(INPK,DBF_INLINK) {
prompt("Input K")
promptgroup("42 - Input G-L")
interest(1)
}
field(INPL,DBF_INLINK) {
prompt("Input L")
promptgroup("42 - Input G-L")
interest(1)
}
field(EGU,DBF_STRING) {
prompt("Engineering Units")
promptgroup("80 - Display")
interest(1)
size(16)
prop(YES)
}
field(HOPR,DBF_DOUBLE) {
prompt("High Operating Range")
promptgroup("80 - Display")
interest(1)
prop(YES)
}
field(LOPR,DBF_DOUBLE) {
prompt("Low Operating Range")
promptgroup("80 - Display")
interest(1)
prop(YES)
}
field(HIHI,DBF_DOUBLE) {
prompt("Hihi Alarm Limit")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
}
field(LOLO,DBF_DOUBLE) {
prompt("Lolo Alarm Limit")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
}
field(HIGH,DBF_DOUBLE) {
prompt("High Alarm Limit")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
}
field(LOW,DBF_DOUBLE) {
prompt("Low Alarm Limit")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
}
field(PREC,DBF_SHORT) {
prompt("Display Precision")
promptgroup("80 - Display")
interest(1)
prop(YES)
}
field(BRSV,DBF_MENU) {
prompt("Bad Return Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(HHSV,DBF_MENU) {
prompt("Hihi Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
menu(menuAlarmSevr)
}
field(LLSV,DBF_MENU) {
prompt("Lolo Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
menu(menuAlarmSevr)
}
field(HSV,DBF_MENU) {
prompt("High Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
menu(menuAlarmSevr)
}
field(LSV,DBF_MENU) {
prompt("Low Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
menu(menuAlarmSevr)
}
field(HYST,DBF_DOUBLE) {
prompt("Alarm Deadband")
promptgroup("70 - Alarm")
interest(1)
}
field(ADEL,DBF_DOUBLE) {
prompt("Archive Deadband")
promptgroup("80 - Display")
interest(1)
}
field(MDEL,DBF_DOUBLE) {
prompt("Monitor Deadband")
promptgroup("80 - Display")
interest(1)
}
field(A,DBF_DOUBLE) {
prompt("Value of Input A")
pp(TRUE)
}
field(B,DBF_DOUBLE) {
prompt("Value of Input B")
pp(TRUE)
}
field(C,DBF_DOUBLE) {
prompt("Value of Input C")
pp(TRUE)
}
field(D,DBF_DOUBLE) {
prompt("Value of Input D")
pp(TRUE)
}
field(E,DBF_DOUBLE) {
prompt("Value of Input E")
pp(TRUE)
}
field(F,DBF_DOUBLE) {
prompt("Value of Input F")
pp(TRUE)
}
field(G,DBF_DOUBLE) {
prompt("Value of Input G")
pp(TRUE)
}
field(H,DBF_DOUBLE) {
prompt("Value of Input H")
pp(TRUE)
}
field(I,DBF_DOUBLE) {
prompt("Value of Input I")
pp(TRUE)
}
field(J,DBF_DOUBLE) {
prompt("Value of Input J")
pp(TRUE)
}
field(K,DBF_DOUBLE) {
prompt("Value of Input K")
pp(TRUE)
}
field(L,DBF_DOUBLE) {
prompt("Value of Input L")
pp(TRUE)
}
field(LA,DBF_DOUBLE) {
prompt("Prev Value of A")
special(SPC_NOMOD)
interest(3)
}
field(LB,DBF_DOUBLE) {
prompt("Prev Value of B")
special(SPC_NOMOD)
interest(3)
}
field(LC,DBF_DOUBLE) {
prompt("Prev Value of C")
special(SPC_NOMOD)
interest(3)
}
field(LD,DBF_DOUBLE) {
prompt("Prev Value of D")
special(SPC_NOMOD)
interest(3)
}
field(LE,DBF_DOUBLE) {
prompt("Prev Value of E")
special(SPC_NOMOD)
interest(3)
}
field(LF,DBF_DOUBLE) {
prompt("Prev Value of F")
special(SPC_NOMOD)
interest(3)
}
field(LG,DBF_DOUBLE) {
prompt("Prev Value of G")
special(SPC_NOMOD)
interest(3)
}
field(LH,DBF_DOUBLE) {
prompt("Prev Value of H")
special(SPC_NOMOD)
interest(3)
}
field(LI,DBF_DOUBLE) {
prompt("Prev Value of I")
special(SPC_NOMOD)
interest(3)
}
field(LJ,DBF_DOUBLE) {
prompt("Prev Value of J")
special(SPC_NOMOD)
interest(3)
}
field(LK,DBF_DOUBLE) {
prompt("Prev Value of K")
special(SPC_NOMOD)
interest(3)
}
field(LL,DBF_DOUBLE) {
prompt("Prev Value of L")
special(SPC_NOMOD)
interest(3)
}
field(LALM,DBF_DOUBLE) {
prompt("Last Value Alarmed")
special(SPC_NOMOD)
interest(3)
}
field(ALST,DBF_DOUBLE) {
prompt("Last Value Archived")
special(SPC_NOMOD)
interest(3)
}
field(MLST,DBF_DOUBLE) {
prompt("Last Value Monitored")
special(SPC_NOMOD)
interest(3)
}
}
@@ -0,0 +1,729 @@
#*************************************************************************
# Copyright (c) 2008 UChicago Argonne LLC, as Operator of Argonne
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
=title Subroutine Record (sub)
The subroutine record is used to call a C initialization routine and a recurring
scan routine. There is no device support for this record.
=recordtype sub
=cut
recordtype(sub) {
=head2 Parameter Fields
The record-specific fields are described below, grouped by functionality.
=head3 Scan Parameters
The subroutine record has the standard fields for specifying under what
circumstances it will be processed. These fields are listed in
L<Scan Fields>. In addition, L<Scanning Specification>
explains how these fields are used.
=head3 Read Parameters
The subroutine record has twelve input links (INPA-INPL), each of which has a
corresponding value field (A-L). These fields are used to retrieve and store
values that can be passed to the subroutine that the record calls.
The input links can be either channel access or database links, or constants.
When constants, the corresponding value field for the link is initialized with
the constant value and the field's value can be changed at run-time via dbPuts.
Otherwise, the values for (A-F) are fetched from the input links when the record
is processed. See L<Address Specification> for information on specifying links.
=fields INPA, INPB, INPC, INPD, INPE, INPF, INPG, INPH, INPI, INPJ, INPK, INPL, A, B, C, D, E, F, G, H, I, J, K, L
=head3 Subroutine Connection
These fields are used to connect to the C subroutine. The name of the subroutine
should be entered in the SNAM field.
=fields INAM, SNAM
=head3 Operator Display Parameters
These parameters are used to present meaningful data to the operator. They
display the value and other parameters of the subroutine either textually or
graphically.
EGU is a string of up to 16 characters that could describe any units used by the
subroutine record. It is retrieved by the C<<< get_units >>> record support
routine.
The HOPR and LOPR fields set the upper and lower display limits for the VAL,
A-L, LA-LL, HIHI, LOLO, LOW, and HIGH fields. Both the C<<< get_graphic_double
>>> and C<<< get_control_double >>> record support routines retrieve these
fields.
The PREC field determines the floating point precision with which to display
VAL. It is used whenever the C<<< get_precision >>> record support routine is
called.
See L<Fields Common to All Record Types>
for more on the record name (NAME) and description (DESC) fields.
=fields EGU, HOPR, LOPR, PREC, NAME, DESC
=head3 Alarm Parameters
The possible alarm conditions for subroutine records are the SCAN, READ, limit
alarms, and an alarm that can be triggered if the subroutine returns a negative
value. The SCAN and READ alarms are called by the record or device support
routines. The limit alarms are configured by the user in the HIHI, LOLO, HIGH,
and LOW fields using numerical values. They apply to the VAL field. For each of
these fields, there is a corresponding severity field which can be either
NO_ALARM, MINOR, or MAJOR.
The BRSV field is where the user can set the alarm severity in case the
subroutine returns a negative value. See L<Alarm Specification>
for a complete explanation of alarms and these fields. L<Alarm Fields>
lists other fields related to a alarms that are common to all record types.
=fields HIHI, HIGH, LOW, LOLO, HHSV, HSV, LSV, LLSV, BRSV, HYST
=head3 Monitor Parameters
These parameters are used to determine when to send monitors placed on the VAL
field. The appropriate monitors are invoked when VAL differs from the values in
the ALST and MLST run-time fields, i.e., when the value of VAL changes by more
than the deadband specified in these fields. The ADEL and MDEL fields specify a
minimum delta which the change must surpass before the value-change monitors are
invoked. If these fields have a value of zero, everytime the value changes, a
monitor will be triggered; if they have a value of -1, everytime the record is
processed, monitors are triggered. The ADEL field is used by archive monitors
and the MDEL field for all other types of monitors. See L<Monitor Specification>
for a complete explanation of monitors and deadbands.
=fields ADEL, MDEL
=head3 Run-time Parameters
These parameters are used by the run-time code for processing the subroutine
record. They are not configured using a database configuration tool. They
represent the current state of the record. Many of them are used by the record
processing routines or the monitors.
VAL should be set by the subroutine. SADR holds the subroutine address and is
set by the record processing routine.
The rest of these fields--LALM, ALST, MLST, and the LA-LL fields--are used to
implement the monitors. For example, when LA is not equal to A, the value-change
monitors are called for that field.
=fields VAL, SADR, LALM, ALST, MLST, LA, LB, LC, LD, LE, LF, LG, LH, LI, LJ, LK, LL
=head2 Record Support
=head3 Record Support Routines
=head4 init_record
long (*init_record)(struct dbCommon *precord, int pass)
For each constant input link, the corresponding value field is initialized with
the constant value. For each input link that is of type PV_LINK, a channel
access link is created.
If an initialization subroutine is defined, it is located and called.
The processing subroutine is located and its address stored in SADR.
=head4 process
long (*process)(struct dbCommon *precord)
See L<Record Processing>.
=head4 get_units
long (*get_units)(struct dbAddr *paddr, char *units)
Retrieves EGU.
=head4 get_precision
long (*get_precision)(const struct dbAddr *paddr, long *precision)
Retrieves PREC when VAL is the field being referenced. Otherwise, calls C<<<
recGblGetPrec() >>>.
=head4 get_graphic_double
long (*get_graphic_double)(struct dbAddr *paddr, struct dbr_grDouble *p)
Sets the upper display and lower display limits for a field. If the field is
VAL, A-L, LA-LL, HIHI, HIGH, LOW, or LOLO, the limits are set to HOPR and LOPR,
else if the field has upper and lower limits defined they will be used, else the
upper and lower maximum values for the field type will be used.
=head4 get_control_double
long (*get_control_double)(struct dbAddr *paddr, struct dbr_ctrlDouble *p)
Sets the upper control and the lower control limits for a field. If the field is
VAL, A-L, LA-LL, HIHI, HIGH, LOW, or LOLO, the limits are set to HOPR and LOPR,
else if the field has upper and lower limits defined they will be used, else the
upper and lower maximum values for the field type will be used.
=head4 get_alarm_double
long (*get_alarm_double)(struct dbAddr *paddr, struct dbr_alDouble *p)
Sets the following values:
upper_alarm_limit = HIHI
upper_warning_limit = HIGH
lower_warning_limit = LOW
lower_alarm_limit = LOLO
=head3 Record Processing
Routine process implements the following algorithm:
=over
=item 1.
If PACT is FALSE then fetch all arguments.
=item 2.
Call the subroutine and check return value.
=over
=item *
Call subroutine
=item *
Set PACT TRUE
=item *
If return value is 1, return
=back
=item 3.
Check alarms. This routine checks to see if the new VAL causes the alarm status and severity to change. If so, NSEV, NSTA and LALM are set. It also honors the alarm hysteresis factor (HYST). Thus the value must change by more than HYST before the alarm status and severity is lowered.
=item 4.
Check to see if monitors should be invoked.
=over
=item *
Alarm monitors are invoked if the alarm status or severity has changed.
=item *
Archive and value change monitors are invoked if ADEL and MDEL conditions are
met.
=item *
Monitors for A-L are invoked if value has changed.
=item *
NSEV and NSTA are reset to 0.
=back
=item 5.
Scan forward link if necessary, set PACT FALSE, and return.
=back
=head3 Example Synchronous Subroutine
This is an example subroutine that merely increments VAL each time process is
called.
#include <stdio.h>
#include <dbDefs.h>
#include <subRecord.h>
#include <registryFunction.h>
#include <epicsExport.h>
static long subInit(struct subRecord *psub)
{
printf("subInit was called\n");
return 0;
}
static long subProcess(struct subRecord *psub)
{
psub->val++;
return 0;
}
epicsRegisterFunction(subInit);
epicsRegisterFunction(subProcess);
=head3 Example Asynchronous Subroutine
This example for a VxWorks IOC shows an asynchronous subroutine. It uses
(actually misuses) fields A and B. Field A is taken as the number of seconds
until asynchronous completion. Field B is a flag to decide if messages should be
printed. Lets assume A E<gt> 0 and B = 1. The following sequence of actions will
occcur:
=over
=item 1.
subProcess is called with pact FALSE. It performs the following steps.
=over
=item *
Computes, from A, the number of ticks until asynchronous completion should
occur.
=item *
Prints a message stating that it is requesting an asynchronous callback.
=item *
Calls the vxWorks watchdog start routine.
=item *
Sets pact TRUE and returns a value of 0. This tells record support to complete
without checking alarms, monitors, or the forward link.
=back
=item 2.
When the time expires, the system wide callback task calls myCallback.
myCallback locks the record, calls process, and unlocks the record.
=item 3.
Process again calls subProcess, but now pact is TRUE. Thus the following is
done:
=over
=item *
VAL is incremented.
=item *
A completion message is printed.
=item *
subProcess returns 0. The record processing routine will complete record
processing.
=back
=back
#include <types.h>
#include <stdio.h>
#include <wdLib.h>
#include <callback.h>
#include <dbDefs.h>
#include <dbAccess.h>
#include <subRecord.h>
/* control block for callback*/
struct callback {
epicsCallback callback;
struct dbCommon *precord;
WDOG_ID wd_id;
};
void myCallback(struct callback *pcallback)
{
struct dbCommon *precord=pcallback->precord;
struct rset *prset=(struct rset *)(precord->rset);
dbScanLock(precord);
(*prset->process)(precord);
dbScanUnlock(precord);
}
long subInit(struct subRecord *psub)
{
struct callback *pcallback;
pcallback = (struct callback *)(calloc(1,sizeof(struct callback)));
psub->dpvt = (void *)pcallback;
callbackSetCallback(myCallback,pcallback);
pcallback->precord = (struct dbCommon *)psub;
pcallback->wd_id = wdCreate();
printf("subInit was called\n");
return 0;
}
long subProcess(struct subRecord *psub)
{
struct callback *pcallback=(struct callback *)(psub->dpvt);
/* sub.inp must be a CONSTANT*/
if (psub->pact) {
psub->val++;
if (psub->b)
printf("%s subProcess Completed\n", psub->name);
return 0;
} else {
int wait_time = (long)(psub->a * vxTicksPerSecond);
if (wait_time <= 0){
if (psub->b)
printf("%s subProcess sync processing\n", psub->name);
psub->pact = TRUE;
return 0;
}
if (psub->b){
callbackSetPriority(psub->prio, pcallback);
printf("%s Starting async processing\n", psub->name);
wdStart(pcallback->wd_id, wait_time, callbackRequest, (int)pcallback);
return 1;
}
}
return 0;
}
=cut
include "dbCommon.dbd"
field(VAL,DBF_DOUBLE) {
prompt("Result")
asl(ASL0)
pp(TRUE)
}
field(INAM,DBF_STRING) {
prompt("Init Routine Name")
promptgroup("30 - Action")
special(SPC_NOMOD)
interest(1)
size(40)
}
field(SNAM,DBF_STRING) {
prompt("Subroutine Name")
promptgroup("30 - Action")
special(SPC_MOD)
interest(1)
size(40)
}
%struct subRecord;
%typedef long (*SUBFUNCPTR)(struct subRecord *);
field(SADR,DBF_NOACCESS) {
prompt("Subroutine Address")
special(SPC_NOMOD)
interest(4)
extra("SUBFUNCPTR sadr")
}
field(INPA,DBF_INLINK) {
prompt("Input A")
promptgroup("41 - Input A-F")
interest(1)
}
field(INPB,DBF_INLINK) {
prompt("Input B")
promptgroup("41 - Input A-F")
interest(1)
}
field(INPC,DBF_INLINK) {
prompt("Input C")
promptgroup("41 - Input A-F")
interest(1)
}
field(INPD,DBF_INLINK) {
prompt("Input D")
promptgroup("41 - Input A-F")
interest(1)
}
field(INPE,DBF_INLINK) {
prompt("Input E")
promptgroup("41 - Input A-F")
interest(1)
}
field(INPF,DBF_INLINK) {
prompt("Input F")
promptgroup("41 - Input A-F")
interest(1)
}
field(INPG,DBF_INLINK) {
prompt("Input G")
promptgroup("42 - Input G-L")
interest(1)
}
field(INPH,DBF_INLINK) {
prompt("Input H")
promptgroup("42 - Input G-L")
interest(1)
}
field(INPI,DBF_INLINK) {
prompt("Input I")
promptgroup("42 - Input G-L")
interest(1)
}
field(INPJ,DBF_INLINK) {
prompt("Input J")
promptgroup("42 - Input G-L")
interest(1)
}
field(INPK,DBF_INLINK) {
prompt("Input K")
promptgroup("42 - Input G-L")
interest(1)
}
field(INPL,DBF_INLINK) {
prompt("Input L")
promptgroup("42 - Input G-L")
interest(1)
}
field(EGU,DBF_STRING) {
prompt("Engineering Units")
promptgroup("80 - Display")
interest(1)
size(16)
prop(YES)
}
field(HOPR,DBF_DOUBLE) {
prompt("High Operating Range")
promptgroup("80 - Display")
interest(1)
prop(YES)
}
field(LOPR,DBF_DOUBLE) {
prompt("Low Operating Range")
promptgroup("80 - Display")
interest(1)
prop(YES)
}
field(HIHI,DBF_DOUBLE) {
prompt("Hihi Alarm Limit")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
}
field(LOLO,DBF_DOUBLE) {
prompt("Lolo Alarm Limit")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
}
field(HIGH,DBF_DOUBLE) {
prompt("High Alarm Limit")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
}
field(LOW,DBF_DOUBLE) {
prompt("Low Alarm Limit")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
}
field(PREC,DBF_SHORT) {
prompt("Display Precision")
promptgroup("80 - Display")
interest(1)
prop(YES)
}
field(BRSV,DBF_MENU) {
prompt("Bad Return Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
menu(menuAlarmSevr)
}
field(HHSV,DBF_MENU) {
prompt("Hihi Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
menu(menuAlarmSevr)
}
field(LLSV,DBF_MENU) {
prompt("Lolo Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
menu(menuAlarmSevr)
}
field(HSV,DBF_MENU) {
prompt("High Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
menu(menuAlarmSevr)
}
field(LSV,DBF_MENU) {
prompt("Low Severity")
promptgroup("70 - Alarm")
pp(TRUE)
interest(1)
prop(YES)
menu(menuAlarmSevr)
}
field(HYST,DBF_DOUBLE) {
prompt("Alarm Deadband")
promptgroup("70 - Alarm")
interest(1)
}
field(ADEL,DBF_DOUBLE) {
prompt("Archive Deadband")
promptgroup("80 - Display")
interest(1)
}
field(MDEL,DBF_DOUBLE) {
prompt("Monitor Deadband")
promptgroup("80 - Display")
interest(1)
}
field(A,DBF_DOUBLE) {
prompt("Value of Input A")
pp(TRUE)
}
field(B,DBF_DOUBLE) {
prompt("Value of Input B")
pp(TRUE)
}
field(C,DBF_DOUBLE) {
prompt("Value of Input C")
pp(TRUE)
}
field(D,DBF_DOUBLE) {
prompt("Value of Input D")
pp(TRUE)
}
field(E,DBF_DOUBLE) {
prompt("Value of Input E")
pp(TRUE)
}
field(F,DBF_DOUBLE) {
prompt("Value of Input F")
pp(TRUE)
}
field(G,DBF_DOUBLE) {
prompt("Value of Input G")
pp(TRUE)
}
field(H,DBF_DOUBLE) {
prompt("Value of Input H")
pp(TRUE)
}
field(I,DBF_DOUBLE) {
prompt("Value of Input I")
pp(TRUE)
}
field(J,DBF_DOUBLE) {
prompt("Value of Input J")
pp(TRUE)
}
field(K,DBF_DOUBLE) {
prompt("Value of Input K")
pp(TRUE)
}
field(L,DBF_DOUBLE) {
prompt("Value of Input L")
pp(TRUE)
}
field(LA,DBF_DOUBLE) {
prompt("Prev Value of A")
special(SPC_NOMOD)
interest(3)
}
field(LB,DBF_DOUBLE) {
prompt("Prev Value of B")
special(SPC_NOMOD)
interest(3)
}
field(LC,DBF_DOUBLE) {
prompt("Prev Value of C")
special(SPC_NOMOD)
interest(3)
}
field(LD,DBF_DOUBLE) {
prompt("Prev Value of D")
special(SPC_NOMOD)
interest(3)
}
field(LE,DBF_DOUBLE) {
prompt("Prev Value of E")
special(SPC_NOMOD)
interest(3)
}
field(LF,DBF_DOUBLE) {
prompt("Prev Value of F")
special(SPC_NOMOD)
interest(3)
}
field(LG,DBF_DOUBLE) {
prompt("Prev Value of G")
special(SPC_NOMOD)
interest(3)
}
field(LH,DBF_DOUBLE) {
prompt("Prev Value of H")
special(SPC_NOMOD)
interest(3)
}
field(LI,DBF_DOUBLE) {
prompt("Prev Value of I")
special(SPC_NOMOD)
interest(3)
}
field(LJ,DBF_DOUBLE) {
prompt("Prev Value of J")
special(SPC_NOMOD)
interest(3)
}
field(LK,DBF_DOUBLE) {
prompt("Prev Value of K")
special(SPC_NOMOD)
interest(3)
}
field(LL,DBF_DOUBLE) {
prompt("Prev Value of L")
special(SPC_NOMOD)
interest(3)
}
field(LALM,DBF_DOUBLE) {
prompt("Last Value Alarmed")
special(SPC_NOMOD)
interest(3)
}
field(ALST,DBF_DOUBLE) {
prompt("Last Value Archived")
special(SPC_NOMOD)
interest(3)
}
field(MLST,DBF_DOUBLE) {
prompt("Last Value Monitored")
special(SPC_NOMOD)
interest(3)
}
}
@@ -364,10 +364,10 @@ static long readValue(waveformRecord *prec)
prec->pact = FALSE;
}
else { /* !prec->pact && delay >= 0 */
CALLBACK *pvt = prec->simpvt;
epicsCallback *pvt = prec->simpvt;
if (!pvt) { /* very lazy allocation of callback structure */
pvt = calloc(1, sizeof(CALLBACK));
pvt = calloc(1, sizeof(epicsCallback));
prec->simpvt = pvt;
}
if (pvt)
@@ -4,34 +4,21 @@
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
# in file LICENSE that is included with this distribution.
#*************************************************************************
=title Waveform Record (waveform)
...
=head2 Record-specific Menus
=head3 Menu waveformPOST
The MPST and APST fields use this menu to determine when to post new value
and archive monitors respectively.
=menu waveformPOST
...
=head2 Parameter Fields
The record-specific fields are described below.
The waveform record type is used to interface waveform digitizers. The record
stores its data in arrays. The array can contain any of the supported data
types.
=recordtype waveform
...
=cut
include "menuFtype.dbd"
menu(waveformPOST) {
choice(waveformPOST_Always,"Always")
choice(waveformPOST_OnChange,"On Change")
@@ -39,11 +26,377 @@ menu(waveformPOST) {
recordtype(waveform) {
=fields VAL, FTVL, MPST, APST
=head2 Parameter Fields
The record-specific fields are described below, grouped by functionality.
=head3 Scan Parameters
The waveform record has the standard fields for specifying under what
circumstances the record will be processed. These fields are listed in L<Scan
Fields>. In addition, L<Scanning Specification> explains how these fields are
used. Note that I/O event scanning is only supported for those card types that
interrupt.
=head3 Read Parameters
These fields are configurable by the user to specify how and from where the
record reads its data. How the INP field is configured determines where the
waveform gets its input. It can be a hardware address, a channel access or
database link, or a constant. Only in records that use soft device support can
the INP field be a channel access link, a database link, or a constant.
Otherwise, the INP field must be a hardware address. See L<Address
Specification> for information on the format of hardware addresses and database
links.
=head4 Fields related to waveform reading
=fields DTYP, INP, NELM, FTVL, RARM
The DTYP field must contain the name of the appropriate device support module.
The values retrieved from the input link are placed in an array referenced by
VAL. (If the INP link is a constant, elements can be placed in the array via
dbPuts.) NELM specifies the number of elements that the array will hold, while
FTVL specifies the data type of the elements.
The RARM field causes the device to re-arm when this field is set to 1.
=head4 Possible data types for FTVL
=menu menuFtype
=head3 Operator Display Parameters
These parameters are used to present meaningful data to the operator. They
display the value and other parameters of the waveform either textually or
graphically.
=head4 Fields related to I<Operator Display>
=fields EGU, HOPR, LOPR, PREC, NAME, DESC
EGU is a string of up to 16 characters describing the units that the waveform
measures. It is retrieved by the C<<< get_units >>> record support routine.
The HOPR and LOPR fields set the upper and lower display limits for array
elements referenced by the VAL field. Both the C<<< get_graphic_double >>> and
C<<< get_control_double >>> record support routines retrieve these fields.
The PREC field determines the floating point precision with which to display the
array values. It is used whenever the C<<< get_precision >>> record support
routine is called.
See L<Fields Common to All Record Types> for more on the record name (NAME) and
description (DESC) fields.
=head3 Alarm Parameters
The waveform record has the alarm parameters common to all record types. L<Alarm
Fields> lists other fields related to a alarms that are common to all record
types.
=head3 Monitor Parameters
These parameters are used to determine when to send monitors placed on the VAL
field. The APST and MPST fields are a menu with choices "Always" and "On
Change". The default is "Always", thus monitors will normally be sent every time
the record processes. Selecting "On Change" causes a 32-bit hash of the VAL
field buffer to be calculated and compared with the previous hash value every
time the record processes; the monitor will only be sent if the hash is
different, indicating that the buffer has changed. Note that there is a small
chance that two different value buffers might result in the same hash value, so
for critical systems "Always" may be a better choice, even though it re-sends
duplicate data.
=head4 Record fields related to I<Monitor Parameters>
=fields APST, MPST, HASH
=head4 Menu choices for C<APST> and C<MPST> fields
=menu waveformPOST
=head3 Run-time Parameters
These parameters are used by the run-time code for processing the waveform. They
are not configured using a configuration tool. Only the VAL field is modifiable
at run-time.
VAL references the array where the waveform stores its data. The BPTR field
holds the address of the array.
The NORD field holds a counter of the number of elements that have been read
into the array. It is reset to 0 when the device is rearmed. The BUSY field
indicates if the device is armed but has not yet been digitized.
=fields VAL, BPTR, NORD, BUSY
The following fields are used to operate the waveform in the simulation mode.
See L<Simulation Mode> for more information on the simulation mode fields.
=fields SIOL, SIML, SIMM, SIMS
=begin html
<br>
<hr>
<br>
=end html
=head2 Record Support
=head3 Record Support Routines
=head4 init_record
static long init_record(waveformRecord *prec, int pass)
Using NELM and FTVL space for the array is allocated. The array address is
stored in the record.
This routine initializes SIMM with the value of SIML if SIML type is CONSTANT
link or creates a channel access link if SIML type is PV_LINK. VAL is likewise
initialized if SIOL is CONSTANT or PV_LINK.
This routine next checks to see that device support is available and a device
support read routine is defined. If either does not exist, an error message is
issued and processing is terminated
If device support includes C<init_record()>, it is called.
=head4 process
static long process(waveformRecord *prec)
See L</"Record Processing"> section below.
=head4 cvt_dbaddr
static long cvt_dbaddr(DBADDR *paddr)
This is called by dbNameToAddr. It makes the dbAddr structure refer to the
actual buffer holding the result.
=head4 get_array_info
static long get_array_info(DBADDR *paddr, long *no_elements, long *offset)
Obtains values from the array referenced by VAL.
=head4 put_array_info
static long put_array_info(DBADDR *paddr, long nNew)
Writes values into the array referenced by VAL.
=head4 get_units
static long get_units(DBADDR *paddr, char *units)
Retrieves EGU.
=head4 get_prec
static long get_precision(DBADDR *paddr, long *precision)
Retrieves PREC if field is VAL field. Otherwise, calls C<<< recGblGetPrec() >>>.
=head4 get_graphic_double
static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd)
Sets the upper display and lower display limits for a field. If the field is VAL
the limits are set to HOPR and LOPR, else if the field has upper and lower
limits defined they will be used, else the upper and lower maximum values for
the field type will be used.
Sets the following values:
upper_disp_limit = HOPR
lower_disp_limit = LOPR
=head4 get_control_double
static long get_control_double(DBADDR *paddr, struct dbr_ctrlDouble *pcd)
Sets the upper control and the lower control limits for a field. If the field is
VAL the limits are set to HOPR and LOPR, else if the field has upper and lower
limits defined they will be used, else the upper and lower maximum values for
the field type will be used.
Sets the following values
upper_ctrl_limit = HOPR
lower_ctrl_limit = LOPR
=head3 Record Processing
Routine process implements the following algorithm:
=over
=item 1.
Check to see that the appropriate device support module exists. If it doesn't,
an error message is issued and processing is terminated with the PACT field
still set to TRUE. This ensures that processes will no longer be called for this
record. Thus error storms will not occur.
=item 2.
Call device support read routine.
=item 3.
If PACT has been changed to TRUE, the device support read routine has started
but has not completed writing the new value. In this case, the processing
routine merely returns, leaving PACT TRUE.
=item 4.
Check to see if monitors should be invoked.
=over
=item *
Alarm monitors are invoked if the alarm status or severity has changed.
=item *
Archive and value change monitors are invoked if APST or MPST are Always or if
the result of the hash calculation is different.
=item *
NSEV and NSTA are reset to 0.
=back
=item 5.
Scan forward link if necessary, set PACT FALSE, and return.
=back
=begin html
<br>
<hr>
<br>
=end html
=head2 Device Support
=head3 Fields Of Interest To Device Support
Each waveform record must have an associated set of device support routines. The
primary responsibility of the device support routines is to obtain a new array
value whenever read_wf is called. The device support routines are primarily
interested in the following fields:
=fields PACT, DPVT, NSEV, NSTA, INP, NELM, FTVL, RARM, BPTR, NORD, BUSY
=head3 Device Support Routines
Device support consists of the following routines:
=head4 long report(int level)
This optional routine is called by the IOC command C<dbior> and is passed the
report level that was requested by the user.
It should print a report on the state of the device support to stdout.
The C<level> parameter may be used to output increasingly more detailed
information at higher levels, or to select different types of information with
different levels.
Level zero should print no more than a small summary.
=head4 long init(int after)
This optional routine is called twice at IOC initialization time.
The first call happens before any of the C<init_record()> calls are made, with
the integer parameter C<after> set to 0.
The second call happens after all of the C<init_record()> calls have been made,
with C<after> set to 1.
=head4 init_record
init_record(precord)
This routine is optional. If provided, it is called by the record support
C<init_record()> routine.
=head4 get_ioint_info
get_ioint_info(int cmd,struct dbCommon *precord,IOSCANPVT *ppvt)
This routine is called by the ioEventScan system each time the record is added
or deleted from an I/O event scan list. cmd has the value (0,1) if the
record is being (added to, deleted from) an I/O event list. It must be
provided for any device type that can use the ioEvent scanner.
=head4 read_wf
read_wf(precord)
This routine must provide a new input value. It returns the following values:
=over
=item *
0: Success.
=item *
Other: Error.
=back
=head3 Device Support For Soft Records
The C<<< Soft Channel >>> device support module is provided to read values from
other records and store them in arrays. If INP is a constant link, then read_wf
does nothing. In this case, the record can be used to hold arrays written via
dbPuts. If INP is a database or channel access link, the new array value is read
from the link. NORD is set.
This module places a value directly in VAL.
If the INP link type is constant, then NORD is set to zero. If the INP link type
is PV_LINK, then dbCaAddInlink is called by C<init_record()>.
read_wf calls recGblGetLinkValue which performs the following steps:
=over
=item *
If the INP link type is CONSTANT recGblGetLinkValue does nothing.
=item *
If the INP link type is DB_LINK, then dbGetLink is called to obtain a new input
value. If dbGetLink returns an error, a LINK_ALARM with a severity of
INVALID_ALARM is raised.
=item *
If the INP link type is CA_LINK, then dbCaGetLink is called to obtain a new
input value. If dbCaGetLink returns an error, a LINK_ALARM with a severity of
INVALID_ALARM is raised.
=item *
NORD is set to the number of values returned and read_wf returns.
=back
=cut
include "dbCommon.dbd"
include "dbCommon.dbd"
field(VAL,DBF_NOACCESS) {
prompt("Value")
asl(ASL0)
@@ -164,7 +517,7 @@ recordtype(waveform) {
prompt("Sim. Mode Private")
special(SPC_NOMOD)
interest(4)
extra("CALLBACK *simpvt")
extra("epicsCallback *simpvt")
}
field(MPST,DBF_MENU) {
prompt("Post Value Monitors")
+211 -192
View File
@@ -9,225 +9,244 @@
/* Author: Andrew Johnson Date: 2003-04-08 */
/* Usage:
* softIoc [-D softIoc.dbd] [-h] [-S] [-s] [-a ascf]
* [-m macro=value,macro2=value2] [-d file.db]
* [-x prefix] [st.cmd]
*
* If used the -D option must come first, and specify the
* path to the softIoc.dbd file. The compile-time install
* location is saved in the binary as a default.
*
* Usage information will be printed if -h is given, then
* the program will exit normally.
*
* The -S option prevents an interactive shell being started
* after all arguments have been processed.
*
* Previous versions accepted a -s option to cause a shell
* to be started; this option is still accepted but ignored
* since a command shell is now started by default.
*
* Access Security can be enabled with the -a option giving
* the name of the configuration file; if any macros were
* set with -m before the -a option was given, they will be
* used as access security substitution macros.
*
* Any number of -m and -d arguments can be interspersed;
* the macros are applied to the following .db files. Each
* later -m option causes earlier macros to be discarded.
*
* The -x option loads the softIocExit.db with the macro
* IOC set to the string provided. This database contains
* a subroutine record named $(IOC):exit which has its field
* SNAM set to "exit". When this record is processed, the
* subroutine that runs will call epicsExit() with the value
* of the field A determining whether the exit status is
* EXIT_SUCCESS if (A == 0.0) or EXIT_FAILURE (A != 0.0).
*
* A st.cmd file is optional. If any databases were loaded
* the st.cmd file will be run *after* iocInit. To perform
* iocsh commands before iocInit, all database loading must
* be performed by the script itself, or by the user from
* the interactive IOC shell.
*/
#include <stddef.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <stdio.h>
#include <iostream>
#include <string>
#include <list>
#include <stdexcept>
#include <epicsGetopt.h>
#include "registryFunction.h"
#include "epicsThread.h"
#include "epicsExit.h"
#include "epicsStdio.h"
#include "epicsString.h"
#include "dbStaticLib.h"
#include "subRecord.h"
#include "dbAccess.h"
#include "asDbLib.h"
#include "iocInit.h"
#include "iocsh.h"
#include "osiFileName.h"
#include "epicsInstallDir.h"
extern "C" int softIoc_registerRecordDeviceDriver(struct dbBase *pdbbase);
#define DBD_FILE EPICS_BASE "/dbd/softIoc.dbd"
#define EXIT_FILE EPICS_BASE "/db/softIocExit.db"
#ifndef EPICS_BASE
// so IDEs knows EPICS_BASE is a string constant
# define EPICS_BASE "/"
# error -DEPICS_BASE required
#endif
const char *arg0;
const char *base_dbd = DBD_FILE;
const char *exit_db = EXIT_FILE;
#define DBD_BASE "dbd" OSI_PATH_SEPARATOR "softIoc.dbd"
#define EXIT_BASE "db" OSI_PATH_SEPARATOR "softIocExit.db"
#define DBD_FILE_REL ".." OSI_PATH_SEPARATOR ".." OSI_PATH_SEPARATOR DBD_BASE
#define EXIT_FILE_REL ".." OSI_PATH_SEPARATOR ".." OSI_PATH_SEPARATOR EXIT_BASE
#define DBD_FILE EPICS_BASE OSI_PATH_SEPARATOR DBD_BASE
#define EXIT_FILE EPICS_BASE OSI_PATH_SEPARATOR EXIT_BASE
namespace {
static void exitSubroutine(subRecord *precord) {
epicsExitLater((precord->a == 0.0) ? EXIT_SUCCESS : EXIT_FAILURE);
}
static void usage(int status) {
printf("Usage: %s [-D softIoc.dbd] [-h] [-S] [-a ascf]\n", arg0);
puts("\t[-m macro=value,macro2=value2] [-d file.db]");
puts("\t[-x prefix] [st.cmd]");
puts("Compiled-in path to softIoc.dbd is:");
printf("\t%s\n", base_dbd);
epicsExit(status);
void usage(const char *arg0, const std::string& base_dbd) {
std::cout<<"Usage: "<<arg0<<
" [-D softIoc.dbd] [-h] [-S] [-s] [-a ascf]\n"
"[-m macro=value,macro2=value2] [-d file.db]\n"
"[-x prefix] [st.cmd]\n"
"\n"
" -D <dbd> If used, must come first. Specify the path to the softIoc.dbdfile."
" The compile-time install location is saved in the binary as a default.\n"
"\n"
" -h Print this mesage and exit.\n"
"\n"
" -S Prevents an interactive shell being started.\n"
"\n"
" -s Previously caused a shell to be started. Now accepted and ignored.\n"
"\n"
" -a <acf> Access Security configuration file. Macro substitution is\n"
" performed.\n"
"\n"
" -m <MAC>=<value>,... Set/replace macro definitions used by subsequent -d and\n"
" -a.\n"
"\n"
" -d <db> Load records from file (dbLoadRecords). Macro substitution is\n"
" performed.\n"
"\n"
" -x <prefix> Load softIocExit.db. Provides a record \"<prefix>:exit\".\n"
" Put 0 to exit with success, or non-zero to exit with an error.\n"
"\n"
"Any number of -m and -d arguments can be interspersed; the macros are applied\n"
"to the following .db files. Each later -m option causes earlier macros to be\n"
"discarded.\n"
"\n"
"A st.cmd file is optional. If any databases were loaded the st.cmd file will\n"
"be run *after* iocInit. To perform iocsh commands before iocInit, all database\n"
"loading must be performed by the script itself, or by the user from the\n"
"interactive IOC shell.\n"
"\n"
"Compiled-in path to softIoc.dbd is:\n"
"\t"<<base_dbd.c_str()<<"\n";
}
void errIf(int ret, const std::string& msg)
{
if(ret)
throw std::runtime_error(msg);
}
bool lazy_dbd_loaded;
void lazy_dbd(const std::string& dbd_file) {
if(lazy_dbd_loaded) return;
lazy_dbd_loaded = true;
errIf(dbLoadDatabase(dbd_file.c_str(), NULL, NULL),
std::string("Failed to load DBD file: ")+dbd_file);
std::cout<<"dbLoadDatabase(\""<<dbd_file<<"\")\n";
softIoc_registerRecordDeviceDriver(pdbbase);
std::cout<<"softIoc_registerRecordDeviceDriver(pdbbase)\n";
registryFunctionAdd("exit", (REGISTRYFUNCTION) exitSubroutine);
}
} // namespace
int main(int argc, char *argv[])
{
char *dbd_file = const_cast<char*>(base_dbd);
char *macros = NULL;
char xmacro[PVNAME_STRINGSZ + 4];
int startIocsh = 1; /* default = start shell */
int loadedDb = 0;
arg0 = strrchr(*argv, '/');
if (!arg0) {
arg0 = *argv;
} else {
++arg0; /* skip the '/' */
}
--argc, ++argv;
/* Do this here in case the dbd file not available */
if (argc>0 && **argv=='-' && (*argv)[1]=='h') {
usage(EXIT_SUCCESS);
}
if (argc>1 && **argv=='-' && (*argv)[1]=='D') {
dbd_file = *++argv;
argc -= 2;
++argv;
}
if (dbLoadDatabase(dbd_file, NULL, NULL)) {
epicsExit(EXIT_FAILURE);
}
softIoc_registerRecordDeviceDriver(pdbbase);
registryFunctionAdd("exit", (REGISTRYFUNCTION) exitSubroutine);
try {
std::string dbd_file(DBD_FILE),
exit_file(EXIT_FILE),
macros, // scratch space for macros (may be given more than once)
xmacro;
bool interactive = true;
bool loadedDb = false;
while (argc>1 && **argv == '-') {
switch ((*argv)[1]) {
case 'a':
if (macros) asSetSubstitutions(macros);
asSetFilename(*++argv);
--argc;
break;
case 'd':
if (dbLoadRecords(*++argv, macros)) {
epicsExit(EXIT_FAILURE);
}
loadedDb = 1;
--argc;
break;
case 'h':
usage(EXIT_SUCCESS);
case 'm':
macros = *++argv;
--argc;
break;
case 'S':
startIocsh = 0;
break;
case 's':
break;
case 'x':
epicsSnprintf(xmacro, sizeof xmacro, "IOC=%s", *++argv);
if (dbLoadRecords(exit_db, xmacro)) {
epicsExit(EXIT_FAILURE);
}
loadedDb = 1;
--argc;
break;
default:
printf("%s: option '%s' not recognized\n", arg0, *argv);
usage(EXIT_FAILURE);
}
--argc;
++argv;
// attempt to compute relative paths
{
std::string prefix;
char *cprefix = epicsGetExecDir();
if(cprefix) {
try {
prefix = cprefix;
free(cprefix);
} catch(...) {
free(cprefix);
throw;
}
}
dbd_file = prefix + DBD_FILE_REL;
exit_file = prefix + EXIT_FILE_REL;
}
int opt;
while ((opt = getopt(argc, argv, "ha:D:d:m:Ssx:")) != -1) {
switch (opt) {
case 'h': /* Print usage */
usage(argv[0], dbd_file);
epicsExit(0);
return 0;
default:
usage(argv[0], dbd_file);
std::cerr<<"Unknown argument: -"<<char(opt)<<"\n";
epicsExit(2);
return 2;
case 'a':
lazy_dbd(dbd_file);
if (!macros.empty()) {
if(asSetSubstitutions(macros.c_str()))
throw std::bad_alloc();
std::cout<<"asSetSubstitutions(\""<<macros<<"\")\n";
}
if(asSetFilename(optarg))
throw std::bad_alloc();
std::cout<<"asSetFilename(\""<<optarg<<"\")\n";
break;
case 'D':
if(lazy_dbd_loaded) {
throw std::runtime_error("-D specified too late. softIoc.dbd already loaded.\n");
}
dbd_file = optarg;
break;
case 'd':
lazy_dbd(dbd_file);
errIf(dbLoadRecords(optarg, macros.c_str()),
std::string("Failed to load: ")+optarg);
std::cout<<"dbLoadRecords(\""<<optarg<<"\"";
if(!macros.empty())
std::cout<<", \""<<macros<<"\"";
std::cout<<")\n";
loadedDb = true;
break;
case 'm':
macros = optarg;
break;
case 'S':
interactive = false;
break;
case 's':
break; // historical
case 'x':
lazy_dbd(dbd_file);
xmacro = "IOC=";
xmacro += optarg;
errIf(dbLoadRecords(exit_file.c_str(), xmacro.c_str()),
std::string("Failed to load: ")+exit_file);
loadedDb = true;
break;
}
}
lazy_dbd(dbd_file);
if(optind<argc) {
// run script
// ignore any extra positional args (historical)
std::cout<<"# Begin "<<argv[optind]<<"\n";
errIf(iocsh(argv[optind]),
std::string("Error in ")+argv[optind]);
std::cout<<"# End "<<argv[optind]<<"\n";
epicsThreadSleep(0.2);
loadedDb = true; /* Give it the benefit of the doubt... */
}
if (loadedDb) {
std::cout<<"iocInit()\n";
iocInit();
epicsThreadSleep(0.2);
}
if(interactive) {
std::cout.flush();
std::cerr.flush();
if(iocsh(NULL)) {
epicsExit(1);
return 1;
}
} else {
if (loadedDb) {
epicsThreadExitMain();
} else {
usage(argv[0], dbd_file);
std::cerr<<"Nothing to do!\n";
epicsExit(1);
return 1;
}
}
epicsExit(0);
return 0;
}catch(std::exception& e){
std::cerr<<"Error: "<<e.what()<<"\n";
epicsExit(2);
return 2;
}
if (argc>0 && **argv=='-') {
switch((*argv)[1]) {
case 'a':
case 'd':
case 'm':
case 'x':
printf("%s: missing argument to option '%s'\n", arg0, *argv);
usage(EXIT_FAILURE);
case 'h':
usage(EXIT_SUCCESS);
case 'S':
startIocsh = 0;
break;
case 's':
break;
default:
printf("%s: option '%s' not recognized\n", arg0, *argv);
usage(EXIT_FAILURE);
}
--argc;
++argv;
}
if (loadedDb) {
iocInit();
epicsThreadSleep(0.2);
}
/* run user's startup script */
if (argc>0) {
if (iocsh(*argv)) epicsExit(EXIT_FAILURE);
epicsThreadSleep(0.2);
loadedDb = 1; /* Give it the benefit of the doubt... */
}
/* start an interactive shell if it was requested */
if (startIocsh) {
iocsh(NULL);
} else {
if (loadedDb) {
epicsThreadExitMain();
} else {
printf("%s: Nothing to do!\n", arg0);
usage(EXIT_FAILURE);
}
}
epicsExit(EXIT_SUCCESS);
/*Note that the following statement will never be executed*/
return 0;
}