=title Extensible IOC Database Links The extensible link mechanism allows new kinds of record links to be created, using JSON for the link address syntax. The IOC continues to support the older link types that do not use JSON to specify their link addresses. The following additional link types are available in this release: =over =item * L =item * L =item * L =item * L =item * L =back =head2 Using JSON Links When setting a record link field to a JSON link address, the link specification must appear inside a pair of braces C< {} > expressed as a JSON5 (L) object, which allows link parameters to be defined as needed by the particular link type. When link fields are set in an IOC database file, the field value may take advantage of the JSON5 syntax to reduce the number of double-quote characters required. =head2 Link Type Reference =cut link(const, lnkConstIf) =head3 Constant Link C<"const"> Constant links are input links that provide literal values at link initialization time, but do not return any data when their C routine is called. Most record types support the use of constant links on their input links by calling C at record initialization, which results in the constant value being loaded into the target field at that time. Note that for most record types (the C and C records are the main exceptions) it is pointless to set an input link to a constant link at runtime since the link initialization that loads the field value usually only happens when a record is initialized. A constant link that is embedded inside another input link type such as a calculation link should be OK though since the link initialization will take place when the record's field gets set. =head4 Parameters A const link takes a parameter which may be an integer, double or string, or an array of those types. If an array contains both integers and double values the integers will be promoted to doubles. Mixing strings and numbers in an array results in an error. =head4 Examples {const: 3.14159265358979} {const: "Pi"} {const: [1, 2.718281828459, 3.14159265358979]} {const: ["One", "e", "Pi"]} {const:[Inf, -Inf]}) The newer JSON5 syntax supports Infinity values when parsing numbers, so it is no longer necessary to quote these in a string, although that still works: field(INP, {const:"Inf"}) =cut link(calc, lnkCalcIf) =head3 Calculation Link C<"calc"> A calculation link is an input link that can evaluate mathematical expressions on scalar (double-precision floating-point) values obtained from up to 21 child input links, and returns a double-precision floating-point result. The expression is evaluated by the EPICS Calc engine, and the result is returned as the value of the link. Since UNRELEASED the number of inputs has been increased from 12 to 21. Two additional expressions may also be provided and are evaluated to determine whether the record owning the link should be placed in alarm state. In both cases the result of the main calculation is available to these expressions as C (attempts to assign to C inside either expression will have no lasting effect). If the C expression evaluates to a non-zero value the record will be placed in C alarm. If not and the C expression evaluates to non-zero the record will be placed in C alarm state. A calculation link can also be an output link, with the scalar output value being converted to a double and provided to the expression as C. Up to 21 additional input links can also be read and provided to the expression as above. The result of the calculation is forwarded to a child output link specified in the link's C parameter. For an output link the main expression is actually optional; if not provided the converted value will be forwarded to the output link unchanged. The two alarm expressions may still be used to put the output link into alarm state as described above. =head4 Parameters The link address is a JSON map with the following keys: =over =item expr The primary expression to be evaluated, given as a string. This is optional for output links, required for input links. =item major An optional expression that returns non-zero to raise a major alarm. =item minor An optional expression that returns non-zero to raise a minor alarm. =item args A JSON list of up to 24 input arguments for the expression, which are assigned to the inputs C, C, C, ... C. Each input argument may be either a numeric literal or an embedded JSON link inside C<{}> braces. The same input values are provided to the two alarm expressions as to the primary expression. =item out A JSON link inside C<{}> braces which specifies the destination of C operations after any expressions have been evaluated. This key is required for output links, not used by input links. =item units An optional string specifying the engineering units for the result of the expression. Equivalent to the C field of a record. =item prec An optional integer specifying the numeric precision with which the calculation result should be displayed. Equivalent to the C field of a record. =item time An optional string containing a single upper or lower-case letter C ... C which must correspond to an input provided in the C parameter. When the record containing such a link has C set to -2 (epicsTimeEventDeviceTime) the record's timestamp field C