<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki-ext.aps.anl.gov/epics/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=MichaelDavidsaver</id>
	<title>EPICSWIKI - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-ext.aps.anl.gov/epics/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=MichaelDavidsaver"/>
	<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=Special:Contributions/MichaelDavidsaver"/>
	<updated>2026-06-04T10:09:28Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=RSRV_Configuration_Test_Plan&amp;diff=3781</id>
		<title>RSRV Configuration Test Plan</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=RSRV_Configuration_Test_Plan&amp;diff=3781"/>
		<updated>2016-02-16T20:44:46Z</updated>

		<summary type="html">&lt;p&gt;MichaelDavidsaver: fix usage of 'ip addr' to set the broadcast address&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Scope =&lt;br /&gt;
&lt;br /&gt;
This document describes some of the possible network configurations for RSRV and the expected results&lt;br /&gt;
with the RSRV interface binding changes https://code.launchpad.net/~epics-core/epics-base/rsrvbindiface.&lt;br /&gt;
&lt;br /&gt;
The expected results are given as the output various IOC shell commands (eg. epicsParamShow/casr/dbcar).&lt;br /&gt;
&lt;br /&gt;
Note that the output of ''dbcar &amp;quot;&amp;quot; 8'' is quite verbose.&lt;br /&gt;
Searching for the string ''Search Destination List'' in the output is suggested.&lt;br /&gt;
&lt;br /&gt;
= Preparation =&lt;br /&gt;
&lt;br /&gt;
This testing should be done on a computer with more than one physical/virtual network interface in additional to the loopback.&lt;br /&gt;
&lt;br /&gt;
On Linux additional tun/tap virtual interfaces can easily be added.&lt;br /&gt;
In the following examples the addresses ''10.5.1.1'' and ''10.5.2.1'' name two such interfacess.&lt;br /&gt;
Additional interfaces may be present.&lt;br /&gt;
&lt;br /&gt;
Using tunctl/ifconfig&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;tunctl -t tap0&lt;br /&gt;
ifconfig tap0 10.5.1.1/24 up&lt;br /&gt;
tunctl -t tap1&lt;br /&gt;
ifconfig tap1 10.5.2.1/24 up&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or using 'ip'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ip tuntap add dev tap0 mode tap&lt;br /&gt;
ip addr add 10.5.1.1/24 broadcast 10.5.1.255 dev tap0&lt;br /&gt;
ip tuntap add dev tap1 mode tap&lt;br /&gt;
ip addr add 10.5.2.1/24 broadcast 10.5.2.255 dev tap1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These can later be removed&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;tunctl -d tap0&lt;br /&gt;
tunctl -d tap1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ip tuntap del dev tap0 mode tap&lt;br /&gt;
ip tuntap del dev tap1 mode tap&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test IOC ==&lt;br /&gt;
&lt;br /&gt;
In addition to inspecting the output of the iocsh commands,&lt;br /&gt;
it is recommended to test a live softIoc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;cat &amp;lt;&amp;lt; EOF &amp;gt; test.db&lt;br /&gt;
record(calc, &amp;quot;test&amp;quot;) {&lt;br /&gt;
    field(SCAN, &amp;quot;1 second&amp;quot;)&lt;br /&gt;
    field(CALC, &amp;quot;VAL+1&amp;quot;)&lt;br /&gt;
    field(FLNK, &amp;quot;invalid&amp;quot;)&lt;br /&gt;
}&lt;br /&gt;
EOF&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each Test section includes an example invocation of ''softIoc'' and several ''caget''.&lt;br /&gt;
&lt;br /&gt;
= Tests =&lt;br /&gt;
&lt;br /&gt;
== Test #1 Defaults ==&lt;br /&gt;
&lt;br /&gt;
The default configuration is for RSRV is to bind to the wildcard interface (0.0.0.0),&lt;br /&gt;
and for libca to search on all local interfaces.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client gets should work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A warning &amp;quot;Identical process variable names on multiple servers&amp;quot; should be seen. &lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: YES&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== casr 1 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
CAS-TCP server on 0.0.0.0:5064 with&lt;br /&gt;
    CAS-UDP name server on 0.0.0.0:5064&lt;br /&gt;
Sending CAS-beacons to 4 addresses:&lt;br /&gt;
    10.5.1.255:5065&lt;br /&gt;
    10.5.2.255:5065&lt;br /&gt;
    127.255.255.255:5065&lt;br /&gt;
    &amp;lt;local address&amp;gt;:5065&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 4 items&lt;br /&gt;
UDP Search destination &amp;quot;10.5.1.255:5064&amp;quot;&lt;br /&gt;
UDP Search destination &amp;quot;10.5.2.255:5064&amp;quot;&lt;br /&gt;
... one for remaining local interfaces&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test #2 Client address list only ==&lt;br /&gt;
&lt;br /&gt;
Bind the server to the wildcard address.&lt;br /&gt;
Client searches only on a sub-set of interfaces.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client gets should work on either interface.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.2.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST: 10.5.1.255&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: NO&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== casr 1 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
CAS-TCP server on 0.0.0.0:5064 with&lt;br /&gt;
    CAS-UDP name server on 0.0.0.0:5064&lt;br /&gt;
Sending CAS-beacons to 4 addresses:&lt;br /&gt;
    10.5.1.255:5065&lt;br /&gt;
    10.5.2.255:5065&lt;br /&gt;
    127.255.255.255:5065&lt;br /&gt;
    &amp;lt;local address&amp;gt;:5065&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 1 items&lt;br /&gt;
UDP Search destination &amp;quot;10.5.1.255:5064&amp;quot;&lt;br /&gt;
... No more destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test #3 Client and Server on a single interface ==&lt;br /&gt;
&lt;br /&gt;
RSRV binds to a single interface, and libca only searches on this interface.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CAS_INTF_ADDR_LIST=10.5.1.1 \&lt;br /&gt;
EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client gets should work only when the 10.5.1.255 interface.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and fail on any other interface&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.2.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST: 10.5.1.255&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: NO&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST: 10.5.1.1&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== casr 1 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
CAS-TCP server on 10.5.1.1:5064 with&lt;br /&gt;
    CAS-UDP unicast name server on 10.5.1.1:5064&lt;br /&gt;
    CAS-UDP broadcast name server on 10.5.1.255:5064&lt;br /&gt;
Sending CAS-beacons to 1 address:&lt;br /&gt;
    10.5.1.255:5065&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that on Windows targets only one CAS-UDP name server address will be listed.&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 1 items&lt;br /&gt;
UDP Search destination &amp;quot;10.5.1.255:5064&amp;quot;&lt;br /&gt;
... No more destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test #4 Client and Server on a multiple interfaces ==&lt;br /&gt;
&lt;br /&gt;
RSRV binds to two interfaces, and libca only searches on these interfaces.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CAS_INTF_ADDR_LIST=&amp;quot;10.5.1.1 10.5.2.1&amp;quot; \&lt;br /&gt;
EPICS_CA_ADDR_LIST=&amp;quot;10.5.1.255 10.5.2.255&amp;quot; \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client gets should work only when the 10.5.1.255 and 10.5.2.255 interfaces, and fail on any others.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.2.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST: 10.5.1.255 10.5.2.255&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: NO&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST: 10.5.1.1 10.5.2.1&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== casr 1 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
CAS-TCP server on 10.5.1.1:5064 with&lt;br /&gt;
    CAS-UDP unicast name server on 10.5.1.1:5064&lt;br /&gt;
    CAS-UDP broadcast name server on 10.5.1.255:5064&lt;br /&gt;
CAS-TCP server on 10.5.2.1:5064 with&lt;br /&gt;
    CAS-UDP unicast name server on 10.5.2.1:5064&lt;br /&gt;
    CAS-UDP broadcast name server on 10.5.2.255:5064&lt;br /&gt;
Sending CAS-beacons to 2 addresses:&lt;br /&gt;
    10.5.1.255:5065&lt;br /&gt;
    10.5.2.255:5065&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that on Windows targets only one CAS-UDP name server address will be listed.&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 2 items&lt;br /&gt;
UDP Search destination &amp;quot;10.5.1.255:5064&amp;quot;&lt;br /&gt;
UDP Search destination &amp;quot;10.5.2.255:5064&amp;quot;&lt;br /&gt;
... No more destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test #5 Client and Server on different, single, interfaces ==&lt;br /&gt;
&lt;br /&gt;
RSRV binds to one interface, and libca only searches on another interface.&lt;br /&gt;
This is a &amp;quot;gateway&amp;quot;-like situation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CAS_INTF_ADDR_LIST=10.5.1.1 \&lt;br /&gt;
EPICS_CA_ADDR_LIST=10.5.2.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client gets should work only when the 10.5.1.255 interface.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and fail on any other interface&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.2.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, the IOC's CA client will only search on 10.5.2.255.&lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST: 10.5.2.255&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: NO&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST: 10.5.1.1&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== casr 1 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
CAS-TCP server on 10.5.1.1:5064 with&lt;br /&gt;
    CAS-UDP unicast name server on 10.5.1.1:5064&lt;br /&gt;
    CAS-UDP broadcast name server on 10.5.1.255:5064&lt;br /&gt;
Sending CAS-beacons to 1 address:&lt;br /&gt;
    10.5.1.255:5065&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that on Windows targets only one CAS-UDP name server address will be listed.&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 1 items&lt;br /&gt;
UDP Search destination &amp;quot;10.5.2.255:5064&amp;quot;&lt;br /&gt;
... No more destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test #6 IPv4 Multicast for search and beacons ==&lt;br /&gt;
&lt;br /&gt;
Server bound to wildcard.  Searches and beacons only with multicast.&lt;br /&gt;
In addtional a multicast address is specified for name search and beacon messages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CAS_INTF_ADDR_LIST=224.0.2.9 \&lt;br /&gt;
EPICS_CA_ADDR_LIST=224.0.2.9 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client searches using the specified multicast address will succeed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=224.0.2.9 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Searches using other multicast addresses will fail.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=224.0.2.10 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST: 224.0.2.9&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: NO&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST: 224.0.2.9&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== casr 1 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
CAS-TCP server on 0.0.0.0:5064 with&lt;br /&gt;
    CAS-UDP name server on 0.0.0.0:5064&lt;br /&gt;
Monitoring 1 multicast address:&lt;br /&gt;
    224.0.2.9:5064&lt;br /&gt;
Sending CAS-beacons to 4 addresses:&lt;br /&gt;
    10.5.1.255:5065&lt;br /&gt;
    10.5.2.255:5065&lt;br /&gt;
    127.255.255.255:5065&lt;br /&gt;
    &amp;lt;local address&amp;gt;:5065&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 1 items&lt;br /&gt;
... no destinations for local interfaces&lt;br /&gt;
UDP Search destination &amp;quot;224.0.2.9:5064&amp;quot;&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>MichaelDavidsaver</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=RSRV_Configuration_Test_Plan&amp;diff=3778</id>
		<title>RSRV Configuration Test Plan</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=RSRV_Configuration_Test_Plan&amp;diff=3778"/>
		<updated>2016-01-28T01:45:59Z</updated>

		<summary type="html">&lt;p&gt;MichaelDavidsaver: /* Test #6 IPv4 Multicast for search and beacons */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Scope =&lt;br /&gt;
&lt;br /&gt;
This document describes some of the possible network configurations for RSRV and the expected results&lt;br /&gt;
with the RSRV interface binding changes https://code.launchpad.net/~epics-core/epics-base/rsrvbindiface.&lt;br /&gt;
&lt;br /&gt;
The expected results are given as the output various IOC shell commands (eg. epicsParamShow/casr/dbcar).&lt;br /&gt;
&lt;br /&gt;
Note that the output of ''dbcar &amp;quot;&amp;quot; 8'' is quite verbose.&lt;br /&gt;
Searching for the string ''Search Destination List'' in the output is suggested.&lt;br /&gt;
&lt;br /&gt;
= Preparation =&lt;br /&gt;
&lt;br /&gt;
This testing should be done on a computer with more than one physical/virtual network interface in additional to the loopback.&lt;br /&gt;
&lt;br /&gt;
On Linux additional tun/tap virtual interfaces can easily be added.&lt;br /&gt;
In the following examples the addresses ''10.5.1.1'' and ''10.5.2.1'' name two such interfacess.&lt;br /&gt;
Additional interfaces may be present.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ip tuntap add dev tap0 mode tap&lt;br /&gt;
ip addr add 10.5.1.1/24 dev tap0&lt;br /&gt;
ip tuntap add dev tap1 mode tap&lt;br /&gt;
ip addr add 10.5.2.1/24 dev tap1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These can later be removed&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ip tuntap del dev tap0 mode tap&lt;br /&gt;
ip tuntap del dev tap1 mode tap&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test IOC ==&lt;br /&gt;
&lt;br /&gt;
In addition to inspecting the output of the iocsh commands,&lt;br /&gt;
it is recommended to test a live softIoc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;cat &amp;lt;&amp;lt; EOF &amp;gt; test.db&lt;br /&gt;
record(calc, &amp;quot;test&amp;quot;) {&lt;br /&gt;
    field(SCAN, &amp;quot;1 second&amp;quot;)&lt;br /&gt;
    field(CALC, &amp;quot;VAL+1&amp;quot;)&lt;br /&gt;
    field(FLNK, &amp;quot;invalid&amp;quot;)&lt;br /&gt;
}&lt;br /&gt;
EOF&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each Test section includes an example invocation of ''softIoc'' and several ''caget''.&lt;br /&gt;
&lt;br /&gt;
= Tests =&lt;br /&gt;
&lt;br /&gt;
== Test #1 Defaults ==&lt;br /&gt;
&lt;br /&gt;
The default configuration is for RSRV is to bind to the wildcard interface (0.0.0.0),&lt;br /&gt;
and for libca to search on all local interfaces.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client gets should work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A warning &amp;quot;Identical process variable names on multiple servers&amp;quot; should be seen. &lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: YES&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== casr 1 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
CAS-TCP server on 0.0.0.0:5064 with&lt;br /&gt;
    CAS-UDP name server on 0.0.0.0:5064&lt;br /&gt;
Sending CAS-beacons to 4 addresses:&lt;br /&gt;
    10.5.1.255:5065&lt;br /&gt;
    10.5.2.255:5065&lt;br /&gt;
    127.255.255.255:5065&lt;br /&gt;
    &amp;lt;local address&amp;gt;:5065&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 4 items&lt;br /&gt;
UDP Search destination &amp;quot;10.5.1.255:5064&amp;quot;&lt;br /&gt;
UDP Search destination &amp;quot;10.5.2.255:5064&amp;quot;&lt;br /&gt;
... one for remaining local interfaces&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test #2 Client address list only ==&lt;br /&gt;
&lt;br /&gt;
Bind the server to the wildcard address.&lt;br /&gt;
Client searches only on a sub-set of interfaces.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client gets should work on either interface.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.2.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST: 10.5.1.255&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: NO&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== casr 1 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
CAS-TCP server on 0.0.0.0:5064 with&lt;br /&gt;
    CAS-UDP name server on 0.0.0.0:5064&lt;br /&gt;
Sending CAS-beacons to 1 address:&lt;br /&gt;
    10.5.1.255:5065&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;b style=&amp;quot;color:red&amp;quot;&amp;gt;ANJ: Is this beacon list right?&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 1 items&lt;br /&gt;
UDP Search destination &amp;quot;10.5.1.255:5064&amp;quot;&lt;br /&gt;
... No more destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test #3 Client and Server on a single interface ==&lt;br /&gt;
&lt;br /&gt;
RSRV binds to a single interface, and libca only searches on this interface.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CAS_INTF_ADDR_LIST=10.5.1.1 \&lt;br /&gt;
EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client gets should work only when the 10.5.1.255 interface.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and fail on any other interface&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.2.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST: 10.5.1.255&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: NO&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST: 10.5.1.1&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== casr 1 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
CAS-TCP server on 10.5.1.1:5064 with&lt;br /&gt;
    CAS-UDP unicast name server on 10.5.1.1:5064&lt;br /&gt;
    CAS-UDP broadcast name server on 10.5.1.255:5064&lt;br /&gt;
Sending CAS-beacons to 1 address:&lt;br /&gt;
    10.5.1.255:5065&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that on Windows targets only one CAS-UDP name server address will be listed.&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 1 items&lt;br /&gt;
UDP Search destination &amp;quot;10.5.1.255:5064&amp;quot;&lt;br /&gt;
... No more destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test #4 Client and Server on a multiple interfaces ==&lt;br /&gt;
&lt;br /&gt;
RSRV binds to two interfaces, and libca only searches on these interfaces.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CAS_INTF_ADDR_LIST=&amp;quot;10.5.1.1 10.5.2.1&amp;quot; \&lt;br /&gt;
EPICS_CA_ADDR_LIST=&amp;quot;10.5.1.255 10.5.2.255&amp;quot; \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client gets should work only when the 10.5.1.255 and 10.5.2.255 interfaces, and fail on any others.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.2.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST: 10.5.1.255 10.5.2.255&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: NO&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST: 10.5.1.1 10.5.2.1&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== casr 1 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
CAS-TCP server on 10.5.1.1:5064 with&lt;br /&gt;
    CAS-UDP unicast name server on 10.5.1.1:5064&lt;br /&gt;
    CAS-UDP broadcast name server on 10.5.1.255:5064&lt;br /&gt;
CAS-TCP server on 10.5.2.1:5064 with&lt;br /&gt;
    CAS-UDP unicast name server on 10.5.2.1:5064&lt;br /&gt;
    CAS-UDP broadcast name server on 10.5.2.255:5064&lt;br /&gt;
Sending CAS-beacons to 2 addresses:&lt;br /&gt;
    10.5.1.255:5065&lt;br /&gt;
    10.5.2.255:5065&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that on Windows targets only one CAS-UDP name server address will be listed.&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 2 items&lt;br /&gt;
UDP Search destination &amp;quot;10.5.1.255:5064&amp;quot;&lt;br /&gt;
UDP Search destination &amp;quot;10.5.2.255:5064&amp;quot;&lt;br /&gt;
... No more destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test #5 Client and Server on different, single, interfaces ==&lt;br /&gt;
&lt;br /&gt;
RSRV binds to one interface, and libca only searches on another interface.&lt;br /&gt;
This is a &amp;quot;gateway&amp;quot;-like situation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CAS_INTF_ADDR_LIST=10.5.1.1 \&lt;br /&gt;
EPICS_CA_ADDR_LIST=10.5.2.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client gets should work only when the 10.5.1.255 interface.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and fail on any other interface&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.2.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, the IOC's CA client will only search on 10.5.2.255.&lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST: 10.5.2.255&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: NO&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST: 10.5.1.1&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== casr 1 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
CAS-TCP server on 10.5.1.1:5064 with&lt;br /&gt;
    CAS-UDP unicast name server on 10.5.1.1:5064&lt;br /&gt;
    CAS-UDP broadcast name server on 10.5.1.255:5064&lt;br /&gt;
Sending CAS-beacons to 1 address:&lt;br /&gt;
    10.5.1.255:5065&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that on Windows targets only one CAS-UDP name server address will be listed.&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 1 items&lt;br /&gt;
UDP Search destination &amp;quot;10.5.2.255:5064&amp;quot;&lt;br /&gt;
... No more destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test #6 IPv4 Multicast for search and beacons ==&lt;br /&gt;
&lt;br /&gt;
Server bound to wildcard.  Searches and beacons only with multicast.&lt;br /&gt;
In addtional a multicast address is specified for name search and beacon messages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CAS_INTF_ADDR_LIST=224.0.2.9 \&lt;br /&gt;
EPICS_CA_ADDR_LIST=224.0.2.9 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client searches using the specified multicast address will succeed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=224.0.2.9 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Searches using other multicast addresses will fail.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=224.0.2.10 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST: 224.0.2.9&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: NO&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST: 224.0.2.9&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== casr 1 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
CAS-TCP server on 0.0.0.0:5064 with&lt;br /&gt;
    CAS-UDP name server on 0.0.0.0:5064&lt;br /&gt;
Monitoring 1 multicast address:&lt;br /&gt;
    224.0.2.9:5064&lt;br /&gt;
Sending CAS-beacons to 1 address:&lt;br /&gt;
    224.0.2.9:5065&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 1 items&lt;br /&gt;
... no destinations for local interfaces&lt;br /&gt;
UDP Search destination &amp;quot;224.0.2.9:5064&amp;quot;&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>MichaelDavidsaver</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=RSRV_Configuration_Test_Plan&amp;diff=3777</id>
		<title>RSRV Configuration Test Plan</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=RSRV_Configuration_Test_Plan&amp;diff=3777"/>
		<updated>2016-01-28T01:45:44Z</updated>

		<summary type="html">&lt;p&gt;MichaelDavidsaver: /* Test #6 IPv4 Multicast for search and beacons */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Scope =&lt;br /&gt;
&lt;br /&gt;
This document describes some of the possible network configurations for RSRV and the expected results&lt;br /&gt;
with the RSRV interface binding changes https://code.launchpad.net/~epics-core/epics-base/rsrvbindiface.&lt;br /&gt;
&lt;br /&gt;
The expected results are given as the output various IOC shell commands (eg. epicsParamShow/casr/dbcar).&lt;br /&gt;
&lt;br /&gt;
Note that the output of ''dbcar &amp;quot;&amp;quot; 8'' is quite verbose.&lt;br /&gt;
Searching for the string ''Search Destination List'' in the output is suggested.&lt;br /&gt;
&lt;br /&gt;
= Preparation =&lt;br /&gt;
&lt;br /&gt;
This testing should be done on a computer with more than one physical/virtual network interface in additional to the loopback.&lt;br /&gt;
&lt;br /&gt;
On Linux additional tun/tap virtual interfaces can easily be added.&lt;br /&gt;
In the following examples the addresses ''10.5.1.1'' and ''10.5.2.1'' name two such interfacess.&lt;br /&gt;
Additional interfaces may be present.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ip tuntap add dev tap0 mode tap&lt;br /&gt;
ip addr add 10.5.1.1/24 dev tap0&lt;br /&gt;
ip tuntap add dev tap1 mode tap&lt;br /&gt;
ip addr add 10.5.2.1/24 dev tap1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These can later be removed&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ip tuntap del dev tap0 mode tap&lt;br /&gt;
ip tuntap del dev tap1 mode tap&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test IOC ==&lt;br /&gt;
&lt;br /&gt;
In addition to inspecting the output of the iocsh commands,&lt;br /&gt;
it is recommended to test a live softIoc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;cat &amp;lt;&amp;lt; EOF &amp;gt; test.db&lt;br /&gt;
record(calc, &amp;quot;test&amp;quot;) {&lt;br /&gt;
    field(SCAN, &amp;quot;1 second&amp;quot;)&lt;br /&gt;
    field(CALC, &amp;quot;VAL+1&amp;quot;)&lt;br /&gt;
    field(FLNK, &amp;quot;invalid&amp;quot;)&lt;br /&gt;
}&lt;br /&gt;
EOF&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each Test section includes an example invocation of ''softIoc'' and several ''caget''.&lt;br /&gt;
&lt;br /&gt;
= Tests =&lt;br /&gt;
&lt;br /&gt;
== Test #1 Defaults ==&lt;br /&gt;
&lt;br /&gt;
The default configuration is for RSRV is to bind to the wildcard interface (0.0.0.0),&lt;br /&gt;
and for libca to search on all local interfaces.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client gets should work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A warning &amp;quot;Identical process variable names on multiple servers&amp;quot; should be seen. &lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: YES&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== casr 1 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
CAS-TCP server on 0.0.0.0:5064 with&lt;br /&gt;
    CAS-UDP name server on 0.0.0.0:5064&lt;br /&gt;
Sending CAS-beacons to 4 addresses:&lt;br /&gt;
    10.5.1.255:5065&lt;br /&gt;
    10.5.2.255:5065&lt;br /&gt;
    127.255.255.255:5065&lt;br /&gt;
    &amp;lt;local address&amp;gt;:5065&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 4 items&lt;br /&gt;
UDP Search destination &amp;quot;10.5.1.255:5064&amp;quot;&lt;br /&gt;
UDP Search destination &amp;quot;10.5.2.255:5064&amp;quot;&lt;br /&gt;
... one for remaining local interfaces&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test #2 Client address list only ==&lt;br /&gt;
&lt;br /&gt;
Bind the server to the wildcard address.&lt;br /&gt;
Client searches only on a sub-set of interfaces.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client gets should work on either interface.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.2.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST: 10.5.1.255&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: NO&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== casr 1 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
CAS-TCP server on 0.0.0.0:5064 with&lt;br /&gt;
    CAS-UDP name server on 0.0.0.0:5064&lt;br /&gt;
Sending CAS-beacons to 1 address:&lt;br /&gt;
    10.5.1.255:5065&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;b style=&amp;quot;color:red&amp;quot;&amp;gt;ANJ: Is this beacon list right?&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 1 items&lt;br /&gt;
UDP Search destination &amp;quot;10.5.1.255:5064&amp;quot;&lt;br /&gt;
... No more destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test #3 Client and Server on a single interface ==&lt;br /&gt;
&lt;br /&gt;
RSRV binds to a single interface, and libca only searches on this interface.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CAS_INTF_ADDR_LIST=10.5.1.1 \&lt;br /&gt;
EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client gets should work only when the 10.5.1.255 interface.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and fail on any other interface&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.2.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST: 10.5.1.255&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: NO&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST: 10.5.1.1&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== casr 1 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
CAS-TCP server on 10.5.1.1:5064 with&lt;br /&gt;
    CAS-UDP unicast name server on 10.5.1.1:5064&lt;br /&gt;
    CAS-UDP broadcast name server on 10.5.1.255:5064&lt;br /&gt;
Sending CAS-beacons to 1 address:&lt;br /&gt;
    10.5.1.255:5065&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that on Windows targets only one CAS-UDP name server address will be listed.&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 1 items&lt;br /&gt;
UDP Search destination &amp;quot;10.5.1.255:5064&amp;quot;&lt;br /&gt;
... No more destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test #4 Client and Server on a multiple interfaces ==&lt;br /&gt;
&lt;br /&gt;
RSRV binds to two interfaces, and libca only searches on these interfaces.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CAS_INTF_ADDR_LIST=&amp;quot;10.5.1.1 10.5.2.1&amp;quot; \&lt;br /&gt;
EPICS_CA_ADDR_LIST=&amp;quot;10.5.1.255 10.5.2.255&amp;quot; \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client gets should work only when the 10.5.1.255 and 10.5.2.255 interfaces, and fail on any others.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.2.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST: 10.5.1.255 10.5.2.255&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: NO&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST: 10.5.1.1 10.5.2.1&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== casr 1 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
CAS-TCP server on 10.5.1.1:5064 with&lt;br /&gt;
    CAS-UDP unicast name server on 10.5.1.1:5064&lt;br /&gt;
    CAS-UDP broadcast name server on 10.5.1.255:5064&lt;br /&gt;
CAS-TCP server on 10.5.2.1:5064 with&lt;br /&gt;
    CAS-UDP unicast name server on 10.5.2.1:5064&lt;br /&gt;
    CAS-UDP broadcast name server on 10.5.2.255:5064&lt;br /&gt;
Sending CAS-beacons to 2 addresses:&lt;br /&gt;
    10.5.1.255:5065&lt;br /&gt;
    10.5.2.255:5065&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that on Windows targets only one CAS-UDP name server address will be listed.&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 2 items&lt;br /&gt;
UDP Search destination &amp;quot;10.5.1.255:5064&amp;quot;&lt;br /&gt;
UDP Search destination &amp;quot;10.5.2.255:5064&amp;quot;&lt;br /&gt;
... No more destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test #5 Client and Server on different, single, interfaces ==&lt;br /&gt;
&lt;br /&gt;
RSRV binds to one interface, and libca only searches on another interface.&lt;br /&gt;
This is a &amp;quot;gateway&amp;quot;-like situation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CAS_INTF_ADDR_LIST=10.5.1.1 \&lt;br /&gt;
EPICS_CA_ADDR_LIST=10.5.2.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client gets should work only when the 10.5.1.255 interface.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and fail on any other interface&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.2.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, the IOC's CA client will only search on 10.5.2.255.&lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST: 10.5.2.255&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: NO&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST: 10.5.1.1&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== casr 1 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
CAS-TCP server on 10.5.1.1:5064 with&lt;br /&gt;
    CAS-UDP unicast name server on 10.5.1.1:5064&lt;br /&gt;
    CAS-UDP broadcast name server on 10.5.1.255:5064&lt;br /&gt;
Sending CAS-beacons to 1 address:&lt;br /&gt;
    10.5.1.255:5065&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that on Windows targets only one CAS-UDP name server address will be listed.&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 1 items&lt;br /&gt;
UDP Search destination &amp;quot;10.5.2.255:5064&amp;quot;&lt;br /&gt;
... No more destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test #6 IPv4 Multicast for search and beacons ==&lt;br /&gt;
&lt;br /&gt;
Server bound to wildcard.  Searches and beacons only with multicast.&lt;br /&gt;
In addtional a multicast address is specified for name search and beacon messages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CAS_INTF_ADDR_LIST=224.0.2.9 \&lt;br /&gt;
EPICS_CA_ADDR_LIST=224.0.2.9 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client searches using the specified multicast address will succeed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=224.0.2.9 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Searches not using other multicast addresses will fail.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=224.0.2.10 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST: 224.0.2.9&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: NO&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST: 224.0.2.9&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== casr 1 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
CAS-TCP server on 0.0.0.0:5064 with&lt;br /&gt;
    CAS-UDP name server on 0.0.0.0:5064&lt;br /&gt;
Monitoring 1 multicast address:&lt;br /&gt;
    224.0.2.9:5064&lt;br /&gt;
Sending CAS-beacons to 1 address:&lt;br /&gt;
    224.0.2.9:5065&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 1 items&lt;br /&gt;
... no destinations for local interfaces&lt;br /&gt;
UDP Search destination &amp;quot;224.0.2.9:5064&amp;quot;&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>MichaelDavidsaver</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=RSRV_Configuration_Test_Plan&amp;diff=3775</id>
		<title>RSRV Configuration Test Plan</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=RSRV_Configuration_Test_Plan&amp;diff=3775"/>
		<updated>2016-01-23T21:01:26Z</updated>

		<summary type="html">&lt;p&gt;MichaelDavidsaver: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Scope =&lt;br /&gt;
