Notes on the documentation

This description is only intended for the use of trained specialists in control and automation engineering who are familiar with the applicable national standards.
It is essential that the following notes and explanations are followed when installing and commissioning these components.

The responsible staff must ensure that the application or use of the products described satisfy all the requirements for safety, including all the relevant laws, regulations, guidelines and standards.

Disclaimer

The documentation has been prepared with care. The products described are, however, constantly under development.
For that reason the documentation is not in every case checked for consistency with performance data, standards or other characteristics.
In the event that it contains technical or editorial errors, we retain the right to make alterations at any time and without warning.
No claims for the modification of products that have already been supplied may be made on the basis of the data, diagrams and descriptions in this documentation.

Trademarks

Beckhoff®, TwinCAT®, EtherCAT®, Safety over EtherCAT®, TwinSAFE® and XFC® are registered trademarks of and licensed by Beckhoff Automation GmbH.
Other designations used in this publication may be trademarks whose use by third parties for their own purposes could violate the rights of the owners.

Patent Pending

The TwinCAT Technology is covered, including but not limited to the following patent applications and patents:
EP0851348, US6167425 with corresponding applications or registrations in various other countries.

Copyright

© Beckhoff Automation GmbH.
The reproduction, distribution and utilization of this document as well as the communication of its contents to others without express authorization are prohibited.
Offenders will be held liable for the payment of damages. All rights reserved in the event of the grant of a patent, utility model or design.


Overview

TwinCAT PLC Control: Standard Library

概述

标准程序库包括所有的IEC61131-3 POUs。这些POUs可分类如下：

  • 双稳态功能块
  • 触发功能块
  • 计数器
  • 计时器
  • 字符串功能
  • 例程


F_TRIG

TwinCAT PLC Library: Standard

FUNCTION_BLOCK F_TRIG

下降沿探测器

VAR_INPUT

VAR_INPUT
    CLK	: BOOL;	(* Signal to detect要探测的信号 *)
END_VAR

VAR_OUTPUT

VAR_OUTPUT
    Q	: BOOL;	(* Edge detected探测到的边沿 *)
END_VAR
VAR
    M	: BOOL;
END_VAR

只要输入变量CLK为TRUE，输出变量Q和辅助变量M将保持FALSE。变量CLK一为FALSE，Q将 为TRUE，接着M将被设定为TRUE。这意味着，每次调用该功能时，CLK由TRUE变FALSE，Q才将返回TRUE。

Development environment | Target system type | PLC libraries to include
TwinCAT Version >= 2.6.0 | PC or CX (x86) | Standard.Lib
TwinCAT Version >= 2.6.0 | BC (165) | Standard.Lb6
TwinCAT Version >= 2.9.0 | BCxx50 or BX | Standard.lbx
TwinCAT Version >= 2.10.0 Build >= 1301 | CX (ARM) | Standard.lib


R_TRIG

FUNCTION_BLOCK R_TRIG

上升沿探测器

VAR_INPUT

VAR_INPUT
    CLK	: BOOL;	(* Signal to detect要探测的信号 *)
END_VAR

VAR_OUTPUT

VAR_OUTPUT
    Q	: BOOL;	(* Edge detected探测到的边沿 *)
END_VAR
VAR
    M	: BOOL;
END_VAR

只要输入变量CLK是FALSE，输出变量Q和辅助变量M将保持FALSE。变量CLK一为TRUE，Q将返回TRUE，接着M将被设定为TRUE。这意味着，每次调用该功能时，CLK由FALSE到TRUE，Q才将返回TRUE。


RS

FUNCTION_BLOCK RS

复位优先双稳态功能块（当SET，RESET1同时为1时，复位优先）

Q1 = RS (SET, RESET1)

means:Q1 = NOT RESET1 AND (Q1 OR SET)

VAR_INPUT

VAR_INPUT
    SET	: BOOL;
    RESET1	: BOOL;
END_VAR

VAR_OUTPUT

VAR_OUTPUT
    Q1	: BOOL;
END_VAR

该功能块的内部执行如下：

Q1: = NOT RESET1 AND (Q1 OR SET);


SR

FUNCTION_BLOCK SR

置位优先双稳态功能块:（当SET，RESET1同时为1时，置位优先）

Q1 = SR (SET1, RESET)

means:Q1 = (NOT RESET AND Q1) OR SET1.

