Notes on the documentation

BECKHOFF Automation: Foreword

文档编制说明

本说明书仅供那些在控制与自动化工程方面受过培训且熟悉国家标准的专业人士使用。

在安装和调试这些组件时，操作人员须遵循下列说明和解释。

相关负责人员必须确保所述产品的应用或使用满足所有安全要求，包括相关法律、法规、准则和标准。.

免责声明

尽管本文档经过精心编制，但所述的产品正处在不断地更新换代中。

因此，我们并不能保证文档中所描述的产品性能数据、标准或其它特性与实际产品相一致。

倘若，本文档出现一些技术或编辑上的错误，我们时刻保留对文档信息作出修改的权力，且恕不另行通知。

对于所提供产品，如果在本文档中已对数据、图表以及说明进行了修改，我们将不再特别加以声明。

.

商标

Beckhoff®, TwinCAT®, EtherCAT®, Safety over EtherCAT®, TwinSAFE® and XFC®已为Beckhoff 自动化有限公司的注册商标并可由Beckhoff 自动化有限公司进行授权。未经许可，任何以盈利为目的在公共场合中使用本公司的商标，本公司将依法追究

申请中的专利

TwinCAT技术已被注册，包含但不限于如下专利申请和专利

在许多其他国家有关EP0851348, US6167425的相关申请和注册。

Copyright版权

®Beckhoff 自动化有限公司

未经许可，任何人不得复制、分发和使用本手册以及内容传递。
违者将追究损害赔偿，倘若批准一个专利、使用模式或设计，本公司保留所有权利。


Programming Languages

TwinCAT PLC Control 支持所有的 IEC61131-3 编程语言。有两种文本编程语言和四种图形编程语言。

文本编程语言

  • 指令表 (IL)
  • 结构化文本(ST)

图形编程语言

  • 功能块图(FBD)
  • 梯形图(LD)
  • 连续功能图(CFC)
  • 顺序功能图(SFC)


Structured Text (ST)

TwinCAT PLC Control: Languages

结构化文本（ST）

结构化文本由一系列指令组成。可以执行如同高级语言所确定的 ("IF..THEN..ELSE") 或循环 (WHILE..DO) 语句。

例：

IF value < 7 THEN
WHILE value < 8 DO
value := value + 1;
END_WHILE;
END_IF;

表达式

表达式是一种结构，它返回计算后的值。表达式由操作符和操作数组成。操作数可以是常数、变量、功能调用，或其它表达式。

表达式的求值

按照优先级规则，通过对操作符的处理可执行表达式的求值。首先处理最高优先级的操作符，然后处理次优先级的操作符，依次类推，直至处理完所有的操作符为止。有相同优先级的操作符是从左到右处理的。

以下按操作符的优先级大小列出 ST 操作符表：

操作 | 符号 | 优先级
置于括号内 | （表达式） | 最高优先级
功能调用 | 功能名（参数表） |
冪运算 | EXPT |
负值 建立补偿 | - NOT |
乘 除 取模 | * / MOD |
加 减 | + - |
比较 | <,>,<=,>= |
等于 不等于 | = <> |
布尔“与” | AND |
布尔“异或” | XOR |
布尔“或” | OR | Weakest binding

以下是使用 ST 语言的指令，表中同时给出示例：

指令 | 示例
赋值 | A:=B; CV := CV + 1; C:=SIN(X);
调用功能块并使用 FB 形式 | CMD_TMR(IN := %IX5, PT := 300);A:=CMD_TMR.Q;
RETURN | RETURN;
IF IF D<0.0

THEN C:=A;
ELSIF D=0.0
THEN C:=B;
ELSE C:=D;
END_IF;
CASE CASE INT1 OF

1: BOOL1 := TRUE;
2: BOOL2 := TRUE;
ELSE
BOOL1 := FALSE;
BOOL2 := FALSE;
END_CASE;
FOR FOR I:=1 TO 100 BY 2 DO

IF ARR[I] = 70
THEN J:=I;
EXIT;
END_IF;
END_FOR;
WHILE WHILE J<= 100 AND ARR[J] <> 70 DO

J:=J+2;
END_WHILE;
REPEAT REPEAT J:=J+2;

UNTIL J= 101 OR ARR[J] = 70
END_REPEAT;
EXIT | EXIT;
空指令 ;

结构化文本中的指令

前面提到，结构化文本（ST）用于结构化的编程，亦即 ST 为诸如编程循环等这些常用的结构提供预先规定的结构。这样做的好处是可以降低出现差错的可能性，并提高程序的可读性。
例如，让我们比较使用 IL 和使用 ST 编写的二个相同功能的程序：
使用 IL 语言编写的计算变量多次乘2的一个循环：

Loop :
LD Counter
EQ 0
JMPC end
LD Var1
MUL 2
ST Var1
LD Counter
SUB 1
ST Counter
JMP Loop
End:
LD Var1
ST ERG

使用 ST 语言编写同样的循环程序为：

WHILE Counter<>0 DO
Var1:=Var1*2;
Counter:=Counter-1;
END_WHILE

Erg:=Var1;

可以看出，使用 ST 编写的循环程序不仅编程速度快，而且更容易阅读，尤其是在大型结构中的嵌套循环时更是如此。
使用 ST 语言编写的不同结构有以下意义：

赋值操作符

在一个赋值语句的左侧有一个操作数（变量、地址），对它赋值右侧表达式的值，赋值操作符为 :=
示例： Var1 := Var2 * 10;
执行该行后，Var1 值为 10 倍的 Var2 值。

使用 ST 语言编写的功能块调用

使用 ST 语言编写的功能块调用，采用的是调用功能块的实例名，以及将括号内的参数赋值。在以下例子中，通过对参数 IN 和 PT 赋值，调用一个定时程序。然后将结果变量 Q 赋值给变量A。
如同使用 IL 那样，结果变量使用功能块名，后跟一个“点（.）”以及变量名：

CMD_TMR(IN := %IX5, PT := T#300ms);
A:=CMD_TMR.Q


FOR loop

TwinCAT PLC Control: Languages

FOR循环

使用 FOR 循环可编程重复的过程。
语法：

INT_Var :INT;

FOR <INT_Var> := <INIT_VALUE> TO <END_VALUE> {BY <stepsize>} DO
<instructions>
END_FOR;

括号 {} 中的部分是任选项。

只要计数器 <INT_Var> 不大于 <END_VALUE> 就一直执行 <Instructions>。这在执行 <Instructions> 之前进行检查，以便在 <INIT_VALUE> 大于 <END_VALUE>时不执行<Instructions>。当执行 <Instructions> 时，<INT_Var> 总是增加 <Step size（步长）>。步长可以是任何整数值。若没有给定这个值，则它设置为 1。由于 <INT_Var> 只会逐步变大，因而循环也必须结束。

示例：

FOR counter:=1 TO 5 BY 1 DO
Var1:=Var1*2;
END_FOR;
Erg:=Var1;

假设 Var1 的黙认值设定为 1，则经过 FOR 循环后，它的值为 32。


IF instruction

TwinCAT PLC Control: Languages

IF 指令

使用 IF 指令可检查一个条件，以及按照这个条件执行指令。
语法：

IF <Boolean_printout1> THEN
<IF_instructions>
{ELSIF <Boolean_printout2> THEN
<ELSIF_instructions1>
.
.
ELSIF <Boolean_printout n> THEN
<ELSIF_instructions n-1>
ELSE
<ELSE_instructions>}
END_IF;

括号 {} 中的部分是任选项。

如果上述指令集中 <Boolean_printout1> 返回的是 TRUE，那么只执行 <IF_Instructions>，其它指令都不执行。否则逐个计算以 <Boolean_printout2> 开始的布尔表达式，直至表达式中的一个返回 TRUE 时为止。然后，只计算这个布尔表达式后和下一个 ELSE 或 ELSIF 前的那些指令。如果没有一个布尔表达式返回 TRUE,则只计算 <ELSE_instructions>。

示例：

IF temp<17
THEN heating_on := TRUE;
ELSE heating_on := FALSE;
END_IF;

这里，当温度下降到低于17度时，加热装置接通。否则加热装置一直保持断开。


CASE instruction

TwinCAT PLC Control: Languages

CASE 指令

使用 CASE 指令可在一个结构中，以相同的条件变量组合几个条件指令。
语法：

CASE <Var1> OF
<Value 1>:
<instruction 1>
<Value 2>:
<instruction 2>
...
<Value n>:
<instruction n>
ELSE
<ELSE-instruction>
END_CASE;

按以下方式处理一个 CASE 指令：

  • 若 <Var1> 的变量值为 <Value i>，则执行指令 <Instruction i>。
  • 若 <Var1> 没有指示值，则执行 <ELSE Instruction>。
  • 若对几个变量值执行相同的指令，则可用逗号分隔并逐一写出这些值，从而规定共同执行的条件。

示例：

CASE INT1 OF
1, 5:
BOOL1 := TRUE;
BOOL3 := FALSE;
2:
BOOL2 := FALSE;
BOOL3 := TRUE;
ELSE
BOOL1 := NOT BOOL1;
BOOL2 := BOOL1 OR BOOL2;
END_CASE;


RETURN instruction

TwinCAT PLC Control: Languages

RETURN（返回）指令

RETURN 指令可按条件用于结束一个功能。


EXIT instruction

TwinCAT PLC Control: Languages

EXIT 指令

若在 FOR、WHILE 或 REPEAT 循环中出现 EXIT 指令，则与终止条件无关，结束最内层的循环。


Function Block Diagram (FBD)

TwinCAT PLC Control: Languages

功能块图（FBD）

功能块图是一种图形化的编程语言。它以列举的若干网络运行，每个网络包含一种结构，该结构可以是逻辑表达式、算术表达式、功能块调用、跳转或是返回指令。
在 TwinCAT PLC Control 中，功能块图中可能出现的典型网络示例如下：


The Continuous Function Chart Editor (CFC)

TwinCAT PLC Control: Languages

连续功能图编辑器（CFC）

连续功能图编辑器的操作不同于带有网络的功能块图（FBD），而是带有可自由布置的元素。这就允许（例如）反馈。在连续功能图编辑器中可能出现的典型网络示例：


IEC 61131-3

IEC 61131-3 标准是用于可编程序控制器编程语言的国际标准。在 TwinCAT PLC Control 中提供的编程语言符合该国际标准的要求。按照该标准，一个程序由以下元素组成：

  • 结构
  • POUs
  • 全局变量

与 IEC 61131-3 有关的文献：

  • Flavio Bonifatti et al.: IEC 1131-3 Programming Methology, Seyssins: CJ International, 1997. ISBN 2-9511585-0-5
  • Karl-Heinz John, Michael Tiegelkamp: Iec 61131-3 Programming Industrial Automation Systems, Berlin: Springer-Verlag, 2001. ISBN 3-540677526
  • R. W. Lewis: Programming industrial control systems using IEC 1131-3, London: IEC Publishing, 1998. ISBN 0 85296 950 3


Options

TwinCAT PLC Control: Components

选项

对于TwinCAT PLC Control，可能只有一个视图。然而，在TwinCAT PLC Control中，你可以配置主窗视图（并且有不止一个视图）。此外，你还可以做些其他设置。为此，你可以使用命令“Project”（项目）—“Options”（选项）。从而，你作出的设置（除非另有确定）保存在文件“TwinCAT PLC Control.ini”中，并在下次 TwinCAT PLC Control 起动时有效。

“Project”（项目）→“Options”（选项）

使用该命令可以打开用于选项设置的对话框。选项分为不同类别。通过鼠标点击对话框左侧或通过方向键选择所需要的类别，并在对话框右侧更改选项。

你可以任意选择以下类别：

  • 装载和保存（Load & Save)
  • 用户信息(User information)
  • 编辑器(Editor)
  • 桌面(Desktop)
  • 颜色(Color)
  • 目录(Directories)
  • 日志(Log)
  • 建立(Build)
  • 密码(Passwords)
  • 源代码下装(Sourcedownload)
  • 符号配置(Symbol configuration)
  • 数据库链接（Database connection)
  • 宏指令(Macros)
  • TwinCAT

如果运行系统是一个总线控制器，TwinCAT选项将会被以下选项取代：

  • 控制器设置（Controller Settings）
  • 控制器高级设置（Controller Advanced）

‘Load & Save’（装载和保存）

如果你选择该类别，则得到以下的对话框：

类别 Load & Save（装载和保存）的选项对话框

‘Create Backup’ （建立备份 ）

当选中一个选项时，在选项前出现一个对勾（√）。如果你选择“Option”（选项）→“Create Backup”（建立备份），那么 TwinCAT PLC Control 就会在每次保存时使用扩展名“.bak”建立一个备份。使用这种方式，你总是能恢复上次保存之前的各种版本。

‘Auto Save’（自动保存）

若你选择选项 Auto Save（自动保存），则在工作时，你的项目会按照一个设置的时间间隔（Auto Save Interval，自动保存间隔）使用扩展名“.asd”不断地保存一个临时文件。这个文件将在一次正常退出时，从程序中删去。如果出于某种原因，TwinCAT PLC Control 非正常地停止运行（例如由于停电），则不会删去这个文件。

当你重新打开这个文件时，会出现以下屏幕：

现在，你可决定是否要打开原始文件或是打开自动保存的文件。

‘Auto Save before compile’（编译前保存 ）

在每次编译之前保存项目。

‘Ask for project info’（请求项目信息）

如果你选择了‘Ask for project info’（请求项目信息），则当保存一个新项目，或另存为时，自动调用项目信息。你可用命令“Project”（项目）→“Project info”（项目信息）使项目信息可视化，也可以处理这些信息。

“Auto load”（自动装载）

你若选择选项 “Auto Load”（自动装载），则在下次启动 TwinCAT PLC Control 时，自动装载上次打开的项目。在启动 TwinCAT PLC Control 时装载项目，还可通过将项目输入到命令行来实现。

“Remind of boot project on exit”（退出时提醒引导项目）：

自上次装载一个引导项目以来，如果一个项目已被修改并装载，而没有建立一个新的引导项目，则在离开该项目之前，对话框会向你提出建议："No boot project created since last download.Exit anyway ?"（自从上次装载以来未曾建立引导项目。是否退出）。

“Save ENI credentials”（保存 ENI 用户认证信息）：

用户名和密码，因为它们可以插入在用于 ENI 数据库的“Login”（登录）对话框内，将与项目一起保存。

“User Information”（用户信息 ）

如果你选择该选项，则得到以下对话框：

用户信息（User information）包括用户名、用户的原始数据（Initials）以及供职的公司（Company）。每个登入项都可修改，并与项目一起保存。

“Editor”（编辑器）

如果你选择该选项，则得到以下对话框：

当选中一个选项时，在选项前会出现一个对勾（√）。你可以为“Editor”（编辑器）进行以下设定：

  • 自动声明（Autodeclaration ）
  • 自动格式（Autoformat ）
  • 成员列表（List components）
  • 表格式声明 （Declaration as tables）
  • 制表符宽度 （Tab width ）
  • 字型 （Font ）
  • 文本选择显示 （Display of the text selection (Mark)）
  • 位值显示 （Display of the Bitvalues）
  • 禁止复杂类型监视（数组，指针，VAR_IN_OUT）（Suppress monitoring of complex types (array, pointer, VAR_IN_OUT)）
  • 显示POU符号（Show POU symbols）

“Autodeclaration”（自动声明）

如果你已选择 Autodeclaration（自动声明），那么（后跟一个尚未声明变量的输入），则在所有的编辑器中会出现一个对话框，应用这个对话框可以声明该变量。

“Autoformat”（自动格式）

如果已选择“Options”（选项）对话框“Editor”（编辑器）项中的选项“Autoformat”（自动格式），则 TwinCAT PLC Control 执行 IL 编辑器和声明编辑器的自动格式。

当你完成一行时，则进行以下的格式化：

  • 以小写字母写出的操作符用大写表示；
  • 制表符（Tab）插入到统一划分的列内；

“List components”(成员列表):

若选中这个选项，则可利用“Intellisense”（智能感应）功能。这意味着，如果你在应插入一个标识符的地方插入一点，则会打开一个选择表，提供所有在项目中出现的全局变量。在编辑器、监视和接收管理器以及在抽样跟踪中，都可利用智能感应功能。

“Declarations as tables”（表格式声明 ）：

如果选择“Options”（选项）对话框中“Editor”（编辑器）项中的选项“Declarations as tables ”（表格式声明），就可代替通常的声明编辑器来编辑一个表中的变量。这个表的布置如同一个索引属性表，其中有用于输入、输出、局部，以及输入/输出变量的属性页。对每一个变量而言，提供有“Name” （名称）、“Address”（地址）、“Type”（类型）、“Initial”（初始值）和“Comment”（注释）字段。

在“Options”（选项）对话框的“Editor”（编辑器）项中的“Tab-Width”（制表符宽度）字段，你可以确定在编辑器中制表符的宽度。默认设定值为四个字符，而字符宽度取决于所选择的字型大小。

“Font”（字型）

通过在“Options”（选项）对话框的“Editor”（编辑器）项中，点击“Font”（字型），可选择 TwinCAT PLC Control 编辑器中的所有字型。对所有制图操作而言，字型大小是基本单位。如果选择一个较大的字型，可以放大打印输出，即使是对于 TwinCAT PLC Control 的每个编辑器也是如此。

输入命令之后，打开字型对话框，以便选择字型、字体和字型大小。

用于设定字型的对话框

“Mark”（标记）：

在你的图形编辑器中，你可以选择虚线矩形（Dotted）、实线矩形（Line）或者有底纹的矩形（Filled）。在选择位置前出现一个点的地方选中选项。

“Bitvalues”（位值）：

在监视过程中，你可以选择数据（类型 BYTE，WORD，DWORD）显示为十进制还是十六进制或二进制。在选择位置前出现一个点的地方选中选项。

“Suppress monitoring of complex types”（禁止复杂类型监视（数组，指针，VAR_IN_OUT） ）：

如果选中这个选项，则数组、指针、VAR_IN_OUT 等复杂的数据类型将不再显示于联机模式时的监视窗内。

“Show POU symbols”(显示 POU 符号)：

I如果选中这个选项，则在 POU 框内显示各种符号（假定这些符号可在库文件夹内作为位映像使用）。位映像文件的名称必须由 POU 名和扩展名“.bmp”组成。例：用于 POU TON 的符号文件必需命名为 TON.bmp：

“Desktop”（桌面）

如果你选择该选项，则得到以下的对话框：

“Desktop”（桌面）对话框选项

“Tool bar”（工具条）

如果已选择工具条选项，带有快速选择命令按钮的工具条在菜单条下面变为可视。

“ Status bar”（状态条）

如果已选择状态条选项，在 TwinCAT PLC Control 主窗口下边缘的状态条变为可视。

“Online in security mode” （安全模式下的联机）

在联机方式时，应用命令“Run”（运行）、“Stop”（停止）、“Toggle Breakpoint”（切换断点）、“Single cycle”（单循环）、“Write values”（写入值）、“Force values”（强制值）以及“Release force”（解除强制），则出现带有确认请求的一个对话框，确认是否要实际执行命令。

“Query communication parameters before login”（登录前询问交互参数）

一旦执行命令 '在线（online）' '登录（login）‘，交互参数对话框将首先会打开。要进入联机模式，您必须先点击'确定（OK）'关闭此对话框。

“Do not save communication parameters in project"（不要保存项目中的交互参数）

项目中的交互参数对话框（‘online（在线）‘’Communication Parameters（交互参数‘））的设置将不会被保存。

“Language” (语言)

在这里可以规定菜单和对话框文本应以何种语言显示。

“Show print area margins”（显示打印范围）

在每个编辑器窗口，用红色虚线标出当前设定的打印范围。其尺寸取决于打印机属性（纸张尺寸，朝向）以及设定打印布局的 “Content” （内容） 字段的尺寸 （菜单命令： “File” （文件） → “Documentation Settings”（文档设置））。

“F4 ignores warnings”(F4 忽略报警)：

编译后，在一个消息窗内按 F4 时，则光标只跳转到有出错消息的行，忽略报警消息。

“MDI representation”（MDI的表示）

选择这个选项（多文件接口）的每个默认值，多个窗口将同时会被打开。如果不选择这个选项，就只会打开一个将全屏显示的窗口。

例外: 即使在 MDI 模式下，一个程序的功能和程序本身也能够并排显示。

“Colors”（颜色）

如果你选择该选项，则得到以下的对话框：

“Color”（颜色）选项对话框

你可编辑 TwinCAT PLC Control 的默认颜色设定。可选择是否要为行号（默认设定：浅灰色）、断点位置（深灰色）、设定断点（浅蓝色）、当前位置（红色）、到达位置（绿色）或布尔值监视（蓝色）改变颜色设定。如果你已选择指示按钮中的一个按钮，则打开用于输入颜色的对话框。

用于选择颜色的对话框

“Directories”（目录）

如果你选择该类别，则得到以下的对话框：

在“Project”（项目）和“General”（通用）区内可进入“Directories”（目录），以便 TwinCAT PLC Control 可应用目录来搜索库和控制器配置文件，以及保存编辑和资源上传文件。如果你选中（…）字段后的按钮，则打开目录选择对话框。对于库和配置文件而言，可为每种文件提供多个路径，各个路径以分号“;”隔开。

注意：

通过在其前加前缀“.”，能够进入与当前项目目录相关的库路径下。
例如，如果输入 ".\libs" ，即使当前的项目存储在'C:\Programs\projects' 路径下，这些库也能在路径’C:\Programs\projects\libs’下被搜索到。

“Project”（项目）区中的信息是以项目保存的；“General”（通用）区的信息则写入到编程系统的初始文件，从而用于所有项目。

Target（目标）区域显示目标文件中库的目录。虽然这些区域不能进行编辑，但是能够选择进入和复制（鼠标右键菜单）。

TwinCAT PLC Control 通常首先在“Project” （项目）中的目录中搜索，然后搜索进入到“Target System”（目标系统）中的目录（在“Target”（目标）文件中规定），最后搜索在“General”（通用）下列出的目录。如果找到两个名称相同的文件，则使用在目录中首先搜索到的那个文件。

“Log”（日志）

如果你选择该选项，则得到以下的对话框：

在这个对话框中，你可配置一个文件，其作用如同一个项目日志，记录联机方式运行期间所有的用户动作和内部过程。
如果被打开的一个现有项目还未生成日志，则打开一个对话框，它提醒注意这一事实，现在正在建立日志，在下次记录过程后，它将接收其第一个输入。
当保存项目时，日志以二进制的文件自动地保存在项目目录内。

如果你愿意使用不同的目标目录，你可为项目日志选中 “Directory” （目录） 选项， 并将合适的搜索路径输入到编辑字段。 为此， 可用按钮访问 “Select Directory”（选择目录）对话框。
使用扩展名（.log）自动将项目名分配给日志文件。要记录的“Online sessions”（联机事务）最大数量是由最大项目日志的大小所规定的。如果在记录过程中超过这个数，则删除最早的记录项，以便释放出空间用来记录最新的登入项。

可在“Option”（选项）字段“Activate logging”（激活记录）内接通或断开日志功能。可在“Filter”（筛选）区选择要记录的是哪些动作：用户动作，内部动作，状态变化，异常情况等。只有属于这些类别并经检验的动作，才能出现在“Log”（日志）窗口内，并写入到日志文件。

“Build”（建立）

如果你选择该类别，则得到以下的对话框：

“Build”（建立）对话框选项

注:

选项“Debugging”（调试）和“Online changes”（联机更改）的选择和取消选择并不影响当前应用 PC 机的 TwinCAT。 它们可在 TwinCAT 选项下进行设置！ 对于用于总线端子控制器 （Bus Terminal Controller）的 TwinCAT，这种设定可能会导致没有断点。当取消时，可提供更多的程序存储区。