&lt;br /&gt;
This document describes some of the possible network configurations for RSRV and the expected results&lt;br /&gt;
with the RSRV interface binding changes https://code.launchpad.net/~epics-core/epics-base/rsrvbindiface.&lt;br /&gt;
&lt;br /&gt;
The expected results are given as the output various IOC shell commands (eg. epicsParamShow/casr/dbcar).&lt;br /&gt;
&lt;br /&gt;
Note that the output of ''dbcar &amp;quot;&amp;quot; 8'' is quite verbose.&lt;br /&gt;
Searching for the string ''Search Destination List'' in the output is suggested.&lt;br /&gt;
&lt;br /&gt;
= Preparation =&lt;br /&gt;
&lt;br /&gt;
This testing should be done on a computer with more than one physical/virtual network interface in additional to the loopback.&lt;br /&gt;
&lt;br /&gt;
On Linux additional tun/tap virtual interfaces can easily be added.&lt;br /&gt;
In the following examples the addresses ''10.5.1.1'' and ''10.5.2.1'' name two such interfacess.&lt;br /&gt;
Additional interfaces may be present.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ip tuntap add dev tap0 mode tap&lt;br /&gt;
ip addr add 10.5.1.1/24 dev tap0&lt;br /&gt;
ip tuntap add dev tap1 mode tap&lt;br /&gt;
ip addr add 10.5.2.1/24 dev tap1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These can later be removed&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ip tuntap del dev tap0 mode tap&lt;br /&gt;
ip tuntap del dev tap1 mode tap&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test IOC ==&lt;br /&gt;
&lt;br /&gt;
In addition to inspecting the output of the iocsh commands,&lt;br /&gt;
it is recommended to test a live softIoc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;cat &amp;lt;&amp;lt; EOF &amp;gt; test.db&lt;br /&gt;
record(calc, &amp;quot;test&amp;quot;) {&lt;br /&gt;
    field(SCAN, &amp;quot;1 second&amp;quot;)&lt;br /&gt;
    field(INPA, &amp;quot;test&amp;quot;)&lt;br /&gt;
    field(CALC, &amp;quot;A+1&amp;quot;)&lt;br /&gt;
    field(FLNK, &amp;quot;invalid&amp;quot;)&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each Test section includes an example invokation of ''softIoc'' and several ''caget''.&lt;br /&gt;
&lt;br /&gt;
= Tests =&lt;br /&gt;
&lt;br /&gt;
== Test #1 Defaults ==&lt;br /&gt;
&lt;br /&gt;
The default configuration is for RSRV is to bind to the wildcard interface (0.0.0.0),&lt;br /&gt;
and for libca to search on all local interfaces.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client gets should work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A warning &amp;quot;Identical process variable names on multiple servers&amp;quot; should be seen. &lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: YES&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== casr 2 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Server interface 0.0.0.0:5064&lt;br /&gt;
 UDP receiver 1 0.0.0.0:5064&lt;br /&gt;
Beacon destination 10.5.1.255:5065&lt;br /&gt;
Beacon destination 10.5.2.255:5065&lt;br /&gt;
... one for remaining local interfaces&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 4 items&lt;br /&gt;
UDP Search destination &amp;quot;10.5.1.255:5064&amp;quot;&lt;br /&gt;
UDP Search destination &amp;quot;10.5.2.255:5064&amp;quot;&lt;br /&gt;
... one for remaining local interfaces&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test #2 Client address list only ==&lt;br /&gt;
&lt;br /&gt;
Bind the server to the wildcard address.&lt;br /&gt;
Client searches only on a sub-set of interfaces.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client gets should work on either interface.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.2.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST: 10.5.1.255&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: NO&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== casr 2 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Server interface 0.0.0.0:5064&lt;br /&gt;
 UDP receiver 1 0.0.0.0:5064&lt;br /&gt;
Beacon destination 10.5.1.255:5065&lt;br /&gt;
... no more destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 1 items&lt;br /&gt;
UDP Search destination &amp;quot;10.5.1.255:5064&amp;quot;&lt;br /&gt;
... No more destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test #3 Client and Server on a single interface ==&lt;br /&gt;
&lt;br /&gt;
RSRV binds to a single interface, and libca only searches on this interface.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CAS_INTF_ADDR_LIST=10.5.1.1 \&lt;br /&gt;
EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client gets should work only when the 10.5.1.255 interface.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and fail on any other interface&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.2.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST: 10.5.1.255&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: NO&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST: 10.5.1.1&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== casr 2 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Server interface 10.5.1.1:5064&lt;br /&gt;
 UDP receiver 1 10.5.1.1:5064&lt;br /&gt;
 UDP receiver 2 10.5.1.255:5064&lt;br /&gt;
Beacon destination 10.5.1.255:5065&lt;br /&gt;
... no other destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that &amp;quot;UDP receiver 2&amp;quot; will not be present for Windows targets as it is *nix specific.&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 1 items&lt;br /&gt;
UDP Search destination &amp;quot;10.5.1.255:5064&amp;quot;&lt;br /&gt;
... No more destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test #4 Client and Server on a multiple interfaces ==&lt;br /&gt;
&lt;br /&gt;
RSRV binds to two interfaces, and libca only searches on these interfaces.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CAS_INTF_ADDR_LIST=&amp;quot;10.5.1.1 10.5.2.1&amp;quot; \&lt;br /&gt;
EPICS_CA_ADDR_LIST=&amp;quot;10.5.1.255 10.5.2.255&amp;quot; \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client gets should work only when the 10.5.1.255 and 10.5.2.255 interfaces, and fail on any others.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.2.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST: 10.5.1.255 10.5.2.255&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: NO&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST: 10.5.1.1 10.5.2.1&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== casr 2 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Server interface 10.5.1.1:5064&lt;br /&gt;
 UDP receiver 1 10.5.1.1:5064&lt;br /&gt;
 UDP receiver 2 10.5.1.255:5064&lt;br /&gt;
Server interface 10.5.2.1:5064&lt;br /&gt;
 UDP receiver 1 10.5.2.1:5064&lt;br /&gt;
 UDP receiver 2 10.5.2.255:5064&lt;br /&gt;
Beacon destination 10.5.1.255:5065&lt;br /&gt;
Beacon destination 10.5.2.255:5065&lt;br /&gt;
... no other destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that &amp;quot;UDP receiver 2&amp;quot; will not be present for Windows targets as it is *nix specific.&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 2 items&lt;br /&gt;
UDP Search destination &amp;quot;10.5.1.255:5064&amp;quot;&lt;br /&gt;
UDP Search destination &amp;quot;10.5.2.255:5064&amp;quot;&lt;br /&gt;
... No more destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test #5 Client and Server on different, single, interfaces ==&lt;br /&gt;
&lt;br /&gt;
RSRV binds to one interface, and libca only searches on another interface.&lt;br /&gt;
This is a &amp;quot;gateway&amp;quot;-like situation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CAS_INTF_ADDR_LIST=10.5.1.1 \&lt;br /&gt;
EPICS_CA_ADDR_LIST=10.5.2.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client gets should work only when the 10.5.1.255 interface.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and fail on any other interface&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.2.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, the IOC's CA client will only search on 10.5.2.255.&lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST: 10.5.2.255&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: NO&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST: 10.5.1.1&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== casr 2 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Server interface 10.5.1.1:5064&lt;br /&gt;
 UDP receiver 1 10.5.1.1:5064&lt;br /&gt;
 UDP receiver 2 10.5.1.255:5064&lt;br /&gt;
Beacon destination 10.5.2.255:5065&lt;br /&gt;
... no other destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that &amp;quot;UDP receiver 2&amp;quot; will not be present for Windows targets as it is *nix specific.&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 1 items&lt;br /&gt;
UDP Search destination &amp;quot;10.5.2.255:5064&amp;quot;&lt;br /&gt;
... No more destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test #6 IPv4 Multicast for search and beacons ==&lt;br /&gt;
&lt;br /&gt;
Server bound to wildcard.  Searches and beacons only with multicast.&lt;br /&gt;
In addtional a multicast address is specified for name search and beacon messages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CAS_INTF_ADDR_LIST=224.0.2.9 \&lt;br /&gt;
EPICS_CA_ADDR_LIST=224.0.2.9 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client searches using multicast will succeed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=224.0.2.9 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Searches not using multicast will fail.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST: 224.0.2.9&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: NO&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST: 224.0.2.9&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== casr 2 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Server interface 0.0.0.0:5064&lt;br /&gt;
 UDP receiver 1 0.0.0.0:5064&lt;br /&gt;
MCast receiver 224.0.2.9:5064&lt;br /&gt;
Beacon destination 224.0.2.9:5065&lt;br /&gt;
... no destinations for local interfaces&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 1 items&lt;br /&gt;
... no destinations for local interfaces&lt;br /&gt;
UDP Search destination &amp;quot;224.0.2.9:5064&amp;quot;&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>MichaelDavidsaver</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=RSRV_Configuration_Test_Plan&amp;diff=3774</id>
		<title>RSRV Configuration Test Plan</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=RSRV_Configuration_Test_Plan&amp;diff=3774"/>
		<updated>2016-01-23T20:53:27Z</updated>

		<summary type="html">&lt;p&gt;MichaelDavidsaver: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Scope =&lt;br /&gt;
&lt;br /&gt;
This document describes some of the possible network configurations for RSRV and the expected results&lt;br /&gt;
with the RSRV interface binding changes https://code.launchpad.net/~epics-core/epics-base/rsrvbindiface.&lt;br /&gt;
&lt;br /&gt;
The expected results are given as the output various IOC shell commands (eg. epicsParamShow/casr/dbcar).&lt;br /&gt;
&lt;br /&gt;
Note that the output of ''dbcar &amp;quot;&amp;quot; 8'' is quite verbose.&lt;br /&gt;
Searching for the string ''Search Destination List'' in the output is suggested.&lt;br /&gt;
&lt;br /&gt;
= Preparation =&lt;br /&gt;
&lt;br /&gt;
This testing should be done on a computer with more than one physical/virtual network interface in additional to the loopback.&lt;br /&gt;
&lt;br /&gt;
On Linux additional tun/tap virtual interfaces can easily be added.&lt;br /&gt;
In the following examples the addresses ''10.5.1.1'' and ''10.5.2.1'' name two such interfacess.&lt;br /&gt;
Additional interfaces may be present.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ip tuntap add dev tap0 mode tap&lt;br /&gt;
ip addr add 10.5.1.1/24 dev tap0&lt;br /&gt;
ip tuntap add dev tap1 mode tap&lt;br /&gt;
ip addr add 10.5.2.1/24 dev tap1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These can later be removed&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ip tuntap del dev tap0 mode tap&lt;br /&gt;
ip tuntap del dev tap1 mode tap&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test IOC ==&lt;br /&gt;
&lt;br /&gt;
In addition to inspecting the output of the iocsh commands,&lt;br /&gt;
it is recommended to test a live softIoc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;cat &amp;lt;&amp;lt; EOF &amp;gt; test.db&lt;br /&gt;
record(calc, &amp;quot;test&amp;quot;) {&lt;br /&gt;
    field(SCAN, &amp;quot;1 second&amp;quot;)&lt;br /&gt;
    field(INPA, &amp;quot;test&amp;quot;)&lt;br /&gt;
    field(CALC, &amp;quot;A+1&amp;quot;)&lt;br /&gt;
    field(FLNK, &amp;quot;invalid&amp;quot;)&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each Test section includes an example invokation of ''softIoc'' and several ''caget''.&lt;br /&gt;
&lt;br /&gt;
= Tests =&lt;br /&gt;
&lt;br /&gt;
== Test #1 Defaults ==&lt;br /&gt;
&lt;br /&gt;
The default configuration is for RSRV is to bind to the wildcard interface (0.0.0.0),&lt;br /&gt;
and for libca to search on all local interfaces.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client gets should work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A warning &amp;quot;Identical process variable names on multiple servers&amp;quot; should be seen. &lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: YES&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== casr 2 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Server interface 0.0.0.0:5064&lt;br /&gt;
 UDP receiver 1 0.0.0.0:5064&lt;br /&gt;
Beacon destination 10.5.1.255:5065&lt;br /&gt;
Beacon destination 10.5.2.255:5065&lt;br /&gt;
... one for remaining local interfaces&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 4 items&lt;br /&gt;
UDP Search destination &amp;quot;10.5.1.255:5064&amp;quot;&lt;br /&gt;
UDP Search destination &amp;quot;10.5.2.255:5064&amp;quot;&lt;br /&gt;
... one for remaining local interfaces&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test #2 Client address list only ==&lt;br /&gt;
&lt;br /&gt;
Bind the server to the wildcard address.&lt;br /&gt;
Client searches only on a sub-set of interfaces.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client gets should work on either interface.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.2.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST: 10.5.1.255&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: NO&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== casr 2 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Server interface 0.0.0.0:5064&lt;br /&gt;
 UDP receiver 1 0.0.0.0:5064&lt;br /&gt;
Beacon destination 10.5.1.255:5065&lt;br /&gt;
... no more destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 1 items&lt;br /&gt;
UDP Search destination &amp;quot;10.5.1.255:5064&amp;quot;&lt;br /&gt;
... No more destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test #3 Client and Server on a single interface ==&lt;br /&gt;
&lt;br /&gt;
RSRV binds to a single interface, and libca only searches on this interface.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CAS_INTF_ADDR_LIST=10.5.1.1 \&lt;br /&gt;
EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client gets should work only when the 10.5.1.255 interface.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and fail on any other interface&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.2.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST: 10.5.1.255&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: NO&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST: 10.5.1.1&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== casr 2 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Server interface 10.5.1.1:5064&lt;br /&gt;
 UDP receiver 1 10.5.1.1:5064&lt;br /&gt;
 UDP receiver 2 10.5.1.255:5064&lt;br /&gt;
Beacon destination 10.5.1.255:5065&lt;br /&gt;
... no other destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that &amp;quot;UDP receiver 2&amp;quot; will not be present for Windows targets as it is *nix specific.&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 1 items&lt;br /&gt;
UDP Search destination &amp;quot;10.5.1.255:5064&amp;quot;&lt;br /&gt;
... No more destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test #4 Client and Server on a multiple interfaces ==&lt;br /&gt;
&lt;br /&gt;
RSRV binds to two interfaces, and libca only searches on these interfaces.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CAS_INTF_ADDR_LIST=&amp;quot;10.5.1.1 10.5.2.1&amp;quot; \&lt;br /&gt;
EPICS_CA_ADDR_LIST=&amp;quot;10.5.1.255 10.5.2.255&amp;quot; \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client gets should work only when the 10.5.1.255 and 10.5.2.255 interfaces, and fail on any others.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.2.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST: 10.5.1.255 10.5.2.255&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: NO&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST: 10.5.1.1 10.5.2.1&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== casr 2 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Server interface 10.5.1.1:5064&lt;br /&gt;
 UDP receiver 1 10.5.1.1:5064&lt;br /&gt;
 UDP receiver 2 10.5.1.255:5064&lt;br /&gt;
Server interface 10.5.2.1:5064&lt;br /&gt;
 UDP receiver 1 10.5.2.1:5064&lt;br /&gt;
 UDP receiver 2 10.5.2.255:5064&lt;br /&gt;
Beacon destination 10.5.1.255:5065&lt;br /&gt;
Beacon destination 10.5.2.255:5065&lt;br /&gt;
... no other destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that &amp;quot;UDP receiver 2&amp;quot; will not be present for Windows targets as it is *nix specific.&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 2 items&lt;br /&gt;
UDP Search destination &amp;quot;10.5.1.255:5064&amp;quot;&lt;br /&gt;
UDP Search destination &amp;quot;10.5.2.255:5064&amp;quot;&lt;br /&gt;
... No more destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test #5 Client and Server on different, single, interfaces ==&lt;br /&gt;
&lt;br /&gt;
RSRV binds to one interface, and libca only searches on another interface.&lt;br /&gt;
This is a &amp;quot;gateway&amp;quot;-like situation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CAS_INTF_ADDR_LIST=10.5.1.1 \&lt;br /&gt;
EPICS_CA_ADDR_LIST=10.5.2.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client gets should work only when the 10.5.1.255 interface.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and fail on any other interface&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.2.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, the IOC's CA client will only search on 10.5.2.255.&lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST: 10.5.2.255&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: NO&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST: 10.5.1.1&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== casr 2 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Server interface 10.5.1.1:5064&lt;br /&gt;
 UDP receiver 1 10.5.1.1:5064&lt;br /&gt;
 UDP receiver 2 10.5.1.255:5064&lt;br /&gt;
Beacon destination 10.5.2.255:5065&lt;br /&gt;
... no other destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that &amp;quot;UDP receiver 2&amp;quot; will not be present for Windows targets as it is *nix specific.&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 1 items&lt;br /&gt;
UDP Search destination &amp;quot;10.5.2.255:5064&amp;quot;&lt;br /&gt;
... No more destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test #6 IPv4 Multicast for search and beacons ==&lt;br /&gt;
&lt;br /&gt;
Server bound to wildcard, and client searches only with multicast.&lt;br /&gt;
In addtional a multicast address is specified for name search and beacon messages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CAS_INTF_ADDR_LIST=224.0.2.9 \&lt;br /&gt;
EPICS_CA_ADDR_LIST=224.0.2.9 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client searches using multicast will succeed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=224.0.2.9 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Searches not using multicast will fail.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST: 224.0.2.9&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: NO&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST: 224.0.2.9&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== casr 2 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Server interface 0.0.0.0:5064&lt;br /&gt;
 UDP receiver 1 0.0.0.0:5064&lt;br /&gt;
MCast destination 224.0.2.9:5064&lt;br /&gt;
Beacon destination 224.0.2.9:5065&lt;br /&gt;
... no destinations for local interfaces&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 1 items&lt;br /&gt;
... no destinations for local interfaces&lt;br /&gt;
UDP Search destination &amp;quot;224.0.2.9:5064&amp;quot;&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>MichaelDavidsaver</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=RSRV_Configuration_Test_Plan&amp;diff=3773</id>
		<title>RSRV Configuration Test Plan</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=RSRV_Configuration_Test_Plan&amp;diff=3773"/>
		<updated>2016-01-23T20:15:26Z</updated>

		<summary type="html">&lt;p&gt;MichaelDavidsaver: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Scope =&lt;br /&gt;
&lt;br /&gt;
This document describes some of the possible network configurations for RSRV and the expected results&lt;br /&gt;
with the RSRV interface binding changes https://code.launchpad.net/~epics-core/epics-base/rsrvbindiface.&lt;br /&gt;
&lt;br /&gt;
The expected results are given as the output various IOC shell commands (eg. epicsParamShow/casr/dbcar).&lt;br /&gt;
&lt;br /&gt;
Note that the output of ''dbcar &amp;quot;&amp;quot; 8'' is quite verbose.&lt;br /&gt;
Searching for the string ''Search Destination List'' in the output is suggested.&lt;br /&gt;
&lt;br /&gt;
= Preparation =&lt;br /&gt;
&lt;br /&gt;
This testing should be done on a computer with more than one physical/virtual network interface in additional to the loopback.&lt;br /&gt;
&lt;br /&gt;
On Linux additional tun/tap virtual interfaces can easily be added.&lt;br /&gt;
In the following examples the addresses ''10.5.1.1'' and ''10.5.2.1'' name two such interfacess.&lt;br /&gt;
Additional interfaces may be present.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ip tuntap add dev tap0 mode tap&lt;br /&gt;
ip addr add 10.5.1.1/24 dev tap0&lt;br /&gt;
ip tuntap add dev tap1 mode tap&lt;br /&gt;
ip addr add 10.5.2.1/24 dev tap1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These can later be removed&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ip tuntap del dev tap0 mode tap&lt;br /&gt;
ip tuntap del dev tap1 mode tap&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test IOC ==&lt;br /&gt;
&lt;br /&gt;
In addition to inspecting the output of the iocsh commands,&lt;br /&gt;
it is recommended to test a live softIoc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;cat &amp;lt;&amp;lt; EOF &amp;gt; test.db&lt;br /&gt;
record(calc, &amp;quot;test&amp;quot;) {&lt;br /&gt;
    field(SCAN, &amp;quot;1 second&amp;quot;)&lt;br /&gt;
    field(INPA, &amp;quot;test&amp;quot;)&lt;br /&gt;
    field(CALC, &amp;quot;A+1&amp;quot;)&lt;br /&gt;
    field(FLNK, &amp;quot;invalid&amp;quot;)&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each Test section includes an example invokation of ''softIoc'' and several ''caget''.&lt;br /&gt;
&lt;br /&gt;
= Tests =&lt;br /&gt;
&lt;br /&gt;
== Test #1 Defaults ==&lt;br /&gt;
&lt;br /&gt;
The default configuration is for RSRV is to bind to the wildcard interface (0.0.0.0),&lt;br /&gt;
and for libca to search on all local interfaces.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client gets should work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A warning &amp;quot;Identical process variable names on multiple servers&amp;quot; should be seen. &lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: YES&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== casr 2 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Server interface 0.0.0.0:5064&lt;br /&gt;
 UDP receiver 1 0.0.0.0:5064&lt;br /&gt;
Beacon destination 10.5.1.255:5065&lt;br /&gt;
Beacon destination 10.5.2.255:5065&lt;br /&gt;
... one for remaining local interfaces&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 4 items&lt;br /&gt;
UDP Search destination &amp;quot;10.5.1.255:5064&amp;quot;&lt;br /&gt;
UDP Search destination &amp;quot;10.5.2.255:5064&amp;quot;&lt;br /&gt;
... one for remaining local interfaces&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test #2 Client address list only ==&lt;br /&gt;
&lt;br /&gt;
Bind the server to the wildcard address.&lt;br /&gt;
Client searches only on a sub-set of interfaces.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client gets should work on either interface.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.2.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST: 10.5.1.255&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: NO&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== casr 2 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Server interface 0.0.0.0:5064&lt;br /&gt;
 UDP receiver 1 0.0.0.0:5064&lt;br /&gt;
Beacon destination 10.5.1.255:5065&lt;br /&gt;
Beacon destination 10.5.2.255:5065&lt;br /&gt;
... one for remaining local interfaces&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 1 items&lt;br /&gt;
UDP Search destination &amp;quot;10.5.1.255:5064&amp;quot;&lt;br /&gt;
... No more destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test #3 Client and Server on a single interface ==&lt;br /&gt;
&lt;br /&gt;
RSRV binds to a single interface, and libca only searches on this interface.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CAS_INTF_ADDR_LIST=10.5.1.1 \&lt;br /&gt;
EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client gets should work only when the 10.5.1.255 interface.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and fail on any other interface&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.2.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST: 10.5.1.255&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: NO&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST: 10.5.1.1&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== casr 2 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Server interface 10.5.1.1:5064&lt;br /&gt;
 UDP receiver 1 10.5.1.1:5064&lt;br /&gt;
 UDP receiver 2 10.5.1.255:5064&lt;br /&gt;
Beacon destination 10.5.1.255:5065&lt;br /&gt;
... no other destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that &amp;quot;UDP receiver 2&amp;quot; will not be present for Windows targets as it is *nix specific.&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 1 items&lt;br /&gt;
UDP Search destination &amp;quot;10.5.1.255:5064&amp;quot;&lt;br /&gt;
... No more destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test #4 Client and Server on a multiple interfaces ==&lt;br /&gt;
&lt;br /&gt;
RSRV binds to two interfaces, and libca only searches on these interfaces.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CAS_INTF_ADDR_LIST=&amp;quot;10.5.1.1 10.5.1.2&amp;quot; \&lt;br /&gt;
EPICS_CA_ADDR_LIST=&amp;quot;10.5.1.255 10.5.2.255&amp;quot; \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client gets should work only when the 10.5.1.255 and 10.5.2.255 interfaces, and fail on any others.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.2.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST: 10.5.1.255 10.5.2.255&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: NO&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST: 10.5.1.1 10.5.1.2&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== casr 2 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Server interface 10.5.1.1:5064&lt;br /&gt;
 UDP receiver 1 10.5.1.1:5064&lt;br /&gt;
 UDP receiver 2 10.5.1.255:5064&lt;br /&gt;
Server interface 10.5.2.1:5064&lt;br /&gt;
 UDP receiver 1 10.5.2.1:5064&lt;br /&gt;
 UDP receiver 2 10.5.2.255:5064&lt;br /&gt;
Beacon destination 10.5.1.255:5065&lt;br /&gt;
Beacon destination 10.5.2.255:5065&lt;br /&gt;
... no other destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that &amp;quot;UDP receiver 2&amp;quot; will not be present for Windows targets as it is *nix specific.&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 2 items&lt;br /&gt;
UDP Search destination &amp;quot;10.5.1.255:5064&amp;quot;&lt;br /&gt;
UDP Search destination &amp;quot;10.5.2.255:5064&amp;quot;&lt;br /&gt;
... No more destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test #5 Client and Server on different, single, interfaces ==&lt;br /&gt;
&lt;br /&gt;
RSRV binds to one interface, and libca only searches on another interface.&lt;br /&gt;
This is a &amp;quot;gateway&amp;quot;-like situation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CAS_INTF_ADDR_LIST=10.5.1.1 \&lt;br /&gt;
EPICS_CA_ADDR_LIST=10.5.2.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client gets should work only when the 10.5.1.255 interface.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.1.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and fail on any other interface&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=10.5.2.255 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, the IOC's CA client will only search on 10.5.2.255.&lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST: 10.5.2.255&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: NO&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST: 10.5.1.1&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== casr 2 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Server interface 10.5.1.1:5064&lt;br /&gt;
 UDP receiver 1 10.5.1.1:5064&lt;br /&gt;
 UDP receiver 2 10.5.1.255:5064&lt;br /&gt;
Beacon destination 10.5.1.255:5065&lt;br /&gt;
... no other destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that &amp;quot;UDP receiver 2&amp;quot; will not be present for Windows targets as it is *nix specific.&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 1 items&lt;br /&gt;
UDP Search destination &amp;quot;10.5.2.255:5064&amp;quot;&lt;br /&gt;
... No more destinations&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test #6 IPv4 Multicast for search and beacons ==&lt;br /&gt;
&lt;br /&gt;
Server bound to wildcard, and client searches only with multicast.&lt;br /&gt;
In addtional a multicast address is specified for name search and beacon messages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CAS_INTF_ADDR_LIST=224.0.2.9 \&lt;br /&gt;
EPICS_CA_ADDR_LIST=224.0.2.9 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/softIoc -d test.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Client searches using multicast will succeed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST=224.0.2.9 \&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST=NO \&lt;br /&gt;
./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Searches not using multicast will fail.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;./bin/linux-x86/caget test&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EPICS_CA_ADDR_LIST: 224.0.2.9&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: NO&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST: 224.0.2.9&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== casr 2 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Server interface 0.0.0.0:5064&lt;br /&gt;
 UDP receiver 1 0.0.0.0:5064&lt;br /&gt;
MCast destination 224.0.2.9:5064&lt;br /&gt;
Beacon destination 10.5.1.255:5065&lt;br /&gt;
Beacon destination 10.5.2.255:5065&lt;br /&gt;
... one for remaining local interfaces&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== dbcar &amp;quot;&amp;quot; 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Search Destination List with 1 items&lt;br /&gt;
... no destinations for local interfaces&lt;br /&gt;
UDP Search destination &amp;quot;224.0.2.9:5064&amp;quot;&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>MichaelDavidsaver</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=RSRV_Configuration_Test_Plan&amp;diff=3772</id>
		<title>RSRV Configuration Test Plan</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=RSRV_Configuration_Test_Plan&amp;diff=3772"/>
		<updated>2016-01-23T19:35:26Z</updated>

		<summary type="html">&lt;p&gt;MichaelDavidsaver: Created page with &amp;quot;= Scope =  This document describes some of the possible network configurations for RSRV and the expected results.  The expected results are given as the output various IOC shell ...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Scope =&lt;br /&gt;
&lt;br /&gt;
This document describes some of the possible network configurations for RSRV and the expected results.&lt;br /&gt;
&lt;br /&gt;
The expected results are given as the output various IOC shell commands (eg. epicsParamShow/casr/dbcar).&lt;br /&gt;
&lt;br /&gt;
= Preparation =&lt;br /&gt;
&lt;br /&gt;
This testing should be done on a computer with more than one physical/virtual network interface in additional to the loopback.&lt;br /&gt;
&lt;br /&gt;
On Linux additional tun/tap virtual interfaces can easily be added.&lt;br /&gt;
In the following examples the addresses ''10.5.1.1'' and ''10.5.2.1'' name two such interfacess.&lt;br /&gt;
Additional interfaces may be present.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip tuntap add dev tap0 mode tap&lt;br /&gt;
ip addr add 10.5.1.1/24 dev tap5&lt;br /&gt;
ip tuntap add dev tap1 mode tap&lt;br /&gt;
ip addr add 10.5.2.1/24 dev tap5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These can later be removed&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip tuntap del dev tap0 mode tap&lt;br /&gt;
ip tuntap del dev tap1 mode tap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Tests =&lt;br /&gt;
&lt;br /&gt;
== Test #1 Defaults ==&lt;br /&gt;
&lt;br /&gt;
The default configuration is for RSRV is to bind to the wildcard interface (0.0.0.0),&lt;br /&gt;
and for libca to search on all local interfaces.&lt;br /&gt;
&lt;br /&gt;
=== epicsParamShow ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EPICS_CA_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CA_AUTO_ADDR_LIST: YES&lt;br /&gt;
EPICS_CA_NAME_SERVERS is undefined&lt;br /&gt;
EPICS_CAS_INTF_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_AUTO_BEACON_ADDR_LIST is undefined&lt;br /&gt;
EPICS_CAS_BEACON_ADDR_LIST is undefined&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== casr 2 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Server interface 0.0.0.0:5064&lt;br /&gt;
 UDP receiver 1 0.0.0.0:5064&lt;br /&gt;
Beacon destination 10.5.1.255:5065&lt;br /&gt;
Beacon destination 10.5.2.255:5065&lt;br /&gt;
... one for remaining local interfaces&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== dbcar '' 8 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
Search Destination List with 4 items&lt;br /&gt;
UDP Search destination &amp;quot;10.5.1.255:5064&amp;quot;&lt;br /&gt;
UDP Search destination &amp;quot;10.5.2.255:5064&amp;quot;&lt;br /&gt;
... one for remaining local interfaces&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>MichaelDavidsaver</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=Core_Developer_Pages&amp;diff=3771</id>
		<title>Core Developer Pages</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=Core_Developer_Pages&amp;diff=3771"/>
		<updated>2016-01-23T19:20:02Z</updated>

		<summary type="html">&lt;p&gt;MichaelDavidsaver: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Developing EPICS Base ==&lt;br /&gt;
&lt;br /&gt;
* [[How to check out EPICS Base with Bazaar]]&lt;br /&gt;
* [[Style Guide for Bazaar commit messages]]&lt;br /&gt;
&lt;br /&gt;
== Development Plans ==&lt;br /&gt;
&lt;br /&gt;
* [[Future Development Ideas]]&lt;br /&gt;
* [[Merging Branches into 3.15]]&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
* [[RSRV Configuration Test Plan]]&lt;/div&gt;</summary>
		<author><name>MichaelDavidsaver</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=How_to_find_which_IOC_provides_a_PV&amp;diff=3763</id>
		<title>How to find which IOC provides a PV</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=How_to_find_which_IOC_provides_a_PV&amp;diff=3763"/>
		<updated>2015-02-10T17:25:17Z</updated>

		<summary type="html">&lt;p&gt;MichaelDavidsaver: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= How to find where an IOC is running which provides a PV name. =&lt;br /&gt;
&lt;br /&gt;
This process is for IOCs running on Linux servers.&lt;br /&gt;
&lt;br /&gt;
== Step 1: Find Host and TCP port ==&lt;br /&gt;
&lt;br /&gt;
The ''cainfo'' command will tell you which host is serving a particular PV, and which TCP port number on that host is used.&lt;br /&gt;
&lt;br /&gt;
     $ cainfo LN-TS{EVR:1A-SFP}Pwr:RX-I&lt;br /&gt;
     LN-TS{EVR:1A-SFP}Pwr:RX-I&lt;br /&gt;
     State:            connected&lt;br /&gt;
     Host:             10.0.152.111:5064&lt;br /&gt;
     Access:           read, write&lt;br /&gt;
     Native data type: DBF_DOUBLE&lt;br /&gt;
     Request type:     DBR_DOUBLE&lt;br /&gt;
     Element count:    1&lt;br /&gt;
&lt;br /&gt;
Here we see that the PV &amp;quot;LN-TS{EVR:1A-SFP}Pwr:RX-I&amp;quot; is served from port number 5064 of 10.0.152.111.&lt;br /&gt;
&lt;br /&gt;
     $ cainfo LN-RF{AMP:1}Amp-Sts&lt;br /&gt;
     LN-RF{AMP:1}Amp-Sts&lt;br /&gt;
     State:            connected&lt;br /&gt;
     Host:             linacioc01.cs.nsls2.local:36349&lt;br /&gt;
     Access:           read, write&lt;br /&gt;
     Native data type: DBF_ENUM&lt;br /&gt;
     Request type:     DBR_ENUM&lt;br /&gt;
     Element count:    1&lt;br /&gt;
&lt;br /&gt;
Here is another example where the hostname is shown instead of an IP address.  Also this server has more than one IOC, and the one in question is using port 36349.&lt;br /&gt;
&lt;br /&gt;
== Step 2: Find which process is using a TCP port (Linux only) ==&lt;br /&gt;
&lt;br /&gt;
Super-user (root) permission is required to find which Linux process is bound to a particular TCP port.&lt;br /&gt;
&lt;br /&gt;
To continue the example from above.  On the server linacioc01.cs.nsls2.local we run:&lt;br /&gt;
&lt;br /&gt;
    $ sudo netstat -tlpn | grep 36349&lt;br /&gt;
    tcp        0      0 0.0.0.0:36349           0.0.0.0:*               LISTEN      4627/s7ioc&lt;br /&gt;
&lt;br /&gt;
This tells us that TCP port 36349 is bound by process ID (PID) 4627, which has the process name of 's7ioc'.&lt;br /&gt;
&lt;br /&gt;
== Step 3: Find information about a process (Linux only) ==&lt;br /&gt;
&lt;br /&gt;
The ''ps'' command can give some information, including the command used to start the process.  This often contains enough information to identify where the IOC's files can be found.&lt;br /&gt;
&lt;br /&gt;
    $ ps aux|grep 4627&lt;br /&gt;
    softioc   4627  1.5  0.0  93748  6616 pts/23   Ssl+ Jan07 744:18 ../../bin/linux-x86/s7ioc /epics/iocs/RF-CONTROL/iocBoot/iocrf-control/st.cmd&lt;br /&gt;
&lt;br /&gt;
There are several pieces of information available under /proc which are useful.&lt;br /&gt;
The entry '/proc/&amp;lt;pid&amp;gt;/cwd' is a symbolic link to the current working directory of the process.&lt;br /&gt;
There is also '/proc/&amp;lt;pid&amp;gt;/exe' which links to the executable.&lt;br /&gt;
&lt;br /&gt;
    $ sudo ls -l /proc/4627/cwd&lt;br /&gt;
    lrwxrwxrwx 1 softioc softioc 0 Feb 10 11:49 /proc/4627/cwd -&amp;gt; /epics/iocs/RF-CONTROL&lt;br /&gt;
    $ sudo ls -l /proc/4627/exe&lt;br /&gt;
    lrwxrwxrwx 1 softioc softioc 0 Jan  7 09:58 /proc/4627/exe -&amp;gt; /epics/iocs/RF-CONTROL/bin/linux-x86/s7ioc&lt;br /&gt;
&lt;br /&gt;
== Additional: Finding the procServ/screen running an IOC (Linux only) ==&lt;br /&gt;
&lt;br /&gt;
The ''ps'' command can also tell us the PID of the parent of the IOC process.&lt;br /&gt;
The techniques of step 3 can also be applied to the parent.&lt;br /&gt;
&lt;br /&gt;
    $ ps -eo pid,ppid,user,cmd|grep 4627&lt;br /&gt;
     4627  4566 softioc  ../../bin/linux-x86/s7ioc /epics/iocs/RF-CONTROL/iocBoot/iocrf-control/st.cmd&lt;br /&gt;
&lt;br /&gt;
The parent PID in the second column is 4566.&lt;br /&gt;
&lt;br /&gt;
     $ ps aux|grep 4566&lt;br /&gt;
     softioc   4566  0.0  0.0   3452   592 ?        Ss   Jan07   2:18 /usr/bin/procServ -q -c /epics/iocs/RF-CONTROL/iocBoot/iocrf-control -i ^D^C^] -p /var/run/softioc-RF-CONTROL.pid -n RF-CONTROL --restrict --logfile=/var/log/softioc-RF-CONTROL.log 4057 /epics/iocs/RF-CONTROL/iocBoot/iocrf-control/st.cmd&lt;br /&gt;
&lt;br /&gt;
And to complete the circle, and get access to the IOC console, we find which TCP port this procServ instance is bound to.&lt;br /&gt;
&lt;br /&gt;
    $ sudo netstat -tlpn|grep 4566&lt;br /&gt;
    tcp        0      0 127.0.0.1:4057          0.0.0.0:*               LISTEN      4566/procServ&lt;br /&gt;
    $ telnet localhost 4057&lt;br /&gt;
    epics&amp;gt; dbpr LN-RF{AMP:1}Amp-Sts&lt;br /&gt;
    ASG:                DESC: Ampl.500 MHz E-Source             DISA: 0             &lt;br /&gt;
    DISP: 0             DISV: 1             NAME: LN-RF{AMP:1}Amp-Sts               &lt;br /&gt;
    RVAL: 16            SEVR: NO_ALARM      STAT: NO_ALARM      SVAL: 0             &lt;br /&gt;
    TPRO: 0             VAL: 1&lt;/div&gt;</summary>
		<author><name>MichaelDavidsaver</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=How_to_find_which_IOC_provides_a_PV&amp;diff=3762</id>
		<title>How to find which IOC provides a PV</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=How_to_find_which_IOC_provides_a_PV&amp;diff=3762"/>
		<updated>2015-02-10T17:11:11Z</updated>

