Files
pvxs/documentation/ioc.rst
T
Michael Davidsaver 9c3a9ca8ee
Python / py3.10 win_amd64 (push) Failing after 4s
Python / py3.11 win_amd64 (push) Failing after 4s
Python / py3.12 win_amd64 (push) Failing after 4s
Python / py3.13 win_amd64 (push) Failing after 4s
Python / py3.14 win_amd64 (push) Failing after 4s
Python / py3.8 win_amd64 (push) Failing after 4s
PVXS EPICS / Native Linux with 3.14 (push) Failing after 2s
PVXS EPICS / Native Linux with 3.15 (push) Failing after 2s
PVXS EPICS / Native Linux with clang ubsan (push) Failing after 1s
PVXS EPICS / Native Linux with clang (push) Failing after 2s
PVXS EPICS / Native Linux (libc++ debug) (push) Failing after 1s
PVXS EPICS / Native Linux (WError) (push) Failing after 2s
PVXS EPICS / Native Linux (c++17) (push) Failing after 1s
PVXS EPICS / Native Linux with libevent stable (push) Failing after 1s
PVXS EPICS / Cross mingw64 DLL (push) Failing after 1s
PVXS EPICS / Cross mingw64 static (push) Failing after 1s
PVXS EPICS / Native Linux with 7.0.2 (push) Failing after 1s
PVXS EPICS / Linux CentOS 7 (push) Failing after 7s
GH pages / generate (push) Failing after 2s
Python / pycp27-cp27m manylinux1_x86_64 (push) Failing after 2s
PVXS EPICS / Linux fedora latest (push) Failing after 7s
Spell Check / Spell Check (push) Successful in 8s
Python / pycp37-cp37m manylinux2010_x86_64 (push) Failing after 1s
Python / pycp310-cp310 manylinux2014_x86_64 (push) Failing after 2s
Python / pycp311-cp311 manylinux2014_x86_64 (push) Failing after 1s
Python / pycp312-cp312 manylinux2014_x86_64 (push) Failing after 1s
Python / pycp313-cp313 manylinux2014_x86_64 (push) Failing after 1s
Python / pycp313-cp313t manylinux2014_x86_64 (push) Failing after 2s
Python / pycp38-cp38 manylinux2014_x86_64 (push) Failing after 1s
Python / pycp39-cp39 manylinux2014_x86_64 (push) Failing after 1s
Python / pycp314-cp314 manylinux_2_28_x86_64 (push) Failing after 1s
Python / pycp314-cp314t manylinux_2_28_x86_64 (push) Failing after 2s
Release artifacts / artifacts (push) Failing after 2m23s
GH pages / publish (push) Skipped
Python / py3.11 macosx_11_0_universal2 (push) Cancelled after 0s
Python / py3.12 macosx_11_0_universal2 (push) Cancelled after 0s
Python / py3.13 macosx_11_0_universal2 (push) Cancelled after 0s
Python / py3.14 macosx_11_0_universal2 (push) Cancelled after 0s
Python / py3.8 macosx_11_0_universal2 (push) Cancelled after 0s
PVXS EPICS / OSX (push) Cancelled after 0s
PVXS EPICS / RTEMS5 (push) Cancelled after 0s
PVXS EPICS / vs2022 DLL (push) Cancelled after 0s
PVXS EPICS / vs2022 static (push) Cancelled after 0s
Python / py3.9 macosx_11_0_universal2 (push) Cancelled after 0s
Python / py3.10 macosx_11_0_universal2 (push) Cancelled after 0s
Python / combine (push) Cancelled after 0s
1.5.0
2026-01-07 17:51:39 -08:00

219 lines
6.5 KiB
ReStructuredText

