集散控制实验指导书_第1页
集散控制实验指导书_第2页
集散控制实验指导书_第3页
集散控制实验指导书_第4页
集散控制实验指导书_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、集散控制系统实验指导书陈玉明 南京工业大学自动化学院2009-11-10 DCS控制系统实验一实验目的1 掌握DCS控制系统硬件组成,软件结构。2 熟悉conmaker控制算法组态软件的使用。3 了解简单控制算法的设计。4 研究集成触发器的调整方法及各点波形。二实验内容1.1 工程组件工程 工程包含了一个控制程序中的所有对象。工程存储到命名文件里。在工程中包含下面这些对象:POU(程序组织单元),数据类型,图形元素、资源和算法库。POU(Program Organization Unit 程序组织单元)POU可以是:函数(Function),功能块 (Function Block) 和程序(P

2、rograms)。每个POU包含一个变量声明部分和一个本体。本体用IEC编程语言的任一种语言编写。包括 IL、 ST、SFC、FBD和 LD。ConMakerÔ支持所有 IEC 的标准POU。如果想在工程中使用这些POU,须将 standard.lib 库连接进当前工程。POU可以调用其它POU。但不允许递归调用。函数一个函数是一个POU, 函数执行时,会对一系列特定的输入产生唯一数据类型的输出结果。当定义函数时,切记函数必须接收一个数据类型(返回数据类型)。也就是说,在函数名的后面,输入一个冒号,然后输入类型。如: FUNCTION Fct: INT此外,结果必定被赋给函数本身,也

3、就是说函数名被用做输出变量。函数定义以关键字FUNCTION开始,以END_FUNCTION结束。用IL语言编写的函数例子有三个输入变量,返回的结果是前两个数的乘积除以第三个数。图2-1:函数在ST语言中,函数调用可以作为表达式里的一个操作数。函数没有任何内部条件。这意味着以相同的输入参数调用函数总是产生相同输出。调用上述函数的例子: 用 IL 表示:LD 7Fct 2,4ST Result 用 ST 表示:Result := Fct(7, 2, 4); 用 FBD 表示:在SFC语言中,函数调用只能以单步或者转换才能执行。注释:如果你在工程中用CheckBounds来命名函数,可以用这个函数

4、来检查工程变量范围溢出。定义函数名并且函数名有唯一的标志符。下面的例子说明函数是如何实现的:图2-2:实现CheckBounds函数的例程下面是测试数组越界CheckBounds函数的典型程序,它超出了定义数组的边界CheckBounds函数确保TRUE值没有赋给A10,而是赋给仍然有效的A7。因此,CheckBounds函数用来矫正超出数组边界的扩展。图2-3 函数CheckBounds的测试程序。注释:如果你在工程中定义了名为CheckDivByte, heckDivWord, CheckDivDWord和CheckDivReal,可以使用它们,看下面实现CheckDivReal函数的例子

5、。图2-4:实现CheckDivreal函数例程。运算符DIV使用函数CheckDivReal的输出作为除数。如下所示示例中,避免被0除,除数(d)由原值0强制成1,除的结果是799。图2-5 CheckDivReal函数的例子程序。功能块一个功能块是一个POU,它在运行中输出一个或多个值。和函数不同。功能块本身没有返回值,但存在一个或多个输出。若要使用功能块,则必须定义该功能块的调用实例。功能块声明以关键字FUNCTION_BLOCK开始,以END_FUNCTION_BLOCK结束。用IL实现功能块的例子,有两个输入变量和两个输出变量。一个输出是两个输入的乘积,另一个输出是相等比较结果。 图

6、2-6 功能块功能块实例名为INSTANCE的FUB功能块实例的举例 INSTANCE:FUB从外部,只能改变功能块输入和输出参数。不允许对功能块的内部变量直接赋值(IEC规定)。 访问输入变量的例子:功能块 fb 有一个INT类型的输入变量in1。PROGRAM progVAR inst1: fb ; END_VARLD 17ST inst1.in1CAL inst1END_PROGRAM功能块和程序的声明部分包含了实例声明(instance declare),但实例声明在函数中是不允许的(函数本身有返回值)。对于POU,访问其它POU中声明的功能块是受限制的。POU只可以访问全局功能块。功

7、能块实例名可以作为函数或者功能块的输入。注释:功能块执行以后,所有的值都保留到下次执行之前保持不变。因此,由于功能块中存在中间变量,使表面上相同的输入参数,实际上可能输出不同的输出值。调用功能块通过输入实例名,再输入一个点,然后再输入变量名,即可使用功能块的变量。可以使用文本语言IL和ST在打开功能块的时候设置输入参数。给功能块实例名后的圆括号里的参数赋值。(和在声明时变量初始化一样。赋值使用”:=”)。调用上述FUB功能块的例子:乘积的结果保存在变量ERG中,比较的结果保存在QUAD中。声明以INSTANCE命名的FUB实例。用IL语言调用功能块:图2-7:用IL语言调用功能块。用ST语言调

