BASIC Ladder Uk 2.20
BASIC Ladder Uk 2.20
BASIC Ladder Uk 2.20
Version: 2.20
BASIC & Ladder for TBox -MS, -LITE, -LT2, -Nano
The document contains confidential and proprietary information of Ovarro SA and must be kept strictly confidential. It may not be
disclosed in whole or in part under any circumstances without the express prior written consent of Ovarro SA.
Revision History
Version Date Description
2.18 19/07/2019 Adding TBox Nano
One note removed section 1.17
Section 1.15: cosmetics in IpToStr and StrToIp
2.19 18/12/2020 New Template
2.20 30/12/2022 Add chapter 1.14.26 : Float functions
Add chapter 1.14.27: Random function
Add in Chapter 1.17: indirect addressing of Text Tag
Version: 2. 20
Contents
PROGRAMS - BASIC ........................................................................................................................................ 9
SEQUENCE OF TASKS .................................................................................................................................................. 9
GENERAL ................................................................................................................................................................ 10
Case .............................................................................................................................................................. 10
Variable not declared ...................................................................................................................................... 10
Statements and 'Line Feed' ............................................................................................................................. 10
Colors ............................................................................................................................................................ 10
Access from the process to the variable ........................................................................................................... 10
Cycle time ...................................................................................................................................................... 11
Distinction between Local – Global – System variables .................................................................................... 11
Break Line ...................................................................................................................................................... 11
Precautions / Miscellaneous ............................................................................................................................ 12
COMMENT .............................................................................................................................................................. 12
CONSTANT.............................................................................................................................................................. 12
ASSIGNMENT........................................................................................................................................................... 13
DIM STATEMENT ...................................................................................................................................................... 14
COMPARISON .......................................................................................................................................................... 15
IF ...THEN ... ELSE … ELSEIF STATEMENT ..................................................................................................................... 16
ARITHMETIC OPERATORS ........................................................................................................................................... 18
General rules of type casting ........................................................................................................................... 18
Special case with constant .............................................................................................................................. 19
Type casting exceptions with MS-CPU16, -LT, -WM, -LP .................................................................................. 19
+ (Addition) ................................................................................................................................................... 20
- (Subtraction) ............................................................................................................................................... 20
* (Multiplication) ........................................................................................................................................... 21
/ (Division) ..................................................................................................................................................... 21
Modulo Operator ............................................................................................................................................ 22
LOGICAL OPERATORS ................................................................................................................................................ 23
Introduction ................................................................................................................................................... 23
AND .............................................................................................................................................................. 23
OR ................................................................................................................................................................. 24
XOR ............................................................................................................................................................... 24
NOT............................................................................................................................................................... 25
FOR...NEXT ...STEP STATEMENT ................................................................................................................................ 26
WHILE...WEND ........................................................................................................................................................ 28
MATHEMATICAL FUNCTIONS ...................................................................................................................................... 29
Trigonometry ................................................................................................................................................. 29
Logarithmic ................................................................................................................................................... 30
Exponential .................................................................................................................................................... 30
Power ............................................................................................................................................................ 31
Square root .................................................................................................................................................... 31
Miscellaneous ................................................................................................................................................ 85
Note about ‘Adr=Tag(Tag)’ function ............................................................................................................ 86
POU (PROGRAM ORGANIZATION UNITS) ..................................................................................................................... 87
POU – PROGRAM .................................................................................................................................................... 88
Introduction ................................................................................................................................................... 88
The Program 'Main' ........................................................................................................................................ 88
Creating a POU Program ................................................................................................................................ 88
Calling a POU Program in another Program .................................................................................................... 90
POU – FUNCTION .................................................................................................................................................... 91
Introduction ................................................................................................................................................... 91
Creating a POU Function ................................................................................................................................ 92
Example of a Function .................................................................................................................................... 94
Calling a POU Function in a POU Program ...................................................................................................... 95
POU - FUNCTION BLOCK ........................................................................................................................................... 96
Introduction ................................................................................................................................................... 96
Creating a POU Function Block ....................................................................................................................... 96
Example of a Function Block ........................................................................................................................... 98
Calling a POU Function Block in a POU Program ............................................................................................. 99
Debugging of a Function block ...................................................................................................................... 100
Indirect addressing inside a Function Block .................................................................................................... 100
TIMERS ........................................................................................................................................................ 101
PRESENTATION ...................................................................................................................................................... 101
INTRODUCTION ...................................................................................................................................................... 102
CREATING A TIMER ................................................................................................................................................. 102
THE VARIABLES OF A TIMER...................................................................................................................................... 103
Saving Dynamic Preset ................................................................................................................................. 104
USING TIMERS IN LADDER........................................................................................................................................ 104
The instance name ....................................................................................................................................... 105
The Preset .................................................................................................................................................... 105
USING TIMERS IN BASIC ......................................................................................................................................... 106
Reminder ..................................................................................................................................................... 106
Syntax ......................................................................................................................................................... 106
Reset Timer Function .................................................................................................................................... 107
Examples ..................................................................................................................................................... 107
USING TIMERS IN POUS .......................................................................................................................................... 107
TIMER – SINGLE SHOT............................................................................................................................................. 108
TIMER – MONOSTABLE ........................................................................................................................................... 109
TIMER – INTEGRAL.................................................................................................................................................. 110
TIMER – ON DELAY ................................................................................................................................................ 112
COUNTERS .................................................................................................................................................. 113
PRESENTATION ...................................................................................................................................................... 113
INTRODUCTION ...................................................................................................................................................... 114
Creating a Counter ....................................................................................................................................... 114
Programs - BASIC
TBOX MS, TBOX LITE, TBOX LT2 and TBOX NANO support 2 languages: BASIC and Ladder.
Example:
' This is my first program
If (Temperature > 70) Or (Emergency=1) then
Pump=1
Alarm=1
endif
Sequence of Tasks
The variables are handled like following:
• Inputs are read before starting the cycle. A copy is used all along the cycle.
• Outputs are written at the end of the cycle. A copy is used all along the cycle.
• Variables are handled immediately in the cycle.
MS-CPU16, -LT, -WM, -LP process cycle MS-CPU32, LT2 process cycle
Sequence of one cycle: Sequence of one cycle:
Reading DI (Reading AI if fast sampling selected) Reading DI and AI
Updating Timer and Counter Variables
1st cycle of Ladder/BASIC Updating ‘Time’ Variables
Handling registers and timer/counter values
“on the fly” 1st cycle of Ladder/BASIC
General
Case
BASIC is not case sensitive.
A variable must be declared either in the list of Tags (=global Tag), in the list of POU Tags or with a Dim statement (=local
Tag)
if a=50 then
b=c
endif
Colors
Keyword : a keyword appears in blue color (see the list at section 1.19)
Outputs: the physical outputs are executed at the end of the cycle, according to their last status.
Internal variables: the internal variables (DIV and AIV) are read/executed at the moment they are treated within the
program. It means the changing on a variable is updated everywhere it is used.
Cycle time
One cycle corresponds to a complete process (BASIC and LADDER), from the first until the last line.
The cycle time is the time needed to execute one cycle. The cycles are executed permanently, one after each other.
For safety reason, one cycle should never be longer than 1 second. If this occurs, an internal watchdog timer resets the
TBOX automatically (the watchdog is minimum 1.6 second).
The cycle time is available from the ‘RTU Identification’, accessible in the main menu → 'Communication'.
1. To use System variables without declaring them as Tag, the suffix is mandatory.
2. If there is no suffix, the order of resolution is local Tag if it exists, then global Tag if it
exists. Otherwise the compiler returns an error.
3. The suffix cannot be declared within a DIM statement (it is clear that the variable will be
local).
Examples:
dim Temperature as integer
if Temperature@ > 20 then
if triggerpos(prgrun!) then
......
Temperature@ is the global Tag, if it exists, otherwise the compiler returns an error. It will not use the local
Tag.
Break Line
When a line is very long, it can be cut using the character ‘_’ (underscore).
Examples:
If A=0 Or B=0 Or C=0 Or D=0 Or E=0 Or F=0 Or G=0 Or H=0 Or_
I=0 Or J=0 Or K=0 Or L=0 Or M=0 Or N=0 Or O=0 Or_
P=0 Or Q=0 Or R=0 Or S=0 Or T=0 then
output=0
endif
Precautions / Miscellaneous
• When declaring local Tags or arguments to Function or Function block, do not use the same name as global Tags.
• When a Tag is dimensioned within the programming (example: dim Tag as Bool), it is automatically considered
as a local Tag.
• When several operators are used following each other, one needs to separate them with brackets.
Example: if ((a=10) Or (a=20)) And (b=0)) then
• With Timer/Counter functions, if you wish to associate a Tag to ‘Value’ and/or ‘Preset, they must be of type DWORD
(32 bits).
Comment
• Rules
A comment can start with the keyword REM or with the single apostrophe '
REM : is considered as a statement. It can then only be used at the beginning of a line.
' : is not a statement. It can then be placed anywhere in the line.
• Examples
REM this is a comment
' this is a comment
var1=var2 ' var2 is assigned to var1
Constant
• Rules
Constant statement can be expressed in:
➢ Decimal
➢ hexadecimal (with prefix &H)
➢ floating point
• Limits
To be accepted, the constant must hold into a INT 32 bits or into a IEEE 32 bits Floating.
When a constant is used in Timer, the 'time span' is limited to 49 days (=4294967296 ms).
• Examples
decimal: a=123456
hexadecimal: a=&H1E240
Floating point: a=123.456
Assignment
• Syntax
VarName=expr ' variable
[x] is the index of the variable in the table. Only square brackets [ ] can be used.
• Indexing
With a local variable 'simple', indexing is not allowed.
With a local variable 'array', index must be specified with the Dim statement.
With a global variable, indexing is allowed. The variable is then considered as the first of a virtual table composed of
successive ModBus addresses. See For...next statement. with Global Tags.
• Examples
Temperature=Setpoint
Delay=5
LET StartPump[2]=1
Dim Statement
The Dim statement is used to create Local Tags inside a program. Local Tags can also be created from the list of 'POU Tags'.
• Syntax
Variable
Dim MyVar
Dim MyVar as <Type> ' See types below
Table (array)
Each variable of the table can be represented with the name of the table and its index:
Table[1]
Table[2]
....
• Types available
Types Description
BOOL 1 bit - Digital
BYTE 8 bits - Unsigned
INTEGER 16 bits - Signed
WORD 16 bits - Unsigned
LONG 32 bits - Signed
DWORD 32 bits - Unsigned
SINGLE 32 bits - Float IEEE
TEXT(x) TEXT with x the number of characters
• Examples
Dim Temperature as Single
Dim input2 as Bool
Dim table[4] as Word
Dim Name as Text(20)
Comparison
The available comparison operators are:
= : equal to
< : smaller than
<= : smaller than equal to
> : larger than
>= : larger than or equal to
<> : different
The comparison returns a Boolean result. It can be used to compare 2 numbers and get the result in a Bool, or in a sequence
as condition; for instance if ..then.
• Syntax
if (expression1 operator expression2) then
• Arguments
result :Bool
expression :any expression composed of Bool, Byte, Word, Long, Float
• Syntax
• Classical syntax: with Statements on different lines:
If Condition1 then
Statement1
Statement2
elseif Condition2 then
Statement3
else
Statement4
Endif
In above example:
If Condition1 is TRUE, Statement 1 and 2 are executed.
If Condition1 is FALSE, Condition2 is tested.
If Condition2 is TRUE, Statement3 is executed otherwise Statement4 is executed
If Condition1 then
Statement1
Statement2
else
if Condition2 then
Statement3
else
Statement4
endif
endif
• Several Statements on the same line: the Statements must be separated by colons:
If Condition then
Statement1 : Statement2
endif
If Condition1 then
Statement1
If Condition2 then
Statement2
endif
endif
• Arguments
➢ Condition
The condition is Boolean. It can be any expression resulting in TRUE or FALSE status.
Examples:
• Examples
Call of a POU
If (level>100) then
Call StopPump 'StopPump is a POU Program
endif
If (Level<15) then
for i=1 to 4
If Pump[i]=0 then
Pump[i]=1
endif
next
endif
Arithmetic operators
TWinSoft handles type casting automatically, according to “C” rules. TBOX MS32, TBOX-LT2 and TBOX-NANO respect
literally those rules. TBOX MS16 and TBOX LITE have some exceptions described section section1.9.3.
Following table gives cast's results of any arithmetic function (+, *, …):
Example:
With constant and Tag, the constant is casted to the format of the Tag it is associated to.
Examples:
RESULT=WORD * 10.9 if WORD=100, RESULT=1100 (you can force the casting of the constant. See
section1.14.24)
The constant 70000 cannot be casted into WORD, then the WORD is
casted in DWORD
WORD=MINUTE*100 +SECOND MINUTE is by default in byte format, then MINUTE*100 is computed in BYTE
format. If its result is > 255, the final result will be wrong.
Then you should force the casting of MINUTE (see 1.14.24)
Examples:
WORD = FLOAT + FLOAT Result in WORD with the addition of the FLOAT rounded
LONG = WORD + WORD In case the result of the operation is > 65535, TWinSoft presumes the
result will go to a Long.
Be sure the Tag receiving the result is of format Long
LONG = WORD * WORD same as above
+ (Addition)
Sums several numbers
• Syntax
result=expression1+expression2+ expression3 ...
• Arguments
result :Byte, Word, Long, Float
expression :any expression composed of Bool, Byte, Word, Long, Float
When mixing several format of variables during arithmetic operations, mind the
type casting ! See section1.9.1 above.
• Examples
Word1=Word2+Float2+Float3 'Result in 'Word' format with Float rounded
Float1=Word2+(Float2*2) 'Result in Float
- (Subtraction)
Gives the difference between numbers or used to change a number to negative.
• Syntax
result=expression1-expression2-expression3 ...
result=-number
• Arguments
result :Byte, Word, Long, Float
expression :any expression composed of Bool, Byte, Word, Long, Float
• Examples
Word1=Word2-Float2-Float3 'Result in 'Word' format with Float rounded
Float1=Word2-(Float2*2) 'Result in Float
With Addition and Subtraction, according to the types used, (Byte, Word or Int) be
attentive to roll over
* (Multiplication)
Multiplies numbers.
• Syntax
result=expression1*expression2*expression3 ...
• Arguments
result :Byte, Word, Long, Float
expression :any expression composed of Bool, Byte, Word, Long, Float.
When mixing several format of variables during arithmetic operations, mind the
type casting ! See section 1.9.1
• Examples
Word1=Word2*Float2*Float3 'Result in 'Word' format with Float rounded
Float1=Word2*Float2*2 'Result in Float
/ (Division)
Divides numbers.
• Syntax
result=expression1/expression2/expression3 ...
• Arguments
result :Byte, Word, Long, Float
expression :any expression composed of Bool, Byte, Word, Long, Float
When a divisor=0 (zero) the result is unpredictable and depends on the type of
'result' variable.
To avoid any problem, you have to check the divisor(s) before executing the
division(s)
• Examples
if (Float2>0) and (Float3>0) then
Word1=Word2/Float2/Float3 'Result in Word with Float rounded
endif
if (Float2>0) then
Float1=Word2/Float2/2 'Result in Float
endif
Modulo Operator
Divides 2 numbers and returns the remainder
• Syntax
result=number1 % number2
• Arguments
result :Word, Long, Float
numbers :Word, Long
When mixing several format of variables during arithmetic operations, mind the
type casting ! See section 1.9.1 above.
• Examples
Remainder=47 % 15 'Remainder=2
Logical operators
Introduction
There are 2 ways to interpret those operators:
- as Boolean operators
- as Bitwise operators
Boolean operators
This is probably the more usual way to use the logical operators: in an expression you execute Boolean operations between
several Tags.
Example:
if ((Var1>=150) And (Var2<=200)) Or ((Emergency=1) And (Not Button))
Bitwise operators
Those operators are used between 2 Tags and execute Bitwise operations on each bit of the Tags:
AND Operator
OR Operator
XOR Operator
NOT Operator
AND
Performs a Bitwise AND operation on 2 expressions.
00110101
11010110
00010100
• Syntax
result=expression1 And expression2
• Arguments
result :Word or Long
expression :any expression composed of Bool, Byte, Word, Long
You can mix several types of variables in the 'expressions': it is automatically converted to the type of the variable 'result'
• Examples
MyVal=Word1 And 255 'Mask to erase the MSB
MyVal=(Word1*2) And Word2
OR
Performs a Bitwise OR operation on 2 expressions.
00110101
11010110
11110111
• Syntax
result=expression1 Or expression2
• Arguments
result :Word or Long
expression :any expression composed of Bool, Byte, Word, Long
You can mix several types of variables in the 'expressions': it is automatically converted to the type of the variable
'result'
• Examples
MyVal=Word1 Or Word2
MyVal=(Word1*2) Or Word2
XOR
Performs a Bitwise XOR operation on 2 expressions.
00110101
11010110
11100011
• Syntax
result=expression1 XOR expression2
• Arguments
result :Word or Long
expression :any expression composed of Bool, Byte, Word, Long
You can mix several types of variables in the 'expressions': it is automatically converted to the type of the variable
'result'
• Examples
MyVal=Word1 XOR Word2
MyVal=(Word1 XOR Word2) And Word2
NOT
Performs a Bitwise NOT operation on 1 expression. It inverts the bits.
11010110
00101001
Notes:
1. The NOT function is a complement to 1
2. An inversion (a=-b) is a (complement to 1) + 1
Examples:
• Syntax
result=Not expression
• Arguments
result :Word or Long
expression :any expression composed of Bool, Byte, Word, Long
• Examples
MyVal=Not Word1
Dim i as Word
For i=x to n step y
Statement
Statement
next i
The Statement is executed once at each cycle of the program: This can be useful to balance the resources of a
program, and mandatory when there are a lot of steps.
Dim i as Word
For i=1 to n
Statement
nextcycle i
Example:
Dim InitValue[3] as Word
Dim i as Word
For i=1 to 3
InitValue[i]=0
next i
In this example, [3] is the size of the array. Only square brackets [ ] can be used
The table is composed of one selected Tag, and the following Tags in order of their ModBus addresses from the list of
Tags.
Example: you have 'start' variables you want to activate at the same time.
You create the 4 Tags, with successive ModBus addresses.
Dim i as Word
For i=1 to 4
Start1[i]=1
next i
• Example
For...Next statements nested
While...Wend
While...Wend statement executes a loop as long as the condition is TRUE.
Therefore, the rest of the program is not executed as long as the condition is TRUE.
• Syntax
➢ Classical syntax
While condition
statement1
statement2
Wend
While condition1
statement1
While condition2
statement2
Wend
Wend
• Argument
condition : Bool, Tag or expression
• Example
While level>150
call Alarms
Wend
Mathematical Functions
Trigonometry
The trigonometric functions supported are:
• Syntax
Result=Sin(x)
Result=Cos(x)
Result=Tan(x)
Result=ArcSin(x)
Result=ArcCos(x)
Result=ArcTan(x)
• Argument
x : Single or constant
result : Single
• Examples
‘Calculation of pi
Dim a as Single
Dim Pi as Single
a=arcsin(1)
Pi=a*2
‘Implementation of a sinusoid
Sine=sin(Radian)
Sinusoid=(sine*90) + 200
Degree=(Radian*180)/pi
Logarithmic
The logarithmic functions supported are common logarithms and natural logarithms
• Syntax
Result=Log(x)
Result=Ln(x)
• Argument
x : Single or constant
result : Single
Exponential
Exponential function returns e (the base of natural logarithm) raised to a power
The constant e is approximately 2.718282
The Exp function is the complement to natural logarithm function (see above)
• Syntax
Result=Exp(x)
• Argument
x : Single or constant
result : Single
Power
The Power function returns the value of a base expression taken to a specified power.
• Syntax
Result=Pow(base, exponent)
• Argument
base : Single or constant
exponent : Single or constant
result : Single
• Example
Power=Pow(10, 3) ‘returns 1000 (10^3)
Power=Pow(0, 0) ‘returns 1
Power=Pow(1, 0) ‘returns 1
When working with Tag(s) as argument, be careful that the result is a Float (IEEE),
with a precision of 7 digits.
Therefore, 10^7 or higher may not return the expected value.
Square root
Returns the square root of a number.
• Syntax
Result=Sqrt(x)
• Argument
x : Single or constant
result : Single
• Example
MySquar=Sqrt(4) ‘returns 2
MySquar=Sqrt(9) ‘returns 3
MySquar=Sqrt(23) ‘returns 4.796
MySquar=Sqrt(0) ‘returns 0
Functions (various)
The following Functions are supported. See details in the following pages.
INC
The INC function increments a variable (+1).
• Syntax
inc(Var)
• Argument
Var :must be any Integer variable: Byte, Word, Long
• Example
If TriggerPos(Pump_0) then
inc(Counter_0)
endif
DEC
The DEC function decrements a variable (-1)
• Syntax
dec(Var)
• Argument
Var :must be any Integer variable: Byte, Word, Long
• Example
If TriggerPos(Pump) then
dec(PumpActive)
endif
ABS
The ABS function returns the absolute value of any variable.
• Syntax
Result=abs(Var)
• Argument
Var :any format: Byte, Word, Long, Float
LOBYTE
Returns the lowest Byte of a Word variable.
Example:
Variable: 0010010101101011
Result: 01101011
• Syntax
Result=LoByte(Var)
• Argument
Var :Word (16 bits)
Result :Byte or Word
HIBYTE
Returns the highest Byte of a Word variable.
Example:
Variable: 0010010101101011
Result: 00100101
• Syntax
Result=HiByte(Var)
• Argument
Var :Word (16 bits)
Result :Byte or Word
LOWORD
Returns the lowest Word of a DWord variable.
Example:
Variable: 00100101011010110010001100111101
Result: 0010001100111101
• Syntax
Result=LoWord(Var)
• Argument
Var :DWord (32 bits)
Result :Word
HIWORD
Returns the highest Word of a DWord variable.
Example:
Variable: 00100101011010110010001100111101
Result: 010010101101011
• Syntax
Result=HiWord(Var)
• Argument
Var :DWord (32 bits)
Result :Word
• Example
HighestWord=HiWord(Long)
SWAPBYTES
Invert the bytes of a Word variable.
Example: inversion
• Syntax
Result=SwapBytes(Var)
• Argument
Var :Word
Result :Word
SHL
Shift to the left of x bits (without roll over).
• Syntax
Result=SHL(Var,shift)
• Argument
Var :Word or DWord
Shift :Word or Constant
Result :Word or Dword
SHR
Shift to the right of x bits (without roll over).
• Syntax
Result=SHR(Var,shift)
• Argument
Var :Word or DWord
Shift :Word or Constant
Result :Word or Dword
Bit
This function allows reading a bit in an analog register. The bit number starts at ‘bit0’ (lsb).
Example:
… 0 1 1 0 1 0 1 1
bit # ... 7 6 5 4 3 2 1 0
• Syntax
Result=Bit(Register, BitNumber)
• Argument
Result :Bool
Register :Word, DWord
BitNumber :Constant, Byte, Word, DWord
• Example
If bit(PumpList,4) then
Lamp4=1
endif
SetBit
This function allows forcing a bit in an analog register. The bit number starts at ‘0’ (lsb)
• Syntax
SetBit(Register, BitNumber, Value)
• Argument
Register :Word, DWord
BitNumber :Constant, Byte, Word, DWord
Value :Bool
• Example
'Inversion of bit 8.
Setbit(Register,8,not bit(Register,8))
PackBits
These functions allow putting a series of addresses of digital Tags into an analog register.
There are 3 PackBits functions:
• Syntax
Byte_register = PackBits8(Value)
Word_register = PackBits16(Value)
DWord_register = PackBits32(Value)
• Argument
Register : depending of the function it is a Byte, Word, or DWord
Value : it is the ModBus address of the first bit. The value at this address becomes the lsb of the
analog register
• Example
'Putting Digital DIR_0 to DIR_15 to register ANA_16
'ModBus address of DIR_0 = 20480
ANA_16 = PackBits16(20480)
DIR_0 0 1 1 1
DIR_1 0 1 0 1
DIR_2 0 1 0 1
DIR_3 0 1 0 1
DIR_4 0 1 0 1
DIR_5 0 1 0 1
DIR_6 0 1 0 1
DIR_7 0 1 0 1
DIR_8 1 0 0 1
DIR_9 0 0 0 1
DIR_10 0 0 0 1
DIR_11 0 0 0 1
DIR_12 0 0 0 1
DIR_13 0 0 0 1
DIR_14 0 0 0 1
DIR_15 0 0 1 1
1. When creating the digital Tags, be sure you reserve enough addresses after the
one declared in the function
2. Tags for all addresses do not need to be created, but it is advised to do it to avoid
confusion when creating Tags afterwards
SplitBits
These functions allow extracting bits from an analog register to a series of ModBus addresses of digital Tags.
There are 3 SplitBits functions:
SplitBits8: extract the 8 bits of a Byte to 8 successive ModBus addresses of digital Tags.
SplitBits16: extract the 16 bits of a Word to 16 successive ModBus addresses of digital Tags.
SplitBits32: extract the 32 bits of a DWord to 32 successive ModBus addresses of digital Tags.
• Syntax
SplitBits8(Byte_register, Value)
SplitBits16(Word_Register, Value)
SplitBits32(DWord_Register, Value)
• Argument
Register : depending of the function it is a Byte, Word, or DWord
Value : it is the ModBus address of the first bit. The value at this address corresponds to the lsb
of the analog register.
• Example
'Extracting bits of ANA_16 to DIR_0 ... DIR_15
'ModBus address of DIR_0 = 20480
SplitBits16(ANA_16,20480)
DIR_0 0 1 1 1
DIR_1 0 1 0 1
DIR_2 0 1 0 1
DIR_3 0 1 0 1
DIR_4 0 1 0 1
DIR_5 0 1 0 1
DIR_6 0 1 0 1
DIR_7 0 1 0 1
DIR_8 1 0 0 1
DIR_9 0 0 0 1
DIR_10 0 0 0 1
DIR_11 0 0 0 1
DIR_12 0 0 0 1
DIR_13 0 0 0 1
DIR_14 0 0 0 1
DIR_15 0 0 1 1
1. When creating the digital Tags, be sure you reserve enough addresses after the
one declared in the function
2. Tags for all addresses do not need to be created, but it is advised to do it to avoid
confusion when creating Tags afterwards
Split32
This function converts one 32 bits register to two 16 bits registers.
This can be useful if you have to transfer 32 bits register, using a unique transaction including 16 bits and 32 bits registers.
The 32 bits registers will be seen as 2 x 16 bits registers.
• Syntax
Split32(32bitsReg, Hword, Lword)
• Arguments
32bitsReg : Register to split into 2 Words (DWord or Float)
Hword : High 16 bits of the 32 bits register (Word)
Lword : Low 16 bits of the 32 bits register (Word)
• Example
'Converting the Floating register Temperature to TempHigh and TempLow
Pack32
This function converts two 16 bits registers into one 32 bits register.
• Syntax
Pack32(32bitsReg, Hword, Lword)
• Arguments
32bitsReg : Register receiving the 2 Words following (DWord or Float)
Hword : High 16 bits of the 32 bits register (Word)
Lword : Low 16 bits of the 32 bits register (Word)
• Example
'Converting the Temperature consisting of 2 Words
Trigger
The Trigger function allows checking a transition in an expression.
TriggerPos
It informs on the transition '0' to '1' of a digital Tag.
• Syntax
X = TriggerPos(expression)
X = 1 at changing of the expression (FALSE to TRUE) during one cycle of the program.
• Argument
X :Bool
Expression :any expression composed of Bool, Byte, Word, Long
• Examples
'To Set an Output when pressing a start button
if TriggerPos(Start) then
Output=1
endif
When the program starts, the internal status of the “TriggerPos” Function = 0.
Then, if the Tag associated to the Function = 1 when the program starts, the
function “TriggerPos” will be executed at the first cycle of the program, meaning
even if the Tag associated to the function has not changed from 0 -> 1.
If this can be an issue, the alternative is to use a flag instead of “TriggerPos” function:
Becomes:
TriggerNeg
It informs on the transition '1' to '0' of a digital Tag.
• Syntax
X = TriggerNeg(expression)
X = 1 at changing of the expression (TRUE to FALSE) during one cycle of the program.
• Argument
X : Bool
Expression : any expression composed of Bool, Byte, Word, Long
• Example
'To Reset an Output when pressing a Stop button
if TriggerNeg(Stop) then
Output=0
Endif
PutChrono
This function forces recording into the chronology.
Depending on the type of the Tag selected, the value is written to the ‘Analog chronology’ or ‘Digital chronology’.
• Syntax
PutChrono(variable)
• Argument
variable : Tag to insert into the chronology
digital Tag (Bool) → writing to Digital chronology
analog Tag (Byte, Word, Long, Single) → writing to Analog chronology
• Examples
if Button=1 then
PutChrono (Button)
PutChrono (Level)
PutChrono (Temperature)
Endif
Truncate
This function extracts the whole number from a Tag in Single format.
• Syntax
Long_register=Truncate(Single_register)
• Argument
Long_register : Long
Single_register : Single
• Examples
Whole_value = Truncate(Floating_reg)
If Floating_reg = 123.456 then Whole_value = 123
Odd
This function indicates whether an analog Tag is ODD or EVEN.
• Syntax
Bool_register=odd(analog_register)
• Argument
Bool_register : Bool
analog_register : Byte, Word, Long, Single
• Examples
Output=odd(Analog)
If Analog is ODD, Output=1; otherwise Output=0
BCD
This function transforms a decimal number to BCD format.
BCD format means that each 4 bits is considered as an entity corresponding to 1 number.
• Syntax
Word_output=bcd(Word_input)
• Arguments
Word_output : Word
Word_input : Word
• Examples
Output=bcd(Word)
If Word=4660 then Output=1234:
decimal: 4660
binary: 0001 0010 0011 0100
BCD 1234
Sampling tables
These functions allow accessing a specific value in a sampling table. They let you benefit from pre-computed values in a
sampling table, as illustrated in the example below:
• Syntax
tablesize(index) to check the size of a table
samplebyte(index,offset) to access data of a Tag in Byte format
sampleword(index,offset) to access data of a Tag in Word format
sampledword(index,offset) to access data of a Tag in 32 bits format
samplesingle(index,offset) to access data of a Tag in Float format
• Arguments
index: index of the sampling table (see list of sampling tables)
offset: sample you want to access. Offset=0 means the last sample
• Examples
Imagine you want to calculate the arithmetic average of a value based on a period of 15 minutes. You could do
it using Ladder or BASIC. But you can make it much more easily using a sampling table and one of those functions.
You then use the function appropriate to the format of the Tag as follows:
Average=sampleword(1,0)
Type Casting
TWinSoft handles type casting automatically, but in some cases it can lead to misinterpretation.
To prevent it, we have implemented Type Casting functions that make you be sure of the type used in the Functions.
• Syntax
CBool(Var) Type casting to Boolean format
CByte(Var) Type casting to Byte format
CDWord(Var) Type casting to DWord format
CInt(Var) Type casting to Integer format
CLng(Var) Type casting to Long format
CSng(Var) Type casting to Single (Float) format
CWord(Var) Type casting to Word format
• Examples
GetRTUTime, GetRTUDate
You can use the system variables ‘Time’ (Hour, minute, second, …) to synchronize events from BASIC programming.
The risk is that handling several of those variables in one statement may lead to confusion.
Example:
If(Hour=6) And (Minute=0) And (Second=0)...
To avoid this situation, we have implemented a dedicated function to retrieve time using an atomic operation (all
operations without interruption)
• Syntax
GetRtuTime(MyHour, MyMinute, MySecond)
GetRtuDate(MyDay, MyMonth, MyYear)
• Arguments
Myxxx: Byte, Word (internal variables)
• Example
Sending an e-mail every day at 6:00 AM
Float Functions
As of TWinSoft 12.4 and OS 1.46, those functions allow testing the value of a float.
It can be out of range when it is “Not a Number”, when the binary sequence is not supported, or “Infinite”.
• Syntax
Test=isNaN(Var)
Test=isInfinite(Var)
Test=isZero(Var)
• Arguments
Test: Bool (0=False, 1=True)
Var: Single
• Example
Test_NAN=isNaN(MyFloat1)
• Additional data
There are 2 initialization data that can be applied to a Float variable through BASIC only: INF and -INF
• Syntax
Var=&PINF MIND it is case sensitive !
Var=&NINF MIND it is case sensitive !
• Example
MyFloat1=&PINF
Random Functions
As of TWinSoft 12.4 and OS 1.46, this function computes a random value in a range defined between a minimum and a
maximum value.
• Syntax
Var=Rndm(Min, Max)
• Arguments
Var: DWord
Min, Max: DWord
• Example
Text Functions
Text Functions are dedicated to BASIC, even if in some case, Text Tags can be used in Ladder (like in comparison functions).
Text Functions can be used in any type of POU (Program, FB or F) and when used in FB or F, 'Text' arguments are supported
in BASIC as well as in Ladder.
Timers / Counters
Indirect addressing
Indirect addressing allows accessing Variables from their addresses (and not from their Tag name)
It can be in most of the case replaced by 'index addressing' and For...Next...Step statement which is typically used in
BASIC programming.
According to the type of Function used (Bool, Word, Float or Long), be careful to
associate addresses of similar registers.
Reading functions
• Syntax
Digital=PeekBool (Pointer) 'Reading at the address of a Tag BOOL
Analog16=PeekWord (Pointer) 'Reading at the address of a Tag WORD
Float=PeekFloat (Pointer) 'Reading at the address of a Tag FLOAT
Analog32=PeekLong (Pointer) 'Reading at the address of a Tag LONG
Text=PeekText (Pointer) 'Reading at the address of a Tag Text
• Arguments
Pointer : Word register containing the ModBus address of the variables.
Digital : Boolean variable to receive the status at the address of 'Pointer'.
Analog16 : 16 bits variable to receive the value at the address of 'Pointer'
Float, Analog32 : We advise to use a type of variable equivalent to the one of the addressread (Float when
addressing a Float, Long when addressing a Long, …)
Text : Text Tag to receive the text at the address of ‘Pointer’
Writing functions
• Syntax
PokeBOOL(Pointer, State)
PokeWord(Pointer, Value)
PokeFloat(Pointer, Value)
PokeLong(Pointer, Value)
PokeText(Pointer, Text)
• Arguments
Pointer :Word register or Expression containing the ModBus address of the variables.
State :Value (0 or 1) to write in the address of 'Pointer'
Value :Value or Expression to write in the address of 'Pointer'
Text :Text to write in the address of 'Pointer'. Can be a Text Tag of a String
Initialization of a Pointer
This function allows you to get the address of a Tag. It can be useful to initialize a Pointer from the first Tag that has to be
treated by the indirect addressing functions.
• Syntax
Pointer=AdrOf(Tag)
Working with Function or Function Block, if you need the ModBus address of an input argument, you will have first to
extract it using BASIC Function Adrof(Tag) (see above).
Working with the former TBox (CPU-3), the ModBus address of the argument is passed to the Function or Function block.
Working with TBOX MS, TBOX LT2 or TBOX LITE, the value of the Tag is passed to the Function or Function block (in
fact, the argument is copied into an intermediate variable. Then the link with the real Tag is lost).
GOTO
• Label
A label can be defined anywhere in a program as follows:
Alarms:
Pumps:
The colon " : " indicates it is a label. The name of a label must use the following rules:
• characters accepted are letters, numbers and underscore.
• the name cannot start with a number.
• the maximum length is 15 characters.
• BASIC is not case sensitive.
To avoid confusion, do not use keywords (see section 1.19) or Tag names.
• Syntax
Goto Label
Keywords
BASIC uses the following keywords. You should not use names similar to those keywords.
% (modulo) LoByte
_ (underscore = break line) Log
Long
Abs LoWord
AdrOf Ln
And
ArcCosine Mid
ArcSine
ArcTangent Next
As Not
AsciiToStr
Odd
Bcd Or
Bit
Byte PackBit
PeekBool
Call PeekFloat
Cat PeekLong
CBool PeekWord
CByte Pow
CDword PutChrono
CHex
CInt Right
CLong Rem
Cosine Rndm
CountDown
CountUp Samplebyte
CountRing Sampleword
CountReset Sampledword
CSng Samplesingle
CStr SetBit
CWord Shl
Shr
Dec Sine
Dim Single
DWord SplitBit
Sqrt
Else Step
Elseif StrToAscii
Endif StrToIp
Exp SwapByte
For Tablesize
Tan
GetRTUTime Then
GetRTUDate TimerSS
Goto TimerMS
TimerIN
HiByte TimerOD
HiWord TimerReset
Integer To
TriggerNeg
If TriggerPos
Inc Truncate
InStr
IpToStr Xor
IsInfinite
IsNaN UCase
IsZero
Wend
LCase While
Len Word
Left
Let
POU
According to IEC1131-3 standard, the programs are organized in POU, which stands for
Programs gives you the possibility to divide your project into several sub-programs (pump
management, alarms, intrusion, ...)
Each sub-program is POU Program.
Function Blocks gives you the possibility to create your own 'applet' or procedure (starting a
pump, regulating temperature).
Recursion is authorized but not for Function Block (A function cannot call itself):
1. We do not advise you use recursion
2. It is under your own responsibility
POU – Program
Introduction
The POU “Programs” can be considered as sub-programs. They allow you to structure your BASIC project into several sub-
programs.
Practically, you have a BASIC program ‘main’, which calls sub-programs. These sub-programs correspond to an action such
as: start pump, intrusion control, alarms management etc..., and can be called from ‘main’ or any other sub-program.
A Program can call another Program that can call another Program etc...
If you use Programs that call other Programs, be careful to avoid loops: Programs 1
calling Program 2 calling Program 3 that calls Program 1.
You select the name of the POU, press <CTRL> and double-click the name.
To change the language of ‘Main’, right click the name ‘Main’, go to Properties and change language to BASIC
Creating a Program
To create a Program, click the 'Programs' folder in the Project Workspace.
In the window appears the list of existing POUs (all types of POU). When starting TWinSoft the first time, the only one is the
'main'.
Double click 'Add a POU', type a Name (No accent, space or keywords (see section 1.19)) and check the type 'Program'.
Click OK.
When you double click the name of the Program in the list, the window for BASIC edition appears with a new Tab for the
current program.
Calling a Program
A Program can be called from any other Program. It is important that finally, it is called from the 'Main' Program.
• Syntax
To call a Program, use the syntax:
POU – Function
Introduction
A Function is a user-defined program that executes a calculation yielding to one result (an output). It is useful when a
calculation you regularly need to execute does not exist as Standard functions. You call it in Programs every time you need
to execute the calculation. It has one or several inputs and only one output. When a Function is used many times in a
Program, the same code is always executed; one cannot keep trace of internal status between 2 calls.
Creating a Function
To create a Function, click the 'Programs' folder in the Project Workspace.
In the window appears the list of existing POUs (all types of POU). When starting TWinSoft the first time, the only one is the
'main'.
Double click 'Add a POU', type a Name (No accent, space or keywords (see section 1.19)) and check the type 'Function'.
Select the language BASIC
Select the type of the output (result of the calculation): BOOL, WORD, LONG or FLOAT.
Click OK.
When you double click the name of the Function in the list, the window for BASIC edition appears with a new Tab for the
current program.
Example of Function
The following Function is an analog Function (it means the output is analog). It performs the percentage of an input value.
• The Tags
When creating a Function, TWinSoft automatically creates the 'Output' Tag. It is the unique Output allowed.
'Inputs' and 'Outputs' of the Function are the arguments that will be replaced when calling the Function (see next).
You create then the 'Inputs', corresponding to the arguments of the Function.
The way a POU Function works, involves that one can define only local Tags in a
POU Function.
Percent:
the output of the Function. It is unique and is the result of the calculation.
MAX, MIN, VAL:
are the Inputs of the Function.
Delta, scale:
local analog Tags used as temporary variables necessary to calculate the percentage.
Global Timer and Counters are allowed in Function, but it is very uncommon and
against logic.
• The programming
You use BASIC language for programming.
To check the Tags, look in the ‘list of Tags’ to the global Tags associated to the
arguments.
• Syntax
Result=Function(Arg1, Arg2, Arg3, ...)
• Arguments
the Tag receiving the result of the Function
Result
the name of the Function
Function
The Arguments have to be entered in the order they have been created in the list of
Tags of the Function.
Example:
Arg1 = Input
Arg2 = MIN
Arg3 = MAX
....
Example
Introduction
Function Blocks are user defined small 'applets', or procedures that perform a set of operations on a given set of I/Os (or
registers).
Function Blocks are particularly helpful when the same set of operations must be performed on several different sets of I/Os,
figuring instances of a small process.
eg.: The TBox needs to handle 4 identical pumps. No need to copy the same program 4 times. You call a Function Block from
a Program every time you need to execute the process and you assign Tags to it.
We advise you against using Functions in a Function Block. In fact, a Function exists only once and uses always the same
internal variables when it is called.
A Function Block uses new Tags (local and global) every time it is called from a Program.
In the window appears the list of existing POUs (all types of POU). When starting TWinSoft the first time, the only one is the
'main'.
Double click 'Add a POU', type a Name (No accent, space or keywords (see section 1.19)) and check 'Function Block'.
Select the language BASIC.
Click OK.
You have created a Function Block and it appears in the 'Programs' folder.
When you double click the name of the Function Block in the list, the window for BASIC edition appears with a new Tab for
the current program.
The following Function Block performs the start of a digital output with a programmable delay.
This Function Block implementation describes the inputs and outputs involved in the management of the delay. It also
specifies how long the delay is applied to the output.
It does not specify which Tags are physically connected to the ‘delay’: this is the job of the FB calling in a program (see
below).
• The Tags
Inputs and Outputs of a Function Block are the arguments to be replaced when calling the Function Block.
You create then the 'Inputs' and 'Outputs' in the list of POU Tags of the Function Block.
If you need 'local' Tags, you can create them from the list, or using the DIM statement.
INPUT is a digital input that will activate the OUTPUT after the DELAY.
OUTPUT is a digital output. It will be connected to a motor, for instance when calling the Function Block.
is an analog input containing the number of seconds of the delay. It must be associated to the
DELAY
timer used in the Function Block.
Timer0 is a local timer.
value is a local digital Tag of the type 'Timer - Value'.
status is a local digital Tag of the type 'Timer - Status'.
Timer_preset is a local analog Tag of the type 'Timer - Preset'.
• The programming
You use BASIC language for programming.
The Instantiation is done using a POU 'local' Tag. - From the Program where you wish to call the Function Block:
- In the list of POU Tag, click Add a POU Tag
- Type a name as Tag (the instance name)
- Select as ‘Type’ : FB Instance
- Select as ‘Name’ the name of your Function Block
- Click OK
- The instance appears in the list of ‘POU Tag’.
Example of Instantiation:
• Syntax
Call Instance(Arg1, Arg2, Arg3, ...)
• Arguments
Instance the name given to the local Tag used as Instantiation
The Arguments have to be entered in the order they have been created
in the list of Tags of the Function Block
Example
Programs - Ladder
TBOX MS, TBOX LITE, TBOX LT2 and TBOX NANO support 2 languages:
➢ LADDER is a graphical language, which should be preferred when Boolean operations are required. LADDDER is
much more efficient than BASIC for handling ‘digital’ Tags.
Then you combine programs, as you want: BASIC calling LADDER and reciprocal.
To see an example, load the TWinSoft document 'MSLadder.tws' that you find in the 'Samples' directory
of TWinSoft.
Ladder – Principle
The principle of the Ladder diagram is based on an electrical description of the process or machine, using relay logic. To the
left of the screen are the inputs (they are conditions for which an action will be undertaken) and to the right are the outputs
(which result from these actions).
Inputs
All inputs, whether digital or analog, can be combined to create logical equations:
All analog comparison functions and/or digital inputs on the same program line will represent true or false. The result
defines the actions of the output (will or will not be performed).
Outputs
Digital output functions are engagements (SET relay) or disengagement (RESET relay), they can be the image or the
opposite of the result of the tested input conditions (OUTPUT relay and NEGATIVE relay). Other functions have been
introduced proper to telemetry like transmission of alarms, data logging, … To process analog variables, many
mathematical functions and POU (Program Organization Units) functions have been implemented, but you might find
easier to use BASIC for making calculation (see section1: BASIC)
Example of Ladder
Cycle time
The same as with BASIC (see section 1.2.6.)
Ladder - Modes
Introduction
The Ladder programming operates in two different modes.
The first is display mode, which allows you to see the entire program, one page at a time. It is in this mode that you can see
the state or the value of variables in real time.
The second mode is edit mode, which allows inserting a new line anywhere in the Ladder, at the beginning, at the end or
between two existing lines. This mode also allows modifying an existing line.
To see an example program, open the TWinSoft document ‘MSLadder.tws’ from the directory ‘Samples’ of TWinSoft.
Display mode
To access the Ladder in Display mode, click in the Project Workspace on the 'Programs' folder. The last Ladder that was
opened is displayed. The white tab underneath indicates the active program. The tab 'MAIN' is the main program, which is
automatically executed by the RTU; the other POUs having to be called from the ‘MAIN’.
The Ladder diagram is drawn in red lines with the Tags associated at each input contact, output relay or IN/OUT of
functions.
When a jump (JUMP) is programmed, the jump’s mnemonic appears at the right side of a double arrow. The mnemonic is a
LABEL that appears in black text.
A call to another program appears in a red block with one IN/OUT line.
The state of the Boolean objects (input contacts, analog comparison, output relays) is displayed as a green overlay if the
condition represented by the contact is true (in the case of a trigger input contact, the result represents the current state of
the Tag.
When moving the cursor on analog Tags in Functions or Math blocks, the current value is displayed in the bottom left corner
of the screen. For digital Tags the display indicates <On> or <Off> according to the current value.
Edit mode
The Edit mode is used when inserting a new line or modifying an existing line.
To insert a line, use the LD Toolbar. Three types of lines can be inserted using the following buttons:
The Ladder diagram is made of several lines that are numbered starting at 1. Only one line at a time can be edited with only
one rung (a rung is a set of Input conditions connected to only one set of Outputs). When editing is finished, the line must be
compiled to proceed with the next one:
To save and compile a line. If an error occurs, a dialog box informs you on the error. The key <+>
can also be used to save and compile a line.
To quit editing and discard changes. The key <ESC> can also be used.
To select any item (line, contact, relays or Functions) of a Ladder line. Once selected it can be edited
by a double click to replace Tags. You can also erase the selected item by pressing the key <Delete>
or insert a new contact, relay or Function by selecting the proper icon in the LD Toolbar.
Ladder - Toolbar
The LD Toolbar is the panel of tools necessary to edit Ladder. Different icons are active according to the current mode of
Ladder:
Display mode
Clicking one of the following icons lets you enter in the edit mode:
Edit mode
To Select any item (line, contact, relays or Functions) of a Ladder line. Once selected it can be
edited by a double click to replace Tags. You can also erase the selected item by pressing the key
<Delete> or insert a new contact, relay or Function by selecting the proper icon in the LD Toolbar.
To Save and Compile a line. If an error occurs, a dialog box informs you of the error. The key <+
>can also be used to save and compile a line.
To Quit editing and discard changes. The key <ESC> can also be used.
To insert a Normal input contact for digital input. The condition will be true if the input is active.
To insert an Invert input contact for digital input. The condition will be true if the input is inactive.
To insert a Positive input trigger for digital input. The condition will be true only once when the
input passes from an inactive level to an active level.
Read important note at section 1.14.17
To insert a Negative input trigger for digital input. The condition will be true only once when the
input passes from an active level to an inactive level.
To insert a Digital output normal. Output is activated if the results of the input condition(s) are
true.
To insert a Digital output inverted. Output is activated if the results of the input condition(s) are
false.
To insert a Digital output set. Output is set and memorized if the result of the input condition(s)
are true; this type of output is typically used with a 'trigger' input
To insert a Digital output reset. Output is reset and memorized if the result of the input
condition(s) are true; this type of output is typically used with a 'trigger' input
To draw continuous horizontal or vertical lines. To join inputs conditions together to create logical
equations and to possibly connect too many outputs.
WARNING: a set of inputs can only lead through one horizontal line to only one set of outputs. It
is called a rung.
To insert a Program, Function or Function Block. A list opens with the standard Functions (under
the folder 'Standard') and with the user defined Programs, Function and Function Block (under the
folder 'This file')
To insert a Mathematical block. In this block, mathematical functions can be inserted by clicking
on 'New Math Function'.
Initiates a Jump to the line whose label corresponds to the one that is entered here (to enter a
label, see above in the list of icons of 'Display mode').
Variables
Introduction
Variables can be physical I/O, internal variables: analog (AIV) or digital (DIV) and system variables.
A variable becomes available when it is declared as a Tag. According to the use we make of the variables in Ladder
programming, there are two families of Tags:
➢ Local Tags
➢ Global Tags
Local Tags
A Local Tag is a non-specific register used as temporary value in a calculation. When compiling the TWinSoft document a
free memory zone (DIV or AIV) is assigned to it according to its type.
Local Tags are only used in the POU where they have been created.
They appear in the list of Local Tags, above the Ladder diagram of the POU (see next).
Global Tags
A Global Tag can be of two types:
- A specific variable (DIV, AIV, system variable, communication variable) that you wish to use.
- A physical I/O of the RTU created in the List of Tags.
Global Tags can be used in any POU Program and Function Block (see next).
Introduction
Creating Ladder diagram consists of 'drawing' program lines with input contacts or functions and output relays or functions
placed between 2 vertical Power Rails. The two rails can be considered as electrical wires between which items are placed.
The lines as a whole represents your local automation.
In the LD Toolbar click - - to insert a new Ladder Line. In the window of Ladder programming, a rectangle appears with
a line number. Only one line at a time can be edited with only one rung (a rung is a set of Input conditions connected to
only one set of Outputs). The grid shows you the places where you can place contacts, relays and functions.
The Ladder is executed from left to right and from top to bottom.
Each input is read before executing the Program and the value stored to be used all along the Program.
In the same way, each output is saved and executed only at the end on the Program.
Be careful when using an output at different places in the Program, unless you do SET and RESET. To help you, check the
Cross reference of the Tags.
According to the item you wish to use, select the proper icon in the Toolbar.
Inserting items
When inserting an item, you must declare the variable(s) associated to it: Digital Tag for a contact and a relay, Digital or
Analog Tags for Functions.
- You know the name of the Tag: you type its name. TWinSoft is not case sensitive, so
you can type it in capital or small letters.
The Tag exists - You don’t know the name of the Tag: you click the button to open the list of Tags.
You have the choice between Global Tag, Local Tag and System variables (see
previous section ‘Variables’).
You type its name and press <ENTER> to create it. The Tag can be either Local Tag or
The Tag does not exist Global Tag (see previous section ‘Variables’).
According to the field you are in, you can select a Tag (digital or analog) or directly type a
constant.
Check the title of the insertion window; it informs you on what you can use.
The Keys
We use the following Tags (see the corresponding TBox manual section: Tags):
Level analog input (Float)
Manual digital input.
Pump digital output.
Timer_Status digital internal variable associated to the timer ‘Qty_minutes’
Maintenance digital output.
Reset digital input.
If you encounter difficulties in drawing lines, go to section 2.8. Drawing Lines in Ladder…
1. In the program ‘MAIN’, click the icon to insert a line of comment. Type you text and click ‘OK’.
2. Click the icon to insert a new line. The edit block is ready to create the second line. The grid shows the position
where you can place the items.
3. Click the icon to insert the function A>B and then click next to the left Rail.
4. Enter the Tag LEVEL or select it from the list of Tags and then enter the constant 150.
5. Click the icon to insert a digital contact, then click below the comparison Function close to the left rail.
7. Click the icon and draw a horizontal and vertical line to join the output of the comparison Function.
8. Click the icon to insert an output relay, then click on the output of the comparison Function. A horizontal line
including the relay is automatically drawn to the right rail.
10. Click the icon , go to the folder ‘Timers’ and select the timer Integral (TI).
11. Type the name of the Timer (instance name), or if it exists, you can browse it from the button
12. Type the Preset of 360000 (= 100 hours). Preset is always expressed in seconds.
13. Click the icon and draw a horizontal and vertical line to join the timer Function to the right rail and to the output of
the comparison Function.
14. Press the key <+>, or click the icon to compile the line. Doing this, the edition block is ready to create the third line.
15. Click the icon to insert a Positive edge trigger contact, then click next to the left rail.
17. Click the icon to insert a SET output relay, then click next to the right side of the contact TIMER_STATUS. A
horizontal line including the relay is automatically drawn to the right rail.
18. Enter the Tag MAINTENANCE or select it from the list of Tags.
19. Press the key <+>, or click the icon to compile the line. Doing this, the edition block is ready to create the fourth
line.
20. Click the icon to insert a Positive edge trigger contact, then click next to the left rail.
21. Enter the Tag RESET or select it from the list of Tags.
22. Click the icon to insert the reset timer Function, then click next to the contact RESET.
23. Type the name of the Timer or select it from using the browse button .
24. Click the icon and then click the reset timer Function; drag it one step to the right.
25. Click the icon and draw a horizontal line between the RESET contact and the reset timer Function.
26. Click the icon to insert a output relay associated to the Tag MAINTENANCE, then click under the reset timer
Function. A horizontal line is automatically drawn to the right rail.
27. Enter the Tag MAINTENANCE or select it from the list of Tags.
28. Click the icon and draw a horizontal and vertical line to join the input contact to the output relay MAINTENANCE.
29. Press the key <+>, or click the icon to compile the line. Doing this, the edition block is ready to create the next line.
• To draw a line, you drag the cursor until the end of the line segment.
• You draw horizontal and vertical line after each other.
• With the cursor inside a cell, the line is drawn when you cross to the next cell.
That’s it !
Functions
Ladder provides a series of pre-defined functions to perform operations like Comparisons, Assignment, Boolean
operations,.…
Ladder provides also Timer functions (for counting time) and Counter functions (for counting pulses).
- EN: Enable Input: Connection to the Ladder line. EN must be TRUE to perform the Function.
- ENO: Enable Output: it is the image of EN. If EN is TRUE, ENO is TRUE. It can be connected to
a contact or a relay, a Mathematical block or another Function.
To insert a Function, in the edit mode of Ladder Programming, click the icon of the LD Toolbar.
The output is TRUE when the input values fit with the comparison, otherwise it is FALSE. The output can be connected to a
relay, a Math Block, another Function or a POU. The parameters are:
- EN: Connection to the Ladder line. EN must be TRUE to perform the Function.
- OUT: Digital Output of the Function: TRUE when A & B fit with the Function selected and EN is
TRUE.
It can be connected to a relay, a function or a mathematical block
Special Functions
Q = A: the Tag 'anaOUT' contains a copy of the value of the Tag anaIN'
Q = -A: the Tag 'anaOUT' contains the inverse value of the Tag 'anaIN'
Q = low(A): the Tag 'anaOUT' contains a copy of the 8 lowest bits of the Tag
'anaIN'
A and Q must be WORD
Q = high(A): the Tag 'anaOUT' contains a copy of the 8 highest bits of the Tag
'anaIN'
A and Q must be WORD
Q = abs(A): the Tag 'anaOUT' contains a copy of the absolute value of the Tag
'anaIN'
A and Q must be WORD
The Tag 'anaOUT' is the addition of the Tags 'ana0' and 'ana1'
The Tag 'anaOUT' is the subtraction of the Tags 'ana0' and 'ana1'
The Tag 'anaOUT' is the multiplication of the Tags 'ana0' and 'ana1'
The Tag 'anaOUT' is the division of the Tags 'ana0' and 'ana1'
The Tag 'anaOUT' is the rest after the division of the Tags 'ana0' and 'ana1'.
Example: 2 = 17 MOD 3
'anaOUT' is the result of the logical AND between 'ana0' and 'ana1'
Example: 0001000011111111
AND 0001100000001111
0001000000001111
'anaOUT' is the result of the logical XOR between 'ana0' and 'ana1'
Example: 0000000011111111
XOR 1111000000001111
1111000011110000
The status of digital Tag 'dig0' will be copied in the analog Tag 'anaOUT' at the
position indicated by the Index.
Example: dig0: 1
Index: 3
anaOUT: 0011010011001001
The status of the bit of the analog Tag 'ana0' indicated by the Index will be
copied in the digital Tag 'digOUT'.
Example: ana0: 1100101000010010
Index: 5
dig0: 0
Wraparound means that the bits scrolling out from one side of a Byte (8 bits) or Word (16 bits) are copied at the other side
of the byte or word.
'anaOUT' has the number of 'Bit' shift to the left (max. 15) of the Word analog
Tag 'ana0'
(without wraparound).
'anaOUT' has the number of 'Bit' shift to the right (max. 15) of the Word analog
Tag 'ana0'
(without wraparound).
'anaOUT' has the number of 'Bit' shift to the left (max. 7) of the Byte analog Tag
'ana0'
(with wraparound).
'anaOUT' has the number of 'Bit' shift to the right (max. 7) of the Byte analog
Tag 'ana0'
(with wraparound).
'anaOUT' has the number of 'Bit' shift to the left (max. 15) of the Word analog
Tag 'ana0'
(with wraparound).
'anaOUT' has the number of 'Bit' shift to the right (max. 15) of the Word analog
Tag 'ana0'
(with wraparound).
Mathematical Block
A mathematical Block allows carrying out analog output operations like assignment, arithmetic operations, comparisons,
Boolean operation, indirect addressing, …
When calculations are concerned, we advise the use of BASIC; being a text language, you
may find it more user-friendly.
Another reason is that advanced mathematical functions are only available with BASIC
(SIN, COS, POWER, …)
To insert a Math block, in the edit mode of Ladder Programming, click the icon of the LD Toolbar.
Introduction
There are 7 categories of mathematical functions available (to use in math blocks):
• Assignments
• Arithmetic operations.
• Comparisons.
• Bit manipulations.
• Boolean Operations.
• Conversion + Indirect addressing.
• Miscellaneous.
In the functions, the Arguments to be replaced by Tags (or constants) are represented as follows:
An assignment operation is always executed from the right to the left. In other words, we have: result = operation
Which means: output = input (meaning the value of Input variable is copied in the Output variable).
To insert a 'Math function' between 2 existing functions in a Math block, edit the line, place the cursor at the position you
want to insert the function, and press the key <Insert> of keyboard.
Type Casting
Read information about Type Casting section 1.9.1.
Assignments
A = B 'A' contains a copy of the value of 'B'
A = -B 'A' contains the inverse value of 'B'
A = Low(B) If B is a WORD: 'A' contains a copy of the 8 lowest bits of 'B'
If B is a LONG: 'A' contains a copy of the 16 lowest bits of 'B'
A = High(B) If B is a WORD: 'A' contains a copy of the 8 highest bits of 'B'
If B is a LONG: 'A' contains a copy of the 16 highest bits of 'B
A = Abs (B) 'A' contains a copy of the absolute value of 'B'
A = Swap(B) 'A' contains the inversion of the 8 highest bits and the 8 lowest bits of 'B'
Examples: B = 256 (00000001 00000000)
A=1 (00000000 00000001)
inc (A) increase the value of Tag 'A' by 1 unit
dec (A) decrease the value of Tag 'A' by 1 unit
Arithmetic operations
A = B + C 'A' is the addition of 'B' and 'C'
A = B - C 'A' is the subtraction of 'B' and 'C'
A = B * C 'A' is the multiplication of 'B' and 'C'
A = B / C 'A' is the division of 'B' and 'C'
A = B * C / D 'A' is the result of the multiplication of ‘B’ and ‘C’, divided by ‘D’.
Particularly useful to execute scaling with one function.
A = B AND C 'A' is the result of the logical AND between 'B' and 'C'
Example: 0001000011111111
AND 0001100000001111
0001000000001111
A = B OR C 'A' is the result of the logical OR between 'B' and 'C'
Example: 0000000011111111
OR 1111000000001111
1111000011111111
A = B XOR C 'A' is the result of the logical XOR between 'B' and 'C'
Example: 0000000011111111
XOR 1111000000001111
1111000011110000
A = B MOD C 'A' contains the rest after the division of 'B' and ‘C’.
Example: 2 = 17 MOD 3
When doing logical operations, check you don’t work with Float variable.
There is no linear sequence in the binary format of Float register, like with Word or Long.
Comparisons
BOOL = B == C 'BOOL' is TRUE if 'B' equal 'C', otherwise it is FALSE
BOOL = B < C 'BOOL' is TRUE if 'B' is smaller than 'C', otherwise it is FALSE
BOOL = B > C 'BOOL' is TRUE if 'B' is greater than 'C', otherwise it is FALSE
BOOL = B <= C 'BOOL' is TRUE if 'B' is smaller than or equal to 'C', otherwise it is FALSE
BOOL = B >= C 'BOOL' is TRUE if 'B' is greater than or equal to 'C', otherwise it is FALSE
BOOL = B <> C 'BOOL' is TRUE if 'B' and 'C' are different, otherwise it is FALSE
BOOL = odd B 'BOOL' is TRUE if the value of 'B' is odd, otherwise it is FALSE
Bit manipulations
Wraparound means that the bits scrolling out from one side of a byte (8 bits) or word (16 bits) are copied at the other side of
the byte or word.
bit (A,BitNb) = BOOL The status of digital 'BOOL' will be copied in the analog 'A' at the position
indicated by 'BitNb', starting with ' 0 ' for Lsb.
Example: Bit: 1
BitNb: 3
A: 0011010011001001
BOOL = bit( A,BitNb) The status of the bit of the analog 'A' indicated by 'BitNb' will be copied in
the digital 'BOOL', starting with ' 0 ' for Lsb.
Example: A: 1100101000010010
BitNb: 5
Bit: 0
A = shl(B,shift) 'A' has the number of Bits indicated by 'shift' shift to the left (max. 15) of
the Word 'B'
(without wraparound).
Example: B: 0000000011111111
Shift: 4
A: 0000111111110000
A = shr(B,shift) 'A' has the number of Bits indicated by 'shift' shift to the right (max. 15) of
the Word 'B'
(without wraparound).
Example: B: 0000000011111111
Shift: 4
A: 0000000000001111
A = rol byte(B,shift) 'A' has the number of Bits indicated by 'shift' shift to the left (max. 7) of
the Byte 'B'
(with wraparound).
A = ror byte(B,shift) 'A' has the number of Bits indicated by 'shift' shift to the right (max. 7) of
the Byte 'B'
(with wraparound).
A = rol word(B,shift) 'A' has the number of Bits indicated by 'shift' shift to the left (max. 15) of
the Word 'B'
(with wraparound).
Example: B: 0000000011111111
Shift: 4
A: 0000111111110000
A = ror word(B,shift) 'A' has the number of Bits indicated by 'shift' shift to the right (max. 15) of
the Word 'B'
(with wraparound).
Example: B: 0000000011111111
Shift: 4
A: 1111000000001111
Boolean operations
BOOL = not(BOOL) the inverse of the digital Tag of the right is assigned to the digital Tag of
the left
BOOL = BOOL AND BOOL the result of the logical AND between the two digital Tags of the right is
assigned to the digital Tag of the left
BOOL = BOOL OR BOOL the result of the logical OR between the two digital Tags of the right is
assigned to the digital Tag of the left
BOOL = BOOL XOR BOOL the result of the logical XOR between the two digital Tags of the right is
assigned to the digital Tag of the left
A = bcd(B) transforms the Word 'B' to a BCD format and transfers the result to the Word
'A'. 'B' must be of maximum 39321 (corresponding to 9999) to prevent an
overflow condition.
BCD format means that each 4 bits is considered as an entity corresponding to
1 number.
Example:
binary: 0001 0010 0011 0100
BCD 1234
decimal: 4660
A = 16 x (BOOL) places the 16 digital variables of successive addresses, starting with the
digital Tag 'BOOL' in the Word' A'.
Example:
to copy 16 digital inputs of an extension card in a word.
WARNING: when using this function, check that there are 16 successive
ModBus addresses, starting from the Tag ‘BOOL’
16 x (BOOL) = A places the 16 bits of the Word 'A' in the 16 digital variables of successive
addresses, starting with the digital Tag 'BOOL'.
Example:
to SET or RESET 16 DO of an extension card using an analog variable.
When using the two above functions, check that there are 16 Tags with successive
ModBus addresses, starting from the Tag ‘BOOL’
A = FloatToInt (Flt * 10 E Const) conversion from the Float 'Flt' to the Integer 'A' , with a
possible scaling from 10E-4 to 10E+4. The exponent must
be a constant:'Const'.
Flt = IntToFloat (A) * 10 E Const conversion from the Integer 'A' to the Float 'Flt', with a
possible scaling from 10E-4 to 10E+4. The exponent must
be a constant:'Const'.
BOOL = indirect (Ptr) the Tag or Constant 'Ptr' contains the ModBus address of the digital variable
that will have its status assigned to the digital Tag 'BOOL'.
Example:
to read the status of an output 'Q0' having ‘32’ as ModBus address:
DIV0 = indirect (Pointer). (Pointer = 32)
Indirect (Ptr) = BOOL the status of the digital Tag 'BOOL' will be copied in the digital variable whose
ModBus address is defined in the Tag or Constant 'Ptr'.
Example:
to write the status of DIV0 to the output 'Q2' having ‘34’ as ModBus address:
Indirect (Pointer) = DIV0. (Pointer = 34)
A = indirect (Ptr) the Tag or Constant 'Ptr' contains the ModBus address of the analog variable
that will have its value assigned to the analog Tag 'A'
Example:
to read the value of the input 'ana0' having 64 as ModBus address:
AIV0 = indirect (Pointer). (Pointer = 64)
indirect (Ptr) = A the value of the analog Tag 'A' will be copied in the analog variable whose
ModBus address is defined in the Tag or Constant 'Ptr'.
Example:
to write the value of ‘ana0’ to the analog output having as ModBus address
288:
Indirect (Pointer) = ana0. (Pointer = 288)
Miscellaneous
Adr = Tag (Tag) Gives you the ModBus address of the ‘Tag’.
Number between 1 and 65535 (see note below)
put Bit in dig chrono Writing of the digital Tag 'Bit' in the Digital Chronology.
put A in ana chrono Writing of the analog Tag 'A' in the Analog Chronology.
Working with Function or Function Block, if you need the ModBus address of an input argument, you will have first to
extract it using Math. Function Adr = Tag(Tag) (see above).
Working with the former TBox (CPU-3), the ModBus address of the argument is passed to the Function or Function block.
Working with TBOX MS, TBOX LITE, TBOX LT2 and TBOX NANO, the value of the Tag is passed to the Function or
Function block (in fact, the argument is copied into an intermediate variable. Then the link with the real Tag is lost).
IEC1131-3 Ladder programming is organized not only with contacts and relays, but also with different POUs and functions.
Three types of POU are available, all of which use the same Ladder programming tools and BASIC instructions:
List of POU
POU program: sub-program that is called in the ‘Main’ program or any other POU program.
POU function: standard functions (comparison, math. Functions, timers,...) or user defined functions.
POU function block: user defined small 'applet' that performs a function (start of a pump, regulating
temperature...)
Recursion is authorized but not for Function Block (A function block cannot call itself):
1. We do not advise you use recursion, because of cycle time issue.
2. It is under your own responsibility
POU – Program
Introduction
POU programs allow you to structure your Ladder program into several sub-programs.
In practice, you have a main Ladder program, which calls sub-programs. These sub-programs contained within a Ladder
diagram precisely define an action such as; start pump, intrusion control, alarms management...etc, and can be called from
anywhere in the ‘Main’ program or any other POU program.
They give you a clearer view of the whole automation program, they can be tested individually and allow you to make
things easier for changing.
A POU program can call another POU Program that can call another POU Program etc...
If you use POU Programs that call other POU Programs, be careful to avoid loops: like Program 1 calling Program 2 calling
Program 3 that calls Program 1.
The program ‘Main’ supports LADDER or BASIC language. It can be changed at the condition the program is empty. Right
click ‘main’, select ‘Properties’ and choose a language.
Double click 'Add a POU', type a Name (No accent, space or keywords (see BASIC)) and check 'Program'.
Click OK.
You have created a POU Program and it appears in the 'Programs' folder.
When you double click the name of the Program in the list, the window for Ladder programming appears with a new Tab for
the current Program.
Now you can create a Ladder Diagram for the Program you have defined.
To call a POU Program, click the icon in the LD Toolbar. In the folder, 'This File' select the POU Program you wish to
insert. All POU Programs have the following parameters:
- EN: Enable Input: Connection to the Ladder line. EN must be TRUE to run the Program. If it is
connected directly to the left rail, it will be executed at each cycle of the Ladder, otherwise it
can be connected to an input condition.
- ENO: Enable Output: it is the image of EN. If EN is TRUE, ENO is TRUE. It is usually connected to
the right rail but can be also connected to a contact or a relay, a Mathematical block or a
Function.
Calling a POU Program is like calling a sub-routine. The program associated to it is executed at the position where it is
called.
POU – Function
Introduction
A POU Function is a user-defined piece of Ladder that executes a calculation ending in one result. It is useful when a
calculation you regularly need to execute does not exist in the list of Standard Functions. You use it in POU Programs every
time you need to execute the calculation. It has one or many inputs and only one output. When a Function is used many
times in a POU Program, the same code is always executed.
Example:
You will not find this formula in the Standard Functions or in the Mathematical Function block. You will then create your
own Function that will execute your calculation every time you call it.
Restriction
• Do not use global Tags in a Function.
• Do not use global Timers and Counters in a Function.
• Do not use output relay SET and RESET. Because the same internal code is used for each call of the function
and then the SET or RESET status will be applied at each call of the function.
Example
An example of user defined Function is available in the TWinSoft document ‘Ladder.tbox’, in the 'Samples' directory of
TWinSoft. The Function executes the scaling of an 8-bit analog input.
Double click 'Add a POU', type a Name (No accent, space or keywords (see BASIC)) and check 'Function'.
Select the type of the output (result of the calculation): BOOL, WORD, LONG or FLOAT.
Click OK.
You have created a POU Function and it appears in the 'Programs' folder.
When you double click the name of the Function in the list, the window for Ladder programming appears with a new Tab for
the current Function.
1. By default, the name of the Output is the name of the Function. You can rename the
output by using the context menu on its name (mouse right clicking on the name).
2. POU Functions can be exported in a Library to be used in other TWinSoft documents,
using the Library manager menu
Now you can create Ladder Diagram for the Function you have defined.
Example of a Function
The following Function is an analog Function (it means the output is analog). It performs the percentage of an input value.
• The Tags :
When creating a Function, TWinSoft automatically creates the 'Output' Tag. It is the unique Output allowed.
Inputs and the Output of a Function are the arguments to be replaced when calling the Function.
The way a POU Function works, involves that one can define only local Tags in a POU Function.
Percent: the output of the Function. It is unique and is the result of the calculation.
Delta, scale: local analog Tags used as temporary variables necessary to calculate the percentage.
• The Ladder :
A math block using 3 functions is used.
Global Timer and Counters are allowed in Function, but it is very uncommon and against
logic.
To call a Function, click the icon in the LD Toolbar. The folder, 'This File' contains Functions and Function Blocks
created in the current document. If the Function owns to a Library, the latter appears as a Folder. Select the Function you
wish to insert. All Functions have the following parameters:
- EN: Enable Input: Connection to the Ladder line. EN must be TRUE to perform the Function. If it is
connected directly to the left rail, it will execute at each cycle of the Ladder, otherwise it can be
connected to an input condition.
Enable Output:
- ENO:
if the Function is Analog: it is the image of EN. If EN is TRUE, ENO is TRUE. It is usually
connected to the right rail but can be also connected to a contact or a relay, a Mathematical block
or another Function.
if the Function is Digital: ENO and the Output of the Function are linked inside the Function. It
is TRUE if the result of the calculation AND EN are TRUE. It must then be connected to contact
or a relay, a Mathematical block or another Function.
When calling the Function in a POU Program, you must assign a Tag to the (unique) Output, and a Tag or constant to each
input.
All inputs are at the left side of the Function; the output at the right side.
In this example, we wish to have the percentage of input ‘ANA_0’ in the range between 0 and 500.
Introduction
POU function Blocks are user defined small 'applets' that performs a function (start of a pump, regulating temperature...).
If this function is repetitive in your program and you don't wish to define it every time you need it, then you create it once as
a POU Function Block, with Input and Output arguments.
You call it in POU Programs every time you need to execute the function and you assign Tags of your program to the
arguments of the Function Block.
We advise you against using POU Functions in a POU Function Block. In fact, a POU Function exists only once and always
has the same variables that are used when inserting the POU Function.
A POU Function Block uses new resources (Tags, Timers, …) every time it is called in a POU Program.
When starting TWinSoft the first time, the only one is the POU Program 'main'.
Double click 'Add a POU', type a Name (No accent, space or keywords (see BASIC)) and check 'Function Block'.
Click OK.
You have created a POU Function Block and it appears in the 'Programs' folder.
When you double click the name of the Function Block in the list, the window for Ladder programming appears with a new
Tab for the current Function Block.
Now you create Ladder Diagram for the Function Block you have defined.
• The Tags:
Inputs and Outputs of a Function Block are the arguments to be replaced when calling the Function Block.
INPUT is a digital input that will activate the OUTPUT after the DELAY.
is a digital output. It will be connected to a motor, for instance when calling the Function
OUTPUT
Block.
is an analog input containing the number of seconds of the delay. It must be associated
DELAY
to the timer used in the Function Block.
Timer is a local timer.
Timer_preset is a local analog Tag of the type 'Timer - Preset'.
Timer_status is a local digital Tag of the type 'Timer - Status'.
• The Ladder :
• The DELAY is copied in the preset of the timer and multiplied by 1000 (the timer preset is expressed in
milliseconds).
• When INPUT changes to 1, it starts the timer Single Shot
• Note: when working with an external Preset (the local variable 'Timer_preset'), the Preset of the timer can be
set to any value; it is not used. Here = 0
• When the timer has finished counting AND INPUT is still active, the output is set.
• A negative edge on INPUT resets the OUTPUT.
To call a Function Block, click the icon on the LD Toolbar. The folder, ‘This File’ contains Function Blocks and Functions
created in the current document. If the Function Block owns to a Library, the latter appears as a Folder. Select the Function
Block you wish to insert. All Function Blocks have the following parameters:
- EN: Enable Input: Connection to the Ladder line. EN must be TRUE to perform the Function Block. If it
is connected directly to the left rail, it will execute at each cycle of the Ladder, otherwise it can be
connected to an input condition.
- ENO: Enable Output: it is the image of EN. If EN is TRUE, ENO is TRUE. It is usually connected to the right
rail but can be also connected to a contact or a relay, a Mathematical block or another Function.
When Calling the Function Block in a POU Program, you are asked to enter an 'FB Instance name' (in this example ‘Motor1’).
This name allows TWinSoft to distinguish between Function Blocks, when multiple calls of similar Function Blocks are
defined.
Afterwards you must assign to the Output(s) and Input(s) Tags or constant. All inputs are at the left side of the Function
Block, all outputs at the right side.
In this example, the FB is called ‘Motor1’, the input ‘D0’ activate the output ‘Q2’ with a delay of 5 seconds.
Each call of Function Block is unique and different from each other; local Tags of the Function Block as well as timer and
counter, will be assigned to free registers, timers and counters when compiling.
In order to debug a function block, to check values and status of the local Tags, it is not sufficient to enter the code of the FB,
because TWinSoft needs to know which instance is concerned.
IMPORTANT:
1. The document must have been sent to TBox with the last changes
2. If TWinSoft is opened after the document has been sent, the document must be compiled, to allow TWinSoft
assigning registers to the local Tags.
3. The complete path from the Program 'main' must be followed to access the FB. Example: 'Main' -> 'Motors' -> FB
'Motor1'.
To debug the FB, while in 'Visualization mode', double click the call of the FB from the POU program in which it is used:
The source code (Ladder) of the FB is then opened and dynamized according to its instance.
In the list of POU Tags, the column 'Value' displays values of each local Tag.
Timers
Presentation
Timers are used for counting a time, a delay.
The difference is that when a timer has been launched, it runs on its own until a defined preset of time when a counter
increments every time it receives a pulse.
The way of using timer in Ladder is discussed in section 3.5 and in BASIC section3.6.
Introduction
Four models of timers are available:
Each model is presented with a diagram in sections 3.8, 3.9, 3.10 and 3.11.
For each timer (regardless of type), there are two analog variables and one digital variable associated with it:
These three variables can be assigned as Tags and used in the BASIC or Ladder diagram (example: an automatic
modification of a process at timed intervals).
To see an example of using Timers, load the document 'MSTimer.tws' that you find in the sub-directory of TWinSoft
'Samples'.
Creating a Timer
You create the Timers in the List of Timers, from the ‘Resources’
A Timer can also be created while editing a Ladder diagram, but for BASIC the Timer must be created before it can be
declared in a program.
Those variables are standard internal variables, with a free name. Once created in the list of Tags they can be associated to
a timer.
Probably status will need to be created, as it will be required to control the timer: timer still running or period elapsed.
Preset and Value are optional and only required if they need to be monitored from the process or from external software.
When Tags are available, the current values appear in the list of Timers:
To keep Preset value when it has been changed, it has to be backed up and restored at start-up of TBox, like this:
If Triggerpos(PrgRun!) Then
If ((Preset_old <5000) Or (Preset_old >50000)) Then
Preset_old=10000 ‘for security if preset out of range
Endif
Preset=Preset_old
Endif
Once you have selected the type of timer, it appears in the Ladder line.
- If it has been previously created in the ‘list of timers’ (see below): you select it.
- If it does not exist: you type a name and TWinSoft prompts you to create it.
Example: Fan1
The Preset
A constant to indicate the time in seconds. This constant is in floating point with the decimal representing time smaller
than 1 second.
Examples:
Dynamic Preset
If you want to work with a dynamic preset, you will use a Tag (format DWord 32 bits) associated to the Preset (see section
3.4).
You still have to indicate a constant here, it will not be used but is mandatory when calling the function.
ENO Enable Output : it is the image of EN. If EN is TRUE, ENO is TRUE. It can be connected to a contact
or a relay, a Mathematical block or another Function.
If you want to clear a timer, you select the Function 'ResetTimer' associated to its name.
Reminder
Four models of timer can be used in BASIC programs:
• Single Shot: fixed time and restartable
• MonoStable: fixed time not restartable
• Integral: measuring of a period with accumulation
• On Delay: measuring of a period without accumulation
Syntax
Single Shot: TimerSS (Name, Start, Preset)
• Arguments
Name : It is the name of the timer you have created (see section 3.3. above)
Preset: INPUT. Constant giving the preset of the timer in sec. using a Floating register.
To access other variables of a Timer (Status and Value), or to work with dynamic Preset, you have to create Tags and
associate them to the timer while creating it (see sections 3.3 and 3.4 above)
Example:
For i=4
TimerSS(name, start[i],Preset[i])
• Syntax
TimerReset (Name)
• Argument
Name : It is the name of the timer you have created (see section 3.3 above)
Examples
• How to manage time sequences using a Timer.
You create a Monostable Timer from the list of Timers. You name it for instance MyTimer.
When you want to execute an operation alternatively on 2 devices, you can easily create the alternation with 2 Timers:
one starting the other.
It is possible to adapt the frequency of the Flip-Flop by changing dynamically the value of Tags ‘Preset1’ and ‘Preset2’.
You create 2 Single Shot Timers, each of them with a ‘Status’ Tag and a ‘Preset’ Tag.
You name the timers, for instance MyTimer1 and MyTimer2
TimerSS (MyTimer1,not(Status2),2.5)
TimerSS (MyTimer2,not(Status1),2.5)
Coming in following sections, the presentation of each model of Timer with its
implementation in Ladder and a timing diagram.
A rising edge on the Tag INPUT starts the timer for the PRESET time period (5sec.). The Tag STATE (which corresponds to
the digital state of the timer) changes to 1 as soon as a rising edge of the Tag INPUT appears and changes to 0 when the
PRESET time expires, or upon activation of a 'Reset Timer' Function associated with the timer.
If a new rising edge of the Tag INPUT appears before the end of the Preset time the cycle is re-started
Timer – Monostable
A rising edge on Tag INPUT starts the timer for the PRESET time period (5sec.). The Tag STATE (which corresponds to the
digital state of the timer) changes to 1 as soon as a rising edge of the Tag INPUT appears and changes to 0 when the
PRESET time expires, or upon activation of the Timer Reset function associated with the timer.
If a new rising edge appears before the end of the PRESET time, it has no effect on the cycle
Timer – Integral
The Tag INPUT must remain at 1 for the duration of the time defined in PRESET, so that the Tag STATE (which reflects the
digital state of the timer) can change to 1. It remains active until the first rising edge of the Tag RESET (re-initialization the
timer).
If Tag INPUT falls to 0 before the end of the PRESET time, the value of the timer is retained (except if the rising edge of
the Tag RESET appears and resets the timer).
The re-activation of the Tag INPUT allows the timer continuing and completes the cycle.
To reinitialize the timer you need to use the ‘Reset Timer’ Function and reset Input=0
Timer – On Delay
If the Tag INPUT remains at 1 for the duration of time defined in PRESET, the Tag STATE (which reflects the digital state of
the timer) changes to 1. This Tag returns to 0 as soon as INPUT changes to 0.
If INPUT is deactivated before the end of the time cycle, the value of the timer is reset to 0.
There is no accumulation.
The Tags of the timer are updated when the timer is scanned. It means that the precision
depends on the cycle time of the process.
Counters
Presentation
Counters are used for counting pulses
The mechanism of both functions is similar, the way they are used and the variable associated too.
The difference is that when a timer has been launched, it runs on its own until a preset when a counter increments every
time it receives a pulse.
The way of using counter in Ladder is discussed section 4.4 and in BASIC section 4.5.
Introduction
Three types of counters are available:
For each counter (regardless of type), there are two analog variables and one digital variable associated with it:
These three variables can be assigned as Tags and used in the BASIC or Ladder diagram (example: an automatic process at
intermediate values).
Creating a Counter
You create a Counter from the ‘list of Counters’.
A Counter can also be created while editing a Ladder diagram, but for BASIC the Counter must be created before it can be
declared in a program.
Those variables are standard internal variables, with a free name. Once created in the list of Tags they can be associated to
a counter.
Probably Status will need to be created, as it will be required to control the counter: maximum number of pulses reached
or not.
Preset and Value are optional and only required if they need to be monitored from the process or from external software.
1. Be sure you create different variables for each counter. TWinSoft will prompt you
when you use a variable already used by another counter.
2. It is not needed to create a variable if you don’t need it.
3. Do not give the same name for ‘Counter’ and ‘Timer’ (see section 3)
When Tags are available, the current values appear in the list of Counters:
The Function
‘ResetCount’ is used to
reinitialize a counter,
depending on the
model (see next) or to
clear it before it has
reached the preset.
Once you have selected the type of counter, it appears in the Ladder line.
Example: Pump1_Hours
The Preset
A constant to indicate the quantity of pulses to reach the end of counting. This constant is expressed in Dword format
(max. 4,294,967,296)
ENO Enable Output : it is the image of EN. If EN is TRUE, ENO is TRUE. It can be connected to a contact
or a relay, a Mathematical block or another Function.
If you want to clear a counter, you select the Function 'ResetCount' associated to its name.
Reminder
Three types of counters are available:
• Counter UP: Counts up
• Counter DOWN: Counts down.
• RING counter: Circular counter (it restarts itself when the Preset is reached.
Syntax
CountUP (Name, Start, Preset)
CountDown (Name, Start, Preset)
CountRing (Name, Start, Preset)
• Arguments
Name : It is the name of the counter you have created (see section 4.2.1)
Start : INPUT Bool. The Tag or expression that increments the counter.
• Syntax
CountReset (Name)
• Arguments
Name : It is the name of the counter you have created (see section 4.2.1 above)
Program: you use Global Counters (the ones you declare in the folder ‘Counters’)
Function: you cannot use Counter
Function Block: you use Local Counters (you declare them in the list of local Tags of the POU)
Coming in following section the presentation of each model of Counter with its
implementation in Ladder and a timing diagram.
Counter - UP
Suppose that the Preset of the counter is 5. At each rising edge of the Tag PULSE, the value of the counter is incremented
with 1, and when it reaches the value of the Preset, the Tag STATE (which represents the digital state of the counter)
changes to 1.
The count continues until the Tag RESET is triggered, which resets the value of the counter.
At any given time, you can reset the counter with the help of the function CounterReset, activated in this example by the
Tag RESET.
You can pre-position the current value of the counter (using the Ladder diagram and the
variable associated to the value) if you do not want the counting to start at zero, but at
another value.
Counter - DOWN
Suppose that the Preset of the counter is 3 and the variable associated to the value of the counter is initialized to 5 (Tag
COUNT). The latter has priority on the preset defined in the Counter function.
This operation can be done manually or by the Ladder diagram. In this example, it is the Tag INIT that initiates this
operation.
At each rising edge of the Tag PULSE, the value of the counter is decremented.
The Tag STATE (which represents the digital state) remains at 1 as long as the current value is greater than the pre-
selection.
When the current value becomes less than the pre-selection, the Tag STATE changes to 0 and the counting continues to 0.
Counter - RING
At each rising edge of the Tag PULSE, the value of the counter is incremented, and when this value reaches the Preset
value, the Tag STATE (which represents the digital state) changes to 1.
During the next rising edge of the Tag PULSE, the value is set to 0.
At any given time, you can reset the counter with the help of the function ResetCount, activated in the example by the Tag
RESET.
If the Tag RESET is associated to a ‘normal contact’, the counter is blocked until the contact opens again and releases the
counter (see notes below).
1. When working with counters, use positive or negative edges (pulse contact, push
button).
2. Do not drive more than once the same counter. If different input conditions are
necessary to increase (decrease) a counter, use those on the same Ladder line, and if
this is impossible, use a temporary digital variable to summarize all your conditions,
then declare this variable, to drive the counter.
Library Manager
TWinSoft offers the possibility to save POU Functions and POU Function Blocks in external files called ‘Libraries’ in order to
use those POU in other TWinSoft documents.
Function and Function Blocks from both BASIC and Ladder are concerned
A library is a file with the extension .LIB, saved by default in the directory of TWinSoft.
Export is necessary if you wish to edit a POU in the current document that has been saved in a Library.
You open a library (‘File’ → ‘Open’); the POUs appear in the top window.
You select the POU and export it (‘Edit’ → ‘Export’); you repeat this operation for each POU.
The POUs are then available in the list of 'Programs', in the Project Workspace.
The ‘Available Libraries’ are the ones present in the directory of the current TWinSoft document or in the directory of
TWinSoft.
When a library appears in the list, all its POU Functions, and POU Function Blocks are available to be used in Ladder
programming: in the list of Functions, the Libraries appear as Folders, each containing their own POUs.
To add a Library to the current TWinSoft document, select it from the list of ‘Available Libraries’ and click ‘Add: →’.
When you have selected the library(ies) you need, click ‘Close’.
To remove a Library from the current TWinSoft document, select the Library and click 'Remove'. This operation is available
only if you don’t use POU of the concerned library in the current document.
Index
SetBit ............................................................................... 37
shift .................................................................................. 36
A Split32 .............................................................................. 40
Address of (function) ............................................................. 51 SplitBits ............................................................................ 39
Adr=Tag(Tag) function .......................................................... 86 square root ....................................................................... 31
Text Functions .................................................................. 49
trigger .............................................................................. 41
B trigonometry .................................................................... 29
Truncate ........................................................................... 43
BASIC ...................................................................................... 9 types of variable................................................................ 14
- (subtraction) ................................................................... 20 while...wend ..................................................................... 28
* (multiplication) .............................................................. 21 XOR .................................................................................. 24
/ (division) ......................................................................... 21
+ (addition) ....................................................................... 20
abs ................................................................................... 33 C
AND ................................................................................. 23
assignment ....................................................................... 13 Case....................................................................................... 10
BCD .................................................................................. 43 Colors
bit manipulation ................................................................37 BASIC ............................................................................... 10
byte manipulation ............................................................ 34 Ladder .............................................................................. 69
case .................................................................................. 10 Constant
colors ............................................................................... 10 BASIC .......................................................................... 10, 12
comment .......................................................................... 12 in timer (BASIC) .............................................................. 106
comparison....................................................................... 15 in timer (Ladder) ............................................................. 105
constant ........................................................................... 12 Counters ...............................................................................113
dec ................................................................................... 33 Down .............................................................................. 121
Dim .................................................................................. 14 in BASIC.......................................................................... 118
exponential....................................................................... 30 in Ladder ........................................................................ 116
Float functions .................................................................. 47 in POU ............................................................................ 118
for...next...step ................................................................. 26 Ring ................................................................................ 123
for...nextcycle ................................................................... 26 Up .................................................................................. 119
functions .......................................................................... 32 variables ......................................................................... 115
general ............................................................................. 10 Cycle
GetRtuDate ...................................................................... 46 sequence of tasks ................................................................ 9
GetRtuTime ...................................................................... 46 Cycle time ................................................................... 11, 12, 65
Goto ................................................................................. 51
if...then...else…elseif ........................................................ 16 G
inc .................................................................................... 33
indirect addressing ........................................................... 50 Goto ...................................................................................... 51
keywords ..................................................................... 10, 52
label ................................................................................. 51
line feed............................................................................ 10
I
logarithms ........................................................................ 30 Indirect Addressing ................................................................ 50
ModBus address function.................................................. 51 in BASIC............................................................................ 50
modulo ............................................................................. 22 Ladder .............................................................................. 84
NOT ................................................................................. 25
Odd .................................................................................. 43
OR .................................................................................... 24 K
Pack32 .............................................................................. 40
PackBit ............................................................................. 38 Keywords ..........................................................................10, 52
Peek ................................................................................. 50
Poke ................................................................................. 50 L
POU ................................................................................. 53
power ............................................................................... 31 Ladder ................................................................................... 63
precautions....................................................................... 12 arithmetic (math.block) .................................................... 82
putchrono ......................................................................... 42 arithmetic functions .......................................................... 79
Random............................................................................ 48 assignement functions ...................................................... 78
sampling tables ................................................................ 44 assignments (math.block) ................................................. 82
P W
Peek ...................................................................................... 50 Watchdog .............................................................................. 11
Poke ...................................................................................... 50