Q1, SET1 和 RESET是 BOOL类型.

VAR_INPUT

VAR_INPUT
    SET1	: BOOL;
    RESET	: BOOL;
END_VAR

VAR_OUTPUT

VAR_OUTPUT
    Q1	: BOOL;
END_VAR

该功能块的内部执行如下：

Q1 := (NOT RESET AND Q1) OR SET1;


SEMA

FUNCTION_BLOCK SEMA

软信号量（可中断的）

VAR_INPUT

VAR_INPUT
    CLAIM	: BOOL;
    RELEASE	: BOOL;
END_VAR

VAR_OUTPUT

VAR_OUTPUT
    BUSY	: BOOL;
END_VAR

当SEMA被调用时，CLAIM=TRUE时，BUSY为TRUE。RELEASE=TRUE时，BUSY为FALSE。当CLAIM和BUSY同为TRUE，BUSY 为FALSE。本功能块与SR、RS最大的不同是通过内部的X变量来传递值。

该功能块的内部执行如下：

BUSY := X;
IF CLAIM
THEN
X:=TRUE;
ELSIF RELEASE
THEN
BUSY := FALSE;
X:= FALSE;
END_IF


CTD

FUNCTION_BLOCK CTD

减计数器：

VAR_INPUT

VAR_INPUT
    CD	: BOOL;	(* Count Down on rising edge经过上升沿开始倒数 *)
    LOAD	: BOOL;	(* Load Start Value加载初始数值 *)
    PV	: WORD;	(* Start Value初始数值 *)
END_VAR

VAR_OUTPUT

VAR_OUTPUT
    Q	: BOOL;	(* Counter reached 0当计数器数值为0 *)
    CV	: WORD;	(* Current Counter Value当前计数器数值 *)
END_VAR

当LOAD为TRUE时，计数器变量CV将被初始化为计数上限PV的值。如果变量CD从FALSE变为TRUE，它获得一个上升沿，当CV大于0时，CV将被减1。当CV小于等于0时，Q返回TRUE。


CTU

FUNCTION_BLOCK CTU

加计数器：

VAR_INPUT

VAR_INPUT
    CU	: BOOL; (* Count Up加计数 *)
    RESET	: BOOL; (* Reset Counter to 0重置计数器的数值为0 *)
    PV	: WORD; (* Counter Limit计数器限值 *)
END_VAR

VAR_OUTPUT

VAR_OUTPUT
    Q	: BOOL; (* Counter reached the Limit计数器达到限值 *)
    CV	: WORD; (* Current Counter Value当前计数器数值 *)
END_VAR

如果RESET是TRUE计数器变量CV将被初始化为0。若CU从FALSE变为TRUE，且当CV小于PV时(即,不致引起溢出)，CV将加1。当CV大于等于上限PV时，Q将返回 TRUE。


CTUD

FUNCTION_BLOCK CTUD

加/减计数器

VAR_INPUT

VAR_INPUT
    CU	: BOOL;	(* Count Up加计数 *)
    CD	: BOOL;	(* Count Down减计数 *)
    RESET	: BOOL;	(* Reset Counter to Null将计数器重置为0 *)
    LOAD	: BOOL;	(* Load Start Value加载初始值 *)
    PV	: WORD;	(* Start Value / Counter Limit初始值/计数限值 *)
END_VAR

VAR_OUTPUT

VAR_OUTPUT
    QU	: BOOL;	(* Counter reached Limit计数器数值达到限值 *)
    QD	: BOOL;	(* Counter reached Null计数器数值为0 *)
    CV	: WORD;	(* Current Counter Value当前计数器数值 *)
END_VAR

如果RESET为TRUE，计数器变量CV将被初始化为0。如果LOAD为TRUE，CV将被初始化为PV的值。若CU从FALSE变为TRUE，在不致引起溢出的前提下，CV将加1。若CD从FALSE变为TURE，在不知使其数值小于0的前提下，CV将减1。当CV大于等于PV时，QU返回TRUE。当CV小于等于0时，QD返回TRUE。


TOF

FUNCTION_BLOCK TOF

关断延时定时器

VAR_INPUT

VAR_INPUT
    IN	: BOOL;	(* starts timer with falling edge, resets timer with rising edge下降沿开启计时器，上升沿重置计时器 *)
    PT	: TIME;	(* time to pass, before Q is set Q被设定之前经过的时间 *)
