Appendix C:  - Data types in CoDeSys 
CoDeSys V2.3 
10-31 
Appendix C:  Data types in CoDeSys 
10.15 Standard data types 
You can use standard data types and user-defined data types when programming. Each identifier is 
assigned to a data type which dictates how much memory space will be reserved and what type of 
values it stores. 
BOOL 
BOOL type variables may be given the values TRUE and FALSE. 8 bits of memory space will be 
reserved. 
see also chapter 10.11, Operands in CoDeSys, BOOL constants 
Integer Data Types 
BYTEWORDDWORDSINTUSINTINTUINTDINT, and UDINT are all integer data types  
Each of the different number types covers a different range of values. The following range limitations 
apply to the integer data types: 
Type 
Lower limit 
Upper limit 
Memory space 
BYTE 
255 
8 Bit 
WORD 
65535 
16 Bit 
DWORD 0 
4294967295 
32 Bit 
SINT: 
-128 
127 
8 Bit 
USINT: 
255 
8 Bit 
INT: 
-32768 
32767 
16 Bit 
UINT: 
65535 
16 Bit 
DINT: 
-2147483648 
2147483647 
32 Bit 
UDINT: 
4294967295 
32 Bit 
As a result when larger types are converted to smaller types, information may be lost.  
see also Chapter 10.11, Operands in CoDeSys, Number constants 
REAL / LREAL 
REAL and LREAL are so-called floating-point types. They are required to represent rational numbers. 
32 bits of memory space is reserved for REAL and 64 bits for LREAL. 
Valid values for REAL: 1.175494351e-38 to 3.402823466e+38 
Valid values for LREAL: 2.2250738585072014e-308 to 1.7976931348623158e+308 
see also Chapter 10.11, REAL-/LREAL constants 
STRING 
STRING type variable
can contain any string of characters. The size entry in the declaration 
determines how much memory space should be reserved for the variable. It refers to the number of 
characters in the string and can be placed in parentheses or square brackets. If no size specification 
is given, the default size of 80 characters will be used. 
The string lenght basically is not limited in CoDeSys, but string functions only can process strings of 1 
- 255 characters ! 
Reader merge pdf - Merge, append PDF files in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Provide C# Demo Codes for Merging and Appending PDF Document
scan multiple pages into one pdf; c# merge pdf files
Reader merge pdf - VB.NET PDF File Merge Library: Merge, append PDF files in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
VB.NET Guide and Sample Codes to Merge PDF Documents in .NET Project
append pdf; acrobat merge pdf files
Appendix C:  - Data types in CoDeSys 
10-32 
CoDeSys V2.3 
Example of a String Declaration with 35 characters: 
str:STRING(35):='This is a String'; 
see also Chapter 10.11, Operands in CoDeSys, STRING constants 
Time Data Types 
The data types TIMETIME_OF_DAY (abb. TOD), DATE and DATE_AND_TIME (abb. DT) are 
handled internally like DWORD. 
Time is given in milliseconds in TIME and TOD, time in TOD begins at 12:00 A.M. 
Time is given in seconds in DATE and DT beginning with January 1, 1970 at 12:00 A.M. 
See in the following the time data formats used to assign values for time constants: 
TIME constants: 
always made up of an initial "t" or "T" (or "time" or "TIME" spelled out) and a number sign "#". 
This is followed by the actual time declaration which can include days (identified by "d"), hours 
(identified by "h"), minutes (identified by "m"), seconds (identified by "s") and milliseconds (identified 
by "ms"). Please note that the time entries must be given in this order according to length (d before h 
before m before s before m before ms) but you are not required to include all time increments. 
Maximum value: 49d17h2m47s295ms (4194967295 ms) 
Examples of correct TIME constants in a ST assignment: 
TIME1 := T#14ms; 
TIME1 := T#100S12ms; 
(*The highest component may be allowed to exceed its limit*) 
TIME1 := t#12h34m15s; 
the following would be incorrect: 
TIME1 := t#5m68s; 
(*limit exceeded in a lower component*) 
TIME1 := 15ms; 
(*T# is missing*) 
TIME1 := t#4ms13d; 
(*Incorrect order of entries*) 
DATE Constants: 
beginning with a "d", "D", "DATE" or "date" followed by "#". You can then enter any date with format 
Year-Month-Day. Possible values: 1970-00-00 to 2106-02-06. 
Examples: 
DATE#1996-05-06 
d#1972-03-29 
TIME_OF_DAY Constants, for storing times of the day: 
begin with "tod#", "TOD#", "TIME_OF_DAY#" or "time_of_day#" followed by a time with the format: 
Hour:Minute:Second. Seconds can be entered as real numbers or you can enter fractions of a 
second. Possible values: 00:00:00 bis 23:59:59.999. 
Examples: 
TIME_OF_DAY#15:36:30.123 
tod#00:00:00 
XImage.Barcode Scanner for .NET, Read, Scan and Recognize barcode
VB.NET File: Merge PDF; VB.NET File: Split PDF; VB.NET VB.NET Annotate: PDF Markup & Drawing. XDoc.Word for C#; C#; XImage.OCR for C#; XImage.Barcode Reader for C#
pdf merger; add pdf pages together
C# Imaging - Scan Barcode Image in C#.NET
RasterEdge Barcode Reader DLL add-in enables developers to add barcode image recognition & barcode types, such as Code 128, EAN-13, QR Code, PDF-417, etc.
attach pdf to mail merge; pdf split and merge
Appendix C:  - Data types in CoDeSys 
CoDeSys V2.3 
10-33 
DATE_AND_TIME Constants, combination of date and the time of day: 
begin with "dt#", "DT#", "DATE_AND_TIME#" or "date_and_time#". Place a hyphen after the date 
followed by the time. Possible values: 1970-00-00-00:00:00 to 2106-02-06-06:28:15. 
Examples: 
DATE_AND_TIME#1996-05-06-15:36:30 
dt#1972-03-29-00:00:00 
10.16 Defined data types 
ARRAY 
One-, two-, and three-dimensional fields (arrays) are supported as elementary data types. Arrays can 
be defined both in the declaration part of a POU and in the global variable lists. Maximum 9 
dimensions may result from nesting of arrays ( "ARRAY[0..2] OF ARRAY[0..3] OF …" ). 
Syntax: 
<Field_Name>:ARRAY [<ll1>..<ul1>,<ll2>..<ul2>] OF <elem. Type>. 
ll1, ll2, ll3identify the lower limit of the field range; ul1, ul2 and ul3 identify the upper limit. The limit 
values must be integers and must follow the DINT value range. 
Example: 
Card_game: ARRAY [1..13, 1..4] OF INT; 
Initializing Arrays:
Example for complete initialization of an array: 
arr1 : ARRAY [1..5] OF INT := 1,2,3,4,5; 
arr2 : ARRAY [1..2,3..4] OF INT := 1,3(7); (* short for 1,7,7,7 *) 
arr3 : ARRAY [1..2,2..3,3..4] OF INT := 2(0),4(4),2,3;   
(* short for 0,0,4,4,4,4,2,3 *) 
Example of the initialization of an array of a structure: 
TYPE STRUCT1 
STRUCT 
p1:int; 
p2:int; 
p3:dword; 
END_STRUCT 
(p1:=14,p2:=5,p3:=112); 
Example of the partial initialization of an Array: 
arr1 : ARRAY [1..10] OF INT := 1,2; 
Elements to which no value is pre-assigned are initialized with the default initial value of the basic 
type. In the example above, the elements anarray[6] to anarray[10] are therefore initialized with 0. 
Accessing array components: v
Array components are accessed in a two-dimensional array using the following syntax: 
<Field_Name>[Index1,Index2] 
Example: 
Card_game [9,2] 
C# PDF: PDF Document Viewer & Reader SDK for Windows Forms
On this page, besides brief introduction to RasterEdge C#.NET PDF document viewer & reader for Windows Forms application, you can also see the following aspects
add pdf together one file; pdf mail merge
.NET PDF Document Viewing, Annotation, Conversion & Processing
File & Page Process. Create new file, load PDF from existing files. Merge, split PDF files. Insert, delete PDF pages. Re-order, rotate PDF pages. PDF Read.
add pdf together; reader merge pdf
Appendix C:  - Data types in CoDeSys 
10-34 
CoDeSys V2.3 
Note:  
If you define a function in your project with the name CheckBounds, you can use it to check for range 
overflows in your project (see chapter '2.1, What is what in CoDeSys', 'Components of a project', 
'Function') 
Function Checkbounds 
If you define a function in your project with the name CheckBounds, you can automatically check for 
out-of-range errors in arrays. The name of the function is fixed and can only have this designation.  
Example for the function CheckBounds: 
FUNCTION CheckBounds : DINT 
VAR_INPUT 
index, lower, upper: DINT; 
END_VAR 
IF  index < lower THEN 
CheckBounds := lower; 
ELSIF  index > upper THEN 
CheckBounds := upper; 
ELSE  CheckBounds := index; 
END_IF 
The following sample program for testing the CheckBounds function exceeds the bounds of a defined 
array. The CheckBounds function allows the value TRUE to be assigned, not to location A[10], but to 
the still valid range boundary A[7] above it. With the CheckBounds function, references outside of 
array boundaries can thus be corrected. 
Test Program for the function CheckBounds: 
PROGRAM PLC_PRG 
VAR 
a: ARRAY[0..7] OF BOOL; 
b: INT:=10; 
END_VAR 
a[b]:=TRUE; 
Attention:  The CheckBounds-function provided by the Check.Lib library is just a sample solution! Before using 
that library module check whether the function is working as requested for your project, or implement 
an appropriate function directly as a POU in your project. 
Pointer 
Variable or function block addresses are saved in pointers while a program is running. 
Pointer declarations have the following syntax: 
<Identifier>: POINTER TO <Datatype/Functionblock>; 
A pointer can point to any data type or function block even to user-defined types.  
The function of the Address Operator ADR is to assign the address of a variable or function block to 
the pointer.  
A pointer can be dereferenced by adding the content operator "^" after the pointer identifier. 
Please note:  A pointer is counted up byte-wise ! You can get it counted up like it is usual in the C-Compiler by 
using the instruction p=p+SIZEOF(p^);. 
Example: 
pt:POINTER TO INT; 
var_int1:INT := 5; 
var_int2:INT; 
pt := ADR(var_int1); 
var_int2:= pt^; (* var_int2 is now 5 *) 
C# PDF insert image Library: insert images into PDF in C#.net, ASP
inserting image to PDF in preview without adobe PDF reader installed. Able to zoom and crop image and achieve image resizing. Merge several images into PDF.
combine pdf files; merge pdf online
XDoc, XImage SDK for .NET - View, Annotate, Convert, Edit, Scan
Adobe PDF. XDoc PDF. Scanning. XImage OCR. Microsoft Office. XDoc Word. XDoc Excel. XDoc PowerPoint. Barcoding. XImage Barcode Reader. XImage Barcode Generator.
reader combine pdf; merge pdf files
Appendix C:  - Data types in CoDeSys 
CoDeSys V2.3 
10-35 
Functions for checking pointer accesses during runtime: 
For checking pointer accesses during runtime you can create check functions, which will be called 
automatically before each access on the address of a pointer. For this purpose the respective function 
must be available in the project, directly or via a library. The following functions are supported:   
Function CheckPointer  or checking whether the address currently stored at the pointer is within the 
valid memory range, 
Funktion CheckPointerAligned, which implicates the functionality of CheckPointer extended by a 
check of the memory alignment. 
The functions must exactly have the mentioned names. They return the address which is used for 
dereferencing the pointer, thus at best that which has been passed on as the first input parameter 
(dwAddress in the example shown below).  
See in the following example of a CheckPointerAligned function, which input parameters are 
processed by the check functions. (The parameter names are examples too). A CheckPointer function 
must look the same except that there may be no parameter for the granularity of the pointer access: 
FUNCTION CheckPointerAligned : DWORD 
(* The data type of the function (return value) must 
be the same as used for pointers 
in the currently set target system; i.e. DWORD for 
systems using 32-bit pointers, 
WORD for systems using 16-bit pointers *) 
VAR_INPUT 
dwAddress : DWORD;  
(* Target address of the pointer; the data type must 
be the same as used for pointers 
in the currently set target system, see above: 
return value *) 
iSize : DINT;  
(* Size of pointer access; the data type must be 
integer-compatible and must cover the maximum 
potential data size stored at the pointer address *) 
iGran : DINT;   
(* !not to be used in CheckPointer functions!  
granularity of the access, e.g. "2", if INT is the 
smallest not-structured datatype 
used on the given address; the data type must be 
integer-compatible *) 
bWrite: BOOL; 
(*Access type: Read or Write; TRUE=read access; 
the data type must be BOOL *) 
END_VAR
If there are a CheckPointer function and a CheckPointerAligned function in the project, 
CheckPointerAligned will be called. 
Enumeration 
Enumeration is a user-defined data type that is made up of a number of string constants. These 
constants are referred to as enumeration values.  
Enumeration values are recognized in all areas of the project even if they were declared within a 
POU. It is best to create your enumerations as objects in the Object Organizer under the register card 
Data types. They begin with the keyword TYPE and end with END_TYPE. 
Syntax: 
TYPE <Identifier>:(<Enum_0> ,<Enum_1>, ...,<Enum_n>); 
END_TYPE 
A variable of the type <Identifier> can take on one of the enumeration values and will be initialized 
with the first one. These values are compatible with whole numbers which means that you can 
perform operations with them just as you would with INT. You can assign a number x to the variable. If 
the enumeration values are not initialized, counting will begin with 0. When initializing, make certain 
the initial values are increasing. The validity of the number will be reviewed at the time it is run. 
C# PDF: How to Create PDF Document Viewer in C#.NET with
The PDF document viewer & reader created by this C#.NET imaging toolkit can be used by developers for reliably & quickly PDF document viewing, PDF annotation
batch pdf merger; add pdf files together online
C# WPF PDF Viewer SDK to view, annotate, convert and print PDF in
VB.NET File: Merge PDF; VB.NET File: Split PDF; VB.NET VB.NET Annotate: PDF Markup & Drawing. XDoc.Word for C#; C#; XImage.OCR for C#; XImage.Barcode Reader for C#
reader create pdf multiple files; attach pdf to mail merge in word
Appendix C:  - Data types in CoDeSys 
10-36 
CoDeSys V2.3 
Example: 
colors is red 0, yellow 1, green 10 *) 
END_TYPE 
TRAFFIC_SIGNAL1 : TRAFFIC_SIGNAL; 
TRAFFIC_SIGNAL1:=0; (* The value of the traffic signal is red*) 
FOR i:= Red TO Green DO 
i := i + 1; 
END_FOR; 
The same enumeration value may not be used twice within an enumeration or within all enumerations 
used in the same POU. 
Example: 
TRAFFIC_SIGNAL: (red, yellow, green); 
COLOR: (blue, white, red);  
Error: red may not be used for both TRAFFIC_SIGNAL and COLOR. 
Structures  
Structures are created as objects in the Object Organizer under the register card 
Data types. They 
begin with the keywords TYPE and STRUCT and end with END_STRUCT and END_TYPE. 
The syntax for structure declarations is as follows: 
TYPE <Structurename>: 
STRUCT 
<Declaration of Variables 1> 
<Declaration of Variables n> 
END_STRUCT 
END_TYPE 
<Structurename> is a type that is recognized throughout the project and can be used like a standard 
data type.  
Interlocking structures are allowed. The only restriction is that variables may not be placed at 
addresses (the AT declaration is not allowed!). 
Example for a structure definition named Polygonline: 
TYPE Polygonline: 
STRUCT 
Start:ARRAY [1..2] OF INT; 
Point1:ARRAY [1..2] OF INT; 
Point2:ARRAY [1..2] OF INT; 
Point3:ARRAY [1..2] OF INT; 
Point4:ARRAY [1..2] OF INT; 
End:ARRAY [1..2] OF INT; 
END_STRUCT 
END_TYPE 
Example for the initialization of a structure:  
Point4:=5,7, End := 3,5); 
Initializations with variables are not possible. See an example of the initialization of an array of a 
structure under 'Arrays'. 
Access on structure components:
You can gain access to structure components using the following syntax: 
<Structure_Name>.<Componentname> 
Appendix C:  - Data types in CoDeSys 
CoDeSys V2.3 
10-37 
So for the above mentioned example of the structure 'polygonline' you can access the component 
'start' by 
Poly_1.Start
References 
You can use the user-defined reference data type to create an alternative name for a variable, 
constant or function block. 
Create your references as objects in the Object Organizer under the register card 
Data types
They begin with the keyword TYPE and end with END_TYPE. 
Syntax: 
TYPE <Identifier>: <Assignment term>; 
END_TYPE 
Example: 
TYPE message:STRING[50]; 
END_TYPE; 
Subrange types 
A subrange type is a type whose range of values is only a subset of that of the basic type. The 
declaration can be carried out in the data types register, but a variable can also be directly declared 
with a subrange type: 
Syntax for the declaration in the 'Data types' register: 
TYPE <Name> : <Inttype> (<ug>..<og>) END_TYPE; 
<Name>  must be a valid IEC identifier, 
<Inttype>  is one of the data types SINT, USINT, INT, UINT, DINT, UDINT, BYTE, WORD, 
DWORD (LINT, ULINT, LWORD). 
<ug>  
Is a constant which must be compatible with the basic type and which sets the lower 
boundary of the range types. The lower boundary itself is included in this range. 
<og>  
Is a constant that must be compatible with the basic type, and sets the upper boundary 
of the range types. The upper boundary itself is included in this basic type. 
Examples: 
TYPE 
SubInt : INT (-4095..4095); 
END_TYPE 
Direct declaration of a variable with a subrange type:
VAR 
i : INT (-4095..4095); 
ui : UINT (0..10000); 
END_VAR 
If a constant is assigned to a subrange type (in the declaration or in the implementation) that does not 
fall into this range (e.g. 1:=5000), an error message is issued. 
In order to check for observance of range boundaries at runtime, the functions CheckRangeSigned 
or CheckRangeUnsigned must be introduced. In these, boundary violations can be captured by the 
appropriate method and means (e.g. the value can be cut out or an error flag can be set.). They are 
implicitly called as soon as a variable is written as belonging to a subrange type constructed from 
either a signed or an unsigned type. 
Example:  
In the case of a variable belonging to a signed subrange type (like i, above), the function CheckRangeSigned is 
called; it could be programmed as follows to trim a value to the permissible range: 
FUNCTION CheckRangeSigned : DINT 
VAR_INPUT 
value, lower, upper: DINT; 
Appendix C:  - Data types in CoDeSys 
10-38 
CoDeSys V2.3 
END_VAR 
IF (value < lower) THEN 
CheckRangeSigned := lower; 
ELSIF(value > upper) THEN 
CheckRangeSigned := upper; 
ELSE 
CheckRangeSigned := value; 
END_IF 
In calling up the function automatically, the function name CheckRangeSigned is obligatory, as is the 
interface specification: return value and three parameters of type DINT 
When called, the function is parameterized as follows: 
- value:  the value to be assigned to the range type 
- lower:  the lower boundary of the range 
- upper:  the upper boundary of the range 
- Return value: this is the value that is actually assigned to the range type 
An assignment i:=10*y implicitly produces the following in this example: 
i := CheckRangeSigned(10*y, -4095, 4095); 
Even if y for example has the value 1000, then i still has only the value 4095 after this assignment. 
The same applies to the function CheckRangeUnsigned: function name and interface must be correct. 
FUNCTION CheckRangeUnsigned : UDINT 
VAR_INPUT 
value, lower, upper: UDINT; 
END_VAR 
Important: If neither of the functions CheckRangeSigned or CheckRangeUnsigned is present, no type checking 
of subrange types occurs during runtime! The variable i could then take on any value between –
32768 and 32767 at any time!  
Attention: If neither of the functions CheckRangeSigned or CheckRangeUnsigned is present like described 
above, there can result an endless loop if a subrange type is used in a FOR loop. This will happen 
when the range given for the FOR loop is as big or bigger than the range of the subrange type !  
Attention:  The CheckRangeSigned-function provided with the Check.Lib library is just a sample solution! Before 
using the library module check whether the function is working as requested for your project, or 
implement an appropriate CheckRange-function directly as a POU in the project. 
Example: 
VAR 
ui : UINT (0..10000); 
END_VAR 
FOR ui:=0 TO 10000 DO  
... 
END_FOR 
The FOR loop will never be finished, because ui cannot get bigger than 10000. 
Also take care of the definition of the CheckRange functions when you define the incremental value of 
a FOR loop ! 
Appendix D:  - The CoDeSys Libaries 
CoDeSys V2.3 
10-39 
Appendix D:  The CoDeSys Libaries 
10.17 The Standard.lib library 
10.17.1 
String functions... 
Please note: String functions are not "thread safe": When using tasks, string functions may only be used in a 
single task. If the same function is used in different tasks, there is a danger of overwriting.  
LEN 
Returns the length of a string. Input STR is of type STRING, the return value of the function is type 
INT. 
Example in IL: 
LD  'SUSI' 
LEN 
ST  VarINT1 (* Result is 4 *) 
Example in FBD: 
Example in ST: 
VarSTRING1 := LEN ('SUSI'); 
LEFT 
Left returns the left, initial string for a given string. Input STR is type STRING, SIZE is of type INT, the 
return value of the function is type STRING. 
LEFT (STR, SIZE) means: Take the first SIZE character from the right in the string STR. 
Example in IL: 
LD   'SUSI' 
LEFT 3 
ST   VarSTRING1 (* Result is 'SUS' *) 
Example in FBD: 
Example in ST: 
VarSTRING1 := LEFT ('SUSI',3); 
RIGHT 
Right returns the right, initial string for a given string. 
RIGHT (STR, SIZE) means: Take the first SIZE character from the right in the string STR. 
Input STR is of type STRING, SIZE is of type INT, the return value of the function is of type STRING. 
Example in IL: 
LD    'SUSI' 
Appendix D:  - The CoDeSys Libaries 
10-40 
CoDeSys V2.3 
RIGHT 3 
ST    VarSTRING1 (* Result is 'USI' *) 
Example in FBD: 
Example in ST: 
VarSTRING1 := RIGHT ('SUSI',3); 
MID 
Mid returns a partial string from within a string. 
Input STR is type STRING, LEN and POS are type INT, the return value of the function is type 
STRING. 
MID (STR, LEN, POS) means: Retrieve LEN characters from the STR string beginning with the 
character at position POS. 
Example in IL: 
LD  'SUSI' 
MID 2,2 
ST  VarSTRING1 (* Result is 'US' *) 
Example in FBD: 
Example in ST: 
VarSTRING1 := MID ('SUSI',2,2); 
CONCAT 
Concatenation (combination) of two strings. 
The input variables STR1 and STR2 as well as the return value of the function are type STRING. 
Example in IL: 
LD     'SUSI' 
CONCAT 'WILLI' 
ST     VarSTRING1 (* Result is 'SUSIWILLI' *) 
Example in FBD: 
Example in ST: 
VarSTRING1 := CONCAT ('SUSI','WILLI'); 
Please note: The CONCAT function does not work, if nested over more than five levels. 
Documents you may be interested
Documents you may be interested