.. _iocintegration:
IOC Integration
===============
.. code-block:: c++
#include <pvxs/iochooks.h>
namespace pvxs { namespace namespace ioc { ... } }
The separate ``pvxsIoc`` library exists to run a PVXS server as part of an IOC.
See also :ref:`includepvxs`.
IOC Integration respects the **$PVXS_LOG** as well as the **$EPICS_PVA\*** environment variables
to configure :ref:`logconfig`.
Changes to this environment variable are possible prior to
calling ``*_registerRecordDeviceDriver(pdbbase)``.
IOC shell
---------
The ``pvxsIoc`` library adds several IOC shell functions which apply to all PVs
served by the Integrated PVA server.
.. cpp:function:: void pvxsr(int level)
PVXS Server Report. Shows information about server configuration (level==0)
or about connected clients (level>0). Indirectly calls `pvxs::server::Source::show`.
.. cpp:function:: void pvxsl(int level)
PVXS Server List. Lists attached Sources and PV names.
Indirectly calls `pvxs::server::Source::onList`.
.. cpp:function:: void pvxsi()
Print information about module versions, target, and toolchain.
May be requested when reporting a bug.
.. cpp:function:: void pvxs_log_config(const char *config)
Enable additional :ref:`logconfig` as if more comma separated key=VALUE pairs
were appended to the **$PVXS_LOG** environment variable.
Since 1.5.0
.. cpp:function:: void pvxs_log_reset()
Reset logging to defaults. Negates the effects of **$PVXS_LOG** and later
configuration.
Since 1.5.0
Adding custom PVs to Server
---------------------------
.. doxygenfunction:: pvxs::ioc::server
.. _qsrv2:
QSRV 2
======
Beginning with PVXS 1.2.0 the functionality of `QSRV <https://epics-base.github.io/pva2pva>`_
is replicated in the ``pvxsIoc`` library.
As of 1.4.0 QSRV2 is considered to be a complete replacement.
It is recommended not to load both ``pvxsIoc.dbd`` and ``qsrv.dbd`` in the same IOC process.
However, if this is done. Users may opt out at runtime by setting
``$PVXS_QSRV_ENABLE=NO`` before ``iocInit()``. ::
# Default with PVXS >= 1.3.0
# Needed with PVXS 1.2.x
epicsEnvSet("PVXS_QSRV_ENABLE", "YES")
iocInit()
Functionality
-------------
The features of QSRV are divided into three broad categories.
- Single PV access
- Group PV access
- PVA Links
IOC Shell
^^^^^^^^^
IOC Shell commands specific to database integration.
.. cpp:function:: void pvxgl(int level, const char* pattern)
Group PV information. At detail level 0, lists Group names.
Pattern restricts listing to only matching names.
.. cpp:function:: void dbLoadGroup(const char *file, const char* macros)
Load Group definitions from a separate JSON file.
(as opposed to ``info(Q:group, {...})`` in a .db file)
See :ref:`groupjson`.
Single PV
^^^^^^^^^
When QSRV is enabled, access to individual/single PVs in the global process database
is automatic and equivalent to the access provided by the Channel Access server
in the IOC (aka. RSRV).
So ``caget pv:name`` and ``pvxget pv:name`` should be functionally equivalent.
Beginning with 1.2.3, long string detection is automatic in some cases.
eg. ``.NAME`` and ``.INP``.
In some situations adding a ``$`` suffix is still necessary when addressing
a ``DBF_STRING`` or ``DBF_*LINK`` field to make it visible as a PVA string.
It will not be necessary for clients to interpret a ``char[]`` as a "long string". ::
# eg.
pvget some:record.NAME$
pvget some:record.INP$
An ``info(Q:form, "...")`` may be used to set the ``display.form`` PVA meta-data hint
which is used by some OPI clients. ::
record(longin, "my:bits") {
field(VAL, "0x1234")
info(Q:form, "Hex") # hint to clients to render as hexadecimal
}
or: ::
record(waveform, "my:long:string") {
field(FTVL, "CHAR")
field(NELM, "1024")
info(Q:form, "String") # hint to QSRV to expose char[] as string
}
Currently supported format hints are:
- Default
- String
- Binary
- Decimal
- Hex
- Exponential
- Engineering
When subscribing, the client provided ``pvRequest`` Value may contain the field
``records._options.DBE`` with a string or unsigned integer.
This value is mapped to a DataBase Event (DBE) bit mask.
``DBE`` may be either a string or an unsigned integer.
Use of an integer is recommended.
The ``DBE_*`` macros from the ``caeventmask.h`` header may be used
(``DBE_VALUE=1``, ``DBE_ARCHIVE=2``, ``DBE_ALARM=4``).
``DBE_PROPERTY`` will be ignored if given as this event is always
handled specially.
Alternately, ``DBE`` may be a string using the old caProvider "parsing"
rules. This is not recommended.
Until 1.3.3 ``DBE_ARCHIVE`` was not handled correctly.
Group PV
^^^^^^^^
.. toctree::
:maxdepth: 2
:caption: Contents:
qgroup
Access Security
^^^^^^^^^^^^^^^
QSRV will enforce an optional access control policy file (``.acf``) loaded by ``asSetFilename()``.
This policy is applied to Single PVs just as RSRV does for Channel Access.
With Group PVs, restrictions are not defined for the group, but rather for the individual member records.
The same policy applies whether record is accessed individually, or through a group.
Policy application differs from CA (RSRV) in several ways:
Client hostname is always the numeric IP address.
``HAG()`` entries must either contained numeric IP addresses,
or that ``asCheckClientIP=1`` flag must be set to translate hostnames into IPs on ACF file load (effects CA server as well).
This prevents clients from trivially forging "hostname".
In additional to client usernames ``UAG()`` definitions may contained items beginning with ``role/`` which are matched against the list of local systems groups of which the client username is a member.
Username to group lookup is done *locally* by QSRV, and depends on IOC host authentication configuration.
Note that this is still based on the client provided username string. ::
UAG(special) {
someone, "role/op"
}
The "special" ``UAG()`` will match CA or PVA clients with the username "someone".
It will also match a PVA client if the "special" account exists locally,
and is a member of the "op" group (supported on POSIX targets and Windows).
PVAccess Links
^^^^^^^^^^^^^^
Since PVXS 1.3.0.
When built against Base >= 7.0.1, support is enabled for PVAccess links
using JSON link support syntax. ::
record(longin, "tgt") {}
record(longin, "src") {
field(INP, {pva:{pv:"tgt"}})
}
.. note: The "dbjlr" and "dbpvar" IOC shell command provide information about PVA links in a running IOC.
.. toctree::
:maxdepth: 2
:caption: Contents:
pvalink