Difference between revisions of "RRM 3-14 Calculation"

From EPICSWIKI
(Correct INPx field data)
 
(23 intermediate revisions by 5 users not shown)
Line 21: Line 21:
=== Scan Parameters ===
=== Scan Parameters ===


The Calc record has the standard fields for specifying under what circumstances the record will be processed. These fields are listed in [[RRM 3-13 dbCommon#Scan Fields|Scan Fields]]. In addition, [[RRM 3-13 Concepts#Scanning Specification|Scanning Specification]] explains how these fields are used. Since the Calc record supports no direct interfaces to hardware, it cannot be scanned on I/O interrupt, so its SCAN field cannot be <CODE>I/O Intr</CODE>.
The Calc 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. Since the Calc record supports no direct interfaces to hardware, it cannot be scanned on I/O interrupt, so its SCAN field cannot be <CODE>I/O Intr</CODE>.




Line 28: Line 28:
The read parameters for the Calc record consist of 12 input links INPA, INPB, ... INPL. The fields can be database links, channel access links, or constants. If they are links, they must specify another record's field or a channel access link. If they are constants, they will be initialized with the value they are configured with and can be changed via <CODE>dbPuts</CODE>. They cannot be hardware addresses.
The read parameters for the Calc record consist of 12 input links INPA, INPB, ... INPL. The fields can be database links, channel access links, or constants. If they are links, they must specify another record's field or a channel access link. If they are constants, they will be initialized with the value they are configured with and can be changed via <CODE>dbPuts</CODE>. They cannot be hardware addresses.


See [[RRM 3-13 Concepts#Address Specification|Address Specification]] for information on how to specify database links.
See [[RRM 3-14 Concepts#Address Specification|Address Specification]] for information on how to specify database links.




<TABLE BORDER="1">
<TABLE BORDER="1">
<TH>Field<TH>Summary<TH>Type<TH>DCT<TH>Initial<TH>Access<TH>Modify<TH>Rec Proc Monitor<TR>
<TH>Field<TH>Summary<TH>Type<TH>DCT<TH>Initial<TH>Access<TH>Modify<TH>Rec Proc Monitor<TR>
<TD>INPA<TD>Input Link A<TD>INLINK<TD>Yes<TD>0<TD>No<TD>No<TD>N/A<TR>
<TD>INPA<TD>Input Link A<TD>INLINK<TD>Yes<TD>&nbsp;<TD>Yes<TD>Yes<TD>No<TR>
<TD>INPB<TD>Input Link B<TD>INLINK<TD>Yes<TD>0<TD>No<TD>No<TD>N/A<TR>
<TD>INPB<TD>Input Link B<TD>INLINK<TD>Yes<TD>&nbsp;<TD>Yes<TD>Yes<TD>No<TR>
<TD>INPC<TD>Input Link C<TD>INLINK<TD>Yes<TD>0<TD>No<TD>No<TD>N/A<TR>
<TD>INPC<TD>Input Link C<TD>INLINK<TD>Yes<TD>&nbsp;<TD>Yes<TD>Yes<TD>No<TR>
<TD>INPD<TD>Input Link D<TD>INLINK<TD>Yes<TD>0<TD>No<TD>No<TD>N/A<TR>
<TD>INPD<TD>Input Link D<TD>INLINK<TD>Yes<TD>&nbsp;<TD>Yes<TD>Yes<TD>No<TR>
<TD>INPE<TD>Input Link E<TD>INLINK<TD>Yes<TD>0<TD>No<TD>No<TD>N/A<TR>
<TD>INPE<TD>Input Link E<TD>INLINK<TD>Yes<TD>&nbsp;<TD>Yes<TD>Yes<TD>No<TR>
<TD>INPF<TD>Input Link F<TD>INLINK<TD>Yes<TD>0<TD>No<TD>No<TD>N/A<TR>
<TD>INPF<TD>Input Link F<TD>INLINK<TD>Yes<TD>&nbsp;<TD>Yes<TD>Yes<TD>No<TR>
<TD>INPG<TD>Input Link G<TD>INLINK<TD>Yes<TD>0<TD>No<TD>No<TD>N/A<TR>
<TD>INPG<TD>Input Link G<TD>INLINK<TD>Yes<TD>&nbsp;<TD>Yes<TD>Yes<TD>No<TR>
<TD>INPH<TD>Input Link H<TD>INLINK<TD>Yes<TD>0<TD>No<TD>No<TD>N/A<TR>
<TD>INPH<TD>Input Link H<TD>INLINK<TD>Yes<TD>&nbsp;<TD>Yes<TD>Yes<TD>No<TR>
<TD>INPI<TD>Input Link I<TD>INLINK<TD>Yes<TD>0<TD>No<TD>No<TD>N/A<TR>
<TD>INPI<TD>Input Link I<TD>INLINK<TD>Yes<TD>&nbsp;<TD>Yes<TD>Yes<TD>No<TR>
<TD>INPJ<TD>Input Link J<TD>INLINK<TD>Yes<TD>0<TD>No<TD>No<TD>N/A<TR>
<TD>INPJ<TD>Input Link J<TD>INLINK<TD>Yes<TD>&nbsp;<TD>Yes<TD>Yes<TD>No<TR>
<TD>INPK<TD>Input Link K<TD>INLINK<TD>Yes<TD>0<TD>No<TD>No<TD>N/A<TR>
<TD>INPK<TD>Input Link K<TD>INLINK<TD>Yes<TD>&nbsp;<TD>Yes<TD>Yes<TD>No<TR>
<TD>INPL<TD>Input Link L<TD>INLINK<TD>Yes<TD>0<TD>No<TD>No<TD>N/A
<TD>INPL<TD>Input Link L<TD>INLINK<TD>Yes<TD>&nbsp;<TD>Yes<TD>Yes<TD>No
</TABLE>
</TABLE>


Line 52: Line 52:
At the core of the Calc record lie the CALC and RPCL fields. The CALC field contains the infix expression which the record routine will use when it processes the record. The resulting value is placed in the VAL field and can be accessed from there. The CALC expression is actually converted to opcode and stored as in Reverse Polish Notation in the RPCL field. It is this expression which is actually used to calculate VAL. The Reverse Polish expression is evaluated more efficiently during run-time than an infix expression. CALC can be changed at run-time, and a special record routine calls a function to convert it to Reverse Polish Notation.
At the core of the Calc record lie the CALC and RPCL fields. The CALC field contains the infix expression which the record routine will use when it processes the record. The resulting value is placed in the VAL field and can be accessed from there. The CALC expression is actually converted to opcode and stored as in Reverse Polish Notation in the RPCL field. It is this expression which is actually used to calculate VAL. The Reverse Polish expression is evaluated more efficiently during run-time than an infix expression. CALC can be changed at run-time, and a special record routine calls a function to convert it to Reverse Polish Notation.


The range of expressions supported by the calculation record are separated into operands, algebraic operators, trigonometric operators, relational operators, logical operators, parentheses and commas, and the question mark or '?:' operator. The expression can consist of any of these operators, as well as any of the values from the input links which are the operands.
The infix expressions that can be used are very similar to the C expression syntax, but with some additions and subtle differences in operator meaning and precedence. The string may contain a series of expressions separated by a semi-colon character ';' any one of which may actually provide the calculation result; however all of the other expressions included must assign their result to a variable. All alphabetic elements described below are case independent, so upper and lower case letters may be used and mixed in the variable and function names as desired. Spaces may be used anywhere within an expression except between the characters that make up a single expression element.
 
The range of expressions supported by the calculation record are separated into literals, constants, operands, algebraic operators, trigonometric operators, relational operators, logical operators, the assignment operator, parentheses and commas, and the question mark or '?:' operator.
 
 
-----
'''NOTE:''' A complete up-to-date description of the calculation expression can be found in the '''Application Developer's Guide''', chapter libCom / calc / Infix Expression Syntax (19.2.1 for EPICS 3.14.11).
-----




Line 61: Line 68:
</TABLE>
</TABLE>


==== Literals ====
* Standard double precision floating point numbers
* Inf: Infinity
* Nan: Not a Number
==== Constants ====
* PI: returns the mathematical constant pi
* D2R: evaluates to PI/180 which, when used as a multiplier, converts an angle from degrees to radians
* R2D: evaluates to 180/PI which as a multiplier converts an angle from radians to degrees


==== Operands ====
==== Operands ====


The expression uses the values retrieved from the INP''x'' links as operands, though constants can be used as operands too. These values retrieved from the input links are stored in the A-L fields. The values to be used in the expression are simply referenced by the field letter. For instance, the value obtained from the INPA link is stored in the field A, and the value obtained from INPB is stored in field B. The field names can be included in the expression which will operate on their respective values, as in A+B. Also, the RNDM unary function can be included as an operand in the expression in order to generate a random number between 0 and 1.
The expression uses the values retrieved from the INP''x'' links as operands, though constants can be used as operands too. These values retrieved from the input links are stored in the A-L fields. The values to be used in the expression are simply referenced by the field letter. For instance, the value obtained from the INPA link is stored in the field A, and the value obtained from INPB is stored in field B. The field names can be included in the expression which will operate on their respective values, as in A+B. Also, the RNDM nullary function can be included as an operand in the expression in order to generate a random number between 0 and 1.




Line 83: Line 102:
</TABLE>
</TABLE>


The keyword VAL returns the current contents of the VAL field (which can be written to by a CA put, so it might ''not'' be the result from last time the expression was evaluated).
Also, the RNDM nullary function can be included as an operand in the expression in order to generate a random number between 0 and 1.


==== Algebraic Operators ====
==== Algebraic Operators ====


* ABS: Absolute value (unary)
* ABS: Absolute value (unary)
* SQR: Square root (unary)
* SQR: Square root (unary)
* MIN: Minimum (binary function)
* MIN: Minimum (any number of args)
* MAX: Maximum (binary function)
* MAX: Maximum (any number of args)
* FINITE: returns non-zero if none of the arguments are NaN or Inf (any number of args)
* ISNAN: returns non-zero if any of the arguments is NaN or Inf (any number of args)
* CEIL: Ceiling (unary)
* CEIL: Ceiling (unary)
* FLOOR: Floor (unary)
* FLOOR: Floor (unary)
* LOG: Log base 10 (unary)
* LOG: Log base 10 (unary)
* LOGE: Natural log (unary)
* LOGE: Natural log (unary)
* LN: Natural log (unary)
* EXP: Exponential function (unary)
* EXP: Exponential function (unary)
* ^: Exponential (binary)
* ^: Exponential (binary)
Line 106: Line 131:


==== Trigonometric Operators ====
==== Trigonometric Operators ====


* SIN: Sine
* SIN: Sine
Line 119: Line 143:


==== Relational Operators ====
==== Relational Operators ====


* &gt;= : Greater than or equal to
* &gt;= : Greater than or equal to
Line 129: Line 152:


==== Logical Operators ====
==== Logical Operators ====


* &amp;&amp; : And
* &amp;&amp; : And
Line 136: Line 158:


==== Bitwise Operators ====
==== Bitwise Operators ====


* | : Bitwise Or
* | : Bitwise Or
Line 147: Line 168:
* &gt;&gt; : Right shift
* &gt;&gt; : Right shift


==== Parentheses and Comma ====
==== Assignment Operator ====
 
* := : assigns a value (right hand side) to a variable (i.e. field)
 
==== Parentheses, Comma, and Semicolon ====


The open and close parentheses are supported. Nested parenthesis are supported.
The open and close parentheses are supported. Nested parenthesis are supported.
Line 153: Line 178:
The comma is supported when used to separate the arguments of a binary function.
The comma is supported when used to separate the arguments of a binary function.


The semicolon is used to separate expressions.  Although only one traditional calculation expression is allowed, multiple assignment expressions are allowed.


==== Conditional Expression ====
==== Conditional Expression ====
Line 158: Line 184:
The C language's question mark operator is supported. The format is:
The C language's question mark operator is supported. The format is:


  (condition)? True result : False result
  condition ? True result : False result
 


=== Expression Examples ===
=== Expression Examples ===


==== Algebraic ====
==== Algebraic ====
Line 168: Line 192:
  A + B + 10
  A + B + 10


* Result is A + B
* Result is A + B + 10


==== Relational ====
==== Relational ====
Line 183: Line 207:
* Result is E if (A+B) &lt; (C+D)
* Result is E if (A+B) &lt; (C+D)
* Result is F+L+10 if (A+B) &gt;= (C+D)
* Result is F+L+10 if (A+B) &gt;= (C+D)
Prior to Base 3.14.9 it was legal to omit the : and the second (else) part of the conditional, like this:


  (A+B)&lt;(C+D)?E
  (A+B)&lt;(C+D)?E
Line 188: Line 214:
* Result is E if (A+B) &lt; (C+D)
* Result is E if (A+B) &lt; (C+D)
* Result is unchanged if (A+B) &gt;= (C+D)
* Result is unchanged if (A+B) &gt;= (C+D)
From 3.14.9 onwards this expression must be rewritten as
(A+B)&lt;(C+D)?E:VAL


==== Logical ====
==== Logical ====
Line 198: Line 228:
** Bit-wise And A and B
** Bit-wise And A and B
** Convert result to floating point
** Convert result to floating point
==== Assignment ====
sin(a);&nbsp;a:=a+d2r
* Causes the CALC record to output the successive values of a sine curve in 1 degree intervals


=== Operator Display Parameters ===
=== Operator Display Parameters ===
Line 207: Line 243:
The HOPR and LOPR fields only refer to the limits of the VAL, HIHI, HIGH, LOW, and LOLO fields. PREC controls the precision of the VAL field.
The HOPR and LOPR fields only refer to the limits of the VAL, HIHI, HIGH, LOW, and LOLO fields. PREC controls the precision of the VAL field.


See [[RRM 3-13 dbCommon#Fields Common to All Record Types|Fields Common to All Record Types]] for more on the record name (NAME) and description (DESC) fields.
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.




Line 227: Line 263:
The following alarm parameters which are configured by the user define the limit alarms for the VAL field and the severity corresponding to those conditions.
The following alarm parameters which are configured by the user define the limit alarms for the VAL field and the severity corresponding to those conditions.


The HYST field defines an alarm deadband for each limit. See [[RRM 3-13 Concepts#Alarm Specification|Alarm Specification]] for a complete explanation of alarms and these fields. [[RRM 3-13 dbCommon#Alarm Fields|Alarm Fields]] lists other fields related to a alarms that are common to all record types.
The HYST field defines an alarm deadband for each limit. See [[RRM 3-14 Concepts#Alarm Specification|Alarm Specification]] for a complete explanation of alarms and these fields. [[RRM 3-14 dbCommon#Alarm Fields|Alarm Fields]] lists other fields related to alarms that are common to all record types.




Line 236: Line 272:
<TD>LOW<TD>Low Alarm Limit<TD>FLOAT<TD>Yes<TD>0<TD>Yes<TD>Yes<TD>No<TD>Yes<TR>
<TD>LOW<TD>Low Alarm Limit<TD>FLOAT<TD>Yes<TD>0<TD>Yes<TD>Yes<TD>No<TD>Yes<TR>
<TD>LOLO<TD>Lolo Alarm Limit<TD>FLOAT<TD>Yes<TD>0<TD>Yes<TD>Yes<TD>No<TD>Yes<TR>
<TD>LOLO<TD>Lolo Alarm Limit<TD>FLOAT<TD>Yes<TD>0<TD>Yes<TD>Yes<TD>No<TD>Yes<TR>
<TD>HHSV<TD>Severity for a Hihi Alarm<TD>[[RRM 3-13 Menu Choices|GBLCHOICE]]<TD>Yes<TD>0<TD>Yes<TD>Yes<TD>No<TD>Yes<TR>
<TD>HHSV<TD>Severity for a Hihi Alarm<TD>[[RRM 3-14 Menu Choices|GBLCHOICE]]<TD>Yes<TD>0<TD>Yes<TD>Yes<TD>No<TD>Yes<TR>
<TD>HSV<TD>Severity for a High Alarm<TD>[[RRM 3-13 Menu Choices|GBLCHOICE]]<TD>Yes<TD>0<TD>Yes<TD>Yes<TD>No<TD>Yes<TR>
<TD>HSV<TD>Severity for a High Alarm<TD>[[RRM 3-14 Menu Choices|GBLCHOICE]]<TD>Yes<TD>0<TD>Yes<TD>Yes<TD>No<TD>Yes<TR>
<TD>LSV<TD>Severity for a Low Alarm<TD>[[RRM 3-13 Menu Choices|GBLCHOICE]]<TD>Yes<TD>0<TD>Yes<TD>Yes<TD>No<TD>Yes<TR>
<TD>LSV<TD>Severity for a Low Alarm<TD>[[RRM 3-14 Menu Choices|GBLCHOICE]]<TD>Yes<TD>0<TD>Yes<TD>Yes<TD>No<TD>Yes<TR>
<TD>LLSV<TD>Severity for a Lolo Alarm<TD>[[RRM 3-13 Menu Choices|GBLCHOICE]]<TD>Yes<TD>0<TD>Yes<TD>Yes<TD>No<TD>Yes<TR>
<TD>LLSV<TD>Severity for a Lolo Alarm<TD>[[RRM 3-14 Menu Choices|GBLCHOICE]]<TD>Yes<TD>0<TD>Yes<TD>Yes<TD>No<TD>Yes<TR>
<TD>HYST<TD>Alarm Deadband<TD>DOUBLE<TD>Yes<TD>0<TD>Yes<TD>Yes<TD>No<TD>No
<TD>HYST<TD>Alarm Deadband<TD>DOUBLE<TD>Yes<TD>0<TD>Yes<TD>Yes<TD>No<TD>No
</TABLE>
</TABLE>


=== Monitor Parameters ===
=== Monitor Parameters ===


These parameters are used to determine when to send monitors for the value fields. The monitors are sent when the value field exceeds the last monitored field by the appropriate deadband, the ADEL for archiver monitors and the MDEL field for all other types of monitors. If these fields have a value of zero, everytime the value changes, monitors are triggered; if they have a value of -1, everytime the record is scanned, monitors are triggered. See [[RRM 3-13 Concepts#Monitor Specification|Monitor Specification]] for a complete explanation of monitors.
These parameters are used to determine when to send monitors for the value fields. The monitors are sent when the value field exceeds the last monitored field by the appropriate deadband, the ADEL for archiver monitors and the MDEL field for all other types of monitors. If these fields have a value of zero, everytime the value changes, monitors are triggered; if they have a value of -1, everytime the record is scanned, monitors are triggered. See [[RRM 3-14 Concepts#Monitor Specification|Monitor Specification]] for a complete explanation of monitors.





Latest revision as of 19:17, 22 March 2016

EPICS Record Reference Manual


Calc - Calculation

The calculation or "Calc" record is used to perform algebraic, relational, and logical operations on values retrieved from other records. The result of its operations can then be accessed by another record so that it can be used.

Parameter Fields

The fields in this record fall into these categories:

  • scan parameters
  • read parameters
  • expression parameters
  • operator display parameters
  • alarm parameters
  • monitor parameters
  • run-time parameters


Scan Parameters

The Calc record has the standard fields for specifying under what circumstances the record will be processed. These fields are listed in Scan Fields. In addition, Scanning Specification explains how these fields are used. Since the Calc record supports no direct interfaces to hardware, it cannot be scanned on I/O interrupt, so its SCAN field cannot be I/O Intr.


Read Parameters

The read parameters for the Calc record consist of 12 input links INPA, INPB, ... INPL. The fields can be database links, channel access links, or constants. If they are links, they must specify another record's field or a channel access link. If they are constants, they will be initialized with the value they are configured with and can be changed via dbPuts. They cannot be hardware addresses.

See Address Specification for information on how to specify database links.


FieldSummaryTypeDCTInitialAccessModifyRec Proc Monitor
INPAInput Link AINLINKYes YesYesNo
INPBInput Link BINLINKYes YesYesNo
INPCInput Link CINLINKYes YesYesNo
INPDInput Link DINLINKYes YesYesNo
INPEInput Link EINLINKYes YesYesNo
INPFInput Link FINLINKYes YesYesNo
INPGInput Link GINLINKYes YesYesNo
INPHInput Link HINLINKYes YesYesNo
INPIInput Link IINLINKYes YesYesNo
INPJInput Link JINLINKYes YesYesNo
INPKInput Link KINLINKYes YesYesNo
INPLInput Link LINLINKYes YesYesNo


Expression

At the core of the Calc record lie the CALC and RPCL fields. The CALC field contains the infix expression which the record routine will use when it processes the record. The resulting value is placed in the VAL field and can be accessed from there. The CALC expression is actually converted to opcode and stored as in Reverse Polish Notation in the RPCL field. It is this expression which is actually used to calculate VAL. The Reverse Polish expression is evaluated more efficiently during run-time than an infix expression. CALC can be changed at run-time, and a special record routine calls a function to convert it to Reverse Polish Notation.

The infix expressions that can be used are very similar to the C expression syntax, but with some additions and subtle differences in operator meaning and precedence. The string may contain a series of expressions separated by a semi-colon character ';' any one of which may actually provide the calculation result; however all of the other expressions included must assign their result to a variable. All alphabetic elements described below are case independent, so upper and lower case letters may be used and mixed in the variable and function names as desired. Spaces may be used anywhere within an expression except between the characters that make up a single expression element.

The range of expressions supported by the calculation record are separated into literals, constants, operands, algebraic operators, trigonometric operators, relational operators, logical operators, the assignment operator, parentheses and commas, and the question mark or '?:' operator.



NOTE: A complete up-to-date description of the calculation expression can be found in the Application Developer's Guide, chapter libCom / calc / Infix Expression Syntax (19.2.1 for EPICS 3.14.11).



FieldSummaryTypeDCTInitialAccessModifyRec Proc MonitorPP
CALCCalculationDBF_STRINGYes0YesYesYesYes
RPCLReverse PolishDBF_NOACCESSNo0NoNoN/ANo


Literals

  • Standard double precision floating point numbers
  • Inf: Infinity
  • Nan: Not a Number

Constants

  • PI: returns the mathematical constant pi
  • D2R: evaluates to PI/180 which, when used as a multiplier, converts an angle from degrees to radians
  • R2D: evaluates to 180/PI which as a multiplier converts an angle from radians to degrees

Operands

The expression uses the values retrieved from the INPx links as operands, though constants can be used as operands too. These values retrieved from the input links are stored in the A-L fields. The values to be used in the expression are simply referenced by the field letter. For instance, the value obtained from the INPA link is stored in the field A, and the value obtained from INPB is stored in field B. The field names can be included in the expression which will operate on their respective values, as in A+B. Also, the RNDM nullary function can be included as an operand in the expression in order to generate a random number between 0 and 1.


FieldSummaryTypeDCTInitialAccessModifyRec Proc MonitorPP
AInput Value ADOUBLENo0YesYes/NoYesYes
BInput Value BDOUBLENo0YesYes/NoYesYes
CInput Value CDOUBLENo0YesYes/NoYesYes
DInput Value DDOUBLENo0YesYes/NoYesYes
EInput Value EDOUBLENo0YesYes/NoYesYes
FInput Value FDOUBLENo0YesYes/NoYesYes
GInput Value GDOUBLENo0YesYes/NoYesYes
HInput Value HDOUBLENo0YesYes/NoYesYes
IInput Value IDOUBLENo0YesYes/NoYesYes
JInput Value JDOUBLENo0YesYes/NoYesYes
KInput Value KDOUBLENo0YesYes/NoYesYes
LInput Value LDOUBLENo0YesYes/NoYesYes


The keyword VAL returns the current contents of the VAL field (which can be written to by a CA put, so it might not be the result from last time the expression was evaluated).

Also, the RNDM nullary function can be included as an operand in the expression in order to generate a random number between 0 and 1.

Algebraic Operators

  • ABS: Absolute value (unary)
  • SQR: Square root (unary)
  • MIN: Minimum (any number of args)
  • MAX: Maximum (any number of args)
  • FINITE: returns non-zero if none of the arguments are NaN or Inf (any number of args)
  • ISNAN: returns non-zero if any of the arguments is NaN or Inf (any number of args)
  • CEIL: Ceiling (unary)
  • FLOOR: Floor (unary)
  • LOG: Log base 10 (unary)
  • LOGE: Natural log (unary)
  • LN: Natural log (unary)
  • EXP: Exponential function (unary)
  • ^: Exponential (binary)
  • ** : Exponential (binary)
  • + : Addition (binary)
  • - : Subtraction (binary)
  • * : Multiplication (binary)
  • / : Division (binary)
  • % : Modulo (binary)
  • NOT: Negate (unary)

Trigonometric Operators

  • SIN: Sine
  • SINH: Hyperbolic sine
  • ASIN: Arc sine
  • COS: Cosine
  • COSH: Hyperbolic cosine
  • ACOS: Arc cosine
  • TAN: Tangent
  • TANH: Hyperbolic tangent
  • ATAN: Arc tangent

Relational Operators

  • >= : Greater than or equal to
  • > : Greater than
  • <= : Less than or equal to
  • <: Less than
  • # : Not equal to
  • = : Equal to

Logical Operators

  • && : And
  • || : Or
  • ! : Not

Bitwise Operators

  • | : Bitwise Or
  • & : Bitwise And
  • OR : Bitwise Or
  • AND: Bitwise And
  • XOR: Bitwise Exclusive Or
  • ~ : One's Complement
  • << : Left shift
  • >> : Right shift

Assignment Operator

  • := : assigns a value (right hand side) to a variable (i.e. field)

Parentheses, Comma, and Semicolon

The open and close parentheses are supported. Nested parenthesis are supported.

The comma is supported when used to separate the arguments of a binary function.

The semicolon is used to separate expressions. Although only one traditional calculation expression is allowed, multiple assignment expressions are allowed.

Conditional Expression

The C language's question mark operator is supported. The format is:

condition ? True result : False result

Expression Examples

Algebraic

A + B + 10
  • Result is A + B + 10

Relational

(A + B) < (C + D)
  • Result is 1 if (A+B) < (C+D)
  • Result is 0 if (A+B) >= (C+D)

Question Mark

(A+B)<(C+D)?E:F+L+10
  • Result is E if (A+B) < (C+D)
  • Result is F+L+10 if (A+B) >= (C+D)

Prior to Base 3.14.9 it was legal to omit the : and the second (else) part of the conditional, like this:

(A+B)<(C+D)?E
  • Result is E if (A+B) < (C+D)
  • Result is unchanged if (A+B) >= (C+D)

From 3.14.9 onwards this expression must be rewritten as

(A+B)<(C+D)?E:VAL

Logical

A&B
  • Causes the following to occur:
    • Convert A to integer
    • Convert B to integer
    • Bit-wise And A and B
    • Convert result to floating point

Assignment

sin(a); a:=a+d2r
  • Causes the CALC record to output the successive values of a sine curve in 1 degree intervals

Operator Display Parameters

These parameters are used to present meaningful data to the operator. These fields are used to display VAL and the other parameters of the calculation record either textually or graphically.

The EGU field contains a string of up to 16 characters which is supplied by the user and which describes the values being operated upon. The string is retrieved whenever the routine get_units is called. The EGU string is solely for an operator's sake and does not have to be used.

The HOPR and LOPR fields only refer to the limits of the VAL, HIHI, HIGH, LOW, and LOLO fields. PREC controls the precision of the VAL field.

See Fields Common to All Record Types for more on the record name (NAME) and description (DESC) fields.


FieldSummaryTypeDCTInitialAccessModifyRec Proc MonitorPP
EGUEngineering UnitsSTRING [16]YesNullYesYesNoNo
PRECDisplay PrecisionSHORTYes0YesYesNoNo
HOPRHigh Operating RangeFLOATYes0YesYesNoNo
LOPRLow Operating RangeFLOATYes0YesYesNoNo
NAMERecord NameSTRING [29]Yes0YesNoNoNo
DESCDescriptionSTRING [29]YesNullYesYesNoNo


Alarm Parameters

The possible alarm conditions for the Calc record are the SCAN, READ, Calculation, and limit alarms. The SCAN and READ alarms are called by the record support routines. The Calculation alarm is called by the record processing routine when the CALC expression is an invalid one, upon which an error message is generated.

The following alarm parameters which are configured by the user define the limit alarms for the VAL field and the severity corresponding to those conditions.

The HYST field defines an alarm deadband for each limit. See Alarm Specification for a complete explanation of alarms and these fields. Alarm Fields lists other fields related to alarms that are common to all record types.


FieldSummaryTypeDCTInitialAccessModifyRec Proc MonitorPP
HIHIHihi Alarm LimitFLOATYes0YesYesNoYes
HIGHHigh Alarm LimitFLOATYes0YesYesNoYes
LOWLow Alarm LimitFLOATYes0YesYesNoYes
LOLOLolo Alarm LimitFLOATYes0YesYesNoYes
HHSVSeverity for a Hihi AlarmGBLCHOICEYes0YesYesNoYes
HSVSeverity for a High AlarmGBLCHOICEYes0YesYesNoYes
LSVSeverity for a Low AlarmGBLCHOICEYes0YesYesNoYes
LLSVSeverity for a Lolo AlarmGBLCHOICEYes0YesYesNoYes
HYSTAlarm DeadbandDOUBLEYes0YesYesNoNo

Monitor Parameters

These parameters are used to determine when to send monitors for the value fields. The monitors are sent when the value field exceeds the last monitored field by the appropriate deadband, the ADEL for archiver monitors and the MDEL field for all other types of monitors. If these fields have a value of zero, everytime the value changes, monitors are triggered; if they have a value of -1, everytime the record is scanned, monitors are triggered. See Monitor Specification for a complete explanation of monitors.


FieldSummaryTypeDCTInitialAccessModifyRec Proc MonitorPP
ADELArchive DeadbandDOUBLEYes0YesYesNoNo
MDELMonitor, i.e. value change, DeadbandDOUBLEYes0YesYesNoNo


Run-time Parameters

These fields are not configurable using a configuration too and none are modifiable at run-time. They are used to process the record.

The LALM field is used to implement the hysteresis factor for the alarm limits.

The LA-LL fields are used to decide when to trigger monitors for the corresponding fields. For instance, if LA does not equal the value for A, monitors for A are triggered. The MLST and MLST fields are used in the same manner for the VAL field.


FieldSummaryTypeDCTInitialAccessModifyRec Proc MonitorPP
LALMLast Alarmed ValueDOUBLENo0YesNoNoNo
ALSTArchive Last ValueDOUBLENo0YesNoNoNo
MLSTMonitor Last ValueDOUBLENo0YesNoNoNo
LAPrevious Input Value for ADOUBLENo0YesNoNoNo
LBPrevious Input Value for ADOUBLENo0YesNoNoNo
LCPrevious Input Value for ADOUBLENo0YesNoNoNo
LDPrevious Input Value for ADOUBLENo0YesNoNoNo
LEPrevious Input Value for ADOUBLENo0YesNoNoNo
LFPrevious Input Value for ADOUBLENo0YesNoNoNo
LGPrevious Input Value for ADOUBLENo0YesNoNoNo
LHPrevious Input Value for ADOUBLENo0YesNoNoNo
LIPrevious Input Value for ADOUBLENo0YesNoNoNo
LJPrevious Input Value for ADOUBLENo0YesNoNoNo
LKPrevious Input Value for ADOUBLENo0YesNoNoNo
LLPrevious Input Value for ADOUBLENo0YesNoNoNo


Record Support

Record Support Routines

init_record

For each constant input link, the corresponding value field is initialized with the constant value if the input link is CONSTANT or a channel access link is created if the input link is PV_LINK.

A routine postfix is called to convert the infix expression in CALC to reverse polish notation. The result is stored in RPCL.

process

See next section.

special

This is called if CALC is changed. special calls postfix.

get_value

Fills in the values of struct valueDes so that they refer to VAL.

get_units

Retrieves EGU.

get_precision

Retrieves PREC.

get_graphic_double

Sets the upper display and lower display limits for a field. If the field is VAL, HIHI, HIGH, LOW, or LOLO, the limits are set to HOPR and LOPR, else if the field has upper and lower limits defined they will be used, else the upper and lower maximum values for the field type will be used.

get_control_double

Sets the upper control and the lower control limits for a field. If the field is VAL, HIHI, HIGH, LOW, or LOLO, the limits are set to HOPR and LOPR, else if the field has upper and lower limits defined they will be used, else the upper and lower maximum values for the field type will be used.

get_alarm_double

Sets the following values:

 upper_alarm_limit = HIHI
 upper_warning_limit = HIGH
 lower_warning_limit = LOW
 lower_alarm_limit = LOLO


Record Processing

Routine process implements the following algorithm:

  1. Fetch all arguments.
  2. Call routine calcPerform, which calculates VAL from the postfix version of the expression given in CALC. If calcPerform returns success UDF is set to FALSE.
  3. Check alarms. This routine checks to see if the new VAL causes the alarm status and severity to change. If so, NSEV, NSTA and LALM are set. It also honors the alarm hysteresis factor (HYST). Thus the value must change by at least HYST before the alarm status and severity changes.
  4. Check to see if monitors should be invoked.
    • Alarm monitors are invoked if the alarm status or severity has changed.
    • Archive and value change monitors are invoked if ADEL and MDEL conditions are met.
    • Monitors for A-L are checked whenever other monitors are invoked.
    • NSEV and NSTA are reset to 0.
  5. Scan forward link if necessary, set PACT FALSE, and return.




EPICS Record Reference Manual - 19 MAY 1998