Most errors found with: codespell -L cach,thst,odly,aslo,parm,parms,inpu,ges,prset,pevent,ptd,pring,valu,noo,noe,ned,inout,ro,siz,froms,nd,fo,singl,sart,multy,tthe,allong,ment,inate,nodel,tring,alse,ture,thi,wille,numer Some more manually found (its -> it's) c++20: Do not use apostrophe (e.g. can't) in unquoted #error message
514 lines
14 KiB
Plaintext
514 lines
14 KiB
Plaintext
#*************************************************************************
|
|
# 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|dbCommonRecord/Scan Fields>.
|
|
|
|
=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.
|
|
|
|
=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|dbCommonRecord/Operator Display
|
|
Parameters> 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 HYST field controls hysteresis to prevent alarm chattering from an input
|
|
signal that is close to one of the limits and suffers from significant readout
|
|
noise.
|
|
|
|
The AFTC field sets the time constant on a low-pass filter that delays the
|
|
reporting of limit alarms until the signal has been within the alarm range for
|
|
that number of seconds (the default AFTC value of zero retains the previous
|
|
behavior).
|
|
|
|
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.
|
|
L<Alarm Fields|dbCommonRecord/Alarm Fields> lists the fields related to
|
|
alarms that are common to all record types.
|
|
|
|
=fields HIHI, HIGH, LOW, LOLO, HHSV, HSV, LSV, LLSV, HYST, AFTC
|
|
|
|
=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, every time the value changes, a monitor will be triggered; if they
|
|
have a value of -1, every time 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.
|
|
|
|
=fields ADEL, MDEL
|
|
|
|
=head3 Run-time 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) will monitors be 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
|
|
|
|
=head3 Simulation Mode Parameters
|
|
|
|
The following fields are used to operate the record in simulation mode.
|
|
|
|
If SIMM (fetched through SIML) is YES, the record is put in SIMS
|
|
severity and the value is fetched through SIOL (buffered in SVAL).
|
|
SSCN sets a different SCAN mechanism to use in simulation mode.
|
|
SDLY sets a delay (in sec) that is used for asynchronous simulation
|
|
processing.
|
|
|
|
See L<Input Simulation Fields|dbCommonInput/Input Simulation Fields>
|
|
for more information on simulation mode and its fields.
|
|
|
|
=fields SIML, SIMM, SIOL, SVAL, SIMS, SDLY, SSCN
|
|
|
|
=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. C<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"
|
|
%
|
|
%/* Declare Device Support Entry Table */
|
|
%struct longinRecord;
|
|
%typedef struct longindset {
|
|
% dset common; /*init_record returns: (-1,0)=>(failure,success)*/
|
|
% long (*read_longin)(struct longinRecord *prec); /*returns: (-1,0)=>(failure,success)*/
|
|
%} longindset;
|
|
%#define HAS_longindset
|
|
%
|
|
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) # get_units
|
|
}
|
|
field(HOPR,DBF_LONG) {
|
|
prompt("High Operating Range")
|
|
promptgroup("80 - Display")
|
|
interest(1)
|
|
prop(YES) # get_graphic_double, get_control_double
|
|
}
|
|
field(LOPR,DBF_LONG) {
|
|
prompt("Low Operating Range")
|
|
promptgroup("80 - Display")
|
|
interest(1)
|
|
prop(YES) # get_graphic_double, get_control_double
|
|
}
|
|
field(HIHI,DBF_LONG) {
|
|
prompt("Hihi Alarm Limit")
|
|
promptgroup("70 - Alarm")
|
|
pp(TRUE)
|
|
interest(1)
|
|
prop(YES) # get_alarm_double
|
|
}
|
|
field(LOLO,DBF_LONG) {
|
|
prompt("Lolo Alarm Limit")
|
|
promptgroup("70 - Alarm")
|
|
pp(TRUE)
|
|
interest(1)
|
|
prop(YES) # get_alarm_double
|
|
}
|
|
field(HIGH,DBF_LONG) {
|
|
prompt("High Alarm Limit")
|
|
promptgroup("70 - Alarm")
|
|
pp(TRUE)
|
|
interest(1)
|
|
prop(YES) # get_alarm_double
|
|
}
|
|
field(LOW,DBF_LONG) {
|
|
prompt("Low Alarm Limit")
|
|
promptgroup("70 - Alarm")
|
|
pp(TRUE)
|
|
interest(1)
|
|
prop(YES) # get_alarm_double
|
|
}
|
|
field(HHSV,DBF_MENU) {
|
|
prompt("Hihi Severity")
|
|
promptgroup("70 - Alarm")
|
|
pp(TRUE)
|
|
interest(1)
|
|
prop(YES) # get_alarm_double
|
|
menu(menuAlarmSevr)
|
|
}
|
|
field(LLSV,DBF_MENU) {
|
|
prompt("Lolo Severity")
|
|
promptgroup("70 - Alarm")
|
|
pp(TRUE)
|
|
interest(1)
|
|
prop(YES) # get_alarm_double
|
|
menu(menuAlarmSevr)
|
|
}
|
|
field(HSV,DBF_MENU) {
|
|
prompt("High Severity")
|
|
promptgroup("70 - Alarm")
|
|
pp(TRUE)
|
|
interest(1)
|
|
prop(YES) # get_alarm_double
|
|
menu(menuAlarmSevr)
|
|
}
|
|
field(LSV,DBF_MENU) {
|
|
prompt("Low Severity")
|
|
promptgroup("70 - Alarm")
|
|
pp(TRUE)
|
|
interest(1)
|
|
prop(YES) # get_alarm_double
|
|
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")
|
|
}
|
|
}
|