# IEC 61131-3

IEC 61131-3 is the third part (of 10) of the international standard IEC 61131 for programmable logic controllers. It was first published in December 1993 by the IEC; the current (third) edition was published in February 2013.
Part 3 of IEC 61131 deals with basic software architecture and programming languages of the control program within PLC. It defines three graphical and two textual programming language standards:
* Ladder diagram (LD), graphical
* Function block diagram (FBD), graphical
* Structured text (ST), textual
* Instruction list (IL), textual (deprecated in 3rd edition of the standard. Per IEC 61131-3-2013, Section 7.2.1: Instruction List, General, "This language is outdated as an assembler like language. Therefore it is deprecated and will not be contained in the next edition of this standard.")
* Sequential function chart (SFC), has elements to organize programs for sequential and parallel control processing, graphical.

## Data types

* Elementary Data Type
** Bit Strings – groups of on/off values
*** BOOL - 1 bit (0,1)
*** BYTE – 8 bit (1 byte)
*** WORD – 16 bit (2 byte)
*** DWORD – 32 bit (4 byte)
*** LWORD – 64 bit (8 byte)
** INTEGER – whole numbers (Considering byte size 8 bits)
*** SINT – signed short integer (1 byte)
*** INT – signed integer (2 byte)
*** DINT – signed double integer (4 byte)
*** LINT – signed long integer (8 byte)
*** USINT – Unsigned short integer (1 byte)
*** UINT – Unsigned integer (2 byte)
*** UDINT – Unsigned double integer (4 byte)
*** ULINT – Unsigned long integer (8 byte)
** REAL – floating point IEC 60559 (same as IEEE 754-2008)
*** REAL – (4 byte)
*** LREAL – (8 byte)
Duration literals :
| Unit | Description |
| d | Day |
| h | Hour |
| m | Minute |
| s | Second |
| ms | Millisecond |
| us | Microsecond |
| ns | Nanosecond |
** Duration
*** TIME – (implementer specific). Literals in the form of T#5m90s15ms
*** LTIME – (8 byte). Literals extend to nanoseconds in the form of T#5m90s15ms542us15ns
** Date
*** DATE – calendar date (implementer specific)
*** LDATE – calendar date (8 byte, nanoseconds since 1970-01-01, restricted to multiple of one day)
** Time of day
*** TIME_OF_DAY / TOD – clock time (implementer specific)
*** LTIME_OF_DAY / LTOD – clock time (8 byte)
** Date and time of Day
*** DATE_AND_TIME / DT – time and date (implementer specific)
*** LDATE_AND_TIME / LDT – time and date (8 byte, nanoseconds since 1970-01-01)
** Character / Character string
*** CHAR – Single-byte character (1 byte, limited to characters 0 to 255 of ISO/IEC 10646)
*** WCHAR – Double-byte character (2 byte, limited to characters 0 to 65535 of ISO/IEC 10646)
*** STRING – Variable-length single-byte character string. Literals specified with single quote, 'This is a STRING Literal'
*** WSTRING – Variable-length double-byte character string. Literals specified with a double quote, "This is a WSTRING Literal"
STRING escape sequences :
| Escape sequence | Produces |
| $L | linefeed |
| $N | newline |
| $P | page (form feed) |
| $R | return |
| $T | tab |
| $xx | hex value |
* Generic Data Types – Only available for the input / output/ in-out variables of system-defined Program Organization Units (POUs, see below)
** ANY
*** ANY_DERIVED
*** ANY_ELEMENTARY
**** ANY_MAGNITUDE
***** ANY_NUM
****** ANY_REAL: LREAL, REAL
****** ANY_INT
******* ANY_UNSIGNED: ULINT, UDINT, UINT, USINT
******* ANY_SIGNED: LINT, DINT, INT, SINT
***** ANY_DURATION: TIME, LTIME
**** ANY_BIT: LWORD, DWORD, WORD, BYTE, BOOL
**** ANY_CHARS
***** ANY_STRING: STRING, WSTRING
***** ANY_CHAR: CHAR, WCHAR
**** ANY_DATE: DATE_AND_TIME (DT), DATE_AND_TIME(LDT), DATE, TIME_OF_DAY (TOD), LTIME_OF_DAY(LTOD)
* User-defined Data Types
** Enumerated data type
** Enumerated data type with named value
** Subrange data type – puts limits on value i.e., INT(4 .. 20) for current
** Array data type – multiple values stored in the same variable.
** Structured data type – composite of several variables and types.
** Directly derived data type – type derived from one of the above types to give new name and initial value as a type.
** References – a kind of strongly typed pointer. Arithmetic operation of the value of this type is prohibited.

## Variables

Variable attributes: RETAIN, CONSTANT, AT
* Global
* Direct (local)
* I/O Mapping – Input, Output, I/O
* External
* Temporary

## Configuration

* Resource – Like a CPU
* Tasks – Can be multiple per CPU.
* Programs – Can be executed once, on a timer, on an event.

## Program organization unit (POU)

* Functions
** Standard: ADD, SQRT, SIN, COS, GT, MIN, MAX, AND, OR, etc.
** Custom
* Function Blocks
** Standard:
** Custom – Libraries of functions can be supplied by a vendor or third party.
* Programs

## Configuration, resources, tasks

* Configuration – processing resources, memory for IO, execution rates, number of tasks.

## Object oriented programming (OOP)

* The 3rd revision of the standard describes how to implement OOP within the application programming