1.TWinCATPLC概述............................................................................................................3
2.TWinCATPLC要点............................................................................................................5
2.1.程序的组成部分.............................................................................................................................................5
2.3.调试,在线功能......................................................................................................................................................17
2.4.标准............................................................................................................................................................................18
3.让我们写一段小程序...............................................................................................................19
4.TWinCATPLC的详细组成部分............................................................................................30
4.1.操作项目...................................................................................................................................................................30
4.2.操作目标...................................................................................................................................................................42
4.3.常用编辑命令...........................................................................................................................................................45
4.4.常用在线命令...........................................................................................................................................................46
4.5.关于视图...................................................................................................................................................................53
4.6.编排窗口...................................................................................................................................................................54
4.7.求助信息!................................................................................................................................................................55
5.TWinCATPLC编辑器...........................................................................................................57
5.1.说明语句编辑器......................................................................................................................................................57
5.2.文本编辑器〔常用功能〕.....................................................................................................................................60
5.3.指令表编辑器...........................................................................................................................................................64
5.4.结构化文本编辑器..................................................................................................................................................66
5.5.图形编辑器...............................................................................................................................................................76
5.6.功能块图编辑器......................................................................................................................................................77
5.7.梯形图编辑器...................................................................................................................................................81
5.8.用LD编写的一个POU:.................................................................................................................................81
5.9.顺序功能流程图编辑器...................................................................................................................................85
5.10.用SFC编写的一个POU:...................................................................................................................................85
5.11.PLC组态.............................................................................................................................................................91
5.12.全局变量.............................................................................................................................................................91
5.13.库管理器.............................................................................................................................................................93
5.14.变量观测窗口....................................................................................................................................................94
5.15.采样跟综...............................................................................................................................................................95
5.16.任务编辑器..........................................................................................................................................................99
6.可视化..................................................................................................................................101
7.DDE接口..............................................................................................................................104
8.附录......................................................................................................................................105
A.键盘操作.................................................................................................................................................................105
B.IEC运算.................................................................................................................................................................105
B.1.算术运算......................................................................................................................................................105
B.2.位串运算......................................................................................................................................................107
B.3.选择函数......................................................................................................................................................108
B.4.比较函数......................................................................................................................................................110
B.5.地址函数......................................................................................................................................................113
B.6.调用操作符CAL........................................................................................................................................113
C.标准的库函数........................................................................................................................................................113
C.1.类型转换函数..............................................................................................................................................113
C.2.数值函数......................................................................................................................................................114
C.3.位移函数......................................................................................................................................................116
C.4.字符串功能..................................................................................................................................................117
C.5.双稳态功能块..............................................................................................................................................120
C.6.边沿检测......................................................................................................................................................121
C.7.计数器...........................................................................................................................................................122
C.8.计时器...........................................................................................................................................................123
D.TWinCATPLC中的操作数...........................................................................................................................................126
E.错误信息参考...................................................................................................................................................................130
TWinCATPLC是什么?
TWinCATPLC是一个完整的用于逻辑控制器的开发系统。
TWinCATPLC具有功能强的语言结构,符合IEC国际标准。这些使你易于进行程序的开发。就像VisualC++一样,具有高级语言编程系统的开发环境,可为编辑器的操作和调试功能设置模式。
程序的结构是什么?
所有的项目数据存在一个有项目名称的文件中。一个新项目的第一个POU,系统会自动地给定名称MAIN,这是程序的起点。(在C程序中,这是一个主函数。〕从这里开始,你可以调用其它的POUs(程序,功能块和函数〕。
TWinCATPLC区分一个项目中的三种不同目标:POUs,结构和可视化元素。利用这些目标,你可以创建你的项目。在目标表中,你可以看到你的项目目标。
怎样写程序?
首先,当你开始开发一个新程序时,你必须对你的硬件系统进行组态。这对于检查使用的地址是否正确是必要的。
现在你可以对你的问题组态必要的POUs。然后,你开始用你选择的语言对你的POUs进行编程。
在编辑完项目的所有目标后,编译你写的程序并去掉语法错误。
怎样测试程序
你可以打开图形硬件组态窗口,强制给定输入,然后观察输出。在每个POU的说明语句部分以及全局变量表中,你能够看到项目数据的当前值,你也可以去写,强制给定数值。在另一个观察窗口中,你可以组态你想要检查的数据单元。
用TWinCATPLC进行调试
在发生程序错误的地方,你可以设置中断点。程序停止执行后,你可以在这个中断点上检查所有的程序数据。单步功能允许你一步一步地检查程序的逻辑是否正确。
进一步的在线功能
TWinCATPLC支持进一步的调试功能。允许按照一定数值强制改变程序变量和输入/输出值。流程控制使你能够检查哪一行程序被执行,并且当运行编码时,向你显示该行所用的每个变量的数值。
采样跟综用于跟综变量并以曲线方式显示数值。
在编写和测试程序后,你可以把程序下装到你的硬件系统中,并继续测试。这时,像用模拟方式调试一样,你可用同样的调试方法。
TWinCATPLC的其它功能
在任何时候,可以将整个项目存档或输出到一个文本文件中。
总结
为了便于你掌握TWinCATPLC,请阅读下面的基本TWinCATPLC术语表:
项目(Project)
一个项目包括控制器程序的所有目标,保存在有项目名称的文件中。一个文件由以下目标组成:PLC-Configuration,Tasks,POUS,结构,全局变量表,库,观测变量,可视化元素。
编程组织单元(POUs)
POUs由函数,功能块和程序构成。
每个POU由说明语句部分和语体组成。语体用IEC编程语言编写:
指令表InstructionList(IL),结构化文本StructuredText(ST),功能块图FunctionBlockDiagram(FBD),梯形图LadderDiagram(LD)或顺序功能流程图SequentialFunctionChart(SFC).
TWinCATPLC支持所有的IEC标准POUs。
POUs可以调用其它POUs.然而,被调用的POUs不允许再调用其它的POUs.
函数(Function)
一种函数是一个POU,当执行这种函数时,它精确地提供一个数据元素(也可以像数列或结构数据那样由多个数据元素组成〕。
一种函数总是用一定的形式来说明。即:在功能名称的后面是一个冒号和类型符。
一个正确的函数说明语句如下:
FUNCTIONFct:INT
另外,一个数值被分配给函数。即,函数名称可以像一个输出变量那样使用。函数数值必须与它的说明类型相一致。
下图举例说明函数FBD-Example。该函数用FBD语言编写,有三个BOOL输入和一个BOOL输出:
图2.1.1功能
在ST语言中,调用一个函数,如同使用一个表达式中的操作数。
函数不含有内部的状态信息。这就是说,调用具有相同自变量(输入参数〕的一个函数,总是产生相同的数值(输出〕。
举例调用上面所描述的函数:
用IL语言编写:
LD7
FBD_Example2,4
STResult
用ST语言编写:
Result:=FBD_Example(7,2,4);
用FBD语言,可这样调用功能:
在SFC语言中,一个功能公可以在一步或一个转换内调用。
功能块(FunctionBlock)
一个功能块是一个POU,当执行该功能时,它产生一个或多个数值。
功能块没有类型说明。
功能块的例程(InstancesofFunctionBlocks〕
像变量一样,功能块例程可被定义在局部变量表中。其方法是用标识符表示,用功能块名称作为类型。
下面是功能块FUB,例程名称为INSTANCER:
INSTANCE:FUB;
一个功能块的所有数值保持到下一次功能块执行之前。因此,调用同样的功能块,尽管它们有相同的自变量〔输入变量〕,但是,功能块的输出值并不总是相同。
下图是一个名称为IL_EXAMPLE的功能块,用IL语言编写,有一个输入变量,二个输出变量。
图2.1.2.功能块
调用功能块的方法,是使用功能块的例程名称。
访问功能块变量的方法,是输入功能块的例程名称,其后是一个点和变量名。
下面举例说明怎样调用上图描述的功能块IL-EXAMPLE。
图2.1.3.用IL语言调用一个功能块
用ST语言调用同样的功能块:
图2.1.4.用ST语言调用一个功能块
用FBD语言调用功能块:
图2.1.5.用FBD语言调用一个功能块
在SFC语言中,仅可以在步骤或传送内调用功能块。
有关功能块用法的举例见第三章。
程序
一个程序就是一个POU。当执行该程序时,它产生一个或多个数值。不允许像功能块那样产生一个程序的例程〔见功能块)。一个程序的所有数值保持到下一次执行程序之前。
一个简单程序举例:
图2.1.6.程序
在程序和功能块内,可以调用程序。在一个函数内不允许调用程序。不存在程序例程。
如果一个POU调用一个程序并且改变了程序的数值,这些变化将保持到下一次调用程序之前,即使是一个不同的POU调用该程序。
这与调用功能块是不同的。调用功能块的POU仅可以改变功能块的某一例程的数值(局部或全局数值〕
举例说明上面所描述的调用程序:
用IL语言编写程序:
CALPRGexample
用ST语言编写程序:
PRGexample;
用FBD语言编写程序:
MAIN
名称为MAIN的POU是一个特殊的程序。它是一个新项目中产生的第一个POU。在每个控制器运行周期中,这个POU被调用一次。如果你不使用任务(看5.14节),那么就决不能删除这个POU,也不能给它重新命名!!!
PLC组态(PLCConfiguration)
你可以使用PLCConfiguration组态你的控制器。为了检查一个程序,有必要知道哪些地址是有效的。一个项目的有效地址在PLCConfiguration中定义。
库(Libraries)
结构(Structure)
一个结构总是由多个基本的数据元素组成。一个结构的组成部分可以是任何类型的数组,其中包括结构。
结构定义举例:
多边形
STRUCT
Start:ARRAY(1..2)OFINT;
Point1:ARRAY(1..2)OFINT;
Point2:ARRAY(1..2)OFINT;
Point3:ARRAY(1..2)OFINT;
Point4:ARRAY(1..2)OFINT;
End:ARRAY(1..2)OFINT;
END_STRUCT
任务
指令表InstructionList(IL)
指令表(IL〕由一系列的指令组成。每条指令从新的一行开始,并根据操作指令,由操作符,一个或多个操作数组成,这些操作数用逗号分开。
一条指令可用一个标号引导。该标号由标号名和一个冒号组成。
一条注释必须是在一行的最后,两条指令之间可以插入空行。
举例:
LD17
STlint(*Comment*)
GE5
JMPCnext
LDidword
EQistruct.sdword
STNtest
next:
结构化文本StructuredText(ST)
结构化文本由一系列语句组成。这些语句可以有条件地(“
举例:
IFvalue<7THENWHILEvalue<8DOvalue:=value+1;END_WHILE;END_IF;
顺序功能流程图SequentialFunctionChart(SFC)
用SFC语言编写,用TWinCATPLCSFC编辑器进行编辑的例子:
图2.2.1:用SFC编写的网络
步和动作(StepsandActions〕
用SFC编写的POU由一个步的序列组成(如图2.21中的permanent,Init),这些步直接连接。这里所说的动作可附着在每一步上,Action意味着与动作有关的编码。
传送(Transition〕
步与步之间存在着传送(如图2.21中的TRUE,sin_test),一种条件被附着在转换上,这种条件或是一个布尔变量,一个地址,或是一个有布尔结果的表达式,也可能是一个布尔常量(TRUE,FALSE).
激活步(ActiveStep〕
当执行一个SFC-POU程序时,首先执行的动作是初始步(双边框〕。当一个步的动作被执行时,称该步为激活步。
每个步有一个标记。这个标记存储步的状态.当步处于激活状态时,标记为TRUE,否则为FALSE。标记的标识符就是步的名称。它在SFC-POU程序中被说明。
执行完一步后,接着执行下面的传送。如果结果值是TRUE,则激活下面的步,并在下一个处理器周期中执行。
功能块图(FBD)
功能块图是一种图形编程语言。它由一个网络序列组成。每个网络含有一种结构,这种结构代表了一个逻辑或一个算术表达式,一个功能块的调用,一个跳转或一个返回语句(图2.2.2).
用FBD编写的典型的网络例子:
图2.2.2.:用FBD编写的网络
梯形图LadderDiagram(LD)
梯形图是一种图形编程语言,类似于电路原理图。一方面,你可以用LD语言去设计逻辑电路,另一方面,你可以用LD语言设计FBD所编写的网络。因此,你可以使用LD语言去控制调用其它的POUs.
触点〔Contacts〕
触点可并联连接。在这种情况下,并行支路中的任一分支传送数值ON就能使并行网络传送ON状态。触点也可以串行连接。在这种情况下,所有触点必须传送数值ON,才能使最后的触点传送ON状态。这一点和电路图中的并联或串联连接原理相一致。
线圈〔Coils〕
在梯形图的右侧是一个线圈网络。这些线圈不能用水平线连接在一起。一个线圈能不加修改地考贝从线圈左侧到右侧的状态,并把这一状态值存入相联的布尔变量中。
当一个线圈为“非”运算时,它把这一“非”运算值存入一个相联的布尔变量中。当一个触点为“非”运算时,只有与之相联的布尔变量值为FALSE时,这个“非”运算触点才能传送数值。
用LD语言编写的网络例子.
图2.2.3用LD语言编写由触点和线圈组成的网络
梯形图中的连接
网络中的连接可以是水平的或垂直的。
水平连接用水平线表示,水平连线将它左边的元件状态传送到它右边的元件。
垂直连接用垂直线表示。垂直连线传送如下状态:
-OFF,位于垂线左侧的所有水平连线的状态是OFF。
-ON,位于垂线左侧的一条或多条水平连线的状态是ON。
梯形图中的功能块
在梯形图中,除了使用线圈和触点外,你还可以插入功能块和程序。被插入功能块的第一个输入和第一个输出与梯形网络相连接。因此,第一个输入变量和第一个输出变量必须是布尔型变量。
功能块可用在与触点相同的位置上。这就是说,功能块梯形网络的左侧。
置位/复位线圈
把LD用作FBD
当使用LD语言工作时,你常希望用触点网络去控制调用其它的POUs程序。在这种情况下,你可以把一个线圈的结果值存入一个全局变量中,并在其它地方使用这个变量。你也可以使用这个结果值去直接调用一个FBD网络。
一个EN元件与线圈并联连接。EN-INPUT端连接到触点与线圈之间的连线上。当这条连线传送ON状态时,才能调用EN-component元件。
从这样一个EN-component元件开始,你可以像用FBD语言那样去开发你的网络。
图2.2.4.使用EN-operator运算元件的局部LD网络。
采样跟综〔SamplingTrace〕
采样跟综使你有可能跟综程序的数值变化过程,采样跟综依赖于所谓的触发器事件。这就是事先定义的布尔变量(触发变量〕的下降或上升边缘。
TWinCATPLC使你能够跟综20个变量的500个数值。
调试(Debugging)
断点(Breakpoint〕
TWinCATPLC支持中断点的设置。当程序遇到中断点时,停止执行。这时你可以查看中断点处所有的程序数据〔即变量值〕。
在所有的TWinCATPLC编辑器中可以设置断点。在文本编辑器中,可以在行号上设置断点。在FBD和LD中,中断点设置在网络号上。在SFC中,中断点设置在步上。
单步〔Singlestep〕
单步的含义:
在IL中:程序一直执行,直到遇到下一个CAL,LD或JMP指令。
在ST中:执行下一个指令。
在FBD,LD中:执行下一个网络。
在SFC中:执行下一步的动作。
通过步进方式,你可以检查程序的逻辑是否正确。
单循环〔Singlecycle〕
监视〔Monitoring)
采用在线方式,在可视变量说明语句的后面,对控制器中的现行值进行监视。
流程控制(FlowControl〕
采用快照的方法,通过定义快照区并产生快照,你可以显示一个循环周期内的变量值。这样,在不停止执行程序的情况下,快照区中的一行内的任一变量都可采用现行值来进行监视。
仿真〔Simulation〕
采用仿真方式,用户程序可以在PC机上运行,而代替PLC。在这种方式下,所有在线功能都在工作,不用任何硬件你就能够对你的程序进行逻辑校验。
IEC1131-3
IEC1131-3是PLC编程语言的国际标准。
TWinCATPLC提供了国际标准中所描述的所有编程语言。
建立POUs
我们选择顺序功能流程图〔SFC〕来编写这个POU。
现在我们建立另外两个目标。用功能块图(FBD〕语言编写的块PHASES和用指令表(IL)编写的功能块POUWAIT。.
功能块PHASES的用途
在PHASES中,交通灯的每个阶段将变换为正确的颜色。这就是说,在红色阶段和黄/红阶段中,红灯一直亮着,在绿色阶段中,绿灯一直亮着,等等。
功能块WAIT的用途
PLC_PRG的用途
"PHASES”说明语句
现在让我们写PHASE。在说明语句部分,你必须说明一个输入变量STATE,其类型为INT〔在关键词VAR-INPUT和END-VAR之间〕。STATE将有5个可能的状态,也就是每一个阶段有一个状态〔绿,黄,黄/红,红和断开〕。
相应地,交通灯有四个输出变量,名称为RED,YELLOW,GREEN和断开。请你按照图3.1中所看到的那样来说明这四个变量。
PHASES的说明语句部分如图所示:
"PHASES”文本
现在我们根据输入变量的状态来确定输出变量.为此,你用鼠标器在第一个网络的网络号上击一下〔左边的灰色区域,包括号码0001〕。现在你已选择了第一个网络。
用你的鼠标器选择AND,将其文本改为EQ。现在把上面的TRUE改为STATE,下面的TRUE改为1。这样你就建好了下面的网络:
STATE与1进行比较,其结果。赋值GREEN:如果STATE值为1,则网络将使GREEN接通.
图3.2:功能块PHASES的文本
这样就完成了第一个POU。根据输入值STATE,PHASES控制交通要求的颜色。
"WAIT"说明语句
这个变量的初始值是FALSE,它的设置方法是在说明语句后面〔分号前面〕插入":=FALSE".
连接标准库
根据我们的用途,我们需要POUTP,一个脉冲记时器,这个POU有两个输入(IN,PT)和两个输出(Q,ET).TP有如下功能:
注意:在附录B节中,你可以找到标准库中所有元素的简要描述。
WAIT的说明语句部分如下图所示:
图3.3.:功能块WAIT的说明语句部分
为了实现所期望的记时器,POU的文体必须按下面的方法编程:
"WAIT"的文体
图3.4.:功能块WAIT文体
现在记时器已编写完。主程序PLC-PRG将把前面的两个功能块WAIT和PHASES连在一起.
"MAIN"程序的第一步开发
首先我们要说明所需要的变量表。这些变量包括功能块PHASES的二个状态(LIGHT1,LIGHT2),以及功能块WAIT状态(DELAY)我们得到下面的说明语句:
图3.5.:程序PLC_PRG的第一层,说明语句
怎样用SFC语言建立一个图形
首先我们确定图形的结构。然后我们可以对不同的动作和转换进行编码。
最后,把跳转目标Init改为Switch1.如图所示:
图3.6.:程序MAIN的语体,第一次开发
现在我们必须填写步骤的动作。如果你双击一个步,那么你得到一个打开新动作的对话框。在我们的例子中,总是选择IL(指令表)编写程序。
动作和传送条件
Init步的动作是使变量初始化。LIGHT1的变量STATE被赋值为1(绿色〕。LIGHT2的变量STATE被赋值为3〔红色〕。
图3.7.ActionInit
图3.8.ActionSwitch1
在Green2,LIGHT1是红色(STATUS:=3),LIGHT2是绿色(STATUS:=1),
图3.9.ActionGreen2
图3.10.ActionSwitch2
图3.11.ActionGreen1
现在,已经编写完程序的第一层。你可以编译程序,并用模拟方式测试程序.
MAIN程序的第二步开发
现在所要考虑的问题是,在经过若干周期以后,即在夜里,你想要关断交通灯。为此,在程序中我们插入一个记数器,该记数器向上记忆交通灯的运行周期数,并且当记数器达到一定的数值时,交通灯断电。
首先,我们需要一个变量类型为INT的新变量COUNTER。在程序PLC-PRG的说明语句中说明这处变量,并在动作Init中,使它的初始值为0。
LD0
STCOUNTER
现在选择Switch1后面的转换,并在这个转换后面插入一个步/转换。
给新增加的部分定名如下:
在新增的二个步中,上面的一个定名为"Counting".另一个定名为"Off".
新的转换(从上到下,从左向右)分别被称为“FINISH”,"TRUE"and"DELAY.OK".
现在,修改后的结构图如下所示:
图3.12.交通灯MAIN程序
如同你所看到的,另外两个新增加的动作和一个传送条件已经编写完。.
在Counting步中,记数器每次增加1.
图3.13.ActionCounting
在传送FINISH中,检查记数器是否比某一数值在,比如说与数值7比较:
图3.14.TransitionFINISH
图3.15.ActionOff
结果
在交通灯运行了七个周期以后,天黑下来。在黑暗持续了10秒钟以后,交通灯再次被点亮,等等。
交通灯的仿真
在下面的章节中,你将找到对TWinCATPLC特性的详细说明。我们将仔细研究每个菜单项以及它们的用途。
用这个命令打开已有的项目。如果一个项目已被打开并修改,那么,TWinCATPLC询问是否存这个项目。
为了打开最近使用的一个项目,使用File菜单中Exit命令后面的菜单项。
这个命令用于关闭正打开的当前项目。如果当前项目被修改,那么TWinCATPLC询问是否存这个项目。
如果项目已被修改,那么用这个命令存当前项目.
快婕键:.
这个命令用于把当前的项目存到一个不同的文件中,原有的项目文件不被改变.
选择这个命令以后,标准窗口SaveDialog打开。选择已有的文件各或输入一个新的文件。灰后击一下OK按钮。当前的项目就被存到指定的文件中。
如果文件名已经存在,TWinCATPLC提示你是否覆盖这个文件。
这个命令用于把当前项目作为库文件存起来,以便在其它的项目中使用.
首先,标准窗口SaveDialog出现。选择一个已有的文件名或输入任何一个文件名。然后击一下OK按钮。
重新建立整个项目。如果出现任何错误,则TWinCATPLC显示一个有关的信息。含有错误的项目是不能作为库文件存入的。
如果没有错误发生,那么当前项目作为库文件存入指定的文件中.
如果文件名已存在,那么TWinCATPLC提示你是否覆盖这个文件。
一个用途在库管理器一章中描述。
这个命令用于打印激活窗口的内容.
快捷键: . 选择这个命令后,标准窗口PrintDialog出现。选择你需要的选项或组态打印机,然后击一下OK按钮。 打印激活窗口中所显示的目标。 把一个外部文件的注释插到一个目标资料中是可能的。具体做法在全局变量一章中描述. 这个菜单选项允许你设置打印的脚文和标题,以及确定打印机的选项,如使用主象或风景画式的格式等等. 选择这个命令后,printerSetup话框出现. 图4.1.1PrinterSetup对话框 对每一页输入脚文和标题。可插入下面的文本符号: (Page)打印当前页 (Date)当前日期 (FileName)项目文件的路径 (POUName)当前打印的目标名 按 你可以选择是否每一页有一个边框,是否每一个新目标另起一页,并且你可以调整左边框的宽度。缺省值是10mm. 最下面的PrinterSetup按钮是用于打开标准的WindowsPrinterSetup对话框,这个对话框的内容取决于你的打印机类型. 这个命令用于退出TWinCATPLC. 快捷键: 如果一个项目已经打开并被修改,则TWinCATPLC询问是否存这个项目 这个命令用于检查你的程序是否有语法错误.发生的每一错误显示在另一个窗口上,该窗口称为信息窗口。 对所有更改的POUs和结构产生编码. 打开信息窗口,显示编译的过程和发生的错误. 注意: 如果PLC支持onlinechange功能,那么,Build功能才能被支持. Onlinechange功能的含义是,在PLC运行期间可以改变PLC中程序的某些部分,而不用中断执行程序,所有的数据尽可能保留。 信息窗口: 信息窗口显示编译的过程。显示错误所在的POU行和类型。在信息窗口中,选择显示错误的那一行,并敲 使用 图4.1.2.信息窗口:编译10个POUs,产生4个错误. 在附录中,你可找到所有的错误信息表。 这个菜单包括所有的项目选项。可被设定的选项在下一页中描述: 这个命令允许对产生编码的选项进行设置. 选择这个命令后,出现一个对话框. 图4.1.3.BuildOptions对话框 EnableDebugging 选择这一选项,使得产生附加的调试编码。 当有C-Code编码产生时,才选择这一选项. EnableMonitoring 选择这一选项,使得产生附加的监视编码 EnableOnlineChanges 你可以选择是否在线更改你的程序。当有C-Code编码产生并且PLC允许在线更改程序时,选择这一选项才是恰当的. NumberofDatasegments 这个号码决定控制器为你的项目所留出存储空间。一个数据存储区等于32Kb。当有可能在线更改程序时,选择这一选项才是恰当的. 编译前自动存储Autosavebeforecompilation 如果选择了这一选项,那么在做任何编译之前,你的程序被自动存储. 询问项目信息AskforProjectinfo 如果选择了这一选项,那么当一个项目第一次被存储或者用新的名称存项目时,项目信息对话框便自动打开。 这一选项对工作区来说是特殊的。它不能存在项目文件中,而存在TWinCATPLC.ini信息文件中。 用户信息UserInfo 用这个命令打开一个窗口,该窗口中有项目的用户信息. 图4.1.4.UserInformation窗口 用户信息由用户名,名称的开头字母和公司名称组成。这些选项对一个工作来说是特殊的。它们不能存在项目文件中,而存在TWinCATPLC.ini信息文件中. 目录Directories 用这个命令打开一个对话框,你可以插入目录路径,在这里有TWinCATPLC的库文件和编译文件. 图4.1.5.目录路径 这些路径对一个工作区来说是特殊的。它们不能存在项目文件中,而存在TWinCATPLC.ini信息文件中. 存储选项Saveoptions 图4.1.6.SaveOptions对话框 你可以选择TWinCATPLC是否在下次存储项目时,建立项目的备份版本。如果选择了这一选项,那么TWinCATPLC将把实际项目存到扩展名为。bak的文件中。这样,你可以在最后的安全期之前,恢复这个版本文件。已有的备份文件不能重写。为了得到一个新的备份文件,就要删除或移走已有的备份文件。 图4.1.7.打开一个用项目的对话框 你可以选择是打开自动存储的备份文件还是最后一次存储的项目文件。. 自动存选项是非常受欢迎的。因为当你的计算机出现故障(不是由TWinCATPLC引起)或是当电源出现故障时,自动存选项存储你所做的工作. TWinCATPLC提供数据保护 图4.1.8.回令Password对话框 在passward栏中输入你的口令,该口令用于打开你的项目。每输入一个字母,屏幕上出现一个星号。在ConfirmPassword一栏中确认你的口令。用OK按钮关闭对话框。如果出现下面的信息: 这是因为你的口令和确认的口令不一致。你要重新输入口令并确认。. 现在,如果你正存文件并且要再次打开它,那么TWinCATPLC提示你输入口令,在输入了正确的口令后,项目才能被打开. 除了这个一般的口令外,你还可以定义写保护口令。因此,在上面对话框〔图4.1.8〕的有关栏目中输入写保护口令,并确认你的口令. 不知道写保护口令,也可以打开一个有写保护的项目。因此,当TWinCATPLC要求你输入写保护口令时,在Cancel按钮上击一下。现在你可以编译项目,装入项目,仿真项目等等。但是,你不能存项目. 要小心不要忘记不的口令!否则你要去找系统管理员。 自动格式化Autoformat 如果选择这一选项,该菜单命令前显示(ü)。用IEC1131-3指令表(IL)语言所写的程序将被自动格式化。空格被插入并且关键字被大写。这将有助你写出更为可读的程序。试试看。 自动装入Autoload 如果选择这一选项,该菜单命令前显示(ü)。那么每次你启动TWinCATPLC时,上次工作的项目被打开〔显示上次存项目时所占有的工作空间〕.通常这是很有用的。 自动说明Autodeclare 如果选择这一选项,那么当你输入一个还没有进行说明的变量时,一个用于说明变量的对话框打开。 现在已经解释了所有的选项,接着我们继续研究Projict菜单。 这个命令允许你打印整个项目的资料或部分项目资料. 一个完整的项目资料由以下部分组成: -POUs -Structures结构 -Taskconfiguration任务组态 -SamplingTrace采样跟综 -CrossReferences交叉参考 -ThecalltreesofPOUsandStructuresPOUs和结构的调用 -TheGlobalVariableList全局变量表 -ThePLCConfigurationPLC组态 -Atableofcontents目录表 选择这个命令后,出现一个对话框,你可以在对话框中选择你想要打印的资料: 图4.1.6DocumentProject对话框 项目的输出和输入 TWinCATPLC提供了输出或输入项目的可能性。因此,你有机会在不同的IEC编程系统之间进行项目的交换。到目前为止,只有IL和ST语言有标准的交换格式。由于这个原因,TWinCATPLC使用自己的图形语言格式. 所有的POUs,PLC组态和一个程序的结构都保存在一个ASCIIFile文件中,这些元素的格式有IEC1131-3的通用元素格式. PLC组态和用FBD或LD编写的POUs有TWinCATPLC的特殊格式。 一个输出文件被输入到一个项目中 如果被输入的POU与已有的POU名称相同,那么它的名称有一个引导线。 Merge命令允许你把其它项目的目标拷贝出来。 标准窗口文件对话框打开,你必须从中选择想要的项目。然后打开另一个对话框,这个对话框允许你选择你想要拷贝的目标: 图4.1.7.MergeProject对话框 从POU表中,你可以选择想要的POUs;从结构表中,你可以选择想要的结构。此外,你可以选择是否拷贝SamplingTrace采样跟综,GlobalVariables全局变量或PLCConfigurationPLC组态 用OK按钮.确认,这样选择的目标从被选的项目拷贝到当前的项目中。 如果一个合并的POU与已有的POU名称相同,那么它的名称有一个引导线。 用这个命令,你可以把信息存到你的项目中。选择这一命令,出现下面的对话框: 图4.1.8.项目信息对话框 一个完整的项目信息包括以下内容: -文件名File -目录Directory -最后更改的日期Thedateofthelastchange 这些内容由TWinCATPLC给出.你不能改变信息对话框中的这些内容。 你可以增加下面的内容: -项目的标题title, -作者的姓名author, -版本号version -项目的描述description. 全局检索允许寻找整个项目或部分项目中的某一字符. 全局替代允许代替整个项目或部分项目中的某一字符. 目标/目标表 一个目标"Object"表示一个POU,一个结构或一个可视化元素。目标表Objectlist〔在屏幕左侧的小窗口〕包括一个项目的所有目标。目标的类型可在目标表上方的组合箱中选择。 这个命令删除目标表中当前选择的目标(POU,Structure或可视化元素)快捷键 如果目标的编辑窗口是打开的,那么在删除目标以后,编辑窗口将自动关闭. 建立一个新目标〔快捷键).新目标的类型取决于在Object类选择窗口表中的当前选项。. 选择这个命令后,出现一个对话框,该对话框取决于新的目标类型. 如果新目标是一个POU,那么必须选择新目标的类型〔函数,功能块或程序〕以及想要的编程语言。 图4.2.1.建立POU的对话框 这个命令是给目标表中当前选择的目标(POU,Structure或可视化元素)重新定名. 用这个命令,你可以把一个用ST,FBD,LD或SFC语言编写的程序转换成用IL和FBD语言编写的程序。在下一个版本中,可以转换成梯形图语言 在转换目标之前,必须要编辑项目,选择了这个命令以后,下面的对话框对开: 图4.2.2.转换POUs对话框 选择要将POU转换成的目标语言,给新的POU起一个新名〔或者新的POU代替原有的POU〕。按OK按钮,一个新的POU就加到你的项目中. 注意:转换一个POU要丢失一些注释。把一个用IL语言编写的POU转换成用FBD语言编写的POU,然后再把它转换回用IL编写的POU,结果,看上去这个POU与原来的POU是不同的,其实它们所做的工作却是相同的. 这个命令把目标表中当前选择的目标(POU,Structure或可视化元素)装入编辑器中。 这个命令打开一个窗口,该窗口是目标表中当前所选目标(POU,Structure)的调用树形图 注意:必须要编译项目! 图4.2.2.调用树形图举例 用这个命令你得到一张所有初始定义而未被使用的变量表. 用这个命令,编辑的目标〔被装到激活窗口中〕复位到上次存储的状态。这个状态可以是手动存也可以是自动存。因此,如果你选择了自动存,那么使用这个命令时,则有可能改变了不想要改变的目标状态. 该命令表示,在当前打开的编辑窗口中,不做最后一次所做的操作。 快捷键: 注意:不是所有的编辑器都支持undo功能,undo功能不可以用于整个项目的插入,删除或重新给一个POU或一个结构定名。 如果使用两次undo,那么第一次使用undo之前的状态被存储。. 把编辑窗口中的当前选项移到剪贴板〔Clipboard)上.选项在编辑窗口中被删除。 快捷键: 把编辑窗口中的当前选项拷贝到剪贴板上。编辑窗口的内容不被修改。 快捷键: 把剪贴板上的内容插到编辑窗口中当前光标位置上。在图形编辑器中,如果图形结构句法正确,才能执行该项命令 快捷键: 删除编辑窗口中的当前选项,不改变剪贴板上的内容 快捷键: 对话框选项: FindWhat 在这个框中输入你想要寻找的文本. MatchWholeWordonly 如果选择这一项,则查找命令按照整个单词来查找文本而不是按照单词的一部分来查找文本。 MatchCase严格大小写 Direction Findnext Cancel/Close 退出查找命令。. 输入参数〔查找的文本,检索的方向等等〕,重复查查找操作. 快捷键: 这个命令用于检索一个文本并用不同的文本业替代. 输入某一指令时,将给PLC输送一次服务,对此,PC机也会获得一个响应。 在仿真状态下,你的程序是在PC机内执行。因为所有在线功能都具备,你不需要特殊硬件即可对你的项目进行调试。这是一个非常有用的功能,该功能不仅仅适合于你刚开始的一些小项目。 这个命令把系统与PLC连接起来。如果项目没有建立,则自动建立。如果编译产生错误,则TWinCATPLC不处于在线方式. 在线方式意为: "CommunicationError:LogoutPerformed" 通讯故障:退出系统. 程序已改变!下装新的程序码? 现在你可以选择’NO’,并处于在线方式,或者你输入‘YES’,把当前被装入TWinCATPLC中的项目下装到PLC中。 用这个命令,则由在线方式回到编辑方式。关闭与控制器的连接,退出仿真. 这个命令用于运行你用TWinCATPLC编写好的程序。 快捷键: 停止执行装入PLC中的程序. 把PLC中的数据初始化。这些数据或者是POUs说明语句中赋给的数值或者为0.为安全起见,在PLC复位前,你必须确认这个命令。 复位后,不执行〔stop〕用户程序。 这个命令的作用取决于当前光标的位置。如果光标在一个有效的中断点位置上,那么在这个位置设置或清除一个断点. 有效的中断点位置: 快捷键: 中断点用青蓝色表示. 程序执行到中断点停止。中断点变为红色。为了继续执行程序,使用Run,SingleCycle,StepIn或者StepOver命令〔所有这些命令在Online菜单中〕. 有这个命令打开一个对话框,设置和清除整个项目中断点。这个对话框显示所有的断点并允许找查断点设置的位置. 图4.4.1:中断点对话框 POU的下拉表包括项目的所有POUs,Location下拉表包括你选择的POU的所有有效断点的位置. Add是把一个中断点加到所选POU的某一行上〔网络或步〕.该中断点加到中断点列表中。 Delete是删除在中断点列表中所选择的中断点. Deleteall是删除所有的中断点. Goto是打开某个POU,并在某个中断行上设置光标。该中断行在中断点列表中选择. 该命令是执行一个单步。一个POUs的调用被看成一步〔在执行这个POU以后,停止执行〕。在SFC中,该命令是执行一个完整的动作. 快捷键: 步进到下一个语句。即使这一语句是在一个不同的POU。如果下一个语句是调用另一个POU,那么在所调用的POU第一个语句之前,程序停止执行 快捷键: 开始执行程序,然后停在一个PLC循环周期的末端〔或者停在下一个中断点上〕. and 为了改变一个变量的值,在变量的说明语句上双击鼠标键或者选择这个变量,然后按 你将得到一个对话框,可用来改变所选变量的值. 图4.4.2.用于写新的变量值对话框 你按OK按钮以后,该数值被标记做出更改。实际上,在控制器中并未更改。所有被标记的变量数值用红色显示。这就使你有可能一次更改几个变量〔在二个控制器周期之间〕。 PLC中的Force表被释放。数值不再强行设置. 当程序停在中断点上时,你可以执行这一命令,这时,打开一个对话框,该对话框有一个调用堆栈中当前POUs的列表和行〔网络〕号,以及下一个被调用的POU. 图4.4.3.调用堆栈举例 第一个POU总是PLC_PRG,因为程序从这里开始执行. 最后的POU总是某个POU,在这里程序停止执行. 流程控制帮助你调试你的项目,而不用使程序停止执行。 当检查到菜单项为(ü)时,流程控制被激活。 流程控制在所选择的激活编辑窗口上工作。并取决于编写POU所使用的语言。如果激活窗口不是用IL,ST或FBD编写的一个POU,则不能显示流程控制。 用IL编写POU的流程控制: 图4.4.4:用IL编写POU的流程控制 在每行的左侧显示了另一个区域。当控制器正在运行以及某行被执行时,该行的号码区被标记〔绿色〕,并且显示累加器的内容。 用FBD编写POU的流程控制: 图4.4.5:用FBD编写POU的流程控制 在FBD中,程序通过的每一行,其网络号区被标记〔绿色〕. 对于每一行,你得到通过‘passed’这一行的实际数值。对于布尔数值,当TRUE通过时,这一行加亮显示〔蓝色〕,否则为一般显示。对于不是布尔数值来说,插入一个文本区,该文区含有通过这一行的实际数值. 如果选择仿真方式,则在线服务不在PLC上工作,而是在仿真程序上工作。仿真程序如同编程系统一样,在相同的PC下运行. 这条命令允许你设置串行接口的参数。 当通过串行接口进行通讯时,有下面的对话框出现: 图4.4.6.通讯参数对话框 PLC中的通讯参数和控制器中的通讯参数要一致,这一点很重要。 所选择的参数与项目一起保存起来. 使用这条命令,TWinCATPLC工作区上方的工具条出现或移走。当检查到菜单命令后面的标记(ü)时,工具条就出现。 使用这条命令,下方的状态条出现或移走。当检查到菜单命令后面的标记()时,状态条就出现。 图4.5.2.表示当前项目和在线状态的状态条 通常,状态条显示当前项目的文件,如果选择一个菜单命令中要按一下鼠村键,则状态条就给出这条命令的主要功能描述。如果不选择这条命令,你可以移动鼠标,按放弃键. 所有的说明语句可以用通常的文本方式显示或者用表格表示。使用这条命令,你可以在文本和表格方式之间进行转换. 用这条命令,你可以选择TWinCATPLC编辑器的所有字型。且字型的尺寸可增大显示并加大TWinCATPLC编辑器的打印输出。 用这条命令,你可以编辑TWinCATPLC的颜色设置。你可以设置行号区〔TheLineNumber〕的颜色,中断点〔BreakpointPositions〕位置的颜色,一个激活的中断点〔ActiveBreakpoint〕颜色,布尔值监视,〔TheMonitoringofBOOLValues〕的当前位置颜色,或通过位置〔thePassedPosition〕的颜色. 选择上面的某一菜单项,则用于编辑颜色的标准对话框打开. 在这条菜单命令的下面,你可以选择想要的当前选项是用虚线框显示,还是用实线框显示或者是用填充框显示. BYTE,WORD或DWORD类型的变量值可用十进制,十六进制或二进制显示. 用这条命令,所有打开的窗口并排摆放。这样就使打开的窗口不重迭,并覆盖整个工作区. 用这条命令,所有打开的窗口上下摆放,这样就使打开的窗口不重迭,并覆盖整个工作区. 所有打开的窗口以阶形连接方式排列. 所有显示记号的窗口在主窗口工作区的底部排成一行. 选择这条命令后,会有上一次编译信息的窗口打开。在一条信息上单击一下,你可以打开某个POU的窗口用于查阅信息。如果你在一个错误信息上单击一下,产生错误的某行为蓝色显示. 用这条命令,你可以把一个打开的项目与另一个项目进行比较。例如,如果你要存一个目标,而你不能确信自从上次保存以来,你在哪个地方做了更改,这时,你可以把项目与它自身进行比较。 选择这条命令后,用于打开项目的标准对话框出现。选择你要与当前项目进行比较的项目,按OK按钮,一个窗口打开,在这个窗口里显示比较的结果。被选项目的所有POUs排列成表,在每个POU的后面,你可以在括号中找到这个POU的更改信息、 有五个不同的信息: 在当前的POU中,这个POU不存在. 当前POU的说明语句部分与被比较的POU不同。 当前POU的说明语句部分以及实施部分与被比较的POU不同。 选择这一命令后,用于组态控制器的编辑器打开〔见5。9节〕。. 选择这一命令后,编辑全局变量的窗口打开(见5.10节〕. 选择这一命令后,库管理器窗口打开〔见5.11节〕. 选择这一命令后,任务组态编辑器窗口打开(见5.12节). 选择这一命令后,观测变量窗口打开(见5.13节). 选择这一命令后,定义采样跟综的窗口打开〔见5.14节〕. 如果你对怎样使用TWinCATPLC以及IEC1131-3语言元素有什么问题,可以请求,TWinCATPLC在线帮助。在这里你将找到这本手册的所有信息。你可以用两种不同方式使用Help. 用 TWinCATPLC的在线帮助(onlinehelp)与大多数Windows操作系统的在线帮助是一样的。所以,如果你有使用Windows操作系统的经验,那么可以跳过下面的内容. 使用这条命令,你进入TWinCATPLC在线帮助的首页。用鼠标器在一个绿色的有下划线的标题上单击一下,那么一个新的求助框打开,在这里有对这个标题的解释。仅仅用你的鼠标器击几下,你就将得到任何想要的信息. TWinCATPLC的所有语言编辑器都由一个说明语句部分和一个语体部分组成。它们之间用一条分隔线分开。为了移动分隔线,用鼠标器在分隔线上单击按下,然后拖动,在移动时,你要始终按着鼠标键. 关键词KEYWORDS 在所有的TWinCATPLC编辑器中,关键词都要大写。 说明语句部分 在说明语句中,说明所有的变量。这些变量仅在这个POU中使用。说明语句的句法符合IEC1131-3的标准句法 举例说明TWinCATPLC编辑器中变量说明: 图5.1.1.说明语句编辑器 输入变量 在关键词VAR_INPUT和END_VAR之间说明所有的变量,它们作为输入变量使用。这就是说,在起动程序时,设置这些变量的数值. 输出变量 在关键词VAR_OUTPUT和END_VAR之间说明所有输出变量。在正调用的POU内,这些变量易受影响. 局部变量 在关键词VAR-END_VAR之间,说明所有局部变量。这些变量不能在POU以外使用。在POU内它们被说明. TWinCATPLC支持下面基本的数据类型: BOOL(8Bit),SINT(8Bit),USINT(8Bit),INT(16Bit),UINT(16Bit),DINT(32Bit),UDINT(32Bit),REAL(32Bit),STRING(variablelength),BYTE(8Bit),WORD(16Bit),DWORD(32Bit),TIME(32Bit),DATE(32Bit),DATE_AND_TIME(32Bit),TIME_OF_DAY(32Bit). 除此以外,TWinCATPLC支持一维,二维和三维数组。使用下面的句法说明一个二维数组: <数组名>:ARRAY[ lb1,lb2代表数组的下边界,ub1,ub2代表数组的上边界. 例如: pack_of_cards:ARRAY[1..13,1..4]OFINT; 快捷键的扩展性能 在离线方式下,用 当输入说明语句时,使用下面的快捷键。 几乎一行的最后一个标识符是说明语句的变量名,说明语句的类型由一行的最后一个标识符来确定。 Fehler!Textmarkenichtdefiniert.BorBOOLBOOL Fehler!Textmarkenichtdefiniert.IorINTINT Fehler!Textmarkenichtdefiniert.RorREALREAL Fehler!Textmarkenichtdefiniert.SorSTRINGSTRING 如果不能通过最后的标识符确定数据类型的话,则数据的类型为BOOL.最后的标识符有作为类型使用〔见下面的第一个例子〕。 Fehler!Textmarkenichtdefiniert.任何一个整数作为一个初始值或是一个字符串的字长。该字长取决于说明语句的类型〔第二和第三个例子〕. Fehler!Textmarkenichtdefiniert.一个地址(%IX0.3)增加一个AT...修改量〔第四个例子〕. -后面带一个分号(;)的文本是一个注释〔第三和第四个例子〕. Fehler!Textmarkenichtdefiniert.在一行内的所有其他字符可被忽略〔例如:最后一个例子中的感叹号〕。 例子: A A:BOOL; ABI2 A,B:INT:=2; STS2;Thisisastring ST:STRING(2);(*Thisisastring*) X%MD12R5;realvalue XAT%MD12:REAL:=5.0;(*realvalue*) B! B:BOOL; 说明语句编辑器中的行号 用离线方式,在某一行号上单击一下就标明整个一行。 用在线方式,假如变量是一个结构变量,则在某一行号上单击一下就扩大或压缩这一行的变量〔你可以用变量前面的菱形来辨别结构变量〕. 用这个命令,你得到用表格显示的说明语句编辑器,好像你在一个卡片索引箱中,可以选择输入变量,输出变量,局部变量和输入以及输出变量各自的卡片。 对每一变量,你可在下面的区域中输入如下内容: Name:插入变量名 Address:插入变量地址(AT-说明语句) Type:插入变量类型〔如果变量是一个功能块的状态,那么插入功能块〕。 Initial:插入变量的初始值〔类似于赋值运算符":="〕. Comment:在这个区域里插入一个注释. 在说明语句中输入新变量 图5.1.2.表格式说明语句 地址〔Address〕,初始值〔Initial〕和注释〔Comment〕为可选项。一个正确的变量说明语句仅仅需要变量名和类型。在任何时候,你可以毫无问题地在变量的表格式和文本式之间进行转换。在线方式时,两种表达方式是相同的。 在线方式的说明语句编辑器 在在线方式时,说明语句编辑器成为一个监视窗口。每行有一个变量,后面是等号(=)和变量当前值。如果这个变量没有被定义,则显示三个问号(). 每个多元素变量的前面是一个菱形,例如: 在菱形上双击鼠标扩展变量,在下面的例子中,结构变量BAND3和子结构变量TIMER被扩展如下: 如果一个变量被扩展,那么所有它的组成成分列表于下。变量前的变成单线菱形。在这个菱形上再双击键,则变量被压缩,菱形再次为填充菱形. 在单元素变量上双击鼠标,一个写变量对话框打开。在对话框中,可以改变变量值。 TWinCATPLC文本编辑器具有Windows文本编辑器中的常用功能。 下面的菜单命令专用于文本编辑: 图5.2.1:两个POUs文本〔InstructionList和StructuredText)的打开窗口. 显示在这个语言中可使用的运算符列表。如果选择其中一个运算符并用OK按钮关闭列表,则所选的运算符插在当前光标位置上。 用这条命令,你打开一个操作数帮助对话框,上面包含所有被定义的变量〔快捷键: 图5.2.2:插入操作数帮助对话框。最后一行显示变量的注释. 显示所有可使用函数列表.你可以在其中选择标准的或用户定义的函数。如果选择其中一个函数,并用OK按钮关闭对话框,则被选择的函数插入到当前光标位置上。 显示所有可使用功能块列表.你可以在其中选择标准的或用户定义的功能块。如果选择了其中一个功能块,并用OK按钮关闭对话框,则被选择的功能块插入到当前光标位置上。 在线方式的文本编辑器 编辑器的在线功能是设置中断点和程序步。与监视相结合,用户就有了现代化的高级语言调试功能。 采用在线方式,文本编辑器窗口用一条垂线分成两部分。窗口的左侧是常用程序文本。另一侧是显示左侧所使用的变量以及它们的当前值。在每个多元素变量的前面是一个菱形。在菱形上双击鼠标键,则菱形被扩展或压缩。〔见监视窗口,5.12节〕. 使用这条命令,你可以用在线方式组态你的文本编辑窗口,你可以调整文本窗口的哪一部分留作监视变量,以及一行中两个监视变量之间的距离。距离1个单位等于所选字型的行高. 图5.2.3.MonitoringOptions对话框 中断点可被插在哪里 在IL中不是每一行都是中断点的位置.中断点的位置是在这样的行里。即在这些行的后面数值被改变或者程序的执行在这里出现分支。这些行是插入中断点的位置。 在IL中,我们有如下的中断点位置: -一个POU的开头 -在每个LD,LDN上 -在每个JMP,JMPC,JMPCN上 -在每个CAL,CALC,CALCN上 -在每个RET,RETC,RETCN上 -在POU的结尾上 在ST中,我们有如下的中断点位置: -在每个赋值语句上(:=) -在每个RETURN和EXIT语句上 - 在WHILE,IFELSEIF,UNTIL语句中被赋值的条件句上 你可以用行号区的颜色来识别中断点的位置。它的颜色比其它行的颜色深,为黑灰色。〔见图3.2.2.〕. 怎样设置一个中断点 在一个行号区上单击鼠标来设置一个中断点。如果这一行是中断点位置,那么它的颜色由黑灰色变为青蓝色.在PLC中,中断点立即被激活。 删除中断点 在设置中断点的行号区上单击一下,则中断点删除。 当程序执行到中断点时,将发生什么 当用户程序执行到中断点上停止时,TWinCATPLC显示停止执行程序的POU和POU的中断行。 图5.2.4.有中断位置〔较黑的网络号区〕的IL编辑器 指令表IL是PLC的汇编程序语言。它易于理解,但属于低级语言。 IL编辑器是文本式编辑器。在IL中,使用下面的运算符和修改量: 修改量是: CwithJMP,CAL,RET:如果前一个表达式的结果是TRUE,则执行指令. NwithJMPC,CALC,RETC:如果前面的表达式结果是FALSE,则执行这条指令. NwithAND,OR,XOR:最后操作数的非运算〔不是堆栈内容的非运算〕。 左括号修改量"("表明运算符的赋值推迟,直到遇到右括号")"。例如,指令的顺序 AND(%IX1 OR%IX2 ) 被看作为: result:=resultAND(%IX1OR%IX2) IL运算符的完整内容列表如下: 运算符〔operator〕 修改量〔Modifiers〕 语义〔Semantics〕 LD N 设置当前结果等于操作数 ST 把当前结果存到操作数位置上 S 如果并且只有当前结果为TRUE时,设置布尔操作数为TRUE R 如果并且只有当前结果为TRUE时,设置布尔操作数为FALSE AND N,( 以位为单位“与”运算 OR 以位为单位“或”运算 XOR 以位为单位“与非”运算 ADD ( 加法 SUB 减法 MUL 乘法运算 DIV 除法运算 GT >大于号 GE >=大于等于号 EQ =等于号 NE <>不等于号 LE <=小于等于号 LT <小于号 JMP C,N 跳向标号 CAL 调用功能块 RET 从被调用的功能块返回 推迟求值运算符 IEC的所有运算符列表可在附录中找到. 使用某些修改量的IL程序举例: LDTRUE(*LoadTRUEintotheaccu*) 把TRUE装入累加器中 ANDNBOOL1(*executeANDwiththenegatedvalue*) (*ofthevariableBOOL1*) 与BOOL1变量的“非”值进行“与”运算 JMPCend(*iftheresultwasTRUE,jump*) (*tothelabel"end"*) 如果结果是TRUE,则跳到‘END’标号 LDNBOOL2(*Storethenegatedvalueof*) STERG(*BOOL2toERG*) 把BOOL2的“非”值存入ERG中 end: LDBOOL2(*Storethevalueof*) 把BOOL2的值存入ERG 流程控制: 在IL中,流程控制显示被执行程序行中累加器的值。 注意:只有激活窗口才能显示一个流程控制。在你的IL编辑窗口任一地方单一下,使窗口被激活。 结构化文本是IEC11313的一种高级语言。在某些方面类似于PASCAL语言,但是了解C语言的人对于理解这种语言也是没有问题的。 下面的定义来自IEC11313标准。如果你司惯于使用高级编程语言,那么只是看一看例子就行了。 结构化文本语言是一种结构式编程语言。这就是说,ST提供的某些结构应用于常用结构的编程,像循环或条件表达式。这种语言的优点是,程序出错率低,可读性高。 让我们看一个例子,比较两个程序,一个程序用ST编写,一个程序用IL编写,两个程序的作用相同。 用IL语言编写计算2的乘方的循环语句: loop: LDCounter EQ0 JMPCend LDVar1 MUL2 STVar1 SUB1 STCounter JMPloop 用ST语言编写计算2的乘方的循环语句: WHILECounter<>0DO Var1:=Var1*2; Counter:=Counter-1; END_WHILE Result:=Var1; 显而易见,用ST语言编写的循环语句比较短,易于理解。当你必须写一个需要许多执行控制(if..then,while,for)的程序时,则用ST语言编写,因为和其他语言相比,ST有很大的优点. 表达式 一个表达式是一个结构,在执行表达式以后,产生一个数值。 表达式由操作符和操作数组成。一个操作数可以是一个直接量,一个变量,一个功能的调用或者其它的表达式。 表达式的计算值 一个表达式的计算是由一序列操作符组成。操作符的计算顺序是由操作符的优先级确定。在一个表达式中,首先使用有最高优先级的操作符,接下来是使用有较低优先级的操作符。。。等等,直至完成整个表达式的计算。 具有相同优先级的操作符,其计算顺序是从左到右。 如果A,B,C,D是INT型变量,其值分别为1,2,3,4,那么, A+B-C*ABS(D) 计算值为-9 (A+B-C)*ABS(D) 计算值为0 ST运算符列表如下: Operation〔操作〕 Symbol〔符号〕 Precedence〔优先级〕 Parenthesis〔括号〕 (Expression)〔表达式〕 HIGHEST〔最高〕 Functionevaluation〔函数计算〕 Functionname(argumentlist)函数名〔自变量表〕 Exponentation指数运算 ** Negation“非”运算Complement补码运算 NOT Multiply乘法 Divide除法 Modulo模数计算 * / MOD Add加法 Subtract减法 +- Comparison比较 <,>,<=,>= Equality等于Inequality不等式 =<> BooleanAND布尔“与” BooleanXOR布尔“与非” BooleanOR布尔“或” LOWEST最低 ST语句表: 语句的类型 举例 赋值语句 A:=B;CV:=CV+1;C:=SIN(X); 功能块的调用和FB的输出 CMD_TMR(IN:=%IX5,PT:=300); A:=CMD_TMR.Q RETURN语句 RETURN; IF语句 D:=B*B; IFD<0.0THEN C:=A; ELSEIFD=0.0THEN C:=B; ELSE C:=D;END_IF; CASE语句 CASEINT1OF 1:BOOL1:=TRUE; 2:BOOL2:=TRUE; BOOL1:=FALSE; BOOL2:=FALSE; END_CASE; FOR语句 J:=101; FORI:=1TO100BY2DO IFARR[I]=70THEN J:=I;EXIT; END_IF; END_FOR; WHILE语句 J:=1; WHILEJ<=100ANDARR[J]<>70DO J:=J+2;END_WHILE; REPEAT语句 J:=-1; REPEAT J:=J+2; UNTILJ=101ORARR[J]=70 END_REPEAT; EXIT语句 EXIT; 空语句 ; 赋值运算 在一个赋值语句的左边是一个操作数〔变量,地址〕,在右边是一个表达式的值,赋值给操作数。 语法: <操作数>:=<表达式>; 含义: 把表达式的结果赋值给操作数。 Var1:=Var2*10; 调用的功能块:调用功能块只是简单地写功能块的名称。你可以给功能块的输入参数写赋值语句并用括号括起来。输入参数赋值语句的顺序是可选择的。 在下面的例子中,调用一个记时器,并给参数IN和PT赋值。然后将结果值Q赋值给变量A. 访问功能块结果值的方法是:写出功能块的名称,然后写一个点。再写变量名。 TheRETURN语句t 当程序执行到"RETURN"语句时,事实上,被执行的POU被放在一边。 把POU放在一边,然后回到调用它的地方。 下面的例子表示一个功能的第一条语句,该功能需要一个正的输入变量var1。 func:=FALSE; IFvar1<0THEN TheIF语句t IF语句允许在一定的条件下执行某些表达式。. IF<条件>THEN <语句1>; ELSE_IF<条件2>THEN <语句2>; . ELSE_IF<条件n>THEN <语句n>; <语句n+1>; TheELSE_IF分支是可选择的,ELSE分支也是可选择的. 如果〔条件〕是TRUE,那么执行语句1,如果条件是FALSE,而条件2是TRUE,那么执行语句2等等.如果没有条件是TRUE,那执行语句n+1。 IFtemp<17THEN heating_on:=TRUE; heating_on:=FALSE; 如果温度降到17度以下,加热器开关闭合,否则打开。ELSE分支是可选择的。通过使用ELSE_IF,你可以组合几种条件. TheCAS语句 用一个CASE语句,可以把几个条件语句与一个相同的条件变量结合起来成为一个结构. CASE <数值1>: <数值2>: ... <数值n>: ELSE语句是可以选择的。数值1函数值n必须是变量Var1的常数.除字符串和BOOL以外任一类型都可以。 如果 如果几个数值有同样的语句,那么这些数值可被组合起来,用,号分开. 1,5:BOOL1:=TRUE; BOOL3:=FALSE; 2:BOOL2:=FALSE; BOOL3:=TRUE; BOOL1:=NOTBOOL1; BOOL2:=BOOL1ORBOOL2; FOR循环语句 如果一个语句必须要重复几次,那么你可以使用循环语句。而不用跳跃句。ST语言提供了三种不同的循环语句。如果事先已确定重复的次数,那么使用FOR语句,否则,使用WHILE或REPEAT语句. FOR <语句>; Index必须是一个ANY_INT类型的变量,consts是整数常量. Index_Var初始值是CONST1.在关键词TO后边,确定了Index_Var变量的上限值,当Index_比CONST2值大时,停止循环. 在关键词BY后面,确定了记数器的增量值,在每次执行 在关键词DO的后面是将被执行的语句。每次执行完这些语句后,检查Index_Var是否仍然小于等于CONST3值。. 关键词END_FOR结束FOR循环语句. 例子: 使用FOR循环语句,计算2的乘方的运算例子可编程如下: FORCounter:=1TO5BY1DO 考虑到Var1的初始值为1.在FOR语句执行完以后,Var1的值将为32. 注意:循环语句是一个非常危险的结构。它易于使程序进入死循环,为了找出这样的错误,用模拟方式运行你的程序,TWinCATPLC将向你显示出哪里有一个死循环程序。死循环的含义是:IndexVar永远不能达到CONST3值。设想这样一个循环语句,Index-Var的增量为1,而其中一个语句使它减少1. WHILE循环语句 在关键词WHILE与END_WHILE之间有一序列语句。这些语句反复被执行,直到有关的布尔表达式为FALSE.如果表达式的初始值为FALSE,那么这组语句根本不能被执行. WHILE<条件>DO END_WHILE; 只有条件为TRUE时,语句才能被执行. 关键词WHILE的后面是一个可执行的条件,在上面例子中Counter与0进行比较,只要counter不等于0,那么在DO与END_WHILE之间的所有语句被执行. 注意:必须注意条件 TheREPEAT循环语句 REPEAT循环语句与WHILE循环语句相同。所不同的是被检查的条件放在最后。在执行循环语句以后,赋值给REPEAT循环语句的终止条件。即,既使条件的初始值为FALSE,但循环语句也被执行一次. <语句> UNTIL <条件> 关键词REPEAT和UNTIL之间的语句一直被执行,直到UNTIL后面的条件被赋值为FALSE. Counter=0 注意:必须注意REPEAT循环语句不能无限地重复执行。因此,你必须写一个语句,在这个语句中,条件不断更新.比如:一个记数器必须用语句表中的一个特殊语句不断使其更新。然后要再次使用模拟方式检查循环。 TheEXIT退出语句 EXIT语句放在一个循环语句中,使最里面一层的循环语句终止,而不考虑条件。 在某一点上终止里面一层的循环语句: IFVar1>1000000THEN 流程控制〔FlowControl〕 在ST中,流程控制显示最后的PLC周期所执行的程序行。 注意:只有激活的窗口才能显示流程控制.在你的ST编辑窗口上的任一栏单击一下,使窗口激活。 在这一章中,我们集中讨论两种图形语言LD(梯形图)和FBD(功能块图)的共有性能. 网络 用FBD或梯形图编写的POUs是由网络组成的。所谓网络是用线连接起来的模块和操作数的集合。POU从第一个网络开始执行,并且如果程序没有跳转,则程序从网络X到网络X+1顺序执行. 标号 网络中的注释 比如,如果最小的行数调整为2,那么每个网络在标号的后面有两行空的注释行。这个选项的缺省值为0,它的优点是在屏幕上可以看到较多的网络。 插入网络 当前网络 在线方式的图形编辑器 在FBD和LD中,中断点仅可以设置在网络上。如果一个中断点设置在一个网络上那么这个网络号区显示为青色。在执行网络以前,程序中止。网络号区的颜色变为红色。程序的执行采用从网络到网络的步进方式. 用FBD编写的一个POU: 图5.6.1用FBD编写的一个POU FBD编辑器是一种图形编辑器,工作对象是网络表。所谓网络是一种被连接的结构,它由逻辑和算术表达式,功能,跳转和返回语句组成(见图5.6.1.). 网络中的光标位置,键盘接口 光标位置 任何一个文本都是一个可能的光标位。文本的选择用蓝色背景作为标记. 否则光标位用虚线框重新标记。 接下来,你可以看到一个所有光标位的列表: 1)任何文字(用黑色框围住): 2)任何输入: 3)任何运算符,功能或功能块: 4)输出,如果一个赋值或一个跳转如下所示: 5)在一个赋值,一个跳转或一个返回的上方的一点: 7)恰好在赋值前的一点: 怎样设置光标 用鼠标点一下或使用光标键可设置光标。使用光标键,沿着所需的方向选择下一个光标位。用这种做法,任何可能的光标位都能达到。如果选择最后光标位,你可以用”光标上“和”光标下”键把光标移动到上面网络的最后光标位。或下面网络的最后光标位。 为了逐渐习惯正确的光标位,在开始使用TWinCATPLCFBD时,建议使用键盘接口。. 插入元素 一个空网络仅含有一个操作数TRUE。用鼠标在这个TRUE的右侧击一下,则最后的光标位被选择. 插入一个赋值一个跳转或一个返回语句 插入的地方取决于所选择的位置。即在所选的输入的前面,所选的输出的后面,所选的交叉线的前面或在网络的末端。 插入一个运算符 被插入的运算符总是一个AND运算符,通过选择和输入想要的新的运算任,来修改所插入的运算符。使用〔F2〕键,你得到一个所有运算符的列表。如果新的运算符较少的输入端,则删除多余的输入端和所有被连接的支线。 如果被插入的运算符左侧有一条支线,则这条支线与第一个输入连接。如果被插入的运算符右侧有一条支线,则这条线与输出连接。未被连接的所有新的输入端与TRUE值连接。像网络中的任何其它文本一样,这个TRUE值可被改为所需要的值。 在2)的光标位置上,被选择的运算符,函数或功能块将被改为AND运算符。输入端的数量至少为2。所有大于2的原有输入端不能被去除。 插入函数或功能块 完成插入的方法与插入运算符的方法相同,包括直接输入和输出。如果被插入的功能块是有一条支线,则该支线与第一个输出连接,与其他的输出端不做连接。 插入一个输入 插入一个输出 为了在一个已有的赋值句中插入一个另外的赋值句,选择赋值变量前的一点,赋值句上方的交叉线,或赋值句前的一个输出. 赋值变量名是result,你必须将它改为实际变量名。 输入的“非”运算 剪裁,拷贝,粘贴,删除 否则,左侧的所有支线将被剪贴板中的内容所代替。 注意:你可以很容易地改变与方框相连的输入的顺序。 在线方式的功能块图 在FBD中,中断点公能设置在网络上。如果一个中断点设置在一个网络上,那么这个网络号区显示为青色,当程序执行到有中断点的网络时,程序停止执行。这时网络号区的颜色变为红色. 功能块图中使用的所有变量值在与变量相邻的一个文本区中显示。这些值并不是执行相应运算以后变量的值,而是控制周期被执行以后变量的值。 图5.8.1.用LD编写的POU LD中的光标位置 在下面你可以看到所有可能的光标位置表。调用功能块和程序如同对待触点那样. 1.任何文本(用黑色椭园形围起) 2.每个触点或功能块 4.线圈和触点之间的连接线. 下面是梯形图编辑器的特殊菜单命令. 用这个命令,一个新触点插到所选位置的前面。触点的缺省值是TRUE。你可以选择这个值并把它改为所需要的变量或常量. 在梯形图编辑器中,可将并联的触点插到所选位置的下方。如果选择了一个线圈或线圈与触点之间的连线,那么所插入的新触点与整个触点网络并联连接。新触点的缺省值是TRUE,你可以选择这处触点的文本并把它改为正确的变量或常量. 把用于选择功能块或程序的对话框打开。从对话框中,你可以选择标准的POUs或用户定义的POUs. 被插入的新的POU相当于一个新触点,新功能块或程序的第一个输入与输入连接线相连,程序的第一个输出与输出连接线相连。这些输入输出的参数必须是BOOL型。所有其它输入输出的缺省值是TRUE。你可以选择这些缺省值,把它们改为正确的变量,地址或常量。 把一个线圈插入梯形中。如果当前的选择是整个网络,那么线圈插到最后一个线圈的下方,如果是选择了另一个线圈,那么新线圈插到所选线圈的上方。如果选择了一个触点,那么不能执行这个命令。新线圈的缺省名称是“out”。必须修改这个名称。 带一个使能输入端的LD部件 一个带使能输入的运算器,功能块或功能其作用如同不带这一特殊输入的部件一样.所不同的是,这种部件的运算是受使能输入端控制的。使能输入端连接到线圈与触点之间的连线上。当这一连线传输的信息为ON时,使能部件开始运算。 一旦一个使能部件插入到梯形图中,如同FBD一样,可以从这个部件开始开发网络。 使用这个命令,带使能输入端的运算行到LD网络中,新的运算器并联连接到线圈下面,并用AND作为标号.你可以更改这个名称代之为所需要的名称。 选择这个命令以后,一个对话框打开,如果你想要插入一个标准功能块或程序或者一个自定义功能块或程序,那么你可以在对话框中进行选择。从合适的表中选出想要的部件。做出选择以后,用OK按钮关闭对话框。一个新的部件并联插入到线圈的下方. 选择这个命令以后,一个对话框打开,如果你想要插入一个标准函数或自定义函数,那么你可以在对话框中进行选择。从合适的表中选出想要的部件。做出选择以后,用OK按钮关闭对话框。一个新的函数并联插入到线圈的下方. 用这个命令,你可以把一个新的部件与一个已有的部件相连接。执行这个菜单项下的命令,其光标位置与FBD(见5.7节)中的相应命令的光标位置相同. 用Input命令,一个新的输入加到部件上. 用Output命令,一个新的输出加到部件上。 用Operator命令,一个新的运算器插在部件上。运算器的输出与所选择的输入相连接. 用Assignment命令,赋值给所选择的输入或输出. 用Function命令,一个对话框打开,从自定义或标准功能表中选择一个功能。新的功能与选择的输入相连接。 用FunctionBlock命令,一个对话框打开,从自定义或标准功能块〔或程序〕表中选择功能块。新的功能块与选择的输入相连接。 如果跳转的输入状态为“ON”,则执行跳转命令。 一个返回可以插到3,4,的光标位置上。返回插到线圈的下面. 如果返回的输入状态为“ON”,则在这个网络上将使POU中断执行。 用这条命令,剪贴板上的内容插到所选部件的右侧。所选部件的输出与插入部件的输入相连接。如果剪贴板上的内容和所选部件上的内容由触点组成,才可执行这条命令. 用这条命令,剪贴板上的内容并联插到所选部件的下方.如果剪贴板上的内容和所选部件上的内容由触点组成,才可执行这条命令。 用这条命令,剪贴板上的内容并联插到所选部件的上方。如果剪贴板上的内容和所选部件上的内容由触点组成,才可执行这条命令. 用这条命令,当前光标位置上的触点和线圈进行“非”运算。在线圈的括号之间,触点的垂直线之间出现一条交叉线(()或|/|).如果当前的光标位置在触点和线圈之间的连线上,则不执行这条命令. 一个“非”运算线圈拷贝与布尔变量有关的左侧连接线的“非”运算值。如果一个和“非”运算触点有关联的布尔变量的值是FALSE,那么这个“非”运算触点拷贝从左侧连接线到右侧连接线的数值。 在一个普通线圈〔不做“非”运算〕上执行这条命令,你得到一个置位线圈。一个置位线圈不能改变有关的布尔变量的TRUE值。这就是说,如果这个变量值一旦变为TRUE,那么线圈保持为TRUE状态。一个置位线圈符号“S”表示. 在一个做“非”运算的线圈上执行这条命令,你得到一个复位线圈。一个复位线圈不能改变有关的布尔变量的FALSE值。这就是说,如果这个变量值一旦变为FALSE,那么线圈保持为FALSE值,一个复位线圈用线圈符号”R“表示。 在一个置位或一个复位线圈上执行这条命令,则线圈分别为普通线圈和做”非“运算的线圈。 在线模式下的LD 在线模式时,所有连接线和状态为ON的所有触点和线圈用青色显示。功能块的输入和输出显示相应的变量值. 在网络上可以设置中断点。从网络到网络完成步骤操作。 在LD中,中断点仅可以设置在网络上。如果一个中断点设置在一个网络上,则网络号区显示为青色。当程序到达中断网络时,停止执行。在这种情况下,网络号区的颜色变为红色。程序采用从网络的方式完成步进操作。 图5.10.1.用SFC编写的一个POU和其中的一个动作 作为编程语言的顺序功能流程图主要在第二章中描述。SFC的编辑器必须支持SFC的特征。因此,下面的菜单命令对SFC来说是特殊的: MenuInsert Selections 通过在元素上移动光标并击一下鼠标的左键,或者使用光标键,你可以选择一个元素〔一个步,一个转换或一个跳转〕. 用 如果编好的程序符合语法,那么下面的命令才能被执行。 Step-Transition(before) 在所选择的方框前插入一个步骤,其后是一个传送。被选择的方框必须有一个传送作为被取代的对象. Step-Transition(after) 在所选方框内的第一个传送的后面,插入一个步骤和一个传送。被选择的方框必须从一个传送开始。 Transition-Step(before) 在所选择的方框前插入一个传送和一个步骤。被选择的方框必须有一个步骤作为被取代的对象。 Transition-Step(after) 在所选方框内的第一个步骤的后面插入一个传送和一个步骤。被选择的方框必须从一个步骤开始. AlternativeBranch(right) 插入一个选择分支作为被选方框的右分支。所选择的方框的开始和结尾必须是一个转换。新的分支由一个传送组成。 AlternativeBranch(left) 插入一个选择分支作为所选方框的左分支。所选择的方框的开始和结尾必须是一个传送。新的分支由一个传送组成。 ParallelBranch(right) 插入一个并联分支作为所选方框的右分支。所选择方框的开始和结尾必须是一个步骤。新的分支由一个步骤组成。 ParallelBranch(left) 插入一个并联分支作为所选方框的左分支。所选择方框的开始和结尾必须是一个步骤。新的分支由一个步骤组成。. Jump 把一个跳转插到所选方框的某个分支的末端。该分支必须是一个选择分支。 Transition-Jump 插入一个传送,其后是一个位于所选择分支末端的跳转。该分支必须是一个并联分支。 MenuExtras PasteParallel(right) 插入剪贴板的内容,作为所选择的方框右边的并联分支。因此,所选择方框的开始和结尾必须是一个步骤。剪贴板的内容必须是一个SFC方框,该方框的开始和结尾必须是一个步骤。 Pasteafter 在所选择方框的第一步骤或第一个传送的后面,插入剪贴板中的SFC方框〔通常的粘贴是把它插在所选择方框的前面〕。如果编好的程序结构是一个语法正确的SFC结构,那么才能执行此项命令。 ZoomAction/Transition 把所选择方框的第一步骤的动作或第一个传送的文体装入合适的编辑器中,如果该动作或传送文体的内容是空的,那么必须选择对它们进行编程的语言. 对于一个已经编好程序的动作,用动作方框内右上角的黑三角表示。 对于已有转换文体的一个转换,用转换位置上连线左侧的黑三角表示。 ClearAction/Transition 所选择方框的第一步骤动作或第一个传送的文体被清除。 表示一个动作或一个传送文体存在的黑三角被移去。 StepAttributes 为了执行这条命令,你必须选择一个步。选择这个命令以后,一个对话框打开,在对话框中你可以编辑所选择的步的属性。 图5.10.2.编辑步的属性对话框 SFC标记 SFCInit:这个变量的类型是BOOL。当它为TRUE时,在Init-step步骤上,SFC-POU被复位。只要这个变量是TRUE,那么这一步就一直处于激活状态。 SFCError:当发生超时,这个BOOL型变量被设置。 SFCErrorStep:这个变量的类型是字符串(STRING).当一个POU发生超时,则把这个POU的名称存入该变量中。 只要把变量SFCError复位为FALSE,那么当发生一次超时,则不被记录. 图5.10.4.SFC中的TimeLimitOverview图 Options 选择这一命令后,一个对话框打开。在对话框内,你可以为你的SFC-POU设定几个选项. 图5.10.5.SFC-Options对话框 在线方式的SFC 中断点 如果存在一个以上的激活步骤〔在并行分支中,程序分路执行〕,那么下次被执行的动作步骤用红色表明. 图5.10.6.有激活步(Parallel1andParallel2),在线方式下的SFC PLC组态(PLC-Configuration)依赖于被组态的硬件。使用PLC-Configuration,一个IEC地址和它在控制器中的地中被离线赋值。 编辑全局变量 全局变量必须在关键词VAR_GLOBAL和END_VAR之间进行说明。全局变量可以在整个项目中被使用。 保持性全局变量 保持性全局变量是指它的值不能重新初始化的一种变量. 该全局变量必须在关键词VAR_GLOBALRETAIN和END_VAR之间加以说明。 VAR_GLOBALRETAIN (*变量说明语句*) END_VAR 全局常数 下面的格式用于定义全局常数: VAR_GLOBALCONSTANT DOKUFILE VAR GLOB1 COMMENT GLOB2 GLOB3 GLOB4 BG1 图5.10.1一个docuframe-file文件的摘录 TWinCATPLC的库管理器: 图5.13.1.库管理器 在比较前面的图中,你可以看到标准库POULIMIT的参数. 标准库 用户定义的库 怎样连接一个库 使用库管理器 库管理器窗口被分成四部分(见图5.11.1).在左上角中,你可以看到与项目连接的所有库的一个列表。在左下角中,你可以找到你选择的库的POUs整个的一个列表。在右侧是所选择的POU的接口。右侧的上部分与说明语句编辑器中的标记相同,下部分用一个黑色信箱表示。 怎样删除一个库 观测窗口是一个显示变量值的特殊窗口. 离线方式的观测窗口 在观测窗口中,插入变量的标记如下表示: 全局变量不用一个POU的名称来说明。各种结构变量〔结构,数组〕也可以被输入到观测窗口中,地址可以直接插入. 一个结构化变量的例子: PLC_PRG.Instance1.Instance2.Structure.Component 一个全局变量的例子 .Global.component1 帮助管理器 在线观测窗口 图5.14.1.在线方式的观测窗口 强迫赋值 在观测窗口中,你可以对变量强行赋值。如果你在相应的变量名上击一下,那么一个对话框打开,在这个对话框中,你可以插入一个变量值。TWinCATPLC检查这个新值是否与说明语句的限制不一致。若不一致,则去除这个数值。在观测窗口中,被改变的变量用红色显示。 什么是采样跟综 怎样起动采样跟综 跟综组态: 图5.15.1:TraceDefinition对话框 插入跟综变量 最初,跟综变量表是空白的,为了插入一个变量,你必须把变量写入表的下方区域中,然后按"Add"按钮,这样,变量就被插入进去. 在跟综定义对话框中,一个插入变量的标记表示如下: 为了从表中删去一个变量,则选择该变量,然后按"Delete"按钮. 停止跟综 在图5.15.1.定义跟综500个数值,并在对话区"PercentageofValuesrecordedafterTrigger"中输入50%.这就是说,在触发事件发生之前,250个数值将被记录下来,而在触发事件发生之后,记录250个数值。 用 跟综定义中的所有设置与项目一起被保存。 起动和装入跟综Trace: 把跟综组态装控制器中,该组态保留在控制器里,直到完成跟综或跟综停止. 这个命令用于起动PLC中的跟综、 这个命令用于当前的跟综缓冲存储器加载。显示变量值。 停止控制器中的跟综。在执行新的跟综之前,必须下装跟综定义并起动跟综、 选择被显示的变量 在跟综窗口左侧的组合箱允许从跟综组态中所定义的变量表中选择出最多5个变量. 这些变量的跟综曲线将被显示。可以插入新的变量,即使已经有显示的曲线。 采样跟综图 图5.15.2.触发器变量为%IX4.1的五个不同变量采样跟综图 Y轴代表变量值。变量的最高值和最低值限定了最大和最小的比例数。例如,在图5.15.2.中,变量Var3的最低值是-50,最高值是500。 一个已读的缓冲存储器一直保留,进到项目被改变成系统离线。 缺省选择是多通道(multichannel)。跟综窗口被分割成最多5个部分。每一部分用于一条跟综曲线。曲线的最高值和最低值显示在左侧。图5.15.2示出了一个多通道的例子. 用这条命令,你可以改变系统的Y轴比例。打开一个对话框,在对话框中你可以改变Y轴上的旧的最低值和最高值. .保存跟综组态并把实际装入的跟综映象到一个文件中。 装入一个文件的跟综组态和跟综映象。 用这条命令,你可以把你的跟综映象输出到一个ASCII文件中.曲线的数值被列成表,用逗号分开。这个文件可以用其他的工具装入(如.MathCad). TWinCATPLC允许对1131-3IEC任务进行定义. 当使用任务时,不要使用MAIN,因为MAIN的定义将不再是你的程序的入口点。 定义一个任务 图5.16.1:任务定义对话框 有三种不同的任务类型: 附加POUs 你也可以把全局功能状态与一个任务甚至是传递的参数相连接。 图5.16.2:有一个周期任务和一个事件任务的任务组态 在你的配置上,TWinCATPLC设置了一个可视化图形工具。由于有了这个工具的支持,你可以画离线的几何图形目标。这些目标在在线方式下,根据某个项目的变量值而改变形状。 图6.1一个可视化图形的例子 例如,如果你想要显示某一变量的增长情况,你可以画一个矩形,根据变量值这个矩形增大或缩小. 为了做一个可视化图形,你必须在目标种类选择组合箱〔目标表上方的区域〕中选择可视化。 插入新的元素 现在,在可视化图形窗口上击一下,并按住鼠标器上的左键移动鼠标,直到目标为想要的尺寸. 在一个已被插入的元素上击一下,那么这个元素就被选择。按住鼠标器上的左键所选的元素就被移动。 在元素的边缘上出现小的黑色正方形〔在周围的矩形边比上,园有这些正方形〕。在右下方的正方形上点一下,按住鼠标器上的左键移动鼠标,那么你可以改变元素的尺寸. 编辑可视化图形元素 在一个可视化图形元素上双击鼠标键以后,你得到下面的多元素对话框: 图6.2.:编辑可视化图形元素的多元素对话框 你的目标可以有下面的功能: 颜色和颜色的变化 当为在线方式时,只要变量保持为FALSE,那么你的目标将是正常颜色,而如果变量是TRUE,那么你的目标将是报警颜色。 在线方式下改变形状 你可以为你的目标的上、下、左、右边缘输入变量。这个边缘将按照有关的分配变量〔每单位一个图象元素〕移动。 用下面的方法输入变量: 在全局变量前加上一个点。. .GlobVar 输入一个变量的最简单方法是使用功能键 显示一个变量的值 双向布尔变量 在Input箱中,你可以定义是否能用鼠标器进行输入. 缺省的选择是Noinput,这样,用鼠标器在可视化图形元素上击一下,不执行任何动作。 改变一个模拟变量的值 定义变量的方法见“显示一个变量值”一段中的描述。如果在线方式选择变量值,那么对于输入新值,你得到一种编辑控制,当离开这种编辑控制时,这个新值就被写进去。 放大成另一个可视化图形 如果选择了输入对话框中的放大可视化图形一栏,那么你必须在其后的区域中插入一个可视化图形的名称。在线方式下,当在目标上单击鼠标时,那么含有这个可视化图形的窗口打开。 用这条命令,一个被选择的可视化图形元素放到前景。 .用这条命令,一个被选择的可视化图形元素放到背景。 用这条命令,一个用于打开文件的对话窗口出现,选择扩展名为*.bmp的文件。被选择的bitmap图出现在你的可视化图形的背景上。 用这条命令,你可以删除一个背景的bitmap图. TWinCATPLC有一个用于读数据的DDE(动态数据交换)接口,通过这个接口,TWinCATPLC向其它应用系统提供控制器变量的内容和IEC地址。其它应用系统也有一个DDE接口. 激活DDE接口 数据的寻址 一个DDE请求由三部分组成,程序名(TWinCATPLC),文件名和将被读出的变量名: 程序名:TWinCATPLC 文件名:你想要读的程序的全路径(例如:C:\example\example.pro).这个文件名必须确实与TWinCATPLC状态行中显示的文件名相同. 变量名:变量名与它们插到观察窗口中的变量名相同. 什么变量可以被读出 可以读出所有的地址和变量。变量和地址的说明语句与观察窗口中的说明语句相同。举例: %IX1.4.1//读输入变量PLC_PRG.test//读POUPLC_PRG的test变量.GlobVar1//读全局变量GlobVar1 用WORD连接变量 为了在WORD中得到POUPLC_PRG的TEST变量现行值,必须插入一个区,(InsertField).该区必须有下面的文本: {DDEAUTOTWINCATPLC"C:\\TWINCATPLC\\PROJECT\\IFMBSP.PRO""PLC_PRG.TEST"} 连接的结果是: Type:TWINCATPLCSourcefile:C:\TWINCATPLC\PROJECT\IFMBSP.PROElement:PLC_PRG.TEST 用Intouch访问变量 使用应用名TWinCATPLC和标题名C:\WINCAPLC\PROJECT\IFMBSP.PRO对你的项目定义一个DDE存取名 TWinCATPLC中的所有动作都可以通过操作键盘来执行。为此,你必须使用某些键盘命令,这些命令你在菜单中是找不到的。 -用制表键TAB,使你在对话框中从窗口的一部分转换到另一部分. 所有其它的动作可以通过使用菜单命令来完成,或者使用某个快捷键,你可以在菜单选项的后面找到快捷键. TWinCATPLC支持所有的IEC运算符。与IEC标准POUs相对照,这些运算符为编程系统所熟知.在POU的文体中,运算符像功能那样被使用。在附录A中,你可以找到一个列表,上面是所有被支持的运算符。 加法运算,变量类型为BYTE,WORD,DWORD,INT,DINT和REAL. 用IL语言编程举例: ADD2,4,7 STvar1 用ST语言编程举例: var1:=7+2+4+7; 用FBD语言编程举例: 乘法运算,变量类型为BYTE,WORD,DWORD,INT,DINT和REAL. MUL2,4,7 var1:=7*2*4*7; 用FBD语言编程举例: 减法运算,变量类型为BYTE,WORD,DWORD,INT,DINT,REAL SUB8 var1:=7-2; 除法运算,变量类型为BYTE,WORD,DWORD,INT,DINT,REAL. LD8 DIV2 var1:=8/2; 模数除法运算,变量类型为BYTE,WORD,DWORD,INT,DINT,REAL LD9 MOD2 STvar1(*Resultis1*) var1:=9MOD2; 以位为操作数的“与”运算。操作数必须是BOOL,BYTE,WORD或DWORD类型。 Var1:BYTE; LD2#1001_0011 AND2#1000_1010 STVar1(*结果是2#1000_0010*) Var1:=2#1001_0011AND2#1000_1010 以位为操作数的“或”运算。操作数必须是BOOL,BYTE,WORD或DWORD类型。 OR2#1000_1010 STVar1(*结果是2#1001_1011*) Var1:=2#1001_0011OR2#1000_1010 以位为操作数的”或非”运算。操作数必须是BOOL,BYTE,WORD或DWORD类型。 XOR2#1000_1010 STVar1(*结果是2#0001_1001*) Var1:=2#1001_0011XOR2#1000_1010 以位为操作数的“非”运算。操作数必须是BOOL,BYTE,WORD或DWORD类型。 STVar1(*结果是2#0110_1100*) Var1:=NOT2#1001_0011 所有的选择函数也可以用在变量上,在下面的例子中,我们用常数作为运算数。 SEL 二进制选择. OUT:=SEL(G,IN0,IN1)含义是: OUT:=IN0ifG=FALSE; OUT:=IN1ifG=TRUE. IN0,IN1和OUT可以是任何类型的数,G必须是BOOL类型,选择的结果是:如果G是FALSE,那么选择IN0,如果G是TRUE,那么选择INI。 LDTRUE SEL3,4 STVar1(*结果是4*) LDFALSE STVar1(*结果是3*) MAX 扩展最大值功能。结果值是两个数值中的最大值。 OUT:=MAX(IN0,IN1) IN0,IN1和OUT可以是任一类变量. LD90 MAX30 MAX40 MAX77 STVar1(*结果是90*) MIN 最小值功能。结果值是两个数值中的最小值. OUT:=MIN(IN0,IN1) IN0,IN1和OUT可以是任一类型变量. MIN30 MIN40 MIN77 STVar1(*结果是30*) LIMIT 限制器. OUT:=LIMIT(Min,IN,Max)含义是: OUT:=MIN(MAX(IN,Min),Max) Max是最大值,Min是最小值.如果IN比Max大,该功能的结果值是Max。如果IN比Min小,那么LIMIT功能的结果值是Min.否则,结果值是IN。 IN,Min,Max和OUT可以是任一类型变量。 LIMIT30,80 STVar1(*结果是80*) MUX 多路复用器. OUT:=MUX(K,IN0,...,INn)含义是: OUT:=INK. IN0,...,INn和OUT可以是任一类型变量.K必须是BYTE,WORD,DWORD,INT,DINT类型的值。MUX的结果是在一组数值中产生一个第(K+1)的值. MUX30,40,50,60,70,80 大于. 如果第一个操作数比第二个操作数大,则布尔运算的结果是TRUE,操作数的类型可以是BOOL,BYTE,WORD,DWORD,INT,DINT或REAL. LD20 GT30 STVar1(*结果是FALSE*) VAR1:=20>30 小于. 如果第一个操作数比第二个操作数小,则布尔运算的结果是TRUE。操作数的类型可以是BOOL,BYTE,WORD,DWORD,INT,DINT或REAL. LT30 STVar1(*结果是TRUE*) VAR1:=20<30 小于等于. 如果第一个操作数比第二个操作数小或者等于第二个操作数。则布尔运算的结果是TRUE。操作数的类型可以是BOOL,BYTE,WORD,DWORD,INT,DINT或REAL. LE30 VAR1:=20<=30; 大于等于. 如果第一个操作数比第二个操作数大或等于第二个操作数,则布尔运算的结果是TRUE。操作数的类型可以是BOOL,BYTE,WORD,DWORD,INT,DINT或REAL. GE20 VAR1:=20>=20; 等于. 如果操作数相等,那么布尔运算的结果是TRUE。操作数的类型可以是BOOL,BYTE,WORD,DWORD,INT,DINT或REAL. LD40 EQ40 VAR1:=40=40; 不相等. 如果操作数不相等,那么布尔运算的结果是TRUE。操作数的类型可以是BOOL,BYTE,WORD,DWORD,INT,DINT或REAL. NE40 VAR1:=40<>40; ADR 地址函数 ADR对一个变量类型为DWORD的自变量返回一个地址。这个地址可被传送到用户函数中,在那里,它们将作为地址指示器。 LDvar1 STvar2 man_fun1 调用一个功能块 在IL编程语言中,用CAL调用一个功能块。在功能块状态名称后的括号内可以 赋值给输入参数。 举例:调用一个功能块的状态Inst.参数Par1,Par2分别被赋值为0和TRUE。 CALINST(PAR1:=0,PAR2:=TRUE) (也可参见2.1节.) TWinCATPLC支持所有的IEC标准函数。与运算符不同的是系统并不知道这些标准函数。为了使用标准功能项目与标准库standard.lib相连接. 把较大"larger"类型转换成较小"smaller"类型是绝对不可能的。(例如INT转换成BYTE或DINT转成WORD). 为了做到这一点,你必须使用特殊的类型转换功能。转换字符串是不可能的。转换成较大"larger"或相等大小的类型是完全可以做到的(例如INT转成WORD或INT转成DINT). DINT_TO_INT 从DINT类型转换为INT类型. 让变量Var1的类型为DINT,而变量Var2的类型为INT。编程如下: STVar2 DINT_TO_BYTE 从DINT类型(或说较小类型"smaller")转换成BYTE类型. 让变量Var1的类型为DINT,变量Var2的类型为BYTE.那么有如下程序: INT_TO_REAL 从INT类型转换成REAL类型. LD2 MUL3.7 REAL_TO_INT 从REAL类型转换成INT类型. REAL_TO_INT(1.5)等于2. REAL_TO_INT(1.4)等于1. LD2.7 GE%MW8 TRUNC TRUNC(1.9)等于1. TRUNC(-1.4)等于1. ABS 绝对值 ABS(-2)等于2 SQRT 平方根 操作数的类型必须是REAL(参见INT_TO_REAL). LN 自然对数 LOG 以10为底数的对数 EXP 自然指数 SIN 用弧度表示的正弦值 COS 用弧度表示的余弦值 TAN 用弧度表示的正切值 ASIN 主弧正弦值 ACOS 主弧余弦值 ATAN 主弧正切值 EXPT 指数:OUT=IN1IN2.OUT,IN!和IN2"的类型可以是BYTE,WORD,DWORD,INT,DINT,REAL. EXPT2 STvar1(*结果是49*) var1:=7EXPT2; 下面的函数采用FBD功能块的表达方式来给予说明,在TWinCATPLC的库管理器中,你可以得到同样的表达式. SHL 向左移位:A:=SHL(IN,N) A,IN和N的类型必须是BYTE,WORD,DWORD.IN向左移动N位,右面空位用0补充. LD1 SHL1 STVar1(*结果是2*) SHR 向右移位:A:=SHR(IN,N) A,IN和N的类型必须是BYTE,WORD,DWORD.IN向右移动N位,左面空位用0补充. LD32 SHL2 STVar1(*结果是8*) ROL 向左旋转移位:A:=ROL(IN,N) A,IN和N的类型必须是BYTE,WORD,DWORD.IN向左旋转移动N位。 ROL3 STVar1(*结果是2#1001_1100*) ROR 向右旋转移位:A:=ROR(IN1,N) A,IN1和N的类型必须是BYTE,WORD,DWORD.IN向右旋转移动N位. ROR3 STVar1(*结果是2#0111_0010*) LEN 给出字符串的字长. LEFT LEFT(STR,SIZE)从字符串最左边开始给出字长为SIZE的一个字符串. LEFT3 RIGHT RIGHT(STR,SIZE)从字符串的最右边开始给出字长为SIZE的一个字符串. RIGHT3 MID MID给出字符串的一部分. MID(STR,LEN,POS)是一个从字符串STR的第POS位开始,字长为LEN的字符串。用IL语言编程举例: MID2,2 CONCAT 两个字符串的连接 INSERT INSERT(STR1,STR2,POS)=从字符串STR1的第POS位开始,插入字符串STR2。 DELETE DELETE(STR,L,P)=从字符串STR的第P位开始,删除L个字符. DELETE2,2 REPLACE REPLACE(STR1,STR2,L,P)从字符串STR1的第P位开始用STR2字符串代替L个字符。 FIND FIND(IN1,IN2)是在字符串STR1中寻找第一次出现字符串STR2时的字符位置。如果没有找到字符串STR2,那么输出OUT:=0. SR 双稳态功能块,受置位支配: Q1=SR(SET1,RESET)含义是: Q1=(NOTRESETANDQ1)ORSET1 Q1,S1和R1的类型是BOOL. RS 双稳态功能块,受复位支配 Q1=RS(SET,RESET1)含义是: Q1=NOTRESET1AND(Q1ORSET) SEMA 一个软件信号(可中断) BUSY=SEMA(CLAIM,RELEASE)含义是: BUSY:=X; IFCLAIMTHENX:=TRUE; ELSIFRELEASETHENBUSY:=FALSE;X:=FALSE; END_IF X是一个内部的BOOL型变量,初始值为0, BUSY,CLAIM和RELEASE的类型是BOOL. R_TRIG 上升边沿检测器. FUNCTION_BLOCKR_TRIG VAR_INPUT S1:BOOL; VAR_OUTPUT Q0:BOOL; M:BOOL:=FALSE; Q0:=S1ANDNOTM; M:=S1; END_FUNCTION_BLOCK 只要输入变量S1是FALSE,那么输出QO和变量M为FALSE,只要S1是TRUE,则输出QO被置为TRUE,然后M被置为TRUE,这就是说,对R_TRIG的任何一次调用,QO将是FALSE,直到S1有一个下降并再次上升时。 F_TRIG 下降边沿检测. FUNCTION_BLOCKF_TRIG Q0:=NOTS1ANDNOTM; M:=NOTS1; 只国输入变量S1是TRUE,那么输出Q0和变量M为FALSE,只要S1是FALSE,则输出Q0为TRUE,然后M被置为TRUE,这就是说,对F_TRIG的任何一次调用,Q0将是FALSE,直到S1有一个上升并再次下降时. CTU 向上计数器: CTU(CU,RESET,PV,Q,CV)含义是: IFRESETTHENCV:=0; ELSEIFCUAND(CV THENCV:=CV+1; Q:=(CV>=PV); CU,RESET和Q的类型是BOOL,PV和CV的类型是INT. 如果RESET是TRUE,只要CV比Pvmax值小(只要CV不引起溢出),那么在调用功能块CTU时,CV值以1为增量递增。 如果CV大于或等于PV,那么Q值为TRUE. CTD 向下计数器 CTD(CD,LD_,PV,Q,CV)含义是: IFLD_THENCV:=PV; ELSEIFCDAND(CV>PVmin) THENCV:=CV-1; Q0:=(CV<=0); CD,LD_和Q的类型是BOOL,PV和CV的类型是INT.(另外:LD_被定名为LD_,因为LD是一个关键词). 如果LD_是TRUE,那么记数器变量CV的初始值被置为PV.如果LD_是FALSE,只要CV值比Pvmax值大(只要CV不引起下溢),那么在调用功能块CTD时,CV值以1为减量而减少。 当CV小于等于0时,Q值为TRUE。 CTUD 上-下计数器 CTUD(CU,CD,RESET,LD_,PV,QU,QD,CV)含义是: ELSIFLD_THENCV:=PV; QU:=(CV>=PV); QD:=(CV<=0); CU,CD,RESET,LD_,QU和QD的类型是BOOL,PV和CV的类型是INT. 如果RESET是TRUE,那么CV被初始化为0。如果LD_是TRUE,那么CV被初始化为PV。. 如果CU是TRUE,只要CV不引起上溢,那么CV按增量1增加。如果CD是TRUE,只要CV不引起下溢,那么CV按减量1减少. 当CV大于等于0时,QU为TRUE. 当CV小于等于0时,QU为TRUE. TP 脉冲计时器 TP(IN,PT,Q,ET)含义时: IN和PT是类型为BOOL或TIME的输入变量。Q和ET是类型为BOOL或TIME的输出变量。如果IN是FALSE,那么Q是FALSE,PT是0。 只要IN是TRUE,那么ET以毫秒为单位向上记时,直到该值等于PT。 如果IN是TRUE且ET小于PT,那么Q为TRUE,否则,Q是FALSE。 TP的作用用图形表示如下: TON 延时接通计时器 TON(IN,PT,Q,ET)含义是: IN和PT是类型为BOOL或TIME的输入变量。Q和ET是类型为BOOL或TIME的输出变量。如果IN是FALSE,那么Q是FALSE并且PT是0。 只要IN是TRUE,那么ET以毫秒为单位向上记时,直到ET的值等于PT。 如果IN是TRUE且ET等于PT,那么Q是TRUE,否则,Q是FALSE。 TON的作用用图形表示如下: TOF 延时断开计时器 TOF(IN,PT,Q,ET)含义是: IN和PT是类型为BOOL或TIME的输入变量。Q和ET是类型为BOOL或TIME的输出变量,如果IN是TRUE,那么Q是FALSE并且PT是0. 只要IN是FALSE,则ET以毫秒为单位向上记时,直到ET的值等于PT。 如果IN是FALSE并且ET等于PT,则Q是FALSE。否则,Q是TRUE, TOF的作用用图形表示如下: 有TWinCATPLC中,操作数可以是常量,变量,地址以及〔在ST中〕,功能调用。 BOOL-Constants布尔常量 布尔常量的值是TRUE和FALSE. TIME-literals时间文字 TIME1:=T#14ms; TIME1:=T#100S12ms;(*Overflowinthefirstcomponent*) (*ispermitted*) 允许第一个组成部分溢出 TIME1:=t#12h34m15s; TIME1:=t#5m68s;(*Overflowinalowertimevalue.Correct*) (*wouldbe:t#6m8s*) TIME1:=15ms;(*missingT#*)丢失T# DATE-literals日期文字 DATE#1996-05-06 d#1972-03-29 TIME_OF_DAY#15:36:30.99 tod#00:00:00 DATE_AND_TIME#1996-05-06-15:36:30.99 dt#1972-03-29-00:00:00 numbers数字 在TWinCATPLC中,数字可以用二进制,十进制或十六进制表示。如果一个数字不是十进制,那么必须表示它的基数,其后是一个"#"字符和数字。十六进制数10至15用字母A-F表示. 在一个数值中,不允许用下划线: 14(十进制) 2#1001_0011(二进制) 8#67(八进制) 16#A(十六进制) REAL-Konstanten 这些数字的类型可以是BYTE,WORD,DWORD,SINT,USINT,INT,UINT,DINT,UDINT或REAL. 从较大的"larger"类型转换成较小的"smaller"类型是绝对不允许的。这就是说,一个DINT变量不可以像一个INT变量那样使用。因此,要使用标准库的类型转换功能。 为了转换类型,你可以使用下面的功能: DINT_TO_INT(从32位表示法转换为16位表示法), DINT_TO_BYTE(从32位表示法或16位表示法转换为8位表示法), INT_TO_REAL(从INT型转换为REAL型),REAL_TO_INT(从REAL型转换为INT型). 值得注意的是,不同类型的变量可以有不同的数值范围。整数类型的变量有如下的数值范围: SINT: -128 到 127 USINT: 0 255 INT: -32768 32767 UINT: 65535 DINT: -2147483648 2147483647 UDINT: 4294967295 因此,在把较大类型的数转换为较小类型的数时,有可能丢失信息,如果被转换的数字比类型范围要大,那么只能考虑低位数。例如,如果你转换的数字是4223(十六进制为16#10_7f)使用DINT_TO_BYTE转换命令,你得到的数字是127(十六进制为16#7f). REAL-Constants实数常量 实数用十进制分数表示 Strings字符串 Variables变量 变量或者被说明为局部变量〔在一个POU的说明语句部分〕或者被说明为全局变量〔在全局变量表中〕。 变量的助记符不允许有空格,不允许说明两次,不允许是关键词。 变量可被使用在任一场合,在该场合中,变量的类型是可用的. Addresss地址 一个单元素变量直接用一个特殊符号表示。该特殊符号是由百分号"%",表示地点的词头和表示数位大小的词头组合而成。一个或多个未被标记的整数用句点“。”分开。 系统支持下面表示地点的词头: I 输入地点 Q 输出地点 M 存储地点 系统支持下面的表示倍数的词头: X 一位 None B 一字节〔8位〕 W 一个字〔16位〕 D 双字〔32位〕 %QX75and%Q75Outputbit75 %IW215Inputwordlocation215 %QB7Outputbytelocation7 %MD48Doublewordatmemorylocation48 %IW2.5.7.1dependsonhardwareconfiguration 一个有效的地址取决于当前程序的PLC组态. Memorylocation存储地点 在TWinCATPLC中,所有被支持的数位可用于对存储器进行寻址。 例如,地址%MD48正在寻找字节号为192,193,194和195的存储器地址(48*4=192).存储器中的第一个字节号是No.0. 同样地,你可寻找存储器中WORDS和BYTES甚至BITS的地址。例如,%MB5.0,你寻找字节号为No.5的第一位. Systemflags系统标志 Arrays数组 TWinCATPLC支持1,2,和3维数组。一个二维数组的规定写法如下: Array_Name是一个助记符,Ib1,ub1,Ib2,ub2必须是整数。 Cardgame:ARRAY[1..13,1..4]OFINT; 如果数组中的一个数被用作操作数,那么按如下寻址: 在上面的数组例子中,位号为9,2的数字按如下寻址: Cardgame[9,2] Functions函数 在ST语言中,一个函数的调用可以作为一个操作数使用 Result:=Fct(7)+3; Addressingofstructurecomponents结构变量的组成成分的寻址 结构变量中的组成成分按如下寻址: Week.Monday AddressingofPOU-variablesPOU变量的寻址 功能块和程序的变量其寻址方式与结构中组成成分的寻址方式相同。首先表示POU的名称,然后是一个点“。”,接着是想要寻找的变量名. 在语法上可能会出现下面的错误: "Non-Booleanexpression .把与触点有关的表达式改为一个布尔表达式 "Non-Booleanexpression 把与线圈有关的表达式改为一个布尔表达式. "Identifierexpected" 在说明语句行的开始,写一个有效的助记符. "Overflowofidentifierlist" 减少助记符数量(64000个是可行的). "VAR,VAR_INPUT,VAR_OUTPUTorVAR_INOUTexpected" 在一个POU的名称后面,第一行必须是其中的一个关键词. "Unexpectedend" 在说明语句部分中:在说明语句部分的结尾加上END_VAR关键词. 在文本编辑中:添加语句,该语句用于结束最后的语句序列. "END_VARoridentifierexpected" 在说明语句行的开始写一个有效的助记符或写END_VAR. "Expecting...or..." 在出错行里写上两项中的其中一项. "NameusedininterfaceisnotidenticalwithPOUName" "Expectingtypespecification" 在说明语句的助记符后面写一个有效的类型。 "Errorininitialvalue" 写一个与说明语句的类型相一致的直接量作为初始值. "Duplicatedefinitionofidentifier 给有相同名称的助记符重新定名. "Identifier 在POU的说明语句部分或者在全局变量表中说明这个助记符. "LDexpected" 在这一行中仅允许有一个LD语句. "ILOperatorexpected" 把这一行的第一个字符串改为一个有效的运算符或函数 "VariablewithwriteaccessordirectaddressrequiredforST,STN,S,R" 用一个写存取变量代替操作数。 "Typemismatch:Cannotconvert 检查操作数要求的类型〔因此,在你的Help文件中检索操作数〕。把产生错误的变量类型改为允许的类型或取其他的变量. "Unexpectedendoftextinbrackets" 插入一个右括号 " 这个运算符不允许放在括号内,去除括号或运算符。 "Closingbracketwithnocorrespondingopeningbracket" 删除右括号或者加上一个左括号. "Operandexpected" 加上一个附加的操作数。 "Operatorisnotextensible" 检查这个运算符的操作数的数量并去除多余的操作数. 把符号‘+’或‘-’后面的字符串改为一个有效的直接量。 去除逗号. "Unknowntype 把 说明括号前的助记符为一个数组或者将它改为一个被说明的数值变量. "IndexexpressionofanarraymustbeoftypeINT" 把下标改为INT,或者改成类型为TYPEINT的变量. "Toomanyindexesforarray" 检查用于说明数组的下标数量(1,2或3)并去除多余的下村. "Toofewindexesforarray" 检查用于说明数组的下标数量(1,2或3)并添加丢失的下标. " 如果变量是一个结构变量,那么把 去除N,并用NOT运算符对操作数进行”非”运算。 " 把 "Typemismatchinparameter 检查这个运算符,函数或功能块的操作数 "ConditionalOperatorrequirestypeBOOL" 前面指令的执行结果不珍有BOOL类型。插入有布尔结果的一个运算符或一个函数. "Functionnamenotallowedhere" 用一个变量或直接量代替函数调用. "Labelinbracketsnotallowed" 去除标号或括号. "Label 定义一个标号 "CAL,CALCorCALNrequirefunctionblockinstanceasoperand" 说明一个你想要调用的功能块例程. 在AT关键词后面插入一个有效的地址或去除AT关键词. "OnlyBOOLvariablesallowedonbitaddresses" 把说明语句中的类型改为BOOL或把地址改成其它大小的地址. "OnlyVARandVAR_GLOBALcanbelocatedtoaddresses" 去除地址位. "Itisnotpossibletolocateamultidimensionalarraytoanaddress" "Itisnotpossibletolocateanarrayofstringstoanaddress" "Itisnotpossibletolocateanarrayofanarraytoanaddress" "Unrecognizedvariableoraddress" 这个观察变量在项目中没有被说明,当按 "Extracharactersfollowingvalidwatchexpression" 去除多余的字符. "POU " 检查被调用的功能块的输入变量,并把 "Typemismatchoninputvariable "JumpandReturnisonlyallowedontherightsideofanetwork" 去除跳转(Jump)或返回(Return). "JumpandReturnrequireBOOLasinputtype" 前面指令的结果值不是BOOL型。插入有布尔结果值的一个运算符或一个函数. "Ajumpmusthaveexactlyonelabel" 把跳转语句的文本改为一个被定义的标号. "POU 检查这个POU所需要的输入数量并去除多余的输入或添加丢失的输入. "AnotherSTstatementorendofPOUexpected" POU在一个完整的语句里结束。使语句完整或去除这个语句. "Toomanyparametersinfunction 去除多余的参数. "Toofewparametersinfunction 加入丢失的参数. "IForELSIFrequireBOOLexpressionascondition" 把表达式改为一个有布尔结果的表达式。 "WHILErequiresBOOLexpressionascondition" 把表达式改为一个有布尔结果的表达式. "UNTILrequiresBOOLexpressionascondition" .把表达式改为一个有布尔结果的表达式 "NOTrequiresBOOLoperand" 把操作数改为一个布尔型操作数. "NoinstancespecifiedforcallofFB 把功能块例程文本(初始值为"Instance”)改为一个有效的功能块例程说明语句的助记符. " "VariableofFORstatementmustbeoftypeINT" 把变量改为INT类型的一个变量. "ExpressioninFORstatementisnovariablewithwriteaccess" 把变量改为一个有写存取的变量. "StartvalueofFORstatementmustbeoftypeINT" 把变量改为一个INT类型的变量. "EndvalueofFORstatementmustbeoftypeINT" "IncrementvalueofFORstatementmustbeoftypeINT" "EXIToutsidealoop" 去除Exit指令。 "Illegaladdress: 在你的PLC组态中检查哪些地址是有效的。然后用有效地址代替出错的地址或更改PLC组态. "END_STRUCToridentifierexpected" 结构定义必须用END_STRUCT关键词结束. " 用一个有效的运算符代替 "Typemismatchinparameter 检查 ." 用一个有效的函数名称代替 "Nowriteaccesstovariable 用一个有写存取的变量代替 "OutofMemory" 把项目存储起来,并离开系统。离开Windows环境,在下一次重新开始建立项目. " 检查运算符 " 检查运算符 "ADRneedsavariable,notaexpressionorconstantasoperand" 用一个变量代替表达式或常数. "Duplicatedefinitionoflabel 你使用同一名称来说明两个标号。给其中的一个标号重新定名. "Illegaldurationconstant" "ExpectingNumber,ELSEorEND_CASE" 没有正确地完成CASE语句。添加关键词END_CASE. "CASErequiresselectorofanintegertype" 选择器变量的类型是错误的。把选择器改为一个类型为INT的变量,或改变选择器的类型。 "Atleastonestatementisrequired" 插进一个语句. "Integernumberorsymbolicconstantexpected" 在这个CASE语句中,只允许一个整数值或符号常数。代替错误的数值. "Multipleunderlinesinidentifier" 在助记符名称内不允许有多条下划线。去除多余的下划线. "CommentsareonlyallowedattheendoflineinIL" 把注释移到一行的末端. "Atmost4numericalfieldsallowedinaddresses" 去除地址中多余的数字区. "Keywordsmustbeuppercase" 用大写字母写关键词. "Functionblockcallrequiresfunctionblockinstance" 在POU的说明语句部分,说明某个功能块的一个例程. "Expressionexpected" 在这种情况下,要求有一个表达式. "INIoperatorneedsfunctionblockinstanceordataunittypeinstance" 把操作数改为一个功能块的例程,因此所说明的操作数作为一个功能块例程,或使用一个被说明的功能块例程,或使用一个数据单元类型的状态。 去做信息正告诉你的事情。 "Overflowindurationconstant" 用一个有效的助记符代替 去除多余的字符。 修改一个与其它步骤的名称完全一样的步骤+名称。 把..