		<summary type="html">&lt;p&gt;MichaelDavidsaver: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= How to find where an IOC is running which provides a PV name. =&lt;br /&gt;
&lt;br /&gt;
This process is for IOCs running on Linux servers.&lt;br /&gt;
&lt;br /&gt;
== Step 1: Find Host and TCP port ==&lt;br /&gt;
&lt;br /&gt;
The ''cainfo'' command will tell you which host is serving a particular PV, and which TCP port number on that host is used.&lt;br /&gt;
&lt;br /&gt;
     $ cainfo LN-TS{EVR:1A-SFP}Pwr:RX-I&lt;br /&gt;
     LN-TS{EVR:1A-SFP}Pwr:RX-I&lt;br /&gt;
     State:            connected&lt;br /&gt;
     Host:             10.0.152.111:5064&lt;br /&gt;
     Access:           read, write&lt;br /&gt;
     Native data type: DBF_DOUBLE&lt;br /&gt;
     Request type:     DBR_DOUBLE&lt;br /&gt;
     Element count:    1&lt;br /&gt;
&lt;br /&gt;
Here we see that the PV &amp;quot;LN-TS{EVR:1A-SFP}Pwr:RX-I&amp;quot; is served from port number 5064 of 10.0.152.111.&lt;br /&gt;
&lt;br /&gt;
     $ cainfo LN-RF{Amp:1]On-Set&lt;br /&gt;
     LN-RF{Amp:1]On-Set&lt;br /&gt;
     State:            connected&lt;br /&gt;
     Host:             linacioc01.cs.nsls2.local:36349&lt;br /&gt;
     Access:           read, write&lt;br /&gt;
     Native data type: DBF_ENUM&lt;br /&gt;
     Request type:     DBR_ENUM&lt;br /&gt;
     Element count:    1&lt;br /&gt;
&lt;br /&gt;
Here is another example where the hostname is shown instead of an IP address.  Also this server has more than one IOC, and the one in question is using port 36349.&lt;br /&gt;
&lt;br /&gt;
== Step 2: Find which process is using a TCP port (Linux only) ==&lt;br /&gt;
&lt;br /&gt;
Super-user (root) permission is required to find which Linux process is bound to a particular TCP port.&lt;br /&gt;
&lt;br /&gt;
To continue the example from above.  On the server linacioc01.cs.nsls2.local we run:&lt;br /&gt;
&lt;br /&gt;
    $ sudo netstat -tlpn | grep 36349&lt;br /&gt;
    tcp        0      0 0.0.0.0:36349           0.0.0.0:*               LISTEN      4627/s7ioc&lt;br /&gt;
&lt;br /&gt;
This tells us that TCP port 36349 is bound by process ID (PID) 4627, which has the process name of 's7ioc'.&lt;br /&gt;
&lt;br /&gt;
== Step 3: Find information about a process (Linux only) ==&lt;br /&gt;
&lt;br /&gt;
The ''ps'' command can give some information, including the command used to start the process.  This often contains enough information to identify where the IOC's files can be found.&lt;br /&gt;
&lt;br /&gt;
    $ ps aux|grep 4627&lt;br /&gt;
    softioc   4627  1.5  0.0  93748  6616 pts/23   Ssl+ Jan07 744:18 ../../bin/linux-x86/s7ioc /epics/iocs/RF-CONTROL/iocBoot/iocrf-control/st.cmd&lt;br /&gt;
&lt;br /&gt;
There are several pieces of information available under /proc which are useful.&lt;br /&gt;
The entry '/proc/&amp;lt;pid&amp;gt;/cwd' is a symbolic link to the current working directory of the process.&lt;br /&gt;
There is also '/proc/&amp;lt;pid&amp;gt;/exe' which links to the executable.&lt;br /&gt;
&lt;br /&gt;
    $ sudo ls -l /proc/4627/cwd&lt;br /&gt;
    lrwxrwxrwx 1 softioc softioc 0 Feb 10 11:49 /proc/4627/cwd -&amp;gt; /epics/iocs/RF-CONTROL&lt;br /&gt;
    $ sudo ls -l /proc/4627/exe&lt;br /&gt;
    lrwxrwxrwx 1 softioc softioc 0 Jan  7 09:58 /proc/4627/exe -&amp;gt; /epics/iocs/RF-CONTROL/bin/linux-x86/s7ioc&lt;br /&gt;
&lt;br /&gt;
== Additional: Finding the procServ/screen running an IOC (Linux only) ==&lt;br /&gt;
&lt;br /&gt;
The ''ps'' command can also tell us the PID of the parent of the IOC process.&lt;br /&gt;
The techniques of step 3 can also be applied to the parent.&lt;br /&gt;
&lt;br /&gt;
    $ ps -eo pid,ppid,user,cmd|grep 4627&lt;br /&gt;
     4627  4566 softioc  ../../bin/linux-x86/s7ioc /epics/iocs/RF-CONTROL/iocBoot/iocrf-control/st.cmd&lt;br /&gt;
&lt;br /&gt;
The parent PID in the second column is 4566.&lt;br /&gt;
&lt;br /&gt;
     $ ps aux|grep 4566&lt;br /&gt;
     softioc   4566  0.0  0.0   3452   592 ?        Ss   Jan07   2:18 /usr/bin/procServ -q -c /epics/iocs/RF-CONTROL/iocBoot/iocrf-control -i ^D^C^] -p /var/run/softioc-RF-CONTROL.pid -n RF-CONTROL --restrict --logfile=/var/log/softioc-RF-CONTROL.log 4057 /epics/iocs/RF-CONTROL/iocBoot/iocrf-control/st.cmd&lt;/div&gt;</summary>
		<author><name>MichaelDavidsaver</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=How_to_find_which_IOC_provides_a_PV&amp;diff=3761</id>
		<title>How to find which IOC provides a PV</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=How_to_find_which_IOC_provides_a_PV&amp;diff=3761"/>
		<updated>2015-02-10T17:01:30Z</updated>

		<summary type="html">&lt;p&gt;MichaelDavidsaver: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;How to find where an IOC is running which provides a PV name.  This process is for IOCs running on Linux servers.&lt;br /&gt;
&lt;br /&gt;
== Step 1: Find Host and TCP port ==&lt;br /&gt;
&lt;br /&gt;
The ''cainfo'' command will tell you which host is serving a particular PV, and which TCP port number on that host is used.&lt;br /&gt;
&lt;br /&gt;
     $ cainfo LN-TS{EVR:1A-SFP}Pwr:RX-I&lt;br /&gt;
     LN-TS{EVR:1A-SFP}Pwr:RX-I&lt;br /&gt;
     State:            connected&lt;br /&gt;
     Host:             10.0.152.111:5064&lt;br /&gt;
     Access:           read, write&lt;br /&gt;
     Native data type: DBF_DOUBLE&lt;br /&gt;
     Request type:     DBR_DOUBLE&lt;br /&gt;
     Element count:    1&lt;br /&gt;
&lt;br /&gt;
Here we see that the PV &amp;quot;LN-TS{EVR:1A-SFP}Pwr:RX-I&amp;quot; is served from port number 5064 of 10.0.152.111.&lt;br /&gt;
&lt;br /&gt;
     $ cainfo LN-RF{Amp:1]On-Set&lt;br /&gt;
     LN-RF{Amp:1]On-Set&lt;br /&gt;
     State:            connected&lt;br /&gt;
     Host:             linacioc01.cs.nsls2.local:36349&lt;br /&gt;
     Access:           read, write&lt;br /&gt;
     Native data type: DBF_ENUM&lt;br /&gt;
     Request type:     DBR_ENUM&lt;br /&gt;
     Element count:    1&lt;br /&gt;
&lt;br /&gt;
Here is another example where the hostname is shown instead of an IP address.  Also this server has more than one IOC, and the one in question is using port 36349.&lt;br /&gt;
&lt;br /&gt;
== Step 2: Find which process is using a TCP port (Linux only) ==&lt;br /&gt;
&lt;br /&gt;
Super-user (root) permission is required to find which Linux process is bound to a particular TCP port.&lt;br /&gt;
&lt;br /&gt;
To continue the example from above.  On the server linacioc01.cs.nsls2.local we run:&lt;br /&gt;
&lt;br /&gt;
    $ sudo netstat -tlpn | grep 36349&lt;br /&gt;
    tcp        0      0 0.0.0.0:36349           0.0.0.0:*               LISTEN      4627/s7ioc&lt;br /&gt;
&lt;br /&gt;
This tells us that TCP port 36349 is bound by process ID (PID) 4627, which has the process name of 's7ioc'.&lt;br /&gt;
&lt;br /&gt;
== Step 3: Find information about a process (Linux only) ==&lt;br /&gt;
&lt;br /&gt;
The ''ps'' command can give some information, including the command used to start the process.  This often contains enough information to identify where the IOC's files can be found.&lt;br /&gt;
&lt;br /&gt;
    $ ps aux|grep 4627&lt;br /&gt;
    softioc   4627  1.5  0.0  93748  6616 pts/23   Ssl+ Jan07 744:18 ../../bin/linux-x86/s7ioc /epics/iocs/RF-CONTROL/iocBoot/iocrf-control/st.cmd&lt;br /&gt;
&lt;br /&gt;
There are several pieces of information available under /proc which are useful.&lt;br /&gt;
The entry '/proc/&amp;lt;pid&amp;gt;/cwd' is a symbolic link to the current working directory of the process.&lt;br /&gt;
There is also '/proc/&amp;lt;pid&amp;gt;/exe' which links to the executable.&lt;br /&gt;
&lt;br /&gt;
    $ sudo ls -l /proc/4627/cwd&lt;br /&gt;
    lrwxrwxrwx 1 softioc softioc 0 Feb 10 11:49 /proc/4627/cwd -&amp;gt; /epics/iocs/RF-CONTROL&lt;br /&gt;
    $ sudo ls -l /proc/4627/exe&lt;br /&gt;
    lrwxrwxrwx 1 softioc softioc 0 Jan  7 09:58 /proc/4627/exe -&amp;gt; /epics/iocs/RF-CONTROL/bin/linux-x86/s7ioc&lt;/div&gt;</summary>
		<author><name>MichaelDavidsaver</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=How_to_find_which_IOC_provides_a_PV&amp;diff=3760</id>
		<title>How to find which IOC provides a PV</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=How_to_find_which_IOC_provides_a_PV&amp;diff=3760"/>
		<updated>2015-02-10T16:54:04Z</updated>

		<summary type="html">&lt;p&gt;MichaelDavidsaver: Created page with &amp;quot;How to find where an IOC is running which provides a PV name.  This process is for IOCs running on Linux servers.  == Step 1: Find Host and TCP port ==  The ''cainfo'' command wi...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;How to find where an IOC is running which provides a PV name.  This process is for IOCs running on Linux servers.&lt;br /&gt;
&lt;br /&gt;
== Step 1: Find Host and TCP port ==&lt;br /&gt;
&lt;br /&gt;
The ''cainfo'' command will tell you which host is serving a particular PV, and which TCP port number on that host is used.&lt;br /&gt;
&lt;br /&gt;
     $ cainfo LN-TS{EVR:1A-SFP}Pwr:RX-I&lt;br /&gt;
     LN-TS{EVR:1A-SFP}Pwr:RX-I&lt;br /&gt;
     State:            connected&lt;br /&gt;
     Host:             10.0.152.111:5064&lt;br /&gt;
     Access:           read, write&lt;br /&gt;
     Native data type: DBF_DOUBLE&lt;br /&gt;
     Request type:     DBR_DOUBLE&lt;br /&gt;
     Element count:    1&lt;br /&gt;
&lt;br /&gt;
Here we see that the PV &amp;quot;LN-TS{EVR:1A-SFP}Pwr:RX-I&amp;quot; is served from port number 5064 of 10.0.152.111.&lt;br /&gt;
&lt;br /&gt;
     $ cainfo LN-RF{Amp:1]On-Set&lt;br /&gt;
     LN-RF{Amp:1]On-Set&lt;br /&gt;
     State:            connected&lt;br /&gt;
     Host:             linacioc01.cs.nsls2.local:36349&lt;br /&gt;
     Access:           read, write&lt;br /&gt;
     Native data type: DBF_ENUM&lt;br /&gt;
     Request type:     DBR_ENUM&lt;br /&gt;
     Element count:    1&lt;br /&gt;
&lt;br /&gt;
Here is another example where the hostname is shown instead of an IP address.  Also this server has more than one IOC, and the one in question is using port 36349.&lt;br /&gt;
&lt;br /&gt;
== Step 2: Find which process is using a TCP port (Linux only) ==&lt;br /&gt;
&lt;br /&gt;
Super-user (root) permission is required to find which Linux process is bound to a particular TCP port.&lt;br /&gt;
&lt;br /&gt;
To continue the example from above.  On the server linacioc01.cs.nsls2.local we run:&lt;br /&gt;
&lt;br /&gt;
    $ sudo netstat -tlpn | grep 36349&lt;br /&gt;
    tcp        0      0 0.0.0.0:36349           0.0.0.0:*               LISTEN      4627/s7ioc&lt;br /&gt;
&lt;br /&gt;
This tells us that TCP port 36349 is bound by process ID (PID) 4627, which has the process name of 's7ioc'.&lt;br /&gt;
&lt;br /&gt;
== Step 3: Find information about a process (Linux only) ==&lt;br /&gt;
&lt;br /&gt;
The ''ps'' command can give some information, including the command used to start the process.  This often contains enough information to identify where the IOC's files can be found.&lt;br /&gt;
&lt;br /&gt;
    $ ps aux|grep 4627&lt;br /&gt;
    softioc   4627  1.5  0.0  93748  6616 pts/23   Ssl+ Jan07 744:18 ../../bin/linux-x86/s7ioc /epics/iocs/RF-CONTROL/iocBoot/iocrf-control/st.cmd&lt;br /&gt;
&lt;br /&gt;
There are several pieces of information available under /proc which are useful.&lt;br /&gt;
The entry '/proc/&amp;lt;pid&amp;gt;/cwd' is a symbolic link to the current working directory of the process.&lt;br /&gt;
There is also '/proc/&amp;lt;pid&amp;gt;/exe' which links to the executable.&lt;br /&gt;
&lt;br /&gt;
    $ sudo ls -l /proc/4627/cwd&lt;br /&gt;
    lrwxrwxrwx 1 softioc softioc 0 Feb 10 11:49 /proc/4627/cwd -&amp;gt; /direct/linacioc01_iocs/RF-CONTROL&lt;br /&gt;
    $ sudo ls -l /proc/4627/exe&lt;br /&gt;
    lrwxrwxrwx 1 softioc softioc 0 Jan  7 09:58 /proc/4627/exe -&amp;gt; /direct/linacioc01_iocs/RF-CONTROL/bin/linux-x86/s7ioc&lt;/div&gt;</summary>
		<author><name>MichaelDavidsaver</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=HowTo_Documents&amp;diff=3759</id>
		<title>HowTo Documents</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=HowTo_Documents&amp;diff=3759"/>
		<updated>2015-02-10T16:02:57Z</updated>