8、用,声明部分和IL是一样的。图2-8用ST语言调用功能块。 用FBD语言,下图显示了功能块调用(声明部分和IL一样)图2-9:用FBD调用功能块用SFC语言,功能块调用只能发生在单步运行方式。程序程序是一个POU,在运行过程中返回几个值。程序在工程中是全局公认的。保留这次所有值直到下一次运行。图2-10:程序示例程序可以被调用,不允许在函数中调用程序。同样也没有程序实例。如果一个POU调用程序导致程序的值被改变,那么,即使程序是从其它的POU之内被调用的,这些改变将会保持到下一次程序被调用。这不同于调用功能块。在那里,只改变功能块实例中的值。这些改变只有当相同实例被调用时才起作用。程序声明以关

9、键字PROGRAM 开始,以END_PROGRAM 结束。程序调用举例:IL:CAL PRGExampleLD PRGexample.PARST ERGST:PRGExample;Erg := PRGexample.PAR;FBD:MACS_PRG可能的调用顺序举例:LD 0ST PRGexample.PAR (*Default setting for PAR is 0*)CAL IL call (*ERG in IL call results in 1*)CAL ST call (*ERG in ST call results in 2*)CAL FBD call (*ERG in FBD

10、call results in 3*)如果由主程序将PRGexample中的变量PAR初始化为0,那么使用这个程序调用相继调用程序,在程序中ERG的结果是1,2,3。如果一个程序交换了调用的顺序,那么结果参数的值也会以相应的方式改变。MACS_PRGMACS_PRG是一个特殊的欲定义POU。每个工程必须包含这个特殊的程序。每个控制周期调用一次这个POU。新的工程创建以后,第一次使用”工程”,”增加对象”命令时,在POU对话框的缺省入口是命名为MACS_PRG的POU。你不要改变缺省设置!如果任务已经定义好了,且不包含任何MACS_PRG,在这种情况下,过程顺序依赖任务分配。注意:不要删除或者更

11、改POU中MACS_PRG的名字。MACS_PRG在单任务程序中一般是主程序。动作动作可以定义到功能块和程序。动作代表一个进一步的实现。这种实现完全可以由别的语言作为正常“实现创建”。动作和数据属于相同的功能块或者程序,动作和数据一起工作。动作使用相同的输入/输出变量和局部变量作为正常实现使用。 图2-11:功能块的动作举例在例子中,调用功能块Counter,根据输入变量“in”的值,增加或者减小输出变量“out”的值。调用功能块的动作Reset,设置输出变量的值为0。在两种情下,都是写入“out”变量。以程序名.动作名或者实例名.动作名来调用动作。如果需要在自己的块内调用,只是使用文本编辑器

12、中动作名和用图形形式表达的不需要实例信息的功能块调用。动作调用举例:所有例子的声明:PROGRAM MACS_PRGVARInst : Counter;END_VARIn AWL:CAL Inst.Reset(In := FALSE)LD Inst.outST ERGST:Inst.Reset(In := FALSE);Erg := Inst.out;FDB:注释:动作在顺序功能图中起非常重要的作用,见2.2.3顺序功能图SFC。IEC标准除了承认顺序功能图的动作以外不承认其它动作。资源你需要资源来组态和组织工程并且跟踪变量的值:r 全局变量可以在整个工程中使用。r 硬件组态用于配置硬件。r

13、任务组态用于引导程序完成任务。r 采样跟踪用于变量值的图形显示。r 监视接收管理器用于显示变量值和设置缺省变量值。请看“资源”一章。库可以在工程中包含一系列库。可以象使用自定义变量一样使用库里面的POU,数据类型,和全局变量。”standard.lib”库是程序的标准组成部分,可以使用它。请看“库管理器”一章。数据类型和标准数据类型一样,使用者可以定义他自己的数据类型。可以生成结构体,枚举型和引用。请看附录中的“标准”和“定义数据类型”视图ConMakerÔ提供视图。可以显示工程变量。在视图的帮助下离线绘制几何元件。这些几何元件根据具体的变量值在线改变他们的形式。请看“视图”一章1.

14、2 语言1.2.1 指令列表(IL)指令列表(IL)包含一系列的指令。每条指令从新行开始,包含一个运算符,根据运算类型,一个或多个操作数由逗号分开。在一条指令的前面可以有一个标志记号(标签)接着是一个冒号(:)。注释必须是一行中最后的部分。指令之间可以插入空行。举例:LD 17ST lint (* 注释 *)GE 5JMPC nextLD idwordEQ istruct.sdwordSTN testnext:IL中的修改工具和运算符在IL语言中可以使用下面的修饰符和运算符。修饰符:r C有JMP,CAL,RET:只有前一个表达式是真(TRUE)时,指令才被执行。r N有JMPC,CALC,R

