Merge changes from 3.15 branch into 7.0
This commit is contained in:
@@ -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.
|
||||
#*************************************************************************
|
||||
|
||||
# This is a Makefile fragment, see src/ioc/Makefile.
|
||||
@@ -62,6 +62,9 @@ DBDINC += dbCommon
|
||||
|
||||
dbMenusPod = $(notdir $(wildcard ../db/menu*.dbd.pod))
|
||||
HTMLS += $(patsubst %.dbd.pod,%.html,$(dbMenusPod))
|
||||
HTMLS += dbCommonRecord.html
|
||||
HTMLS += dbCommonInput.html
|
||||
HTMLS += dbCommonOutput.html
|
||||
|
||||
dbCore_SRCS += dbLock.c
|
||||
dbCore_SRCS += dbAccess.c
|
||||
@@ -96,4 +99,3 @@ dbCore_SRCS += chfPlugin.c
|
||||
dbCore_SRCS += dbState.c
|
||||
dbCore_SRCS += dbUnitTest.c
|
||||
dbCore_SRCS += dbServer.c
|
||||
|
||||
|
||||
@@ -6,21 +6,25 @@
|
||||
# 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.
|
||||
#*************************************************************************
|
||||
|
||||
# This is a Makefile fragment, see src/ioc/Makefile.
|
||||
|
||||
dbCommon.h$(DEP): $(IOCDIR)/db/dbCommonRecord.dbd $(IOCDIR)/db/RULES
|
||||
@$(RM) $@
|
||||
@$(DBTORECORDTYPEH) -D -I ../db -o $(COMMONDEP_TARGET) $< > $@
|
||||
THESE_RULES := $(IOCDIR)/db/RULES
|
||||
|
||||
$(COMMON_DIR)/dbCommon.h: $(IOCDIR)/db/dbCommonRecord.dbd $(IOCDIR)/db/RULES
|
||||
dbCommon.h$(DEP): $(COMMON_DIR)/dbCommonRecord.dbd $(THESE_RULES)
|
||||
@$(RM) $@
|
||||
@$(DBTORECORDTYPEH) -D -I ../db -I $(COMMON_DIR) -o $(COMMONDEP_TARGET) $< > $@
|
||||
|
||||
$(COMMON_DIR)/dbCommonRecord.html: ../db/dbCommon.dbd.pod
|
||||
|
||||
$(COMMON_DIR)/dbCommon.h: $(COMMON_DIR)/dbCommonRecord.dbd $(THESE_RULES)
|
||||
@$(RM) $(notdir $@)
|
||||
$(DBTORECORDTYPEH) -I ../db -o $(notdir $@) $<
|
||||
$(DBTORECORDTYPEH) -I ../db -I $(COMMON_DIR) -o $(notdir $@) $<
|
||||
@$(MV) $(notdir $@) $@
|
||||
|
||||
$(COMMON_DIR)/menuGlobal.dbd: $(IOCDIR)/db/Makefile $(IOCDIR)/db/RULES
|
||||
$(COMMON_DIR)/menuGlobal.dbd: $(IOCDIR)/db/Makefile $(THESE_RULES)
|
||||
|
||||
# This is a target-specific variable
|
||||
$(COMMON_DIR)/menuGlobal.dbd: DBDCAT_COMMAND = \
|
||||
|
||||
@@ -776,8 +776,19 @@ int dbLoadRecords(const char* file, const char* subs)
|
||||
return -1;
|
||||
}
|
||||
status = dbReadDatabase(&pdbbase, file, 0, subs);
|
||||
if (!status && dbLoadRecordsHook)
|
||||
dbLoadRecordsHook(file, subs);
|
||||
switch(status)
|
||||
{
|
||||
case 0:
|
||||
if(dbLoadRecordsHook)
|
||||
dbLoadRecordsHook(file, subs);
|
||||
break;
|
||||
case -2:
|
||||
errlogPrintf("dbLoadRecords: failed to load '%s'\n"
|
||||
" Records cannot be loaded after iocInit!\n", file);
|
||||
break;
|
||||
default:
|
||||
errlogPrintf("dbLoadRecords: failed to load '%s'\n", file);
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -943,6 +954,11 @@ long dbGet(DBADDR *paddr, short dbrType,
|
||||
} else {
|
||||
DBADDR localAddr = *paddr; /* Structure copy */
|
||||
|
||||
if (pfl->no_elements < 1) {
|
||||
status = S_db_badField;
|
||||
goto done;
|
||||
}
|
||||
|
||||
localAddr.field_type = pfl->field_type;
|
||||
localAddr.field_size = pfl->field_size;
|
||||
localAddr.no_elements = pfl->no_elements;
|
||||
|
||||
@@ -1,268 +0,0 @@
|
||||
#*************************************************************************
|
||||
# Copyright (c) 2007 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.
|
||||
#*************************************************************************
|
||||
%#include "epicsTypes.h"
|
||||
%#include "link.h"
|
||||
field(NAME,DBF_STRING) {
|
||||
prompt("Record Name")
|
||||
special(SPC_NOMOD)
|
||||
size(61)
|
||||
}
|
||||
field(DESC,DBF_STRING) {
|
||||
prompt("Descriptor")
|
||||
promptgroup("10 - Common")
|
||||
size(41)
|
||||
}
|
||||
field(ASG,DBF_STRING) {
|
||||
prompt("Access Security Group")
|
||||
promptgroup("10 - Common")
|
||||
special(SPC_AS)
|
||||
size(29)
|
||||
}
|
||||
field(SCAN,DBF_MENU) {
|
||||
prompt("Scan Mechanism")
|
||||
promptgroup("20 - Scan")
|
||||
special(SPC_SCAN)
|
||||
interest(1)
|
||||
menu(menuScan)
|
||||
}
|
||||
field(PINI,DBF_MENU) {
|
||||
prompt("Process at iocInit")
|
||||
promptgroup("20 - Scan")
|
||||
interest(1)
|
||||
menu(menuPini)
|
||||
}
|
||||
field(PHAS,DBF_SHORT) {
|
||||
prompt("Scan Phase")
|
||||
promptgroup("20 - Scan")
|
||||
special(SPC_SCAN)
|
||||
interest(1)
|
||||
}
|
||||
field(EVNT,DBF_STRING) {
|
||||
prompt("Event Name")
|
||||
promptgroup("20 - Scan")
|
||||
special(SPC_SCAN)
|
||||
size(40)
|
||||
interest(1)
|
||||
}
|
||||
field(TSE,DBF_SHORT) {
|
||||
prompt("Time Stamp Event")
|
||||
promptgroup("20 - Scan")
|
||||
interest(1)
|
||||
}
|
||||
field(TSEL,DBF_INLINK) {
|
||||
prompt("Time Stamp Link")
|
||||
promptgroup("20 - Scan")
|
||||
interest(1)
|
||||
}
|
||||
field(DTYP,DBF_DEVICE) {
|
||||
prompt("Device Type")
|
||||
promptgroup("10 - Common")
|
||||
interest(1)
|
||||
}
|
||||
field(DISV,DBF_SHORT) {
|
||||
prompt("Disable Value")
|
||||
promptgroup("20 - Scan")
|
||||
initial("1")
|
||||
}
|
||||
field(DISA,DBF_SHORT) {
|
||||
prompt("Disable")
|
||||
}
|
||||
field(SDIS,DBF_INLINK) {
|
||||
prompt("Scanning Disable")
|
||||
promptgroup("20 - Scan")
|
||||
interest(1)
|
||||
}
|
||||
%#include "epicsMutex.h"
|
||||
field(MLOK,DBF_NOACCESS) {
|
||||
prompt("Monitor lock")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
extra("epicsMutexId mlok")
|
||||
}
|
||||
%#include "ellLib.h"
|
||||
field(MLIS,DBF_NOACCESS) {
|
||||
prompt("Monitor List")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
extra("ELLLIST mlis")
|
||||
}
|
||||
field(BKLNK,DBF_NOACCESS) {
|
||||
prompt("Backwards link tracking")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
extra("ELLLIST bklnk")
|
||||
}
|
||||
field(DISP,DBF_UCHAR) {
|
||||
prompt("Disable putField")
|
||||
}
|
||||
field(PROC,DBF_UCHAR) {
|
||||
prompt("Force Processing")
|
||||
pp(TRUE)
|
||||
interest(3)
|
||||
}
|
||||
field(STAT,DBF_MENU) {
|
||||
prompt("Alarm Status")
|
||||
special(SPC_NOMOD)
|
||||
menu(menuAlarmStat)
|
||||
initial("UDF")
|
||||
}
|
||||
field(SEVR,DBF_MENU) {
|
||||
prompt("Alarm Severity")
|
||||
special(SPC_NOMOD)
|
||||
menu(menuAlarmSevr)
|
||||
}
|
||||
field(NSTA,DBF_MENU) {
|
||||
prompt("New Alarm Status")
|
||||
special(SPC_NOMOD)
|
||||
interest(2)
|
||||
menu(menuAlarmStat)
|
||||
}
|
||||
field(NSEV,DBF_MENU) {
|
||||
prompt("New Alarm Severity")
|
||||
special(SPC_NOMOD)
|
||||
interest(2)
|
||||
menu(menuAlarmSevr)
|
||||
}
|
||||
field(ACKS,DBF_MENU) {
|
||||
prompt("Alarm Ack Severity")
|
||||
special(SPC_NOMOD)
|
||||
interest(2)
|
||||
menu(menuAlarmSevr)
|
||||
}
|
||||
field(ACKT,DBF_MENU) {
|
||||
prompt("Alarm Ack Transient")
|
||||
promptgroup("70 - Alarm")
|
||||
special(SPC_NOMOD)
|
||||
interest(2)
|
||||
menu(menuYesNo)
|
||||
initial("YES")
|
||||
}
|
||||
field(DISS,DBF_MENU) {
|
||||
prompt("Disable Alarm Sevrty")
|
||||
promptgroup("70 - Alarm")
|
||||
interest(1)
|
||||
menu(menuAlarmSevr)
|
||||
}
|
||||
field(LCNT,DBF_UCHAR) {
|
||||
prompt("Lock Count")
|
||||
special(SPC_NOMOD)
|
||||
interest(2)
|
||||
}
|
||||
field(PACT,DBF_UCHAR) {
|
||||
prompt("Record active")
|
||||
special(SPC_NOMOD)
|
||||
interest(1)
|
||||
}
|
||||
field(PUTF,DBF_UCHAR) {
|
||||
prompt("dbPutField process")
|
||||
special(SPC_NOMOD)
|
||||
interest(1)
|
||||
}
|
||||
field(RPRO,DBF_UCHAR) {
|
||||
prompt("Reprocess ")
|
||||
special(SPC_NOMOD)
|
||||
interest(1)
|
||||
}
|
||||
field(ASP,DBF_NOACCESS) {
|
||||
prompt("Access Security Pvt")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
extra("struct asgMember *asp")
|
||||
}
|
||||
field(PPN,DBF_NOACCESS) {
|
||||
prompt("pprocessNotify")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
extra("struct processNotify *ppn")
|
||||
}
|
||||
field(PPNR,DBF_NOACCESS) {
|
||||
prompt("pprocessNotifyRecord")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
extra("struct processNotifyRecord *ppnr")
|
||||
}
|
||||
field(SPVT,DBF_NOACCESS) {
|
||||
prompt("Scan Private")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
extra("struct scan_element *spvt")
|
||||
}
|
||||
field(RSET,DBF_NOACCESS) {
|
||||
prompt("Address of RSET")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
extra("struct typed_rset *rset")
|
||||
}
|
||||
%#include "devSup.h"
|
||||
field(DSET,DBF_NOACCESS) {
|
||||
prompt("DSET address")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
extra("unambiguous_dset *dset")
|
||||
}
|
||||
field(DPVT,DBF_NOACCESS) {
|
||||
prompt("Device Private")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
extra("void *dpvt")
|
||||
}
|
||||
field(RDES,DBF_NOACCESS) {
|
||||
prompt("Address of dbRecordType")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
extra("struct dbRecordType *rdes")
|
||||
}
|
||||
field(LSET,DBF_NOACCESS) {
|
||||
prompt("Lock Set")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
extra("struct lockRecord *lset")
|
||||
}
|
||||
field(PRIO,DBF_MENU) {
|
||||
prompt("Scheduling Priority")
|
||||
promptgroup("20 - Scan")
|
||||
special(SPC_SCAN)
|
||||
interest(1)
|
||||
menu(menuPriority)
|
||||
}
|
||||
field(TPRO,DBF_UCHAR) {
|
||||
prompt("Trace Processing")
|
||||
}
|
||||
field(BKPT,DBF_NOACCESS) {
|
||||
prompt("Break Point")
|
||||
special(SPC_NOMOD)
|
||||
interest(1)
|
||||
extra("char bkpt")
|
||||
}
|
||||
field(UDF,DBF_UCHAR) {
|
||||
prompt("Undefined")
|
||||
promptgroup("10 - Common")
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
initial("1")
|
||||
}
|
||||
field(UDFS,DBF_MENU) {
|
||||
prompt("Undefined Alarm Sevrty")
|
||||
promptgroup("70 - Alarm")
|
||||
interest(1)
|
||||
menu(menuAlarmSevr)
|
||||
initial("INVALID")
|
||||
}
|
||||
%#include "epicsTime.h"
|
||||
field(TIME,DBF_NOACCESS) {
|
||||
prompt("Time")
|
||||
special(SPC_NOMOD)
|
||||
interest(2)
|
||||
extra("epicsTimeStamp time")
|
||||
}
|
||||
field(FLNK,DBF_FWDLINK) {
|
||||
prompt("Forward Process Link")
|
||||
promptgroup("20 - Scan")
|
||||
interest(1)
|
||||
}
|
||||
@@ -0,0 +1,521 @@
|
||||
#*************************************************************************
|
||||
# Copyright (c) 2007 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.
|
||||
#*************************************************************************
|
||||
|
||||
=head3 Operator Display Parameters
|
||||
|
||||
The B<NAME> field contains the record name which must be unique within an
|
||||
EPICS Channel Access name space. The name is supplied by the application
|
||||
developer and is the means of identifying a specific record. The name has a
|
||||
maximum length of 60 characters and should use only this limited set of
|
||||
characters:
|
||||
|
||||
a-z A-Z 0-9 _ - : [ ] < > ;
|
||||
|
||||
The B<DESC> field may be set to provide a meaningful description of the
|
||||
record's purpose. Maximum length is 40 characters.
|
||||
|
||||
=fields NAME, DESC
|
||||
|
||||
=cut
|
||||
|
||||
%#include "epicsTypes.h"
|
||||
%#include "link.h"
|
||||
field(NAME,DBF_STRING) {
|
||||
prompt("Record Name")
|
||||
special(SPC_NOMOD)
|
||||
size(61)
|
||||
}
|
||||
field(DESC,DBF_STRING) {
|
||||
prompt("Descriptor")
|
||||
promptgroup("10 - Common")
|
||||
size(41)
|
||||
}
|
||||
field(ASG,DBF_STRING) {
|
||||
prompt("Access Security Group")
|
||||
promptgroup("10 - Common")
|
||||
special(SPC_AS)
|
||||
size(29)
|
||||
}
|
||||
|
||||
=head3 Scan Fields
|
||||
|
||||
These fields contain information related to how and when a record processes. A
|
||||
few records have unique fields that also affect how they process. These
|
||||
fields, if any, will be listed and explained in the section for each record.
|
||||
|
||||
The B<SCAN> field specifies the scanning period for periodic record scans or the
|
||||
scan type for non-periodic record scans. The default set of values for SCAN can
|
||||
be found in L<menuScan.dbd|menuScan>.
|
||||
|
||||
The choices provided by this menu are:
|
||||
|
||||
=over
|
||||
|
||||
=item *
|
||||
|
||||
C<Passive> for the record scan to be triggered by other records or Channel
|
||||
Access
|
||||
|
||||
=item *
|
||||
|
||||
C<Event> for event-driven scan
|
||||
|
||||
=item *
|
||||
|
||||
C<I/O Intr> for interrupt-driven scan
|
||||
|
||||
=item *
|
||||
|
||||
A set of periodic scan intervals
|
||||
|
||||
=back
|
||||
|
||||
Additional periodic scan rates may be defined for individual IOCs by making a
|
||||
local copy of menuScan.dbd and adding more choices as required. Scan rates
|
||||
should normally be defined in order, with the fastest rates appearing first.
|
||||
Scan periods may now be specified in seconds, minutes, hours or Hertz/Hz, and
|
||||
plural time units will also be accepted (seconds are used if no unit is
|
||||
mentioned in the choice string). For example the rates given below are all
|
||||
valid:
|
||||
|
||||
1 hour
|
||||
0.5 hours
|
||||
15 minutes
|
||||
3 seconds
|
||||
1 second
|
||||
2 Hertz
|
||||
|
||||
The B<PINI> field specifies record processing at initialization. If it is set
|
||||
to YES during database configuration, the record is processed once at IOC
|
||||
initialization (before the normal scan tasks are started).
|
||||
|
||||
The B<PHAS> field orders the records within a specific SCAN group. This is not
|
||||
meaningful for passive records. All records of a specified phase are processed
|
||||
before those with higher phase number. Whenever possible it is better to use
|
||||
linked passive records to enforce the order of processing rather than a phase
|
||||
number.
|
||||
|
||||
The B<EVNT> field specifies an event number. This event number is used if the
|
||||
SCAN field is set to C<Event>. All records with scan type C<Event> and the
|
||||
same EVNT value will be processed when a call to post_event for EVNT is made.
|
||||
The call to post_event is: post_event(short event_number).
|
||||
|
||||
The B<PRIO> field specifies the scheduling priority for processing records
|
||||
with SCAN=C<I/O Event> and asynchronous record completion tasks.
|
||||
|
||||
The B<DISV> field specifies a "disable value". Record processing is
|
||||
immediately terminated if the value of this field is equal to the value of the
|
||||
DISA field, i.e. the record is disabled. Note that field values of a record
|
||||
can be changed by database put or Channel Access, even if a record is
|
||||
disabled.
|
||||
|
||||
The B<DISA> field contains the value that is compared with DISV to determine
|
||||
if the record is disabled. The value of the DISA field is obtained via SDIS if
|
||||
SDIS is a database or channel access link. If SDIS is not a database or
|
||||
channel access link, then DISA can be set via dbPutField or dbPutLink.
|
||||
|
||||
If the B<PROC> field of a record is written to, the record is processed.
|
||||
|
||||
The B<DISS> field defines the record's "disable severity". If this field is
|
||||
not NO_ALARM and the record is disabled, the record will be put into alarm
|
||||
with this severity and a status of DISABLE_ALARM.
|
||||
|
||||
The B<LSET> field contains the lock set to which this record belongs. All
|
||||
records linked in any way via input, output, or forward database links belong
|
||||
to the same lock set. Lock sets are determined at IOC initialization time, and
|
||||
are updated whenever a database link is added, removed or altered.
|
||||
|
||||
The B<LCNT> field counts the number of times dbProcess finds the record active
|
||||
during successive scans, i.e. PACT is TRUE. If dbProcess finds the record
|
||||
active MAX_LOCK times (currently set to 10) it raises a SCAN_ALARM.
|
||||
|
||||
The B<PACT> field is TRUE while the record is being processed. For
|
||||
asynchronous records PACT can be TRUE from the time record processing is
|
||||
started until the asynchronous completion occurs. As long as PACT is TRUE,
|
||||
dbProcess will not call the record processing routine. See Application
|
||||
Developers Guide for details on usage of PACT.
|
||||
|
||||
The B<FLNK> field is a database link to another record (the "target" record).
|
||||
Processing a record with a specified FLNK field will force processing of the
|
||||
target record, provided the target record's SCAN field is set to C<Passive>.
|
||||
|
||||
The B<SPVT> field is for internal use by the scanning system.
|
||||
|
||||
=fields SCAN, PINI, PHAS, EVNT, PRIO, DISV, DISA, SDIS, PROC, DISS, LCNT, PACT, FLNK, SPVT
|
||||
|
||||
=cut
|
||||
|
||||
field(SCAN,DBF_MENU) {
|
||||
prompt("Scan Mechanism")
|
||||
promptgroup("20 - Scan")
|
||||
special(SPC_SCAN)
|
||||
interest(1)
|
||||
menu(menuScan)
|
||||
}
|
||||
field(PINI,DBF_MENU) {
|
||||
prompt("Process at iocInit")
|
||||
promptgroup("20 - Scan")
|
||||
interest(1)
|
||||
menu(menuPini)
|
||||
}
|
||||
field(PHAS,DBF_SHORT) {
|
||||
prompt("Scan Phase")
|
||||
promptgroup("20 - Scan")
|
||||
special(SPC_SCAN)
|
||||
interest(1)
|
||||
}
|
||||
field(EVNT,DBF_STRING) {
|
||||
prompt("Event Name")
|
||||
promptgroup("20 - Scan")
|
||||
special(SPC_SCAN)
|
||||
size(40)
|
||||
interest(1)
|
||||
}
|
||||
field(TSE,DBF_SHORT) {
|
||||
prompt("Time Stamp Event")
|
||||
promptgroup("20 - Scan")
|
||||
interest(1)
|
||||
}
|
||||
field(TSEL,DBF_INLINK) {
|
||||
prompt("Time Stamp Link")
|
||||
promptgroup("20 - Scan")
|
||||
interest(1)
|
||||
}
|
||||
field(DTYP,DBF_DEVICE) {
|
||||
prompt("Device Type")
|
||||
promptgroup("10 - Common")
|
||||
interest(1)
|
||||
}
|
||||
field(DISV,DBF_SHORT) {
|
||||
prompt("Disable Value")
|
||||
promptgroup("20 - Scan")
|
||||
initial("1")
|
||||
}
|
||||
field(DISA,DBF_SHORT) {
|
||||
prompt("Disable")
|
||||
}
|
||||
field(SDIS,DBF_INLINK) {
|
||||
prompt("Scanning Disable")
|
||||
promptgroup("20 - Scan")
|
||||
interest(1)
|
||||
}
|
||||
%#include "epicsMutex.h"
|
||||
field(MLOK,DBF_NOACCESS) {
|
||||
prompt("Monitor lock")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
extra("epicsMutexId mlok")
|
||||
}
|
||||
%#include "ellLib.h"
|
||||
field(MLIS,DBF_NOACCESS) {
|
||||
prompt("Monitor List")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
extra("ELLLIST mlis")
|
||||
}
|
||||
field(BKLNK,DBF_NOACCESS) {
|
||||
prompt("Backwards link tracking")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
extra("ELLLIST bklnk")
|
||||
}
|
||||
field(DISP,DBF_UCHAR) {
|
||||
prompt("Disable putField")
|
||||
}
|
||||
field(PROC,DBF_UCHAR) {
|
||||
prompt("Force Processing")
|
||||
pp(TRUE)
|
||||
interest(3)
|
||||
}
|
||||
|
||||
=head3 Alarm Fields
|
||||
|
||||
These fields indicate the status and severity of alarms, or else determine the
|
||||
how and when alarms are triggered. Of course, many records have alarm-related
|
||||
fields not common to all records. These fields are listed and explained in the
|
||||
appropriate section on each record.
|
||||
|
||||
The B<STAT> field contains the current alarm status.
|
||||
|
||||
The B<SEVR> field contains the current alarm severity.
|
||||
|
||||
These two fields are seen outside database access. The B<NSTA> and B<NSEV>
|
||||
fields are used by the database access, record support, and device support
|
||||
routines to set new alarm status and severity values. Whenever any software
|
||||
component discovers an alarm condition, it uses the following macro function:
|
||||
recGblSetSevr(precord,new_status,new_severity) This ensures that the current
|
||||
alarm severity is set equal to the highest outstanding alarm. The file alarm.h
|
||||
defines all allowed alarm status and severity values.
|
||||
|
||||
The B<ACKS> field contains the highest unacknowledged alarm severity.
|
||||
|
||||
The B<ACKT> field specifies if it is necessary to acknowledge transient
|
||||
alarms.
|
||||
|
||||
The B<UDF> indicates if the record's value is B<U>nB<D>eB<F>ined. Typically
|
||||
this is caused by a failure in device support, the fact that the record has
|
||||
never been processed, or that the VAL field currently contains a NaN (not a
|
||||
number). UDF is initialized to TRUE at IOC initialization. Record and device
|
||||
support routines which write to the VAL field are responsible for setting UDF.
|
||||
|
||||
=fields STAT, SEVR, NSTA, NSEV, ACKS, ACKT, UDF
|
||||
|
||||
=cut
|
||||
|
||||
field(STAT,DBF_MENU) {
|
||||
prompt("Alarm Status")
|
||||
special(SPC_NOMOD)
|
||||
menu(menuAlarmStat)
|
||||
initial("UDF")
|
||||
}
|
||||
field(SEVR,DBF_MENU) {
|
||||
prompt("Alarm Severity")
|
||||
special(SPC_NOMOD)
|
||||
menu(menuAlarmSevr)
|
||||
}
|
||||
field(NSTA,DBF_MENU) {
|
||||
prompt("New Alarm Status")
|
||||
special(SPC_NOMOD)
|
||||
interest(2)
|
||||
menu(menuAlarmStat)
|
||||
}
|
||||
field(NSEV,DBF_MENU) {
|
||||
prompt("New Alarm Severity")
|
||||
special(SPC_NOMOD)
|
||||
interest(2)
|
||||
menu(menuAlarmSevr)
|
||||
}
|
||||
field(ACKS,DBF_MENU) {
|
||||
prompt("Alarm Ack Severity")
|
||||
special(SPC_NOMOD)
|
||||
interest(2)
|
||||
menu(menuAlarmSevr)
|
||||
}
|
||||
field(ACKT,DBF_MENU) {
|
||||
prompt("Alarm Ack Transient")
|
||||
promptgroup("70 - Alarm")
|
||||
special(SPC_NOMOD)
|
||||
interest(2)
|
||||
menu(menuYesNo)
|
||||
initial("YES")
|
||||
}
|
||||
field(DISS,DBF_MENU) {
|
||||
prompt("Disable Alarm Sevrty")
|
||||
promptgroup("70 - Alarm")
|
||||
interest(1)
|
||||
menu(menuAlarmSevr)
|
||||
}
|
||||
field(LCNT,DBF_UCHAR) {
|
||||
prompt("Lock Count")
|
||||
special(SPC_NOMOD)
|
||||
interest(2)
|
||||
}
|
||||
field(PACT,DBF_UCHAR) {
|
||||
prompt("Record active")
|
||||
special(SPC_NOMOD)
|
||||
interest(1)
|
||||
}
|
||||
field(PUTF,DBF_UCHAR) {
|
||||
prompt("dbPutField process")
|
||||
special(SPC_NOMOD)
|
||||
interest(1)
|
||||
}
|
||||
field(RPRO,DBF_UCHAR) {
|
||||
prompt("Reprocess ")
|
||||
special(SPC_NOMOD)
|
||||
interest(1)
|
||||
}
|
||||
field(ASP,DBF_NOACCESS) {
|
||||
prompt("Access Security Pvt")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
extra("struct asgMember *asp")
|
||||
}
|
||||
field(PPN,DBF_NOACCESS) {
|
||||
prompt("pprocessNotify")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
extra("struct processNotify *ppn")
|
||||
}
|
||||
field(PPNR,DBF_NOACCESS) {
|
||||
prompt("pprocessNotifyRecord")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
extra("struct processNotifyRecord *ppnr")
|
||||
}
|
||||
field(SPVT,DBF_NOACCESS) {
|
||||
prompt("Scan Private")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
extra("struct scan_element *spvt")
|
||||
}
|
||||
|
||||
=head3 Device Fields
|
||||
|
||||
The B<RSET> field contains the address of the Record Support Entry Table. See
|
||||
the Application Developers Guide for details on usage.
|
||||
|
||||
The B<DSET> field contains the address of Device Support Entry Table. The
|
||||
value of this field is determined at IOC initialization time. Record support
|
||||
routines use this field to locate their device support routines.
|
||||
|
||||
The B<DPVT> field is is for private use of the device support modules.
|
||||
|
||||
=fields RSET, DSET, DPVT
|
||||
|
||||
=cut
|
||||
|
||||
field(RSET,DBF_NOACCESS) {
|
||||
prompt("Address of RSET")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
extra("struct typed_rset *rset")
|
||||
}
|
||||
%#include "devSup.h"
|
||||
field(DSET,DBF_NOACCESS) {
|
||||
prompt("DSET address")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
extra("unambiguous_dset *dset")
|
||||
}
|
||||
field(DPVT,DBF_NOACCESS) {
|
||||
prompt("Device Private")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
extra("void *dpvt")
|
||||
}
|
||||
field(RDES,DBF_NOACCESS) {
|
||||
prompt("Address of dbRecordType")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
extra("struct dbRecordType *rdes")
|
||||
}
|
||||
field(LSET,DBF_NOACCESS) {
|
||||
prompt("Lock Set")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
extra("struct lockRecord *lset")
|
||||
}
|
||||
field(PRIO,DBF_MENU) {
|
||||
prompt("Scheduling Priority")
|
||||
promptgroup("20 - Scan")
|
||||
special(SPC_SCAN)
|
||||
interest(1)
|
||||
menu(menuPriority)
|
||||
}
|
||||
|
||||
=head3 Debugging Fields
|
||||
|
||||
The B<TPRO> field is used for trace processing. If this field is non-zero a
|
||||
message is printed whenever this record is processed, and when any other
|
||||
record in the same lock-set is processed by a database link from this record.
|
||||
|
||||
The B<BKPT> field indicates if there is a breakpoint set at this record. This
|
||||
supports setting a debug breakpoint in the record processing. STEP through
|
||||
database processing can be supported using this.
|
||||
|
||||
=fields TPRO, BKPT
|
||||
|
||||
|
||||
=head3 Miscellaneous Fields
|
||||
|
||||
The B<ASG> field contains a character string value defining the access
|
||||
security group for this record. If left empty, the record is placed in group
|
||||
DEFAULT.
|
||||
|
||||
The B<ASP> field is a field for private use of the access security system.
|
||||
|
||||
The B<DISP> field controls dbPutFields to this record which are normally
|
||||
issued by channel access. If the field is set to TRUE all dbPutFields
|
||||
directed to this record are ignored except to the field DISP itself.
|
||||
|
||||
The B<DTYP> field specifies the device type for the record. Each record type
|
||||
has its own set of device support routines which are specified in
|
||||
devSup.ASCII. If a record type does not have any associated device support,
|
||||
DTYP and DSET are meaningless.
|
||||
|
||||
The B<MLOK> field contains the monitor lock. The lock used by the monitor
|
||||
routines when the monitor list is being used. The list is locked whenever
|
||||
monitors are being scheduled, invoked, or when monitors are being added to or
|
||||
removed from the list. This field is accessed only by the dbEvent routines.
|
||||
|
||||
The B<MLIS> field is the head of the list of monitors connected to this
|
||||
record. Each record support module is responsible for triggering monitors for
|
||||
any fields that change as a result of record processing. Monitors are present
|
||||
if mlis count is greater than zero. The call to trigger monitors is:
|
||||
db_post_event(precord,&data,mask), where "mask" is some combination of
|
||||
DBE_ALARM, DBE_VALUE, and DBE_LOG.
|
||||
|
||||
The B<PPN> field contains the address of a putNotify callback.
|
||||
|
||||
The B<PPNR> field contains the next record for PutNotify.
|
||||
|
||||
The B<PUTF> field is set to TRUE if dbPutField caused the current record
|
||||
processing.
|
||||
|
||||
The B<RDES> field contains the address of dbRecordType
|
||||
|
||||
The B<RPRO> field specifies a reprocessing of the record when current
|
||||
processing completes.
|
||||
|
||||
The B<TIME> field contains the time when this record was last processed in
|
||||
standard format.
|
||||
|
||||
The B<TSE> field indicates the mechanism to use to get the time stamp. '0' -
|
||||
call get time as before '-1' - call the time stamp driver and use the best
|
||||
source available. '-2' - the device support provides the time stamp from the
|
||||
hardware. Values between 1-255 request the time of the last occurance of a
|
||||
generalTime event.
|
||||
|
||||
The B<TSEL> field contains an input link for obtaining the time stamp. If this
|
||||
link references the .TIME field of a record then the time stamp of the
|
||||
referenced record becomes the time stamp for this record as well. In this
|
||||
case, an internal flag is set and ".TIME" is then overwritten by ".VAL". If
|
||||
any other field is referenced, the field value is read and stored in the .TSE
|
||||
field which is then used to acquire a timestamp.
|
||||
|
||||
=fields ASG, ASP, DISP, DTYP, MLOK, MLIS, PPN, PPNR, PUTF, RDES, RPRO, TIME, TSE, TSEL
|
||||
|
||||
=cut
|
||||
|
||||
field(TPRO,DBF_UCHAR) {
|
||||
prompt("Trace Processing")
|
||||
}
|
||||
field(BKPT,DBF_NOACCESS) {
|
||||
prompt("Break Point")
|
||||
special(SPC_NOMOD)
|
||||
interest(1)
|
||||
extra("char bkpt")
|
||||
}
|
||||
field(UDF,DBF_UCHAR) {
|
||||
prompt("Undefined")
|
||||
promptgroup("10 - Common")
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
initial("1")
|
||||
}
|
||||
field(UDFS,DBF_MENU) {
|
||||
prompt("Undefined Alarm Sevrty")
|
||||
promptgroup("70 - Alarm")
|
||||
interest(1)
|
||||
menu(menuAlarmSevr)
|
||||
initial("INVALID")
|
||||
}
|
||||
%#include "epicsTime.h"
|
||||
field(TIME,DBF_NOACCESS) {
|
||||
prompt("Time")
|
||||
special(SPC_NOMOD)
|
||||
interest(2)
|
||||
extra("epicsTimeStamp time")
|
||||
}
|
||||
field(FLNK,DBF_FWDLINK) {
|
||||
prompt("Forward Process Link")
|
||||
promptgroup("20 - Scan")
|
||||
interest(1)
|
||||
}
|
||||
@@ -0,0 +1,181 @@
|
||||
#*************************************************************************
|
||||
# EPICS BASE is distributed subject to a Software License Agreement found
|
||||
# in file LICENSE that is included with this distribution.
|
||||
#*************************************************************************
|
||||
|
||||
=head1 Fields Common to Input Record Types
|
||||
|
||||
This section describes fields that are found in many input record types.
|
||||
These fields usually have the same meaning whenever they are used.
|
||||
|
||||
See also L<Fields Common to All Record Types|dbCommonRecord> and L<Fields Common
|
||||
to Output Record Types|dbCommonOutput>.
|
||||
|
||||
=head3 Input and Value Fields
|
||||
|
||||
The B<INP> field specifies an input link. It is used by the device support
|
||||
routines to obtain input. For soft analog records it can be a constant, a
|
||||
database link, or a channel access link.
|
||||
|
||||
The B<DTYP> field specifies the name of the device support module that will
|
||||
input values. Each record type has its own set of device support routines. If
|
||||
a record type does not have any associated device support, DTYP is
|
||||
meaningless.
|
||||
|
||||
The B<RVAL> field contains - whenever possible - the raw data value exactly as
|
||||
it is obtained from the hardware or from the associated device driver and
|
||||
before it undergoes any conversions. The Soft Channel device support module
|
||||
reads values directly into VAL, bypassing this field.
|
||||
|
||||
The B<VAL> field contains the record's final value, after any needed
|
||||
conversions have been performed.
|
||||
|
||||
=head3 Device Input
|
||||
|
||||
A device input routine normally returns one of the following values to its
|
||||
associated record support routine:
|
||||
|
||||
=over
|
||||
|
||||
=item *
|
||||
|
||||
0: Success and convert. The input value is in RVAL. The record support module
|
||||
will compute VAL from RVAL.
|
||||
|
||||
=item *
|
||||
|
||||
2: Success, but don't convert. The device support module can specify this
|
||||
value if it does not want any conversions. It might do this for two reasons:
|
||||
|
||||
=over
|
||||
|
||||
=item *
|
||||
|
||||
A hardware error is detected (in this case, it should also raise an alarm
|
||||
condition).
|
||||
|
||||
=item *
|
||||
|
||||
The device support routine reads values directly into the VAL field and then
|
||||
sets UDF to FALSE. For some record types the device support routine may have to
|
||||
do other record-specific processing as well such as applying a smoothing filter
|
||||
to the engineering units value.
|
||||
|
||||
=back
|
||||
|
||||
=back
|
||||
|
||||
=head3 Device Support for Soft Records
|
||||
|
||||
In most cases, two soft output device support modules are provided: Soft Channel
|
||||
and Raw Soft Channel. Both allow INP to be a constant, a database link, or a
|
||||
channel access link. The Soft Channel device support module reads input directly
|
||||
into the VAL field and specifies that no value conversion should be performed.
|
||||
This allows the record to store values in the data type of its VAL field. Note
|
||||
that for Soft Channel input, the RVAL field is not used. The Raw Soft Channel
|
||||
support module reads input into RVAL and indicates that any specified unit
|
||||
conversions be performed.
|
||||
|
||||
The device support read routine normally calls C<dbGetLink()> which
|
||||
fetches a value from the link.
|
||||
|
||||
If a value was returned by the link the UDF field is set to FALSE. The device
|
||||
support read routine normally returns the status from C<dbGetLink()>.
|
||||
|
||||
|
||||
=head3 Input Simulation Fields
|
||||
|
||||
The B<SIMM> field controls simulation mode. It has either the value YES or NO.
|
||||
By setting this field to YES, the record can be switched into simulation mode
|
||||
of operation. While in simulation mode, input will be obtained from SIOL
|
||||
instead of INP.
|
||||
|
||||
Ths B<SIML> specifies the simulation mode location. This field can be a
|
||||
constant, a database link, or a channel access link. If SIML is a database or
|
||||
channel access link, then SIMM is read from SIML. If SIML is a constant link
|
||||
then SIMM is initialized with the constant value but can be changed via
|
||||
dbPuts.
|
||||
|
||||
Ths B<SVAL> field contains the simulation value. This is the record's input
|
||||
value, in engineering units, when the record is switched into simulation mode,
|
||||
i.e. when SIMM is set to YES.
|
||||
|
||||
The B<SIOL> field is a link that can be used to fetch the simulation value. The
|
||||
link can be a constant, a database link, or a channel access link. If SIOL is a
|
||||
database or channel access link, then SVAL is read from SIOL. If SIOL is a
|
||||
constant link then SVAL is initialized with the constant value but can be
|
||||
changed via dbPuts.
|
||||
|
||||
The B<SIMS> field specifies the simulation mode alarm severity. When this
|
||||
field is set to a value other than NO_ALARM and the record is in simulation
|
||||
mode, it will be put into alarm with this severity and a status of SIMM.
|
||||
|
||||
=head3 Simulation Mode for Input Records
|
||||
|
||||
An input record can be switched into simulation mode of operation by setting
|
||||
the value of SIMM to YES or RAW. During simulation, the record will be put
|
||||
into alarm with a severity of SIMS and a status of SIMM_ALARM. While in
|
||||
simulation mode, input values will be read from SIOL instead of INP:
|
||||
|
||||
-- (SIMM = NO?) INP (if supported and directed by device support, -> RVAL -- convert -> VAL), (else -> VAL)
|
||||
/
|
||||
|
||||
SIML -> SIMM
|
||||
|
||||
\
|
||||
-- (SIMM = YES?) SIOL -> SVAL -> VAL
|
||||
\
|
||||
-- (SIMM = RAW?) SIOL -> SVAL -> RVAL -- convert -> VAL
|
||||
|
||||
A record can be switched into simulation mode of operation by setting the
|
||||
value of SIMM to YES. During simulation, the record will be put into alarm
|
||||
with a severity of SIMS and a status of SIMM_ALARM. While in simulation mode,
|
||||
input values, in engineering units, will be obtained from SIOL instead of INP.
|
||||
Also, while the record is in simulation mode, there will be no raw value
|
||||
conversion and no calls to device support when the record is processed.
|
||||
|
||||
Normally input records contain a private readValue() routine which performs
|
||||
the following steps:
|
||||
|
||||
=over
|
||||
|
||||
=item *
|
||||
|
||||
If PACT is TRUE, the device support read routine is called, status is set to
|
||||
its return code, and readValue returns.
|
||||
|
||||
=item *
|
||||
|
||||
Call C<dbGetLink()> to get a new value for SIMM from SIML.
|
||||
|
||||
=item *
|
||||
|
||||
Check value of SIMM.
|
||||
|
||||
=item *
|
||||
|
||||
If SIMM is NO, then call the device support read routine, set status to its
|
||||
return code, and return.
|
||||
|
||||
=item *
|
||||
|
||||
If SIMM is YES, then call C<dbGetLink()> to read the input value from SIOL
|
||||
into SVAL. If success, then set VAL to SVAL and UDF to FALSE and set status to
|
||||
2 (don't convert) if input record supports conversion. If SIMS is greater than
|
||||
zero, set alarm status to SIMM and severity to SIMS. Set status to the return
|
||||
code from recGblGetLinkValue and return.
|
||||
|
||||
=item *
|
||||
|
||||
If SIMM is RAW, then call C<dbGetLink()> to read the input value from SIOL
|
||||
into SVAL. If success, then set RVAL to SVAL and UDF to FALSE and set status
|
||||
to 0 (convert) if input record supports conversion. If SIMS is greater than
|
||||
zero, set alarm status to SIMM and severity to SIMS. Set status to the return
|
||||
code from recGblGetLinkValue and return.
|
||||
|
||||
=item *
|
||||
|
||||
If SIMM is not YES, NO or RAW, a SOFT alarm with a severity of INVALID is
|
||||
raised, and return status is set to -1.
|
||||
|
||||
=back
|
||||
@@ -0,0 +1,211 @@
|
||||
#*************************************************************************
|
||||
# EPICS BASE is distributed subject to a Software License Agreement found
|
||||
# in file LICENSE that is included with this distribution.
|
||||
#*************************************************************************
|
||||
|
||||
=head1 Fields Common to Output Record Types
|
||||
|
||||
This section describes fields that are found in many output record types.
|
||||
These fields usually have the same meaning whenever they are used.
|
||||
|
||||
See also L<Fields Common to All Record Types|dbCommonRecord> and L<Fields Common to
|
||||
Input Records|dbCommonInput>.
|
||||
|
||||
=head3 Output and Value Fields
|
||||
|
||||
The B<OUT> field specifies an output link. It is used by the device support
|
||||
routines to decide where to send output. For soft records, it can be a
|
||||
constant, a database link, or a channel access link. If the link is a
|
||||
constant, the result is no output.
|
||||
|
||||
The B<DTYP> field specifies the name of the device support module that will
|
||||
input values. Each record type has its own set of device support routines. If
|
||||
a record type does not have any associated device support, DTYP is
|
||||
meaningless.
|
||||
|
||||
The B<VAL> field contains the desired value before any conversions to raw
|
||||
output have been performed.
|
||||
|
||||
The B<OVAL> field is used to decide when to invoke monitors. Archive and value
|
||||
change monitors are invoked if OVAL is not equal to VAL. If a record type
|
||||
needs to make adjustments, OVAL is used to enforce the maximum rate of change
|
||||
limit before converting the desired value to a raw value.
|
||||
|
||||
The B<RVAL> field contains - whenever possible - the actual value sent to the
|
||||
hardware itself or to the associated device driver.
|
||||
|
||||
The B<RBV> field contains - whenever possible - the actual read back value
|
||||
obtained from the hardware itself or from the associated device driver.
|
||||
|
||||
|
||||
=head3 Device Support for Soft Records
|
||||
|
||||
Normally two soft output device support modules are provided, Soft Channel and
|
||||
and Raw Soft Channel. Both write a value through the output link OUT.
|
||||
The Soft Channel module writes output from the value associated with OVAL or
|
||||
VAL (if OVAL does not exist). The Raw Soft Channel support module writes the
|
||||
value associated with the RVAL field after conversion has been performed.
|
||||
|
||||
The device support write routine normally calls C<dbPutLink()> which writes a
|
||||
value through the OUT link, and returns the status from that call.
|
||||
|
||||
|
||||
=head3 Input and Mode Select Fields
|
||||
|
||||
The B<DOL> field is a link from which the desired output value can be fetched.
|
||||
DOL can be a constant, a database link, or a channel access link. If DOL is a
|
||||
database or channel access link and OMSL is closed_loop, then VAL is obtained
|
||||
from DOL.
|
||||
|
||||
The B<OMSL> field selects the output mode. This field has either the value
|
||||
C<supervisory> or C<closed_loop>. DOL is used to fetch VAL only if OMSL has the
|
||||
value C<closed_loop>. By setting this field a record can be switched between
|
||||
supervisory and closed loop mode of operation. While in closed loop mode, the
|
||||
VAL field cannot be set via dbPuts.
|
||||
|
||||
=head3 Output Mode Selection
|
||||
|
||||
The fields DOL and OMSL are used to allow the output record to be part of a
|
||||
closed loop control algorithm. OMSL is meaningful only if DOL refers to a
|
||||
database or channel access link. It can have the values C<supervisory> or
|
||||
C<closed_loop>. If the mode is C<supervisory>, then nothing is done to VAL. If
|
||||
the mode is C<closed_loop> and the record type does not contain an OIF field,
|
||||
then each time the record is processed, VAL is set equal to the value obtained
|
||||
from the location referenced by DOL. If the mode is C<closed_loop> in record
|
||||
types with an OIF field and OIF is Full, VAL is set equal to the value obtained
|
||||
from the location referenced by DOL; if OIF is Incremental VAL is incremented by
|
||||
the value obtained from DOL.
|
||||
|
||||
=head3 Invalid Output Action Fields
|
||||
|
||||
The B<IVOA> field specifies the output action for the case that the record is
|
||||
put into an INVALID alarm severity. IVOA can be one of the following actions:
|
||||
|
||||
=over
|
||||
|
||||
=item *
|
||||
|
||||
C<Continue normally>
|
||||
|
||||
=item *
|
||||
|
||||
C<Don't drive outputs>
|
||||
|
||||
=item *
|
||||
|
||||
C<Set output to IVOV>
|
||||
|
||||
=back
|
||||
|
||||
The B<IVOV> field contains the value for the IVOA action C<Set output to IVOV>
|
||||
in engineering units. If a new severity has been set to INVALID and IVOA is
|
||||
C<Set output to IVOV>, then VAL is set to IVOV and converted to RVAL before
|
||||
device support is called.
|
||||
|
||||
=head3 Invalid Alarm Output Action
|
||||
|
||||
Whenever an output record is put into INVALID alarm severity, IVOA specifies
|
||||
an action to take. The record support process routine for each output record
|
||||
contains code which performs the following steps.
|
||||
|
||||
=over
|
||||
|
||||
=item *
|
||||
|
||||
If new severity is less than INVALID, then call C<writeValue()>:
|
||||
|
||||
=item *
|
||||
|
||||
Else do the following:
|
||||
|
||||
=over
|
||||
|
||||
=item *
|
||||
|
||||
If IVOA is C<Continue normally> then call C<writeValue()>.
|
||||
|
||||
=item *
|
||||
|
||||
If IVOA is C<Don't drive outputs> then do not write output.
|
||||
|
||||
=item *
|
||||
|
||||
If IVOA is C<Set output to IVOV> then set VAL to IVOV, call C<convert()> if
|
||||
necessary, and then call C<writeValue()>.
|
||||
|
||||
=item *
|
||||
|
||||
If IVOA not one of the above, an error message is generated.
|
||||
|
||||
=back
|
||||
|
||||
=back
|
||||
|
||||
|
||||
=head3 Simulation Fields
|
||||
|
||||
The B<SIMM> field controls simulation mode. It has either the value YES or NO.
|
||||
By setting this field to YES, the record can be switched into simulation mode
|
||||
of operation. While in simulation mode, output will be forwarded through SIOL
|
||||
instead of OUT.
|
||||
|
||||
Ths B<SIML> specifies the simulation mode location. This field can be a
|
||||
constant, a database link, or a channel access link. If SIML is a database or
|
||||
channel access link, then SIMM is read from SIML. If SIML is a constant link
|
||||
then SIMM is initialized with the constant value but can be changed via
|
||||
dbPuts.
|
||||
|
||||
The B<SIOL> field is a link that the output value is written to when the record
|
||||
is in simulation mode.
|
||||
|
||||
The B<SIMS> field specifies the simulation mode alarm severity. When this
|
||||
field is set to a value other than NO_ALARM and the record is in simulation
|
||||
mode, it will be put into alarm with this severity and a status of SIMM.
|
||||
|
||||
=head3 Simulation Mode
|
||||
|
||||
An output record can be switched into simulation mode of operation by setting
|
||||
the value of SIMM to YES. During simulation, the record will be put into alarm
|
||||
with a severity of SIMS and a status of SIMM_ALARM. While in simulation mode,
|
||||
output values, in engineering units, will be written to SIOL instead of OUT.
|
||||
However, the output values are never converted. Also, while the record is in
|
||||
simulation mode, there will be no calls to device support during record
|
||||
processing.
|
||||
|
||||
Normally output records contain a private C<writeValue()> routine which performs
|
||||
the following steps:
|
||||
|
||||
=over
|
||||
|
||||
=item *
|
||||
|
||||
If PACT is TRUE, the device support write routine is called, status is set to
|
||||
its return code, and readValue returns.
|
||||
|
||||
=item *
|
||||
|
||||
Call C<dbGetLink()> to get a new value for SIMM if SIML is a DB_LINK or a
|
||||
CA_LINK.
|
||||
|
||||
=item *
|
||||
|
||||
Check value of SIMM.
|
||||
|
||||
=item *
|
||||
|
||||
If SIMM is NO, then call the device support write routine, set status to its
|
||||
return code, and return.
|
||||
|
||||
=item *
|
||||
|
||||
If SIMM is YES, then call C<dbPutLink()> to write the output value from VAL or
|
||||
OVAL to SIOL. Set alarm status to SIMM and severity to SIMS, if SIMS is
|
||||
greater than zero. Set status to the return code from C<dbPutLink()> and
|
||||
return.
|
||||
|
||||
=item *
|
||||
|
||||
If SIMM not one of the above, a SOFT alarm with a severity of INVALID is
|
||||
raised, and return status is set to -1.
|
||||
|
||||
=back
|
||||
@@ -1,12 +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 Versions 3.13.7
|
||||
# and higher are distributed subject to a Software License Agreement found
|
||||
# in file LICENSE that is included with this distribution.
|
||||
#*************************************************************************
|
||||
recordtype(dbCommon) {
|
||||
include "dbCommon.dbd"
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
#*************************************************************************
|
||||
# EPICS BASE is distributed subject to a Software License Agreement found
|
||||
# in file LICENSE that is included with this distribution.
|
||||
#*************************************************************************
|
||||
|
||||
=head1 Fields Common to All Record Types
|
||||
|
||||
This section contains a description of the fields that are common to all record
|
||||
types. These fields are defined in dbCommon.dbd.
|
||||
|
||||
See also L<Fields Common to Input Record Types|dbCommonInput> and L<Fields
|
||||
Common to Output Record Types|dbCommonOutput>.
|
||||
|
||||
=recordtype dbCommon
|
||||
|
||||
=cut
|
||||
|
||||
recordtype(dbCommon) {
|
||||
include "dbCommon.dbd.pod"
|
||||
}
|
||||
@@ -35,6 +35,7 @@
|
||||
#include "epicsExport.h"
|
||||
#include "link.h"
|
||||
#include "special.h"
|
||||
#include "iocInit.h"
|
||||
|
||||
|
||||
|
||||
@@ -216,10 +217,13 @@ static long dbReadCOM(DBBASE **ppdbbase,const char *filename, FILE *fp,
|
||||
char *penv;
|
||||
char **macPairs;
|
||||
|
||||
if(ellCount(&tempList)) {
|
||||
if (ellCount(&tempList)) {
|
||||
epicsPrintf("dbReadCOM: Parser stack dirty %d\n", ellCount(&tempList));
|
||||
}
|
||||
|
||||
if (getIocState() != iocVoid)
|
||||
return -2;
|
||||
|
||||
if(*ppdbbase == 0) *ppdbbase = dbAllocBase();
|
||||
pdbbase = *ppdbbase;
|
||||
if(path && strlen(path)>0) {
|
||||
|
||||
@@ -70,9 +70,7 @@
|
||||
#include "registryJLinks.h"
|
||||
#include "registryRecordType.h"
|
||||
|
||||
static enum {
|
||||
iocVirgin, iocBuilding, iocBuilt, iocRunning, iocPaused, iocStopped
|
||||
} iocState = iocVirgin;
|
||||
static enum iocStateEnum iocState = iocVoid;
|
||||
static enum {
|
||||
buildServers, buildIsolated
|
||||
} iocBuildMode;
|
||||
@@ -99,6 +97,11 @@ static void iterateRecords(recIterFunc func, void *user);
|
||||
int dbThreadRealtimeLock = 1;
|
||||
epicsExportAddress(int, dbThreadRealtimeLock);
|
||||
|
||||
enum iocStateEnum getIocState(void)
|
||||
{
|
||||
return iocState;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize EPICS on the IOC.
|
||||
*/
|
||||
@@ -109,7 +112,7 @@ int iocInit(void)
|
||||
|
||||
static int iocBuild_1(void)
|
||||
{
|
||||
if (iocState != iocVirgin && iocState != iocStopped) {
|
||||
if (iocState != iocVoid) {
|
||||
errlogPrintf("iocBuild: IOC can only be initialized from uninitialized or stopped state\n");
|
||||
return -1;
|
||||
}
|
||||
@@ -705,8 +708,7 @@ static void doFreeRecord(dbRecordType *pdbRecordType, dbCommon *precord,
|
||||
|
||||
int iocShutdown(void)
|
||||
{
|
||||
if (iocState == iocVirgin || iocState == iocStopped)
|
||||
return 0;
|
||||
if (iocState == iocVoid) return 0;
|
||||
|
||||
iterateRecords(doCloseLinks, NULL);
|
||||
|
||||
@@ -734,7 +736,7 @@ int iocShutdown(void)
|
||||
iocshFree();
|
||||
}
|
||||
|
||||
iocState = iocStopped;
|
||||
iocState = iocVoid;
|
||||
iocBuildMode = buildServers;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -13,10 +13,15 @@
|
||||
|
||||
#include "shareLib.h"
|
||||
|
||||
enum iocStateEnum {
|
||||
iocVoid, iocBuilding, iocBuilt, iocRunning, iocPaused
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
epicsShareFunc enum iocStateEnum getIocState(void);
|
||||
epicsShareFunc int iocInit(void);
|
||||
epicsShareFunc int iocBuild(void);
|
||||
epicsShareFunc int iocBuildIsolated(void);
|
||||
|
||||
@@ -68,17 +68,6 @@ static void req_server (void *pParm)
|
||||
|
||||
IOC_sock = conf->tcp;
|
||||
|
||||
/* listen and accept new connections */
|
||||
if ( listen ( IOC_sock, 20 ) < 0 ) {
|
||||
char sockErrBuf[64];
|
||||
epicsSocketConvertErrnoToString (
|
||||
sockErrBuf, sizeof ( sockErrBuf ) );
|
||||
errlogPrintf ( "CAS: Listen error: %s\n",
|
||||
sockErrBuf );
|
||||
epicsSocketDestroy (IOC_sock);
|
||||
epicsThreadSuspendSelf ();
|
||||
}
|
||||
|
||||
epicsEventSignal(castcp_startStopEvent);
|
||||
|
||||
while (TRUE) {
|
||||
@@ -198,7 +187,7 @@ SOCKET* rsrv_grab_tcp(unsigned short *port)
|
||||
|
||||
epicsSocketEnableAddressReuseDuringTimeWaitState ( tcpsock );
|
||||
|
||||
if(bind(tcpsock, &scratch.sa, sizeof(scratch))==0) {
|
||||
if(bind(tcpsock, &scratch.sa, sizeof(scratch))==0 && listen(tcpsock, 20)==0) {
|
||||
if(scratch.ia.sin_port==0) {
|
||||
/* use first socket to pick a random port */
|
||||
osiSocklen_t alen = sizeof(ifaceAddr);
|
||||
|
||||
Reference in New Issue
Block a user