当选择“Replace constant”（替代常数）选项时，每个常数值都是直接装载的，并且在联机方式，常数以绿色显示。此时，将不能对常数进行强制、写入和监视。如果选项被取消，则通过变量存取，可将值装载到一个保存位置（事实上，这样做允许写入变量值，但是系统需要更长的处理时间）。

如果“Nested comments option”（嵌套注释）选项是有效的，可将注释放置在其它的注释内。

示例：

(*
a:=inst.out; (* to be checked *)
b:=b+1;
*)

这里，由第一个括号开始的注释并不是由“需要核对”后的括号关闭，而是只由最后的括号关闭。

注意:

必须小心使用“Nested comments option” 的选项：如果项目中的设置与一个库中选择的设置不匹配，其中这个库已在TwinCAT PLC Control中创建并正运用到项目中，那么，编译器将会出错，这对于用户来说很难发现错误。

“Create binary file of the application”（建立应用程序的二进制文件）

如果选中应用程序的选项“Create binary file of the application”（建立应用程序的二进制文件），则在编译过程中，在项目目录中建立生成代码（引导项目）的一个二进制映像。文件名：<project_name（项目_名）>.bin。经过比较，使用命令“Online”（联机）→“Create Boot project”（建立引导项目），可在控制器上建立引导项目。当选中一个选项时，在选项旁会出现一个对勾（√）。

“Actions hide programs”(隐藏程序的行为)

当创建一个项目时，这个选项会被默认地选中。这意味着：如果一个局部的行为同一个全局变量或一个程序有相同的名称，则随后的层次结构是有效的：局部变量先于局部行为，局部行为先于全局变量，全局变量先于程序。

注意:

如果打开一个在先前的TwinCAT PLC Control版本上创建的项目，这个选项在默认条件下将不会被选中。因此，前面的有效层次结构（局部变量先于局部行为，局部行为先于全局变量，全局变量先于程序）能够保持下来。

“Treat LREAL as REAL”（把长实型当作实型）

如果选中这个选项（其有效性依赖于运行时间系统，默认：非选中），编译器将把长实型值当作实型值来处理。这能够用来创建独立的项目平台。

“Number of data segments” （数据数量）

通过输入“Number of data”（数据数量），你可确定，将在控制器内为项目数据保留多少空间。这个空间是需要的，以便当增加新的变量时，仍能完成“Online Change”（联机更改）。如果在编译过程中，出现消息“The global variables require too much storage”（全局变量需要更多的空间），则应增加你已在这里输入的数量。这种设定只对总线控制器 BCxxxx 这类产品有效。对 TwinCAT PC，数据段的数量是常数。保存量的大小可在 TwinCAT 选项下进行更改。

“Exclude objects”（排除目标）

这个按钮可打开“Exclude objects from build”（从结构上排除目标）对话框：在项目组成的树状图上选择这些POUs（这些POUs在编译时不应当考虑），并且选中 Exclude（排除）选项。因此，被排除的POUs在选择树状图上将会被显示成绿色。如果你想要显示这些当前用于程序的POUs，按“Exclude unused”（取消排除）按钮。注意，一个在目标组里选择的单一目标也会通过上下文菜单的'Exclude from build' （从结构中排除）命令被从结构中排除。

“Macro”（宏指令 ）

为了对整个编译过程进行控制，可建立二种宏指令：一种是在编译过程前执行的“Macro”（宏指令），位于编译字段前的宏指令；另一种是在编译过程后执行的“Macro”（宏指令），位于编译字段后的宏指令。然而，以下的宏指令命令不能在这里使用：新建文件，打开文件，关闭文件，文件另存为，文件退出，联机，项目编译，项目检查，项目建立，调试，监视表。

“Compiler Version”（编译器的版本）

在这里你能定义要用的编译器版本。除了实际版本的编译器以及以前版本的编译器（以前的V2.9）之外，在V2.9 （version, service pack, patch）之后的TwinCAT PLC Control版本也被包含进来。如果你想获得使用最新版本编译器编译的项目，选中“Use latest”（使用最新）按钮。然而，在这种情况下，将会检查打开的编程系统是否也是属于那个版本的。如果不是，同实际被用的编程系统版本相配的编译器将会被使用！如果，项目要通过具体版本的编译器编译，通过 Fix（定位）下的选择列表来定义。

“Check automatically”（自动检测）

为了检测项目的每个编译的语义的正确性，可选中如下选项：In order to get the semantic correctness checked at each compilation of the project the following options can be activated:
• 未使用的变量
• 重叠的地址区
• 并发访问
• 输出的多重写

结果将会在信息窗口显示出来，这些检测也能够被'Project' 菜单下的'Check' 子菜单的各自命令初始化。

如果目标系统支持，不进行检测结果将产生编译器错误。

注意:

所有的Build选项数据都同项目保存在一起。

“Passwords”（密码）：

如果你选择该类别，则得到以下的对话框：

类别“Password”（密码）的选项对话框

为了保护你的文件未经授权进入，TwinCAT PLC Control 提供一个密码选项，用于防止你的文件被打开或被改动。
将所需要的密码输入到字段“Password”（密码）中。对于每个输入的字符，都将在该字段中出现一个相应的星号（*）。你还需在字段“Confirm Password”（确认密码）中重复相同的密码字。通过 OK 关闭对话框。如果你得到消息：“The password does not agree with the confirmation”（密码与确认密码不符），则在两次输入中，有一次你输入的字符可能有错误。在这种情况下，重复输入两次，直到对话框关闭而没有出错消息时为止。如果你现在保存文件然后将它打开，你会得到一个对话框，在框内要求你输入
密码。 因此， 仅当你输入正确的密码时， 项目才会打开。 否则， TwinCAT PLC Control 报告： “The password is not correct”（密码不正确）。

与打开文件一样，你也可使用一个密码来保护文件不被改动。为此，你必须将一个密码输入到字段“WriteProtection Password”（写入保护密码）中，并在下面字段内确认该输入。一个有写保护的项目可以不用密码打开。为此，如果在打开某一文件时，TwinCAT PLC Control 告诉你输入写保护密码，则只要简单地按一下“Cancel”（取消）即可打开。至此，你可编译项目，将它装载到 PLC 和进行仿真等等，但是你不能对它进行改动。
当然，很重要的是，你必须记住两个密码。然而，如果万一你忘了一个密码，则可与你的 PLC 制造商联系。密码与项目一起保存。为了建立各种不同的访问权限，你可使用菜单命令“Project” （项目）→“Object access rights”（对象访问权限）→“Passwords for user groups”（用于用户组别的密码），规定用户组别。

“Sourcedownload”（源代码下装）

如果你选择该类别，则得到以下的对话框：

你可选择在哪一个 “Timing” （时刻） 和以什么 “Extent” （范围） 将项目装载到控制系统内。

“Extent”（范围）:

  • 选项 “Sourcecode only”（仅源代码）只包含在项目文件（extension .pro）内。
  • 选项“All files”（所有文件）还包括诸如相关的库文件、可视化图片、配置文件等。
  • 选项“Source code only ”（仅源代码）(排除编译信息) 同上述的纯源代码相关，但是没有编译信息。因此，这个功能单纯是个源代码。一个源自PLC的源代码上传后的在线修改是不可能的。对于BX平台，由于存储空间少，这个选项是令人感兴趣的。

“Timing”（时刻）:

使用选项 “Implicit at load” （隐含装载） 能使所选择的文件范围， 通过命令 “Online” （联机） → “Download”（装载）自动地装载到控制系统内。

使用选项“Notice at load” （装载时提示）提供一个对话框，当使用命令“Online” （联机）→“Download”（装载）命令时，会提出问题“Do you want to write the source code into the controller system?”（你是否需要将源代码装载到控制系统内？）。按 “Yes”（是），则自动地将所选择的文件范围装载到控制系统内；按“No”（否）则结束提问。

使用选项”implicit on create boot project“（隐含创建根项目），通过命令'Online' （联机）—'Create boot project'.（创建根项目）能够允许选择的文件自动装载到控制系统内。

当使用选项 “Only on demand” （仅根据要求）时， 所选择的文件范围必须通过命令 “Online” （联机） → “Sourcecode download”（源代码装载）确定装载到控制系统内。

保存在控制系统内的项目可通过命令“File”（文件）→“Open”（打开），从 PLC 打开项目以进行检索。在这一过程中文件将被解压缩。详见“File”（文件）→“Open”（打开）章节！

“Symbol configuration”（符号配置）

注：这种形式的符号管理仅出于兼容性考虑，因而只用于 TwinCAT OPC 服务器。对于所有其它情况，有一个（在每次编译时）名为 <项目名>.tpy 的新建立的 XML 文件。

这里给出的对话框用来配置符号文件。它将作为一种文本文件 <项目名>.sym 建立，或项目目录内的二进制文件 <项目名>.sdb。

若选择选项“Create symbol entries”（建立符号登录项），则用于项目变量的符号登入项将在项目的每次编译时自动地在一个符号文件中建立。

另外，如果选中选项 “Dump XML symbol table” （导出 XML 符号表），则在项目目录中还会建立一个包含符号信息的 XML 文件。它将命名为 <项目名>.SYM_XML。

如果你选择Configure symbol file“（符号配置文件），将打开如下对话框：

使用树结构选择编辑器来选择应在符号文件里包含的变量。这样选择一个POUs入口（例如全局变量），将 选中所有的属于这个POUs的变量，或者你能够选择某一POU的变量，是你在树状结构中列出的每个POU里找到的。接着，通过鼠标点击相应的选项。检查选中中选项，如下的选项能被设置：

“Export variables of object”（输出对象变量）:符号文件输出选择目标的变量 。

以下的选项仅当选中选项“Export variables of object”（输出对象变量）时才起作用：

“Export data entries”（输出数据登录项）：用于存取全局变量的登录项是为对象的结构和数组而建立的。
“Export structure components”（输出结构成员）：一种专门的登录项，是为对象结构的每个可变成员而建立的。
“Export array entries”（输出数组登录项）：一种专门的登录项，是为对象数组的每个可变成员而建立的。
“Write Access”（写存取）：对象的变量，可由 OPC 服务器更改。

一旦完成当前选择的用于 POU 选项的设定，还可选择其它 POU 并给出选项配置。这样可逐步完成任何所需数量的 POU 选择。当选择 OK 关闭对话框时，对话框打开以来所进行的所有配置均被确认。

“Database connection”（ 数据库链接）：

这个对话框用于定义项目是否应当在项目数据库中管理并且来正确地配置ENI接口：

“Use source control (ENI)”（使用资源控制）:如果你想通过ENI Server 存取一个数据库中的项目或者选择这个项目的一个POUs， 那就选中这个选项。

前提条件：必须安装ENI服务器和数据库，并且在数据库中你必须是一个注册用户。

如果选中这个选项，对于处理项目POUs，数据库的功能（登记，获得最新的版本等）将会是可用的。然后，就像在选项对话框里定义的一样，一些数据库功能将会自动运行，并且在'Project'—'Data Base Link' 菜单下，你将会发现引用这些功能的命令。除此之外一个'Data base-connection标签要添加到属性对话框里，在这个属性对话框里你能够把一个POU指派给一个特殊的数据库类别。
通过如下的数据库联接新的对象：

在这你设置了一个缺省：如果一个新的对象插入到这个项目中（“Project' （项目）'Object' （对象）'Add'（添加）），它将自动被指派到在此定义的那个对象类。这种指派将会在对象属性对话框中（“Project' （项目）'Object' （对象）'Properties'（属性））显示出来，并且随后能在那儿修改。可能的指派：

“Project”（项目）: POU将会被存储在那个数据库文件夹中，其中这个数据库文件夹是通过域'Project name'（项目名称）下的ENI配置/Project 对象对话框来定义的。
“Shared Objects”（共享的对象）：POU将会被存储在那个数据库文件夹中，其中这个数据库文件夹是通过域'Project name'（项目名称）下的ENI配置/Shared 对象对话框来定义的。
“Local”（局部）: 不把POU在一个ENI数据库中管理，而是仅将它存储在项目中。

除了'Project objects' （项目对象）和 'Shared objects' （共享对象）之外，还有第三种数据库类型'Compile files' （编译文件）直到项目被编译后才创建的对象。因此，这个类别与当前设置无关。

“Ask for type of new objects”（询问新对象类型）:如果选中这个选项，无论何时一个新的对象添加到这个项目中，'Object' （对象）—'Properties'（属性）对话框都将打开，在这个对话框中你能够选择前面提到的POU应被指派的三种对象类型中的一种。通过这样做，标准设置能够被覆盖。

“configure ENI”（配置ENI）:这个按钮可打开三个ENI配置对话框的第一个对话框：

对于ENI数据库中的每一个选项，都能够被指派到如下数据库类型中的一种：'Project objects'（项目对象）, 'Shared objects'（共享对象）或者 'Compile files'（编译对象）。对于这些种类的每一个种类，都有一个不同的对话框来定义：要存储的数据库文件夹和 特定的数据库功能的预设置。

ENI配置/项目对象对话框

ENI配置/共享对象对话框

ENI配置/编译文件对话框

注意:

每个对象在任何条件下将会与程序一起存储在本地
如果你正在进行一个基本的配置，对话框将会一个接一个地打开。在这种条件下，一个“Wizard”（下个按钮）按钮将会指导你并且在第一个对话框中的设置将会自动复制到其他对话框中。因此，如果你需要不同的参数值，你可以去修改他们。

如果你想要修改一个现存的配置，那么这三个对话框会合并成一个对话框（三个表格）。

如果先前你还没有成功的登陆数据库，那么将会自动打开登陆对话框。

与程序数据库有关的项目对象和共享对象选项

这些对话框是项目数据库选项('Project' （项目）'Options' （选项）'Project source control'（项目源控制）).配置的一部分。在这你定义了'Project objects'（项目对象）和 ‘Shared objects'（共享对象）数据库种类的存取参数。所有的对话框包含相同的输入条目。

“ENI-Connection”（ENI连接）

“TCP/IP-Address”（TCP/IP地址）: 运行ENI服务器的计算机的IP地址。

“Port”（端口）: 默认值：80；必须同ENI服务器所设置的配置参数相同。

“Project name”（项目名称）: 这个种类的对象所要存储的数据库文件夹的名称。按按钮...打开一个已有的数据库项目树状图文件夹。如果所要求的文件夹已存在，你能够在树状图上选择它，并且在'Project name' （项目名称）编辑区输入它的名称。如果直到你要通过按钮打开文件夹树状图，你还未登录到ENI服务器...，那么你首先要在登录对话框里输入你在ENI用户里定义的'User name'（用户名）和'Password'（密码）才能进入这三种数据库类别。

“Read only ”（只读）：如果选中这个选项，对于前面定义的数据库文件夹只能读取。

关于项目对象和共享对象的选项：

“Get latest Version”（获取最新版本）:

'Get latest Version'（获取最新版本）（菜单'Project' -'Data Base Link'（数据库连接））这个数据库功能能够从前面定义的数据库文件夹复制最新版本的POUs到当前打开的项目中，这样本地的 项目将会被覆盖。只要满足其中一个设置好的计时条件，对于不同于项目中对象的数据库中的所有对象，这将会自动实现。通过打对勾（√）选中要求的时间选项：

“At Project Open”（在项目打开时）: 在TwinCAT PLC Control中一经打开项目，就...。

“Immediately after Changes in ENI”（在ENI中改变后即刻）:一经这个POU的一个新版本登记到数据库（例如通过另一个用户）；接着这个POU在当前项目中将会得到立即更新并且会出现一个适当的信息。

“Before any Compile”（在任何编译前）: 在TwinCAT PLC Control中进行任何编译之前。

“Check out”（登出）:

'Check out' 这个数据库功能就像'in the works'（在工作）意为这个POU将会被标记，并且直到它又通过'Check in' （登入）或 'Undo check out'命令解锁，对于其他用户才可访问。

如果选中’Immediately at start of editing‘（在开始编辑时即刻）这个选项，一旦你开始编辑一个对象，这个对象将自动登出。如果这个对象当前已被另外的用户登出（通过一个在TwinCAT PLC Control中的在对象名称之前的红色十字叉表现出来），将会弹出一则信息。

“Check in”（登记）:

'Check in' 这个数据库功能的意思是在数据库中创建对象的一个新版本，而老的版本将不再存在。

你能够选中一个或两个如下选项来定义自动登记的时刻：

“At Project Save”（在项目保存时）: 一经保存项目时，就..

“After successfull compile”（成功编译后）:一经项目无错误的编译成功后，就...

对于每个'Get last version'（使用最新版本）的选项，'Check out' 和 'Check in' 选项可通过询问来选中。这种情况下，在执行相应的动作之前，将会打开一个对话框，在这个对话框中你仍可以去取消或者确认这个动作。

“Only for dialog compile file”（仅用于编译文件对话框）:

建立 ASCII 符号信息（.sym） 建立二进制符号信息（.sdb） | 无论什么时候，若选中该选项，则建立一个符号文件 *.sym（文本格式）或 *.sdb（二进制格式），该文件将写入到数据库。符号文件中的登录项如同在“Project”（项目）选项类别“Symbol configuration”（符号配置）中所规定那样建立。
建立引导项目 | 无论什么时候，若选中该选项，则建立引导项目，这个文件将自动写入到数据库。

“Cancel”（取消）将关闭对话框，而不保存在当前打开的对话框中所作的修改（保存以前对话框所作出的设定值）。返回到主对话框“Options”（选项）→“Project source control”（项目资源控制）。

“Macros”（宏指令）：

如果你选择该类别，则得到以下的对话框：

I在该对话框中，可使用“batch mechanism”（批处理）的命令来定义宏指令，然后可在“Edit”（编辑）→“Macros”（宏指令）菜单内调用这些宏指令。

1. 在输入字段“Name”（名称），输入一个用于建立宏指令的名称。按“New”（新建）按钮后，该名称会传输到“Macrolist”（宏指令表）字段内，并显示为已选中。宏指令表是以树形结构表示的。局部定义的宏指令逐一向下排列。如果宏指令库（见下面）是集成的，则库名称将列表，并且通过鼠标点击这些登录项前面的“+”或“-”符号，你可以打开或关闭一个库元素表。
2. “Menu”（菜单）字段用来定义菜单登录项，用它可使宏指令出现在“Edit”（编辑）→“Macros”（宏指令）菜单内。为了能将一个单独的字母作为一种快捷键，在这个字母前必须加一个符号“&”。示例：名称“Ma&cro 1”生成菜单登录项“Macro 1”。

3.在编辑器字段“Commands”（命令），可定义和/或编辑构成新建立的或新选择的宏指令的命令。所有批处理的命令以及对于批处理均有效的所有关键字都是允许的。通过按“Help”（帮助）按钮可获得一个列表。通过按 <Ctrl><Enter> 可选中一个新的命令行。按鼠标右键，可获得带有纯文本编辑器功能的快捷菜单。应用引号可将彼此有关的命令按组别组合在一起。

4. 如果你要建立其它宏指令，则在按 OK 按钮关闭对话框之前，再次完成以上步骤 1-3。

如果你要删除一个宏指令，则需将它从宏指令表中选出，然后按 <Del>。

如果你要重新命名一个宏指令，则将它从宏指令表中选出，在编辑字段“Name”中插入一个新名，然后按“Rename”（重命名）按钮。

如果要“edit”（编辑）一个现有的宏指令，则将它从宏指令表中选出，然后编辑字段“Menu”（菜单）和/或“Commands”（命令）。当按 OK 按钮时，将保存此修改。

只要按 OK 按钮关闭对话框，所有宏指令的实际描述将立即保存在项目内。

在“Edit”（编辑）→“Macros”（宏指令）菜单中的宏指令菜单登录项按其定义的次序显示。在作出菜单选择之前，不会测试宏指令。

宏指令库 ：

宏指令可保存在外部宏指令库内。这些库可包含在其它项目内。

· 建立一个包含当前打开项目宏指令的宏指令库：

按“Create”（建立）按钮。得到对话框“Merge project”（合并项目），在那里列出所有可供使用的宏指令。选择所需要的登录项，然以 OK 确认。所选择的对话框关闭，对话框“Save Macrolibrary”（保存宏指令库）打开。在这里为新库插入一个名称和路径，并按“Save”（保存）按钮。将建立名为 <库名>.mac 的宏指令库，然后关闭对话框。

· 在当前打开的项目中包含一个宏指令库 <库名>.mac：

按“Include”（包含）按钮。将打开对话框“Open Macrolibrary”（打开宏指令库），显示带有扩展名 *.mac 的文件。选择所需要的库，然后按“Open” （打开）按钮。则对话框关闭，该库将会加到“Macrolist”（宏指令表）的树状结构内。

提示：还可导出一个项目的宏指令（命令“Project”（项目）→“Export”（导出））

TwinCAT

如果你选择该类别，则得到以下的对话框：

类别 TwinCAT 的选项对话框
使用该菜单，可设置用于所有输入、输出和标志变量的可编址空间大小。任何未分配的变量都位于这个空间区域的外面。右边的复选框可用来决定是否允许有断点。如果来自 PLC 的变量要由一个可视化系统通过名称读出的话，那么 PLC 的运行系统中的所有需要的变量名都必须是已知的。

通常建议采用动态符号。应用这种类型的符号管理，可对某种符号的请求在运行系统中动态装配符号。与静态符号管理相比，其优点可以减小所需要的空间，缩短编译和装载时间。处理次数限制在 8192 次。不需要的处理要重新卸载。

如果出于兼容性原因，要采用静态符号管理，则可在这个菜单内规定保存在 PLC 运行系统中的变量数。局部和全局变量名的管理可在矩阵的行中规定。“Main”只生成结构或字段名。“Sub”还为所有的结构或字段成员生成变量名。

示例：

abc : ARRAY[1..2] OF BOOL;

如果你只选择 “Main” ， 则只能得到用于 “abc” 的符号。 如果你选择 “Sub” ， 你还可以得到用于成员 “abc[1]”和“abc[2]”的符号。

“Enable CE Target Visualization”（使CE目标可视化）:
如果选中这个选项，目标可视化将被激活。在库管理器中库SysLibTargetVisu.lib将自动被包含进来。

“Download symbol description”（下载符号描述）:
如果选中这个选项，符号描述将被下载到目标系统中。扩展名为.tpy 的文件描述PLC项目，并且是TwinCAT 系统管理器或TwinCAT OPC的输入。这个文件被保存在导向目录下并根据运行时间系统被命名为CurrentPlc_1.tpy ... CurrentPlc_4.tpy.

“Initialization of VAR_CONFIG inputs”（VAR_CONFIG输入的初始化）:
如果这个选项是激活的，那么输入变量VAR_CONFIG 将随其初始值被初始化。如果VAR_CONFIG的变量没有被link，那么它将通过PLC诊断块来显示。

注意：如果VAR_CONFIG变量没有link，那么这个初始值就会存在。

“Remind to update boot project on change”（提醒更新导向项目）:
如果选中这个选项，在每次下载你的PLC项目时，你将会被问到是否直接创建一个新的导向目录。

“Enable Web Visualization”（使能网页可视化）:
如果选中这个选项，网页可视化将被激活。

“Controller Settings”（控制器设置）

如果运行系统是一个总线控制器(BCxxxx BXxxxx)，才会出现这种类型。

如果你选择这种类型，你将会看到如想的对话框：

程序存储空间和数据存储空间设置在这里是可调节的：

  • 通过向左滑动滑块，你可以增大数据存储空间。调整好的数据存储空间在右边的数据框里可以看到。
  • 通过向右滑动滑块，你可以增大程序存储空间。调整好的程序存储空间在左边的数据框里可以看到。
  • 通过选中"Large Model" （大模式）选项，通常可以增大程序或数据记忆。