15、ETC:只有前一个表达式是假(FALSE)时,指令才被执行 r N:操作数的负数(不是累加器的负数)IL的所有操作符以及它们的修饰符和相应意义。运算符修饰符意义LDN当前结果赋予操作数STN当前结果存入操作数S如果当前结果是TRUE,把布尔型操作数置为TRUER如果当前结果是TRUE,把布尔型操作数置为FALSE.ANDN,(位逻辑运算符ANDORN,(位逻辑运算符ORXORN,(位逻辑运算符XORADD(加SUB(减MUL(乘DIV(除GT(>GE(>=EQ(=NE(<>LE(<=LT(<JMPCN转移到标签CALCN调用程序功能块。RETCN退出POU并

16、且返回到调用者。)计算延迟操作。 在附录中你会找到所有的IEC运算符。 使用一些修饰符进行IL编程举例:LD TRUE (*在累加器中装载TRUE*)ANDN BOOL1 (*BOOL1变量取负后与上值执行AND命令*)JMPC mark (*如果结果是真,那么跳转到标签”mark”*)LDN BOOL2 (*取负后保存*)ST ERG (*BOOL2放入ERG*)label:LD BOOL2 (*保存值*)ST ERG (*BOOL2 放入ERG*)在IL语言中,可能在运算之后插入括号,那么括号的值当作一个操作数考虑。比如:LD 2MUL 2ADD 3ST ERG这里ERG的值是7。但是,如

17、果加入一对圆括号如下所示:LD 2MUL 2(ADD 3)ST ERG这里ERG的结果是10,MUL运算符只有到“)“才被执行;就象MUL 5被计算一样。1.2.2 结构化文本(ST)结构化文本包含一系列指令,和在高级语言里一样,可以执行(“IFTHENELSE”)或者(WHILEDO)循环。举例:IF value < 7 THENWHILE value < 8 DOvalue:=value+1;END_WHILE;END_IF;表达式:表达式是一个结构,它执行后返回一个值。表达式由运算符和操作数组成。操作数可以是常量,变量,函数调用,或者是另一个表达式。计算表达式表达式的计算通过

18、执行具有结合规则的运算符进行。有最强结合的运算符先被执行,然后执行执行下个强结合运算符,等等。直到所有的运算符被处理完。有相同结合的运算符从左到右执行。下面你看到按约束力度排序的ST运算符:运算符号结合力度放入圆括号(表达式)最强结合函数调用函数名(参数列表)求幂EXPT求负-求补NOT乘积*除/取模MOD加+减-比较<,>,<=,>=相等=不等<>逻辑与AND逻辑异或XOR逻辑或OR最弱结合下面是ST语言的指令,安排在一个表中,并且给出例子:指令类型例子赋值A:=B; CV := CV + 1; C:=SIN(X);调用功能块并且CMD_TMR(IN :=

19、 %IX5, PT := 300);使用功能块输出A:=CMD_TMR.Q返回RETURN;IFD:=B*B;IF D<0.0 THENC:=A;ELSIF D=0.0 THENC:=B;ELSEC:=D;END_IF;CASECASE INT1 OF1: BOOL1 := TRUE;2: BOOL2 := TRUE;ELSEBOOL1 := FALSE;BOOL2 := FALSE;END_CASE;FOR循环J:=101;FOR I:=1 TO 100 BY 2 DOIF ARR I = 70 THENJ:=I;EXIT;END_IF;END_FOR;WHILE循环J:=1;WHIL

20、E J<= 100 AND ARR J <> 70DOJ:=J+2;END_WHILEREPEAT循环J:=-1;REPEATJ:=J+2;UNTIL J= 101 OR ARR J = 70END_REPEAT;退出程序EXIT;空指令;结构化文本这个名字就已经表明它是用于结构化编程的。也就是说,ST为特定的经常使用的结构化编程提供了预先确定的结构。例如,让我们比较两个分别用IL和ST语言实现的同等重要的编程顺序:用IL语言实现2的乘幂的循环:Loop:LD CounterJMPC endLD Var1MUL 2ST Var1LD CounterSUB 1ST Counte

21、rJMP LoopEnd:LD Var1ST ERG用ST语言编程实现的相同循环为WHILE counter<>0 DOVar1:=Var1*2;Counter:=counter-1;END_WHILEErg:=Var1;可以看出,用ST实现的循环不但较快变成实现,而且也比较容易阅读。尤其是对于大型构架中令人费解的循环。赋值运算符在赋值运算符的左边是操作数(变量,地址),在它的右边,是被赋予的表达式的值。例子: Var1 := Var2 * 10;这行完成以后,Var1是Var2的十倍。用ST语言调用功能块通过写入功能块实例的名字,然后在圆括号中赋给参数值来调用功能块。在下面的例子

22、,赋给参数IN和PT值来调用时钟。结果变量Q赋给变量A。和在IL语言中一样,用功能块名来访问结果变量,然后是一个点和变量:CMD_TMR(IN := %IX5, PT := 300);A:=CMD_TMR.Q返回指令返回指令可以根据一个条件退出一个POU。IF指令使用IF指令可以检查一个条件,根据这个条件执行相应的指令。语法:IF <逻辑表达式> THEN<IF指令>ELSIF <逻辑表达式1> THEN<ELSEIF指令1>ELSIF <逻辑表达式 n> THEN<ELSEIF指令 n-1>ELSE<ELSE指令&

23、gt;END_IF;在括弧的部分是可选择的。如果表达式1返回TRUE,那么只有IF指令被执行。其它的指令不被执行。同样的,从逻辑表达式2开始,相继执行逻辑表达式,直到其中一个表达式返回TRUE为止。返回TRUE的逻辑表达式对应的指令被执行。如果没有逻辑表达式生成TRUE,那么只有ELSE指令被执行。例子:IF temp<17THEN heating_on := TRUE;ELSE heating_on := FALSE;END_IF;这里,如果温度低于17度,打开加热器,反之则保持关闭状态。CASE指令使用CASE指令,可以在结构中用一个相同的条件变量表示几个条件指令。语法:CASE &

24、lt;Var1> OF<Value1>: <指令1><Value2>: <指令 2><Value3, Value4, Value5>: <指令 3><Value6 . Value10>: <指令4> .<Value n>: <指令n>ELSE <ELSE 指令>END_CASE;CASE指令根据下面的模型来执行r 如果变量<Var1>有值值 i那么指令I>被执行。r 如果变量<Var1>没有任何指定的值,那么<ELSE指令

25、被执行。r 如果变量的几个值都需要执行相同的指令,那么我们可以把几个值相继写在一起并且用逗号分开。这样,就会有相同的执行指令。r 如果对于变量的一个范围需要执行相同的指令,可以写入初值和终值中间用两个点分开。这样,条件就会有相同的执行。 例子:CASE INT1 OF1, 5: BOOL1 := TRUE;BOOL3 := FALSE;2: BOOL2 := FALSE;BOOL3 := TRUE;10.20: BOOL1 := TRUE;BOOL3:= TRUE;ELSEBOOL1 := NOT BOOL1;BOOL2 := BOOL1 OR BOOL2;END_CASE; FOR循环使用F

26、OR循环,可以编写循环过程。语法:INT_Var :INT;FOR <INT_Var> := <INIT_VALUE> TO <END_VALUE> BY <Stepsize> DO<Instructions>END_FOR;在中的部分是可选的。只要记数INT_Var不比<END_VAULE>大,指令就会被执行。执令执行之前首先检查这个条件,如果INIT_VA:LUE>比<END_VALUE>大,指令就永远不会被执行。当指令被执行时,INT_Var总是增加<Step size>,步长可以是任意

27、的整数值。如果不写步长,缺省值是1。当INT_Var>大于<END_VALUE>时循环结束。例子:FOR Counter:=1 TO 5 BY 1 DOVar1:=Var1*2;END_FOR;Erg:=Var1;我们假定Var1的缺省值是1,那么循环结束后,Var1的值为32。注释:<END_VALUE>一定不等于计数INT_VAR的极限值。如果记数变量的类型是SINT,END_VALUE是127。你会进入死循环。WHILE循环WHILE循环用起来很象FOR循环,不同的是结束条件可以是任意的逻辑表达式。你指定一个条件,当条件满足的时候,循环被执行。语法:WHIL

28、E <逻辑表达式><指令>END_WHILE;只要逻辑表达式返回TRUE,指令就会被重复执行。如果在第一次计算时,逻辑表达式的值已经是FALSE,那么指令永远不会被执行。如果逻辑表达式的值永远不会是FALSE,那么指令被无休止的执行,产生一个相对时间延迟。注释:程序员必须确保不会导致死循环。通过改变循环指令的条件可以做到这点,比如,通过增加或者减少计数。 例子:举例:WHILE counter<>0 DOVar1 := Var1*2;Counter := Counter-1;END_WHILE在一定意义上,WHILE和REPEAT循环比FOR循环功能更强大。

29、因为我们不需要在执行循环之前计算循环次数。因此,在有些情况下,用这两种循环就可以了。然而,如果清楚知道循环次数,FOR循环更好。REPEAT循环REPEAT循环不同于WHILE循环,因为只有在指令执行以后,才检查中断条件。无论结束条件怎样,循环至少执行一次。语法:REPEAT<Instructions>指令UNTIL <Boolean expression>逻辑表达式END_REPEAT;直到<逻辑表达式>返回TRUE,<指令>才停止执行。如果在第一次计算时,逻辑表达式产生TRUE,那么指令只被执行一次,如果逻辑表达式不会产生TRUE,那么指令将

30、无休止的循环,导致相对时延。注释:程序员必须确保不会导致死循环。通过改变循环指令条件可以做到这点,比如,增加或者减少记数。例子:REPEATVar1 := Var1*2;Counter := Counter-1;UNTILCounter=0END_REPEAT;EXIT指令如果EXIT指令出现在FOR,WHILE,REPEAT循环中,那么不管中断条件如何,EXIT出现的循环终止。1.2.3 顺序功能图(SFC)顺序功能图是面向图形的语言,用来描述程序中不同动作的时间顺序。图2.12 用SFC表示的网络单步用顺序功能图编写的POU包含一系列的步,这些步通过有向的连接(转换)彼此联系。有两种类型的

31、步。r 简化步包含一个动作和一个显示步活动的标志。如果实现步的动作,在步的右上角出现一个小三角形。r IEC步包含一个标志和一个或多个赋予的动作和逻辑变量。 相关动作出现在步的右边。在后面会论述更多这方面的内容。动作动作包含用IL或者ST语言实现的一系列指令,用FBD或者LD实现的大量网络或者用顺序功能图(SFC)实现的网络。对于简化步,动作总是和步连接。用鼠标双击动作所属的步,然后编辑步。或者选择步,然后选择采单命令”其它“”放大动作/转移”.IEC步直接悬挂在对象管理器下面的SFC_POU。在编辑器中双击或者按<Enter>键装载动作。可以用”工程”添加动作”创建新动作进入或者

32、退出动作可以在步中加入进入动作和退出动作。进入动作只有步成为活动状态以后, 立即执行一次。退出动作只在步不活动之前执行一次。具有进入动作的步在左下角有“E”标志进入,右下角有“X”标志退出。可以用任何语言实现进入和退出动作。用鼠标双击步的相应角,即可编辑进入或者退出动作。有进入和退出动作步的例子:转换/转换条件在步之间就是所说的转换。转换条件可以是逻辑变量,逻辑地址,逻辑常量,或者是用ST语法实现的具有逻辑结果的一系列指令(I<=100)AND b)或者是完全由其它语言编程实现。活动步调用SFC POU之后,属于初始化步的动作(被双边包围)首先执行。步的动作被执行,这样的步叫做活动步。如

33、果步是活动的,每次循环执行相应的动作。在线模式下,活动步以兰色显示。在一个控制周期中,执行属于活动步的所有动作。之后,如果下步的转换条件是TRUE,下步将变成活动的。当前活动步将会在下个周期执行。IEC步和简化步一样,可以使用SFC实现的标准IEC步。可以赋给IEC步任意多个动作。IEC步的动作分散在步中,在它们的POU中,这些动作可以被重复使用。为了做到这一点,它们必须用”其它”,”关联动作”.命令关联到单步。和动作一样,可以赋给步逻辑变量。通过限定符,激活或者撤消动作和逻辑变量带有时间延迟。由于一个动作仍然是活动的,即使已经执行下一步,比如通过限定符S(设置),这样可以获得并发过程。每次调

34、用AS,相关的逻辑变量被设置或者重置。就是说,每次调用,逻辑变量获得TRUE或者FALSE值。IEC步相关的动作显示在步的两个框的右边框。左字段包含可能有时间常量的限定符,右字段包含动作名,即各个逻辑变量名。注释:如果一个动作不被激活,动作会再次被执行。也就是说,每一个动作至少执行两次(一个具有P限定符的动作也是这样)在第一次调用撤消动作时,活动动作每次以字母表顺序执行。有两个动作的IEC步举例:为了更容易的跟随过程,在线模式下所有的活动动作象活动步一样以蓝色显示。每次循环以后做一次检查,看哪个动作是活动的。一个新插入的步是否为IEC步取决于是否选择了”其它”Use IEC-Steps”命令。

35、你必须在工程中包含特殊的SFC库Iecsfc.lib才能使用IEC步。图2.13对象管理器包含动作的SFC POU.限定符把IEC步和动作关联,需要使用下面的限定符。N非存储动作随步活动R重置动作无效S设置(存储)动作被激活并且保持到重置L时限动作在一定时间被激活。最长时间是步活动时间D时延一定时间以后动作成为活动的。如果步仍然是活动的,那么动作将保持活动状态。P脉冲如果步是活动的,动作只是被执行一次。SD存储和时延一定时间后动作被激活并且保持活动直到重置DS延迟和存储只要步仍然是活动的并且保持到重置,一定时间以后动作被激活。SL存储和时限在一定时间内动作是活动的。限制符L,D,SD,DS,和

36、SL需要TIME常量格式的时间值。SFC中的隐含变量在SFC中,可以使用隐含声明的变量。属于每步的标志存储了步的状态。对于IEC步,步标志(步的活动和不活动状态)称为步名.x,对于简化步,步标志称为<步名>。当相关步是活动状态的时候,逻辑变量的值是TRUE,相反,当步是非活动状态的时候,逻辑变量的值是FALSE.可以适用于SFC块的每一个动作和转换。可以使用变量动作名.x询问IEC动作是否活动的。注释:在IEC动作处于无效期间,变量已经有了FLASE值。对于IEC步,隐含变量步名.t用来询问步的活动时间。SFC标志如果在SFC中,步的活动状态时间长于它的属性状态时间,将会设置一些特

37、殊标志。同样可以设置变量来控制顺序功能图中的程序流。要使用这些标志,有必要在全局或局部作为输入或者输出变量声明这些标志。SFCEnableLimit:这个变量的类型是BOOL,当它的值是TRUE时,步的超时将会注册在SFCWError。忽略其它的超时。SFCInit:这个变量也是BOOL类型。当这个变量是TRUE时,顺序功能图返回到初始化步,同时其它的SFC标志重置。只要变量有TRUE值,初始化步保持活跃,但是不被执行。只有当SFCInit被重设置为FALSE,功能块才可以恢复正常执行。SFCQuitError:BOOL类型的变量。只要变量值是TRUE,SFC图的执行就会停止,因而,在变量SF

38、CError中,重置一个可能的超时。当变量重新获得FALSE时,在活动步中所有以前的时间重置。SFCPause:BOOL类型变量,只要这个变量是TRUE,SFC图的执行就停止。SFCError:当超时发生在SFC图中时,设置这个逻辑变量。SFCTrans:BOOL类型的变量。当转换执行时,变量具有TRUE值。SFCErrorStep:这是STRING类型的变量,它存储一个步名,这个步导致超时发生。SFCErrorPOU:这是STRING类型的变量,这个变量包含一个块名。在这个块中,发生了超时。SFCCurrentStep:这个变量的类型是STRING。步名存储在活动变量中,不受时间监视。一旦在

39、同时顺序下,步存储在右外侧的分支里。如果一个超时发生并且变量SFCError不重置,不会注册其它超时。选择分支 在SFC中,两个以上的分支可以定义为选择分支。每个选择分支必须开始和结束于转换。选择分支包含并行分支和其它选择分支。选择分支开始于水平行(选择开始)结束于水平行(选择结束)或者结束于跳转。如果选择起始行之前的步是活动的,那么每个选择分支的第一个转换从左到右执行。从左边开始,转换条件是TRUE的第一个转换被打开,随后的步被激活(请看活动步)。并行分支在SFC中,两个以上的分支可以定义成并行分支。每个并行分支开始和结束于一个步。并行分支开始于一个双行(并行开始)结束于一个双行(并行结束)

40、或者是一个跳转。如果前步的并行开始行是活动的并且这一步的转换条件是TRUE,那么所有并行分支的第一步都成为活动的(看活动步)。这些分支彼此是平行处理的。当前面的步都是活动的并且这一步之前的转换条件产生TRUE值,并行结束行之后的步变成活动状态。跳转跳转是连接到有跳转符号的步。因为不允许产生前向或者彼此交叉的连接,所以需要跳转。1.2.4 功能块图(FBD)功能块图是面向图形的编程语言。它用一列网络工作。每个网络包含一个代表逻辑的或者数学的表达式,功能块调用,一个跳转或者一个返回指令。下面是一个例子,说明了在功能块图中典型的网络 图2.14功能块图中的网络。同样请看在“ConMakerÔ

41、;编辑器”里面的“连续功能图编辑器“一章。1.2.5 梯形图(LD)梯形图也是一种面向图形的编程语言,和电路结构相似。一方面,梯形图适合构造逻辑开关,另一方面,可以创建同FBD中一样的网络,因此,LD对于控制其它POU非常有用。梯形图包含一系列网络。网络通过左右垂直线被限制在左边和右边。在中间是由接触点,线圈和连接线组成的电路图。每个网络包含一系列接触点,从左到右的状态是”ON“或者“OFF”,对应于逻辑值TRUE和FALSE。每一个接触点属于一个逻辑变量。如果变量是TRUE,状态沿着连接线从左到右传递。相反,右连接接收OFF值。举例说明了梯形图中典型的网络。图2.15:由接触点和线圈构成的梯

42、形图网络。触点在LD中,每个网络均包含网络左边的触点(触点由两条并行线表示|)从左到右表示状态”ON”或者“OFF”。这些状态对应于逻辑值TRUE和FALSE。每个触点包含一个逻辑变量。如果这个变量是TRUE,那么逻辑值从左向右沿连接线进行传递。触点可以并行连接,那么并行分支之一必须传送”ON”值,以便并行分支总体传送”ON”;或者触点按串联连接,那么全部触点必须传送状态”ON”,以便最后的状态传送”ON”状态。这和并联或者串联电路相一致。触点可取非,由触点符号|/|识别。输出线圈在LD网络右边有一些用()表示的线圈。这些线圈只能是并联的。线圈从左向右传递连接的逻辑值,并且把值拷贝到合适的逻辑

43、变量中。 可以预置ON(对应逻辑变量TRUE)或者OFF(对应FALSE)。触点和线圈可以取非(在例子中,触点SWITCH1和线圈%QX3。0取非)。如果线圈取非(由线圈符(/)斜线识别),那么,线圈将取非后的值拷贝到合适的逻辑变量中。如果触点取非,那么只有合适的逻辑值是FALSE时,才能接通。梯形图中的功能块和触点、线圈一样,你同样可以输入功能块和程序。在网络中,他们必须有逻辑类型的输入和输出、且可以象触点一样在LD网络的左边使用。置位/复位线圈线圈可以定义成置位或者复位线圈。通过线圈符号:(S)可以识别一个置位线圈。一旦设置为TRUE值,置位线圈将一直保持为TRUE。通过线圈符号:(R)可

44、以识别复位线圈。它从不改写逻辑变量中的FALSE。如果变量设置为FLASE,复位线圈将一直保持位FALSE。象FBD的LD用LD工作的时候,很可能你想使用触点开关的结果来控制其它的POU。另一方面,你可以使用线圈,把结果放在全局变量中,这个全局变量可以用在其它地方。你也可以在LD网络中直接插入可能的调用。这时,你需要一个有使能EN的POU。这种POU完全是正常的运算符,函数,程序,或者功能块。他们有一个带有EN标志的额外输入:EN输入总是BOOL类型,它的意思是:当使能端EN为TRUE值时,POU被执行。一个带使能端EN的POU和线圈是并联的,因此,EN输入连接在触点和线圈之间的连接线上。如果

45、通过这个线传递了ON信息,POU被完全正常执行。从这样一个EN POU 开始,你会创建一个很象FBD的段。图2.16:带有EN POU的LD段的一部分1.3 调试,在线功能采样跟踪采样跟踪允许根据触发事件来跟踪变量值。预先定义的逻辑变量(触发变量)的上升沿和下降沿。ConMakerÔ允许最多跟踪20个变量,每个变量500个值。调试ConMakerÔ的调试功能让你更容易找到错误。运行命令”工程” “选项”在Build选项下弹出的对话框中选择Debugging项,这样就可以调试了。断点断点是在程序中进程停止的地方。这样,在程序的具体地点观察变量的值。单步 单步的意思是:r 在I

46、L中:执行程序直到下一个CAL,LD或者JMP命令。r 在ST中:执行下一个指令。r 在FBD,LD中:执行下个节。r 在SFC中:继续执行动作直到下一步。通过一步一步进行,你可以检查程序的逻辑正确性。单循环如果选择单循环,每个单循环执行后程序将暂停执行。在线修改值在运算过程中,变量可以被设置值(写值)或者每次循环后重新用值强制赋值(强制)。在线模式下,同样可以在值上双击改变变量值。通过这种方法,逻辑变量从TRUE改为FALSE或者从FALS改为TRUE,对于每种其它类型的变量,可以使用对话框Write Variable ,可以在那里编辑变量的值。监视除了屏幕上可见的变量声明外,连续读出和显示

47、来自硬件的当前值。在线模式下,ConMakerÔ监视屏幕上的所有可视变量,同时,变量可以一起放在监视接收管理器,你可以在一处看变量的数据。仿真在仿真期间,程序不是在控制器的硬件中执行,而是在ConMakerÔ运行的仿真计算机中执行。所有在线功能都是可用的。不需要目标硬件来测试程序的正确性。1.4 标准IEC1131-3标准是用于可编程逻辑控制器的国际标准编程语言。在ConMakerÔ中,提供的编程语言完全遵守IEC1131-3标准的要求。根据这个标准,程序包含下面的元素:r 结构r POUr 全局变量ConMakerÔ程序的执行从特定的POU MACS_

48、PRG开始。POU MACS_PRG可以调用其它的POU。 2.1 控制一个交通信号单元让我们现在开始写一个小例程。这是一个简单的交通信号单元,用于在十字路口控制两个交通信号。两个交通信号的红/绿状态转换,为了避免事故,我们插入黄色或者黄/红转换状态。后者要比前者时间长。我们进一步想象使用CAN总线系统并且做相应的组态。在这个例子中,你将会看到如何使用IEC1131-3标准实现与时间有关的编程,如何在ConMakerÔ的帮助下编辑不同的语言,当熟悉ConMakerÔ仿真的时,如何容易的连接它们。创建POU启动ConMakerÔ,选择“文件”新建”。交通信号做什么?

49、在POU交通信号中,我们给灯光赋予单个的交通信号状态。也就是说,我们要确保红灯在红色状态和黄红状态时点亮,黄灯在黄色和黄红状态时点亮等。等待做什么?在等待下,我们将编写一个简单的时钟,输入将会接收状态的毫秒单位的时间长度,时间周期一结束就输出TRUE值。顺序做什么?在顺序中,复合在一起以便于正确的灯光,对于需要的时间周期内在正确的时间点亮。MACS_PRG做什么?在MACS_PRG中,输入启动信号连接到交通灯顺序并且提供每个灯的颜色指令作为输出。“TRAFFICSIGNAL”声明让我们回到交通信号POU。在声明编辑器中,作为输入变量(关键字VAR_INPUT和END_VAR之间)声明一个名为S

50、TATUS的INT型变量。STATUS有四个可能的状态,代表了交通信号状态绿,黄,黄/红,和红。因此,我们的交通信号有三个输入,即红,黄,绿。要声明这三个变量。功能块交通信号声明如下:图3.1:功能块交通信号的声明部分“TRAFFICSIGNAL”主体现在,POU的输入STATUS决定输出变量的值。进入POU主体。单击第一个网络左边的区域(带有数字1的灰色区域)。你已经选择了第一个网络。现在选择菜单“插入”,”运算符”。在第一个网络中,插入了带有两个输入的AND运算符的框。用鼠标指针单击文本AND然后把文本修改成EQ。从两个输入中选择上面三个问号标志,然后输入变量STATUS。然后选择下面的问

51、号输入1。得到下面的网络:现在,单击EQ框后面。选择EQ运算的输出。选择“插入”,”赋值”。把问号改成GREEN。现在,已经创建了一个下面的网络。STATUS和1比较,结果赋给GREEN。如果预置状态值是1,那么网络开关打到GREEN。对于其它的交通信号颜色,我们需要两个以上的网络。用命令“插入” “NetWork(after)”创建它们。这些网络看上去象例子中建立的那样。现在完成的POU如下:图3.2:功能块交通信号,指令部分为了在一个运算符前面插入运算符,你必须选择输入位置,再添加运算符。然后,使用命令“插入”,”运算符”.你可以象建立第一个网络一样建立这些网络。现在,我们的第一个POU已

52、经完成了。根据STATUS的输入值,交通信号控制我们希望的灯光颜色。连接standard.lib对于在POU里WAIT(等待)时钟,我们需要一个来自标准库函数。因此,用“窗口”,”库管理器”.选择”插入”,”添加库”来打开库管理器。打开文件对话框出现。从一列库中选择standard.lib。“WAIT”声明现在让我们返回到POU WAIT。这个POU用作一个时钟,使用它,我们可以确定每个交通信号状态的时间周期长度。我们的POU接收一个TIME类型的输入变量,产生一个逻辑值输出,我们利用这个值来调用OK,当需要的时间周期结束时,它的值应该是TRUE。通过在声明末尾插入“:FALSE”,我们设置F

53、ALSE值。为实现我们的目标,我们需要POU TP,这是一个时钟产生器。它有两个输入(IN,PT)和两个输出(Q,ET)。TP做以下的事情:只要IN是FALSE,EN就是0,Q是FALSE。只要IN的值是TRUE,以毫秒计算输出ET的时间。当ET达到值PT,那么ET不在记数。与此同时,只要ET小于PT,Q产生TRUE。当达到PT值时,Q又产生FALSE。此外,在附录中,你会发现所有来自标准库POU的简短说明。为了在POU WAIT中使用POU TP,我们必须从TP中创建一个本地实例。在关键字VAR,END_VAR之间,我们声明一个TP类型的本地变量ZAB(代表共用时间)WAIT的变量声明部分如

54、下:图3.3功能块WAIT声明部分“WAIT”程序主体为了创建需要的时钟,POU的主体必须象下面一样编程:图3.4:功能块WAIT,指令部分首先,检查Q是否已经设置为TRUE(好象记数已经执行),在这种情况下,我们使用ZAB没有改变什么,只是在没有输入下调用功能块ZAB(为了检查时间周期是否已缢出)。我们在ZAB里设置变量IN为FALSE,因此同时设置ET为0,Q 为FALSE。在这种方式下,所有的变量设置在需要的初始状态。现在,我们用变量TIME的必要时间赋给变量PT,然后以IN:=TRUE调用ZAB。在功能块ZAB中,变量ET开始记数,直到达到TIME值,然后Q设置为FALSE。WAIT每

55、执行一次后,Q取非后的值保存在OK中。Q一旦是FALSE,OK 产生TRUE。现在,要花点时间把我们的两个功能块WAIT和TRAFFICSIGNAL合成在主程序MACS_PRG中。“SEQUENCE”第一扩展层首先,声明我们需要的变量。它们是:BOOL类型的输入变量START,两个INT类型的输出变量TRAFFICSIGNAL1和TRAFFICSIGNAL2和一个WAIT类型的变量(DELAY作为迟延)。程序SEQUENCE显示如下:图3.5:程序顺序,第一扩展层,声明部分。创建一个SFC图在SFC中,POU的开始图总是包含一个“Init”动作,下面是”Trans0”转换和返回初始化。我们应对它扩展。首先,在我们编程单个动作和转换之前,要确定图的结构。对于每个TRAFFICSIGNAL状态,我们需要一步。通过标志Trans0插入它,然后选择“插入”,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论