END_VAR

VAR_OUTPUT

VAR_OUTPUT
    Q	: BOOL;	(* is FALSE, PT seconds after IN had a falling edge IN经过一个下降沿PT秒后，Q变为FALSE *)
    ET	: TIME;	(* elapsed time 经过的时间 *)
END_VAR

当IN是TRUE时，Q为TRUE，ET为0。当IN一变为FALSE，ET中将以毫秒开始计时，直到ET的值等于PT的值。然后它将保持常数。当IN为FALSE且ET等于PT时，Q为FALSE。否则Q为TRUE。因此，当PT中以毫秒表示的时间走完，Q处于FALSE。

TOF随时间的运行图像如下：

TOF块占用15字节数据


TON

FUNCTION_BLOCK TON

接通延时定时器

VAR_INPUT

VAR_INPUT
    IN	: BOOL;	(* starts timer with rising edge, resets timer with falling edge上升沿开启计时器，下降沿重置计时器 *)
    PT	: TIME;	(* time to pass, before Q is set Q被设定之前经过的时间 *)
END_VAR

VAR_OUTPUT

VAR_OUTPUT
    Q	: BOOL;	(* is TRUE, PT seconds after IN had a rising edge IN经过一个上升沿PT秒后，Q变为TRUE *)
    ET	: TIME;	(* elapsed time 经过的时间 *)
END_VAR

若IN是FALS，则Q为FALSE，ET为0。当IN一变为TRUE，ET中将以毫秒开始计时，直到ET的值等于PT的值。然后它将保持常数。当IN为TRUE且ET等于PT时，Q为TRUE。否则Q为FALSE。因此，当PT中以毫秒表示的时间走完，Q处于TRUE。

TON随时间的运行图像如下：

TON功能块占用15字节数据


TP

FUNCTION_BLOCK TP

脉冲定时器功能块用来产生一个固定时间的脉冲。

VAR_INPUT

VAR_INPUT
    IN	: BOOL; (* Trigger for Start of the Signal信号开始的触发 *)
    PT	: TIME; (* The length of the High-Signal in ms用ms表示的高信号的长度 *)
END_VAR

VAR_OUTPUT

VAR_OUTPUT
    Q	: BOOL; (* The pulse脉冲 *)
    ET	: TIME; (* The current phase of the High-Signal高信号的当前阶段 *)
END_VAR

若IN为FALSE,则Q为FALSE，ET为0。

当输入量IN变为TRUE时，输出量Q也变为TRUE并且在PT确定的脉冲长度内保持TRUE。

当脉冲输出为TRUE时，运行时间ET在增长。

脉冲结束后，ET时间保持不变直到下一个脉冲来临时它才被复位。
输出Q将保持为TRUE直到脉冲时间结束，与输入IN的状态无关。

脉冲输出为TRUE时即使输入变为FALSE也不会影响脉冲输出的时间长度。ET将在Q和IN同时为FALSE时清零。

TP的时序图解如下：

功能TP需要14字节数据。


String functions overview

字符串功能

注意:

请注意，字符串功能不是“线程安全的”：当使用多任务时，字符串功能只可以在单任务中使用。如果不同的任务中使用了同一功能，有数据覆盖的危险。


CONCAT

FUNCTION CONCAT

两个字符串的串联（或组合）。

FUNCTION CONCAT :STRING(255)

VAR_INPUT
    STR1:STRING(255);
    STR2:STRING(255);
END_VAR

用IL的实例：

LD 'SUSI'
CONCAT 'WILLI'
ST Var1 (* Result is 'SUSIWILLI'结果是'SUSIWILLI' *)

用ST的实例

Var1 := CONCAT ('SUSI','WILLI');


DELETE

FUNCTION DELETE

功能DELETE用来将某一确定位置的一个大字符串的一部分删除。输入变量STR是STRING类型，LEN和POS是INT类型，这一功能的返回值是STRING类型。DELETE(STR, LEN, POS) 的意思是：将STR字符串中从第POS个字符开始共LEN个的字符删除。

FUNCTION DELETE :STRING(255)

VAR_INPUT
    STR	:STRING(255);
    LEN	:INT;
    POS	:INT;
END_VAR

用指令表（IL）编程的例子：