Objects

TwinCAT PLC Control: Components

对象

现在，我们要说明如何应用对象来工作，以及可利用那些帮助来保持跟踪一个项目（文件夹，调用树，交叉引用表，……）

对象

POU、数据类型以及资源（全局变量，柚样跟踪，PLC 配置，任务配置，以及监视和接收管理器）都被定义为“对象”。为使项目结构化而插入的文件夹只是部分涉及。项目的所有对象都包含在对象管理器中。
如果你将鼠标指针停留在对象管理器中的一个 POU 上一段时间，则在“Tooltip”（工具提示）中显示该POU 的类型（程序，功能或功能块）。对于全局变量而言，工具提示显示关键字（VAR_GLOBAL，VAR_CONFIG）。
使用拖放操作，你可在一个对象类型内移动对象（也包括文件夹，参见“文件夹”）。为此，选择对象并通过按压鼠标左键，将对象移到需要的地方。如果该移动引起名字冲突，则最新引入的元素将被附加系列号而加以唯一识别（例如：“Object_1”）

文件夹

为了保持跟踪较大的项目，必须系统地在文件夹中将 POU、数据类型和全局变量进行遍组。
可建立你所要求的多层次文件夹。如果在一个关闭的文件夹符号前有一个加号，则该文件夹包含有对象和/或其它的文件夹。在加号上点击，可打开文件夹，并显示子对象。在负号（它代替加号）上点击，可以重新关闭文件夹。
在上下文菜单中，你可以找到相同功能的命令“Expand nodes”（扩展节点）和“Collapse nodes”（收缩节点）。
使用拖放操作，可在其对象类型内移动文件夹的对象和文件夹。为此，选择对象并通过按住鼠标左键将该对象拖放到所需要的位置。

注:

文件夹对程序没有影响，只是用来使你的项目结构更为清晰。

对象管理器中的文件夹示例

“New Folder”（新建文件夹）

使用该命令，一个新文件夹可作为一种结构对象插入。如果已选择一个文件夹，则新文件夹是在已选出的文件夹下建立的。否则，它在相同层次上建立。如果选择的是一个动作，则新文件夹将插入在该动作所属的 POU 的层次上。当选择了一个对象或对象类型，而且已按鼠标右键或 <Shift>+<F10> 时，则出现包含这个命令的对象管理器的快捷菜单。
新插入的文件夹初始名称为“新文件夹”。请参阅以下文件夹命名惯例：

  • 在层次结构中处于相同层次的文件夹必须有彼此相区别的名字。处于不同层次的文件夹可以有相同的名字。
  • 一个文件夹不能有与位于相同层次上的对象相同的名字。

如果在相同层次上早已有名字“新文件夹”，则有这个名字的每个附加的文件夹都自动地接收一个附加的系列号（例如，“New Folder 1”）。重新命名一个早已使用的名字是不可能的。

'Expand nodes'（扩展节点）、 'Collapse nodes' （收缩节点）

使用扩展命令，位于选择对象内的对象被显式地展开。使用收缩命令，则不再显示其子对象。可双击鼠标键或按 <Enter> 键来打开或关闭文件夹。当已选出一个对象或对象类别，而且你已按鼠标右键或<Shift>+<F10> 键时，将出现包含有这个命令的对象管理器的快捷菜单。

“Project”（项目）→“Object Delete”（删除对象）快捷键：<Del>

使用该命令，当前选择的对象（POU，数据类型或全局变量），或带有子对象的文件夹可从对象管理器中除，也可以从项目中删除。为了安全起见，会向你再次询问对此操作的确认。若对象编辑器窗是打开的，则自动关闭。若你用命令“Edit”（编辑）→“Cut”(剪切)进行删除，则对象暂时保留在剪贴板上。

“Project”（项目）→“Object Insert”（插入对象）快捷键：<Ins>

使用该命令，你可以建立一个新对象。对象的类型（POU，数据类型或全局变量）取决于对象管理器中所选择的属性页。在对话框中输入新建对象的名字。记住，对象的名字也许尚未使用过。
请注意以下约束条件：

  • 一个 POU 的名字不能包括任何空格
  • 一个 POU 不能有与其它 POU 有相同的名字，或一个数据类型相同的名字。
  • 一个数据类型不能接受与其它数据类型相同的名字或一个 POU 相同的名字
  • 一个全局变量表不能有与其它全局变量表相同的名字。
  • 在同一个 POU 中一个动作不能有与其它动作相同的名字。
  • 一个可视界面不能有与其它可视界面相同的名字。

在所有其它情况下，允许有同样的命名。这样（例如），属于不同 POU 的动作可以有相同的名字，而一个可视界面也许有与一个 POU 相同的名字。对 POU 而言，POU 类型（程序、功能或功能块）以及所使用的编程语言必须加以选择。“Program”（程序）是“Type of the POU”（POU ）类型的默认值，而“Language of the POU”（POU 语言）的默认值是最近建立 POU 的语言。如果建立的 POU 是一种功能类型，则应将所需要的数据类型输入到“Return Type”（返回类型）文本输入字段。这里允许所有基本的和定义的数据类型（数组，结构，枚举，别名）。例如可使用输入助手（例如，通过〈F2〉）。

按 OK 按钮后，只有不与上述命名规则相冲突时，才有可能在对象管理器中建立新对象，并出现相应的输入窗口。
如果使用命令“Edit”（编辑）→“Insert”（插入），则插入当前剪贴板上的对象，而且不出现对话框。
如果插入的对象名字与命名规则（见上面）相冲突，则可通过附加一个前面带下划线的字符系列号使其成为唯一的名字（例如“Rightturnsig_1”）。
如果项目是在 ENI 数据库中的资源控制下，也许会（取决于“Project source control”（项目资源控制）对话框中的“Project”（项目）选项的设定）自动地向你提问，你要在哪一种数据库类别中来处理新的对象。在这种场合，对话框“Properties”（属性）打开，你可以将对象分配给数据库对象类别中的一个类别。

“Project”（项目）→“Object Rename”（对象重新命名）快捷键：<Spacebar>

使用该命令，可将一个新的名字赋予当前选择的对象或文件夹。记住，对象的名字也许尚未使用过。如果对象编辑窗是打开的，则当更改名字时，自动更改其标题。

重新命名 POU 的对话框

“Project'”（项目）→“Object Convert”（对象转换）

这个命令只能与 POU 一起使用。你可将 POU 从 SFC、ST、FBD、LD 和 IL 语言转换成 IL、FBD 和LD 三种语言中的一种。为此，必须编译项目。选择你要转换成的语言，并给出一个新的 POU 名。记住，POU 的名字也许尚未使用过。然后压按 OK 按钮，这样，新的 POU 就添加到你的 POU 表内。

转换过程中出现的处理类型相应于编译时所使用的类型。

用于转换 POU 的对话框

“Project”（项目）→“Object Copy”（对象复制）

使用该命令，可复制一个选出的对象并将它在一个新名下保存。将新的对象名输入到结果对话框内。对象名也许尚未使用过。
另一方面，如果你用命令“Edit”（编辑）→“Copy”（复制），则对象暂时保留在剪贴板上，并且不出现对话框。

用于复制 POU 的对话框

“Project”（项目）→“Object Open”（对象打开）快捷键：<Enter>

使用该命令，你可将“Object Organizer”（对象管理器）中一个选出的对象装载到相应的编辑器内。如果该对象的窗口早已打开，则焦点指向该对象，并移到前台，现在可对它进行编辑。打开一个对象还有两种其它方法：

  • 用鼠标在所需要的对象上双击，或
  • 将对象名的第一个字母输入到“Object Organizer”（对象管理器）内。然后打开一个对话框，其中显示带有这个初始字母的所有可供使用的对象类型的对象。选择所需要的对象，并点击“Open”（打开）按钮，以便将这个对象装入编辑窗内。从而该对象在“ObjectOrganizer”（对象管理器）中被标记，而在所有层次的对象路径中，其层次高于包含文件夹的对象也均会被展开。这个由对象类型“Resources”（资源）支持的选项仅用于全局变量。

最后一种可能性在带有多个对象的项目中十分有用。

选择要打开对象的对话框

“Project”（项目）→“Object Access rights”（对象存取权限）

使用该命令，你可打开用于将存取权限分配给不同用户组别的对话框。将出现以下对话框：

分配存取权限的对话框
现在用户组别 0 的成员可将各个存取权限分配给每个用户组。有三种可能的设置：

  • “No Access”（无存取）: 用户组的成员不能打开该对象。
  • “Read Access”（阅读存取）: 用户组的成员可以打开这个对象，但不能更改。
  • “Full Access”（完全存取）:用户组的成员可以打开并更改这个对象。

设置或是指“Object Organizer（对象管理器）”中当前选择的对象，如果选择“Apply to all”（应用于所有）选项，则指所有 POU 数据类型和项目的资源。如果已向用户组别 0 分配了密码，则当使用密码请求打开项目时，就进行对一个用户组的存取权限分配。

“Projec”（项目）→“Object properties”（对象属性）

使用该命令，可以打开当前标记在“Object Organizer”（对象管理器）中的对象“Properties”（属性）对话框。在选项卡“Access rights”（存取权限）上，你可找到在执行命令“Project”（项目）→“ObjectAccess Rights”（对象存取权限）时所得到的相同的对话框。取决于对象和项目设置，你可以定义对象属性是否存在可供使用的附加选项卡：

  • 如果一个全局变量表是当前在“Object Organizer”（对象管理器）中选择的，则可利用选项卡“Global variable list”（全局变量表），该表中定义了涉及表有效化和网络变量数据交换的参数。在这个表中还可以修改条目。如果你通过在“Object Organizer”（对象管理器）中的“Global Variables”（全局变量）中选择一个条目并执行命令“Add Object”（添加对象）来建立一个新的全局变量，也可打开这个对话框。
  • 如果这个项目连接到一个“data base”（数据库），则提供一个“Database-connection”（数据库连接）选项卡。在这里，你可显示并修改当前的对象分配。该对象分配是提供给与类别“Local”（局部）有关的一个数据库类别。

“Project”（项目）→“Data base link”（数据库链接）

仅当你已选中了类别“Project source control”（项目资源控制）的项目选项对话框中的选项“Use sourcecontrol (ENI)”（使用资源控制（EIN））后，才能使用这个菜单项。它附有一个子菜单，在那里你可找到以下处理对象的命令，与当前连接的 ENI 数据库中的项目有关：

  • 登录（用户登录到 ENI 服务器）

如果一个对象在“Object Organizer”（对象管理器）中被标记，并执行命令“Data Base Link”（数据库链接）（从快捷菜单，鼠标右键），则可使用以下命令来执行相应的数据库动作：

  • Define（定义）
  • Get Latest Version（获得最新版本）
  • Check Out（检验）
  • Check In（登记）
  • Undo Check Out （取消检验）
  • Show differences（显示差异）
  • Show Version History （显示版本历史）

如果选中“Project”（项目）菜单中的命令“Data Base Link”（数据库链接），则可使用附加菜单项，它涉及项目的所有对象：

  • Multiple Define（多重定义）
  • Get All Latest Versions（获得所有最新版本）
  • Multiple Check Out（多重检验）
  • Multiple Check In（多重登记）
  • Multiple Undo Check Out（多重取消检验）
  • Project Version History（项目版本历史）
  • Label Version（标记版本）
  • Add Shared Objects（添加共享对象）
  • Refresh Status （刷新状态）

参阅以下的命令描述。

加灰色阴影的图标：对象保持在数据库中
对象名前的绿色检验符：对象在局部项目内检验。
对象名前的红色十字号：对象当前被其它用户检验。
对象名后面的 <R>：对象是只读的，不能被编辑。

注：

有些对象（任务配置，抽样跟踪，PLC 配置，目标设定，监视和接收管理器），只要它们尚未检验，则按照默认值分配一个 <R>。这意味着，一旦你开始编辑对象，就不会自动向你询问这个对象是否应检验；但这并不意味着，你不能编辑这个对象。如果实际上没有写存取，则不能使用命令“Check out”（检验）。

“Project”（项目）→“Data base command”（数据库命令）→“Define”（定义）

利用菜单“Project”（项目）→“Data Base Link”（数据库链接）中的该命令可规定“Object Organizer”（对象管理器）中当前标记的对象是否应保存在数据库中，或只是局部地保存在项目中。打开一个对话框，在那里，你可从“Project”（项目）或“Shared objects”（共享对象）两种数据库类别中选用一种，或选取类别“Local”（局部）。

所有在数据库中管理的对象图标在“Object Organizer”（对象管理器）中以灰色阴影显示。

“Project”（项目）→“Data base command”（数据库命令）→“Get latest version”（获得最新版本）

使用菜单“Project”（项目）→“Data Base Link”（数据库链接）中的该命令来复制对象的当前版本，它在“Object Organizer”（对象管理器）中标记，并从数据库复制到你的项目。这将改写本机版本。与“CheckOut”（检验）动作相对应，该对象并不锁定数据库中的其它用户。

“Project”（项目）→“Data base command”（数据库命令）→“Check Out”（检验）

使用菜单“Project”（项目）→“Data Base Link”（数据库链接）中的该命令来检验对象，它在“ObjectOrganizer”（对象管理器）中标记，可从数据库并通过数据库来锁定其它用户对它的使用。
当执行该命令时，用户会得到一个对话框“Check out object”（检验对象）。可附加一个注释，它将保存在数据库中对象的版本历史记录中。
以 OK 按钮关闭对话框之后，检验的对象将在本地项目的对象管理器中以绿色对勾（√）标记。对于其它用户而言，则以红色十字号标记，对他们来说是不能编辑的。

“Project”（项目）→“Data base command”（数据库命令）→“Check In”（登记）

使用菜单命令“Project”（项目）→“Data Base Link”（数据库链接）中的该命令来登记对象，它在对象管理器中标记，并登记到数据库。从而，在数据库中建立对象的一个新版本。原有版本将随之保存。
当执行该命令时，用户会得到一个对话框“Check in object”（登记对象）。可附加一个注释，它将保存在数据库中对象版本的历史记录内。
使用 OK 按钮关闭对话框后，对象管理器中对象名前的绿色检验符号被删除。

“Project”（项目）→“Data base command”（数据库命令）→“Undo Check Out”（取消检验）

使用菜单“Project”（项目）→“Data Base Link”（数据库链接）中的该命令可清除当前在对象管理器中标记的对象的“Checking out”（检验）。从而，已作出的对象局部修改也被清除。不出现对话框。对象未改动的最后版本将保存在数据库内，可被其它用户重新存取。对象管理器中，对象名前的红色十字号将消失。

“Projec”（项目）→“Data base command”（数据库命令）→“Show Differences”（显示差异）

使用菜单“Project”（项目）→“Data Base Link”（数据库链接）中的该命令来显示当前被用户打开的对象（在划分为二部分的窗口内）。如同项目比较中所述那样标记出版本的差异。

“Project”（项目）→“Data base command”（数据库命令）→“Show Version History”（显示版本历史）

使用菜单“Project”（项目）→“Data Base Link”（数据库链接）中的该命令打开对象的 <对象名> 版本历史对话框。该对象当前在对象管理器中标记。在这个对话框中列出已登记在数据库内或已在那里作出标记的对象的所有版本：

“Version”（版本）：

已逐一登记的对象版本的数据库专用编号。有标记的版本没有版本号，但用一个标记图标标出。

“User”（用户）:

用户名，已执行了登记或标记工作

“Date”（日期）:

工作日期和时间戳

“Action”（动作）:

已执行的动作类型。可能的类型有：“建立”（首次已在数据库中登记的对象），“登记”（除了第一个以外的所有对象的登记），以及“用<标记>标记”的对象（已将一个标记分配给对象的这个版本）。按钮：

“Close”（关闭）: 将对话框关闭。

“Display”（显示）: 在窗口中打开当前在表中标记的版本。标题栏显示：“ENI：<数据库中的项目名>/<对象名>”

“Details”（详细）:

将打开对话框“Details of Version History”（详细版本历史）：

File (项目名和数据库中的对象), Version (see above), Date (see above), User (see above),
Comment (当登记对象或标记时插入注释). 。用按钮“Next”（下一个）或“Previous”（上一个），可跳转到“Version history of…”（…的版本历史）对话框中，表内下一个或上一个条目的详细窗口。.

“Get latest version”（得到最近的版本）: 在表中作出标记的版本将装入 TwinCAT PLCControl 中，在那里将改写本地版本。

“Differences”（差异）: 如在表中只标出一个对象的一个版本，则该命令将导致这个版本与最近（实际）的数据库版本进行比较。若两个版本都打上标记，则对它们进行比较，差异显示在一个对半分的窗口内。这与项目比较时的情况相类似。

“Reset version” （恢复版本）:在表中标记的版本将设定为最近版本。以后登记的所有版本都将被删除！这样做有助于恢复一个对象的早期状态。

“Labels only”（只用标记）:若选中这个选项，则只显示表中以标记标出的对象的版本。

"Selection box"(选择对话框)：位于“Labels only”（只用标记）选项下面：在这里你可找到所有用户名，这些用户已为当前项目的对象执行了任何数据库动作。如果你需要得到关于所有用户或只是某个用户的版本历史，可选择“All”（所有）或某一个名。

“Project”（项目）→“Data base command”（数据库命令）→“Multiple Define”（多重定义）

使用菜单“Project”（项目）→“Data Base Link”（数据库链接）中的该命令，可将几个对象一次分配给某个数据库类型。对话框“Properties”（属性）如同命令“Define”（定义）所述那样打开。选择所需要的项，然后以 OK 按钮关闭对话框。此后会打开对话框“ENI-Selection”（ENI 选择），列出所有用于选出类别的项目 POU（例：如果你选择类别“shared objects”（共享对象），则选择窗口只提供“Resources”（资源）标记的 POU ）。POU 以树形结构表示，符合对象管理器的结构。选择所需要的POU，并以 OK 按钮确认。

“Project”（项目）→“Data base command”（数据库命令）→“Get All Latest Versions”（得到所有最近版本）

使用菜单“Project”（项目）→“Data Base Link”（数据库链接）的该命令，可调用当前打开项目的每个对象的最近版本，该版本在源代码控制下从数据库保存。考虑到以下情况：
如果此时已在数据库项目文件夹内保存了其它对象，则现需要将它们附加到 PLC 控制系统中的本地项目内。
如果此时已将对象从数据库中删除，则这些对象不会在本地项目中删去，但是，它们将自动地分配到类别“Local”（本地）。

如这些对象可供本地项目使用，则只调用类别“Shared Objects”（共享对象）的对象最新版本。详细情况请参阅命令“Get latest version”（得到最新版本）。

“Project”（项目）→“Data base command”（数据库命令）→“Multiple Check Out”（多重检验）

使用菜单“Project”（项目）→“Data Base Link”（数据库链接）中的该命令，可一次检验几个对象。为此，打开对话框“ENI-Selection”（ENI 选择），列出项目的所有 POU。选择需要检验的对象并以 OK按钮确认。详细情况请参阅命令“Check Out”（检验）。

“Project”（项目）→“Data base command”（数据库命令）→（Multiple Check In）“多重登记”

使用菜单”Project”（项目）（项目）→“Data Base Link”（数据库链接）中的该命令，可一次登记几个对象。为此，打开对话框“ENI-Selection”（ENI 选择），列出项目的所有 POU。选择需要登记的对象并以 OK 按钮确认。详细情况请参阅命令“Check In”（登记）。

“Project”（项目）→“Data base command”（数据库命令）→“Project Version History”（项目版本历史）

使用菜单“Project”（项目）→“Data Base Link”（数据库链接）中的该命令，为当前打开的项目查阅其版本历史。但是，仅当所选择的数据库系统支持这个功能时才能进行此项操作。将打开对话框“History of<data base project name>”<数据库项目名>的历史。它按时间顺序显示项目特定对象的动作（建立，登记，标记）。在“Version history”（版本历史）后面显示对象总数。这个对话框可如同命令“Show VersionHistory”（显示版本历史）所描述那样进行，但是要注意以下几点：
- 命令“Reset Version”（恢复版本）只供单个对象使用。
- 命令“Get latest version”（得到最新版本）将调用本地项目内当前标记登录的版本中所有对象！这意味着，在 TwinCAT PLC Control 中的对象将以较早的版本改写。但是：本地对象（它们还不是较早版本中项目的一部分）不会从本地项目中清除掉！

“Project”（项目）→“Data base command”（数据库命令）→“Project Label Version”（项目标记版本）

使用菜单“Project”（项目）→“Data Base Link”（数据库链接）中的该命令，将一个“label”（标记）放置在项目每个对象的实际版本上，这样在以后可准确地再调用这个项目版本。打开对话框“Label <database project name>”（标记<数据库项目名>）。插入一个“Label”（标记）名并任选一个“Comment”（注释）。当你以 OK 按钮确认时，关闭对话框，标记和动作“labeled with 〈label name〉”（以<标记名>标记）将出现在版本历史表内，也出现在项目历史中单个对象的历史内。标记的版本不会得到一个版本号，只是以一个标记图标在“Version”（版本）栏内标示。如果在“Version History”（版本历史）对话框中，选中选项“Labels only”（只用标记），则只列出带标记的版本。

“Project”（项目）→“Data base command”（数据库命令）→“Add Shared Objects”（添加共享对象）

使用菜单“Project”（项目）→“Data Base Link”（数据库链接）中的该命令，可显式地要求将数据库类别“Shared Objects”（共享对象）的新对象添加到本地打开的项目上。对于类别“Project Objects”（项目对象）的对象，这是不必要的，因为命令“Get (all) latest version(s)”（得到（所有）最新版本）会自动地调用在数据库项目文件夹中找到的所有对象，甚至包括尚未用于本地项目中的一些对象。但是，对于类别“Shared Objects”（共享对象）的对象而言，在这种情况下，只调用早已在本地项目中提供的那些对象。
这样，执行命令“Add Shared Objects”（添加共享对象），打开对话框“Browse ENI”（浏览 ENI）。在窗口右侧的表显示用于数据库文件夹（它是当前从窗口左侧表中选出的）的所有对象。选取所需要的对象并以 OK 按钮确认，或双击条目，将对象插入到当前打开的项目上。

“Project”（项目）→“Data base command”（数据库命令）→“Refresh Status”（刷新状态）

使用菜单“Project”（项目）→“Data Base Link”（数据库链接）中的该命令可更新对象管理器中的显示，使你能看到与项目资源控制有关的对象实际状态。

“Project”（项目）→“Data base command”（数据库命令）→“Login”（登录）

使用菜单“Project”（项目）→“Data Base Link”（数据库链接）中的该命令，可打开对话框“Login”（登录），在那里你可经过 ENI 服务器输入用于 ENI 数据库的存取数据。存取数据还应在 ENI 服务器“ENI Admin，User Management”（“ENI 管理员”，“用户管理”）中定义，以及—取决于当前所使用的数据库，还应在数据库的用户管理中定义。执行该命令后，首先打开用于类别“Project objects”（项目对象）的“Login”（登录）对话框

“Data base”（数据库）: 项目对象

“Host”（主机）:计算机的地址，ENI 服务器在该地址运行（必须与“项目资源控制”的项目选项对话框中的“TCP/IP 地址”字段的输入项相对应）。

“Project” （项目）: 数据库项目名（必须与“Project source control”（项目资源控制）/“Project Objects”（项目对象）的项目选项对话框中“Project name”（项目名）字段的输入项相对应）。

“Credentials”（用户认证信息）: 插入“User name”（用户名）和“Password”（密码）。