		<summary type="html">&lt;p&gt;MichaelDavidsaver: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a directory of various How-To documents written by members of the EPICS collaboration.  Contributions to this page are most welcome!&lt;br /&gt;
&lt;br /&gt;
=== EPICS Base on Different Architectures and Operating Systems ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.aps.anl.gov/epics/base/RTEMS/tutorial/ Getting Started with EPICS on RTEMS]&lt;br /&gt;
* [[HowToPC104|Getting Started with R3.14.7 on a PC104 running Linux]]&lt;br /&gt;
* [[How To Port EPICS to a new OS/Architecture]]&lt;br /&gt;
* [[How To Use Posix Thread Priority Scheduling under Linux]]&lt;br /&gt;
* [[How To cross compile EPICS and a IOC to an old x86 Linux system]]&lt;br /&gt;
* [http://prjemian.github.io/epicspi/ Installing EPICS on a Raspberry Pi]&lt;br /&gt;
&lt;br /&gt;
=== Drivers and Device Support ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.aps.anl.gov/epics/modules/soft/asyn/HowToDoSerial_StreamDevice.html How To Do Serial (using Asyn Driver and StreamDevice)] (also covers VXI-11)&lt;br /&gt;
* [http://www.aps.anl.gov/epics/modules/soft/asyn/R4-15/HowToDoSerial/tutorial.pdf How To Do Serial (using Asyn Driver and devGPIB)]&lt;br /&gt;
* [[How to make your EPICS driver operating system independent]]&lt;br /&gt;
* [[How To Write Device Support that uses Asyn Driver]] ''(Incomplete!)''&lt;br /&gt;
* [[How to use GPIB ports with linux-gpib and StreamDevice]]&lt;br /&gt;
* [[How to avoid copying arrays with waveformRecord]]&lt;br /&gt;
&lt;br /&gt;
=== Applications ===&lt;br /&gt;
&lt;br /&gt;
* [[Common Database patterns]]&lt;br /&gt;
* [[How To Install Channel Archiver On Scientific Linux]]&lt;br /&gt;
* [[What PV Save and Restore Tools are available]]&lt;br /&gt;
* [[How to Add a New Breakpoint Table]]&lt;br /&gt;
* [[&amp;quot;Best Practice&amp;quot; Guidelines]]&lt;br /&gt;
* [[How do I get EPICS applications to work with a Mac OS X firewall?]]&lt;br /&gt;
&lt;br /&gt;
=== Infrastructure and Other Stuff ===&lt;br /&gt;
&lt;br /&gt;
* [[How To Set Up a Linux Box as an IOC Boot Server]]&lt;br /&gt;
* [[How To Set Up a Mirror of the EPICS Web Site]]&lt;br /&gt;
* [[How to Set Up a Soft IOC Framework on Linux]]&lt;br /&gt;
* [[How to Configure Channel Access]]&lt;br /&gt;
* [[How to Make Channel Access Reach Multiple Soft IOCs on a Linux Host]]&lt;br /&gt;
* [[How to Set Up Console Access and Logging for VME and Soft IOCs]]&lt;br /&gt;
* [[How to Set Up NAL (Nagios Alarm Handler) to monitor an EPICS network]]&lt;br /&gt;
* [[How to find which IOC provides a PV]]&lt;br /&gt;
&lt;br /&gt;
=== Collaboration Stuff ===&lt;br /&gt;
&lt;br /&gt;
* [[How to run an EPICS Collaboration Meeting]]&lt;/div&gt;</summary>
		<author><name>MichaelDavidsaver</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=How_to_avoid_copying_arrays_with_waveformRecord&amp;diff=3713</id>
		<title>How to avoid copying arrays with waveformRecord</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=How_to_avoid_copying_arrays_with_waveformRecord&amp;diff=3713"/>
		<updated>2013-02-19T20:13:34Z</updated>

		<summary type="html">&lt;p&gt;MichaelDavidsaver: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
This page describes how to use the&lt;br /&gt;
[https://code.launchpad.net/~epics-core/epics-base/array-opt array field memory management]&lt;br /&gt;
feature to be introduced in EPICS 3.15.1 (not yet released).&lt;br /&gt;
This allows array data to be moved into and out of the value (aka BPTR) field&lt;br /&gt;
of the waveform, aai, and aao types.&lt;br /&gt;
&lt;br /&gt;
Making use of this feature involves replacing the pointer stored in the BPTR field with another (user allocated) pointer.  The basic rules are:&lt;br /&gt;
&lt;br /&gt;
# BPTR, and the memory it is currently pointing to, can only be accessed while the record is locked.&lt;br /&gt;
# NELM may not be changed.&lt;br /&gt;
# BPTR must always point to a piece of memory large enough to accommodate the maximum number of elements (as given by the NELM field).&lt;br /&gt;
&lt;br /&gt;
Rule #1 means that it is only safe to read, write, or de-reference the BPTR field from a device support function, or after manually calling dbScanLock().&lt;br /&gt;
Rule #3 means that BPTR can never be set to NULL, and when replacing BPTR, the replacement must be allocated large enough for the worst case.&lt;br /&gt;
An external client may put an array of up to NELM elements to the field at almost any time.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
&lt;br /&gt;
A version of EPICS Base with this feature.&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
    /* Demonstration of using custom allocation for waveformRecord buffers.&lt;br /&gt;
     *&lt;br /&gt;
     * Requires EPICS Base with the array field memory management patch&lt;br /&gt;
     * https://code.launchpad.net/~epics-core/epics-base/array-opt&lt;br /&gt;
     *&lt;br /&gt;
     * This example makes inefficient use of malloc() and&lt;br /&gt;
     * free().  This is done to make clear where new memory appears.&lt;br /&gt;
     * In reality a free list should be used.&lt;br /&gt;
     *&lt;br /&gt;
     * Also be aware that this example will use 100% of the time of one CPU core.&lt;br /&gt;
     * However, this will be spread across available cores.&lt;br /&gt;
     *&lt;br /&gt;
     * To use this example include the following in a DBD file:&lt;br /&gt;
     *&lt;br /&gt;
     * device(waveform,CONSTANT,devWfZeroCopy,&amp;quot;Zero Copy Demo&amp;quot;)&lt;br /&gt;
     *&lt;br /&gt;
     * Also include a record instance&lt;br /&gt;
     *&lt;br /&gt;
     * record(waveform, &amp;quot;$(NAME)&amp;quot;) {&lt;br /&gt;
     *  field(DTYP, &amp;quot;Zero Copy Demo&amp;quot;)&lt;br /&gt;
     *  field(FTVL, &amp;quot;SHORT&amp;quot;)&lt;br /&gt;
     *  field(NELM, &amp;quot;100&amp;quot;)&lt;br /&gt;
     *  field(SCAN, &amp;quot;I/O Intr&amp;quot;)&lt;br /&gt;
     * }&lt;br /&gt;
     */&lt;br /&gt;
    &lt;br /&gt;
    #include &amp;lt;errlog.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;initHooks.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;ellLib.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;devSup.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;dbDefs.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;dbAccess.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;cantProceed.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;epicsTypes.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;epicsMutex.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;epicsEvent.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;epicsThread.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;menuFtype.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;dbScan.h&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    #include &amp;lt;waveformRecord.h&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    static ELLLIST allPvt = ELLLIST_INIT;&lt;br /&gt;
    &lt;br /&gt;
    struct devicePvt {&lt;br /&gt;
        ELLNODE node;&lt;br /&gt;
    &lt;br /&gt;
        /* synchronize access to this structure */&lt;br /&gt;
        epicsMutexId lock;&lt;br /&gt;
        /* wakeup the worker when another update is needed */&lt;br /&gt;
        epicsEventId wakeup;&lt;br /&gt;
        /* notify the scanner thread when another update is available */&lt;br /&gt;
        IOSCANPVT scan;&lt;br /&gt;
    &lt;br /&gt;
        /* the next update */&lt;br /&gt;
        void *nextBuffer;&lt;br /&gt;
        epicsUInt32 maxbytes, numbytes;&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    static void startWorkers(initHookState);&lt;br /&gt;
    &lt;br /&gt;
    static long init(int phase)&lt;br /&gt;
    {&lt;br /&gt;
        if(phase!=0)&lt;br /&gt;
            return 0;&lt;br /&gt;
        initHookRegister(&amp;amp;startWorkers);&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    static long init_record(waveformRecord *prec)&lt;br /&gt;
    {&lt;br /&gt;
        struct devicePvt *priv;&lt;br /&gt;
        if(prec-&amp;gt;ftvl!=menuFtypeSHORT) {&lt;br /&gt;
            errlogPrintf(&amp;quot;%s.FTVL must be set to SHORT for this example\n&amp;quot;, prec-&amp;gt;name);&lt;br /&gt;
            return 0;&lt;br /&gt;
        }&lt;br /&gt;
    &lt;br /&gt;
        /* cleanup array allocated by record support.&lt;br /&gt;
         * Not necessary since we use calloc()/free(),&lt;br /&gt;
         * but needed when allocating in other ways.&lt;br /&gt;
         */&lt;br /&gt;
        free(prec-&amp;gt;bptr);&lt;br /&gt;
        prec-&amp;gt;bptr = callocMustSucceed(prec-&amp;gt;nelm, dbValueSize(prec-&amp;gt;ftvl), &amp;quot;first buf&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
        priv = callocMustSucceed(1, sizeof(*priv), &amp;quot;init_record devWfZeroCopy&amp;quot;);&lt;br /&gt;
        priv-&amp;gt;lock = epicsMutexMustCreate();&lt;br /&gt;
        priv-&amp;gt;wakeup = epicsEventMustCreate(epicsEventFull);&lt;br /&gt;
        scanIoInit(&amp;amp;priv-&amp;gt;scan);&lt;br /&gt;
        priv-&amp;gt;maxbytes = prec-&amp;gt;nelm*dbValueSize(prec-&amp;gt;ftvl);&lt;br /&gt;
    &lt;br /&gt;
        ellAdd(&amp;amp;allPvt, &amp;amp;priv-&amp;gt;node);&lt;br /&gt;
    &lt;br /&gt;
        prec-&amp;gt;dpvt = priv;&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    static void worker(void*);&lt;br /&gt;
    &lt;br /&gt;
    static void startWorkers(initHookState state)&lt;br /&gt;
    {&lt;br /&gt;
        ELLNODE *cur;&lt;br /&gt;
        /* Don't start worker threads until&lt;br /&gt;
         * it is safe to call scanIoRequest()&lt;br /&gt;
         */&lt;br /&gt;
        if(state!=initHookAfterInterruptAccept)&lt;br /&gt;
            return;&lt;br /&gt;
        for(cur=ellFirst(&amp;amp;allPvt); cur; cur=ellNext(cur))&lt;br /&gt;
        {&lt;br /&gt;
            struct devicePvt *priv = CONTAINER(cur, struct devicePvt, node);&lt;br /&gt;
            epicsThreadMustCreate(&amp;quot;wfworker&amp;quot;,&lt;br /&gt;
                                  epicsThreadPriorityHigh,&lt;br /&gt;
                                  epicsThreadGetStackSize(epicsThreadStackSmall),&lt;br /&gt;
                                  &amp;amp;worker, priv);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    static void worker(void* raw)&lt;br /&gt;
    {&lt;br /&gt;
        struct devicePvt *priv=raw;&lt;br /&gt;
        void *buf = NULL;&lt;br /&gt;
        epicsUInt32 nbytes = priv-&amp;gt;maxbytes;&lt;br /&gt;
    &lt;br /&gt;
        while(1) {&lt;br /&gt;
    &lt;br /&gt;
            if(!buf) {&lt;br /&gt;
                /* allocate and initialize a new buffer for later (local) use */&lt;br /&gt;
                size_t i;&lt;br /&gt;
                epicsInt16 *ibuf;&lt;br /&gt;
                buf = callocMustSucceed(1, nbytes, &amp;quot;buffer&amp;quot;);&lt;br /&gt;
                ibuf = (epicsInt16*)buf;&lt;br /&gt;
                for(i=0; i&amp;lt;nbytes/2; i++)&lt;br /&gt;
                {&lt;br /&gt;
                    ibuf[i] = rand();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
    &lt;br /&gt;
            /* wait for Event signal when record is scanning 'I/O Intr',&lt;br /&gt;
             * and timeout when record is scanning periodic&lt;br /&gt;
             */&lt;br /&gt;
            if(epicsEventWaitWithTimeout(priv-&amp;gt;wakeup, 1.0)==epicsEventError) {&lt;br /&gt;
                cantProceed(&amp;quot;worker encountered an error waiting for wakeup\n&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
    &lt;br /&gt;
            epicsMutexMustLock(priv-&amp;gt;lock);&lt;br /&gt;
    &lt;br /&gt;
            if(!priv-&amp;gt;nextBuffer) {&lt;br /&gt;
                /* make the local buffer available to the read_wf function */&lt;br /&gt;
                priv-&amp;gt;nextBuffer = buf;&lt;br /&gt;
                buf = NULL;&lt;br /&gt;
                priv-&amp;gt;numbytes = priv-&amp;gt;maxbytes;&lt;br /&gt;
                scanIoRequest(priv-&amp;gt;scan);&lt;br /&gt;
            }&lt;br /&gt;
    &lt;br /&gt;
            epicsMutexUnlock(priv-&amp;gt;lock);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    static long get_iointr_info(int dir, dbCommon *prec, IOSCANPVT *scan)&lt;br /&gt;
    {&lt;br /&gt;
        struct devicePvt *priv=prec-&amp;gt;dpvt;&lt;br /&gt;
        if(!priv)&lt;br /&gt;
            return 0;&lt;br /&gt;
        *scan = priv-&amp;gt;scan;&lt;br /&gt;
        /* wakeup the worker when this thread is placed in the I/O scan list */&lt;br /&gt;
        if(dir==0)&lt;br /&gt;
            epicsEventSignal(priv-&amp;gt;wakeup);&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    static long read_wf(waveformRecord *prec)&lt;br /&gt;
    {&lt;br /&gt;
        struct devicePvt *priv=prec-&amp;gt;dpvt;&lt;br /&gt;
        if(!priv)&lt;br /&gt;
            return 0;&lt;br /&gt;
    &lt;br /&gt;
        epicsMutexMustLock(priv-&amp;gt;lock);&lt;br /&gt;
    &lt;br /&gt;
        if(priv-&amp;gt;nextBuffer) {&lt;br /&gt;
            /* an update is available, so claim it. */&lt;br /&gt;
    &lt;br /&gt;
            if(prec-&amp;gt;bptr)&lt;br /&gt;
                free(prec-&amp;gt;bptr);&lt;br /&gt;
    &lt;br /&gt;
            prec-&amp;gt;bptr = priv-&amp;gt;nextBuffer; /* no memcpy! */&lt;br /&gt;
            priv-&amp;gt;nextBuffer = NULL;&lt;br /&gt;
            prec-&amp;gt;nord = priv-&amp;gt;numbytes / dbValueSize(prec-&amp;gt;ftvl);&lt;br /&gt;
    &lt;br /&gt;
            epicsEventSignal(priv-&amp;gt;wakeup);&lt;br /&gt;
        }&lt;br /&gt;
    &lt;br /&gt;
        epicsMutexUnlock(priv-&amp;gt;lock);&lt;br /&gt;
    &lt;br /&gt;
        assert(prec-&amp;gt;bptr);&lt;br /&gt;
    &lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    static&lt;br /&gt;
    struct dset5 {&lt;br /&gt;
        dset com;&lt;br /&gt;
        DEVSUPFUN read;&lt;br /&gt;
    } devWfZeroCopy = {&lt;br /&gt;
    {5, NULL,&lt;br /&gt;
     &amp;amp;init,&lt;br /&gt;
     &amp;amp;init_record,&lt;br /&gt;
     &amp;amp;get_iointr_info&lt;br /&gt;
    },&lt;br /&gt;
     &amp;amp;read_wf&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    #include &amp;lt;epicsExport.h&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    epicsExportAddress(dset, devWfZeroCopy);&lt;/div&gt;</summary>
		<author><name>MichaelDavidsaver</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=How_to_avoid_copying_arrays_with_waveformRecord&amp;diff=3712</id>
		<title>How to avoid copying arrays with waveformRecord</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=How_to_avoid_copying_arrays_with_waveformRecord&amp;diff=3712"/>
		<updated>2013-02-19T20:08:46Z</updated>

		<summary type="html">&lt;p&gt;MichaelDavidsaver: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
This page describes how to use the&lt;br /&gt;
[https://code.launchpad.net/~epics-core/epics-base/array-opt array field memory management]&lt;br /&gt;
feature to be introduced in EPICS 3.15.1 (not yet released).&lt;br /&gt;
This allows array data to be moved into and out of the value (aka BPTR) field&lt;br /&gt;
of the waveform, aai, and aao types.&lt;br /&gt;
&lt;br /&gt;
Making use of this feature involves replacing the pointer stored in the BPTR field with another (user allocated) pointer.  The basic rules are:&lt;br /&gt;
&lt;br /&gt;
# BPTR, and the memory it is currently pointing to, can only be accessed while the record is locked.&lt;br /&gt;
# NELM may not be changed.&lt;br /&gt;
# BPTR must always point to a piece of memory large enough to accommodate the maximum number of elements (as given by the NELM field).&lt;br /&gt;
&lt;br /&gt;
Rule #1 means that it is only safe to read, write, or de-reference the BPTR field from a device support function, or after manually calling dbScanLock().&lt;br /&gt;
Rule #3 means that BPTR can never be set to NULL, and when replacing BPTR, the replacement must be allocated large enough for the worst case.&lt;br /&gt;
An external client may put an array of up to NELM elements to the field at almost any time.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
&lt;br /&gt;
A version of EPICS Base with this feature.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
Two pieces of example code are available.&lt;/div&gt;</summary>
		<author><name>MichaelDavidsaver</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=How_to_avoid_copying_arrays_with_waveformRecord&amp;diff=3711</id>
		<title>How to avoid copying arrays with waveformRecord</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=How_to_avoid_copying_arrays_with_waveformRecord&amp;diff=3711"/>
		<updated>2013-02-19T15:45:48Z</updated>

		<summary type="html">&lt;p&gt;MichaelDavidsaver: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
This page describes how to use the&lt;br /&gt;
[https://code.launchpad.net/~epics-core/epics-base/array-opt array field memory management]&lt;br /&gt;
feature to be introduced in EPICS 3.15.1 (not yet released).&lt;br /&gt;
This allows array data to be moved into and out of the value (aka BPTR) field&lt;br /&gt;
of the waveform, aai, and aao types.&lt;br /&gt;
&lt;br /&gt;
Making use of this feature involves replacing the pointer stored in the BPTR field with another (user allocated) pointer.  The basic rules are:&lt;br /&gt;
&lt;br /&gt;
# BPTR, and the memory it is currently pointing to, can only be accessed while the record is locked.&lt;br /&gt;
# NELM may not be changed.&lt;br /&gt;
# BPTR must always point to a piece of memory large enough to accommodate the maximum number of elements (as given by the NELM field).&lt;br /&gt;
&lt;br /&gt;
Rule #1 means that it is only safe to read, write, or de-reference the BPTR field from a device support function, or after manually calling dbScanLock().&lt;br /&gt;
Rule #3 means that BPTR can never be set to NULL, and when replacing BPTR, the replacement must be allocated large enough for the worst case.&lt;br /&gt;
An external client may put an array of up to NELM elements to the field at almost any time.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
&lt;br /&gt;
A version of EPICS Base with this feature.&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;/div&gt;</summary>
		<author><name>MichaelDavidsaver</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=How_to_avoid_copying_arrays_with_waveformRecord&amp;diff=3710</id>
		<title>How to avoid copying arrays with waveformRecord</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=How_to_avoid_copying_arrays_with_waveformRecord&amp;diff=3710"/>
		<updated>2013-02-19T15:43:30Z</updated>

		<summary type="html">&lt;p&gt;MichaelDavidsaver: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
This page describes how to use the&lt;br /&gt;
[https://code.launchpad.net/~epics-core/epics-base/array-opt array field memory management]&lt;br /&gt;
feature to be introduced in EPICS 3.15.1 (not yet released).&lt;br /&gt;
This allows array data to be moved into and out of the value (aka BPTR) field&lt;br /&gt;
of the waveform, aai, and aao types.&lt;br /&gt;
&lt;br /&gt;
Making use of this feature involves replacing the pointer stored in the BPTR field with another (user allocated) pointer.  The basic rules are:&lt;br /&gt;
&lt;br /&gt;
# BPTR and the memory it is currently pointing to can only be accessed while the record is locked.&lt;br /&gt;
# NELM may not be changed.&lt;br /&gt;
# BPTR must always point to a piece of memory large enough to accommodate the maximum number of elements (as given by the NELM field).&lt;br /&gt;
&lt;br /&gt;
Rule #1 means that it is only safe to read, write, or de-reference the BPTR field from a device support function, or after manually calling dbScanLock().&lt;br /&gt;
Rule #3 means that BPTR can never be set to NULL, and when replacing BPTR, the replacement must be allocated large enough for the worst case.&lt;br /&gt;
An external client may put an array of up to NELM elements to the field at almost any time.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
&lt;br /&gt;
A version of EPICS Base with this feature.&lt;/div&gt;</summary>
		<author><name>MichaelDavidsaver</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=How_to_avoid_copying_arrays_with_waveformRecord&amp;diff=3709</id>
		<title>How to avoid copying arrays with waveformRecord</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=How_to_avoid_copying_arrays_with_waveformRecord&amp;diff=3709"/>
		<updated>2013-02-19T15:38:18Z</updated>

		<summary type="html">&lt;p&gt;MichaelDavidsaver: Created page with &amp;quot;== Introduction ==  This page describes how to use the [https://code.launchpad.net/~epics-core/epics-base/array-opt array field memory management] feature to be introduced in EPI...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
This page describes how to use the&lt;br /&gt;
[https://code.launchpad.net/~epics-core/epics-base/array-opt array field memory management]&lt;br /&gt;
feature to be introduced in EPICS 3.15.1 (not yet released).&lt;br /&gt;
This allows array data to be moved into and out of the value (aka BPTR) field&lt;br /&gt;
of the waveform, aai, and aao types.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
A version of EPICS Base with this feature.&lt;/div&gt;</summary>
		<author><name>MichaelDavidsaver</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=HowTo_Documents&amp;diff=3708</id>
		<title>HowTo Documents</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=HowTo_Documents&amp;diff=3708"/>
		<updated>2013-02-19T15:32:17Z</updated>

		<summary type="html">&lt;p&gt;MichaelDavidsaver: /* Drivers and Device Support */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a directory of various How-To documents written by members of the EPICS collaboration.  Contributions to this page are most welcome!&lt;br /&gt;
&lt;br /&gt;
=== EPICS Base on Different Architectures and Operating Systems ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.aps.anl.gov/epics/base/RTEMS/tutorial/ Getting Started with EPICS on RTEMS]&lt;br /&gt;
* [[HowToPC104|Getting Started with R3.14.7 on a PC104 running Linux]]&lt;br /&gt;
* [[How To Port EPICS to a new OS/Architecture]]&lt;br /&gt;
* [[How To Use Posix Thread Priority Scheduling under Linux]]&lt;br /&gt;
* [[How To cross compile EPICS and a IOC to an old x86 Linux system]]&lt;br /&gt;
&lt;br /&gt;
=== Drivers and Device Support ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.aps.anl.gov/epics/modules/soft/asyn/HowToDoSerial_StreamDevice.html How To Do Serial (using Asyn Driver and StreamDevice)] (also covers VXI-11)&lt;br /&gt;
* [http://www.aps.anl.gov/epics/modules/soft/asyn/R4-15/HowToDoSerial/tutorial.pdf How To Do Serial (using Asyn Driver and devGPIB)]&lt;br /&gt;
* [[How to make your EPICS driver operating system independent]]&lt;br /&gt;
* [[How To Write Device Support that uses Asyn Driver]] ''(Incomplete!)''&lt;br /&gt;
* [[How to use GPIB ports with linux-gpib and StreamDevice]]&lt;br /&gt;
* [[How to avoid copying arrays with waveformRecord]]&lt;br /&gt;
&lt;br /&gt;
=== Applications ===&lt;br /&gt;
&lt;br /&gt;
* [[Common Database patterns]]&lt;br /&gt;
* [[How To Install Channel Archiver On Scientific Linux]]&lt;br /&gt;
* [[What PV Save and Restore Tools are available]]&lt;br /&gt;
* [[How to Add a New Breakpoint Table]]&lt;br /&gt;
* [[&amp;quot;Best Practice&amp;quot; Guidelines]]&lt;br /&gt;
* [[How do I get EPICS applications to work with a Mac OS X firewall?]]&lt;br /&gt;
&lt;br /&gt;
=== Infrastructure and Other Stuff ===&lt;br /&gt;
&lt;br /&gt;
* [[How To Set Up a Linux Box as an IOC Boot Server]]&lt;br /&gt;
* [[How To Set Up a Mirror of the EPICS Web Site]]&lt;br /&gt;
* [[How to Set Up a Soft IOC Framework on Linux]]&lt;br /&gt;
* [[How to Set Up Console Access and Logging for VME and Soft IOCs]]&lt;br /&gt;
* [[How to Set Up NAL (Nagios Alarm Handler) to monitor an EPICS network]]&lt;br /&gt;
&lt;br /&gt;
=== Collaboration Stuff ===&lt;br /&gt;
&lt;br /&gt;
* [[How to run an EPICS Collaboration Meeting]]&lt;/div&gt;</summary>
		<author><name>MichaelDavidsaver</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=RRM_3-14_dbCommon&amp;diff=2859</id>
		<title>RRM 3-14 dbCommon</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=RRM_3-14_dbCommon&amp;diff=2859"/>
		<updated>2010-09-27T19:13:14Z</updated>

		<summary type="html">&lt;p&gt;MichaelDavidsaver: TSE missing meaning of event codes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[RRM 3-14|EPICS Record Reference Manual]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fields Common to All Record Types ==&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
This chapter contains a description of fields that are common to all records. These fields are defined in dbcommon.dbd.&lt;br /&gt;
&lt;br /&gt;
=== Scan Fields ===&lt;br /&gt;
&lt;br /&gt;
These fields contain information related to how and when a record processes. For a further explanation of these record processing and these fields, see Scanning Specification, Chapter 1, 1. A few records have unique fields that also affect how they process. These fields, if any, will be listed and explained in the chapter for each record.&lt;br /&gt;
&lt;br /&gt;
==== Field Summary ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TH&amp;gt;Field&amp;lt;TH&amp;gt;Type&amp;lt;TH&amp;gt;DCT&amp;lt;TH&amp;gt;Initial&amp;lt;TH&amp;gt;Access&amp;lt;TH&amp;gt;Modify&amp;lt;TH&amp;gt;Rec Proc Monitor&lt;br /&gt;
&amp;lt;TH&amp;gt;PP&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SCAN&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Passive&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PINI&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PHAS&amp;lt;TD&amp;gt;SHORT&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;EVNT&amp;lt;TD&amp;gt;SHORT&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PRIO&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Low&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DISV&amp;lt;TD&amp;gt;SHORT&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;1&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DISA&amp;lt;TD&amp;gt;SHORT&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SDIS&amp;lt;TD&amp;gt;INLINK&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;N/A&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PROC&amp;lt;TD&amp;gt;UCHAR&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;Yes&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DISS&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No Alarm&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;LCNT&amp;lt;TD&amp;gt;UCHAR&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PACT&amp;lt;TD&amp;gt;UCHAR&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;FLNK&amp;lt;TD&amp;gt;FWDLINK&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Null&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;N/A&amp;lt;TD&amp;gt;No&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SPVT&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;4&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
==== Field Description ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Name&amp;lt;TH&amp;gt;Summary&amp;lt;TH&amp;gt;Description&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SCAN&amp;lt;TD&amp;gt;Scanning Rate&amp;lt;TD&amp;gt;This can be one of the periodic intervals (&amp;lt;CODE&amp;gt;.1 second&amp;lt;/CODE&amp;gt;, &amp;lt;CODE&amp;gt;.2 second&amp;lt;/CODE&amp;gt;, &amp;lt;CODE&amp;gt;.5 second&amp;lt;/CODE&amp;gt;, &amp;lt;CODE&amp;gt;1 second&amp;lt;/CODE&amp;gt;, &amp;lt;CODE&amp;gt;2 second&amp;lt;/CODE&amp;gt;, &amp;lt;CODE&amp;gt;5 second&amp;lt;/CODE&amp;gt;, &amp;lt;CODE&amp;gt;10 second&amp;lt;/CODE&amp;gt;, &amp;lt;CODE&amp;gt;I/O Intr&amp;lt;/CODE&amp;gt;, &amp;lt;CODE&amp;gt;Event&amp;lt;/CODE&amp;gt;, or &amp;lt;CODE&amp;gt;Passive&amp;lt;/CODE&amp;gt;.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PINI&amp;lt;TD&amp;gt;Process at Initialization&amp;lt;TD&amp;gt;If this field is set to YES during database configuration, then the record is processed once at IOC initialization (before the normal scan tasks are started).&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PHAS&amp;lt;TD&amp;gt;Scan Phase Number&amp;lt;TD&amp;gt;This 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 phase number.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;EVNT&amp;lt;TD&amp;gt;Event Number&amp;lt;TD&amp;gt;Event number for scan type SCAN_EVENT. All records with scan type 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)&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PRIO&amp;lt;TD&amp;gt;Priority&amp;lt;TD&amp;gt;Scheduling priority for processing I/O Event scanned records and asynchronous record completion tasks.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DISV&amp;lt;TD&amp;gt;Disable Value&amp;lt;TD&amp;gt;If DISV=DISA, then the record will be disabled, i.e. dbProcess will not process the record.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DISA&amp;lt;TD&amp;gt;Scan Disable Input Link Value&amp;lt;TD&amp;gt;This is the value that is compared with DISV to determine if the record is disabled. Its value 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.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SDIS&amp;lt;TD&amp;gt;Scan Disable Input Link&amp;lt;TD&amp;gt;An input link from which to obtain a value for DISA. This field is ignored unless it is a database link or a channel access link. If it is a database or a channel access link, dbProcess calls dbGetLink to obtain a value for DISA before deciding to call the processing routine.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PROC&amp;lt;TD&amp;gt;Process Record&amp;lt;TD&amp;gt;A record will be processed whenever a dbPutField is directed to this field.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DISS&amp;lt;TD&amp;gt;Disable Alarm Severity&amp;lt;TD&amp;gt;When this record is disabled, it will be put into alarm with this severity and a status of DISABLE_ALARM.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;LSET&amp;lt;TD&amp;gt;Lock Set&amp;lt;TD&amp;gt;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.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;LCNT&amp;lt;TD&amp;gt;Lock Count&amp;lt;TD&amp;gt;The number of times in succession dbProcess finds the record active, i.e. PACT is TRUE. If dbProcess finds the record active MAX_LOCK (currently set to 10) times in succession, it raises a SCAN_ALARM.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PACT&amp;lt;TD&amp;gt;Processing Active&amp;lt;TD&amp;gt;See Application Developers Guide for details on usage. PACT 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.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;FLNK&amp;lt;TD&amp;gt;Forward Link&amp;lt;TD&amp;gt;This field is a database link. If FLNK is specified, processing this record will force a processing of the scan passive forward link record.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SPVT&amp;lt;TD&amp;gt;Scan Private&amp;lt;TD&amp;gt;This field is for private use of the scanning system.&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Alarm Fields ===&lt;br /&gt;
&lt;br /&gt;
These fields indicate the status and severity of alarms, or else determine the how and when alarms are triggered. For a further explanation of database alarms, see Alarm Specification, Chapter 1, 4. Of course, many records have alarm-related fields not common to all records. These fields are listed and explained in the appropriate chapter on each record.&lt;br /&gt;
&lt;br /&gt;
==== Field Summary ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Field&amp;lt;TH&amp;gt;Type&amp;lt;TH&amp;gt;DCT&amp;lt;TH&amp;gt;Initial&amp;lt;TH&amp;gt;Access&amp;lt;TH&amp;gt;Modify&amp;lt;TH&amp;gt;Rec Proc Monitor&amp;lt;TH&amp;gt;PP&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;STAT&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;UDF_ALARM&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SEVR&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;INVALID_ALARM&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;NSTA&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No Alarm&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;NSEV&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No Alarm&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ACKS&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No Alarm&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ACKT&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;UDF&amp;lt;TD&amp;gt;UCHAR&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;1&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;Yes&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Field Description ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Name&amp;lt;TH&amp;gt;Summary&amp;lt;TH&amp;gt;Description&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;STAT&amp;lt;TD&amp;gt;Current Alarm Status&amp;lt;TD rowspan=4&amp;gt;These four fields are the alarm status and severity fields. STAT and SEVR are the values seen outside database access. NSTA and NSEV are the fields the database access, record support, and device support use 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.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SEVR&amp;lt;TD&amp;gt;Current Alarm Severity&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;NSTA&amp;lt;TD&amp;gt;New Alarm Status&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;NSEV&amp;lt;TD&amp;gt;New Alarm Severity&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ACKS&amp;lt;TD&amp;gt;Alarm Acknowledge Severity&amp;lt;TD&amp;gt;Highest severity unacknowledged alarm&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ACKT&amp;lt;TD&amp;gt;Alarm Acknowledge Transient&amp;lt;TD&amp;gt;Is it necessary to acknowledge transient alarms?&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;UDF&amp;lt;TD&amp;gt;VAL Undefined&amp;lt;TD&amp;gt;This indicates that the record has never been processed or its value is UnDeFined. Typically this is caused by a failure in device support, a record that has never been processed, or where 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.&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Device Fields ===&lt;br /&gt;
&lt;br /&gt;
These fields contain information about the device and record support used by a record.&lt;br /&gt;
&lt;br /&gt;
==== Field Summary ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Field&amp;lt;TH&amp;gt;Type&amp;lt;TH&amp;gt;DCT&amp;lt;TH&amp;gt;Initial&amp;lt;TH&amp;gt;Access&amp;lt;TH&amp;gt;Modify&amp;lt;TH&amp;gt;Rec Proc Monitor&amp;lt;TH&amp;gt;PP&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;RSET&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;4&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DSET&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;4&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DPVT&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;4&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Field Description ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Name&amp;lt;TH&amp;gt;Summary&amp;lt;TH&amp;gt;Description&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;RSET&amp;lt;TD&amp;gt;Address of Record Support Entry Table&amp;lt;TD&amp;gt;See Application Developers Guide for details on usage.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DSET&amp;lt;TD&amp;gt;Address of Device Support Entry Table&amp;lt;TD&amp;gt;This address of the device support entry table for this record. The value of this field is determined at IOC initialization time. Record support routines use this field to locate their device support routines.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DPVT&amp;lt;TD&amp;gt;Device Private&amp;lt;TD&amp;gt;This field is for private use of the device support modules.&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Debugging Fields ===&lt;br /&gt;
&lt;br /&gt;
These fields can aid in the debugging process.&lt;br /&gt;
&lt;br /&gt;
==== Field Summary ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Field&amp;lt;TH&amp;gt;Type&amp;lt;TH&amp;gt;DCT&amp;lt;TH&amp;gt;Initial&amp;lt;TH&amp;gt;Access&amp;lt;TH&amp;gt;Modify&amp;lt;TH&amp;gt;Rec Proc Monitor&amp;lt;TH&amp;gt;PP&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;TPRO&amp;lt;TD&amp;gt;UCHAR&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;BKPT&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Field Description ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Name&amp;lt;TH&amp;gt;Summary&amp;lt;TH&amp;gt;Description&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;TPRO&amp;lt;TD&amp;gt;Trace Processing&amp;lt;TD&amp;gt;If this field is set 1, a message is printed each time this record is processed and a message is printed for each record processed as a result of this record being processed&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;BKPT&amp;lt;TD&amp;gt;BreakPoint&amp;lt;TD&amp;gt;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.&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Miscellaneous Fields ===&lt;br /&gt;
&lt;br /&gt;
These are miscellaneous fields common to all record types.&lt;br /&gt;
&lt;br /&gt;
==== Field Summary ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Field&amp;lt;TH&amp;gt;Type&amp;lt;TH&amp;gt;DCT&amp;lt;TH&amp;gt;Initial&amp;lt;TH&amp;gt;Access&amp;lt;TH&amp;gt;Modify&amp;lt;TH&amp;gt;Rec Proc Monitor&amp;lt;TH&amp;gt;PP&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;NAME&amp;lt;TD&amp;gt;STRING [61]&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DESC&amp;lt;TD&amp;gt;STRING [41]&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Null&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ASG&amp;lt;TD&amp;gt;STRING [29]&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Null&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;TSE&amp;lt;TD&amp;gt;SHORT&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;TSEL&amp;lt;TD&amp;gt;INLINK&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Null&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;?&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DTYP&amp;lt;TD&amp;gt;DEVCHOICE&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Soft Record Support&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;MLOK&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;MLIS&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DISP&amp;lt;TD&amp;gt;UCHAR&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PUTF&amp;lt;TD&amp;gt;UCHAR&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;RPRO&amp;lt;TD&amp;gt;UCHAR&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ASP&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;4&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PPN&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;4&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PPNR&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;4&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;RDES&amp;lt;TD&amp;gt;NO_ACCESS&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;TIME&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;8&amp;lt;TD&amp;gt;Option&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Field Description ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Name&amp;lt;TH&amp;gt;Summary&amp;lt;TH&amp;gt;Description&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;NAME&amp;lt;TD&amp;gt;Record Name&amp;lt;TD&amp;gt;A 60 character record name supplied by the application developer.  This name is the means of identifying a specific record. It must have a unique value across all IOCs attached to the same local area subnet, and should use only this limited set of characters: &amp;lt;tt&amp;gt;a-z A-Z 0-9 _ - : [ ] &amp;amp;lt; &amp;amp;gt; ;&amp;lt;/tt&amp;gt;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DESC&amp;lt;TD&amp;gt;Description&amp;lt;TD&amp;gt;An arbitrary 40 character record description supplied by the application developer.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ASG&amp;lt;TD&amp;gt;Access Security Group&amp;lt;TD&amp;gt;A character string value defining the access security group for this record.  If left NULL, the record is placed in group DEFAULT.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;TSEL&amp;lt;TD&amp;gt;Time Stamp Event Link&amp;lt;TD&amp;gt;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.  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.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;TSE&amp;lt;TD&amp;gt;Time Stamp Event&amp;lt;TD&amp;gt;This 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.&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DTYP&amp;lt;TD&amp;gt;Device Type&amp;lt;TD&amp;gt;This 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.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;MLOK&amp;lt;TD&amp;gt;Monitor Lock&amp;lt;TD&amp;gt;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.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;MLIS&amp;lt;TD&amp;gt;Monitor List&amp;lt;TD&amp;gt;This 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,&amp;amp;amp;data,mask), where &amp;quot;mask&amp;quot; is some combination of DBE_ALARM, DBE_VALUE, and DBE_LOG.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DISP&amp;lt;TD&amp;gt;Disable putFields&amp;lt;TD&amp;gt;If this field is set to TRUE, then all dbPutFields (normally issued by channel access) directed to this record are ignored except to the field DISP itself.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PUTF&amp;lt;TD&amp;gt;dbPutField Process&amp;lt;TD&amp;gt;Did dbPutField cause the current record processing?&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;RPRO&amp;lt;TD&amp;gt;Reprocess&amp;lt;TD&amp;gt;Reprocess record when current processing completes.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ASP&amp;lt;TD&amp;gt;Access Security Private&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PPN&amp;lt;TD&amp;gt;Address of putNotify&amp;lt;TD&amp;gt;Address of putNotify callback.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PPNR&amp;lt;TD&amp;gt;Next Record for putNotify&amp;lt;TD&amp;gt;Next record for PutNotify.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;RDES&amp;lt;TD&amp;gt;Address of dbRecordType&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;TIME&amp;lt;TD&amp;gt;Time&amp;lt;TD&amp;gt;The time when this record was last processed, in standard format.&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
EPICS Record Reference Manual - 19 MAY 1998&lt;/div&gt;</summary>
		<author><name>MichaelDavidsaver</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=RRM_3-14_dbCommon&amp;diff=1871</id>
		<title>RRM 3-14 dbCommon</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=RRM_3-14_dbCommon&amp;diff=1871"/>
		<updated>2010-09-27T19:11:49Z</updated>

		<summary type="html">&lt;p&gt;MichaelDavidsaver: switch order of TSE and TSEL.  TSEL comes first&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[RRM 3-14|EPICS Record Reference Manual]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fields Common to All Record Types ==&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
This chapter contains a description of fields that are common to all records. These fields are defined in dbcommon.dbd.&lt;br /&gt;
&lt;br /&gt;
=== Scan Fields ===&lt;br /&gt;
&lt;br /&gt;
These fields contain information related to how and when a record processes. For a further explanation of these record processing and these fields, see Scanning Specification, Chapter 1, 1. A few records have unique fields that also affect how they process. These fields, if any, will be listed and explained in the chapter for each record.&lt;br /&gt;
&lt;br /&gt;
==== Field Summary ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TH&amp;gt;Field&amp;lt;TH&amp;gt;Type&amp;lt;TH&amp;gt;DCT&amp;lt;TH&amp;gt;Initial&amp;lt;TH&amp;gt;Access&amp;lt;TH&amp;gt;Modify&amp;lt;TH&amp;gt;Rec Proc Monitor&lt;br /&gt;
&amp;lt;TH&amp;gt;PP&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SCAN&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Passive&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PINI&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PHAS&amp;lt;TD&amp;gt;SHORT&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;EVNT&amp;lt;TD&amp;gt;SHORT&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PRIO&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Low&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DISV&amp;lt;TD&amp;gt;SHORT&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;1&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DISA&amp;lt;TD&amp;gt;SHORT&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SDIS&amp;lt;TD&amp;gt;INLINK&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;N/A&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PROC&amp;lt;TD&amp;gt;UCHAR&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;Yes&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DISS&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No Alarm&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;LCNT&amp;lt;TD&amp;gt;UCHAR&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PACT&amp;lt;TD&amp;gt;UCHAR&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;FLNK&amp;lt;TD&amp;gt;FWDLINK&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Null&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;N/A&amp;lt;TD&amp;gt;No&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SPVT&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;4&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
==== Field Description ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Name&amp;lt;TH&amp;gt;Summary&amp;lt;TH&amp;gt;Description&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SCAN&amp;lt;TD&amp;gt;Scanning Rate&amp;lt;TD&amp;gt;This can be one of the periodic intervals (&amp;lt;CODE&amp;gt;.1 second&amp;lt;/CODE&amp;gt;, &amp;lt;CODE&amp;gt;.2 second&amp;lt;/CODE&amp;gt;, &amp;lt;CODE&amp;gt;.5 second&amp;lt;/CODE&amp;gt;, &amp;lt;CODE&amp;gt;1 second&amp;lt;/CODE&amp;gt;, &amp;lt;CODE&amp;gt;2 second&amp;lt;/CODE&amp;gt;, &amp;lt;CODE&amp;gt;5 second&amp;lt;/CODE&amp;gt;, &amp;lt;CODE&amp;gt;10 second&amp;lt;/CODE&amp;gt;, &amp;lt;CODE&amp;gt;I/O Intr&amp;lt;/CODE&amp;gt;, &amp;lt;CODE&amp;gt;Event&amp;lt;/CODE&amp;gt;, or &amp;lt;CODE&amp;gt;Passive&amp;lt;/CODE&amp;gt;.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PINI&amp;lt;TD&amp;gt;Process at Initialization&amp;lt;TD&amp;gt;If this field is set to YES during database configuration, then the record is processed once at IOC initialization (before the normal scan tasks are started).&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PHAS&amp;lt;TD&amp;gt;Scan Phase Number&amp;lt;TD&amp;gt;This 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 phase number.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;EVNT&amp;lt;TD&amp;gt;Event Number&amp;lt;TD&amp;gt;Event number for scan type SCAN_EVENT. All records with scan type 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)&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PRIO&amp;lt;TD&amp;gt;Priority&amp;lt;TD&amp;gt;Scheduling priority for processing I/O Event scanned records and asynchronous record completion tasks.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DISV&amp;lt;TD&amp;gt;Disable Value&amp;lt;TD&amp;gt;If DISV=DISA, then the record will be disabled, i.e. dbProcess will not process the record.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DISA&amp;lt;TD&amp;gt;Scan Disable Input Link Value&amp;lt;TD&amp;gt;This is the value that is compared with DISV to determine if the record is disabled. Its value 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.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SDIS&amp;lt;TD&amp;gt;Scan Disable Input Link&amp;lt;TD&amp;gt;An input link from which to obtain a value for DISA. This field is ignored unless it is a database link or a channel access link. If it is a database or a channel access link, dbProcess calls dbGetLink to obtain a value for DISA before deciding to call the processing routine.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PROC&amp;lt;TD&amp;gt;Process Record&amp;lt;TD&amp;gt;A record will be processed whenever a dbPutField is directed to this field.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DISS&amp;lt;TD&amp;gt;Disable Alarm Severity&amp;lt;TD&amp;gt;When this record is disabled, it will be put into alarm with this severity and a status of DISABLE_ALARM.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;LSET&amp;lt;TD&amp;gt;Lock Set&amp;lt;TD&amp;gt;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.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;LCNT&amp;lt;TD&amp;gt;Lock Count&amp;lt;TD&amp;gt;The number of times in succession dbProcess finds the record active, i.e. PACT is TRUE. If dbProcess finds the record active MAX_LOCK (currently set to 10) times in succession, it raises a SCAN_ALARM.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PACT&amp;lt;TD&amp;gt;Processing Active&amp;lt;TD&amp;gt;See Application Developers Guide for details on usage. PACT 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.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;FLNK&amp;lt;TD&amp;gt;Forward Link&amp;lt;TD&amp;gt;This field is a database link. If FLNK is specified, processing this record will force a processing of the scan passive forward link record.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SPVT&amp;lt;TD&amp;gt;Scan Private&amp;lt;TD&amp;gt;This field is for private use of the scanning system.&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Alarm Fields ===&lt;br /&gt;
&lt;br /&gt;
These fields indicate the status and severity of alarms, or else determine the how and when alarms are triggered. For a further explanation of database alarms, see Alarm Specification, Chapter 1, 4. Of course, many records have alarm-related fields not common to all records. These fields are listed and explained in the appropriate chapter on each record.&lt;br /&gt;
&lt;br /&gt;
==== Field Summary ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Field&amp;lt;TH&amp;gt;Type&amp;lt;TH&amp;gt;DCT&amp;lt;TH&amp;gt;Initial&amp;lt;TH&amp;gt;Access&amp;lt;TH&amp;gt;Modify&amp;lt;TH&amp;gt;Rec Proc Monitor&amp;lt;TH&amp;gt;PP&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;STAT&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;UDF_ALARM&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SEVR&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;INVALID_ALARM&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;NSTA&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No Alarm&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;NSEV&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No Alarm&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ACKS&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No Alarm&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ACKT&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;UDF&amp;lt;TD&amp;gt;UCHAR&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;1&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;Yes&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Field Description ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Name&amp;lt;TH&amp;gt;Summary&amp;lt;TH&amp;gt;Description&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;STAT&amp;lt;TD&amp;gt;Current Alarm Status&amp;lt;TD rowspan=4&amp;gt;These four fields are the alarm status and severity fields. STAT and SEVR are the values seen outside database access. NSTA and NSEV are the fields the database access, record support, and device support use 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.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SEVR&amp;lt;TD&amp;gt;Current Alarm Severity&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;NSTA&amp;lt;TD&amp;gt;New Alarm Status&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;NSEV&amp;lt;TD&amp;gt;New Alarm Severity&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ACKS&amp;lt;TD&amp;gt;Alarm Acknowledge Severity&amp;lt;TD&amp;gt;Highest severity unacknowledged alarm&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ACKT&amp;lt;TD&amp;gt;Alarm Acknowledge Transient&amp;lt;TD&amp;gt;Is it necessary to acknowledge transient alarms?&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;UDF&amp;lt;TD&amp;gt;VAL Undefined&amp;lt;TD&amp;gt;This indicates that the record has never been processed or its value is UnDeFined. Typically this is caused by a failure in device support, a record that has never been processed, or where 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.&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Device Fields ===&lt;br /&gt;
&lt;br /&gt;
These fields contain information about the device and record support used by a record.&lt;br /&gt;
&lt;br /&gt;
==== Field Summary ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Field&amp;lt;TH&amp;gt;Type&amp;lt;TH&amp;gt;DCT&amp;lt;TH&amp;gt;Initial&amp;lt;TH&amp;gt;Access&amp;lt;TH&amp;gt;Modify&amp;lt;TH&amp;gt;Rec Proc Monitor&amp;lt;TH&amp;gt;PP&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;RSET&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;4&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DSET&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;4&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DPVT&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;4&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Field Description ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Name&amp;lt;TH&amp;gt;Summary&amp;lt;TH&amp;gt;Description&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;RSET&amp;lt;TD&amp;gt;Address of Record Support Entry Table&amp;lt;TD&amp;gt;See Application Developers Guide for details on usage.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DSET&amp;lt;TD&amp;gt;Address of Device Support Entry Table&amp;lt;TD&amp;gt;This address of the device support entry table for this record. The value of this field is determined at IOC initialization time. Record support routines use this field to locate their device support routines.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DPVT&amp;lt;TD&amp;gt;Device Private&amp;lt;TD&amp;gt;This field is for private use of the device support modules.&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Debugging Fields ===&lt;br /&gt;
&lt;br /&gt;
These fields can aid in the debugging process.&lt;br /&gt;
&lt;br /&gt;
==== Field Summary ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Field&amp;lt;TH&amp;gt;Type&amp;lt;TH&amp;gt;DCT&amp;lt;TH&amp;gt;Initial&amp;lt;TH&amp;gt;Access&amp;lt;TH&amp;gt;Modify&amp;lt;TH&amp;gt;Rec Proc Monitor&amp;lt;TH&amp;gt;PP&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;TPRO&amp;lt;TD&amp;gt;UCHAR&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;BKPT&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Field Description ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Name&amp;lt;TH&amp;gt;Summary&amp;lt;TH&amp;gt;Description&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;TPRO&amp;lt;TD&amp;gt;Trace Processing&amp;lt;TD&amp;gt;If this field is set 1, a message is printed each time this record is processed and a message is printed for each record processed as a result of this record being processed&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;BKPT&amp;lt;TD&amp;gt;BreakPoint&amp;lt;TD&amp;gt;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.&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Miscellaneous Fields ===&lt;br /&gt;
&lt;br /&gt;
These are miscellaneous fields common to all record types.&lt;br /&gt;
&lt;br /&gt;
==== Field Summary ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Field&amp;lt;TH&amp;gt;Type&amp;lt;TH&amp;gt;DCT&amp;lt;TH&amp;gt;Initial&amp;lt;TH&amp;gt;Access&amp;lt;TH&amp;gt;Modify&amp;lt;TH&amp;gt;Rec Proc Monitor&amp;lt;TH&amp;gt;PP&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;NAME&amp;lt;TD&amp;gt;STRING [61]&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DESC&amp;lt;TD&amp;gt;STRING [41]&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Null&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ASG&amp;lt;TD&amp;gt;STRING [29]&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Null&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;TSE&amp;lt;TD&amp;gt;SHORT&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;TSEL&amp;lt;TD&amp;gt;INLINK&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Null&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;?&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DTYP&amp;lt;TD&amp;gt;DEVCHOICE&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Soft Record Support&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;MLOK&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;MLIS&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DISP&amp;lt;TD&amp;gt;UCHAR&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PUTF&amp;lt;TD&amp;gt;UCHAR&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;RPRO&amp;lt;TD&amp;gt;UCHAR&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ASP&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;4&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PPN&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;4&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PPNR&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;4&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;RDES&amp;lt;TD&amp;gt;NO_ACCESS&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;TIME&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;8&amp;lt;TD&amp;gt;Option&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Field Description ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Name&amp;lt;TH&amp;gt;Summary&amp;lt;TH&amp;gt;Description&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;NAME&amp;lt;TD&amp;gt;Record Name&amp;lt;TD&amp;gt;A 60 character record name supplied by the application developer.  This name is the means of identifying a specific record. It must have a unique value across all IOCs attached to the same local area subnet, and should use only this limited set of characters: &amp;lt;tt&amp;gt;a-z A-Z 0-9 _ - : [ ] &amp;amp;lt; &amp;amp;gt; ;&amp;lt;/tt&amp;gt;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DESC&amp;lt;TD&amp;gt;Description&amp;lt;TD&amp;gt;An arbitrary 40 character record description supplied by the application developer.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ASG&amp;lt;TD&amp;gt;Access Security Group&amp;lt;TD&amp;gt;A character string value defining the access security group for this record.  If left NULL, the record is placed in group DEFAULT.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;TSEL&amp;lt;TD&amp;gt;Time Stamp Event Link&amp;lt;TD&amp;gt;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.  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.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;TSE&amp;lt;TD&amp;gt;Time Stamp Event&amp;lt;TD&amp;gt;This 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.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DTYP&amp;lt;TD&amp;gt;Device Type&amp;lt;TD&amp;gt;This 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.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;MLOK&amp;lt;TD&amp;gt;Monitor Lock&amp;lt;TD&amp;gt;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.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;MLIS&amp;lt;TD&amp;gt;Monitor List&amp;lt;TD&amp;gt;This 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,&amp;amp;amp;data,mask), where &amp;quot;mask&amp;quot; is some combination of DBE_ALARM, DBE_VALUE, and DBE_LOG.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DISP&amp;lt;TD&amp;gt;Disable putFields&amp;lt;TD&amp;gt;If this field is set to TRUE, then all dbPutFields (normally issued by channel access) directed to this record are ignored except to the field DISP itself.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PUTF&amp;lt;TD&amp;gt;dbPutField Process&amp;lt;TD&amp;gt;Did dbPutField cause the current record processing?&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;RPRO&amp;lt;TD&amp;gt;Reprocess&amp;lt;TD&amp;gt;Reprocess record when current processing completes.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ASP&amp;lt;TD&amp;gt;Access Security Private&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PPN&amp;lt;TD&amp;gt;Address of putNotify&amp;lt;TD&amp;gt;Address of putNotify callback.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PPNR&amp;lt;TD&amp;gt;Next Record for putNotify&amp;lt;TD&amp;gt;Next record for PutNotify.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;RDES&amp;lt;TD&amp;gt;Address of dbRecordType&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;TIME&amp;lt;TD&amp;gt;Time&amp;lt;TD&amp;gt;The time when this record was last processed, in standard format.&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
EPICS Record Reference Manual - 19 MAY 1998&lt;/div&gt;</summary>
		<author><name>MichaelDavidsaver</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=RRM_3-14_dbCommon&amp;diff=1870</id>
		<title>RRM 3-14 dbCommon</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=RRM_3-14_dbCommon&amp;diff=1870"/>
		<updated>2010-09-27T19:10:57Z</updated>

		<summary type="html">&lt;p&gt;MichaelDavidsaver: TSEL missing behavour with TIME vs. other fields&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[RRM 3-14|EPICS Record Reference Manual]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fields Common to All Record Types ==&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
This chapter contains a description of fields that are common to all records. These fields are defined in dbcommon.dbd.&lt;br /&gt;
&lt;br /&gt;
=== Scan Fields ===&lt;br /&gt;
&lt;br /&gt;
These fields contain information related to how and when a record processes. For a further explanation of these record processing and these fields, see Scanning Specification, Chapter 1, 1. A few records have unique fields that also affect how they process. These fields, if any, will be listed and explained in the chapter for each record.&lt;br /&gt;
&lt;br /&gt;
==== Field Summary ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TH&amp;gt;Field&amp;lt;TH&amp;gt;Type&amp;lt;TH&amp;gt;DCT&amp;lt;TH&amp;gt;Initial&amp;lt;TH&amp;gt;Access&amp;lt;TH&amp;gt;Modify&amp;lt;TH&amp;gt;Rec Proc Monitor&lt;br /&gt;
&amp;lt;TH&amp;gt;PP&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SCAN&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Passive&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PINI&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PHAS&amp;lt;TD&amp;gt;SHORT&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;EVNT&amp;lt;TD&amp;gt;SHORT&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PRIO&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Low&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DISV&amp;lt;TD&amp;gt;SHORT&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;1&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DISA&amp;lt;TD&amp;gt;SHORT&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SDIS&amp;lt;TD&amp;gt;INLINK&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;N/A&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PROC&amp;lt;TD&amp;gt;UCHAR&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;Yes&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DISS&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No Alarm&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;LCNT&amp;lt;TD&amp;gt;UCHAR&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PACT&amp;lt;TD&amp;gt;UCHAR&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;FLNK&amp;lt;TD&amp;gt;FWDLINK&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Null&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;N/A&amp;lt;TD&amp;gt;No&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SPVT&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;4&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
==== Field Description ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Name&amp;lt;TH&amp;gt;Summary&amp;lt;TH&amp;gt;Description&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SCAN&amp;lt;TD&amp;gt;Scanning Rate&amp;lt;TD&amp;gt;This can be one of the periodic intervals (&amp;lt;CODE&amp;gt;.1 second&amp;lt;/CODE&amp;gt;, &amp;lt;CODE&amp;gt;.2 second&amp;lt;/CODE&amp;gt;, &amp;lt;CODE&amp;gt;.5 second&amp;lt;/CODE&amp;gt;, &amp;lt;CODE&amp;gt;1 second&amp;lt;/CODE&amp;gt;, &amp;lt;CODE&amp;gt;2 second&amp;lt;/CODE&amp;gt;, &amp;lt;CODE&amp;gt;5 second&amp;lt;/CODE&amp;gt;, &amp;lt;CODE&amp;gt;10 second&amp;lt;/CODE&amp;gt;, &amp;lt;CODE&amp;gt;I/O Intr&amp;lt;/CODE&amp;gt;, &amp;lt;CODE&amp;gt;Event&amp;lt;/CODE&amp;gt;, or &amp;lt;CODE&amp;gt;Passive&amp;lt;/CODE&amp;gt;.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PINI&amp;lt;TD&amp;gt;Process at Initialization&amp;lt;TD&amp;gt;If this field is set to YES during database configuration, then the record is processed once at IOC initialization (before the normal scan tasks are started).&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PHAS&amp;lt;TD&amp;gt;Scan Phase Number&amp;lt;TD&amp;gt;This 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 phase number.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;EVNT&amp;lt;TD&amp;gt;Event Number&amp;lt;TD&amp;gt;Event number for scan type SCAN_EVENT. All records with scan type 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)&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PRIO&amp;lt;TD&amp;gt;Priority&amp;lt;TD&amp;gt;Scheduling priority for processing I/O Event scanned records and asynchronous record completion tasks.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DISV&amp;lt;TD&amp;gt;Disable Value&amp;lt;TD&amp;gt;If DISV=DISA, then the record will be disabled, i.e. dbProcess will not process the record.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DISA&amp;lt;TD&amp;gt;Scan Disable Input Link Value&amp;lt;TD&amp;gt;This is the value that is compared with DISV to determine if the record is disabled. Its value 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.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SDIS&amp;lt;TD&amp;gt;Scan Disable Input Link&amp;lt;TD&amp;gt;An input link from which to obtain a value for DISA. This field is ignored unless it is a database link or a channel access link. If it is a database or a channel access link, dbProcess calls dbGetLink to obtain a value for DISA before deciding to call the processing routine.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PROC&amp;lt;TD&amp;gt;Process Record&amp;lt;TD&amp;gt;A record will be processed whenever a dbPutField is directed to this field.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DISS&amp;lt;TD&amp;gt;Disable Alarm Severity&amp;lt;TD&amp;gt;When this record is disabled, it will be put into alarm with this severity and a status of DISABLE_ALARM.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;LSET&amp;lt;TD&amp;gt;Lock Set&amp;lt;TD&amp;gt;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.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;LCNT&amp;lt;TD&amp;gt;Lock Count&amp;lt;TD&amp;gt;The number of times in succession dbProcess finds the record active, i.e. PACT is TRUE. If dbProcess finds the record active MAX_LOCK (currently set to 10) times in succession, it raises a SCAN_ALARM.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PACT&amp;lt;TD&amp;gt;Processing Active&amp;lt;TD&amp;gt;See Application Developers Guide for details on usage. PACT 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.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;FLNK&amp;lt;TD&amp;gt;Forward Link&amp;lt;TD&amp;gt;This field is a database link. If FLNK is specified, processing this record will force a processing of the scan passive forward link record.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SPVT&amp;lt;TD&amp;gt;Scan Private&amp;lt;TD&amp;gt;This field is for private use of the scanning system.&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Alarm Fields ===&lt;br /&gt;
&lt;br /&gt;
These fields indicate the status and severity of alarms, or else determine the how and when alarms are triggered. For a further explanation of database alarms, see Alarm Specification, Chapter 1, 4. Of course, many records have alarm-related fields not common to all records. These fields are listed and explained in the appropriate chapter on each record.&lt;br /&gt;
&lt;br /&gt;
==== Field Summary ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Field&amp;lt;TH&amp;gt;Type&amp;lt;TH&amp;gt;DCT&amp;lt;TH&amp;gt;Initial&amp;lt;TH&amp;gt;Access&amp;lt;TH&amp;gt;Modify&amp;lt;TH&amp;gt;Rec Proc Monitor&amp;lt;TH&amp;gt;PP&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;STAT&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;UDF_ALARM&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SEVR&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;INVALID_ALARM&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;NSTA&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No Alarm&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;NSEV&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No Alarm&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ACKS&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No Alarm&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ACKT&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;UDF&amp;lt;TD&amp;gt;UCHAR&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;1&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;Yes&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Field Description ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Name&amp;lt;TH&amp;gt;Summary&amp;lt;TH&amp;gt;Description&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;STAT&amp;lt;TD&amp;gt;Current Alarm Status&amp;lt;TD rowspan=4&amp;gt;These four fields are the alarm status and severity fields. STAT and SEVR are the values seen outside database access. NSTA and NSEV are the fields the database access, record support, and device support use 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.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SEVR&amp;lt;TD&amp;gt;Current Alarm Severity&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;NSTA&amp;lt;TD&amp;gt;New Alarm Status&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;NSEV&amp;lt;TD&amp;gt;New Alarm Severity&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ACKS&amp;lt;TD&amp;gt;Alarm Acknowledge Severity&amp;lt;TD&amp;gt;Highest severity unacknowledged alarm&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ACKT&amp;lt;TD&amp;gt;Alarm Acknowledge Transient&amp;lt;TD&amp;gt;Is it necessary to acknowledge transient alarms?&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;UDF&amp;lt;TD&amp;gt;VAL Undefined&amp;lt;TD&amp;gt;This indicates that the record has never been processed or its value is UnDeFined. Typically this is caused by a failure in device support, a record that has never been processed, or where 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.&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Device Fields ===&lt;br /&gt;
&lt;br /&gt;
These fields contain information about the device and record support used by a record.&lt;br /&gt;
&lt;br /&gt;
==== Field Summary ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Field&amp;lt;TH&amp;gt;Type&amp;lt;TH&amp;gt;DCT&amp;lt;TH&amp;gt;Initial&amp;lt;TH&amp;gt;Access&amp;lt;TH&amp;gt;Modify&amp;lt;TH&amp;gt;Rec Proc Monitor&amp;lt;TH&amp;gt;PP&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;RSET&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;4&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DSET&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;4&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DPVT&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;4&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Field Description ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Name&amp;lt;TH&amp;gt;Summary&amp;lt;TH&amp;gt;Description&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;RSET&amp;lt;TD&amp;gt;Address of Record Support Entry Table&amp;lt;TD&amp;gt;See Application Developers Guide for details on usage.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DSET&amp;lt;TD&amp;gt;Address of Device Support Entry Table&amp;lt;TD&amp;gt;This address of the device support entry table for this record. The value of this field is determined at IOC initialization time. Record support routines use this field to locate their device support routines.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DPVT&amp;lt;TD&amp;gt;Device Private&amp;lt;TD&amp;gt;This field is for private use of the device support modules.&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Debugging Fields ===&lt;br /&gt;
&lt;br /&gt;
These fields can aid in the debugging process.&lt;br /&gt;
&lt;br /&gt;
==== Field Summary ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Field&amp;lt;TH&amp;gt;Type&amp;lt;TH&amp;gt;DCT&amp;lt;TH&amp;gt;Initial&amp;lt;TH&amp;gt;Access&amp;lt;TH&amp;gt;Modify&amp;lt;TH&amp;gt;Rec Proc Monitor&amp;lt;TH&amp;gt;PP&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;TPRO&amp;lt;TD&amp;gt;UCHAR&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;BKPT&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Field Description ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Name&amp;lt;TH&amp;gt;Summary&amp;lt;TH&amp;gt;Description&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;TPRO&amp;lt;TD&amp;gt;Trace Processing&amp;lt;TD&amp;gt;If this field is set 1, a message is printed each time this record is processed and a message is printed for each record processed as a result of this record being processed&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;BKPT&amp;lt;TD&amp;gt;BreakPoint&amp;lt;TD&amp;gt;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.&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Miscellaneous Fields ===&lt;br /&gt;
&lt;br /&gt;
These are miscellaneous fields common to all record types.&lt;br /&gt;
&lt;br /&gt;
==== Field Summary ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Field&amp;lt;TH&amp;gt;Type&amp;lt;TH&amp;gt;DCT&amp;lt;TH&amp;gt;Initial&amp;lt;TH&amp;gt;Access&amp;lt;TH&amp;gt;Modify&amp;lt;TH&amp;gt;Rec Proc Monitor&amp;lt;TH&amp;gt;PP&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;NAME&amp;lt;TD&amp;gt;STRING [61]&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DESC&amp;lt;TD&amp;gt;STRING [41]&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Null&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ASG&amp;lt;TD&amp;gt;STRING [29]&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Null&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;TSE&amp;lt;TD&amp;gt;SHORT&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;TSEL&amp;lt;TD&amp;gt;INLINK&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Null&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;?&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DTYP&amp;lt;TD&amp;gt;DEVCHOICE&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Soft Record Support&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;MLOK&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;MLIS&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DISP&amp;lt;TD&amp;gt;UCHAR&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PUTF&amp;lt;TD&amp;gt;UCHAR&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;RPRO&amp;lt;TD&amp;gt;UCHAR&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ASP&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;4&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PPN&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;4&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PPNR&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;4&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;RDES&amp;lt;TD&amp;gt;NO_ACCESS&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;TIME&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;8&amp;lt;TD&amp;gt;Option&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Field Description ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Name&amp;lt;TH&amp;gt;Summary&amp;lt;TH&amp;gt;Description&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;NAME&amp;lt;TD&amp;gt;Record Name&amp;lt;TD&amp;gt;A 60 character record name supplied by the application developer.  This name is the means of identifying a specific record. It must have a unique value across all IOCs attached to the same local area subnet, and should use only this limited set of characters: &amp;lt;tt&amp;gt;a-z A-Z 0-9 _ - : [ ] &amp;amp;lt; &amp;amp;gt; ;&amp;lt;/tt&amp;gt;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DESC&amp;lt;TD&amp;gt;Description&amp;lt;TD&amp;gt;An arbitrary 40 character record description supplied by the application developer.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ASG&amp;lt;TD&amp;gt;Access Security Group&amp;lt;TD&amp;gt;A character string value defining the access security group for this record.  If left NULL, the record is placed in group DEFAULT.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;TSE&amp;lt;TD&amp;gt;Time Stamp Event&amp;lt;TD&amp;gt;This 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.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;TSEL&amp;lt;TD&amp;gt;Time Stamp Event Link&amp;lt;TD&amp;gt;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.  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.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DTYP&amp;lt;TD&amp;gt;Device Type&amp;lt;TD&amp;gt;This 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.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;MLOK&amp;lt;TD&amp;gt;Monitor Lock&amp;lt;TD&amp;gt;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.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;MLIS&amp;lt;TD&amp;gt;Monitor List&amp;lt;TD&amp;gt;This 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,&amp;amp;amp;data,mask), where &amp;quot;mask&amp;quot; is some combination of DBE_ALARM, DBE_VALUE, and DBE_LOG.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DISP&amp;lt;TD&amp;gt;Disable putFields&amp;lt;TD&amp;gt;If this field is set to TRUE, then all dbPutFields (normally issued by channel access) directed to this record are ignored except to the field DISP itself.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PUTF&amp;lt;TD&amp;gt;dbPutField Process&amp;lt;TD&amp;gt;Did dbPutField cause the current record processing?&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;RPRO&amp;lt;TD&amp;gt;Reprocess&amp;lt;TD&amp;gt;Reprocess record when current processing completes.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ASP&amp;lt;TD&amp;gt;Access Security Private&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PPN&amp;lt;TD&amp;gt;Address of putNotify&amp;lt;TD&amp;gt;Address of putNotify callback.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PPNR&amp;lt;TD&amp;gt;Next Record for putNotify&amp;lt;TD&amp;gt;Next record for PutNotify.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;RDES&amp;lt;TD&amp;gt;Address of dbRecordType&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;TIME&amp;lt;TD&amp;gt;Time&amp;lt;TD&amp;gt;The time when this record was last processed, in standard format.&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
EPICS Record Reference Manual - 19 MAY 1998&lt;/div&gt;</summary>
		<author><name>MichaelDavidsaver</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=RRM_3-14_dbCommon&amp;diff=1869</id>
		<title>RRM 3-14 dbCommon</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=RRM_3-14_dbCommon&amp;diff=1869"/>
		<updated>2010-09-17T15:48:52Z</updated>

		<summary type="html">&lt;p&gt;MichaelDavidsaver: TSE field special values are negative (-1 and -2)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[RRM 3-14|EPICS Record Reference Manual]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fields Common to All Record Types ==&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
This chapter contains a description of fields that are common to all records. These fields are defined in dbcommon.dbd.&lt;br /&gt;
&lt;br /&gt;
=== Scan Fields ===&lt;br /&gt;
&lt;br /&gt;
These fields contain information related to how and when a record processes. For a further explanation of these record processing and these fields, see Scanning Specification, Chapter 1, 1. A few records have unique fields that also affect how they process. These fields, if any, will be listed and explained in the chapter for each record.&lt;br /&gt;
&lt;br /&gt;
==== Field Summary ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TH&amp;gt;Field&amp;lt;TH&amp;gt;Type&amp;lt;TH&amp;gt;DCT&amp;lt;TH&amp;gt;Initial&amp;lt;TH&amp;gt;Access&amp;lt;TH&amp;gt;Modify&amp;lt;TH&amp;gt;Rec Proc Monitor&lt;br /&gt;
&amp;lt;TH&amp;gt;PP&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SCAN&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Passive&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PINI&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PHAS&amp;lt;TD&amp;gt;SHORT&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;EVNT&amp;lt;TD&amp;gt;SHORT&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PRIO&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Low&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DISV&amp;lt;TD&amp;gt;SHORT&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;1&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DISA&amp;lt;TD&amp;gt;SHORT&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SDIS&amp;lt;TD&amp;gt;INLINK&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;N/A&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PROC&amp;lt;TD&amp;gt;UCHAR&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;Yes&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DISS&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No Alarm&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;LCNT&amp;lt;TD&amp;gt;UCHAR&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PACT&amp;lt;TD&amp;gt;UCHAR&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;FLNK&amp;lt;TD&amp;gt;FWDLINK&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Null&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;N/A&amp;lt;TD&amp;gt;No&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SPVT&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;4&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
==== Field Description ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Name&amp;lt;TH&amp;gt;Summary&amp;lt;TH&amp;gt;Description&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SCAN&amp;lt;TD&amp;gt;Scanning Rate&amp;lt;TD&amp;gt;This can be one of the periodic intervals (&amp;lt;CODE&amp;gt;.1 second&amp;lt;/CODE&amp;gt;, &amp;lt;CODE&amp;gt;.2 second&amp;lt;/CODE&amp;gt;, &amp;lt;CODE&amp;gt;.5 second&amp;lt;/CODE&amp;gt;, &amp;lt;CODE&amp;gt;1 second&amp;lt;/CODE&amp;gt;, &amp;lt;CODE&amp;gt;2 second&amp;lt;/CODE&amp;gt;, &amp;lt;CODE&amp;gt;5 second&amp;lt;/CODE&amp;gt;, &amp;lt;CODE&amp;gt;10 second&amp;lt;/CODE&amp;gt;, &amp;lt;CODE&amp;gt;I/O Intr&amp;lt;/CODE&amp;gt;, &amp;lt;CODE&amp;gt;Event&amp;lt;/CODE&amp;gt;, or &amp;lt;CODE&amp;gt;Passive&amp;lt;/CODE&amp;gt;.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PINI&amp;lt;TD&amp;gt;Process at Initialization&amp;lt;TD&amp;gt;If this field is set to YES during database configuration, then the record is processed once at IOC initialization (before the normal scan tasks are started).&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PHAS&amp;lt;TD&amp;gt;Scan Phase Number&amp;lt;TD&amp;gt;This 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 phase number.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;EVNT&amp;lt;TD&amp;gt;Event Number&amp;lt;TD&amp;gt;Event number for scan type SCAN_EVENT. All records with scan type 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)&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PRIO&amp;lt;TD&amp;gt;Priority&amp;lt;TD&amp;gt;Scheduling priority for processing I/O Event scanned records and asynchronous record completion tasks.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DISV&amp;lt;TD&amp;gt;Disable Value&amp;lt;TD&amp;gt;If DISV=DISA, then the record will be disabled, i.e. dbProcess will not process the record.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DISA&amp;lt;TD&amp;gt;Scan Disable Input Link Value&amp;lt;TD&amp;gt;This is the value that is compared with DISV to determine if the record is disabled. Its value 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.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SDIS&amp;lt;TD&amp;gt;Scan Disable Input Link&amp;lt;TD&amp;gt;An input link from which to obtain a value for DISA. This field is ignored unless it is a database link or a channel access link. If it is a database or a channel access link, dbProcess calls dbGetLink to obtain a value for DISA before deciding to call the processing routine.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PROC&amp;lt;TD&amp;gt;Process Record&amp;lt;TD&amp;gt;A record will be processed whenever a dbPutField is directed to this field.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DISS&amp;lt;TD&amp;gt;Disable Alarm Severity&amp;lt;TD&amp;gt;When this record is disabled, it will be put into alarm with this severity and a status of DISABLE_ALARM.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;LSET&amp;lt;TD&amp;gt;Lock Set&amp;lt;TD&amp;gt;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.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;LCNT&amp;lt;TD&amp;gt;Lock Count&amp;lt;TD&amp;gt;The number of times in succession dbProcess finds the record active, i.e. PACT is TRUE. If dbProcess finds the record active MAX_LOCK (currently set to 10) times in succession, it raises a SCAN_ALARM.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PACT&amp;lt;TD&amp;gt;Processing Active&amp;lt;TD&amp;gt;See Application Developers Guide for details on usage. PACT 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.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;FLNK&amp;lt;TD&amp;gt;Forward Link&amp;lt;TD&amp;gt;This field is a database link. If FLNK is specified, processing this record will force a processing of the scan passive forward link record.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SPVT&amp;lt;TD&amp;gt;Scan Private&amp;lt;TD&amp;gt;This field is for private use of the scanning system.&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Alarm Fields ===&lt;br /&gt;
&lt;br /&gt;
These fields indicate the status and severity of alarms, or else determine the how and when alarms are triggered. For a further explanation of database alarms, see Alarm Specification, Chapter 1, 4. Of course, many records have alarm-related fields not common to all records. These fields are listed and explained in the appropriate chapter on each record.&lt;br /&gt;
&lt;br /&gt;
==== Field Summary ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Field&amp;lt;TH&amp;gt;Type&amp;lt;TH&amp;gt;DCT&amp;lt;TH&amp;gt;Initial&amp;lt;TH&amp;gt;Access&amp;lt;TH&amp;gt;Modify&amp;lt;TH&amp;gt;Rec Proc Monitor&amp;lt;TH&amp;gt;PP&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;STAT&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;UDF_ALARM&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SEVR&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;INVALID_ALARM&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;NSTA&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No Alarm&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;NSEV&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No Alarm&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ACKS&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No Alarm&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ACKT&amp;lt;TD&amp;gt;GBLCHOICE&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;UDF&amp;lt;TD&amp;gt;UCHAR&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;1&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;Yes&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Field Description ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Name&amp;lt;TH&amp;gt;Summary&amp;lt;TH&amp;gt;Description&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;STAT&amp;lt;TD&amp;gt;Current Alarm Status&amp;lt;TD rowspan=4&amp;gt;These four fields are the alarm status and severity fields. STAT and SEVR are the values seen outside database access. NSTA and NSEV are the fields the database access, record support, and device support use 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.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SEVR&amp;lt;TD&amp;gt;Current Alarm Severity&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;NSTA&amp;lt;TD&amp;gt;New Alarm Status&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;NSEV&amp;lt;TD&amp;gt;New Alarm Severity&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ACKS&amp;lt;TD&amp;gt;Alarm Acknowledge Severity&amp;lt;TD&amp;gt;Highest severity unacknowledged alarm&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ACKT&amp;lt;TD&amp;gt;Alarm Acknowledge Transient&amp;lt;TD&amp;gt;Is it necessary to acknowledge transient alarms?&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;UDF&amp;lt;TD&amp;gt;VAL Undefined&amp;lt;TD&amp;gt;This indicates that the record has never been processed or its value is UnDeFined. Typically this is caused by a failure in device support, a record that has never been processed, or where 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.&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Device Fields ===&lt;br /&gt;
&lt;br /&gt;
These fields contain information about the device and record support used by a record.&lt;br /&gt;
&lt;br /&gt;
==== Field Summary ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Field&amp;lt;TH&amp;gt;Type&amp;lt;TH&amp;gt;DCT&amp;lt;TH&amp;gt;Initial&amp;lt;TH&amp;gt;Access&amp;lt;TH&amp;gt;Modify&amp;lt;TH&amp;gt;Rec Proc Monitor&amp;lt;TH&amp;gt;PP&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;RSET&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;4&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DSET&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;4&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DPVT&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;4&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Field Description ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Name&amp;lt;TH&amp;gt;Summary&amp;lt;TH&amp;gt;Description&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;RSET&amp;lt;TD&amp;gt;Address of Record Support Entry Table&amp;lt;TD&amp;gt;See Application Developers Guide for details on usage.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DSET&amp;lt;TD&amp;gt;Address of Device Support Entry Table&amp;lt;TD&amp;gt;This address of the device support entry table for this record. The value of this field is determined at IOC initialization time. Record support routines use this field to locate their device support routines.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DPVT&amp;lt;TD&amp;gt;Device Private&amp;lt;TD&amp;gt;This field is for private use of the device support modules.&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Debugging Fields ===&lt;br /&gt;
&lt;br /&gt;
These fields can aid in the debugging process.&lt;br /&gt;
&lt;br /&gt;
==== Field Summary ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Field&amp;lt;TH&amp;gt;Type&amp;lt;TH&amp;gt;DCT&amp;lt;TH&amp;gt;Initial&amp;lt;TH&amp;gt;Access&amp;lt;TH&amp;gt;Modify&amp;lt;TH&amp;gt;Rec Proc Monitor&amp;lt;TH&amp;gt;PP&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;TPRO&amp;lt;TD&amp;gt;UCHAR&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;BKPT&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Field Description ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Name&amp;lt;TH&amp;gt;Summary&amp;lt;TH&amp;gt;Description&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;TPRO&amp;lt;TD&amp;gt;Trace Processing&amp;lt;TD&amp;gt;If this field is set 1, a message is printed each time this record is processed and a message is printed for each record processed as a result of this record being processed&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;BKPT&amp;lt;TD&amp;gt;BreakPoint&amp;lt;TD&amp;gt;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.&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Miscellaneous Fields ===&lt;br /&gt;
&lt;br /&gt;
These are miscellaneous fields common to all record types.&lt;br /&gt;
&lt;br /&gt;
==== Field Summary ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Field&amp;lt;TH&amp;gt;Type&amp;lt;TH&amp;gt;DCT&amp;lt;TH&amp;gt;Initial&amp;lt;TH&amp;gt;Access&amp;lt;TH&amp;gt;Modify&amp;lt;TH&amp;gt;Rec Proc Monitor&amp;lt;TH&amp;gt;PP&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;NAME&amp;lt;TD&amp;gt;STRING [61]&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DESC&amp;lt;TD&amp;gt;STRING [41]&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Null&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ASG&amp;lt;TD&amp;gt;STRING [29]&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Null&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;TSE&amp;lt;TD&amp;gt;SHORT&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;TSEL&amp;lt;TD&amp;gt;INLINK&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Null&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;?&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DTYP&amp;lt;TD&amp;gt;DEVCHOICE&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Soft Record Support&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;MLOK&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;MLIS&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DISP&amp;lt;TD&amp;gt;UCHAR&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PUTF&amp;lt;TD&amp;gt;UCHAR&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;RPRO&amp;lt;TD&amp;gt;UCHAR&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ASP&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;4&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PPN&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;4&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PPNR&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;4&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;RDES&amp;lt;TD&amp;gt;NO_ACCESS&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;TIME&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;8&amp;lt;TD&amp;gt;Option&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Field Description ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;TH&amp;gt;Name&amp;lt;TH&amp;gt;Summary&amp;lt;TH&amp;gt;Description&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;NAME&amp;lt;TD&amp;gt;Record Name&amp;lt;TD&amp;gt;A 60 character record name supplied by the application developer.  This name is the means of identifying a specific record. It must have a unique value across all IOCs attached to the same local area subnet, and should use only this limited set of characters: &amp;lt;tt&amp;gt;a-z A-Z 0-9 _ - : [ ] &amp;amp;lt; &amp;amp;gt; ;&amp;lt;/tt&amp;gt;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DESC&amp;lt;TD&amp;gt;Description&amp;lt;TD&amp;gt;An arbitrary 40 character record description supplied by the application developer.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ASG&amp;lt;TD&amp;gt;Access Security Group&amp;lt;TD&amp;gt;A character string value defining the access security group for this record.  If left NULL, the record is placed in group DEFAULT.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;TSE&amp;lt;TD&amp;gt;Time Stamp Event&amp;lt;TD&amp;gt;This 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.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;TSEL&amp;lt;TD&amp;gt;Time Stamp Event Link&amp;lt;TD&amp;gt;An input link for obtaining the time stamp. If this link is defined the time stamp of the referenced record becomes the time stamp for this record as well. This mechanism allows things like calculation records to use the time stamp from a device support routine that has an event time stamp for instance.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DTYP&amp;lt;TD&amp;gt;Device Type&amp;lt;TD&amp;gt;This 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.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;MLOK&amp;lt;TD&amp;gt;Monitor Lock&amp;lt;TD&amp;gt;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.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;MLIS&amp;lt;TD&amp;gt;Monitor List&amp;lt;TD&amp;gt;This 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,&amp;amp;amp;data,mask), where &amp;quot;mask&amp;quot; is some combination of DBE_ALARM, DBE_VALUE, and DBE_LOG.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DISP&amp;lt;TD&amp;gt;Disable putFields&amp;lt;TD&amp;gt;If this field is set to TRUE, then all dbPutFields (normally issued by channel access) directed to this record are ignored except to the field DISP itself.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PUTF&amp;lt;TD&amp;gt;dbPutField Process&amp;lt;TD&amp;gt;Did dbPutField cause the current record processing?&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;RPRO&amp;lt;TD&amp;gt;Reprocess&amp;lt;TD&amp;gt;Reprocess record when current processing completes.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ASP&amp;lt;TD&amp;gt;Access Security Private&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PPN&amp;lt;TD&amp;gt;Address of putNotify&amp;lt;TD&amp;gt;Address of putNotify callback.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PPNR&amp;lt;TD&amp;gt;Next Record for putNotify&amp;lt;TD&amp;gt;Next record for PutNotify.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;RDES&amp;lt;TD&amp;gt;Address of dbRecordType&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;TIME&amp;lt;TD&amp;gt;Time&amp;lt;TD&amp;gt;The time when this record was last processed, in standard format.&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
EPICS Record Reference Manual - 19 MAY 1998&lt;/div&gt;</summary>
		<author><name>MichaelDavidsaver</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=Epicsparamconf&amp;diff=2935</id>
		<title>Epicsparamconf</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=Epicsparamconf&amp;diff=2935"/>
		<updated>2010-06-29T18:00:14Z</updated>

		<summary type="html">&lt;p&gt;MichaelDavidsaver: /* INI style section headers '\s*\^\+\]\s*$' */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= EPICS Config Parameters API =&lt;br /&gt;
&lt;br /&gt;
Author: Michael Davidsaver &amp;lt;mdavidsaver@bnl.gov&amp;gt;&lt;br /&gt;
Date: June 2010&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Proposal for 3.15 series&lt;br /&gt;
&lt;br /&gt;
Replace the API in envDefs.h with a more general purpose startup config.&lt;br /&gt;
&lt;br /&gt;
* New parameters can be created at runtime by applications outside of Base (ie EDM).&lt;br /&gt;
* Provide a specification for a configuration mechanism which can be shared by  all EPICS implimentations.&lt;br /&gt;
* Values will be taken from configuration file(s) in addition to the nvironment.&lt;br /&gt;
* Supports types: String, Int32, Double, and InetAddr (IPv4).&lt;br /&gt;
* Transparent handling of parameter arrays.&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
=== Types ===&lt;br /&gt;
&lt;br /&gt;
 enum paramType {&lt;br /&gt;
     paramTypeInvalid,&lt;br /&gt;
     paramTypeString,&lt;br /&gt;
     paramTypeInt32,&lt;br /&gt;
     paramTypeDouble,&lt;br /&gt;
     paramTypeInetAddr&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
=== Creation ===&lt;br /&gt;
&lt;br /&gt;
 int&lt;br /&gt;
 paramArrayCreate(const char* name, paramType tp, epicsUInt32 maxelem, char sep, epicsUInt32 opt);&lt;br /&gt;
&lt;br /&gt;
 #define paramCreate(name,tp,opt) paramArrayCreate(name,tp,1,NULL,opt)&lt;br /&gt;
&lt;br /&gt;
Creates a new parameter with the given value type.  If number of elements is &amp;gt;1 and&lt;br /&gt;
a separator string is not given then the default separator (OS dependent) is used.&lt;br /&gt;
&lt;br /&gt;
The bit mask 'opt' defines the following bits.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!bit #&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Include environment variable in search path&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Store value in environment variable&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Don't strip leading and trailing whitespace&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Allow the value to be modified/reread (use carefully)&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Debug print when searching&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RETURN ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Code&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Ok&lt;br /&gt;
|-&lt;br /&gt;
| -1&lt;br /&gt;
|parameter name already exists&lt;br /&gt;
|-&lt;br /&gt;
| -2&lt;br /&gt;
|Invalid arguments (ie nelem==0)&lt;br /&gt;
|-&lt;br /&gt;
| -3&lt;br /&gt;
|Insufficient memory&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Setting ===&lt;br /&gt;
&lt;br /&gt;
 int&lt;br /&gt;
 paramArraySetString(const char* name, epicsUInt32 nelem, const char* const* val, epicsUInt32 opt)&lt;br /&gt;
 /* 3 more for other types */&lt;br /&gt;
&lt;br /&gt;
 #define paramSetString(name, val, opt) paramArraySetString(name, 1, &amp;amp;(val), opt)&lt;br /&gt;
 /* 3 more for other types */&lt;br /&gt;
&lt;br /&gt;
Sets the value of an already created parameter.  A value of NULL will clear the&lt;br /&gt;
parameter value/default.&lt;br /&gt;
&lt;br /&gt;
The bit mask 'opt' defines the following bits.&lt;br /&gt;
&lt;br /&gt;
bit #&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!bit #&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Set default.  Overwrite the default value instead of the final value.&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Allow the value to be modified/reread (use carefully)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RETURN ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Code&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Ok&lt;br /&gt;
|-&lt;br /&gt;
| -1&lt;br /&gt;
|parameter name does not exist&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Getting ===&lt;br /&gt;
&lt;br /&gt;
 extern const void* paramNone;&lt;br /&gt;
 extern const void* paramConvertFail;&lt;br /&gt;
 extern const void* paramNotReal;&lt;br /&gt;
&lt;br /&gt;
 INLINE epicsBoolean&lt;br /&gt;
 paramValidValue(const void* V)&lt;br /&gt;
 {&lt;br /&gt;
   switch(V) {&lt;br /&gt;
   case NULL:&lt;br /&gt;
   case paramNone:&lt;br /&gt;
   case paramConvertFail:&lt;br /&gt;
   case paramNotReal:&lt;br /&gt;
     return epicsFalse;&lt;br /&gt;
   default:&lt;br /&gt;
     return epicsTrue;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 const char* const*&lt;br /&gt;
 paramArrayGetString(const char* name, epicsUInt32 *nelem, epicsUInt32 opt);&lt;br /&gt;
 /* 3 more for other types */&lt;br /&gt;
&lt;br /&gt;
 INLINE const char*&lt;br /&gt;
 paramGetString(const char* name, epicsUInt32 opt)&lt;br /&gt;
 {&lt;br /&gt;
   epicsUInt32 N;&lt;br /&gt;
   const char* const* V=paramArrayGetString(name, 1, opt);&lt;br /&gt;
   if (!paramValidValue((const void*)V)) return (const char*)V;&lt;br /&gt;
   else return *V;&lt;br /&gt;
 }&lt;br /&gt;
 /* 3 more for other types */&lt;br /&gt;
&lt;br /&gt;
Gets the value of an already created parameter&lt;br /&gt;
&lt;br /&gt;
Note: Type-safe Getters will also be provided (ie paramArrayGetDouble())&lt;br /&gt;
&lt;br /&gt;
Note: Type paramTypeString returns C type const char* const*.&lt;br /&gt;
&lt;br /&gt;
The bit mask 'opt' defines the following bits.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!bit #&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Allow the value to be modified/reread (use carefully)&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Debug print when searching&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RETURN ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Code&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|paramNone&lt;br /&gt;
|Value not found&lt;br /&gt;
|-&lt;br /&gt;
|paramNotReal&lt;br /&gt;
|Parameter name does not exist&lt;br /&gt;
|-&lt;br /&gt;
|paramConvertFail&lt;br /&gt;
|Value could not be converted to requested type&lt;br /&gt;
|-&lt;br /&gt;
|NULL&lt;br /&gt;
|Zero length array (nelems also set to 0)&lt;br /&gt;
|-&lt;br /&gt;
|others&lt;br /&gt;
|Value pointer (dependent of type)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Misc ===&lt;br /&gt;
&lt;br /&gt;
 paramType&lt;br /&gt;
 paramGetType(const char* name);&lt;br /&gt;
&lt;br /&gt;
Get type of parameter or paramTypeInvalid if parameter does not exist.&lt;br /&gt;
&lt;br /&gt;
 epicsUInt32&lt;br /&gt;
 paramGetNElem(const char* name);&lt;br /&gt;
&lt;br /&gt;
Get number of entries or 0 if parameter does not exist (use paramGetType()&lt;br /&gt;
to distinguish between a 0 length array and an invalid name).&lt;br /&gt;
&lt;br /&gt;
 char&lt;br /&gt;
 paramGetSep(const char* name);&lt;br /&gt;
&lt;br /&gt;
Get seperator string or NULL if parameter does not exist.&lt;br /&gt;
&lt;br /&gt;
 void&lt;br /&gt;
 paramVisitAll(void *arg, void (*fnptr)(void*, const char* name));&lt;br /&gt;
&lt;br /&gt;
Get a callback for each parameter.&lt;br /&gt;
&lt;br /&gt;
 void&lt;br /&gt;
 paramShowAll(int verbose);&lt;br /&gt;
&lt;br /&gt;
Print parameter info to standard out.  Argument controls verbosity (larger -&amp;gt; more detail).&lt;br /&gt;
&lt;br /&gt;
== Values ==&lt;br /&gt;
&lt;br /&gt;
All values are stored as strings, but may be requested as any type.&lt;br /&gt;
&lt;br /&gt;
Parameters can have the special value paramNone.  This is distinct from a zero length array.&lt;br /&gt;
When created all parameters initially have paramNone as a default value.&lt;br /&gt;
&lt;br /&gt;
== Value Reread ==&lt;br /&gt;
&lt;br /&gt;
The value of a parameter is determined when its value is retrieved with paramArrayGet()&lt;br /&gt;
and stored for future use.  Unless the reread option is given further calls to paramArrayGet()&lt;br /&gt;
will return the same value.  If the reread option is given then paramArrayGet() will&lt;br /&gt;
start a new search and store the (possible different) value for future use.&lt;br /&gt;
&lt;br /&gt;
If a parameter is ever to be reread then the reread option must be given when&lt;br /&gt;
the parameter is created.&lt;br /&gt;
&lt;br /&gt;
Note: Rereading a parameter invalidates all value pointers previously returned.&lt;br /&gt;
&lt;br /&gt;
== Search Path ==&lt;br /&gt;
&lt;br /&gt;
Value may be found in the following locations.  The first value found will be used.&lt;br /&gt;
&lt;br /&gt;
# Current value&lt;br /&gt;
# Environment&lt;br /&gt;
# Files (OS dependent)&lt;br /&gt;
# Default value&lt;br /&gt;
&lt;br /&gt;
The file search path is defined by the environment variable (EPICS_CONF_PATH).&lt;br /&gt;
The default value is set in CONFIG_ENV at compile time.  Since this parameter&lt;br /&gt;
is read before the first file is searched it can not be specified in a file.&lt;br /&gt;
&lt;br /&gt;
Entries in the search path may use arbitrary environment variables (macLib syntax).&lt;br /&gt;
&lt;br /&gt;
=== Default UNIX-like search path ===&lt;br /&gt;
&lt;br /&gt;
# ./epics.conf&lt;br /&gt;
# $HOME/epics.conf&lt;br /&gt;
# $EPICS_BASE/epics.conf&lt;br /&gt;
# /etc/epics.conf&lt;br /&gt;
&lt;br /&gt;
=== Default Windows search path ===&lt;br /&gt;
&lt;br /&gt;
# .\epics.conf&lt;br /&gt;
# $USERPROFILE\epics.conf&lt;br /&gt;
# $EPICS_BASE\epics.conf&lt;br /&gt;
# $ALLUSERSPROFILE\epics.conf&lt;br /&gt;
&lt;br /&gt;
==== On windows xp ====&lt;br /&gt;
&lt;br /&gt;
 USERPROFILE=C:\Documents and Settings\username&lt;br /&gt;
 ALLUSERSPROFILE=C:\Documents and Settings\All Users&lt;br /&gt;
&lt;br /&gt;
==== On windows vista/7 ====&lt;br /&gt;
&lt;br /&gt;
 USERPROFILE=C:\Users\username&lt;br /&gt;
 ALLUSERSPROFILE=C:\ProgramData&lt;br /&gt;
&lt;br /&gt;
=== Default VxWorks and RTEMS search path ===&lt;br /&gt;
&lt;br /&gt;
None&lt;br /&gt;
&lt;br /&gt;
== Config File Syntax ==&lt;br /&gt;
&lt;br /&gt;
Files specifying parameter values shall have lines of the following format.&lt;br /&gt;
Lines may be seperated by one of the valid EOL combinations (cr, lf, cr+lf, lf+cr).&lt;br /&gt;
&lt;br /&gt;
=== Blank lines '^\s*$' ===&lt;br /&gt;
&lt;br /&gt;
Ignored&lt;br /&gt;
&lt;br /&gt;
=== Comments '^\s*#.*$' ===&lt;br /&gt;
&lt;br /&gt;
Ignored&lt;br /&gt;
&lt;br /&gt;
=== key value pairs '^\s*[^\s=]+\s*=.*$' ===&lt;br /&gt;
&lt;br /&gt;
When parsing files key names can contain any non-whitespace charactor except '='.&lt;br /&gt;
However, keys being stored in the environment must also be valid environment variable names.&lt;br /&gt;
&lt;br /&gt;
=== INI style section headers '\s*\[ [^\] ]+\]\s*$' ===&lt;br /&gt;
&lt;br /&gt;
Reserved for future use.  Parsing stops when the first section header is found.&lt;/div&gt;</summary>
		<author><name>MichaelDavidsaver</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=Epicsparamconf&amp;diff=1859</id>
		<title>Epicsparamconf</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=Epicsparamconf&amp;diff=1859"/>
		<updated>2010-06-29T17:59:29Z</updated>

		<summary type="html">&lt;p&gt;MichaelDavidsaver: /* INI style section headers '\s*\[[^\[]+\]\s*$' */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= EPICS Config Parameters API =&lt;br /&gt;
&lt;br /&gt;
Author: Michael Davidsaver &amp;lt;mdavidsaver@bnl.gov&amp;gt;&lt;br /&gt;
Date: June 2010&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Proposal for 3.15 series&lt;br /&gt;
&lt;br /&gt;
Replace the API in envDefs.h with a more general purpose startup config.&lt;br /&gt;
&lt;br /&gt;
* New parameters can be created at runtime by applications outside of Base (ie EDM).&lt;br /&gt;
* Provide a specification for a configuration mechanism which can be shared by  all EPICS implimentations.&lt;br /&gt;
* Values will be taken from configuration file(s) in addition to the nvironment.&lt;br /&gt;
* Supports types: String, Int32, Double, and InetAddr (IPv4).&lt;br /&gt;
* Transparent handling of parameter arrays.&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
=== Types ===&lt;br /&gt;
&lt;br /&gt;
 enum paramType {&lt;br /&gt;
     paramTypeInvalid,&lt;br /&gt;
     paramTypeString,&lt;br /&gt;
     paramTypeInt32,&lt;br /&gt;
     paramTypeDouble,&lt;br /&gt;
     paramTypeInetAddr&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
=== Creation ===&lt;br /&gt;
&lt;br /&gt;
 int&lt;br /&gt;
 paramArrayCreate(const char* name, paramType tp, epicsUInt32 maxelem, char sep, epicsUInt32 opt);&lt;br /&gt;
&lt;br /&gt;
 #define paramCreate(name,tp,opt) paramArrayCreate(name,tp,1,NULL,opt)&lt;br /&gt;
&lt;br /&gt;
Creates a new parameter with the given value type.  If number of elements is &amp;gt;1 and&lt;br /&gt;
a separator string is not given then the default separator (OS dependent) is used.&lt;br /&gt;
&lt;br /&gt;
The bit mask 'opt' defines the following bits.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!bit #&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Include environment variable in search path&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Store value in environment variable&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Don't strip leading and trailing whitespace&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Allow the value to be modified/reread (use carefully)&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Debug print when searching&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RETURN ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Code&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Ok&lt;br /&gt;
|-&lt;br /&gt;
| -1&lt;br /&gt;
|parameter name already exists&lt;br /&gt;
|-&lt;br /&gt;
| -2&lt;br /&gt;
|Invalid arguments (ie nelem==0)&lt;br /&gt;
|-&lt;br /&gt;
| -3&lt;br /&gt;
|Insufficient memory&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Setting ===&lt;br /&gt;
&lt;br /&gt;
 int&lt;br /&gt;
 paramArraySetString(const char* name, epicsUInt32 nelem, const char* const* val, epicsUInt32 opt)&lt;br /&gt;
 /* 3 more for other types */&lt;br /&gt;
&lt;br /&gt;
 #define paramSetString(name, val, opt) paramArraySetString(name, 1, &amp;amp;(val), opt)&lt;br /&gt;
 /* 3 more for other types */&lt;br /&gt;
&lt;br /&gt;
Sets the value of an already created parameter.  A value of NULL will clear the&lt;br /&gt;
parameter value/default.&lt;br /&gt;
&lt;br /&gt;
The bit mask 'opt' defines the following bits.&lt;br /&gt;
&lt;br /&gt;
bit #&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!bit #&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Set default.  Overwrite the default value instead of the final value.&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Allow the value to be modified/reread (use carefully)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RETURN ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Code&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Ok&lt;br /&gt;
|-&lt;br /&gt;
| -1&lt;br /&gt;
|parameter name does not exist&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Getting ===&lt;br /&gt;
&lt;br /&gt;
 extern const void* paramNone;&lt;br /&gt;
 extern const void* paramConvertFail;&lt;br /&gt;
 extern const void* paramNotReal;&lt;br /&gt;
&lt;br /&gt;
 INLINE epicsBoolean&lt;br /&gt;
 paramValidValue(const void* V)&lt;br /&gt;
 {&lt;br /&gt;
   switch(V) {&lt;br /&gt;
   case NULL:&lt;br /&gt;
   case paramNone:&lt;br /&gt;
   case paramConvertFail:&lt;br /&gt;
   case paramNotReal:&lt;br /&gt;
     return epicsFalse;&lt;br /&gt;
   default:&lt;br /&gt;
     return epicsTrue;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 const char* const*&lt;br /&gt;
 paramArrayGetString(const char* name, epicsUInt32 *nelem, epicsUInt32 opt);&lt;br /&gt;
 /* 3 more for other types */&lt;br /&gt;
&lt;br /&gt;
 INLINE const char*&lt;br /&gt;
 paramGetString(const char* name, epicsUInt32 opt)&lt;br /&gt;
 {&lt;br /&gt;
   epicsUInt32 N;&lt;br /&gt;
   const char* const* V=paramArrayGetString(name, 1, opt);&lt;br /&gt;
   if (!paramValidValue((const void*)V)) return (const char*)V;&lt;br /&gt;
   else return *V;&lt;br /&gt;
 }&lt;br /&gt;
 /* 3 more for other types */&lt;br /&gt;
&lt;br /&gt;
Gets the value of an already created parameter&lt;br /&gt;
&lt;br /&gt;
Note: Type-safe Getters will also be provided (ie paramArrayGetDouble())&lt;br /&gt;
&lt;br /&gt;
Note: Type paramTypeString returns C type const char* const*.&lt;br /&gt;
&lt;br /&gt;
The bit mask 'opt' defines the following bits.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!bit #&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Allow the value to be modified/reread (use carefully)&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Debug print when searching&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RETURN ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Code&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|paramNone&lt;br /&gt;
|Value not found&lt;br /&gt;
|-&lt;br /&gt;
|paramNotReal&lt;br /&gt;
|Parameter name does not exist&lt;br /&gt;
|-&lt;br /&gt;
|paramConvertFail&lt;br /&gt;
|Value could not be converted to requested type&lt;br /&gt;
|-&lt;br /&gt;
|NULL&lt;br /&gt;
|Zero length array (nelems also set to 0)&lt;br /&gt;
|-&lt;br /&gt;
|others&lt;br /&gt;
|Value pointer (dependent of type)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Misc ===&lt;br /&gt;
&lt;br /&gt;
 paramType&lt;br /&gt;
 paramGetType(const char* name);&lt;br /&gt;
&lt;br /&gt;
Get type of parameter or paramTypeInvalid if parameter does not exist.&lt;br /&gt;
&lt;br /&gt;
 epicsUInt32&lt;br /&gt;
 paramGetNElem(const char* name);&lt;br /&gt;
&lt;br /&gt;
Get number of entries or 0 if parameter does not exist (use paramGetType()&lt;br /&gt;
to distinguish between a 0 length array and an invalid name).&lt;br /&gt;
&lt;br /&gt;
 char&lt;br /&gt;
 paramGetSep(const char* name);&lt;br /&gt;
&lt;br /&gt;
Get seperator string or NULL if parameter does not exist.&lt;br /&gt;
&lt;br /&gt;
 void&lt;br /&gt;
 paramVisitAll(void *arg, void (*fnptr)(void*, const char* name));&lt;br /&gt;
&lt;br /&gt;
Get a callback for each parameter.&lt;br /&gt;
&lt;br /&gt;
 void&lt;br /&gt;
 paramShowAll(int verbose);&lt;br /&gt;
&lt;br /&gt;
Print parameter info to standard out.  Argument controls verbosity (larger -&amp;gt; more detail).&lt;br /&gt;
&lt;br /&gt;
== Values ==&lt;br /&gt;
&lt;br /&gt;
All values are stored as strings, but may be requested as any type.&lt;br /&gt;
&lt;br /&gt;
Parameters can have the special value paramNone.  This is distinct from a zero length array.&lt;br /&gt;
When created all parameters initially have paramNone as a default value.&lt;br /&gt;
&lt;br /&gt;
== Value Reread ==&lt;br /&gt;
&lt;br /&gt;
The value of a parameter is determined when its value is retrieved with paramArrayGet()&lt;br /&gt;
and stored for future use.  Unless the reread option is given further calls to paramArrayGet()&lt;br /&gt;
will return the same value.  If the reread option is given then paramArrayGet() will&lt;br /&gt;
start a new search and store the (possible different) value for future use.&lt;br /&gt;
&lt;br /&gt;
If a parameter is ever to be reread then the reread option must be given when&lt;br /&gt;
the parameter is created.&lt;br /&gt;
&lt;br /&gt;
Note: Rereading a parameter invalidates all value pointers previously returned.&lt;br /&gt;
&lt;br /&gt;
== Search Path ==&lt;br /&gt;
&lt;br /&gt;
Value may be found in the following locations.  The first value found will be used.&lt;br /&gt;
&lt;br /&gt;
# Current value&lt;br /&gt;
# Environment&lt;br /&gt;
# Files (OS dependent)&lt;br /&gt;
# Default value&lt;br /&gt;
&lt;br /&gt;
The file search path is defined by the environment variable (EPICS_CONF_PATH).&lt;br /&gt;
The default value is set in CONFIG_ENV at compile time.  Since this parameter&lt;br /&gt;
is read before the first file is searched it can not be specified in a file.&lt;br /&gt;
&lt;br /&gt;
Entries in the search path may use arbitrary environment variables (macLib syntax).&lt;br /&gt;
&lt;br /&gt;
=== Default UNIX-like search path ===&lt;br /&gt;
&lt;br /&gt;
# ./epics.conf&lt;br /&gt;
# $HOME/epics.conf&lt;br /&gt;
# $EPICS_BASE/epics.conf&lt;br /&gt;
# /etc/epics.conf&lt;br /&gt;
&lt;br /&gt;
=== Default Windows search path ===&lt;br /&gt;
&lt;br /&gt;
# .\epics.conf&lt;br /&gt;
# $USERPROFILE\epics.conf&lt;br /&gt;
# $EPICS_BASE\epics.conf&lt;br /&gt;
# $ALLUSERSPROFILE\epics.conf&lt;br /&gt;
&lt;br /&gt;
==== On windows xp ====&lt;br /&gt;
&lt;br /&gt;
 USERPROFILE=C:\Documents and Settings\username&lt;br /&gt;
 ALLUSERSPROFILE=C:\Documents and Settings\All Users&lt;br /&gt;
&lt;br /&gt;
==== On windows vista/7 ====&lt;br /&gt;
&lt;br /&gt;
 USERPROFILE=C:\Users\username&lt;br /&gt;
 ALLUSERSPROFILE=C:\ProgramData&lt;br /&gt;
&lt;br /&gt;
=== Default VxWorks and RTEMS search path ===&lt;br /&gt;
&lt;br /&gt;
None&lt;br /&gt;
&lt;br /&gt;
== Config File Syntax ==&lt;br /&gt;
&lt;br /&gt;
Files specifying parameter values shall have lines of the following format.&lt;br /&gt;
Lines may be seperated by one of the valid EOL combinations (cr, lf, cr+lf, lf+cr).&lt;br /&gt;
&lt;br /&gt;
=== Blank lines '^\s*$' ===&lt;br /&gt;
&lt;br /&gt;
Ignored&lt;br /&gt;
&lt;br /&gt;
=== Comments '^\s*#.*$' ===&lt;br /&gt;
&lt;br /&gt;
Ignored&lt;br /&gt;
&lt;br /&gt;
=== key value pairs '^\s*[^\s=]+\s*=.*$' ===&lt;br /&gt;
&lt;br /&gt;
When parsing files key names can contain any non-whitespace charactor except '='.&lt;br /&gt;
However, keys being stored in the environment must also be valid environment variable names.&lt;br /&gt;
&lt;br /&gt;
=== INI style section headers '\s*\[[^\]]+\]\s*$' ===&lt;br /&gt;
&lt;br /&gt;
Reserved for future use.  Parsing stops when the first section header is found.&lt;/div&gt;</summary>
		<author><name>MichaelDavidsaver</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=Epicsparamconf&amp;diff=1858</id>
		<title>Epicsparamconf</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=Epicsparamconf&amp;diff=1858"/>
		<updated>2010-06-29T17:57:56Z</updated>

		<summary type="html">&lt;p&gt;MichaelDavidsaver: /* Setting */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= EPICS Config Parameters API =&lt;br /&gt;
&lt;br /&gt;
Author: Michael Davidsaver &amp;lt;mdavidsaver@bnl.gov&amp;gt;&lt;br /&gt;
Date: June 2010&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Proposal for 3.15 series&lt;br /&gt;
&lt;br /&gt;
Replace the API in envDefs.h with a more general purpose startup config.&lt;br /&gt;
&lt;br /&gt;
* New parameters can be created at runtime by applications outside of Base (ie EDM).&lt;br /&gt;
* Provide a specification for a configuration mechanism which can be shared by  all EPICS implimentations.&lt;br /&gt;
* Values will be taken from configuration file(s) in addition to the nvironment.&lt;br /&gt;
* Supports types: String, Int32, Double, and InetAddr (IPv4).&lt;br /&gt;
* Transparent handling of parameter arrays.&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
=== Types ===&lt;br /&gt;
&lt;br /&gt;
 enum paramType {&lt;br /&gt;
     paramTypeInvalid,&lt;br /&gt;
     paramTypeString,&lt;br /&gt;
     paramTypeInt32,&lt;br /&gt;
     paramTypeDouble,&lt;br /&gt;
     paramTypeInetAddr&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
=== Creation ===&lt;br /&gt;
&lt;br /&gt;
 int&lt;br /&gt;
 paramArrayCreate(const char* name, paramType tp, epicsUInt32 maxelem, char sep, epicsUInt32 opt);&lt;br /&gt;
&lt;br /&gt;
 #define paramCreate(name,tp,opt) paramArrayCreate(name,tp,1,NULL,opt)&lt;br /&gt;
&lt;br /&gt;
Creates a new parameter with the given value type.  If number of elements is &amp;gt;1 and&lt;br /&gt;
a separator string is not given then the default separator (OS dependent) is used.&lt;br /&gt;
&lt;br /&gt;
The bit mask 'opt' defines the following bits.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!bit #&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Include environment variable in search path&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Store value in environment variable&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Don't strip leading and trailing whitespace&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Allow the value to be modified/reread (use carefully)&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Debug print when searching&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RETURN ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Code&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Ok&lt;br /&gt;
|-&lt;br /&gt;
| -1&lt;br /&gt;
|parameter name already exists&lt;br /&gt;
|-&lt;br /&gt;
| -2&lt;br /&gt;
|Invalid arguments (ie nelem==0)&lt;br /&gt;
|-&lt;br /&gt;
| -3&lt;br /&gt;
|Insufficient memory&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Setting ===&lt;br /&gt;
&lt;br /&gt;
 int&lt;br /&gt;
 paramArraySetString(const char* name, epicsUInt32 nelem, const char* const* val, epicsUInt32 opt)&lt;br /&gt;
 /* 3 more for other types */&lt;br /&gt;
&lt;br /&gt;
 #define paramSetString(name, val, opt) paramArraySetString(name, 1, &amp;amp;(val), opt)&lt;br /&gt;
 /* 3 more for other types */&lt;br /&gt;
&lt;br /&gt;
Sets the value of an already created parameter.  A value of NULL will clear the&lt;br /&gt;
parameter value/default.&lt;br /&gt;
&lt;br /&gt;
The bit mask 'opt' defines the following bits.&lt;br /&gt;
&lt;br /&gt;
bit #&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!bit #&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Set default.  Overwrite the default value instead of the final value.&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Allow the value to be modified/reread (use carefully)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RETURN ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Code&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Ok&lt;br /&gt;
|-&lt;br /&gt;
| -1&lt;br /&gt;
|parameter name does not exist&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Getting ===&lt;br /&gt;
&lt;br /&gt;
 extern const void* paramNone;&lt;br /&gt;
 extern const void* paramConvertFail;&lt;br /&gt;
 extern const void* paramNotReal;&lt;br /&gt;
&lt;br /&gt;
 INLINE epicsBoolean&lt;br /&gt;
 paramValidValue(const void* V)&lt;br /&gt;
 {&lt;br /&gt;
   switch(V) {&lt;br /&gt;
   case NULL:&lt;br /&gt;
   case paramNone:&lt;br /&gt;
   case paramConvertFail:&lt;br /&gt;
   case paramNotReal:&lt;br /&gt;
     return epicsFalse;&lt;br /&gt;
   default:&lt;br /&gt;
     return epicsTrue;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 const char* const*&lt;br /&gt;
 paramArrayGetString(const char* name, epicsUInt32 *nelem, epicsUInt32 opt);&lt;br /&gt;
 /* 3 more for other types */&lt;br /&gt;
&lt;br /&gt;
 INLINE const char*&lt;br /&gt;
 paramGetString(const char* name, epicsUInt32 opt)&lt;br /&gt;
 {&lt;br /&gt;
   epicsUInt32 N;&lt;br /&gt;
   const char* const* V=paramArrayGetString(name, 1, opt);&lt;br /&gt;
   if (!paramValidValue((const void*)V)) return (const char*)V;&lt;br /&gt;
   else return *V;&lt;br /&gt;
 }&lt;br /&gt;
 /* 3 more for other types */&lt;br /&gt;
&lt;br /&gt;
Gets the value of an already created parameter&lt;br /&gt;
&lt;br /&gt;
Note: Type-safe Getters will also be provided (ie paramArrayGetDouble())&lt;br /&gt;
&lt;br /&gt;
Note: Type paramTypeString returns C type const char* const*.&lt;br /&gt;
&lt;br /&gt;
The bit mask 'opt' defines the following bits.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!bit #&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Allow the value to be modified/reread (use carefully)&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Debug print when searching&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RETURN ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Code&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|paramNone&lt;br /&gt;
|Value not found&lt;br /&gt;
|-&lt;br /&gt;
|paramNotReal&lt;br /&gt;
|Parameter name does not exist&lt;br /&gt;
|-&lt;br /&gt;
|paramConvertFail&lt;br /&gt;
|Value could not be converted to requested type&lt;br /&gt;
|-&lt;br /&gt;
|NULL&lt;br /&gt;
|Zero length array (nelems also set to 0)&lt;br /&gt;
|-&lt;br /&gt;
|others&lt;br /&gt;
|Value pointer (dependent of type)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Misc ===&lt;br /&gt;
&lt;br /&gt;
 paramType&lt;br /&gt;
 paramGetType(const char* name);&lt;br /&gt;
&lt;br /&gt;
Get type of parameter or paramTypeInvalid if parameter does not exist.&lt;br /&gt;
&lt;br /&gt;
 epicsUInt32&lt;br /&gt;
 paramGetNElem(const char* name);&lt;br /&gt;
&lt;br /&gt;
Get number of entries or 0 if parameter does not exist (use paramGetType()&lt;br /&gt;
to distinguish between a 0 length array and an invalid name).&lt;br /&gt;
&lt;br /&gt;
 char&lt;br /&gt;
 paramGetSep(const char* name);&lt;br /&gt;
&lt;br /&gt;
Get seperator string or NULL if parameter does not exist.&lt;br /&gt;
&lt;br /&gt;
 void&lt;br /&gt;
 paramVisitAll(void *arg, void (*fnptr)(void*, const char* name));&lt;br /&gt;
&lt;br /&gt;
Get a callback for each parameter.&lt;br /&gt;
&lt;br /&gt;
 void&lt;br /&gt;
 paramShowAll(int verbose);&lt;br /&gt;
&lt;br /&gt;
Print parameter info to standard out.  Argument controls verbosity (larger -&amp;gt; more detail).&lt;br /&gt;
&lt;br /&gt;
== Values ==&lt;br /&gt;
&lt;br /&gt;
All values are stored as strings, but may be requested as any type.&lt;br /&gt;
&lt;br /&gt;
Parameters can have the special value paramNone.  This is distinct from a zero length array.&lt;br /&gt;
When created all parameters initially have paramNone as a default value.&lt;br /&gt;
&lt;br /&gt;
== Value Reread ==&lt;br /&gt;
&lt;br /&gt;
The value of a parameter is determined when its value is retrieved with paramArrayGet()&lt;br /&gt;
and stored for future use.  Unless the reread option is given further calls to paramArrayGet()&lt;br /&gt;
will return the same value.  If the reread option is given then paramArrayGet() will&lt;br /&gt;
start a new search and store the (possible different) value for future use.&lt;br /&gt;
&lt;br /&gt;
If a parameter is ever to be reread then the reread option must be given when&lt;br /&gt;
the parameter is created.&lt;br /&gt;
&lt;br /&gt;
Note: Rereading a parameter invalidates all value pointers previously returned.&lt;br /&gt;
&lt;br /&gt;
== Search Path ==&lt;br /&gt;
&lt;br /&gt;
Value may be found in the following locations.  The first value found will be used.&lt;br /&gt;
&lt;br /&gt;
# Current value&lt;br /&gt;
# Environment&lt;br /&gt;
# Files (OS dependent)&lt;br /&gt;
# Default value&lt;br /&gt;
&lt;br /&gt;
The file search path is defined by the environment variable (EPICS_CONF_PATH).&lt;br /&gt;
The default value is set in CONFIG_ENV at compile time.  Since this parameter&lt;br /&gt;
is read before the first file is searched it can not be specified in a file.&lt;br /&gt;
&lt;br /&gt;
Entries in the search path may use arbitrary environment variables (macLib syntax).&lt;br /&gt;
&lt;br /&gt;
=== Default UNIX-like search path ===&lt;br /&gt;
&lt;br /&gt;
# ./epics.conf&lt;br /&gt;
# $HOME/epics.conf&lt;br /&gt;
# $EPICS_BASE/epics.conf&lt;br /&gt;
# /etc/epics.conf&lt;br /&gt;
&lt;br /&gt;
=== Default Windows search path ===&lt;br /&gt;
&lt;br /&gt;
# .\epics.conf&lt;br /&gt;
# $USERPROFILE\epics.conf&lt;br /&gt;
# $EPICS_BASE\epics.conf&lt;br /&gt;
# $ALLUSERSPROFILE\epics.conf&lt;br /&gt;
&lt;br /&gt;
==== On windows xp ====&lt;br /&gt;
&lt;br /&gt;
 USERPROFILE=C:\Documents and Settings\username&lt;br /&gt;
 ALLUSERSPROFILE=C:\Documents and Settings\All Users&lt;br /&gt;
&lt;br /&gt;
==== On windows vista/7 ====&lt;br /&gt;
&lt;br /&gt;
 USERPROFILE=C:\Users\username&lt;br /&gt;
 ALLUSERSPROFILE=C:\ProgramData&lt;br /&gt;
&lt;br /&gt;
=== Default VxWorks and RTEMS search path ===&lt;br /&gt;
&lt;br /&gt;
None&lt;br /&gt;
&lt;br /&gt;
== Config File Syntax ==&lt;br /&gt;
&lt;br /&gt;
Files specifying parameter values shall have lines of the following format.&lt;br /&gt;
Lines may be seperated by one of the valid EOL combinations (cr, lf, cr+lf, lf+cr).&lt;br /&gt;
&lt;br /&gt;
=== Blank lines '^\s*$' ===&lt;br /&gt;
&lt;br /&gt;
Ignored&lt;br /&gt;
&lt;br /&gt;
=== Comments '^\s*#.*$' ===&lt;br /&gt;
&lt;br /&gt;
Ignored&lt;br /&gt;
&lt;br /&gt;
=== key value pairs '^\s*[^\s=]+\s*=.*$' ===&lt;br /&gt;
&lt;br /&gt;
When parsing files key names can contain any non-whitespace charactor except '='.&lt;br /&gt;
However, keys being stored in the environment must also be valid environment variable names.&lt;br /&gt;
&lt;br /&gt;
=== INI style section headers '\s*\[[^\[]+\]\s*$' ===&lt;br /&gt;
&lt;br /&gt;
Reserved for future use.  Parsing stops when the first section header is found.&lt;/div&gt;</summary>
		<author><name>MichaelDavidsaver</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=Epicsparamconf&amp;diff=1857</id>
		<title>Epicsparamconf</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=Epicsparamconf&amp;diff=1857"/>
		<updated>2010-06-29T17:56:46Z</updated>

		<summary type="html">&lt;p&gt;MichaelDavidsaver: return values are negative&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= EPICS Config Parameters API =&lt;br /&gt;
&lt;br /&gt;
Author: Michael Davidsaver &amp;lt;mdavidsaver@bnl.gov&amp;gt;&lt;br /&gt;
Date: June 2010&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Proposal for 3.15 series&lt;br /&gt;
&lt;br /&gt;
Replace the API in envDefs.h with a more general purpose startup config.&lt;br /&gt;
&lt;br /&gt;
* New parameters can be created at runtime by applications outside of Base (ie EDM).&lt;br /&gt;
* Provide a specification for a configuration mechanism which can be shared by  all EPICS implimentations.&lt;br /&gt;
* Values will be taken from configuration file(s) in addition to the nvironment.&lt;br /&gt;
* Supports types: String, Int32, Double, and InetAddr (IPv4).&lt;br /&gt;
* Transparent handling of parameter arrays.&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
=== Types ===&lt;br /&gt;
&lt;br /&gt;
 enum paramType {&lt;br /&gt;
     paramTypeInvalid,&lt;br /&gt;
     paramTypeString,&lt;br /&gt;
     paramTypeInt32,&lt;br /&gt;
     paramTypeDouble,&lt;br /&gt;
     paramTypeInetAddr&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
=== Creation ===&lt;br /&gt;
&lt;br /&gt;
 int&lt;br /&gt;
 paramArrayCreate(const char* name, paramType tp, epicsUInt32 maxelem, char sep, epicsUInt32 opt);&lt;br /&gt;
&lt;br /&gt;
 #define paramCreate(name,tp,opt) paramArrayCreate(name,tp,1,NULL,opt)&lt;br /&gt;
&lt;br /&gt;
Creates a new parameter with the given value type.  If number of elements is &amp;gt;1 and&lt;br /&gt;
a separator string is not given then the default separator (OS dependent) is used.&lt;br /&gt;
&lt;br /&gt;
The bit mask 'opt' defines the following bits.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!bit #&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Include environment variable in search path&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Store value in environment variable&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Don't strip leading and trailing whitespace&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Allow the value to be modified/reread (use carefully)&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Debug print when searching&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RETURN ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Code&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Ok&lt;br /&gt;
|-&lt;br /&gt;
| -1&lt;br /&gt;
|parameter name already exists&lt;br /&gt;
|-&lt;br /&gt;
| -2&lt;br /&gt;
|Invalid arguments (ie nelem==0)&lt;br /&gt;
|-&lt;br /&gt;
| -3&lt;br /&gt;
|Insufficient memory&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Setting ===&lt;br /&gt;
&lt;br /&gt;
 int&lt;br /&gt;
 paramArraySetString(const char* name, epicsUInt32 nelem, const char* const* val, epicsUInt32 opt)&lt;br /&gt;
 /* 3 more for other types */&lt;br /&gt;
&lt;br /&gt;
 #define paramSetString(name, val, opt) paramArraySetString(name, 1, &amp;amp;(val), opt)&lt;br /&gt;
 /* 3 more for other types */&lt;br /&gt;
&lt;br /&gt;
Sets the value of an already created parameter.  A value of NULL will clear the&lt;br /&gt;
parameter value/default.&lt;br /&gt;
&lt;br /&gt;
The bit mask 'opt' defines the following bits.&lt;br /&gt;
&lt;br /&gt;
bit #&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!bit #&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Set default.  Overwrite the default value instead of the final value.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RETURN ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Code&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Ok&lt;br /&gt;
|-&lt;br /&gt;
| -1&lt;br /&gt;
|parameter name does not exist&lt;br /&gt;
|-&lt;br /&gt;
| -3&lt;br /&gt;
|Allow the value to be modified/reread (use carefully)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Getting ===&lt;br /&gt;
&lt;br /&gt;
 extern const void* paramNone;&lt;br /&gt;
 extern const void* paramConvertFail;&lt;br /&gt;
 extern const void* paramNotReal;&lt;br /&gt;
&lt;br /&gt;
 INLINE epicsBoolean&lt;br /&gt;
 paramValidValue(const void* V)&lt;br /&gt;
 {&lt;br /&gt;
   switch(V) {&lt;br /&gt;
   case NULL:&lt;br /&gt;
   case paramNone:&lt;br /&gt;
   case paramConvertFail:&lt;br /&gt;
   case paramNotReal:&lt;br /&gt;
     return epicsFalse;&lt;br /&gt;
   default:&lt;br /&gt;
     return epicsTrue;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 const char* const*&lt;br /&gt;
 paramArrayGetString(const char* name, epicsUInt32 *nelem, epicsUInt32 opt);&lt;br /&gt;
 /* 3 more for other types */&lt;br /&gt;
&lt;br /&gt;
 INLINE const char*&lt;br /&gt;
 paramGetString(const char* name, epicsUInt32 opt)&lt;br /&gt;
 {&lt;br /&gt;
   epicsUInt32 N;&lt;br /&gt;
   const char* const* V=paramArrayGetString(name, 1, opt);&lt;br /&gt;
   if (!paramValidValue((const void*)V)) return (const char*)V;&lt;br /&gt;
   else return *V;&lt;br /&gt;
 }&lt;br /&gt;
 /* 3 more for other types */&lt;br /&gt;
&lt;br /&gt;
Gets the value of an already created parameter&lt;br /&gt;
&lt;br /&gt;
Note: Type-safe Getters will also be provided (ie paramArrayGetDouble())&lt;br /&gt;
&lt;br /&gt;
Note: Type paramTypeString returns C type const char* const*.&lt;br /&gt;
&lt;br /&gt;
The bit mask 'opt' defines the following bits.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!bit #&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Allow the value to be modified/reread (use carefully)&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Debug print when searching&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RETURN ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Code&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|paramNone&lt;br /&gt;
|Value not found&lt;br /&gt;
|-&lt;br /&gt;
|paramNotReal&lt;br /&gt;
|Parameter name does not exist&lt;br /&gt;
|-&lt;br /&gt;
|paramConvertFail&lt;br /&gt;
|Value could not be converted to requested type&lt;br /&gt;
|-&lt;br /&gt;
|NULL&lt;br /&gt;
|Zero length array (nelems also set to 0)&lt;br /&gt;
|-&lt;br /&gt;
|others&lt;br /&gt;
|Value pointer (dependent of type)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Misc ===&lt;br /&gt;
&lt;br /&gt;
 paramType&lt;br /&gt;
 paramGetType(const char* name);&lt;br /&gt;
&lt;br /&gt;
Get type of parameter or paramTypeInvalid if parameter does not exist.&lt;br /&gt;
&lt;br /&gt;
 epicsUInt32&lt;br /&gt;
 paramGetNElem(const char* name);&lt;br /&gt;
&lt;br /&gt;
Get number of entries or 0 if parameter does not exist (use paramGetType()&lt;br /&gt;
to distinguish between a 0 length array and an invalid name).&lt;br /&gt;
&lt;br /&gt;
 char&lt;br /&gt;
 paramGetSep(const char* name);&lt;br /&gt;
&lt;br /&gt;
Get seperator string or NULL if parameter does not exist.&lt;br /&gt;
&lt;br /&gt;
 void&lt;br /&gt;
 paramVisitAll(void *arg, void (*fnptr)(void*, const char* name));&lt;br /&gt;
&lt;br /&gt;
Get a callback for each parameter.&lt;br /&gt;
&lt;br /&gt;
 void&lt;br /&gt;
 paramShowAll(int verbose);&lt;br /&gt;
&lt;br /&gt;
Print parameter info to standard out.  Argument controls verbosity (larger -&amp;gt; more detail).&lt;br /&gt;
&lt;br /&gt;
== Values ==&lt;br /&gt;
&lt;br /&gt;
All values are stored as strings, but may be requested as any type.&lt;br /&gt;
&lt;br /&gt;
Parameters can have the special value paramNone.  This is distinct from a zero length array.&lt;br /&gt;
When created all parameters initially have paramNone as a default value.&lt;br /&gt;
&lt;br /&gt;
== Value Reread ==&lt;br /&gt;
&lt;br /&gt;
The value of a parameter is determined when its value is retrieved with paramArrayGet()&lt;br /&gt;
and stored for future use.  Unless the reread option is given further calls to paramArrayGet()&lt;br /&gt;
will return the same value.  If the reread option is given then paramArrayGet() will&lt;br /&gt;
start a new search and store the (possible different) value for future use.&lt;br /&gt;
&lt;br /&gt;
If a parameter is ever to be reread then the reread option must be given when&lt;br /&gt;
the parameter is created.&lt;br /&gt;
&lt;br /&gt;
Note: Rereading a parameter invalidates all value pointers previously returned.&lt;br /&gt;
&lt;br /&gt;
== Search Path ==&lt;br /&gt;
&lt;br /&gt;
Value may be found in the following locations.  The first value found will be used.&lt;br /&gt;
&lt;br /&gt;
# Current value&lt;br /&gt;
# Environment&lt;br /&gt;
# Files (OS dependent)&lt;br /&gt;
# Default value&lt;br /&gt;
&lt;br /&gt;
The file search path is defined by the environment variable (EPICS_CONF_PATH).&lt;br /&gt;
The default value is set in CONFIG_ENV at compile time.  Since this parameter&lt;br /&gt;
is read before the first file is searched it can not be specified in a file.&lt;br /&gt;
&lt;br /&gt;
Entries in the search path may use arbitrary environment variables (macLib syntax).&lt;br /&gt;
&lt;br /&gt;
=== Default UNIX-like search path ===&lt;br /&gt;
&lt;br /&gt;
# ./epics.conf&lt;br /&gt;
# $HOME/epics.conf&lt;br /&gt;
# $EPICS_BASE/epics.conf&lt;br /&gt;
# /etc/epics.conf&lt;br /&gt;
&lt;br /&gt;
=== Default Windows search path ===&lt;br /&gt;
&lt;br /&gt;
# .\epics.conf&lt;br /&gt;
# $USERPROFILE\epics.conf&lt;br /&gt;
# $EPICS_BASE\epics.conf&lt;br /&gt;
# $ALLUSERSPROFILE\epics.conf&lt;br /&gt;
&lt;br /&gt;
==== On windows xp ====&lt;br /&gt;
&lt;br /&gt;
 USERPROFILE=C:\Documents and Settings\username&lt;br /&gt;
 ALLUSERSPROFILE=C:\Documents and Settings\All Users&lt;br /&gt;
&lt;br /&gt;
==== On windows vista/7 ====&lt;br /&gt;
&lt;br /&gt;
 USERPROFILE=C:\Users\username&lt;br /&gt;
 ALLUSERSPROFILE=C:\ProgramData&lt;br /&gt;
&lt;br /&gt;
=== Default VxWorks and RTEMS search path ===&lt;br /&gt;
&lt;br /&gt;
None&lt;br /&gt;
&lt;br /&gt;
== Config File Syntax ==&lt;br /&gt;
&lt;br /&gt;
Files specifying parameter values shall have lines of the following format.&lt;br /&gt;
Lines may be seperated by one of the valid EOL combinations (cr, lf, cr+lf, lf+cr).&lt;br /&gt;
&lt;br /&gt;
=== Blank lines '^\s*$' ===&lt;br /&gt;
&lt;br /&gt;
Ignored&lt;br /&gt;
&lt;br /&gt;
=== Comments '^\s*#.*$' ===&lt;br /&gt;
&lt;br /&gt;
Ignored&lt;br /&gt;
&lt;br /&gt;
=== key value pairs '^\s*[^\s=]+\s*=.*$' ===&lt;br /&gt;
&lt;br /&gt;
When parsing files key names can contain any non-whitespace charactor except '='.&lt;br /&gt;
However, keys being stored in the environment must also be valid environment variable names.&lt;br /&gt;
&lt;br /&gt;
=== INI style section headers '\s*\[[^\[]+\]\s*$' ===&lt;br /&gt;
&lt;br /&gt;
Reserved for future use.  Parsing stops when the first section header is found.&lt;/div&gt;</summary>
		<author><name>MichaelDavidsaver</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=Epicsparamconf&amp;diff=1856</id>
		<title>Epicsparamconf</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=Epicsparamconf&amp;diff=1856"/>
		<updated>2010-06-29T16:24:29Z</updated>

		<summary type="html">&lt;p&gt;MichaelDavidsaver: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= EPICS Config Parameters API =&lt;br /&gt;
&lt;br /&gt;
Author: Michael Davidsaver &amp;lt;mdavidsaver@bnl.gov&amp;gt;&lt;br /&gt;
Date: June 2010&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Proposal for 3.15 series&lt;br /&gt;
&lt;br /&gt;
Replace the API in envDefs.h with a more general purpose startup config.&lt;br /&gt;
&lt;br /&gt;
* New parameters can be created at runtime by applications outside of Base (ie EDM).&lt;br /&gt;
* Provide a specification for a configuration mechanism which can be shared by  all EPICS implimentations.&lt;br /&gt;
* Values will be taken from configuration file(s) in addition to the nvironment.&lt;br /&gt;
* Supports types: String, Int32, Double, and InetAddr (IPv4).&lt;br /&gt;
* Transparent handling of parameter arrays.&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
=== Types ===&lt;br /&gt;
&lt;br /&gt;
 enum paramType {&lt;br /&gt;
     paramTypeInvalid,&lt;br /&gt;
     paramTypeString,&lt;br /&gt;
     paramTypeInt32,&lt;br /&gt;
     paramTypeDouble,&lt;br /&gt;
     paramTypeInetAddr&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
=== Creation ===&lt;br /&gt;
&lt;br /&gt;
 int&lt;br /&gt;
 paramArrayCreate(const char* name, paramType tp, epicsUInt32 maxelem, char sep, epicsUInt32 opt);&lt;br /&gt;
&lt;br /&gt;
 #define paramCreate(name,tp,opt) paramArrayCreate(name,tp,1,NULL,opt)&lt;br /&gt;
&lt;br /&gt;
Creates a new parameter with the given value type.  If number of elements is &amp;gt;1 and&lt;br /&gt;
a separator string is not given then the default separator (OS dependent) is used.&lt;br /&gt;
&lt;br /&gt;
The bit mask 'opt' defines the following bits.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!bit #&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Include environment variable in search path&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Store value in environment variable&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Don't strip leading and trailing whitespace&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Allow the value to be modified/reread (use carefully)&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Debug print when searching&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RETURN ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Code&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Ok&lt;br /&gt;
|-&lt;br /&gt;
| -1&lt;br /&gt;
|parameter name already exists&lt;br /&gt;
|-&lt;br /&gt;
| -2&lt;br /&gt;
|Invalid arguments (ie nelem==0)&lt;br /&gt;
|-&lt;br /&gt;
| -3&lt;br /&gt;
|Insufficient memory&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Setting ===&lt;br /&gt;
&lt;br /&gt;
 int&lt;br /&gt;
 paramArraySetString(const char* name, epicsUInt32 nelem, const char* const* val, epicsUInt32 opt)&lt;br /&gt;
 /* 3 more for other types */&lt;br /&gt;
&lt;br /&gt;
 #define paramSetString(name, val, opt) paramArraySetString(name, 1, &amp;amp;(val), opt)&lt;br /&gt;
 /* 3 more for other types */&lt;br /&gt;
&lt;br /&gt;
Sets the value of an already created parameter.  A value of NULL will clear the&lt;br /&gt;
parameter value/default.&lt;br /&gt;
&lt;br /&gt;
The bit mask 'opt' defines the following bits.&lt;br /&gt;
&lt;br /&gt;
bit #&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!bit #&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Set default.  Overwrite the default value instead of the final value.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RETURN ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Code&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Ok&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|parameter name does not exist&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Allow the value to be modified/reread (use carefully)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Getting ===&lt;br /&gt;
&lt;br /&gt;
 extern const void* paramNone;&lt;br /&gt;
 extern const void* paramConvertFail;&lt;br /&gt;
 extern const void* paramNotReal;&lt;br /&gt;
&lt;br /&gt;
 INLINE epicsBoolean&lt;br /&gt;
 paramValidValue(const void* V)&lt;br /&gt;
 {&lt;br /&gt;
   switch(V) {&lt;br /&gt;
   case NULL:&lt;br /&gt;
   case paramNone:&lt;br /&gt;
   case paramConvertFail:&lt;br /&gt;
   case paramNotReal:&lt;br /&gt;
     return epicsFalse;&lt;br /&gt;
   default:&lt;br /&gt;
     return epicsTrue;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 const char* const*&lt;br /&gt;
 paramArrayGetString(const char* name, epicsUInt32 *nelem, epicsUInt32 opt);&lt;br /&gt;
 /* 3 more for other types */&lt;br /&gt;
&lt;br /&gt;
 INLINE const char*&lt;br /&gt;
 paramGetString(const char* name, epicsUInt32 opt)&lt;br /&gt;
 {&lt;br /&gt;
   epicsUInt32 N;&lt;br /&gt;
   const char* const* V=paramArrayGetString(name, 1, opt);&lt;br /&gt;
   if (!paramValidValue((const void*)V)) return (const char*)V;&lt;br /&gt;
   else return *V;&lt;br /&gt;
 }&lt;br /&gt;
 /* 3 more for other types */&lt;br /&gt;
&lt;br /&gt;
Gets the value of an already created parameter&lt;br /&gt;
&lt;br /&gt;
Note: Type-safe Getters will also be provided (ie paramArrayGetDouble())&lt;br /&gt;
&lt;br /&gt;
Note: Type paramTypeString returns C type const char* const*.&lt;br /&gt;
&lt;br /&gt;
The bit mask 'opt' defines the following bits.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!bit #&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Allow the value to be modified/reread (use carefully)&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Debug print when searching&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RETURN ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Code&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|paramNone&lt;br /&gt;
|Value not found&lt;br /&gt;
|-&lt;br /&gt;
|paramNotReal&lt;br /&gt;
|Parameter name does not exist&lt;br /&gt;
|-&lt;br /&gt;
|paramConvertFail&lt;br /&gt;
|Value could not be converted to requested type&lt;br /&gt;
|-&lt;br /&gt;
|NULL&lt;br /&gt;
|Zero length array (nelems also set to 0)&lt;br /&gt;
|-&lt;br /&gt;
|others&lt;br /&gt;
|Value pointer (dependent of type)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Misc ===&lt;br /&gt;
&lt;br /&gt;
 paramType&lt;br /&gt;
 paramGetType(const char* name);&lt;br /&gt;
&lt;br /&gt;
Get type of parameter or paramTypeInvalid if parameter does not exist.&lt;br /&gt;
&lt;br /&gt;
 epicsUInt32&lt;br /&gt;
 paramGetNElem(const char* name);&lt;br /&gt;
&lt;br /&gt;
Get number of entries or 0 if parameter does not exist (use paramGetType()&lt;br /&gt;
to distinguish between a 0 length array and an invalid name).&lt;br /&gt;
&lt;br /&gt;
 char&lt;br /&gt;
 paramGetSep(const char* name);&lt;br /&gt;
&lt;br /&gt;
Get seperator string or NULL if parameter does not exist.&lt;br /&gt;
&lt;br /&gt;
 void&lt;br /&gt;
 paramVisitAll(void *arg, void (*fnptr)(void*, const char* name));&lt;br /&gt;
&lt;br /&gt;
Get a callback for each parameter.&lt;br /&gt;
&lt;br /&gt;
 void&lt;br /&gt;
 paramShowAll(int verbose);&lt;br /&gt;
&lt;br /&gt;
Print parameter info to standard out.  Argument controls verbosity (larger -&amp;gt; more detail).&lt;br /&gt;
&lt;br /&gt;
== Values ==&lt;br /&gt;
&lt;br /&gt;
All values are stored as strings, but may be requested as any type.&lt;br /&gt;
&lt;br /&gt;
Parameters can have the special value paramNone.  This is distinct from a zero length array.&lt;br /&gt;
When created all parameters initially have paramNone as a default value.&lt;br /&gt;
&lt;br /&gt;
== Value Reread ==&lt;br /&gt;
&lt;br /&gt;
The value of a parameter is determined when its value is retrieved with paramArrayGet()&lt;br /&gt;
and stored for future use.  Unless the reread option is given further calls to paramArrayGet()&lt;br /&gt;
will return the same value.  If the reread option is given then paramArrayGet() will&lt;br /&gt;
start a new search and store the (possible different) value for future use.&lt;br /&gt;
&lt;br /&gt;
If a parameter is ever to be reread then the reread option must be given when&lt;br /&gt;
the parameter is created.&lt;br /&gt;
&lt;br /&gt;
Note: Rereading a parameter invalidates all value pointers previously returned.&lt;br /&gt;
&lt;br /&gt;
== Search Path ==&lt;br /&gt;
&lt;br /&gt;
Value may be found in the following locations.  The first value found will be used.&lt;br /&gt;
&lt;br /&gt;
# Current value&lt;br /&gt;
# Environment&lt;br /&gt;
# Files (OS dependent)&lt;br /&gt;
# Default value&lt;br /&gt;
&lt;br /&gt;
The file search path is defined by the environment variable (EPICS_CONF_PATH).&lt;br /&gt;
The default value is set in CONFIG_ENV at compile time.  Since this parameter&lt;br /&gt;
is read before the first file is searched it can not be specified in a file.&lt;br /&gt;
&lt;br /&gt;
Entries in the search path may use arbitrary environment variables (macLib syntax).&lt;br /&gt;
&lt;br /&gt;
=== Default UNIX-like search path ===&lt;br /&gt;
&lt;br /&gt;
# ./epics.conf&lt;br /&gt;
# $HOME/epics.conf&lt;br /&gt;
# $EPICS_BASE/epics.conf&lt;br /&gt;
# /etc/epics.conf&lt;br /&gt;
&lt;br /&gt;
=== Default Windows search path ===&lt;br /&gt;
&lt;br /&gt;
# .\epics.conf&lt;br /&gt;
# $USERPROFILE\epics.conf&lt;br /&gt;
# $EPICS_BASE\epics.conf&lt;br /&gt;
# $ALLUSERSPROFILE\epics.conf&lt;br /&gt;
&lt;br /&gt;
==== On windows xp ====&lt;br /&gt;
&lt;br /&gt;
 USERPROFILE=C:\Documents and Settings\username&lt;br /&gt;
 ALLUSERSPROFILE=C:\Documents and Settings\All Users&lt;br /&gt;
&lt;br /&gt;
==== On windows vista/7 ====&lt;br /&gt;
&lt;br /&gt;
 USERPROFILE=C:\Users\username&lt;br /&gt;
 ALLUSERSPROFILE=C:\ProgramData&lt;br /&gt;
&lt;br /&gt;
=== Default VxWorks and RTEMS search path ===&lt;br /&gt;
&lt;br /&gt;
None&lt;br /&gt;
&lt;br /&gt;
== Config File Syntax ==&lt;br /&gt;
&lt;br /&gt;
Files specifying parameter values shall have lines of the following format.&lt;br /&gt;
Lines may be seperated by one of the valid EOL combinations (cr, lf, cr+lf, lf+cr).&lt;br /&gt;
&lt;br /&gt;
=== Blank lines '^\s*$' ===&lt;br /&gt;
&lt;br /&gt;
Ignored&lt;br /&gt;
&lt;br /&gt;
=== Comments '^\s*#.*$' ===&lt;br /&gt;
&lt;br /&gt;
Ignored&lt;br /&gt;
&lt;br /&gt;
=== key value pairs '^\s*[^\s=]+\s*=.*$' ===&lt;br /&gt;
&lt;br /&gt;
When parsing files key names can contain any non-whitespace charactor except '='.&lt;br /&gt;
However, keys being stored in the environment must also be valid environment variable names.&lt;br /&gt;
&lt;br /&gt;
=== INI style section headers '\s*\[[^\[]+\]\s*$' ===&lt;br /&gt;
&lt;br /&gt;
Reserved for future use.  Parsing stops when the first section header is found.&lt;/div&gt;</summary>
		<author><name>MichaelDavidsaver</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=Epicsparamconf&amp;diff=1855</id>
		<title>Epicsparamconf</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=Epicsparamconf&amp;diff=1855"/>
		<updated>2010-06-29T16:17:19Z</updated>

		<summary type="html">&lt;p&gt;MichaelDavidsaver: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= EPICS Config Parameters API =&lt;br /&gt;
&lt;br /&gt;
Author: Michael Davidsaver &amp;lt;mdavidsaver@bnl.gov&amp;gt;&lt;br /&gt;
Date: June 2010&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Proposal for 3.15 series&lt;br /&gt;
&lt;br /&gt;
Replace the API in envDefs.h with a more general purpose startup config.&lt;br /&gt;
&lt;br /&gt;
* New parameters can be created at runtime by applications outside of Base (ie EDM).&lt;br /&gt;
* Provide a specification for a configuration mechanism which can be shared by  all EPICS implimentations.&lt;br /&gt;
* Values will be taken from configuration file(s) in addition to the nvironment.&lt;br /&gt;
* Supports types: String, Int32, Double, and InetAddr (IPv4).&lt;br /&gt;
* Transparent handling of parameter arrays.&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
=== Types ===&lt;br /&gt;
&lt;br /&gt;
 enum paramType {&lt;br /&gt;
     paramTypeInvalid,&lt;br /&gt;
     paramTypeString,&lt;br /&gt;
     paramTypeInt32,&lt;br /&gt;
     paramTypeDouble,&lt;br /&gt;
     paramTypeInetAddr&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
=== Creation ===&lt;br /&gt;
&lt;br /&gt;
 int&lt;br /&gt;
 paramArrayCreate(const char* name, paramType tp, epicsUInt32 maxelem, char sep, epicsUInt32 opt);&lt;br /&gt;
&lt;br /&gt;
 #define paramCreate(name,tp,opt) paramArrayCreate(name,tp,1,NULL,opt)&lt;br /&gt;
&lt;br /&gt;
Creates a new parameter with the given value type.  If number of elements is &amp;gt;1 and&lt;br /&gt;
a separator string is not given then the default separator (OS dependent) is used.&lt;br /&gt;
&lt;br /&gt;
The bit mask 'opt' defines the following bits.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!bit #&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Include environment variable in search path&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Store value in environment variable&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Don't strip leading and trailing whitespace&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Allow the value to be modified/reread (use carefully)&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Debug print when searching&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RETURN ====&lt;br /&gt;
&lt;br /&gt;
0 :: Ok&lt;br /&gt;
-1 :: parameter name already exists&lt;br /&gt;
-2 :: Invalid arguments (ie nelem==0)&lt;br /&gt;
-3 :: Insufficient memory&lt;br /&gt;
&lt;br /&gt;
=== Setting ===&lt;br /&gt;
&lt;br /&gt;
 int&lt;br /&gt;
 paramArraySetString(const char* name, epicsUInt32 nelem, const char* const* val, epicsUInt32 opt)&lt;br /&gt;
 /* 3 more for other types */&lt;br /&gt;
&lt;br /&gt;
 #define paramSetString(name, val, opt) paramArraySetString(name, 1, &amp;amp;(val), opt)&lt;br /&gt;
 /* 3 more for other types */&lt;br /&gt;
&lt;br /&gt;
Sets the value of an already created parameter.  A value of NULL will clear the&lt;br /&gt;
parameter value/default.&lt;br /&gt;
&lt;br /&gt;
The bit mask 'opt' defines the following bits.&lt;br /&gt;
&lt;br /&gt;
bit #&lt;br /&gt;
&lt;br /&gt;
0 :: Set default.  Overwrite the default value instead of the final value.&lt;br /&gt;
&lt;br /&gt;
==== RETURN ====&lt;br /&gt;
&lt;br /&gt;
0 :: ok&lt;br /&gt;
1 :: parameter name does not exist&lt;br /&gt;
3 :: Allow the value to be modified/reread (use carefully)&lt;br /&gt;
&lt;br /&gt;
=== Getting ===&lt;br /&gt;
&lt;br /&gt;
 extern const void* paramNone;&lt;br /&gt;
 extern const void* paramConvertFail;&lt;br /&gt;
 extern const void* paramNotReal;&lt;br /&gt;
&lt;br /&gt;
 INLINE epicsBoolean&lt;br /&gt;
 paramValidValue(const void* V)&lt;br /&gt;
 {&lt;br /&gt;
   switch(V) {&lt;br /&gt;
   case NULL:&lt;br /&gt;
   case paramNone:&lt;br /&gt;
   case paramConvertFail:&lt;br /&gt;
   case paramNotReal:&lt;br /&gt;
     return epicsFalse;&lt;br /&gt;
   default:&lt;br /&gt;
     return epicsTrue;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 const char* const*&lt;br /&gt;
 paramArrayGetString(const char* name, epicsUInt32 *nelem, epicsUInt32 opt);&lt;br /&gt;
 /* 3 more for other types */&lt;br /&gt;
&lt;br /&gt;
 INLINE const char*&lt;br /&gt;
 paramGetString(const char* name, epicsUInt32 opt)&lt;br /&gt;
 {&lt;br /&gt;
   epicsUInt32 N;&lt;br /&gt;
   const char* const* V=paramArrayGetString(name, 1, opt);&lt;br /&gt;
   if (!paramValidValue((const void*)V)) return (const char*)V;&lt;br /&gt;
   else return *V;&lt;br /&gt;
 }&lt;br /&gt;
 /* 3 more for other types */&lt;br /&gt;
&lt;br /&gt;
Gets the value of an already created parameter&lt;br /&gt;
&lt;br /&gt;
Note: Type-safe Getters will also be provided (ie paramArrayGetDouble())&lt;br /&gt;
&lt;br /&gt;
Note: Type paramTypeString returns C type const char* const*.&lt;br /&gt;
&lt;br /&gt;
The bit mask 'opt' defines the following bits.&lt;br /&gt;
&lt;br /&gt;
bit #&lt;br /&gt;
&lt;br /&gt;
3 :: Allow the value to be modified/reread (use carefully)&lt;br /&gt;
4 :: Debug print when searching&lt;br /&gt;
&lt;br /&gt;
==== RETURN ====&lt;br /&gt;
&lt;br /&gt;
paramNone        - Value not found&lt;br /&gt;
paramNotReal     - Parameter name does not exist&lt;br /&gt;
paramConvertFail - Value could not be converted to requested type&lt;br /&gt;
NULL             - Zero length array (nelems also set to 0)&lt;br /&gt;
others           - Value pointer (dependent of type)&lt;br /&gt;
&lt;br /&gt;
=== Misc ===&lt;br /&gt;
&lt;br /&gt;
 paramType&lt;br /&gt;
 paramGetType(const char* name);&lt;br /&gt;
&lt;br /&gt;
Get type of parameter or paramTypeInvalid if parameter does not exist.&lt;br /&gt;
&lt;br /&gt;
 epicsUInt32&lt;br /&gt;
 paramGetNElem(const char* name);&lt;br /&gt;
&lt;br /&gt;
Get number of entries or 0 if parameter does not exist (use paramGetType()&lt;br /&gt;
to distinguish between a 0 length array and an invalid name).&lt;br /&gt;
&lt;br /&gt;
 char&lt;br /&gt;
 paramGetSep(const char* name);&lt;br /&gt;
&lt;br /&gt;
Get seperator string or NULL if parameter does not exist.&lt;br /&gt;
&lt;br /&gt;
 void&lt;br /&gt;
 paramVisitAll(void *arg, void (*fnptr)(void*, const char* name));&lt;br /&gt;
&lt;br /&gt;
Get a callback for each parameter.&lt;br /&gt;
&lt;br /&gt;
 void&lt;br /&gt;
 paramShowAll(int verbose);&lt;br /&gt;
&lt;br /&gt;
Print parameter info to standard out.  Argument controls verbosity (larger -&amp;gt; more detail).&lt;br /&gt;
&lt;br /&gt;
== Values ==&lt;br /&gt;
&lt;br /&gt;
All values are stored as strings, but may be requested as any type.&lt;br /&gt;
&lt;br /&gt;
Parameters can have the special value paramNone.  This is distinct from a zero length array.&lt;br /&gt;
When created all parameters initially have paramNone as a default value.&lt;br /&gt;
&lt;br /&gt;
== Value Reread ==&lt;br /&gt;
&lt;br /&gt;
The value of a parameter is determined when its value is retrieved with paramArrayGet()&lt;br /&gt;
and stored for future use.  Unless the reread option is given further calls to paramArrayGet()&lt;br /&gt;
will return the same value.  If the reread option is given then paramArrayGet() will&lt;br /&gt;
start a new search and store the (possible different) value for future use.&lt;br /&gt;
&lt;br /&gt;
If a parameter is ever to be reread then the reread option must be given when&lt;br /&gt;
the parameter is created.&lt;br /&gt;
&lt;br /&gt;
Note: Rereading a parameter invalidates all value pointers previously returned.&lt;br /&gt;
&lt;br /&gt;
== Search Path ==&lt;br /&gt;
&lt;br /&gt;
Value may be found in the following locations.  The first value found will be used.&lt;br /&gt;
&lt;br /&gt;
# Current value&lt;br /&gt;
# Environment&lt;br /&gt;
# Files (OS dependent)&lt;br /&gt;
# Default value&lt;br /&gt;
&lt;br /&gt;
The file search path is defined by the environment variable (EPICS_CONF_PATH).&lt;br /&gt;
The default value is set in CONFIG_ENV at compile time.  Since this parameter&lt;br /&gt;
is read before the first file is searched it can not be specified in a file.&lt;br /&gt;
&lt;br /&gt;
Entries in the search path may use arbitrary environment variables (macLib syntax).&lt;br /&gt;
&lt;br /&gt;
=== Default UNIX-like search path ===&lt;br /&gt;
&lt;br /&gt;
# ./epics.conf&lt;br /&gt;
# $HOME/epics.conf&lt;br /&gt;
# $EPICS_BASE/epics.conf&lt;br /&gt;
# /etc/epics.conf&lt;br /&gt;
&lt;br /&gt;
=== Default Windows search path ===&lt;br /&gt;
&lt;br /&gt;
# .\epics.conf&lt;br /&gt;
# $USERPROFILE\epics.conf&lt;br /&gt;
# $EPICS_BASE\epics.conf&lt;br /&gt;
# $ALLUSERSPROFILE\epics.conf&lt;br /&gt;
&lt;br /&gt;
==== On windows xp ====&lt;br /&gt;
&lt;br /&gt;
 USERPROFILE=C:\Documents and Settings\username&lt;br /&gt;
 ALLUSERSPROFILE=C:\Documents and Settings\All Users&lt;br /&gt;
&lt;br /&gt;
==== On windows vista/7 ====&lt;br /&gt;
&lt;br /&gt;
 USERPROFILE=C:\Users\username&lt;br /&gt;
 ALLUSERSPROFILE=C:\ProgramData&lt;br /&gt;
&lt;br /&gt;
=== Default VxWorks and RTEMS search path ===&lt;br /&gt;
&lt;br /&gt;
None&lt;br /&gt;
&lt;br /&gt;
== Config File Syntax ==&lt;br /&gt;
&lt;br /&gt;
Files specifying parameter values shall have lines of the following format.&lt;br /&gt;
Lines may be seperated by one of the valid EOL combinations (cr, lf, cr+lf, lf+cr).&lt;br /&gt;
&lt;br /&gt;
=== Blank lines '^\s*$' ===&lt;br /&gt;
&lt;br /&gt;
Ignored&lt;br /&gt;
&lt;br /&gt;
=== Comments '^\s*#.*$' ===&lt;br /&gt;
&lt;br /&gt;
Ignored&lt;br /&gt;
&lt;br /&gt;
=== key value pairs '^\s*[^\s=]+\s*=.*$' ===&lt;br /&gt;
&lt;br /&gt;
When parsing files key names can contain any non-whitespace charactor except '='.&lt;br /&gt;
However, keys being stored in the environment must also be valid environment variable names.&lt;br /&gt;
&lt;br /&gt;
=== INI style section headers '\s*\[[^\[]+\]\s*$' ===&lt;br /&gt;
&lt;br /&gt;
Reserved for future use.  Parsing stops when the first section header is found.&lt;/div&gt;</summary>
		<author><name>MichaelDavidsaver</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=Common_Database_patterns&amp;diff=2934</id>
		<title>Common Database patterns</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=Common_Database_patterns&amp;diff=2934"/>
		<updated>2010-04-23T17:59:21Z</updated>

		<summary type="html">&lt;p&gt;MichaelDavidsaver: add pull alarm status w/ SDIS&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Pull Alarm Status w/o Data ==&lt;br /&gt;
&lt;br /&gt;
This is useful to bring alarm status in without affecting the value&lt;br /&gt;
stored in a record.  In the following example the alarm status of '''$(P):set'''&lt;br /&gt;
is fetched by '''$(P):rbv''' when it is processed, but the value is read from&lt;br /&gt;
a different record.&lt;br /&gt;
&lt;br /&gt;
 record(bo, &amp;quot;$(P):set&amp;quot;) {&lt;br /&gt;
   field(OSEV, &amp;quot;MAJOR&amp;quot;)&lt;br /&gt;
   field(FLNK, &amp;quot;$(P):rbv&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 record(bi, &amp;quot;$(P):rbv&amp;quot;) {&lt;br /&gt;
   field(SDIS, &amp;quot;$(P):set NPP MS&amp;quot;)&lt;br /&gt;
   field(DISV, &amp;quot;-1&amp;quot;)&lt;br /&gt;
   field(INP , &amp;quot;$(P):some:other:record&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Combined Setting and Readback ==&lt;br /&gt;
&lt;br /&gt;
Use when a single PV is desired.  Could be used to show the results of rounding in a float to fixed precision conversion.&lt;br /&gt;
&lt;br /&gt;
In the following example the value read from a 'bi' is inverted so that the associated 'bo' acts as a toggle.&lt;br /&gt;
&lt;br /&gt;
 record(bi, &amp;quot;$(P):rbv&amp;quot;) {&lt;br /&gt;
   field(DTYP, &amp;quot;...&amp;quot;)&lt;br /&gt;
   field(INP , &amp;quot;...&amp;quot;)&lt;br /&gt;
   field(PINI, &amp;quot;YES&amp;quot;)&lt;br /&gt;
   field(FLNK, &amp;quot;$(P):inv&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 record(calcout, &amp;quot;$(P):inv&amp;quot;)&lt;br /&gt;
   field(CALC, &amp;quot;!A&amp;quot;)&lt;br /&gt;
   field(INPA, &amp;quot;$(P):rbv&amp;quot;)&lt;br /&gt;
   field(OUT , &amp;quot;$(P) NPP&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 record(bo, &amp;quot;$(P)&amp;quot;) {&lt;br /&gt;
   field(DTYP, &amp;quot;...&amp;quot;)&lt;br /&gt;
   field(OUT , &amp;quot;...&amp;quot;)&lt;br /&gt;
   field(FLNK, &amp;quot;$(P):rbv&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The important point is the &amp;lt;i&amp;gt;NPP&amp;lt;/i&amp;gt; modifier on output link of the 'calcout' record.  This updates the &amp;lt;i&amp;gt;VAL&amp;lt;/i&amp;gt; field of the 'bo' record (and posts monitors) without processing it.&lt;/div&gt;</summary>
		<author><name>MichaelDavidsaver</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=RRM_3-14_Binary_Output&amp;diff=2875</id>
		<title>RRM 3-14 Binary Output</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=RRM_3-14_Binary_Output&amp;diff=2875"/>
		<updated>2010-04-23T17:51:36Z</updated>

		<summary type="html">&lt;p&gt;MichaelDavidsaver: add note about returning 2 from init_record&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[RRM 3-14|EPICS Record Reference Manual]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= bo - Binary Output =&lt;br /&gt;
&lt;br /&gt;
The normal use for this record type is to store a simple bit  (0 or 1) value to be sent to a Digital Output module. It can also be used to write binary values into other records via database or channel access links.  This record can implement both latched and momentary binary outputs depending on how the HIGH field is configured.&lt;br /&gt;
&lt;br /&gt;
== Parameter Fields ==&lt;br /&gt;
&lt;br /&gt;
The binary output's fields fall into the following categories:&lt;br /&gt;
&lt;br /&gt;
* scan parameters&lt;br /&gt;
* convert and write parameters&lt;br /&gt;
* operator display parameters&lt;br /&gt;
* alarm parameters&lt;br /&gt;
* run-time parameters&lt;br /&gt;
&lt;br /&gt;
=== Scan Parameters ===&lt;br /&gt;
&lt;br /&gt;
The binary output record has the standard fields for specifying under what circumstances the record will be processed. These fields are listed in [[RRM 3-14 dbCommon#Scan Fields|Scan Fields]]. In addition, [[RRM 3-14 Concepts#Scanning Specification|Scanning Specification]] explains how these fields are used. Note that I/O event scanning is only supported for those card types that interrupt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Desired Output Parameters ===&lt;br /&gt;
&lt;br /&gt;
The  binary output record must specify where its desired output originates. The desired output needs to be in engineering units.&lt;br /&gt;
&lt;br /&gt;
The first field that determines where the desired output originates is the output mode select (OMSL) field, which can have two possible values: &amp;lt;CODE&amp;gt;closed_loop&amp;lt;/CODE&amp;gt; or &amp;lt;CODE&amp;gt;supervisory&amp;lt;/CODE&amp;gt;.  If &amp;lt;CODE&amp;gt;supervisory&amp;lt;/CODE&amp;gt; is specified, the value in the VAL field can be set externally via dbPuts at run-time. If &amp;lt;CODE&amp;gt;closed_loop&amp;lt;/CODE&amp;gt; is specified, the VAL field's value is obtained from the address specified in the desired output location (DOL) field which can be either a database link or a channel access link. To achieve continuous control, a database link to a control algorithm record should be entered in the DOL field.&lt;br /&gt;
&lt;br /&gt;
[[RRM 3-14 Concepts#Address Specification|Address Specification]] presents more information on database addresses and links. [[RRM 3-14 Concepts#Scanning Specification|Scanning Specification]] explains the effect of database linkage on scanning.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TH&amp;gt;Field&amp;lt;TH&amp;gt;Summary&amp;lt;TH&amp;gt;Type&amp;lt;TH&amp;gt;DCT&amp;lt;TH&amp;gt;Initial&amp;lt;TH&amp;gt;Access&amp;lt;TH&amp;gt;Modify&amp;lt;TH&amp;gt;Rec Proc Monitor&amp;lt;TH&amp;gt;PP&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DOL&amp;lt;TD&amp;gt;Desired Output Location (Input Link)&amp;lt;TD&amp;gt;INLINK&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;N/A&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;OMSL&amp;lt;TD&amp;gt;Output Mode Select&amp;lt;TD&amp;gt;[[RRM 3-14 Menu Choices#menuOmsl|menuOmsl]]&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&lt;br /&gt;
&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Convert and Write Parameters ===&lt;br /&gt;
&lt;br /&gt;
These parameters are used to determine where the binary output writes to and how to convert the engineering units to a raw signal. After VAL is set and forced to be either 1 or 0,  as the result of either a dbPut or a new value being retrieved from the link in the DOL field, then what happens next depends on which  device support routine is used and how the HIGH field is configured.&lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;CODE&amp;gt;Soft Channel&amp;lt;/CODE&amp;gt; device support routine is specified, then the device support routine writes the VAL field's value to the address specified in the OUT field. Otherwise, RVAL is the value finally written by the device support routines after being converted.&lt;br /&gt;
&lt;br /&gt;
If VAL is equal to 0, then the record processing routine sets RVAL equal to zero. When VAL is not equal to 0, then RVAL is set equal to the value contained in the MASK field. (MASK is set by the device support routines and is of no concern to the user.) Also when VAL is not 0 and after RVAL is set equal to MASK, the record processing routine checks to see if the HIGH field is greater than 0. If it is, then the routine will process the record again with VAL set to 0 after the number of seconds specified by HIGH. Thus, HIGH implements a momentary output which changes the state of the device back to 0 after ''N'' number of seconds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TH&amp;gt;Field&amp;lt;TH&amp;gt;Summary&amp;lt;TH&amp;gt;Type&amp;lt;TH&amp;gt;DCT&amp;lt;TH&amp;gt;Initial&amp;lt;TH&amp;gt;Access&amp;lt;TH&amp;gt;Modify&amp;lt;TH&amp;gt;Rec Proc Monitor&amp;lt;TH&amp;gt;PP&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DTYP&amp;lt;TD&amp;gt;Device Type&amp;lt;TD&amp;gt;DEVCHOICE&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;OUT&amp;lt;TD&amp;gt;Output Link&amp;lt;TD&amp;gt;OUTLINK&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;N/A&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;VAL&amp;lt;TD&amp;gt;Value Field&amp;lt;TD&amp;gt;ENUM&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;RVAL&amp;lt;TD&amp;gt;Raw Data Value&amp;lt;TD&amp;gt;ULONG&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;HIGH&amp;lt;TD&amp;gt;Seconds to Hold High&amp;lt;TD&amp;gt;FLOAT&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ZNAM&amp;lt;TD&amp;gt;Zero Name&amp;lt;TD&amp;gt;STRING [20]&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Null&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;Yes&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ONAM&amp;lt;TD&amp;gt;One Name&amp;lt;TD&amp;gt;STRING [20]&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Null&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;Yes&lt;br /&gt;
&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Conversion Parameters ====&lt;br /&gt;
&lt;br /&gt;
The ZNAM field has the string that corresponds to the 0 state, and the ONAM field holds the string that corresponds to the 1 state. These fields, other than being used to tell the operator what each state represents, are used to perform conversions if the value fetched by DOL is a string. If it is, VAL is set to the state correspond to that string. For instance, if the value fetched is the string &amp;quot;Off&amp;quot; and the ZNAM string is &amp;quot;Off,&amp;quot; then VAL is set to 0.&lt;br /&gt;
&lt;br /&gt;
After VAL is set, if VAL is equal to 0, then the record processing routine sets RVAL equal to zero. When VAL is not equal to 0, then RVAL is set equal to the value contained in the MASK field. (MASK is set by the device support routines and is of no concern to the user.) Also when VAL is equal to 1 and after RVAL is set equal to MASK, the record processing routine checks to see if the HIGH field is greater than 0. If it is, then the routine process the record again with VAL=0 after the number of seconds specified by HIGH. Thus, HIGH implements a latched output which changes the state of the device or link to 1, then changes it back to 0 after N number of seconds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ZNAM&amp;lt;TD&amp;gt;ASCII string defining state zero&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ONAM&amp;lt;TD&amp;gt;ASCII string defining state one&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;HIGH&amp;lt;TD&amp;gt;If this value is greater than zero, then whenever VAL is set equal to 1, it is reset to zero after HIGH seconds.&lt;br /&gt;
&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Output Specification ====&lt;br /&gt;
&lt;br /&gt;
The OUT field specifies where the binary output record writes its output. It must specify the address of an I/O card if the record sends its output to hardware, and the DTYP field must contain a the corresponding device support module. Be aware that the address format differs according to the I/O bus used. See [[RRM 3-14 Concepts#Address Specification|Address Specification]] for information on the format of hardware addresses. You can see a list of the device support modules currently supported at the user's local site by using the &amp;lt;CODE&amp;gt;dbst&amp;lt;/CODE&amp;gt; utility in R3.13.&lt;br /&gt;
&lt;br /&gt;
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 constant. Be aware that nothing will be written when OUT is a constant. See [[RRM 3-14 Concepts#Address Specification|Address Specification]] for information on the format of database and channel access addresses. Also, see [[#Device Support For Soft Records|Device Support For Soft Records]] in this chapter for more on output to other records.&lt;br /&gt;
&lt;br /&gt;
=== Operator Display Parameters ===&lt;br /&gt;
&lt;br /&gt;
These parameters are used to present meaningful data to the operator. The &amp;lt;CODE&amp;gt;get_enum_str&amp;lt;/CODE&amp;gt; record support routine can retrieve the state string corresponding to the VAL's state. So if the value is 1, &amp;lt;CODE&amp;gt;get_enum_str&amp;lt;/CODE&amp;gt; will return the string in the ONAM field; and if 0, &amp;lt;CODE&amp;gt;get_enum_str&amp;lt;/CODE&amp;gt; will return the ZNAM string.&lt;br /&gt;
&lt;br /&gt;
See [[RRM 3-14 dbCommon#Fields Common to All Record Types|Fields Common to All Record Types]] for more on the record name (NAME) and description (DESC) fields.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TH&amp;gt;Field&amp;lt;TH&amp;gt;Summary&amp;lt;TH&amp;gt;Type&amp;lt;TH&amp;gt;DCT&amp;lt;TH&amp;gt;Initial&amp;lt;TH&amp;gt;Access&amp;lt;TH&amp;gt;Modify&amp;lt;TH&amp;gt;Rec Proc Monitor&amp;lt;TH&amp;gt;PP&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ZNAM&amp;lt;TD&amp;gt;Zero Name&amp;lt;TD&amp;gt;STRING [20]&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Null&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;Yes&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ONAM&amp;lt;TD&amp;gt;One Name&amp;lt;TD&amp;gt;STRING [20]&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Null&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;Yes&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;NAME&amp;lt;TD&amp;gt;Record Name&amp;lt;TD&amp;gt;STRING [29]&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DESC&amp;lt;TD&amp;gt;Description&amp;lt;TD&amp;gt;STRING [29]&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Null&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&lt;br /&gt;
&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Alarm Parameters ===&lt;br /&gt;
&lt;br /&gt;
These parameters are used to determine the binary output's alarm condition and to determine the severity of that condition. The possible alarm conditions for binary outputs are the SCAN, READ , INVALID, and state alarms. The user can configure the state alarm conditions using these fields.&lt;br /&gt;
&lt;br /&gt;
The possible values for these fields are &amp;lt;CODE&amp;gt;NO_ALARM&amp;lt;/CODE&amp;gt;, &amp;lt;CODE&amp;gt;MINOR&amp;lt;/CODE&amp;gt;, and &amp;lt;CODE&amp;gt;MAJOR&amp;lt;/CODE&amp;gt;. The ZSV holds the severity for the zero state; OSV for the one state. COSV is used to cause an alarm whenever the state changes between the states (0-1, or 1-0) and its severity is configured as MINOR or MAJOR.&lt;br /&gt;
&lt;br /&gt;
See [[RRM 3-14 Common#Invalid Alarm Output Action|Invalid Alarm Output Action]] for more information on the IVOA and IVOV fields. [[RRM 3-14 dbCommon#Alarm Fields|Alarm Fields]] lists other fields related to a alarms that are common to all record types.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TH&amp;gt;Field&amp;lt;TH&amp;gt;Summary&amp;lt;TH&amp;gt;Type&amp;lt;TH&amp;gt;DCT&amp;lt;TH&amp;gt;Initial&amp;lt;TH&amp;gt;Access&amp;lt;TH&amp;gt;Modify&amp;lt;TH&amp;gt;Rec Proc Monitor&amp;lt;TH&amp;gt;PP&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ZSV&amp;lt;TD&amp;gt;Zero Severity&amp;lt;TD&amp;gt;[[RRM 3-14 Menu Choices#menuAlarmSevr|menuAlarmSevr]]&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;Yes&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;OSV&amp;lt;TD&amp;gt;One Severity&amp;lt;TD&amp;gt;[[RRM 3-14 Menu Choices#menuAlarmSevr|menuAlarmSevr]]&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;Yes&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;COSV&amp;lt;TD&amp;gt;Change of State Severity&amp;lt;TD&amp;gt;[[RRM 3-14 Menu Choices#menuAlarmSevr|menuAlarmSevr]]&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;Yes&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;IVOA&amp;lt;TD&amp;gt;Invalid Alarm&amp;lt;TD&amp;gt;[[RRM 3-14 Menu Choices#menuIvoa|menuIvoa]]&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;IVOV&amp;lt;TD&amp;gt;Invalid Alarm Output Value&amp;lt;TD&amp;gt;USHORT&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&lt;br /&gt;
&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run-Time and Simulation Mode Parameters ===&lt;br /&gt;
&lt;br /&gt;
These parameters are used by the run-time code for processing the binary output. They are not configurable using a configuration tool. They represent the current state of the binary output.&lt;br /&gt;
&lt;br /&gt;
ORAW is used to determine if monitors should be triggered for RVAL at the same time they are triggered for VAL.&lt;br /&gt;
&lt;br /&gt;
MASK is given a value by the device support routines and should not concern the user.&lt;br /&gt;
&lt;br /&gt;
The RBV field is also set by device support. It is the actual read back value obtained from the hardware itself or from the associated device driver. The ORBV field is used to decide if monitors should be triggered for RBV at the same time monitors are triggered for changes in VAL. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
The MLST is used by the &amp;lt;CODE&amp;gt;process&amp;lt;/CODE&amp;gt; record support routine to determine if archive and value change monitors are invoked. They are if MLST is not equal to VAL.&lt;br /&gt;
&lt;br /&gt;
The WPDT field is a private field for honoring seconds to hold HIGH.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TH&amp;gt;Field&amp;lt;TH&amp;gt;Summary&amp;lt;TH&amp;gt;Type&amp;lt;TH&amp;gt;DCT&amp;lt;TH&amp;gt;Initial&amp;lt;TH&amp;gt;Access&amp;lt;TH&amp;gt;Modify&amp;lt;TH&amp;gt;Rec Proc Monitor&amp;lt;TH&amp;gt;PP&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ORAW&amp;lt;TD&amp;gt;Old Raw Value&amp;lt;TD&amp;gt;ULONG&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;MASK&amp;lt;TD&amp;gt;Hardware Mask&amp;lt;TD&amp;gt;ULONG&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;compute&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;RBV&amp;lt;TD&amp;gt;Readback Value&amp;lt;TD&amp;gt;ULONG&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;ORBV&amp;lt;TD&amp;gt;Old Readback Value&amp;lt;TD&amp;gt;ULONG&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;LALM&amp;lt;TD&amp;gt;Last Alarmed Value&amp;lt;TD&amp;gt;USHORT&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;MLST&amp;lt;TD&amp;gt;Last Monitored Value&amp;lt;TD&amp;gt;USHORT&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;RPVT&amp;lt;TD&amp;gt;Record Private&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;WDPT&amp;lt;TD&amp;gt;Watchdog Pointer&amp;lt;TD&amp;gt;NOACCESS&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&lt;br /&gt;
&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following fields are used to operate the binary output in the simulation mode.  See [[RRM 3-14 Common#Fields Common to Many Record Types|Fields Common to Many Record Types]] for more information on these fields.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TH&amp;gt;Field&amp;lt;TH&amp;gt;Summary&amp;lt;TH&amp;gt;Type&amp;lt;TH&amp;gt;DCT&amp;lt;TH&amp;gt;Initial&amp;lt;TH&amp;gt;Access&amp;lt;TH&amp;gt;Modify&amp;lt;TH&amp;gt;Rec Proc Monitor&amp;lt;TH&amp;gt;PP&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SIOL&amp;lt;TD&amp;gt;Simulation Value Location&amp;lt;TD&amp;gt;INLINK&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;N/A&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SIML&amp;lt;TD&amp;gt;Simulation Mode Location&amp;lt;TD&amp;gt;INLINK&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;N/A&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SIMM&amp;lt;TD&amp;gt;Simulation Mode&amp;lt;TD&amp;gt;[[RRM 3-14 Menu Choices#menuSimm|menuSimm]]&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;SIMS&amp;lt;TD&amp;gt;Simulation Mode Alarm Severity&amp;lt;TD&amp;gt;[[RRM 3-14 Menu Choices#menuAlarmSevr|menuAlarmSevr]]&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;0&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;Yes&amp;lt;TD&amp;gt;No&amp;lt;TD&amp;gt;No&lt;br /&gt;
&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Record Support ==&lt;br /&gt;
&lt;br /&gt;
=== Record Support Routines ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== init_record ====&lt;br /&gt;
&lt;br /&gt;
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 .&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
If either device support or the device support write routine does not exist, an error message is issued and processing is terminated.&lt;br /&gt;
&lt;br /&gt;
If DOL is a constant, then VAL is initialized to 1 if its value is nonzero or initialized to 0 if DOL is zero, and UDF is set to FALSE.&lt;br /&gt;
&lt;br /&gt;
If device support includes init_record, it is called. VAL is set using RVAL, and UDF is set to FALSE.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== process ====&lt;br /&gt;
&lt;br /&gt;
See next section.&lt;br /&gt;
&lt;br /&gt;
==== get_value ====&lt;br /&gt;
&lt;br /&gt;
Fills in the values of struct valueDes so that they refer to VAL.&lt;br /&gt;
&lt;br /&gt;
==== get_enum_str ====&lt;br /&gt;
&lt;br /&gt;
Retrieves ASCII string corresponding to VAL.&lt;br /&gt;
&lt;br /&gt;
==== get_enum_strs ====&lt;br /&gt;
&lt;br /&gt;
Retrieves ASCII strings for ZNAM and ONAM.&lt;br /&gt;
&lt;br /&gt;
==== put_enum_str ====&lt;br /&gt;
&lt;br /&gt;
Checks if string matches ZNAM or ONAM, and if it does, sets VAL.&lt;br /&gt;
&lt;br /&gt;
=== Record Processing ===&lt;br /&gt;
&lt;br /&gt;
Routine process implements the following algorithm:&lt;br /&gt;
&lt;br /&gt;
# 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.&lt;br /&gt;
# If PACT is FALSE&lt;br /&gt;
#* if DOL is DB_LINK and OMSL is CLOSED_LOOP&lt;br /&gt;
#** get value from DOL&lt;br /&gt;
#** check for link alarm&lt;br /&gt;
#** force VAL to be 0 or 1&lt;br /&gt;
#** if MASK is defined&lt;br /&gt;
#*** if VAL is 0 set RVAL = 0&lt;br /&gt;
#** else set RVAL = MASK&lt;br /&gt;
# 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.&lt;br /&gt;
# Check severity and write the new value. See [[RRM 3-14 Common#Invalid Alarm Output Action|Invalid Alarm Output Action]] for more information on how INVALID alarms affect output.&lt;br /&gt;
# 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.&lt;br /&gt;
# Check WAIT. If VAL is 1 and WAIT is greater than 0, process again with a VAL=0 after WAIT seconds.&lt;br /&gt;
# Check to see if monitors should be invoked.&lt;br /&gt;
#* Alarm monitors are invoked if the alarm status or severity has changed.&lt;br /&gt;
#* Archive and value change monitors are invoked if MLST is not equal to VAL.&lt;br /&gt;
#* Monitors for RVAL and for RBV are checked whenever other monitors are invoked.&lt;br /&gt;
#* NSEV and NSTA are reset to 0.&lt;br /&gt;
# Scan forward link if necessary, set PACT FALSE, and return.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Device Support ==&lt;br /&gt;
&lt;br /&gt;
=== Fields Of Interest To Device Support ===&lt;br /&gt;
&lt;br /&gt;
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 write_bo is called. The device support routines are primarily interested in the following fields:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TH&amp;gt;Name&amp;lt;TH&amp;gt;Summary&amp;lt;TH&amp;gt;Description&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;PACT&amp;lt;TD&amp;gt;Processing Active&amp;lt;TD rowspan=4&amp;gt;See [[RRM 3-14 dbCommon#Fields Common to All Record Types|Fields Common to All Record Types]] for an explanation of these fields.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;DPVT&amp;lt;TD&amp;gt;Device Private&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;NSEV&amp;lt;TD&amp;gt;New Alarm Severity&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;NSTA&amp;lt;TD&amp;gt;New Alarm Status&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;VAL&amp;lt;TD&amp;gt;Value Field&amp;lt;TD&amp;gt;This field is only of interest to device support routines that do not use MASK and RVAL.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;OUT&amp;lt;TD&amp;gt;Output Link&amp;lt;TD&amp;gt;This field is used by the device support routines to locate its output.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;RVAL&amp;lt;TD&amp;gt;Raw Data Value&amp;lt;TD&amp;gt;If MASK is defined then record support sets RVAL=(0,MASK) if VAL is (0, not zero).&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;MASK&amp;lt;TD&amp;gt;Hardware mask.&amp;lt;TD&amp;gt;The device support module must set this field. Not that if VAL is 1, then record processing sets RVAL = MASK.&amp;lt;TR&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;RBV&amp;lt;TD&amp;gt;Read Back Value&amp;lt;TD&amp;gt;This is the actual read back value obtained from the hardware itself or from the associated device driver.  It is the responsibility of the device support routine to give this field a value.&lt;br /&gt;
&amp;lt;/TABLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Device Support routines ===&lt;br /&gt;
&lt;br /&gt;
Device support consists of the following routines:&lt;br /&gt;
&lt;br /&gt;
==== report ====&lt;br /&gt;
&lt;br /&gt;
 report(FILE fp, paddr)&lt;br /&gt;
&lt;br /&gt;
Not currently used.&lt;br /&gt;
&lt;br /&gt;
==== init ====&lt;br /&gt;
&lt;br /&gt;
 init()&lt;br /&gt;
&lt;br /&gt;
This routine is called once during IOC initialization.&lt;br /&gt;
&lt;br /&gt;
==== init_record ====&lt;br /&gt;
&lt;br /&gt;
 init_record(precord)&lt;br /&gt;
&lt;br /&gt;
This routine is optional. If provided, it is called by the record support init_record routine. It should determine MASK if it is needed.&lt;br /&gt;
&lt;br /&gt;
* 0: Success. RVAL modified (VAL will be set accordingly)&lt;br /&gt;
* 2: Success. VAL modified&lt;br /&gt;
* other: Error.&lt;br /&gt;
&lt;br /&gt;
==== get_ioint_info ====&lt;br /&gt;
&lt;br /&gt;
 get_ioint_info(int cmd,struct dbCommon *precord,IOSCANPVT *ppvt)&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
==== write_bo ====&lt;br /&gt;
&lt;br /&gt;
 write_bo(precord)&lt;br /&gt;
&lt;br /&gt;
This routine must output an new value. It returns the following values:&lt;br /&gt;
&lt;br /&gt;
* 0: Success.&lt;br /&gt;
* other: Error.&lt;br /&gt;
&lt;br /&gt;
=== Device Support For Soft Records ===&lt;br /&gt;
&lt;br /&gt;
Two soft device support modules &amp;lt;CODE&amp;gt;Soft Channel&amp;lt;/CODE&amp;gt; and &amp;lt;CODE&amp;gt;Raw Soft Channel&amp;lt;/CODE&amp;gt; are provided for output records not related to actual hardware devices. The OUT link type must be either a CONSTANT, DB_LINK, or CA_LINK.&lt;br /&gt;
&lt;br /&gt;
==== Soft Channel ====&lt;br /&gt;
&lt;br /&gt;
This module writes the current value of VAL.&lt;br /&gt;
&lt;br /&gt;
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 no conversion will ever be attempted. write_bo calls recGblPutLinkValue to write the current value of VAL. See [[RRM 3-14 Common#Soft Output|Soft Output]] for details.&lt;br /&gt;
&lt;br /&gt;
==== Raw Soft Channel ====&lt;br /&gt;
&lt;br /&gt;
This module is like the previous except that it writes the current value of RVAL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
EPICS Record Reference Manual - 19 MAY 1998&lt;/div&gt;</summary>
		<author><name>MichaelDavidsaver</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=Common_Database_patterns&amp;diff=1851</id>
		<title>Common Database patterns</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=Common_Database_patterns&amp;diff=1851"/>
		<updated>2010-03-23T16:35:39Z</updated>

		<summary type="html">&lt;p&gt;MichaelDavidsaver: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Combined Setting and Readback ==&lt;br /&gt;
&lt;br /&gt;
Use when a single PV is desired.  Could be used to show the results of rounding in a float to fixed precision conversion.&lt;br /&gt;
&lt;br /&gt;
In the following example the value read from a 'bi' is inverted so that the associated 'bo' acts as a toggle.&lt;br /&gt;
&lt;br /&gt;
 record(bi, &amp;quot;$(P):rbv&amp;quot;) {&lt;br /&gt;
   field(DTYP, &amp;quot;...&amp;quot;)&lt;br /&gt;
   field(INP , &amp;quot;...&amp;quot;)&lt;br /&gt;
   field(PINI, &amp;quot;YES&amp;quot;)&lt;br /&gt;
   field(FLNK, &amp;quot;$(P):inv&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 record(calcout, &amp;quot;$(P):inv&amp;quot;)&lt;br /&gt;
   field(CALC, &amp;quot;!A&amp;quot;)&lt;br /&gt;
   field(INPA, &amp;quot;$(P):rbv&amp;quot;)&lt;br /&gt;
   field(OUT , &amp;quot;$(P) NPP&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 record(bo, &amp;quot;$(P)&amp;quot;) {&lt;br /&gt;
   field(DTYP, &amp;quot;...&amp;quot;)&lt;br /&gt;
   field(OUT , &amp;quot;...&amp;quot;)&lt;br /&gt;
   field(FLNK, &amp;quot;$(P):rbv&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The important point is the &amp;lt;i&amp;gt;NPP&amp;lt;/i&amp;gt; modifier on output link of the 'calcout' record.  This updates the &amp;lt;i&amp;gt;VAL&amp;lt;/i&amp;gt; field of the 'bo' record (and posts monitors) without processing it.&lt;/div&gt;</summary>
		<author><name>MichaelDavidsaver</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=HowTo_Documents&amp;diff=1797</id>
		<title>HowTo Documents</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=HowTo_Documents&amp;diff=1797"/>
		<updated>2010-03-23T16:22:38Z</updated>

		<summary type="html">&lt;p&gt;MichaelDavidsaver: Link to database patterns page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a directory of various How-To documents written by members of the EPICS collaboration.  Contributions to this page are most welcome!&lt;br /&gt;
&lt;br /&gt;
=== EPICS Base on Different Architectures and Operating Systems ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.aps.anl.gov/epics/base/RTEMS/tutorial/ Getting Started with EPICS on RTEMS]&lt;br /&gt;
* [[HowToPC104|Getting Started with R3.14.7 on a PC104 running Linux]]&lt;br /&gt;
* [[How To Port EPICS to a new OS/Architecture]]&lt;br /&gt;
&lt;br /&gt;
=== Drivers and Device Support ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.aps.anl.gov/epics/modules/soft/asyn/R4-8/tutorial.html How To Do Serial (using Asyn Driver)]&lt;br /&gt;
* [http://www.aps.anl.gov/epics/modules/soft/asyn/BeginnerGuideToASYN-VXI11.pdf Beginners Guide to using VXI-11 (with Asyn Driver)]&lt;br /&gt;
* [[How to make your EPICS driver operating system independent]]&lt;br /&gt;
* [[How To Write Device Support that uses Asyn Driver]] ''(Incomplete!)''&lt;br /&gt;
* [[How to use GPIB ports with linux-gpib and StreamDevice]]&lt;br /&gt;
* [[Common Database patterns]]&lt;br /&gt;
&lt;br /&gt;
=== Applications ===&lt;br /&gt;
&lt;br /&gt;
* [[How To Install Channel Archiver On Scientific Linux]]&lt;br /&gt;
* [[What PV Save and Restore Tools are available]]&lt;br /&gt;
&lt;br /&gt;
=== Infrastructure and Other Stuff ===&lt;br /&gt;
&lt;br /&gt;
* [[How To Set Up a Linux Box as an IOC Boot Server]]&lt;br /&gt;
* [[How To Set Up a Mirror of the EPICS Web Site]]&lt;br /&gt;
* [[How to Set Up a Soft IOC Framework on Linux]]&lt;br /&gt;
* [[How to Set Up Console Access and Logging for VME and Soft IOCs]]&lt;br /&gt;
* [[How to Set Up NAL (Nagios Alarm Handler) to monitor an EPICS network]]&lt;br /&gt;
&lt;br /&gt;
=== Collaboration Stuff ===&lt;br /&gt;
&lt;br /&gt;
* [[How to run an EPICS Collaboration Meeting]]&lt;/div&gt;</summary>
		<author><name>MichaelDavidsaver</name></author>
	</entry>
</feed>