Type Conversions

IEC 61131-3 defines a set of type conversion functions that convert values between data types. Each function follows the naming pattern <source>_TO_<target>.

Conversion Categories

Integer Widening

Conversions from a smaller integer type to a larger integer type. These conversions are always safe — no data is lost.

Function

Description

SINT_TO_INT

8-bit to 16-bit signed

SINT_TO_DINT

8-bit to 32-bit signed

SINT_TO_LINT

8-bit to 64-bit signed

INT_TO_DINT

16-bit to 32-bit signed

INT_TO_LINT

16-bit to 64-bit signed

DINT_TO_LINT

32-bit to 64-bit signed

USINT_TO_UINT

8-bit to 16-bit unsigned

USINT_TO_UDINT

8-bit to 32-bit unsigned

USINT_TO_ULINT

8-bit to 64-bit unsigned

UINT_TO_UDINT

16-bit to 32-bit unsigned

UINT_TO_ULINT

16-bit to 64-bit unsigned

UDINT_TO_ULINT

32-bit to 64-bit unsigned

Integer Narrowing

Conversions from a larger integer type to a smaller integer type. These conversions may lose data if the value exceeds the range of the target type.

Function

Description

INT_TO_SINT

16-bit to 8-bit signed

DINT_TO_SINT

32-bit to 8-bit signed

DINT_TO_INT

32-bit to 16-bit signed

LINT_TO_SINT

64-bit to 8-bit signed

LINT_TO_INT

64-bit to 16-bit signed

LINT_TO_DINT

64-bit to 32-bit signed

UINT_TO_USINT

16-bit to 8-bit unsigned

UDINT_TO_USINT

32-bit to 8-bit unsigned

UDINT_TO_UINT

32-bit to 16-bit unsigned

ULINT_TO_USINT

64-bit to 8-bit unsigned

ULINT_TO_UINT

64-bit to 16-bit unsigned

ULINT_TO_UDINT

64-bit to 32-bit unsigned

Signed/Unsigned Conversions

Conversions between signed and unsigned integer types of the same or different sizes.

Function

Description

SINT_TO_USINT

Signed to unsigned 8-bit

INT_TO_UINT

Signed to unsigned 16-bit

DINT_TO_UDINT

Signed to unsigned 32-bit

LINT_TO_ULINT

Signed to unsigned 64-bit

USINT_TO_SINT

Unsigned to signed 8-bit

UINT_TO_INT

Unsigned to signed 16-bit

UDINT_TO_DINT

Unsigned to signed 32-bit

ULINT_TO_LINT

Unsigned to signed 64-bit

Integer to Real

Conversions from integer types to floating-point types. Large integer values may lose precision when converted to REAL.

Function

Description

SINT_TO_REAL

8-bit signed to single-precision

INT_TO_REAL

16-bit signed to single-precision

DINT_TO_REAL

32-bit signed to single-precision

LINT_TO_REAL

64-bit signed to single-precision

SINT_TO_LREAL

8-bit signed to double-precision

INT_TO_LREAL

16-bit signed to double-precision

DINT_TO_LREAL

32-bit signed to double-precision

LINT_TO_LREAL

64-bit signed to double-precision

Real to Integer

Conversions from floating-point types to integer types. The fractional part is truncated.

Function

Description

REAL_TO_SINT

Single-precision to 8-bit signed

REAL_TO_INT

Single-precision to 16-bit signed

REAL_TO_DINT

Single-precision to 32-bit signed

REAL_TO_LINT

Single-precision to 64-bit signed

LREAL_TO_SINT

Double-precision to 8-bit signed

LREAL_TO_INT

Double-precision to 16-bit signed

LREAL_TO_DINT

Double-precision to 32-bit signed

LREAL_TO_LINT

Double-precision to 64-bit signed

Real to Real

Conversions between floating-point types.

Function

Description

REAL_TO_LREAL

Single-precision to double-precision

LREAL_TO_REAL

Double-precision to single-precision

Boolean Conversions

Conversions between BOOL and integer types. FALSE converts to 0, TRUE converts to 1. For the reverse direction, 0 converts to FALSE and any non-zero value converts to TRUE.

Function

Description

BOOL_TO_SINT

Boolean to 8-bit signed

BOOL_TO_INT

Boolean to 16-bit signed

BOOL_TO_DINT

Boolean to 32-bit signed

BOOL_TO_LINT

Boolean to 64-bit signed

BOOL_TO_USINT

Boolean to 8-bit unsigned

BOOL_TO_UINT

Boolean to 16-bit unsigned

BOOL_TO_UDINT

Boolean to 32-bit unsigned

BOOL_TO_ULINT

Boolean to 64-bit unsigned

SINT_TO_BOOL

8-bit signed to Boolean

INT_TO_BOOL

16-bit signed to Boolean

DINT_TO_BOOL

32-bit signed to Boolean

LINT_TO_BOOL

64-bit signed to Boolean

USINT_TO_BOOL

8-bit unsigned to Boolean

UINT_TO_BOOL

16-bit unsigned to Boolean