按 OK 按钮确认设定。对话框被关闭，自动打开用于“Shared objects”（共享对象）的对话框“Login”（登录）。
使用上述“Project objects”（项目对象）对话框相同方式输入存取数据，并以 OK 按钮确认。

“Project”（项目）→“Add action”（添加动作）

该命令用来生成一个动作，分配给对象管理器中的一个选出的程序块。在出现的对话框中选择动作名，以及相应执行该动作的语言。
新的动作安放在对象管理器中用户的程序块下面。在程序块前面出现一个加号（+）。以鼠标单击加号使动作对象出现，并在程序块前面出现一个负号（-）。单击负号，使这个动作消失并重新出现加号。通过快捷
命令“Expand Node”（扩展节点）和“Collapse Node”（收缩节点）也可实现这个动作。
在这个动作上双击或按 <Return>，则将一个动作装入到编辑器内。

“Project”（项目）→“Open Instance”（打开实例）

使用该命令可打开显示对象管理器中选出的功能块实例。以相同的方式，双击对象管理器中的功能块，进入选择对话框，其中列出功能块及其实现的实例。在这里选择所需要的实例或实现并以 OK 按钮确认。该窗口内显示所需要的项。

注：

如你需要观察实例，首先，你必须登录！（项目已编译而且没有错误，然后使用菜单命令“Online”（联机）→“Login”（登录）装载到 PLC）。

打开实例的对话框

“Project”（项目）→“Show call tree”（显示调用树）

使用该命令，可打开一个窗口，它显示对象管理器中所选出对象的调用树。为此，项目必须是编译的（见命令“Rebuild all”（全部重建））。调用树包括 POU 的调用和数据类型的引用。

Example of a call tree

“Project”（项目）→“Show cross reference list”（显示交叉引用表）

使用该命令可打开一个对话框，它能够为你输出变量、地址、或 POU 的所有应用点。为此，项目必须是编译的（见命令“Rebuild all”（全部重建））。首先选择类别“Variable”（变量）、“Address”（地址），或 POU，然后输入所需要的元素名。为了获得输入类别的所有元素，在“Name”（名）中输入一个星号“*”。
通过点击“Get References”（得到引用），你可得到所有应用点的表。与 POU 和行号或网络号一起，还可规定变量名和地址（如果有的话）。“Domain space”（域空间）用于显示这是一个局部变量还是一个全局变量；地址栏表示变量在当前位置上是以“reading”（读取）还是用“writing”（写入）存取。当你选出交叉引用表中的一行并按“Go To”（转换）按钮或在行上双击时，则显示 POU 在其编辑器中的相应点。以这种方式，你可跳转到所有的应用点而不需要费时的搜索。
为了使处理过程更为简单，可使用“Send to message window”（发送到消息窗）按钮，将当前的交叉引用表带到消息窗，并在那里转换成相应的 POU。

Dialog box and example of a cross reference list（一个交叉引用表例子的对话框）


Help System

TwinCAT PLC Control: Components

帮助系统

如果你在工作中遇到有关 TwinCAT PLC Control 的任何问题，可利用联机帮助系统帮助你解决问题。在那里你可以找到包括在该手册中的所有资料。帮助直接引用 TwinCAT 信息系统。因此，必须安装 Beckhoff Information System.


'Extras' Menu: Settings

TwinCAT PLC Control: Resourcen

'Extras'菜单：Settings

在报警配置中，点击菜单栏'Extras' 'Settings' 打开报警配置设置对话框：

Category Date/Time:
在这里设置日志文件中报警表达格式。根据下列语句定义格式。破折号和冒号要放在引号内。

日期： dd'-'MM'-'yyyy -> 如， "12.Jan-1993"

时间： hh':'mm':'ss -> 如， "11:10:34"

Language:

在TwinCAT PLC Control中改变语言需要选择语言文件。
注意，语言文件必须包括报警配置的文字串的翻译。参考下列描述：

  • 可视化，设置语言
  • 把程序翻译成其它语言


PLC Configuration

PLC 配置取决于相应的配置硬件。TwinCAT 支持三种不同的硬件平台：

  • PC（i386）：PLC 程序在 PC 或CX10x0上运行。
  • PC (ARM): PLC 程序在一个CX9000上运行。
  • BCxxxx：PLC 程序在总线控制器上运行。
  • BCxx50或 BXxxxxx

如你将 PLC 程序在一个 BCxxxx/BCxx50 或 BXxxxx 总线端子 PLC 上运行，可以选择是否需要装入程序。

  • 通过 AMS（取决于现场总线）
  • 通过串行接口


Calling up language-dependent Online Help via a visualization element

TwinCAT PLC Control Visualization

通过可视化单元调用在线语言帮助：

可视化单元的不同帮助文件的调用同用于当前可视化界面的语言紧密相关。为此，应在'Configure element'（配置单元）对话框中'Execute program'(执行程序)处输入命令“INTERN HELP”，并且应在TwinCAT PLC Control中的.ini文件中出现一个[Visu-Helpfiles]部分。在这下面，相应的帮助文件应分配给有效的语言用以可视化界面中的语言选择。例如：

[Visu-Helpfiles]
German=C:\PROGRAMME\HELP_D.HLP
English=C:\PROGRAMME\HELP_E.HLP


Feature Overview

TwinCAT PLC Visualisierung

有关TwinCAT可视化的特征概述

下表列出了有关TwinCAT可视化提供的功能：

>
 | PLC Control | PLC HMI | PLC HMI Web | PLC HMI CE | 内容
当前测试版本: | Build 1010 | 2.10.0.900 | 1.0.0.7 | 1.0.9.10 | From TwinCAT 2.10 Build 1334
矩形 |  |  |  |  |
圆角矩形 |  |  |  |  |
椭圆 |  |  |  |  |
多边形 |  |  |  |  |
曲线 |  |  |  |  |
饼图 |  |  |  |  |
位图 |  |  |  |  |
可视化 |  |  |  |  |
按钮 |  |  |  |  |
WMF/JPG 文件 |  |  |  |  |
表格 |  |  |  |  |
激活的X单元 |  |  |  |  |
趋势 |  |  |  | / | HMI CE: 仅在线趋势可用
报警表 |  |  |  |  |
仪表 |  |  |  |  |
显示栏 |  |  |  |  |
柱状图 |  |  |  |  |
不可见的单元 |  |  |  |  |
改变颜色 |  |  |  |  |
背景位图 |  |  |  |  |
按钮背景 |  |  |  |  |
工具条 |  |  |  |  | HMI CE: 离边界不太近的单元或窗口外的工具条。Elements not too near to the edge or tooltip is outside the window
安全 |  |  |  |  |
占位符 |  |  | / | / | Web/HMI CE: 不能通过跳转命令跳转到带有占位符的页面
打印功能 |  |  |  |  |
改变密码 |  |  |  |  |
改变用户等级 |  |  |  |  |
语言对话框 |  |  |  |  |
自动改变语言 |  |  |  |  |
退出 |  |  |  |  |
跟踪 |  |  |  |  |
文本输出'Text' |  |  |  |  | Web: 请不要超过变量要求的最大字符串长度 HMI CE: 不支持隐藏功能
文本输入'Numpad' |  |  |  |  | HMI CE: 不支持隐藏功能
文本输出 'Keypad' |  |  |  |  | Web: 请不要超过变量要求的最大字符串长度 HMI CE: 不支持隐藏功能

限制


Starting the Target Visualization

TwinCAT PLC Visualization

启动目标可视化

启动PLC程序后。如果有TC_VISU画面名那么就启动TC_VISU画面，如果没有就启动对象管理器中可视化对象列表中的第一个可视化对象。


Using the Keyboard

TwinCAT PLC Control: Keyboard

使用键盘

如果只想使用键盘运行 TwinCAT PLC Control，你将发现必须应用一些在菜单中无法找到的命令。

  • 使用功能键 <F6>，可以在打开的 POU 中，在声明部分和指令部分之间进行切换。
  • 使用 <Alt>+<F6>，可以从一个打开的对象移动到对象管理器，如果信息窗被打开，则从那儿移动到信息窗。如果搜索框被打开，则使用 <Alt>+<F6>，可从对象管理器切换到搜索框，并从那儿返回到对象。
  • 按 <Tab>，可以在对话框中的输入字段之间移动，包括对话框中的按钮。
  • 使用箭头键，可以在属性页以及对象管理器和库管理器的对象之间进行移动。
  • 所有其它动作都可以使用菜单命令或菜单命令后面的快捷键完成。使用 <Shift>+<F10>，可以打开上下文菜单，此菜单中包含选择对象或激活编辑器最常用的命令。

组合键

下面是所有组合键和功能键的一览表：

General Functions |
在 POU 的声明部分和指令部分之间移动 | <F6>
在对象管理器、对象和信息窗之间移动 | <Alt>+<F6>
上下文菜单 | <Shift>+<F10>
用于说明的快捷模式 | <Ctrl>+<Enter>
从信息窗的一个信息行返回到编辑器中的原始位置 | <Enter>
打开和关闭多层变量 | <Enter>
打开和关闭文件夹 | <Enter>
切换对象管理器和库管理器中的属性页 | <Arrow keys>
移动到对话框中的下一字段 | <Tab>
上下文相关联的帮助 | <F1>
General Commands |
"File" "Save" | <Ctrl>+<S>
"File" "Print" | <Ctrl>+<P>
"File" "Exit" | <Alt>+<F4>
"Project" "Delete Object" | <Del>
"Project" "Add Object" | <Ins>
"Project" "Rename Object" | <Spacebar>
"Project" "Edit Object" | <Enter>
"Edit" "Undo" | <Ctrl>+<Z>
"Edit" "Redo" | <Ctrl>+<Y>
"Edit" "Cut" | <Ctrl>+<X> or <Shift>+<Del>
"Edit" "Copy" | <Ctrl>+<C>
"Edit" "Paste" | <Ctrl>+<V>
"Edit" "Delete" | <Del>
"Edit" "Find Next" | <F3>
"Edit" "Input Assistant" | <F2>
"Edit" "Next Error" | <F4>
"Edit" "Previous Error" | <Shift>+<F4>
'Online''Login' | <F11>
'Online''Logout' | <F12>
'Online''Run' | <F5>
'Online''Toggle Breakpoint' | <F9>
'Online''Step Over' | <F10>
'Online''Step In' | <F8>
'Online''Single Cycle' | <Ctrl>+<F5>
'Online''Write Values' | <Ctrl>+<F7>
'Online''Force Values' | <F7>
'Online''Release Force' | <Ctrl><Shift>+<F7>
'Online''Write/Force Dialog' | <Shift>+<F7>
‘Online’‘Display Flow Control’ | <Ctrl>+<F11>
'Window''Messages' | <Shift>+<Esc>

FBD Editor Commands |
'Insert''Network (after)' | <Shift>+<T>
'Insert''Assign' | <Ctrl>+<A>
'Insert''Jump' | <Ctrl>+<L>
'Insert''Return' | <Ctrl>+<R>
'Insert''Operator' | <Ctrl>+<O>
'Insert''Function' | <Ctrl>+<F>
'Insert''Function Block' | <Ctrl>+<B>
'Insert''Input' | <Ctrl>+<U>
'Extras''Negate' | <Ctrl>+<N>
'Extras''Zoom' | <Alt>+<Enter>

CFC Editor Commands |
'Insert''POU' | <Ctrl>+<B>
'Insert''Input' | <Ctrl>+<E>
'Insert''Output' | <Ctrl>+<A>
'Insert''Jump' | <Ctrl>+<G>
'Insert''Label' | <Ctrl>+<L>
'Insert''Return' | <Ctrl>+<R>
'Insert''Comment' | <Ctrl>+<K>
'Insert''POU input' | <Ctrl>+<U>
'Extras''Negate' | <Ctrl>+<N>
'Extras''Set/Reset' | <Ctrl>+<T>
'Extras''Connections' | <Ctrl>+<M>
'Extras''EN/ENO' | <Ctrl>+<O>
'Extras''Zoom' | <Alt>+<Enter>

LD Editor Commands |
'Insert''Network (after)' | <Shift>+<T>
'Insert''Contact' | <Ctrl>+<O>
'Insert''Parallel Contact' | <Ctrl>+<R>
'Insert' 'Function Block' | <Ctrl>+<B>
'Insert''Coil' | <Ctrl>+<L>
'Extras''Paste Below' | <Ctrl>+<U>
'Extras''Negate' | <Ctrl>+<N>

SFC Editor Commands |
'Insert''Step-Transition (before)' | <Ctrl>+<T>
'Insert''Step-Transition (after)' | <Ctrl>+<E>
'Insert''Alternativ Branch (right)' | <Ctrl>+<A>
'Insert''Paralell Branch (right)' | <Ctrl>+<L>
'Insert''Jump' (AS) | <Ctrl>+<U>
'Extras''Zoom Action/Transition' | <Alt>+<Enter>
从SFC总图返回编辑器 | <Enter>

Work with the PLC Configuration |
打开和关闭结构成员 | <Enter>
在名字周围放置一个编辑控制框 | <Spacebar>
‘Extras’ ‘Edit Entry’ | <Enter>

Work with the Task configuration |
在任务或程序名称周围放置一个编辑控制框 | <Spacebar>


Build Errors

TwinCAT PLC Control: Build Errors

编译错误

以下为错误提示及可能的原因。

1500, 1800, 1900, 2500, 3100, 3200, 3400, 3500, 3600, 3700, 3800, 3900, 4000, 4100, 4200, 4300, 4500 , 4600, 4700, 4900

Warnings