LD 'SUXYSI'
DELETE 2,3
ST Var1 (* Result ist 'SUSI'结果是 'SUSI' *)

用结构化文本（ST）编程的例子：

Var1 := DELETE ('SUXYSI',2,3);


FIND

FUNCTION FIND

FIND用来搜索一个字符串中的部分字符串。FIND(STR1, STR2) 意思是：找出字符串STR2的首个字符在字符串STR1中首次出现的位置。若在STR1中找不到STR2，则OUT:=0。

FUNCTION FIND :INT

VAR_INPUT
    STR1	:STRING(255);
    STR2	:STRING(255);
END_VAR

Example in IL:

LD 'SUXYSI'
FIND 'XY'
ST Var1 (* Result is 3结果是3 *)

Example in ST:

Var1 := FIND ('SUXYSI','XY');


INSERT

FUNCTION INSERT

INSERT用来将一个字符串在一个指定的点插入另一个字符串。 INSERT(STR1, STR2, POS)意思是：将字符串STR2在字符串STR1的第POS个字符后插入STR1。

FUNCTION INSERT :STRING(255)

VAR_INPUT
    STR1	:STRING(255);
    STR2	:STRING(255);
    POS	:INT;
END_VAR

用指令表（IL）编程的例子：

LD 'SUSI'
INSERT 'XY',2
ST Var1 (* Result is 'SUXYSI' *)

用结构化文本（ST）编程的例子:

Var1 := INSERT ('SUSI','XY',2);


LEFT

FUNCTION LEFT

对一个给定的字符串，LEFT返回其左边的、靠前的字符串。LEFT (STR, SIZE)意思是：取字符串STR左边前SIZE个字符。

FUNCTION LEFT :STRING(255)

VAR_INPUT
    STR	:STRING(255);
    SIZE	:INT;
END_VAR

用指令表（IL）编程的例子：

LD 'SUSI'
LEFT 3
ST Var1 (* Result is 'SUS'结果是 'SUS' *)

用结构化文本（ST）编程的例子：

Var1 := LEFT ('SUSI',3);


LEN

FUNCTION LEN

LEN返回一个字符串的长度。

FUNCTION LEN : INT

VAR_INPUT
    STR	:STRING(255);
END_VA

用指令表（IL）编程的例子：

LD 'SUSI'
LEN
ST Var1 (* Result is 4 *)

用结构化文本（ST）编程的例子：

Var1 := LEN ('SUSI');


MID

FUNCTION MID

MID返回一个字符串的内部的一部分。MID (STR, LEN, POS)意思是：取字符串STR中从第POS个字符开始的LEN个字符。

FUNCTION MID :STRING(255)

VAR_INPUT
    STR	:STRING(255);
    LEN	:INT;
    POS	:INT;
END_VAR

用指令表（IL）编程的例子：

LD 'SUSI'
MID 2,2
ST Var1 (* Result is 'US' *)（* 结果是 'US' *）

用结构化文本（ST）编程的例子：

Var1 := MID ('SUSI',2,2);


REPLACE

FUNCTION REPLACE

REPLACE用来将一个大字符串的一部分用另一个字符串代替。REPLACE(STR1, STR2, L, P)意思是：将字符串STR1中从第P个字符开始的L个字符替换为字符串STR2。

FUNCTION REPLACE :STRING(255)

VAR_INPUT
    STR1	:STRING(255);
    STR2	:STRING(255);
    L	:INT;
    P	:INT;
END_VAR

用指令表（IL）编程的例子：

LD 'SUXYSI'
REPLACE 'K',2,2
ST Var1 (* Result is 'SKYSI'结果是'SKYSI' *)

用结构化文本（ST）编程的例子：

Var1 := REPLACE ('SUXYSI','K',2,2);


RIGHT

FUNCTION RIGHT

对一个给定的字符串，RIGHT返回其右边的、靠前的字符串。LEFT (STR, SIZE)意思是：取字符串STR右边前SIZE个字符。

FUNCTION RIGHT :STRING(255)

VAR_INPUT
    STR	:STRING(255);
    SIZE	:INT;
END_VAR

用指令表（IL）编程的例子：

LD 'SUSI'
RIGHT 3
ST Var1 (* Result is 'USI'结果是'USI' *)

用结构化文本（ST）编程的例子：

Var1 := RIGHT ('SUSI',3);