UDINT_TO_BOOL

32-bit unsigned to Boolean

ULINT_TO_BOOL

64-bit unsigned to Boolean

Time/Duration Conversions

Conversions between time duration types (TIME, LTIME) and numeric or bit string types. The underlying value is the duration in milliseconds.

Function

Description

TIME_TO_DINT

Duration to 32-bit signed

TIME_TO_INT

Duration to 16-bit signed

TIME_TO_REAL

Duration to single-precision float

TIME_TO_DWORD

Duration to 32-bit unsigned word

DINT_TO_TIME

32-bit signed to duration

DWORD_TO_TIME

32-bit unsigned word to duration

LTIME_TO_LINT

Long duration to 64-bit signed

LTIME_TO_LWORD

Long duration to 64-bit unsigned word

LINT_TO_LTIME

64-bit signed to long duration

All combinations of TIME/LTIME with signed integers, unsigned integers, real types, and bit string types are supported.

Date Conversions

Conversions between date types (DATE, LDATE) and numeric or bit string types. The underlying value is seconds since 1970-01-01.

Function

Description

DATE_TO_DWORD

Date to 32-bit unsigned word

DATE_TO_UDINT

Date to 32-bit unsigned integer

DWORD_TO_DATE

32-bit unsigned word to date

LDATE_TO_LWORD

Long date to 64-bit unsigned word

All combinations of DATE/LDATE with signed integers, unsigned integers, real types, and bit string types are supported.

Time-of-Day Conversions

Conversions between time-of-day types (TOD/TIME_OF_DAY, LTOD/LTIME_OF_DAY) and numeric or bit string types. The underlying value is milliseconds since midnight (TOD) or nanoseconds since midnight (LTOD).

Function

Description

TOD_TO_DWORD

Time-of-day to 32-bit unsigned word

TOD_TO_UDINT

Time-of-day to 32-bit unsigned integer

DWORD_TO_TOD

32-bit unsigned word to time-of-day

LTOD_TO_LWORD

Long time-of-day to 64-bit unsigned word

Both short aliases (TOD, LTOD) and full names (TIME_OF_DAY, LTIME_OF_DAY) are supported. All combinations with signed integers, unsigned integers, real types, and bit string types are supported.

Date-and-Time Conversions

Conversions between date-and-time types (DT/DATE_AND_TIME, LDT/LDATE_AND_TIME) and numeric or bit string types. The underlying value is seconds since 1970-01-01 (DT) or nanoseconds since 1970-01-01 (LDT).

Function

Description

DT_TO_DWORD

Date-and-time to 32-bit unsigned word

DT_TO_UDINT

Date-and-time to 32-bit unsigned integer

DWORD_TO_DT

32-bit unsigned word to date-and-time

LDT_TO_LWORD

Long date-and-time to 64-bit unsigned word

Both short aliases (DT, LDT) and full names (DATE_AND_TIME, LDATE_AND_TIME) are supported. All combinations with signed integers, unsigned integers, real types, and bit string types are supported.

Numeric to String

Conversions from numeric types to string representation.

Function

Description

Supported

SINT_TO_STRING

8-bit signed to string

Supported

INT_TO_STRING

16-bit signed to string

Supported

DINT_TO_STRING

32-bit signed to string

Supported

LINT_TO_STRING

64-bit signed to string

Not yet supported

USINT_TO_STRING

8-bit unsigned to string

Supported

UINT_TO_STRING

16-bit unsigned to string

Supported

UDINT_TO_STRING

32-bit unsigned to string

Supported

BYTE_TO_STRING

Byte to string

Supported

WORD_TO_STRING

Word to string

Supported

DWORD_TO_STRING

Double word to string

Supported

REAL_TO_STRING

Single-precision to string

Supported

LREAL_TO_STRING

Double-precision to string

Not yet supported

String to Numeric

Conversions from string representation to numeric types. The string must contain a valid numeric literal for the target type.

Function

Description

Support

STRING_TO_SINT

String to 8-bit signed

Supported

STRING_TO_INT

String to 16-bit signed

Supported

STRING_TO_DINT

String to 32-bit signed

Supported

STRING_TO_LINT

String to 64-bit signed

Not yet supported

STRING_TO_USINT

String to 8-bit unsigned

Supported

STRING_TO_UINT

String to 16-bit unsigned

Supported

STRING_TO_UDINT

String to 32-bit unsigned

Supported

STRING_TO_REAL

String to single-precision

Supported

STRING_TO_LREAL

String to double-precision

Not yet supported

Description

Type conversion functions explicitly convert values from one data type to another. IEC 61131-3 does not perform implicit type conversions; all conversions must use the appropriate *_TO_* function.

When a conversion may lose data (narrowing conversions), the behavior depends on the implementation. Values that exceed the range of the target type may be truncated or cause a runtime error.

Example

int_val := REAL_TO_INT(REAL#3.14);     (* int_val = 3 *)
real_val := INT_TO_REAL(42);            (* real_val = 42.0 *)
big_val := INT_TO_DINT(1000);           (* big_val = 1000, widening *)

See Also

References