Skip to content

Math

For an introduction to the DSL vocabulary, see Core Concepts.

calc() — evaluate expression

calc(DS[1] + DS[2], DS[3])              # DS3 = DS1 + DS2 (wraps to INT range)
calc(DS[1] * 2, DS[3], oneshot=True)    # One-shot: execute once per rung rising edge
calc(DH[1] | DH[2], DH[3])              # WORD-only math infers hex mode

Overflow behavior

Math wraps — overflow truncates to the destination type's bit width (modular arithmetic). This differs from copy() which clamps.

Expression Destination Result
DS1 + 1 (DS1=32767) INT (16-bit signed) −32768 (wraps)
50000 * 50000 DINT (32-bit signed) −1,794,967,296 (wraps)
40000copy() INT 32767 (clamped)

Division

  • Division by zero produces result = 0 and sets system.fault.division_error.
  • Integer division truncates toward zero: −7 / 2 = −3.

Mode inference

calc() infers arithmetic mode from referenced tag types (including destination):

Family Inferred mode
WORD-only "hex" (unsigned 16-bit wrap)
Any non-WORD present "decimal" (signed arithmetic)

For Click portability, do not mix WORD and non-WORD math in the same calc() expression. Click validation reports CLK_CALC_MODE_MIXED for mixed-family expressions.

Numeric behavior summary

Operation Out-of-range behavior
copy() Clamps to destination min/max
calc() Wraps (modular arithmetic)
Timer accumulator Clamps at 32,767
Counter accumulator Clamps at DINT min/max
Division by zero Result = 0, system.fault.division_error set

BlockRange.sum() — sum a range

calc(DS.select(1, 10).sum(), Result)    # Result = DS1 + DS2 + … + DS10
calc(DH.select(1, 5).sum(), HDest)      # hex mode (WORD range)

.sum() on a BlockRange returns a SumExpr — a lazy expression node that sums all tag values in the range at scan time. It's a full Expression, so it works anywhere expressions are accepted:

calc(DS.select(1, 10).sum() + Offset, Result)
copy(DS.select(1, 5).sum(), Total)
with Rung(DS.select(1, 10).sum() > 1000):
    out(Alarm)

Mode inference applies normally: WORD-only ranges infer hex mode, anything else infers decimal.

Click ladder export renders as SUM ( DS1 : DS10 ) with the native colon-range syntax.