**Do-more**^{®} PLC: Powerful, Intuitive Math Instruction

^{®}PLC:

Watch a **Video about the Math Instruction**

(Opens in a new tab.)

The Spreadsheet style MATH instruction allows mixing of data types* and it accepts formulas and variables. The MATH instruction also allows nesting with parentheses to 8 levels, plus:

- Ten 'Real' Functions, including Natural Log, Log, e, PI, Square Root, and conversions
- All the standard Trig Functions
- Eight Statistical Functions, including Average, Min & Max, RANDINT and RANDREAL (to generate random values), Standard Deviation functions and more
- Thirteen Conditional functions, including six CountIF, six SumIF, and If/Else expressions with a full complement of binary operators

If that's not enough, how about Absolute Value, Time, Memory, and Indirect addressing? You even get access to system-level bits such as $IndexError, $OutOfRange, $Overflow, etc.

** Note about data types: integer and real types are really all you need but Do-more does include a few BCD and octal conversion instructions for legacy data types.*

Do-more Math Instruction (above) used to evaluate the volume of liquid in a vertical cylindrical tank:

Here is a list of ALL the operators and functions that can be used in the Math Instruction (from the Help file):

Description |
Example | |

+ |
Add |
D0 + D1 |

- |
Subtract |
D0 - D1 |

* |
Multiply |
D0 * D1 |

/ |
Divide |
D0 / D1 |

% |
Modulus/Remainder |
D0 % D1 |

** |
Raise to a Power |
D0 ** D1 |

< |
Less Than |
D0 < D1 |

<= |
Less Than or Equal To |
D0 <= D1 |

== |
Equal To |
D0 == D1 |

!= |
Not Equal To |
D0 != D1 |

>= |
Greater Than or Equal To |
D0 >= D1 |

> |
Greater Than |
D0 > D1 |

&& |
Logical AND |
X0 && X1 |

|| |
Logical OR |
X0 || X1 |

& |
Bit-wise AND |
D0 & 0x7FFF |

| |
Bit-wise OR |
D0 | 0xFFFF |

^ |
Bit-wise XOR |
D0 ^ D1 |

<< |
Shift Left |
D0 << 1 |

>> |
Shift Right |
D0 >> 1 |

>>> |
Unsigned Shift Right |
D0 >>> 1 |

Description |
Example | |

- |
Negate |
-D0 |

~ |
Bit-wise Invert |
~D0 |

! |
Logical Not |
!X0 |

Description |
Example | |

ABS |
Absolute Value |
ABS(D0) |

MAX |
Maximum Between Two Expressions |
MAX(D0 * D1, V2) |

MIN |
Minimum Between Two Expressions |
MIN(D0 * D1, V2) |

Description |
Example | |

E |
Euler's Constant e |
E() |

FRAC |
Fractional Portion of a Real Number |
FRAC(R0) |

LN |
Natural Log |
LN(R0) |

LOG |
Log Base 10 |
LOG(R0) |

PI |
Returns the value of PI (3.14159) |
PI() |

ROUND |
Round Real to Nearest Whole Number |
ROUND(R0) |

SQRT |
Square Root |
SQRT(R0) |

TOINT |
Convert to Integer |
TOINT(SQRT(R0)) |

TOREAL |
Convert to Real |
TOREAL(D0 + D1) |

TRUNC |
Truncate Real to a Whole Number |
TRUNC(R0) |

Description |
Example | |

ACOS |
Arccosine in Radians |
ACOS(R0) |

ASIN |
Arcsine in Radians |
ASIN(R0) |

ATAN |
Arctangent in Radians |
ATAN(D0) |

COS |
Cosine of Radian Angle |
COS(R0) |

DEG |
Convert Radians to Degrees |
DEG(R0) |

RAD |
Convert Degrees to Radians |
RAD(R0) |

SIN |
Sine of Radian Angle |
SIN(R0) |

TAN |
Tangent of Radian Angle |
TAN(R0) |

Description |
Example | |

AVGR |
Average of a Range of Values |
AVGR(D0,10) |

MAXR |
Maximum Value Across a Range of Values |
MAXR(D0,10) |

MINR |
Minimum Values Across a Range of Values |
MINR(D0, 10) |

RANDINT |
Get Random Integer in Range 0 ... 2147483647 |
RANDINT() |

RANDREAL |
Get Random Real in Range 0.0 ... 1.0 |
RANDREAL() |

STDEVPR |
Population Standard Deviation of a Range |
STDEVPR(R20, 8) |

STDEVR |
Sample Standard Deviation of a Range |
STDEVR(R20, 8) |

SUMR |
Sum of a Range of Values |
SUMR(D0,10) |

Description |
Example | |

COUNTIFEQ |
Count If Equal to Expression |
COUNTIFEQ(42, D0, 10) |

COUNTIFNE |
Count If Not Equal to Expression |
COUNTIFNE(42, D0, 10) |

COUNTIFGE |
Count If Greater Than or Equal to Expression |
COUNTIFGE(42, D0, 10) |

COUNTIFGT |
Count If Greater Than Expression |
COUNTIFGT(42, D0, 10) |

COUNTIFLE |
Count If Less Than or Equal to Expression |
COUNTIFLE(42, D0, 10) |

COUNTIFLT |
Count If Less Than Expression |
COUNTIFLT(42, D0, 10) |

IF |
If / Else Expression |
IF(C7, D0, D1) |

SUMIFEQ |
Sum if Equal to Expression |
SUMIFEQ(42, D0, 10) |

SUMIFNE |
Sum if Not Equal to Expression |
SUMIFNE(42, D0, 10) |

SUMIFGE |
Sum If Greater Than or Equal to Expression |
SUMIFGE(42, D0, 10) |

SUMIFGT |
Sum if Greater Than Expression |
SUMIFGT(42, D0, 10) |

SUMIFLE |
Sum if Less Than or Equal to Expression |
SUMIFLE(42, D0, 10) |

SUMIFLT |
Sum if Less Than Expression |
SUMIFLT(42, D0, 10) |

Description |
Example | |

NOW |
Get Date/Time Stamp as a 32-bit Integer (1970 Epoch) |
NOW() |

TICKms |
Get Millisecond System Timer Value |
TICKms() |

TICKus |
Get Microsecond System Timer Value |
TICKus() |

Description |
Example | |

REF |
Read Value Indirectly |
REF(D0, V0) |

[ ] |
Array Index Expression |
D[ (V10 * 16) + V11 ] |