9
CPU的程序分为操作系统和用户程序。操作系统用来处理plc的启动、刷新过程映像输入/输出区、调用用户程序、处理中断和错误、管理存储区和通信等任务。
用户程序由用户生成,用来实现用户要求的自动化任务。STEP 7将用户编写的程序和程序所需的数据放置在块中,功能块FB和功能FC是用户编写的子程序,系统功能块SFB和系统功能SFC是操作系统提供给用户使用的标准子程序,它们和组织块OB统称为逻辑块。
PLC得电或由S**模式切换到RUN模式时,CPU执行启动操作,将没有断电保持功能的位存储器、定时器和计数器清零,清除中断堆栈和块堆栈的内容,复位保存的硬件中断等。此外还要执行一次用户生成的“系统启动”组织块OB100,完成用户*的初始化操作。以后PLC采用循环执行用户程序的方式,这种运行方式也称为扫描工作方式。
在PLC的存储器中,设置了一片区域用来存放输入信号和输出信号的状态,它们分别称为过程映像输入区和过程映像输出区。PLC梯形图中的其他编程元件也有对应的存储区。
下面是循环处理的各个阶段的任务(见图):
1)操作系统启动循环时间监控。
2) CPU将过程映像输出区的数据写到输出模块。
3) CPU读取输入模块的输入状态,并存入过程映像输入区。
4) CPU处理用户程序,执行用户程序中的指令。
5)在循环结束时,操作系统执行其他任务,例如下载和删除块,接收和发送全局数据等。
图 扫描过程
6) CPL返回*一阶段,重新启动循环时间监控。
在启动完成后,每次循环都要调用一次组织块OB1。OB1是用户程序中的主程序,它可以调用别的逻辑块(FB、FC、SFB或SFC)。循环程序处理过程可以被某些事件中断。如果有中断事件出现,当前正在执行的块被暂停执行,并自动调用分配给该事件的组织块。该组织块被执行完后,被暂停执行的块将从被中断的地方开始继续执行。
在循环程序处理过程中,CPU并不直接访问I/O模块中的输入地址区和输出地址区,而是访问CPU内部的过程映像区。
在读输入模块阶段,PLC把所有外部输入电路的接通/断开状态读人过程映像输入区。
外部输入电路接通时,对应的过程映像输入位为1状态,梯形图中该输入位的常开触点接通,常闭触点断开。外部输入电路断开时,对应的过程映像输入位为0状态,梯形图中该输入位的常开触点断开,常闭触点接通。
某一编程元件对应的位为1状态时,称该编程元件的状态为ON,该位为0状态时,称该编程元件的状态为OFF。在程序执行阶段,即使外部输入电路的状态发生了变化,过程映像输入位的状态也不会随之而变,输入信号变化了的状态只能在下一个扫描循环周期的读取输入模块阶段被读入过程映像输入区。
PLC的用户程序由若干条指令组成,指令在存储器中顺序排列。在没有跳转指令和块调用指令时,CPU从*一条指令开始,逐条顺序地执行用户程序,直到用户程序结束之处。在执行指令时,从过程映像输入区或别的存储区中将有关编程元件的0、1状态读出来,并根据指令的要求执行相应的逻辑运算,运算的结果写入到对应的存储区中,因此,各编程元件的存储区的内容随着程序的执行而变化。
在数字量(或称开关量)控制系统中,变量仅有两种相反的工作状态,例如高电平和低电平、继电器线圈的通电和断电,可以分别用逻辑代数中的1和0来表示这些状态,在波形图中,用高电平表示1状态,用低电平表示0状态。
使用继电器电路、数字电路或plc的梯形图都可以实现数字量的逻辑运算。图的上面是PLC的梯形图,下面是对应的数字门电路。
图中的I0.0~I0.4为数字输入变量,Q4.0~Q4.2为数字输出变量,它们之间的“与”、“或”、“非”逻辑运算关系如表1-1所示。“与”运算仅在输入均为1时输出才为1,“或”运算仅在输入均为0时输出才为0。“非”运算的输出与输入的状态总是相反,非运算又称为“取反”。
表 逻辑运算关系表
逻辑运算关系表
逻辑运算关系表
基本逻辑运算
基本逻辑运算
图 基本逻辑运算
a)与b)或c)非
用继电器电路或梯形图可以实现基本的逻辑运算,触点的串联可以实现“与”运算,触点的并联可以实现“或”运算,用常闭触点控制线圈可以实现“非”运算。
多个触点的串、并联电路可以实现复杂的逻辑运算,例如图中的继电器电路实现的逻辑运算可以用逻辑代数表达式表示为
式中的加号表示逻辑或,乘号(·)或星号(*)表示逻辑与,变量上面的横线表示“非”运算。与普通算术运算“先乘除后加减”类似,逻辑运算的规则为先“与”后“或”。为了先作“或”运算(触点的并联),用括号将“或”运算式括起来,括号中的运算优先执行。
①STL形式的打开主控继电器指令“MCR(”。使用“MCR(”打开一个MCR区域指令,可以将RLO保存在MCR堆栈中,并打开一个MCR区域。MCR区域是编程在指令“MCR(”和相应指令“)MCR”之间的指令。指令“MCR(”和“)MCR”必须总是组合使用。
如果RLO =1,则MCR激活。而在该MCR区中的MCR相关指令正常执行。如果RLO =0,则MCR去激活。而在该MCR区中的MCR相关指令根据表3-79执行。
表3-79 MCR的信号状态
MCR的信号状态
MCR的信号状态
②LAD形式的主控继电器接通指令-(MCR>)。“-(MCR<)”(主控继电器区打开指令)用于将RLO保存在MCR堆栈中。以下元素与MCR有关,并在打开一个MCR区时,受保存在MCR堆栈中的RLO状态的影响:
-(#) 中间输出
-( ) 输出
-(s) 输出置位
-(R) 输出复位
RS 复位触发器
SR 置位触发器
MOVE 赋值
①STL形式的主控制继电器断开指令“)MCR”。
如果RLO =1,则MCR激活。而在该MCR区中的MCR相关指令正常执行。
如果RLO =0,则MCR去激活。
“MCR(”:开始MCR区域;“)MCR”:结束MCR区域。
MCR由一个1位宽、8位深的堆栈控制。当所有8个输入项都为“1”时,MCR激活。使用“MCR(”指令,可以将RLO位复制到MCR堆栈中。使用“)MCR”指令,可以删除堆栈中的最后一个输入项,并总是空出*1层。
块调用指令( CALL)用来调用功能块(FB)、功能(FC)、系统功能块(SFB)或系统功能( SFC),或调用西门子预先编好的其他标准块。
在CALL指令中,FC、SFC、FB和SFB是作为地址输入的,逻辑块的地址可以是**地址或符号地址。CALL指令与RLO和其他任何条件无关。在调用FB和SFB时,应提供与它们配套的背景数据块(Instance DB)。而调用FC和SFC时,则不需要背景数据块。处理完被调用的块后,调用它的程序继续其逻辑处理。在调用SFB和SFC后,寄存器的内容被。恢复。
使用CALL指令时,应将实参(Actual Parameter)赋给被调用的功能块中的形参(Formal Parameter),并**实参与形参的数据类型一致。
使用语句表编程时,CALL指令中被调用的块应是已经存在的块,其符号名也应该是已经定义过的。
在调用块时可以通过变量表交换参数,用编程软件编写语句表程序时,如果被调用的逻辑块的变量声明表中有IN、OUT和IN_OUT类型的变量,则输入CALL指令后编程软件会自动地打开变量表,只需对各形参填写对应的实参即可。
在调用FC和SFC时,必须为所有的形参*实参。调用FB和SFB时,只需*上次调用后必须改变的实参。由于FB被处理后,实参储存在背景数据块中。如果实参是数据块中的地址,必须*完整的**地址,如DB1. DBW2。
逻辑块的IN(输入)参数可以*为常数、**地址或符号地址。OUT(输出)和IN_OUT(输入_输出)参数必须*为**地址或符号地址。
CALL指令保存被停止执行的块的编号和返回地址及当时打开的数据块的编号。此外,CALL指令关闭MCR区,生成被调用的块的局域数据区。
①CALL块调用指令:CALL<逻辑块标识符>。使用该指令,可以调用功能(FC)或功能块( SFB)、系统功能(SFC)或系统功能块(SFB),或调用由西门子公司提供的标准预编程块。使用CALL块指令,可以调用作为地址输入的FC和SFC或FB和SFB,与RLO或其他条件无关。如果使用该指令调用一个FB或SFB,必须提供具有相关背景数据块的程序块。在被调用块处理完后,调用块程序继续逻辑处理。逻辑块的地址可以***,也可相对*。在SFB、SFC调用后,保存寄存器的内容。
调用块可通过一个变量表与被调用块交换参数。
如果调用一个功能块(FB)、系统功能块(SFB)、功能(FC)或系统功能(SFC),并且被调用块的变量声明表中有IN、OUT和IN_OUT声明,则这些变量作为一个形式参数表被添加到调用块中。如果调用的是一个功能(FC)和系统功能(SFC),则必须在调用逻辑块中为声明的形式参数赋予实际参数。
如果调用的是功能块( FB)和系统功能块(SFB),只需定义与以前调用相比必须进行修改的实际参数。在处理完功能块后,实际参数保存在背景数据块中。如果实际参数是一个数据块,则必须*完整的**地址,如DB1、KBW2。
IN参数可作为常数、**地址或符号地址定义。OUT和IN_OUT参数必须作为**地址或符号地址定义。必须**所有地址和常数与要传送的数据类型相符。
调用指令可将返回地址(选择符和相对地址)、两个当前数据块的选择符及MA位保存在B(块)堆栈中。此外,调用指令还可去激活MCR的相关性,然后生成被调用块的本地数据范围。
编程示例1:为FC6调用赋值参数
CALL FC6
形式参数 实际参数
NO OF TOOL :=MW100
TIMEOUT :=MW110
FOUND :=Q0.1
ERROR :=Q100.0
编程示例2:无参数调用一个系统功能( SFC)
CALL SFC43 说明:调用SFC43,重新触发看门狗定时器(无参数)
编程示例3:使用背景数据块DB1调用FB99
CALL FB99.DB1
形式参数 实际参数
MAX_RPM :=#RPM1_MAX
MIN_RPM :=#RPM1
MAX_ POWER :=#POWER1
MAX_TEMP :=#TEMP1
每一次功能块(FB)或系统功能块(SFB)调用都必须有一个背景数据块。在上述举例中,数据块DB1必须在调用之前已存在。
②调用功能块指令:CALL FB nl、DB nl。使用该指令,可调用用户定义的功能块(FB)。调用指令能够调用作为地址输入的功能块,与RLO或其他条件无关。如果使用调用指令调用一个功能块,必须为它提供一个背景数据块。在处理完被调用块后,调用块程序继续处理。逻辑块的地址可以是**地址,也可以是符号地址。
调用块可通过一个变量表与被调用的块交换参数。
如果调用一个功能,并且调用块的变量声明表中有IN、OUT和IN_OUT声明,则这些变量作为一个形式参数表被添加到用于调用块的程序中。
由于在功能块处理完之后,实际参数保存在背景数据块中,当调用功能块时,只需定义与以前调用相比必须修改的实际参数。如果实际参数是一个数据块,则必须*完整的**地址,如DB1、DBW2。
IN参数可作为常数、**地址或符号地址定义。OUT和IN_OUT参数必须作为**地址或符号地址定义。必须**所有地址和常数与要传送的数据类型相符。
调用指令可将返回地址(选择符和相对地址)、两个当前数据块的选择符及MA位保存在B(块)堆栈中。此外,调用指令还可去激活MCR的相关性,然后生成被调用块的本地数据范围。
编程示例:使用背景数据块DB1调用FB99
CALL FB99,DB1
形式参数 实际参数
MAX_RPM :=#RPM1_MAX
MIN_RPM :=#RPM1
MAX_POWER :=#POWER1
MAX_TEMP :=#TEMP1
每一次功能块( FB)调用都必须有一个背景数据块。在上述举例中,数据块DB1必须在调用之前已存在。
③调用功能指令:CALL FCn。如果使用的是语句表编辑器(STL Editor),则n必须指向现有有效块。在使用之前,还必须定义符号名。
使用该指令,可调用功能( FC)。调用指令能够调用作为地址输入的功能(FC),与RLO或其他条件无关。在处理完被调用块后,调用块程序继续处理。逻辑块的地址可以***,也可相对*。
调用块可通过一个变量表与被调用的块交换参数。
如果调用一个功能,并且调用块的变量声明表中有IN、OUT和IN_OUT声明,则这些变量作为一个形式参数表被添加到用于调用块的程序中。
在调用功能时,必须在调用逻辑块中为声明的形式参数赋予实际参数。
IN参数可作为常数、**地址或符号地址定义。OUT和IN_OUT参数必须作为**地址或符号地址定义。必须**所有地址和常数与要传送的数据类型相符。
调用指令可将返回地址(选择符和相对地址)、两个当前数据块的选择符及MA位保存在B(块)堆栈中。除此之外,调用指令还可去激活MCR的相关性,然后生成被调用块的本地数据范围。
编程示例:为FC6调用赋值参数
CALL FC6
形式参数 实际参数
NO OF TOOL :=MW100
TIMEOUT :=MW110
FOUND :=Q0.1
FRROR :=Q100.0
④调用多背景块指令:CALL#变量名。通过使用一个功能块的数据类型声明一个静态变量,可以生成一个多背景块。在程序元素目录中只包含已声明的多背景块。
⑤条件调用指令:CC<逻辑块标识符>。使用该指令,可以在RLO =1时调用一个逻辑块。该指令用于无参数调用FC或FB类型的逻辑块。除了不能使用调用程序传送参数之外,CC指令与CALL指令的用法相同。该指令可将返回地址(选择符和相对地址)、两个当前数据块的选择符及MA位保存在B(块)堆栈中,去激活MCR相关性,生成被调用块的本地数据范围,并开始执行调用的程序代码。
逻辑块的地址可以***,也可相对*。
编程示例1:
A I 2.0 说明:检查输入I2.0的信号状态
CC FC6 如果I2.0为“1”,调用功能FC6
A M 3.0 如果I2.0=1,从调用功能返回处执行;如果I2.0=0,直接在A I2.0语句后执行
如果CALL指令调用的是一个功能块(FB)或一个系统功能块(SFB),必须在语句中*一个背景数据块(数据块号)。对于使用CC指令的调用,不能将一个数据块分配给语句中的地址。
根据所使用的程序段,程序编辑器( Program Editor)可以在从梯形逻辑编程语言转换为语句表编程语言过程中,生成UC指令或CC指令。
编程示例2(功能块FB1的背景数据块是DB1,“:=”前面是用符号地址表示的形参,“:=”后面是实参):
CALL FB1,DB1
Switch_On :=I20.0 说明:将实参I20.0赋给形参Switch_On
Switch_Off :=I20.1
Failure :=I20.2
ActuaLSpeed :=MW2
Engine_On :=Q5.0
Preset_Speed_Reached:=Q5.1
CALL SFC43 调用SFC43,重新触发监控定时器(无参数)
每一个FB和SFB都必须有一个背景数据块,上例中在调用FB1之前,FB1和背景数据块DB1必须是已经存在的。
⑥无条件调用指令UC( Unconditional Block Call)和条件调用指令CC( Conditional Block Call)。用于调用没有参数的FC和SFC。其使用方法与CALL指令相同,只是在调用时不能传递参数。CC指令在逻辑运算结果RLO =1时才调用块。用CC指令和UC指令调用块时,不能使用背景数据块。下面是使用CC指令和UC指令的例子。
A I0.1 说明:刷新RLO
CC FC6 如果RLO=1,调用没有参数的功能FC6
L IW4 从FC6返回后执行,或在I0.1=0时不调用FC6,直接执行本指令
UC FC2 无条件调用没有参数的功能FC2
在CALL指令中,FC、FB、SFC和SFB是作为地址输入的,其地址可以是**地址,或者是符号地址。在调用FB和SFB时,必须提供与之相对应的背景数据块;而调用FC和SFC时,不需调用背景数据块。
在调用时,应将实参赋予被调用功能中的形参,并确保实参和形参数据类型相同,并且在FC和SFC的调用中,必须为所有形参*实参,而调用FB和SFB,则只需*上次调用后必须改变的实参。
FB功能块的具体调用(指令表程序)如下。
CALL FB1,DB1 说明:调用FB1,其背景数据块为DB1
MAX :=MW10 MAX为FB1定义的参数,将MW10的值赋予MAX
MIN :=MW20 将MW20的值赋予FB1参数MIN
POWER_ON :=I 0.0 将I0.0赋予FB1参数POWER_ON
POWER_OFF:=I 0.1 将I0.1赋予FB1参数POWER_OFF
程序中调用了背景数据块DB1,并将实参(“;=”之后的变量)赋予形参(“;”之前的变量)。