Number | Error Message | Possible Cause
1100 | Unknown function '<name>' in library. | 使用了一个外部库。请检查，在 hex 文件中定义的所有功能是否也定义在 lib 文件内。
1101 | Unresolved symbol '<Symbol>'. | 调用的功能块或程序名错误。
1102 | Invalid interface for symbol '<Symbol>'. | function 只有一个输入、没有输入 或 输出。
1103 | The constant '<name>' at code address '<address>' overwrites a 16K page boundary! | 字符串常量超过16K的页面边界。 超出控制器数据空间。
1200 | Task '<name>', call of '<name>' Access variables in the parameter list are not updated | 在任务配置中调用的功能块中所使用的变量将不会列在交叉引用表中。
1300 | File not found '<name>' | 文件路径错误
1301 | Analyze-Library not found! Code for analyzation will not be generated. | analyzation.lib未调用
1302 | New externally referenced functions inserted. Online Change is therefore no longer possible! | 由于新增加了库程序，所以需要全部重新下载。不能在线修改。
1400 | Unknown Pragma '<name>' is ignored! | 这个附注不受编译程序支持。受支持的命令见关键字的附注。
1401 | The struct '<name>' does not contain any elements. | 此结构未定义任何元素，但是系统仍然会分配1Byte的内存空间。
1410 | 'RETAIN' and 'PERSISTENT' do not have any effect in functions | 系统将按照一般内部变量处理。
1411 | Variable '<name>' in the variable configuration isn't updated in any task | 变量没有被task调用，因此其不会从过程数据中传递到程序中。 Example: Variable Configuration: VAR_CONFIG plc_prg.aprg.ainst.in AT %IB0 : INT; END_VAR plc_prg: index := INDEXOF(aprg); 程序 aprg 已经引用但是没有调用. 因此 plc_prg.aprg.ainst.in 永远得不到 %IB0 的实际值。
1412 | Unexpected token '<name>' in pragma {pragma name} | 用户使用的编译指令包含有在该场合不能正确使用的指令。详情请参看在线帮助。
1413 | '<name>' is not a valid key for list '<name>'. The key will be ignored | 在编译指令中使用了不存在的参数列表。请参看参数管理器获取当前列表。
1500 | Expression contains no assignment. No code was generated. | 程序未使用该表达式的运算结果，因此该语句无代码产生。
1501 | String constant passed as 'VAR_IN_OUT': '<name>' must not be overwritten! | 在POU中定义的字符串常量的内容不允许更改，因为系统忽略其大小检查。
1502 | Variable '<name>' has the same name as a POU. The POU will not be called! | POU与其定义的某个变量重名。 Example: PROGRAM a ... VAR_GLOBAL a: INT; END_VAR ... a; (* 不调用 POU 而是装入变量 a*)
1503 | The POU ‘<name>’ has no outputs. Box result is set to 'TRUE'. | 连接FBD或KOP的POU无输出。 系统自动将其设定为TRUE。
1504 | <name>’ (‘<number>’): Statement may not be executed due to the evaluation of the logical expression | 并非所有的逻辑表达式都要运行 Example: IF a AND funct(TRUE) THEN .... 如果 a 是 FALSE 则 funct 不被调用。
1505 | Side effect in '<name>'! Branch is probably not executed ! | POU的第一个输入为FALSE，由于这个原因旁边的第二个输入将不被执行。
1506 | Variable '%s' has the same name as a local action. The action will not be called! | 重新命名该变量或该动作。
1507 | Instance '<name>' has the same name as a function. The instance will not be called. | 在ST编程语言中，如果调用与某功能同名的实例，系统将执行同名功能而不是实例。
1550 | Multiple calls of the POU '<name>' in one network may lead to undesired side effects | 检查，对POU的多重调用是否是必要的。通过多重的调用可能导致不可预料的后果。
1700 | Input box without assignment. | 在CFC中有输入框未连接上，将不能产生执行代码。
1750 | Step '<name>': the minimal time is greater than the maximal time! | 请使用该步的’步属性’对话框进行时间的正确设定。
1800 | <name>(element #<element number>): Invalid watchexpression '%s' | 可视化元素中包含了无法监控的表达式，检查变量名称和占位符的替换是否无误。
1801 | '<name> (number): No Input on Expression '<name>' possible | 可视化组件的输入框使用了组合表达式，请使用单个变量替换之。
1802 | <Visualization object>(Element number): Bitmap '<name>' was not found | 名为'<Name>'的位图文件未找到,检查文件路径是否正确
1803 | '<name>'('<number>'): "The print action would not supported for web- and target visualization. | 网页可视化和目标平台可视化不支持打印操作
1804 | '<name>'('<number>'): The font '<name>' is not supported by the target. | 目标平台不支持'<name>'型字体
1805 | '<name>'('<number>'): 'Store trend data in PLC' should be set. | 要使用可视化组件实现PLC趋势数据的存储应先进行相关的设定
1806 | '<name>'('<number>'): The target setting 'Alarm handling in the PLC' should be set. | 应对'目标设定'中的'PLC报警处理'选项进行设定启用
1807 | <name> (<number>): No message window for alarms for target visualization | 动作 "message" 不支持Target-Visualization!
1850 | Input variable at %IB<number> is used in task '<name>' but updated in another task | 请检查哪个task使用这个变量是否会对编程造成不良影响，一般使用搞优先级的task刷新变量
1851 | Output variable at %IQ<number> is used in task '<name>' but updated in another task | 请检查哪个task使用这个变量是否会对编程造成不良影响，一般使用搞优先级的task刷新变量
1852 | CanOpenMaster might not be called cyclically in event task '<name>'! Set modul parameter UpdateTask! | CanOpenMaster功能块在任务'<name>'事件中未能实现循环调用! 若要实现其循环调用，请使用'模块参数'对话框正确设置运行参数并更新任务!"
1853 | A PDO (index: '<number>') might not be updated cyclically in event task '<name>' | 当前PDO由事件驱动。如果要循环调用，把这个PDO连接到IO task中
1900 | POU '<name>' (main routine) is not available in the library | 当项目作为库使用时，不能利用“启动POU” (z.B. PLC_PRG)
1901 | Access Variables and Variable Configurations are not saved in a library! | 存取变量和变量配置没有保存在库内。
1902 | '<name>': is no Library for the current machine type! | 库的对象文件是为其他设备而生成的。
1903 | <name>: is no valid Library | 文件没有实际目标所需要的格式。
1904 | The constant '<name>' hides a constant of the same name in a library | 如果用户在工程中定义了与链接库同名的常量，库中该常量将被覆盖。
1970 | Parameter manager: List '<name>' , Column '<name>', Value '<name>' could not be imported! | 请检查数据引入文件*.prm的格式是否符合当前参数管理器的设置。
1980 | Global network variables '<name>' '<name>': simultaneous reading and writing may result in loss of data! | 对全局变量'<Name>'同时读、写可能导致数据丢失
1990 | No 'VAR_CONFIG' for '<name>' | For this variable there is no address configuration available in the Variable_Configuration (VAR_CONFIG). Open window Variable_Configuration in the Resources tab and there insert the appropriate configuration (Command 'Insert 'All instance paths').请在资源选项卡中的参数设置窗口对其进行正确设置。
2500 | Task '<task name>': no cycle time specified for cyclic task | 设定task的循环时间。

Compiler Errors

Number | Error Message | Possible Cause
3100 | Code too large. Maximum size: '<number>' Byte (<number>K) | 超过最大程序空间。减小程序大小。
3101 | Total data too large. Maximum size: '<number>' Byte (<number>K) | 超出数据空间，减少变量数量。
3110 | Error in library file '<name>'. | .hex 文件不是 INTEL Hex 格式
3111 | Library '<name>' is too large. Maximum size: 64K | .hex 文件超过设定的最大容量。
3112 | Nonrelocatable instruction in library. | 文件包含有一个不可重定位的指令。不能链接库代码。
3113 | Library code overwrites function tables. | 代码和功能表的范围重叠。
3114 | Library uses more than one segment. | .hex文件中的表和代码利用不止一个字段。
3115 | Unable to assign constant to VAR_IN_OUT. Incompatible data types. | 由于数据设置在“near”(近的),但是串常数设置在“huge”（大的）或“far”（远的），因而串常数的内部指针格式不能转换成VAR_IN_OUT的内部指针格式。如有可能，改变这些目标设置。
3116 | Function tables overwrite library code or a segment boundary. | 外部库不能用于当前系统设置，需要从新编译适合当前系统的库。
3117 | <Name> (<Zahl>): Expression too complex. No more registers available | 表达式过于复杂，无法用寄存器装载处理
3120 | Current code-segment exceeds 64K. | 当前生成的代码大于64K。
3121 | POU too large." A POU may not exceed the size of 64K. | 一个POU的大小应限制在64K以下
3122 | Initialisation too large. Maximum size: 64K | 用于一个功能或一个结构化POU的初始化代码不应超过64K。
3123 | Data segment too large: segment '<Number>%s', size <size> bytes (maximum <number> bytes) | 数据存储区大于控制器指标
3124 | String-constant too large: <Number> characters (Maximum 253 characters) | 减少字符串的长度
3130 | User-Stack too small: '<number>' DWORD needed, '<number>' DWORD available. | POU调用的嵌套深度太大。在目标设置中输入一个更大的堆栈尺寸，或编译没有任选项“debug”( 可在对话框“project”(项目)“(options)”任选项“build”(建立)中设置)的建立项目。
3131 | User-Stack too small: '<number>' WORD needed, '<number>' WORD available. | 大于控制器指标
3132 | System-Stack too small: '<number>' WORD needed, '<number>' WORD available. | 大于控制器指标
3150 | Parameter <number> of function '<name>': Cannot pass the result of a IEC-function as string parameter to a C-function. | 使用一个中间变量，将IEC功能的结果赋值给该中间变量。
3160 | Can't open library file '<name>'. | 工程通过库管理器包含了'<name>'库，但是在指定的路径未能找到该库文件。
3161 | Library '<name>' contains no codesegment | 一个程序库的一个.obj文件至少应包含一个C功能。将一个空功能插入到.lib文件内，在.lib文件内尚未定义这个空功能。
3162 | Could not resolve reference in Library '<name>'(Symbol '<name>', Class '<name>', Type '<name>') | .obj文件包含一个对其他符号不能分辨的引用。请检查C编译程序的设置。
3163 | Unknown reference type in Library '<name>' (Symbol '<name>' , Class '<name>' , Type '<name>') | .obj文件包含一个引用类型，它不能被代码发生器所分辨。请检查C编译程序的设置。
3200 | "%s (%d): Boolean expression to complex | 目标系统的暂时存储器容量对表达式的规模来说显得不够。将表达式分成几个部分表达式，为此可使用对几个中间变量进行赋值。
3201 | <name> (<network>): A network must not result in more than 512 bytes of code | 不能分辨内部跳转。启动选项“利用16位跳转补偿”中的68K目标设置。
3202 | Stack overrun with nested string/array/structure function calls | 使用一嵌套的功能调用CONCAT(x,f(i))。这会导致数据丢失。将调用分成两个表达式。
3203 | Expression too complex (too many used address registers). | 将赋值分成几个表达式。
3204 | A jump exceeds 32k Bytes | 跳转范围应不超过 32767 字节。
3205 | Internal Error: Too many constant strings" In a POU there at the most 3000 string constants may be used. | 在一个POU中，最多能使用3000个常量字符串。
3206 | Function block data exceeds maximal size | 功能块程序代码上限为32Kb。
3207 | Array optimization | 计算索引时功能被调用导致最优化数组存取失败。
3208 | Conversion not implemented yet | 使用的转换功能，不是为实际代码发生器而实现的。
3209 | Operator not implemented | 使用的操作符，不是为这种数据类型和实际代码发生器而实现的。MIN(字符串1，字符串2)
3210 | Function '<name>' not found | 调用的功能不在程序中。
3211 | Max string usage exceeded | 字符串变量一个表达式中可最多使用10次。
3212 | Wrong library order at POU <POU name> | POU调用的lib命令与cslib.hex 不匹配. 检查命令.
3250 | Real not supported for 8 Bit Controller | 硬件不支持
3251 | date of day types are not supported for 8 Bit Controller | 硬件不支持
3252 | size of stack exceeds <number> bytes | 硬件不支持
3253 | Could not find hex file: '<name>' | 硬件不支持
3254 | Call to external library function could not be resolved. | 硬件不支持
3400 | An error occurred during import of Access variables | .exp文件包含一个不正确的存取变量段。
3401 | An error occurred during import of variable configuration | .exp文件包含一个不正确的配置变量段。
3402 | An error occurred during import of global variables | .exp文件包含一个不正确的全局变量段。
3403 | Could not import <name> | .exp文件中的对象<name>段不正确。
3404 | An error occurred during import of task configuration | .exp文件中的任务配置段不正确。
3405 | An error occurred during import of PLC configuration | .exp文件中的PLC配置段不正确。
3406 | Two steps with the name '<name'. Second step not imported. | .exp文件中的SFC POU段包含有相同名的两个步。在输出文件中重新命名其中的一步。
3407 | Predecessor step '<name>' not found | .exp文件中丢失步<name>。
3408 | Successor step '<name>' not found | .exp文件中丢失步<name>。
3409 | No successional transition for step '<´name>' | .exp文件中，丢失转换名，它需要步<name>作为先行步。
3410 | No successional step for transition '<name>' | .exp文件中，丢失一个步，它需要转换名<name>作为先行条件。
3411 | Step '<name>' not reachable from initial step | .exp文件中，丢失步<name>与初始步之间的连接。
3412 | Macro '<name>' not imported | 检查export 文件
3413 | Error during import of the CAMs. | export 文件包含一个CAM错误信息
3414 | Error during import of the CNC program list | export 文件包含一个错误的CNC程序。
3415 | Error during import of the Alarm configuration | export 文件包含一个错误的报警配置。
3450 | PDO'<PDO-name>': Missing COB-Id! | 点出PLC配置对话框中的“properties”（属性），并输入用于PDO<PDD Name>的一个COB ID。
3451 | Error during load: EDS-File '<name>' could not be found, but is referenced in hardware configuration! | CAN配置所需的设备文件不在正确的目录内。检查“project”（项目）“options”（选项）“目录”中的配置文件的目录设置。
3452 | The module '<name>' couldn't be created! | 用于模块<name>的设备文件不适应于当前的配置。自建立配置以来已作了修改，或者它已损坏。
3453 | The channel '<name>' couldn't be created! | 用于通道<name>的设备文件不适应于当前的配置。自建立配置以来已作了修改，或者它已损坏。
3454 | The address '<name>' points to an used memory! | 在对话框PLC配置的“setting” （设置）中，已启动选项“check for overlapping addresses” （检查重叠地址），并已检测到一个重叠。注意，区域检查是基本尺寸，它与模块的数据类型有关。在配置文件中，通过登录项“size”（尺寸），给出区域尺寸。
3455 | Error during load: GSD-File '<name>' could not be found, but is referenced in hardware configuration! | Profibu配置所需的设备文件不在正确的目录内。检查“project”（项目） “options”(选项) “目录”中的配置文件的目录设置。
3456 | The profibus device '<name>' couldn't be created! | 用于模块<name>的设备文件不适应于当前的配置。自建立配置以来已作了修改，或者它已损坏。
3457 | Error in module description! | 请检查这个模块的数据文件。
3458 | The PLC-Configuration couldn't be created! Check the configuration files. | 检查配置文件路径( 'Project' 'Options' /目录配置)
3460 | 3S_CanDrv.lib has the wrong version. | 3S_CanDrv.lib库版本号错误
3461 | 3S_CanOpenMaster.lib has the wrong version. | 3S_CanOpenMaster.lib库版本号错误
3462 | 3S_CanOpenDevice.lib has the wrong version. | 3S_CanOpenDevice.lib库版本号错误
3463 | 3S_CanOpenManager.lib has the wrong version. | 3S_CanOpenManager.lib库版本号错误
3464 | 3S_CanNetVar.lib has the wrong version. | 3S_CanOpenNetVar.lib库版本号错误
3465 | CanDevice: Sub indices have to be numerated sequentially | CAN通讯从模块的副索引应连续标号
3466 | CAN network variables: No CAN controller found in the PLC configuration | CAN总线变量：PLC配置中未发现CAN通讯控制器
3468 | CanDevice: Update task not available in the task configuration. | CAN总线驱动：任务配置中未实现任务更新
3469 | The CanOpenMaster can not be called. Please assign a task manually. | CANOpen通讯主模块不能被调用，请手动分配其任务
3470 | Invalid name in parameter UpdateTask | 在PLC Configuration打开CanMasters模块参数对话框. 检查参数刷新任务。 程序中必须指定任务。如果未指定任务设备文件将与UpdateTask设定比交。
3500 | No 'VAR_CONFIG' for '<name>' | 将用于变量的说明插入到全局变量表内，该表包含“variable_configuration”（变量—配置）。
3501 | No address in 'VAR_CONFIG' for '<name>'. | 将这个变量的一个地址分配给全局变量表，该表包含“variable_configuration”（变量—配置）。
3502 | Wrong data type for '<name>' in 'VAR_CONFIG | 在包含“variable_configuration”（变量—配置）。的全局变量表中，变量以不同于POU中的数据类型说明。
3503 | Wrong data type for '<name>' in 'VAR_CONFIG' | 在包含“variable_configuration”（变量—配置）。的全局变量表中，变量以不同于POU中的数据类型说明。
3504 | Initial values are not supported for 'VAR_CONFIG | “variable_configuration”（变量—配置）的一个变量是以地址和初始值说明的。但是，一个初始值只能为没有地址分配的输入变量而定义的。
3505 | '<name>’is no valid instance path | “variable_configuration”（变量—配置）包括一个存在的变量。
3506 | Access path expected | 在“access variables” （存取变量）的全局变量表中，一个变量的存取路径是不正确的。正确的应该是： <Identifier>:'<Access path>':<Type> <Access mode>
3507 | No address specification for 'VAR_ACCESS'-variables | “Access Variables”（存取变量）的全局变量表包含用于一个变量的地址分配。这是不允许的。有效的变量定义是：<Identifier>:'<Access path>':<Type> <Access mode>
3550 | Duplicate definition of identifier '<name>' | 使用一个相同的名来定义两个任务。重新命名其中的一个。
3551 | The task '<name>' must contain at least one program call | 插入一个程序调用或删除任务。
3552 | Event variable '<name>' in task '%s' not defined | 在任务属性的“single”（单）区域对话框中设置的一个事件变量，在项目未经全局说明。利用其他变量或全局定义该变量。
3553 | "Event variable '<name>' in task '%s' must be of type 'BOOL' | 在任务属性的“single”（单）区域对话框中，使用一个类型BOOL的变量作为事件变量。
3554 | Task entry '<name>' must be a program or global function block instance | 在该字段中，输入“program call” (程序调用)一个功能或一个不定义的POU。输入一个有效的程序名。
3555 | The task entry '<name>' contains invalid parameters | 在该字段中，所用的”append program call”（附加程序）参数不符合程序POU的说明。
3556 | Tasks are not supported by the currently selected target | 当前目标系统不支持此任务， 更改目标系统或更改任务。
3557 | Maximum number of Tasks ('<number>') exceeded | 任务数超出最大范围
3558 | Priority of task '<name>' is out of valid range between '<lower limit>' and '<upper limit>' | 任务'<name>'的优先权超出合法范围
3559 | Task '<name>': Interval-Tasks are not supported by the current target | 任务'<name>'：当前目标系统不支持任务间隔调用模式
3560 | Task '<name>': free wheeling tasks are not supported by the current target | 任务'<name>'：当前目标系统不支持任务freewheeling调用模式
3561 | Task '<name>': event tasks are not supported by the current target | 任务'<name>'：当前目标系统不支持任务触发调用模式
3562 | Task '<name>': external event tasks are not supported by the current target | 任务'<name>'：当前目标系统不支持任务外部触发调用模式
3563 | The interval of task '<name>' is out of valid range between '<lower limit>' and '<upper limit>' | 任务'<name>'的调用间隔设置超出合法范围
3564 | The external event '<name>' of task '<name>' is not supported by the current target | 当前目标系统不支持任务'<name>'所设置的外部触发事件'<name>'
3565 | Maximum number of event tasks ('<number>') exceeded | 定义的事件触发任务数超出最大范围
3566 | Maximum number of interval tasks ('<number>') exceeded | 定义的间隔运行任务数超出最大范围
3567 | Maximum number of free wheeling tasks ('<number>') exceeded | 定义的free wheeling任务数超出最大范围
3568 | Maximum number of external interval tasks ('<number>') exceeded | 定义的外部事件触发任务数超出最大范围
3569 | POU '<name>' for system event '<name>' not defined | 设定为系统事件触发的POU未定义
3570 | The tasks '<name>' and '<name>' share the same priority | 多个任务设定的优先权相同
3571 | The library 'SysLibCallback' is not included in the project! System events can not be generated. | 工程未包含SysLibCallback.lib库，不能生成系统事件
3575 | Task <'name>': the cycle time has to be a multiple of <number> μs. | 任务'<名称>': 循环时间应该是 '<数字>'μs的整倍数
3600 | Implicit variables not found! | 使用命令”rebuild all”（重建所有）。如依然得到出错消息，请于PLC制造商联系。
3601 | <name> is a reserved variable name | 这个名称是codegenerator的保留变量名. 重命名这个变量。
3610 | '<name>' not supported | 给出的属性不被编译系统的当前版本支持。
3611 | The given compile directory '<name>' is invalid | 用于编译文件的“project” （项目）—“options” （选项）—“directories”（目录）中给出的目录是无效的。
3612 | Maximum number of POUs (<number>) exceeded! Compile is aborted. | 在项目中所用的POU和数据类型太多。在“target setting/memory layout”（目标设置/存储器布局）中，修改POU的最大数。
3613 | Build canceled | 编译过程被用户删除。
3614 | Project must contain a POU named '<name>' (main routine) or a task configuration | 立一个类型”program”（程序）的初始POU，或建立一个任务配置。
3615 | <name> (main routine) must be of type program | 在项目中所用的一个初始 POU（例如 PLC_PRG）不是“Program”（程序）类型。
3616 | Programs musn't be implemented in external libraries | 应作为外部库保存的项目包含一个程序。当使用该库时，不能使用这个程序。
3617 | Out of memory | 增加你的计算机的虚拟存储器的容量。
3618 | BitAccess not supported in current code generator! | 当前设置的目标系统的代码发生器，不支持对变量的位存取。
3619 | Object file '<name>' and library '<name>' have different versions! | 检查*.lib and *.obj resp. *.hex 文件版本是否一致
3620 | The POU '<name>' must not be present inside a library | 修改POU名字
3621 | "Cannot write compile file '<name>'" | 也许这个文件的属性为只读，或者你没有权限修改这个文件。
3622 | "The symbol file '<name>' could not be created" | 也许这个文件的属性为只读，或者你没有权限修改这个文件。
3623 | "Cannot write boot project file '<name>'" | 也许这个文件的属性为只读，或者你没有权限修改这个文件。
3624 | "Target setting <targetsetting1>=<set value> not compatible with <targetsetting2>=<set value>" | 控制器类型选择错误
3700 | POU with name ‘<name>' is already in library '<name>' | 一个 POU 名已用于项目内，这一名早已用于一个库 POU。重新命名 POU。
3701 | Name used in interface is not identical with POU Name | 使用命令“project”（项目）--“rename object”(重新命名对象)，重新命名“object organizer（对象组织程序）”中的POU或在说明窗内改变POU的名。在那里，POU名必须放置在临近的关键字PROGRAM，FUNCTION或FUNCTIONBLOCK中的一个。
3702 | Overflow of identifier list | 最大为100个标示符可输入到一个变量说明内。
3703 | Duplicate definition of identifier '<name>' | 在同一个POU中同一个变量名只能声明一次
3704 | data recursion: <POU 0> -> <POU 1> -> .. -> <POU 0> | 数据存在递归调用
3705 | <Name>: VAR_IN_OUT in Top-Level-POU not allowed, if there is no Task-Configuration | PLC_PRG中不允许使用VAR_IN_OUT型变量
3720 | Address expected after 'AT' | 在关键字AT后面加一个有效地址，或修改关键字。
3721 | Only 'VAR' and 'VAR_GLOBAL' can be located to addresses | 将说明放置在一个VAR或VAR-GLOBAL说明区。
3722 | Only 'BOOL' variables allowed on bit addresses | 修改地址或修改分配地址的变量类型。
3726 | Constants can not be laid on direct addresses | 这种类型的变量不能放置在给定的地址上。
3727 | No array declaration allowed on this address | 该地址不允许定义数组
3728 | Invalid address: '<address>' | 非法的内存地址
3729 | Invalid type '<name>' at address: '<name>' | 这种类型的变量不能放置在给定地址上。例：对于以‘alignment 2’工作的一个目标系统，以下的说明是无效的：var1 AT%IB1:WORD；
3740 | Invalid type: '<name>' | 在一个变量说明中，使用无效的数据类型。
3741 | Expecting type specification | 使用一个关键字或一个操作符以代替一个有效类型标示符。
3742 | Enumeration value expected | 在枚举类型定义中，在打开的括号后，或在括号之间的逗号后面，丢失一个标示符。
3743 | Integer number expected | 枚举只能以类型INT的数初始化。
3744 | Enum constant '<name>' already defined. | 检查一下，你是否遵循了以下的枚举值定义规则： .在一个枚举定义中，所有的值都应是唯一的。 .在所有的全局枚举定义中，所有的值均应是唯一的。 .在所有的局部枚举定义中，所有的值均应是唯一的。
3745 | Subranges are only allowed on Integers! | 子范围类型只能在整数数据类型上定义。
3746 | Subrange '<name>' is not compatible with Type '<name>' | 子范围类型的范围极限设定中，有一个极限设定超出其基本类型的有效范围。
3747 | unknown string length: '<name>' | 没有一个有效的常数用于串长的定义。
3748 | More than three dimensions are not allowed for arrays | 在一个数据的定义中，给出允许的维数即大于三维。若可应用的话，使用“ARRAY OF ARRAY”（数组的数组）。
3749 | lower bound '<name>' not defined | 使用一个未定义的常数来定义一个子范围或数组类型的下限。
3750 | upper bound '<name>' not defined | 使用一个未定义的常数来定义一个子范围或数组类型的上限。
3751 | Invalid string length '<number of characters>' | 字符串长度非法
3752 | More than 9 dimensions are not allowed for nested arrays | An array can be 1- 2- or 3-dimensional. The number of dimensions reached by nesting of arrays (e.g "arr: ARRAY [0..2,0..2,0..2] OF ARRAY [0..2,0..2,0..2] OF ARRAY [0..2,0..2,0..2, 0..2] OF DINT" maximum may be 9 and is exceeded in the current error case. Reduce appropriately to max. 9 dimensions.数组嵌套使用最大不能超过9维
3760 | Error in inital value | 使用一个与类型定义相当的初始值。为了更改说明，你可使用变量的说明对话框。（SHIFT F2 或EDIT（编辑）“autodeclare”(自动说明)）。
3761 | 'VAR_IN_OUT' variables must not have an inital value. | VAR_IN_OUT型变量不允许赋初值。
3780 | VAR, VAR_INPUT, VAR_OUTPUT or VAR_IN_OUT expected | POU名后的第一行必须包含这些关键字中的一个关键字。
3781 | "'END_VAR' or identifier expected | 在说明窗内的给出行的起始位置输入一个END—VAR的有效标示符。
3782 | Unexpected end | 在说明性编辑器中：在说明部分结束处加上关键字END—VAR。在编译部分的文本编译器中：加上一个指令，它中止最后的指令顺序。
3783 | END_STRUCT' or identifier expected | 应确实弄清楚，类型说明已正确的终止。
3784 | The current target doesn't support attribute <attribute name> | 当前目标系统不支持设定的此属性
3800 | The global variables need too much memory. Increase the available memory in the project options. | 增加在对话框”project” （项目）--“options” （选项）--“build”（建立）的设定中所给出的程序段数。
3801 | The variable '<name>' is too large (<Size> Byte) | 变量使用大于1个数据段的类型。段尺寸是一个目标特定的参数并可在目标设定/存储器布局中修改。如果你在当前的目标设定中找不到它，请与你的PLC制造商联系。
3802 | Out of retain memory. Variable '<name>', <number> bytes. | 可供保持变量用的内存空间已耗尽。在目标设定存储器布局中可设定目标专用的内保存区域尺寸。如果你在对话框中找不到设定字段，请与你的PLC制造商联系。
3803 | Out of global data memory. Variable '<name>', ‚<number>’ bytes. | 可供全局变量用的内存空间已耗尽，在目标设定/存储器布局中可设定目标专用的内保存区域尺寸。如果你在对话框中找不到设定的字段。请与你的PLC供应商联系。
3820 | "'VAR_OUTPUT' and 'VAR_IN_OUT' not allowed in functions | 在一个功能中，可以定义无输出或输入-输出变量。
3821 | At least one input required for functions | 为这种功能至少附加一个输入参数。
3840 | Unknown global variable '<name>'! | 在POU中，使用一个VAR_EXTERNAL变量，对它未说明其全局变量。
3841 | Declaration of '<name>' do not match global declaration! | 在VAR_EXTERNAL变量说明中给出的类型与全局说明中的类型不匹配。
3850 | Declaration of an unpacked struct '<name>' inside a packed struct '<name>' is not allowed! | 这种定义结构将导致数据记录地址错误。
3900 | Multiple underlines in indentifier | 在变量名下除去多重下划线。
3901 | At most 4 numerical fields allowed in addresses | 有一种表达式允许直接赋值给一个地址，它有不止四层的数字域（例如 %QB0.1.1.0.1）。
3902 | Keywords must be uppercase | 对关键字应使用大写字母，或启动选项，“project” （项目）—“options”--（选项）中的“autoformat”（自动格式化）。
3903 | Invalid duration constant | 持续时间常数的计数法不符合IEC61131-3格式。
3904 | Overflow in duration constant. | 用于时间常数值不能以内部格式表示。可表示的最大值为t#49d17h2m47s295ms
3905 | Invalid date constant | 日期常数的计数法不符合IEC61131-3格式。
3906 | Invalid time of day constant | 常日期数的计数法不符合IEC61131-3格式。
3907 | Invalid date and time constant | 日期常数的计数法不符合IEC61131-3格式。
3908 | Invalid string constant | 串常数包含一个无效的字符。
4000 | Identifier expected | 在这个位置输入一个有效的标示符。
4001 | Variable '<name>' not declared | 说明变量是局部或全局。
4010 | Type mismatch: Cannot convert '<name>' to '<name>'. | 检查一下，操作符期望的是何种数据类型，并改变引起错误的变量类型，或选择其他变量。
4011 | Type mismatch in parameter '<name>' of '<name>': Cannot convert '<name>' to '<name>'. | 实际参数的数据类型不能自动转换成格式化参数的类型。使用某种类型转换方式或使用其他变量类型。
4012 | Type mismatch in parameter '<name>' of '<name>': Cannot convert '<name>' to '<name>'. | 将一个无效类型<类型 2>变量分配给输入变量'<name>'。将该变量或常数以一个类型<类型 1>变量代之，或采用一种类型转换。相应地，一个带有类型前辍的常数。
4013 | Type mismatch in output '<name>' of '<name>': Cannot convert '<name>' to '<name>'. | 将一个无效类型<类型 2>变量分配给输出变量'<name>'。将该变量或常数以一个类型<类型 1>变量代之，或采用一种类型转换。相应地，一个带有类型前辍的常数。
4014 | Typed literal: Cannot convert '<name>' to '<name> | 常数类型与前辍类型不兼容。例：SINT#255
4015 | Data type ‘<name>' illegal for direct bit access | 直接位编址只允许用于整数和“位串”数据类型。你在位存取<var1>.<bit>中，使用 REAL/LREAL 类型的变量 var1，或一个常数。
4016 | Bit index '<number>' out of range for variable of type '<name> | 你正式试图存取的一位，它不是为变量的数据类型而规定的。
4017 | 'MOD' is not defined for 'REAL | 操作符MOD只可用于整数和位串数据类型。
4020 | Variable with write access or direct address required for 'ST', 'STN', 'S', 'R' | 使用一个具有写存取的变量取代第一个操作数。
4021 | No write access to variable '%s' allowed | 使用一个具有写存取的变量取代该变量。
4022 | Operand expected | 在注释后面加上一个操作数。
4023 | Number expected after '+' or '-' | 输入一个数字。
4024 | <operator 0> or <operator 1> or ... expected before '<name>' | 在命名的位置处，输入一个有效的操作数。
4025 | ':=' or '=>' expected before '<name>' | 在命名的位置处，输入二种操作符中的一种。
4026 | 'BITADR' expects a bit address or a variable on a bit address | 使用一个有效的位地址。 (e.g. %IX0.1).
4027 | Integer number or symbolic constant expected | 输入一个整数或一个有效常数的标示符。
4028 | 'INI' operator needs function block instance or data unit type instance | 检查INI操作符所使用的变量的数据类型。
4029 | Nested calls of the same function are not possible. | 不允许对同一个功能进行嵌套Example: fun1(a,fun1(b,c,d),e); Use a intermediate table.
4030 | Expressions and constants are not allowed as operands of 'ADR' | 使用一个变量或一个直接地址取代常数或表达式。
4031 | 'ADR' is not allowed on bits! Use 'BITADR' instead. | 使用BITADR。请注：BITADR功能不返回一个物理的内存地址。
4032 | ’<number>’ operands are too few for '<name>'. At least ‘<number>’ are needed | 检查一下，命名的操作符需要多少操作数，并添加缺少的操作数。
4033 | ’<number>’ operands are too many for '<name>'. At least ‘<number>’ are needed | 检查一下，命名的操作符需要多少操作数，并除去多余的操作数。
4034 | Division by 0 | 你正在一个常数表达式中以0作为除数。如果你要引起一个运行时的错误，使用—如可以应用的话—一个有值为0的变量。
4035 | ADR must not be applied on 'VAR CONSTANT' if 'replaced constants' is activated | 使用直接值的一个常数地址存取是不可能的。如可应用的话，取消“Project”（项目）→“Options”（选项）→“Build”（建立）对话框中的选项“Replace Constants”（取代常数）。
4040 | Label '<name>' is not defined | 使用名（标记名）定义一个标记，或将名（标记名）改变成一个定义的标记名。
4041 | Duplicate definition of label '<name>' | 在POU中，标记<name>是重复定义的。重新命名标记或从重复定义中除去一个名。
4042 | No more than %d labels in sequence are allowed | 跳转标记数限制在“<Anzahl>”。插入一个空指令。
4043 | Format of label invalid. A label must be a name optionally followed by a colon. | 标记名是无效的，或在表达式中丢失了冒号。
4050 | POU '%s' is not defined | 利用命令“Project”（项目）→“Add Object”（附加对象）来定义有名〈name〉的一个 POU，或将〈name〉改变成一个已定义的 POU 名。
4051 | '%s' is no function | 替代<name>，使用一个在项目或在库中定义的功能名。
4052 | '%s' must be a declared instance of FB '%s' | 使用一个在项目中定义的数据类型<name>的实例，或将（实例名）类型改为<name>。
4053 | '%s' is no valid box or operator | 使用一个POU名或一个在项目定义的操作符来取代<name>。
4054 | POU name expected as parameter of 'INDEXOF' | 给出的参数不是一个有效的POU名。
4060 | 'VAR_IN_OUT' parameter '%s' of '%s' needs variable with write access as input. | 具有写存取的变量必须移交给VAR_IN_OUT参数，这是因为，一个VAR_IN_OUT可在POU内修改。
4061 | 'VAR_IN_OUT' parameter '%s' of '%s' must be used. | VAR_IN_OUT参数必须有移交的具有写存取的变量，这是因为，一个VAR_IN_OUT可在POU中修改。
4062 | No external access to 'VAR_IN_OUT' parameter '%s' of '%s'. | VAR_IN_OUT参数只能在POU内写入或读取，这是因为它们是由引用转交的。
4063 | 'VAR_IN_OUT' parameter '%s' of '%s' must not be used with bit addresses. | 一个位地址不是一个有效的物理地址。转交一个变量或一个直接的非位地址。
4064 | 'VAR_IN_OUT' must not be overwritten in local action call! | 在局部动作调用中，删除用于VAR_IN_OUT变量的参数集。
4070 | The POU contains a too complex expression | 通过将表达式分成几个表达式来降代嵌套深度。为此，可使用中间变量。
4071 | Network too complex | 将网络分成几个网络。
4072 | Inconsistent use of an action identifier in FB type ('<name>') and instance ('<name>'). | You have defined two actions of a function block fb: e.g. a1 and a2, but in the call of one of the actions in the FBD you are using a type (string within the box, e.g. fb.a1 different to that used in the instancename (e.g. inst.a2, above box). Correct the name correspondingly into the name of the desired action.在FB类型’<名称>’和实例’<名称>’的动作标识符应用不一致
4100 | '^' needs a pointer type | 应该定义为指针类型
4110 | '[<index>]' needs array variable | [<index>]用于一个变量，它不是作为有ARRAY OF的一个数组加以说明的。
4111 | Index expression of an array must be of type 'INT' | 使用正确类型的表达式，或类型转换。
4112 | Too many indexes for array | 检查索引数（1.2或.3），这些索引是说明数组的，除去多余的索引。
4113 | Too few indexes for array | 检查索引数（1.2或.3），这些索引是说明数组的，添加缺少的索引。
4114 | One of the constant indizes is not within the array range | 确实弄清楚，所用的索引是在数组界限之内。
4120 | '.' needs structure variable" | 句点左边的标识符必须是一个类型STRUCT或FUNCTION_BLOCK的变量，或是名为一个FUNCTION或一个PROGRAM的变量。
4121 | '<name>' is not a component of <object name> | 成分<name>不包括在对象<object name>的定义内。
4122 | '%s' is not an input variable of the called function block | 检查一下，被调用的功能块的输入变量，并将’<name>’改变成这些变量中的一个变量。
4200 | 'LD' expected | 在IL编辑器中，在跳转符号后面，至少应插入一个LD指令。
4201 | IL Operator expected | 每个IL指令必须用一个操作符或一个跳转符开始。
4202 | Unexpected end of text in brackets | 在文本后插入一个关闭括号。
4203 | <name> in brackets not allowed | 操作符<name>在一个IL括号表达式中是无效的。（无效的是：JMP,RET,CAL,LDN,LD,TIME）
4204 | Closing bracket with no corresponding opening bracket | 插入一个打开括号，或除去这个关闭括号。
4205 | No comma allowed after ')' | 在关闭括号后面除去逗号。
4206 | Label in brackets not allowed | 移去跳转符号，使其在括号外面。
4207 | 'N' modifier requires operand of type 'BOOL', 'BYTE', 'WORD' or 'DWORD' | N修改符需要可执行布尔求反的数据类型。
4208 | Conditional Operator requires type 'BOOL' | 确实弄清楚，表达式给出布尔结果，或应用类型转换。
4209 | Function name not allowed here | 使用一个变量或一个常数来替换这个功能。
4210 | 'CAL', 'CALC' and 'CALN' require a function block instance as operand | 说明一个你要调用的功能块的实例。
4211 | Comments are only allowed at the end of line in IL | 将注释移到行的结束处，或移到附加行。
4212 | Accumulator is invalid before conditional statement | 未定义这个累加器。如果一个指令是领先的，它未提交一个结果。
4213 | 'S' and 'R' require 'BOOL' operand | 在这个位置使用一个布尔变量。
4250 | Another 'ST' statement or end of POU expected | 该行不是以一个有效的ST指令开始。
4251 | Too many parameters in function '%s' | 给出的参数多于功能定义中所说明的参数。
4252 | Too few parameters in function '%s' | 给出的参数少于功能定义中所说明的参数。
4253 | 'IF' or 'ELSIF' require 'BOOL' expression as condition | 确实弄清楚，IF或ELSIF的条件是一个布尔表达式。
4254 | 'WHILE' requires 'BOOL' expression as condition | 确实弄清楚，“WHILE”后的条件是一个布尔表达式。
4255 | 'UNTIL' requires 'BOOL' expression as condition | 确实弄清楚，“UNTIL”后的条件是一个布尔表达式。
4256 | 'NOT' requires 'BOOL' operand | 确实弄清楚，“NOT”后的条件是一个布尔表达式。
4257 | Variable of 'FOR' statement must be of type 'INT' | 确实弄清楚，计数器变量是一个整数或位串数据类型（例如DINT，DWORD）。
4258 | Expression in 'FOR' statement is no variable with write access | 使用一个有写存取的变量来替换计数器变量。
4259 | Start value in 'FOR' statement is no variable with write access | “FOR”指令中的起始值必须与计数器变量类型相兼容。
4260 | End value of 'FOR' statement must be of type 'INT' | “FOR”指令中的结束值必须与计数器变量类型相兼容。
4261 | Increment value of 'FOR' statement must be of type 'INT' | “FOR”指令中的起始值必须与计数器变量类型相兼容。
4262 | 'EXIT' outside a loop | 只能在“FOR”，“WHILE”或“UNTIL”指令内使用“EXIT”。
4263 | Expecting Number, 'ELSE' or 'END_CASE' | 在一个“CASE”表达式内，你只能使用一个数或一个“ELSE”指令，或结束指令“END_CASE”。
4264 | 'CASE' requires selector of an integer type | 确实弄清楚，选择器是一种整数或位串数据类型的（例如 DINT，DWORD）。
4265 | Number expected after ',' | 在 CASE 选择器的枚举时，在逗号后面必须插入一个其它选择器。
4266 | At least one statement is required | 插入一个指令，至一个分号。
4267 | Function block call requires function block instance | 功能块调用中的标识符没有实例。说明所需要的功能块的一个实例，或利用一个早已定义的实例。
4268 | Expression expected | 在这里插入一个表达式。
4269 | 'END_CASE' expected after 'ELSE'-branch | 使用一个“END_CASE”来终止“ELSE”部分后面的“CASE”指令。
4270 | 'CASE' constant '%ld' already used | 一个“CASE”选择器在一个“CASE”指令内只能使用一次。
4271 | The lower border of the range is greater than the upper border. | 修改选择器的区域边界，使其下部边界不大于上部边界。
4272 | Exptecting parameter '%s' at place %d in call of '%s'! | 你可以这样的方式编辑一个功能调用，使它还包含参数名，而不仅包含参数值。但是，无论如何，参数的位置（顺序）必须与功能定义中相同。
4273 | Parts of the 'CASE'-Range '%ld..%ld' already used in Range '%ld..%ld' | 确实型清楚，用于 CASE 指令中的选择器区域不出现重叠。
4274 | Multiple 'ELSE' branch in 'CASE' statement | 一个 CASE 指令不能包含多于一个“ELSE”指令。
4300 | Jump requires 'BOOL' as input type | 确实型清楚，相应于 RETURN 指令的跳转输入是一个布尔表达式。
4301 | POU '%s' need exactly %d inputs | 输入数不对应于在 POU 定义中给出的 VAR_INPUT 和VAR_IN_OUT 变量数。
4302 | POU '%s' need exactly %d outputs | 输出数不对应于在 POU 定义中给出的 VAR_OUTPUT 变量数。
4303 | '%s' is no operator | 使用一个有效的操作符来替换〈name〉。
4320 | Non-boolean expression '<name>' used with contact | 用于一个接点的开关信号必须是一个布尔表达式。
4321 | Non-boolean expression '<name>' used with coil | 一个线圈的输出变量必须是类型 BOOL。
4330 | Expression expected at input 'EN' of the box '<name>' | 将一个输入或一个表达式分配给 POU“〈name〉”的输入 EN。
4331 | Expression expected at input '<number>' of the box '<name>' | 没有分配操作符 POU 的输入 〈number〉
4332 | Expression expected at input '<name>' of the box '<name>' | POU 的输入是类型 VAR_IN_OUT 而且没有分配。
4333 | Identifier in jump expected | 给出的跳转标记不是一个有效的标识符。
4334 | Expression expected at the input of jump | 将一个布尔表达分配给 RETURN 指令的输入。如这是 TRUE，则将执行这个跳转。
4335 | Expression expected at the input of the return | 将一个布尔表达式分配给 RETURN 指令的输入。如这是TRUE，则将执行这个跳转。
4336 | Expression expected at the input of the output | 将一个合适的表达式分配给输出框
4337 | Identifier for input expected | 在输入框中插入一个有效的表达式或标识符。
4338 | Box '%s' has no inputs | 对操作符 POU〈name〉输入分配有效的表达式。
4339 | Typemismatch at output: Cannot convert '<name>' to '<name>'. | 输出框中的表达式类型与应分配给它的表达式类型不兼容。
4340 | Jump requires 'BOOL' as input type | 确实弄清楚，跳转的输入是一个布尔表达式。
4341 | Return requires 'BOOL' as input type | 确实型清楚，用于 RETURN 指令的输入是一个布尔表达式。
4342 | Expression expected at input 'EN' of the box '<name>' | 将一个有效的布尔表达式分配给框的 EN 输入。
4343 | Values of Constants: ‘<name>’ | 框“〈name〉”的输入“〈name〉”作为 VAR_INPUT CONSTANT说明。但是，在对话框“编辑参数”中，已将一个类型不兼容的表确定式发配给这个 POU 框
4344 | 'S' and 'R' require 'BOOL' operand | 在相应的“复位”指令的设定后面，插入一个有效的布尔表达式
4345 | Invalid Type for parameter '<name>' of '<name>': Cannot convert '<type>' to '<type>'. | 分配给 POU 框“〈name〉”的输入“〈name〉”的一个表达式，类型是不兼容。
4346 | Not allowed to use a constant as an output" | 你只能将一个输出分配给一个变量或一个有写存取的直接地址。
4347 | 'VAR_IN_OUT' parameter needs variable with write access as input. | 只有有写存取的变量才可移交给 VAR_IN_OUT 参数，这是因为这些变量可在 POU 内修改。
4348 | Invalid program name '<name>'. A variable with the same name exists already. | You have inserted a program box in the CFC editor, which has the same name as a (global) variable already existing in your project. You must rename accordingly.无效的程序名称 '<名称>'. 具有同样名称的一个变量已经存在
4349 | Input or output in POU <name> has been deleted: Check all connections to the box. This errormessage disappears only after the CFC was edited | Correct the POU appropriately.在POU <名称>中的输入或输出已经被删除: 检查功能块的所有连接.只有当CFC编辑后此错误消息才会消失。"
4350 | An SFC-Action can not be accessed from outside! | SFC 动作只能在它们被定义的 SFC POU 内才能调用。
4351 | Step name is no identifier: '<name>' | 重新命令名步，或选择一个有效的标识符作为步名。
4352 | Extra characters following valid step name:'<name>' | 在步名中除去无效的字符。
4353 | Step name duplicated: '<name>' | 重新命名一个步名。
4354 | Jump to undefined Step: '<name>' | 选择一个现有的步名作为相应的跳转的目标。插入一个有名的步，“〈name〉”
4355 | A transition must not have any side effects (Assignments, FB-Calls etc.) | 一次转换必须是一个布尔表达式。
4356 | Jump without valid Step Name: '<name>' | 使用一个有效标识符作为跳转目标（标记）。
4357 | IEC-Library not found | 检查一下，库 iecsfc.lib 是否插入在库管理程序内，以及在“Project”（项目）→“Options”（选项）→“Paths”（路径）中规定的库路径是否正确。
4358 | Action not declared: '%s'. | 确实弄清楚，在对象组织程序内，IEC 步的动作是在SFC POU下面插入的，而且在编辑器中，动作名插入在限定符右边的框内。
4359 | Invalid Qualifier: '%s' | 在动作名左边的框内，输入一个用于 IEC 动作的限定符。
4360 | Time Constant expected after qualifier '%s' | 紧邻动作名左侧的框，在一个限定符后输入一个时间常数。
4361 | '%s' is not the name of an action | 紧邻限定线右侧的框，输入一个动作名，或在项目中定义的一个变量名。
4362 | Nonboolean expression used in action: '%s' | 插入一个布尔变量或一个有效的动作名。
4363 | IEC-Step name already used for variable: '<name>' | 请重新命名步或变量。
4364 | A transition must be a boolean expression | 转换表达式的结果必须是类型 BOOL。
4365 | Time Constant expected after qualifier '<name>' | 打开步“〈name〉”的对话框“步属性”，并输入一个有效的时间变量或时间常数。
4366 | The label of the parallel branch is no valid identifier: '<name>' | 在三角形符号旁输入一个有效的标识符，它标记跳转符。
4367 | The label '<name>' is already used | 早已有一个跳转符或一个步使用过这个名。请相应地重新命名。
4368 | Action '<name>' is used in multiple step chains, where one is containing the other! | 动作“〈name〉”用于 POU 以及 POU 的一个或几个动作。
4369 | Exactly one network required for a transition | 对于一个转换使用了几个 FBD 相应的 LD 网络。请减少到1个网络。
4370 | Additional lines found after correct IL-transition | 在转换结束处除去不必要的线路。
4371 | Invalid characters following valid expression: '<name> | 在转换结束处除去不必要的字符。
4372 | Step '<name>': Time limit needs type 'TIME' | Define the time limits of the step in the step attributes by using a variable of type TIME or by a time definition in correct format (e.g. "t#200ms").<名称>'步: 时间限制需要'TIME'类型
4373 | IEC-actions are only allowed with SFC-POUs | There is an action assigned to a non-SFC-POU (see in the Object Organizer), which is programmed in SFC and which contains IEC actions. Replace this action by one which contains no IEC actions.只在 SFC-POUs下允许IEC-行为
4374 | Step expected instead of transition '<name>' | The SFC POU is corrupt, possibly due to any export-import actions.期望步代替'<名称>'转换
4375 | Transition expected instead of step '<name>' | The SFC POU is corrupt, possibly due to any export-import actions.期望转换代替'<name>'步
4376 | Step expected after transition '<name>' | The SFC POU is corrupt, possibly due to any export-import actions.<名称>'转换后期望步
4377 | Transition expected after step '<name>' | The SFC POU is corrupt, possibly due to any export-import actions.'<名称>'步后期望转换
4500 | Unrecognized variable or address | 在项目内未说明监视变量。通过按〈F2〉按钮，你得到列出说明变量的输入辅助。
4501 | Extra characters following valid watch expression | 除去多余的记号。
4520 | Error in Pragma: Flag expected before '<name>'! | 附注不正确。检查一下，“〈name〉”是否是一个有效的标记。
4521 | Error in Pragma: Unexpected element '<name>'! | 检查一下，附注是否正确编写。
4522 | "flag off' pragma expected! | 丢失断开附注，添加一个“flag off”（除去标记）指令。
4550 | Index out of defined range : Variable OD "number>, Line <line number>. | 保证索引是在目标设定/网络功能度中所规定的区域内。
4551 | Subindex out of defined range : Variable OD "number>, Line <line number>. | 保证子索引是在目标设定/网络功能度中所规定的区域内。
4552 | Index out of defined range : Parameter OD "number>, Line <line number>. | 保证索引是在目标设定/网络功能度中所规定的区域内。
4553 | Subindex out of defined range : Parameter OD "number>, Line <line number>. | 保证子索引是在目标设定/网络功能度中所规定的区域内。
4554 | Variablename invalid: Variable OD <number>, Line <line number>. | 保证在字段“variable”（变量）中的一个有效项目变量。使用相应于全局变量〈variable name〉的语法〈POU 名〉〈变量名〉
4555 | Empty table-entry, input not optional: Parameter OD <number>, Line <line number> | 你必须在这个字段作出一个登录项。
4556 | Empty table-entry, input not optional: Variable OD <number>, Line <number> | 你必须在这个字段作出一个登录项。
4557 | The required parameter memory is too large | The maximum size of data which can be loaded via parameter lists of type Parameters to the controller has been exceeded. This size is defined by the target system. Information on the data size is displayed in the message window at compilation. Reduce the parameter lists size.必须的参数内存太大
4558 | The required variable memory is too large | The maximum size of data which can be loaded via parameter lists of type Variables to the controller has been exceeded. This size is defined by the target system. Information on the data size is displayed in the message window at compilation. Reduce the parameter lists size.必须的变量内存太大
4560 | Invalid value: Dictionary '<Name>', column '<Name>', line '<line number>' | Check this entry. It depends on the currently used column (attribute) definition which entries are valid for this field. This definition is given by the target-specific XML description file of the Parameter Manager resp. by the standard settings which will be used if there is no description file.错误的值: 路径'<名称>', 纵列'<名称>', 行'<行号>
4561 | Column not defined: '<Name>' | Entries in a column of the parameter list refer to another column, which is not defined however. The column definitions are given by the description file (XML) of the Parameter Manager for the current target. If a description file is not available, standard settings are used.纵列没有定义: '<名称>
4562 | Index/subindex used already: Dictionary '<Name>', line '<Line Number>' | The Index/Subindex-combination must be unique throughout all parameter lists, because it can be used for the parameter access. Correct the indices correspondingly.索引/分索引 已经存在: 路径'<名称>', 行'<行号>'
4563 | Identifier '<Name>' used already: Dictionary '<Name>', line '<Line Number>' | The name must be unique throughout all parameter lists, because it can be used for parameter access.标识符'<名称>' 已经存在: 路径'<名称>', 行'<行号>'
4564 | Index '<Name>' is out of range: Dictionary '<Name>', line '<Line Number>' | Enter an index which is within the range defined in the target settings, category network functionality in field 'Index range...' for the respective list types (Variables, Parameters, Mappings).在目标设置定义范围内输入一个索引。
4565 | Subindex '<Name>' is out of range: Dictionary '<Name>', line '<Line Number>' | Enter an subindex which is within the range defined in the target settings, category network functionality in field 'SubIndex range'.在目标设置定义范围内输入一个分索引。
4566 | An error occurred during import of the parameter manager | 用户应该输入一个在参数管理器中包含错误信息的输出文件。检查*.exp 文件。
4600 | Networkvariables: '<name>' expression is not from type bool! | Make sure that the variable defined in the properties dialog of the network variables list at option 'Transmit on event', is of type BOOL.网络变量: '<名称>' 表达式不是布尔类型。"
4601 | Network variables '<name>': No cyclic or freewheeling task for network variable exchange found | There is no cyclic or free-wheeling task resp. PLC_PRG in the project where the network variables of type CAN or UDP of the given list are used (only declaration is not sufficient!). You must take care that the variables are used in an appropriate task or in PLC_PRG. If you want to use them in several tasks, regard, that at data exchange the task with the highest priority will be regarded.网络变量 '<名称>': 发现网络变量交换没有循环或无限循环。"
4602 | '<name of network variables list>': The object uses UDP port '<port number>' instead of '<port number>' | 在指定的网络变量表设置中，一个端口号已经应用，它和在全局变量文件夹中找到的第一个网络变量表应用的端口号不同。当心所有的网络变量表应用同一个端口！
4620 | Unused variables have been found in the project. | 工程中发现没有使用的变量。
4621 | There are overlaps at the assignment of variables to memory areas via the „AT"-declaration. | 变量分配内存空间时发生交迭。
4622 | IEC addresses assigned to the same memory area are referenced in more than one task. | IEC地址分配的同一个内存空间涉及到多个任务。
4623 | The project gains write access to the same memory area at more than one place. | 工程在多于一个地方同时获得对同一个内存的写入权。
4650 | AxisGroup '<Name>': Task '<Name>' does not exist. | In the PLC Configuration in the definition of the axis group (dialog 'Module parameters', column 'Value') there is a name defined for the task which is controlling the data transfer of this axis group, which is not known in the Task Configuration. Correct Task Configuration resp. PLC Configuration correspondingly.轴组'<名称>': 任务'<名称>' 不存在
4651 | AxisGroup '<Name>': Cycletime (dwCycle) not set. | In dialog 'Module parameters' of the axis group enter a value for the cycle time (dwCycle).轴组'<名称>': 没有设置循环时间(dwCycle)."
4670 | CNC program '<Name>': Global variable '<Name>' not found. | In the CNC program a global variable is used (e.g. $glob_var$), which is not defined in the project. Add the appropriate declaration resp. correct the assignment to the variable in the CNC program.CNC 程序'<名称>': 没有找到全局变量 '<名称>'
4671 | CNC program '<Name>': Variable '<Name>' has an incompatible type. | There is a variable assigned in a instruction of the CNC program , which is declared of a data type which is not valid in this place. Use another variable resp. correct the type specification.CNC 程序'<名称>': 变量'<名称>' 具有矛盾的类型
4685 | CAM '<Name>': CAM table type unknown. | Check the data type which is specified in the CAM Editor dialog ''Compile options.." for the equidistant resp. element optimized point table.凸轮'<名称>':未知的凸轮表类型."
4686 | CAM '<Name>': CAM point exceeds datatype range. | In this CAM points are used, which are out of the data range specified for the point table. For the current range definition see dialog 'Compile options..' in the CAM-Editor.凸轮'<名称>': 凸轮上的点超出了数据类型范围."
4700 | '<Number>' ('<Name>'): Watch expression '<Name>' is not a numeric variable. | In the configuration of the visualization a variable is used which is not a number, as required in this place (e.g. at the configuration of XOffset or Angle values etc.).<编号>' ('<名称>'): 监视表达式 '<名称>' 不是数字变量."
4701 | '<Name>' ('<Number>'): Watch expression '<name>' is not of type BOOL. | In the configuration of the visualization a variable is used which is not of type BOOL, as required in this place.<名称>' ('<编号>'): 监视表达式 '<名称>' 不是布尔类型."
4702 | '<Name>' ('<Number>'): Watch expression '<name>' is not of type STRING. | The visualization contains a variable which is not of type STRING although this is required in this place (e.g. at the tooltip configuration)."'<名称>' ('<编号>'): 监视表达式 '<名称>' 不是字符串类型."
4703 | '<Name>' ('<Number>' ): Invalid watch expression '<Name>' | 可视化窗口包含了错误的变量。
4704 | '<Name>'('<Number>'): Invalid initial value in watchlist '<Name>'. | In this watchlist, used in a visualization (INTERN command in category Input), there is a erroneous initial value. 检查所用的表。
4705 | '<name>' ('<number>'): No valid alarm group assigned to alarm table. | 在报警表配置对话框中输入一个有效的报警组。（报警种类表）
4900 | Invalid type for conversion | 当前选择的代码转换器不支持你所用的类型转换。
4901 | Internal error: Overflow in array access! | 数组范围超过32位变量，减少数组索引范围。


Command Line/Command File Commands

TwinCAT PLC Control: Command Line Commands

命令行/命令文件命令

命令行命令

当启动 TwinCAT PLC Control 时, 你可以将命令加入到命令行中，在程序执行过程中将这类命令插入在程序内。这些命令以一个“/”符号开始。不考虑使用大小写。命令的执行顺序是从左到右。

Command | Description
/debug |
/online |
/run |
/show ... | 可作出 TwinCAT PLC Control 窗口的设置。
/show hide | 窗口不显示，也不在任务栏显示。
/show icon | 窗口在显示时将最小化。
/show max | 窗口在显示时将最大化。
/show normal | 窗口将显示它在上次关闭期间相同的状态。
/out <outfile> | 所有消息都在消息窗口内显示，而且写入在文件〈outfile〉内。
/cmd <cmdfile> | 起动后执行〈cmdfile〉内的命令。

命令行的结构有如下所示：

"<Path of the TwinCAT PLC Control-Exe file >""<Path of the project>"/<Command1>/<Command2>...

一个命令行的例子:

"D:\dir1 TwinCAT PLC Control" "C:\projects\ampel.pro" /show hide /cmd command.cmd

程序 ampel.pro 被打开, 但是没有窗体. 将执行包括在命令文件 command.cmd 内的各个命令。

命令文件 (cmdfile) 命令

下表列出了所有命令文件 (<cmdfile>)命令。 通过命令行调用命令文件(如上所示)。 命令不分大小写。 命令行会在信息窗口显示，并保存在信息文件中 (见下文)。附加命令 "@" 放在前面. 忽略分号(;)后面的符号(注释)。

online菜单命令:

Commands | Description
online login | 登入下载程序 ('Online Login')
online logout | 登出('Online' 'Logout')
online run | 运行程序 ('Online' 'Run')
online sim | 开启仿真模式 ('Online' 'Simulation')
online sim off | 关闭仿真模式 ('Online' 'Simulation')

file 菜单命令:

Commands | Description
file new | 新建一个程序 ('File' 'New').
file open <projectfile> | 程序 <projectfile> 被打开('File' 'Open').
file close | 关闭当前程序 ('File' 'Close').
file save | 保存当前程序 ('File' 'Save').
file saveas <projectfile> | 程序另存为 <projectfile> ('File' 'Save as').
file quit | 关闭TwinCAT PLC Control ('File' 'Exit').

project菜单命令:

Commands | Description
project compile | "Rebuild all" 当前程序('Project' 'Rebuild all').
project check | check当前程序 ('Project' 'Check').
project build | build当前程序 ('Project' 'Build').
project import <file1> ... <fileN> | 导入程序文件 <file1> ... <fileN> 到当前程序('Project' 'Import').
project export <expfile> | 导出当前程序到程序文件 <expfile> ('Project' 'Export')
project expmul <expfile> | Each object of the current project will be exported in an own file, which gets the name of the object. 每个被命名的现有程序都会被导入到一个自有文件夹中。

message file控制命令:

Commands | Description
out open <msgfile> | 打开 <msgfile>信息文件. 记录新的信息到这个文件
out close | 关闭当前信息文件
out clear | 删除当前显示的所有信息

messages控制命令:

Commands | Description
echo on | 显示命令行
echo off | 不显示命令行
echo <text> | 信息窗内显示<text>

replace命令:

Commands | Description
replace ok replace yes | 替换
replace no | 不替换
replace noall | 都不替换
replace yesall | 全部替换

对话框默认参数控制命令:

Commands | Description
query on | 对话框需要用户输入
query off ok | 所有对话框都点'OK' 按钮.
query off no | 所有对话框都点 'No' 按钮.
query off cancel | 所有对话框都点 'Cancel' 按钮.

Debug 命令:

Commands | Description
debug | 在命令行中相当于”/debug”命令

command files调用命令:

Commands | Description
call <parameter1>... <parameter10> | 命令文件将作为子程序调用。最多可有10个参数。在被调用的文件里，参数可设定$0~$9。

library设定命令:

Commands | Description
dir lib <libdir> | <libdir> 作为库目录
dir compile <compiledir> | <compiledir>作为编译文件的目录

执行CMDFILEs时的暂停命令:

Commands | Description
delay 5000 | 暂停5秒

Watch and Receipt Manager控制命令:

Commands | Description
watchlist load <file> | 打开监视表文件<file> ('Extras' 'Load Watch List').
watchlist save <file> | 保存监视表文件<file> ('Extras' 'Save Watch List').
watchlist set <text> | 重命名监视表文件 <text> ('Extras' 'Rename Watch List').
watchlist read | 刷新监视表数据 ('Extras' 'Read Receipt').
watchlist write | 保存监视表数据 ('Extras' 'Write Receipt').

library命令:

Commands | Description
library add <library file1> <library file2> .. <library fileN> | 为当前程序添加库文件。如果文件路径为相对路径，那么库目录就是根目录
library delete [<library1> <library2> .. <libraryN>] | 删除库文件，如果没有指定库文件名那么就移除所有的库文件。

copying objects命令:

Commands | Description
object copy <source project file> <source path> <target path> | 将对象从源项目文件的规定路径复制到已打开的项目目标路径。如果源路径是一个对象名，则复制这个名。若它是一个文件夹，则复制这个文件夹下的所有对象。在某种场合，复制源文件夹下的文件夹结构。如尚不存在目标路径，则建立这个路径。

system 调用命令:

Commands | Description
system <command> | 完成规定的系统命令。

online模式命令:

Commands | Description
Reset | 如果你已用一个特定值将变量初始化，该命令就会将变量复位到该初始化值。
ResetAll | 该命令将包括保持型变量在内的所有变量复位到它们的初始化值。
CreateBootproject | 在控制器上创建启动程序
ChooseRuntime <text> | 选择运行系统 例如:选择运行系统 172.16.77.23.1.1:811 或 5.2.122.255.1.1:801

command file例子:

如下所示的命令文件将打开项目文件 ampel.pro，然后装入一个作为 w.wtc 保存的监视表，接着启动应用程序并将变量值（经一秒钟延时后）写入到监视表 watch.wtc（该表将被保存），最后关闭项目。

file open C:\work\projects\ampel.pro
query off ok
watchlist load c:\work\w.wtc
online login
online run
delay 1000
CreateBootproject
watchlist read
watchlist save c:\work\watch.wtc
online logout
file close


PLC Data Types Overview

TwinCAT PLC Control: Data Types

概述

当编程时，你可以使用标准类型和用户定义的数据类型，分配给数据类型的每个标识符将指示保留多少储存器空间和保存什么类型的数值。

注：

不同的数据覆盖不同的数值范围。如果使用的类型转换是从较大类型到较小类型的转换，则可能丢失信息。

标准数据类型 | 用户定义的数据类型
BOOL | ARRAY
BYTE | POINTER
WORD | ENUM (枚举的数据类型)
DWORD | STRUCT (结构)
SINT | ALIAS (派生的数据类型)
USINT | 子范围数据类型
INT |
UINT |
DINT |
UDINT |
LINT (64 位整型 TwinCAT 目前不支持) |
ULINT (无符号 64 位整型，TwinCAT 目前不支持) |
REAL |
LREAL |
STRING |
TIME |
TIME_OF_DAY (TOD) |
DATE |
DATE_AND_TIME (DT) |


BOOL

BOOL 类型变量的值为 TRUE 和 FALSE。

类型 | 内存使用
BOOL | 8 位

注意:

如果在内存中的最低位被置位（例如 2#00000001 ），则 BOOL 类型变量为“true”（真）。如果内存中没有被置位的位，则BOOL变量为FALSE 例如 2#00000000)。所有其它值都不能被正确地进行转换，并显示为 (***INVALID: 16#xy *** ，联机监视时)。类似的问题是可能出现的，例如，在 PLC 程序中使用了重叠的内存范围。

示例:

布尔型变量和字节型变量在内存中占据相同的空间。

PROGRAM MAIN
VAR
    bBool AT%MB0 	: BOOL;
    nByte AT%MB0 	: BYTE := 3;
    bIsTRUE 		: BOOL;
END_VAR
IF bBool THEN
    bIsTRUE := TRUE;
ELSE
    bIsTRUE := FALSE;
END_IF

程序启动后的联机显示：


BYTE

整型数据类型

类型 | 下限 | 上限 | 内存
BYTE | 0 | 255 | 8 位


WORD

整型数据类型。

类型 | 下限 | 上限 | 占用内存
WORD | 0 | 65535 | 16 位


DWORD

双字数据类型。 .

类型 | 下限 | 上限 | 占用内存
DWORD | 0 | 4294967295 | 32 Bit


SINT

有符号（短）整型数据类型。

类型 | 下限 | 上限 | 占用内存
SINT | -128 | 127 | 8 位


USINT

无符号（短）整型数据类型.

类型 | 下限 | 上限 | 占用内存
USINT | 0 | 255 | 8 位


INT

整型数据类型。

类型 | 下限 | 上限 | 占用内存
INT | -32768 | 32767 | 16 位


UINT

无符号整型数据类型。

类型 | 下限 | 上限 | 占用内存
UINT | 0 | 65535 | 16 位


DINT

有符号的双整型数据类型。

类型 | 下限 | 上限 | 占用内存
DINT | -2147483648 | 2147483647 | 32 位


UDINT

无符号双整型数据类型。

类型 | 下限 | 上限 | 占用内存
UDINT | 0 | 4294967295 | 32 位


REAL

32 位浮点型。表示为有理数。

类型 | 下限 | 上限 | 占用内存
REAL | ~ -3.402823 x 1038 | ~ 3.402823 x 1038 | 32 位


LREAL

64 位浮点型数据类型。需要表示成有理数。

类型 | 下限 | 上限 | 占用内存
LREAL | ~ -1.79769313486231E308 | ~ 1.79769313486232E308 | 64位


TIME

时间以 ms 表示，并在内部作为 DWORD 进行处理 。

类型 | 下限 | 上限 | 占用内存
TIME | T#0ms | T#71582m47s295ms | 32 Bit


TIME_OF_DAY TOD

TwinCAT PLC Control: Standard Data Types

TIME_OF_DAY

TOD

一天中的时间，以秒表示，并像DWORD一样在内部进行处理。

类型 | 下限 | 上限 | 占用内存
TIME_OF_DAY TOD | TOD#00:00 | TOD#1193:02:47.295 | 32 Bit


DATE

日期在内部作为 DWORD 进行处理，最高位表示 1 秒。

类型 | 下限 | 上限 | 占用内存
DATE | D#1970-01-01 | D#2106-02-06 | 32 位


DATE_AND_TIME DT

TwinCAT PLC Control: Standard Data Types

DATE_AND_TIME

DT

日期和时间。最高位表示 1 秒。数据类型在内部作为 DWORD 进行处理

类型 | 下限 | 上限 | 占用内存
DATE_AND_TIME DT | DT#1970-01-01-00:00 | DT#2106-02-06-06:28:15 | 32 位


ENUM

TwinCAT PLC Control: User Data Types

枚举（ENUM）

枚举是用户定义的数据类型，它由一定数量的字符串常数组成。这些常数作为枚举值。在整个项目中均可识别枚举值，即使它们是在一个 POU 中作为本地声明。最好在对象管理器（Object Organizer ）的数据类型（Data types）属性页中，将枚举值作为对象创建。它们以关键字 TYPE 开始，并以 END_TYPE 结束。

语法：

TYPE <Identifier>:(<Enum_0> ,<Enum_1>, ...,<Enum_n>);END_TYPE

<Identifier> 可以采用枚举值中的一个，并被初始化为第一个枚举值，这些值和所有数据兼容，也就是说，当你使用这些值完成操作时，就像使用 INT 数据时所完成的操作一样。你可以给 <Identifier> 赋值一个数据 x 。如果枚举值还没有进行初始化，则初始化值将从 0 开始依次递增，当初始化时，应该清楚这些初始化值是逐渐增加的。当运行时，将验证这些数据值的有效性。

示例：

在对象管理器的数据类型（Data types）中定义                                                                                TRAFFIC_SIGNAL: (Red, Yellow, Green:=10); (*The initial
value for each of the colors is red 0, yellow 1, green 10 *)
主程序中写入                                                                                                      TRAFFIC_SIGNAL:=0; (* The value of the traffic signal is red*)
FOR i:= Red TO Green DO
i := i + 1;
END_FOR;

相同的枚举值不能被多次使用。

示例：

TRAFFIC_SIGNAL: (red, yellow, green);
COLOR: (blue, white, red);

错误：red 不能同时用于 TRAFFIC_SIGNAL 和 COLOR 。


STRUCT

TwinCAT PLC Control: User Data Types

结构（STRUCT）

在对象管理器（Object Organizer）的数据类型（Data Types）属性页中，结构作为对象进行创建。并使用关键字 TYPE 开始，END_TYPE 结束。结构声明的语法如下：

TYPE <Structurename>:
STRUCT
<Declaration of Variables 1>
.
.
<Declaration of Variables n>
END_STRUCT
END_TYPE

<Structurename>（结构名）是可以在整个项目中识别的一种类型，并可以像标准数据类型一样使用。允许结构内部联锁。唯一的限制是变量不能放置地址符（不允许使用 AT 声明！）。
定义 Polygonline（多边形线）的结构示例：

TYPE Polygonline:
STRUCT
Start:ARRAY [1..2] OF INT;
Point1:ARRAY [1..2] OF INT;
Point2:ARRAY [1..2] OF INT;
Point3:ARRAY [1..2] OF INT;
Point4:ARRAY [1..2] OF INT;
End:ARRAY [1..2] OF INT;
END_STRUCT
END_TYPE

使用以下语法，可以操作结构成员：

<Structure_Name>.<Componentname>

例如，如果你有一个命名为“Week”的结构，该结构包含一个命名为“Monday”的成员，则你可以按照以下方式对其进行操作：Week.Monday。

注意：

由于不同的对齐排列，在不同的硬件平台上（例如CX1000和CX90xx），结构和数组或许有不同的配置和大小。

在数据交换时，大小和结构的对齐一定要相同。

用名称ST_ALIGN_SAMPLE定义的一个结构示例：

TYPE ST_ALIGN_SAMPLE:
STRUCT
_diField1 : DINT;
_byField1 : BYTE;
_iField : INT;
_byField2 : BYTE;
_diField2 : DINT;
_pField : POINTER TO BYTE;
END_STRUCT
END_TYPE

在CX90xx (RISC)平台上，结构ST_ALIGN_SAMPLE的组员有如下的大小和补偿：

_diField1 (DINT), Offset = 0 (16#0), Size = 4
_byField1 (BYTE), Offset = 4 (16#4), Size = 1
_iField (INT), Offset = 6 (16#6), Size = 2
_byField2 (BYTE), Offset = 8 (16#8), Size = 1
_diField2 (DINT), Offset = 12 (16#C), Size = 4
_pField (POINTER TO BYTE), Offset = 16 (16#10), Size = 4

带有包（4）和所谓多余字节的自然对齐的总体大小：20

在CX10xx平台上，结构ST_ALIGN_SAMPLE的组员有如下的大小和补偿：

_diField1 (DINT), Offset = 0 (16#0), Size = 4
_byField1 (BYTE), Offset = 4 (16#4), Size = 1
_iField (INT), Offset = 5 (16#5), Size = 2
_byField2 (BYTE), Offset = 7 (16#7), Size = 1
_diField2 (DINT), Offset = 8 (16#8), Size = 4
_pField (POINTER TO BYTE), Offset = 12 (16#C), Size = 4

总体大小: 16

用于带有多余字节表示的CX90xx平台的结构ST_ALIGN_SAMPLE 的显示：

TYPE
ST_ALIGN_SAMPLE:
STRUCT
_diField1    : DINT;
_byField1    : BYTE;
_byPadding   : BYTE;
_iField      : INT;
_byField2    : BYTE;
_a_byPadding : ARRAY[0..2] OF BYTE;
_diField2    : DINT;
_pField      : POINTER TO BYTE;
END_STRUCT
END_TYPE


TYPE Alias

TwinCAT PLC Control: User Data Types

参考类型（别名）

你可以使用由用户定义的派生数据类型，为变量、常数或功能块创建一个可供选择的名称。可以在对象管理器的数据类型属性页中，将你的参考类型值作为对象进行创建。该参考类型值以关键字 TYPE 开始，以 END_TYPE 结束。

语法：

TYPE <Identifier>: <Assignment term>;
END_TYPE

示例：

TYPE message:STRING[50];
END_TYPE;


Operators overview

TwinCAT PLC Control: IEC Operators

概述

TwinCAT PLC Control 支持所有的 IEC 操作符。与标准功能不同，这些操作符在整个项目内是被隐式识别的。在 POU 中，操作符和功能（function）的使用方法相同。


ABS

返回一个数的绝对值。例如ABS(-2) 等于 2。
以下的输入和输出变量类型组合是允许的。

IN | OUT
INT | INT, REAL, WORD, DWORD, DINT
REAL | REAL
BYTE | INT, REAL, BYTE, WORD, DWORD, DINT
WORD | INT, REAL, WORD, DWORD, DINT
DWORD | REAL, DWORD, DINT
SINT | REAL
USINT | REAL
UINT | INT, REAL, WORD, DWORD, DINT, UDINT, UINT
DINT | REAL, DWORD, DINT
UDINT | REAL, DWORD, DINT, UDINT


ACOS

返回一个数的反余弦 (反余弦函数) 。
输入类型可以是 BYTE, WORD, DWORD, INT, DINT, REAL, SINT, USINT, UINT, UDINT, 输出类型必须是 REAL。


ASIN

返回一个数的反正弦.
输入类型可以为 BYTE, WORD, DWORD, INT, DINT, REAL, SINT, USINT, UINT, UDINT, 输出类型必须是 REAL.


ATAN

返回一个数的反正切（反正切函数）
输入可以是类型 BYTE，WORD，DWORD，INT，DINT，REAL，SINT，USINT，UINT，UDINT。输出必须是类型 REAL。


COS

返回一个数的余弦。
输入可以是类型 BYTE，WORD，DWORD，INT，DINT，REAL，SINT，USINT，UINT，UDINT。输出必须是类型 REAL。


EXP

返回指数函数。
输入可以是类型 BYTE，WORD，DWORD，INT，DINT，REAL，SINT，USINT，UINT，UDINT。输出必须是类型 REAL。


EXPT

一个变量带另一个变量的指数： OUT = IN1IN2.
输入1和输入 2可以是类型 BYTE， WORD， DWORD， INT， DINT， REAL， SINT， USINT， UINT， UDINT，输出必须是类型 REAL。

IL 语言的示例：

LD 7
EXPT 2
ST var1 (* Result is 49 *)

ST 语言的示例：

var1 := EXPT(7,2);


LN

返回一个数的自然对数，输入可以是类型 BYTE，WORD，DWORD，INT，DINT，REAL，SINT，USINT，UINT，UDINT。输出必须是类型 REAL。


LOG

返回一个以 10 为底的对数，输入可以是类型 BYTE，WORD，DWORD，INT，DINT，REAL，SINT，USINT，UINT，UDINT，输出必须是类型 REAL。


SIN

返回一个数的正弦。输入可以是类型 BYTE，WORD，DWORD，INT，DINT，REAL，SINT，USINT，UINT，UDINT。输出必须是类型 REAL。


SQRT

返回一个数的平方根。输入可以是类型 BYTE，WORD，DWORD，INT，DINT，REAL，SINT，USINT，UINT，UDINT。输出必须是类型 REAL。


TAN

返回一个数的正切。输入可以是类型 BYTE，WORD，DWORD，INT，DINT，REAL，SINT，USINT，UINT，UDINT。输出必须是类型 REAL。


ADD

变量类型为: BYTE, WORD, DWORD, SINT, USINT, INT, UINT, DINT, UDINT, REAL 和 LREAL。时间类型的变量也可以相加(例如, t#45s + t#50s = t#1m35s).

Example in IL:

LD 7
ADD 2,4,7
ST var1

Example in ST:

var1 := 7+2+4+7;

Example in FBD:


MUL

变量类型为：BYTE，WORD，DWORD，SINT，USINT，INT，UINT，DINT，UDINT，REAL 和 LREAL 的乘法。

IL 语言的示例：

LD 7
MUL 2,4,7
ST var1

ST 语言的示例:

var1 := 7*2*4*7;

FBD 语言的示例:


SUB

一个变量减去另一个变量的减法，两者的类型均为：BYTE，WORD，DWORD，SINT，USINT，INT，UINT， DINT， UDINT， REAL 和 LREAL。 亦可以从一个时间变量减去另一个时间变量， 结果是第三个 TIME 类型变量。注意，负的时间值是没有意义的。

IL 语言的示例：

LD 7
SUB 8
ST var1

ST 语言的示例：

var1 := 7-2;

FBD 语言的示例：


DIV

一个变量除以另一个变量的除法，两者均为类型：BYTE，WORD，DWORD，SINT，USINT，INT，UINT，DINT，UDINT，REAL 和 LREAL。

IL 语言的示例：

LD 8
DIV 2
ST var1

ST 语言的示例：

var1 := 8/2;

FBD 语言的示例：

注：

如果在你的项目中以“CheckDivByte”、 “CheckDivWord”、 “CheckDivDWordand”和“CheckDivReal”为名定义功能。并且使用操作符 DIV，则可以通过这些功能检验除数值，例如，避免除以 0，功能必须是上述列出的名字。


MOD

一个变量以另一个变量为模的模式运算除法，两者的数据类型均为：BYTE，WORD，DWORD，SINT，USINT，INT，UINT，DINT，UDINT，REAL 和 LREAL。这个功能的结果是除法运算的余数。其结果是一个整数。

IL 语言的示例：

LD 9
MOD 2
ST var1 (* Result is 1 *)

ST 语言的示例：

var1 := 9 MOD 2;

FBD 语言的示例：

类似的功能

LMOD


MOVE

将一个变量分配给另一个同类型的变量。因为MOVE指令在图形编辑器 LD, CFC中作为一个BOX， 所以附带了EN/EN0（unlocking）功能变量。而在FBD编辑器中没有这个变量。

CFC中含有EN/EN0功能的例子：

当en_i为TRUE时，var1 值才将被赋值给var2。

IL 语言的示例：

LD ivar1
MOVE
ST ivar2 (* Ergebnis: var2 erhält Wert von var1 *)

( ! you get the same result with:

LD ivar1
ST ivar2

)

ST语言的示例:

ivar2 := MOVE(ivar1);

( ! you get the same result with:

ivar2 := ivar1;

)


AND

按位“与” 操作。操作数必须是类型 BOOL，BYTE，WORD 或 DWORD。

Example in IL:

var1 :BYTE;
LD 2#1001_0011
AND 2#1000_1010
ST var1 (* Result is 2#1000_0010 *)

Example in ST:

var1 := 2#1001_0011 AND 2#1000_1010

Example in FBD:


OR

按位“OR”（或）操作。操作数必须是类型 BOOL，BYTE，WORD 或 DWORD。

IL 语言的示例：

var1 :BYTE;
LD 2#1001_0011
OR 2#1000_1010
ST var1 (* Result is 2#1001_1011 *)

ST 语言的示例：

Var1 := 2#1001_0011 OR 2#1000_1010

FBD 语言的示例：


XOR

按位“XOR”（异或）操作数。操作数必须是类型 BOOL，BYTE，WORD 或 DWORD。

IL 语言的示例：

Var1 :BYTE;
LD 2#1001_0011
XOR 2#1000_1010
ST Var1 (* Result is 2#0001_1001 *)

ST 语言的示例：

Var1 := 2#1001_0011 XOR 2#1000_1010

FBD 语言的示例：

注：

请注意，扩展形式 XOR POU (输入多于2 个)没有采用标准的形式实现。输入成对地进行“异或”→“运算”，然后相应的结果彼此进行比较。


NOT

按位“NOT”（非）操作。操作数必须是类型 BOOL，BYTE，WORD 或 DWORD。

IL 语言的示例：

Var1 :BYTE;
LD 2#1001_0011
NOT
ST Var1 (* Result is 2#0110_1100 *)

ST 语言的示例：

Var1 := NOT 2#1001_0011;

FBD 语言的示例：


SHR

操作数的按位右移：A:= SHR (IN, N)A, 其中 IN 和 N 必须是类型 BYTE, WORD 或 DWORD。IN 右移 N 位，其左边以 0 填充。

注：

  • 请注意，关于算术运算位的数量实际上和输入变量的数据类型有关！如输入变量是一个常数，应考虑可能的最小数据类型，输出变量对算术运算绝不会有影响。

ST 语言的示例：

IL 语言的示例：

LD 32
SHR 2
ST Var1 (* Result is 8 *)


ROL

操作数按位循环左移：A:= ROL (IN, N)A，其中 IN 和 N 必须是类型 BYTE, WORD 或 DWORD。IN 按位左移 N 次而最左位再从右边插入。

注：

  • 请注意，关于算术运算位的数量实际上和输入变量的数据类型有关！如输入变量是一个常数，应考虑可能的最小数据类型，输出变量对算术运算绝不会有影响。

ST 语言的示例：

IL 语言的示例：

Var1 :BYTE;
LD 2#1001_0011
ROL 3
ST Var1 (*结果是 2#1001_1100*)


SEL

二值选择。

OUT := SEL(G, IN0, IN1)

含义：

OUT := IN0 if G=FALSE;OUT := IN1 if G=TRUE.

IN0、 IN1 和 OUT 可以是任何类型的变量， G 必须是类型 BOOL。 如 G 是FALSE， 则选择的结果是 IN0；如果 G 是 TRUE，则选择的结果是 IN1。

IL 语言的示例：

LD TRUE
SEL 3,4
ST Var1 (*结果是4*)

LD FALSE
SEL 3,4
ST Var1 (*结果是3*)

FBD 语言的示例：

注：

为了优化运行之目的，可进行如下处理：附加在 IN0 上的表达式，只有当 G 是FALSE 时才进行计算。附加在 IN1上的表达式，只有当 G 是 TRUE 时才进行计算。


MAX
TwinCAT PLC Control: IEC Operators

MAX

最大值功能 返回两个数值中较大的数。

OUT := MAX(IN0, IN1)

IN0, IN1 和 OUT 可以是任何类型的变量。

IL 语言的示例：

LD 90
MAX 30
MAX 40
MAX 77
ST Var1 (* Result is 90 *)

FBD 语言的示例：


MIN

最小值功能。 返回两个数值中较小的数。

OUT := MIN(IN0, IN1)

IN0, IN1 和 OUT 可以是任何类型的变量。

IL 语言的示例：

LD 90
MIN 30
MIN 40
MIN 77
ST Var1 (* Result is 30 *)

FBD 语言的示例：


LIMIT

极限值

OUT := LIMIT(Min, IN, Max)

含义：

OUT := MIN (MAX (IN, Min), Max)

对结果而言，上限是 Max，下限是 Min。IN 的值超过 Max，则返回 Max。IN 的值低于 Min，则返回 Min。

IN 和 OUT 可以是任何类型的变量。

IL 语言的示例：

LD 90
LIMIT 30,80
ST Var1 (* 结果是80*)


MUX

多值选择器

OUT := MUX(K, IN0,...,INn)

含义：

OUT := INK.

IN0, ...,INn 和 OUT 可以是任何类型的变量。K 必须是 BYTE, WORD, DWORD, SINT, USINT, INT, UINT, DINT 或 UDINT。MUX 从一组数值中选择第 K 个值。

IL 语言的示例：

LD 0
MUX 30,40,50,60,70,80
ST Var1 (* 结果是 30 *)

注：

注意：发生在INK前的输入表达式不会进行处理，这样会节省处理的运行时间。


GT

大于

当第一个操作数的值大于第二个操作数的值时， 则布尔操作符返回值 TRUE。 操作数可以是 BOOL, BYTE, WORD, DWORD, SINT, USINT, INT, UINT, DINT, UDINT, REAL, LREAL, TIME, DATE, TIME_OF_DAY, DATE_AND_TIME 和 STRING。

IL 语言的示例：

LD 20
GT 30
ST Var1 (* Result is FALSE *)

ST 语言的示例：

VAR1 := 20 > 30 > 40 > 50 > 60 > 70;

FBD 语言的示例：


LT

小于

当第一个操作数的值小于第二个操作数的值时， 则布尔操作符返回值 TRUE。 操作数可以是 BOOL, BYTE, WORD, DWORD, SINT, USINT, INT, UINT, DINT, UDINT, REAL, LREAL, TIME, DATE, TIME_OF_DAY, DATE_AND_TIME 和 STRING。

IL 语言的示例：

LD 20
LT 30
ST Var1 (* Result is TRUE *)

ST 语言的示例：

VAR1 := 20 < 30;

FBD 语言的示例：


LE

小于或等于

当第一个操作数的值小于或等于第二个操作数的值时， 则布尔操作符返回值 TRUE。 操作数可以是 BOOL, BYTE, WORD, DWORD, SINT, USINT, INT, UINT, DINT, UDINT, REAL, LREAL, TIME, DATE, TIME_OF_DAY, DATE_AND_TIME 和 STRING。

IL 语言的示例：

LD 20
LE 30
ST Var1 (* Result is TRUE *)

IL 语言的示例：

VAR1 := 20 <= 30;

FBD 语言的示例：


GE

大于或等于

当第一个操作数的值大于或等于第二个操作数的值，则布尔操作符返回值 TRUE。操作数可以是 BOOL，BYTE，WORD，DWORD，SINT，USINT，INT，UINT，DINT，UDINT，REAL，LREAL，TIME，DATE，TI-ME_OF_DAY, DATE_AND_TIME 和 STRING。

L 语言的示例：

LD 60
GE 40
ST Var1 (* Result is TRUE *)

ST 语言的示例：

VAR1 := 60 >= 40;

FBD 语言的示例：


EQ

等于

当第一个操作数的值等于第二个操作数的值， 则布尔操作符返回值 TRUE。 操作数可以是 BOOL， BYTE，WORD， DWORD， SINT， USINT， INT， UINT， DINT， UDINT， REAL， LREAL， TIME， DATE， TI-ME_OF_DAY, DATE_AND_TIME 和 STRING。

IL 语言的示例：

LD 40
EQ 40
ST Var1 (* Result is TRUE *)

ST 语言的示例：

VAR1 := 40 = 40;

FBD 语言的示例：


NE

不等于

当操作数不相等时， 则布尔操作符返回值 TRUE。 操作数可以是 BOOL， BYTE， WORD， DWORD， SINT，USINT，INT，UINT，DINT，UDINT，REAL，LREAL，TIME，DATE，TI-ME_OF_DAY, DATE_AND_TIME 和 STRING。

IL 语言的示例：

LD 40
NE 40
ST Var1 (*结果是FALSE*)

ST 语言的示例：

VAR1 := 40 <> 40;

FBD 语言的示例：


INDEXOF

执行这个功能以找出用于一个 POU 的内部索引。

ST 语言的示例:

var1 := INDEXOF(POU2);


SIZEOF

执行这个功能以确定给出的数据类型所需要的字节数量。

IL 语言的示例：

arr1:ARRAY[0..4] OF INT;
var1:INT;
LD arr1
SIZEOF
ST var1 (*结果是10*)


ADR

TwinCAT PLC Control: Other Operators

ADR (地址操作符)

地址功能

ADR 为 DWORD类型其值为变量的地址。这个地址可以被传送到与制造商相关的功能中，并作为一个指针进行处理，或者它可以分配给项目中的一个指针。

Attention:

在在线更改之后，还可以对某些地址方面的数据加以更改。请注意这些指向这些地址指针。

Example in ST:

dwVar := ADR(bVar);

Example in IL:

LD var1
ADR
ST var2


ADRINST

TwinCAT PLC Control: Other Operators

ADRINST(程序地址操作符)

取出程序段或功能块的地址(ADRINST 与 C++ 里面的指令相同).


^ Content operator

TwinCAT PLC Control: Other Operators

^ (内容操作符)

通过在指针标示符后添加内容操作符 "^"，则可提取指针内容。
ST语言示例:

pt:POINTER TO INT;
var_int1:INT;
var_int2:INT;
pt := ADR(var_int1);
var_int2:=pt^;


CAL

TwinCAT PLC Control: Other Operators

CAL (调用操作符)

调用一个功能块

在 IL 语言中通过 CAL 调用一个功能块实例。输入变量应放在功能块实例名称右边的圆括号内。
示例：一个功能块的调用实例 Inst，输入变量 Par1 和 Par2 分别是 0 和 TRUE。

CAL INST(PAR1 := 0, PAR2 := TRUE)


BITADR

BITADR 返回变量的位地址

Example in ST:

bOFF AT%QX10.1 : BOOL;
iBitAdr : BYTE;

iBitAdr := BITADR( bOFF ); (* returns 81 *)


BOOL_TO Conversions

TwinCAT PLC Control: IEC Operators

BOOL_TO 转换

从 BOOL 类型转换为其它类型的变量:对于数值型变量而言，当操作数是 TRUE 时结果是 1，当操作数是 FALSE 时结果是 0。如果是 STRING 类型变量，结果为"TRUE" 或 "FALSE"。

ST 语言的示例：

i:=BOOL_TO_INT(TRUE); (* 结果是 1 *)
str:=BOOL_TO_STRING(TRUE); (* 结果是 'TRUE' *)
t:=BOOL_TO_TIME(TRUE); (* 结果是 T#1ms *)
tof:=BOOL_TO_TOD(TRUE); (* 结果是 TOD#00:00:00.001 *)
dat:=BOOL_TO_DATE(FALSE); (* 结果是 D#1970-01-01 *)
dandt:=BOOL_TO_DT(TRUE); (* 结果是 DT#1970-01-01-00:00:01 *)


TO_BOOL converting

TwinCAT PLC Control: IEC Operators

TO_BOOL 转换

从另一个变量类型到布尔变量类型的转换：当操作数不等于 0 时，结果是 TRUE 。操作数等于 0 时，结果是 FALSE。对字符串类型，当操作数是 “TRUE”时，结果是TRUE，否则结果是 FALSE。

ST 语言的示例：

b := BYTE_TO_BOOL(2#11010101); (* 结果是 TRUE *)
b := INT_TO_BOOL(0); (* 结果是 FALSE *)
b := TIME_TO_BOOL(T#5ms); (* 结果是 TRUE *)
b := STRING_TO_BOOL('TRUE'); (* 结果是 TRUE *)


STRING_TO converting

TwinCAT PLC Control: IEC Operators

STRING_TO 转换

从变量类型 STRING 转换为一个不同的变量类型：该变量必须在目标变量类型中包含一个有效的值，否则其结果是 0。

ST 语言的示例：

b :=STRING_TO_BOOL('TRUE'); (* 结果是 TRUE *)
w :=STRING_TO_WORD('abc34'); (* 结果是 0 *)
t :=STRING_TO_TIME('T#127ms'); (* 结果是 T#127ms *)


TO_STRING converting

TwinCAT PLC Control: IEC Operators

TO_STRING 转换

从不同变量类型转换为 STRING。

ST 语言的示例：

str:=BOOL_TO_STRING(TRUE); (** 结果是 'TRUE' *)
str :=TIME_TO_STRING(T#12ms); (* 结果是 'T#12ms' *)
str :=DATE_TO_STRING(D#2002-08-18); (* 结果是 'D#2002-08-18' *)
str:=TOD_TO_STRING(TOD#14:01:05.123); (* 结果是 'TOD#14:01:05.123' *)
str:=DT_TO_STRING(DT#1998-02-13-14:20); (* 结果是 'DT#1998-02-13-14:20' *)
k := LREAL_TO_STRING(); (* 结果是 '1.4' *)


TIME_TO converting

TwinCAT PLC Control: IEC Operators

TIME_TO 转换

从变量类型 TIME 转换为一个不同的变量类型：时间在内部保存为 DWORD 格式，单位[ms]。接着这个值将被转换。当你将一个较大的类型转换为一个较小的类型时，则有丢失部分信息的风险。对 STRING 类型变量而言，结果是一个时间常数。

ST 语言的示例：

str :=TIME_TO_STRING(T#12ms); (* 结果是 'T#12ms' *)
dw:=TIME_TO_DWORD(T#5m); (* 结果是 300000 *)


TRUNC

从 REAL 类型转换为 INT 类型。只采用该数据的整数部分。当从一个较大的类型转换为一个较小的类型时，则有丢失部分信息的风险。

ST 语言的示例：

i:=TRUNC(1.9); (* 结果是 1 *).

i:=TRUNC(-1.4); (* 结果是 -1 *).

IL 语言的示例：

LD 2.7
TRUNC
GE %MW8

类似的功能

LTRUNC

FLOOR


BOOL constant

TwinCAT PLC Control: Operands

BOOL 常数

BOOL 常数为逻辑值 TRUE （真）和逻辑值 FALSE（假）。


DATE constant

TwinCAT PLC Control: Operands

DATE 常数

这些常数可以用来输入日期。声明一个 DATE 常数时，起始符为“d”,“D”,“DATE”或“date”后跟随一个“#”号。然后你就可以按照年-月-日的格式输入任何日期。

例如：

DATE#1996-05-06
d#1972-03-29


TOD constant

TwinCAT PLC Control: Operands

TIME_OF_DAY 常数

使用这种类型常数可以保存一天中的不同时间。一个 TIME_OF_DAY 常数的声明使用起始符“tod#”,“TOD#”，“TIME_OF_DAY#”或“time_of_day#”，后跟随一个时间格式为：小时：分：秒的时间。秒值可以是实数也可以是小数。

示例：

TIME_OF_DAY#15:36:30.123
tod#00:00:00


DT constant

TwinCAT PLC Control: Operands

DATE_AND_TIME 常数

日期常数和一天中的时间常数可以合并起来构成一个所谓的 DATE_AND_TIME 常数。 DATE_AND_TIME 常数的起始符为“dt#”,“DT#”，“DATE_AND_TIME#”或“date_and_time#”。在日期之后用（-）字符连接时间。

示例：

DATE_AND_TIME#1996-05-06-15:36:30
dt#1972-03-29-00:00:00


REAL-/LREAL constant

TwinCAT PLC Control: Operands

REAL/LREAL常数

REAL 和 LREAL 常数可以使用十进制小数和指数形式表示。使用带小数点的美国格式表示实数（REAL/LREAL）。

示例:

7.4 取代 7,4
1.64e+009 取代 1,64e+009


Variables Addressed

TwinCAT PLC 控制: Operands

地址

通过使用专用的字符序列，可以直接显示不同的内存定位。这个序列采用百分号 "%"，一个范围前缀，一个大小范围前缀，以及一个或多个由空格分隔的自然数组合。支持以下的范围前缀：

前缀 | 说明
I | 输入
Q | 输出
M | 内存定位

支持以下大小范围的前缀：

前缀 | 说明
X | 位 （1位）
B | 字节（8 位）
W | 字（16 位）
D | 双字（32 位）
* | 配置变量(VAR_CONFIG)

示例： %QX75.1 (*%Q75输出位75*) %IW215 (*输入字215*) %QB7 (*输出字节7*) %MD48 (*内存定位中的第48个双字的位置*)

注：
如果没有明确的指定单个位地址，那么布尔变量将被分配字节地址。

示例：变量值 varbool1 AT %QW0 的变化，将影响 QX0.0 到 QX0.7。

内存定位

你可以使用任何支持的大小范围来访问内存定位。例如，地址 %MD48 对应内存定位区中的地址字节为48,49，50，和51内存位置区，因为双字的大小是4个字节。你可以使用相同的方法访问字，字节甚至是位：地址 %MX5.0 允许你访问第 5 个字的第 1 位（位通常使用字格式进行保存）。

注： 		使用其它平台的注意：
对于带有ARM平台的CX9xxx和CP，不应使用4-字节的排列。

示例：

rMyVar1          AT %MW0      ] : REAL; rMyVar2          AT %MW4      ] : REAL;


Variables, Array, Struct, Fb, Programm

TwinCAT PLC Control: Operands

存取数组、结构和 POU 变量

二维数组的成员可以使用以下语法进行存取：

<Fieldname>[Index1, Index2]

结构变量可以使用以下语法进行存取：

<Structurename>.<Variablenname>

功能块和程序变量可以使用以下语法进行存取：

<Functionblockname>.<Variablename>


Variables, function

TwinCAT PLC Control: Operands

Functions（功能）

在 ST 语言中，功能调用可以作为操作数出现。

示例：

Result := Fct(7) + 3;


System flags overview

TwinCAT PLC Control: Operands

系统标志

系统标志是隐式声明的变量，对每个专用的 PLC 来说是各不相同的。使用命令“Insert”（插入）→“Operand”（操作数），可以查找系统可用的系统标志。在“Input Assistant”（输入助手）对话框中，选择“System Variable”（系统变量）类别。


SYSTEMINFO

VAR_GLOBAL
    SystemInfo     AT%MB32768(* 实际地址可能不同!*) : SYSTEMINFOTYPE;
END_VAR

系统标志是隐式声明的变量，对每个专用的 PLC 来说是各不相同的。类型 “SYSTEMINFOTYPE”在系统库中声明，因此，该库必须包含在库管理器内。

开发环境 | 目标系统类型 | 包含的 PLC 库
TwinCAT v2.7.0 | PC (i386) | PLCSystem.Lib
TwinCAT v2.8.0 | PC (i386) | TcSystem.Lib


SYSTEMTASKINFOARR

VAR_GLOBAL
    SystemTaskInfoArr 	AT%MB32832(*实际地址可能不同!*)	: ARRAY[1..4] OF SYSTEMTASKINFOTYPE;
END_VAR

系统标志是隐式声明的变量，对每个专用的 PLC 来说是各不相同的。类型 “SYSTEMINFOTYPE”在系统库中声明，因此，这个库必须包含在库管理器内。该数组的索引是 task-Id，当你在任务中调用功能块 GETCURTASKINDEX 时可以得到这个 task-Id。

开发环境 | 目标系统类型 | 包含的 PLC 库
TwinCAT v2.7.0 | PC (i386) | PLCSystem.Lib
TwinCAT v2.8.0 | PC (i386) | TcSystem.Lib


CheckBounds

TwinCAT PLC Control: System Functions

CheckBounds 功能

如果你在项目中以 CheckBounds 为名定义一个功能，则可以在该项目中检验范围溢出！该功能名的定义是固定的，并且只能使用该标识符。关于如何实现这个功能的示例，请参见下例：

注:

CheckBound 功能可能会导致增加系统的负载。CheckBounds 仅用于测试目的。

CheckBounds 功能: DINT

VAR_INPUT
    index, lower, upper : DINT;
END_VAR

实现 CheckBounds 功能示例:

IF index<lower THEN
    CheckBounds := lower;
ELSIF index>upper THEN
    CheckBounds := upper;
ELSE
    CheckBounds := index;
END_IF

下面是测试 CheckBounds 功能的典型程序，它可以对一个定义数组进行超出边界检验。CheckBounds 功能可以确认 TRUE 不能分配给A[10]，而是将其分配给仍然有效的上边界 A[7]。因此，CheckBounds 功能可用来纠正超出数组边界的扩展。


CheckDivByte

TwinCAT PLC Control: System Functions

CheckDivByte 功能

如果在项目中以 CheckDivByte 为名定义一个功能，并且使用了操作符 DIV，则可以通过该功能检查除数的值，例如，避免被 0 除，该功能名的定义是固定的，并且只能使用该标识符。

注:

CheckDivByte 功能可能会导致增加系统的负载。CheckDivByte 仅用于测试目的。

CheckDivByte 功能：BYTE

VAR_INPUT
    divisor : BYTE;
END_VAR

实现 CheckDivByte 功能的示例:

IF divisor = 0 THEN
    CheckDivByte := 1;(**)
ELSE
    CheckDivByte := divisor;
END_IF


CheckDivReal

TwinCAT PLC Control: System Functions

CheckDivReal 功能

如果你在项目中以 CheckDivReal 为名定义一个功能，并且使用了操作符 DIV，则可以通过该功能检查除数的值，例如，避免被 0 除，该功能名的定义是固定的，并且只能使用该标识符。

注:

CheckDivReal 功能可能会导致增加系统的负载。CheckDivReal 仅用于测试目的。

CheckDivReal 功能: REAL

VAR_INPUT
    divisor : REAL;
END_VAR

实现 CheckDivReal 的示例:

IF divisor = 0 THEN
    CheckDivReal := 1;
ELSE
    CheckDivReal := divisor;
END_IF

操作符 DIV 使用 CheckDivReal 的输出作为除数。下面的程序示例可以避免被 0 除，除数（d）设定为从0 到1，因此其结果是 799。


CheckDivWord

TwinCAT PLC Control: System Functions

CheckDivWord 功能

如果你在项目中以 CheckDivWord 为名定义一个功能，并且使用了操作符 DIV，则可以通过该功能检查除数的值，例如，避免被 0 除，该功能名的定义是固定的，并且只能使用该标识符。

注:

CheckDivWord 功能可能会导致增加系统的装载量。CheckDivWord 仅用于测试目的。

CheckDivWord 功能: WORD

VAR_INPUT
    divisor : WORD;
END_VAR

实现 CheckDivWord 功能的示例:

IF divisor = 0 THEN
    CheckDivWord := 1;
ELSE
    CheckDivWord := divisor;
END_IF


CheckDivDWord

TwinCAT PLC Control: System Functions

CheckDivDWord 功能

如果你在项目中以 CheckDivDWord 为名定义一个功能，并且使用了操作符 DIV，则可以通过该功能检查除数的值，例如，避免被 0 除，该功能名的定义是固定的，并且只能使用该标识符。

注:

CheckDivDWord 功能可能会导致增加系统的负载。CheckDivDWord 仅用于测试目的。

CheckDivDWord 功能: DWORD

VAR_INPUT
    divisor : DWORD;
END_VAR

实现 CheckDivDWord 功能的示例:

IF divisor = 0 THEN
    CheckDivDWord := 1;
ELSE
    CheckDivDWord := divisor;
END_IF