您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > S7-300程序设计
第5章S7系列程序结构与程序设计第5章S7系列程序结构与程序设计5.1编程方式与程序块5.2数据块与数据结构5.3S7系列PLC程序设计思考与练习题第5章S7系列程序结构与程序设计5.1编程方式与程序块5.1.1S7-300编程方式简介S7-300系列PLC的编程语言是STEP7。用文件块的形式管理用户编写的程序及程序运行所需的数据,组成结构化的用户程序。这样,PLC的程序组织明确,结构清晰,易于修改。为支持结构化程序设计,STEP7用户程序通常由组织块(OB)、功能块(FB)或功能块(FC)等三种类型的逻辑块和数据块(DB)组成。OB1是主程序循环块,在任何情况下,它都是需要的。第5章S7系列程序结构与程序设计图5.1STEP7调用过程示意图第5章S7系列程序结构与程序设计功能块(FB、FC)实际上是用户子程序,分为带“记忆”的功能块FB和不带“记忆”的功能块FC。FB带有背景数据块(InstanceDataBlock),在FB块结束时继续保持,即被“记忆”。功能块FC没有背景数据块。数据块(DB)是用户定义的用于存取数据的存储区,可以被打开或关闭。DB可以是属于某个FB的情景数据块,也可以是通用的全局数据块,用于FB或FC。S7CPU还提供标准系统功能块(SFB、SFC),集成在S7CPU中的功能程序库。用户可以直接调用它们,由于它们是操作系统的一部分,因此不需将其作为用户程序下载到PLC。第5章S7系列程序结构与程序设计5.1.2功能块编程及调用功能块由两个主要部分组成:当调用功能块时,需要参数传递。参数传递的方式使得功能块具有通用性,它可被其它的块调用,以完成多个类似的控制任务。•变量声明表:声明此块的局部数据•程序:要用到变量声明表中的局部数据第5章S7系列程序结构与程序设计1.变量声明表(局部数据)每个逻辑块前部都有一个变量声明表,在变量声明表中定义逻辑块用到的局部数据。表5.1给出了局部数据声明类型。变量名类型说明输入参数In由调用逻辑块的块提供数据,输入给逻辑块输出参数Out向调用逻辑块的块返回参数,从逻辑块输出的数据I/O参数In_Out参数的值由调用块的块提供,运算然后返回静态变量Stat存储在背景数据块中,块调用后,其内容被保留临时变量Temp存储在L堆栈中,块执行结束变量的值被丢掉表5.1局部数据类型第5章S7系列程序结构与程序设计1)形参为保证功能块对同一类设备控制的通用性,应使用这类设备的抽象地址参数,这些抽象参数称为形式参数,简称形参。功能块在运行时将该设备的相应实际存储区地址参数(简称实参)替代形参,从而实现功能块的通用性。形参需在功能块的变量声明表中定义,实参在调用功能块时给出。在功能块的不同调用处,可为形参提供不同的实参,但实参的数据类型必须与形参一致。第5章S7系列程序结构与程序设计2)静态变量静态变量在PLC运行期间始终被存储。S7将静态变量定义在背景数据块中,因此只能为FB定义静态变量。功能块FC不能有静态变量。3)临时变量临时变量仅在逻辑块运行时有效,逻辑块结束时存储临时变量的内存被操作系统另行分配。S7将临时变量定义在L堆栈中。第5章S7系列程序结构与程序设计2.逻辑块局部数据的数据类型在变量声明表中,要明确局部数据的数据类型,这样操作系统才能给变量分配确定的存储空间。局部数据可以是基本数据类型或复式数据类型,也可以是专门用于参数传递的所谓的“参数类型”。参数类型包括定时器、计数器、块的地址或指针等,见表5.2。第5章S7系列程序结构与程序设计表5.2参数类型变量参数类型大小说明定时器(Timer)2B定义一个定时器形参,调用时赋予定时器实参计数器(Counter)2B定义一个计数器形参,调用时赋予计数器实参块:Block_FBBlock_FCBlock_DBBlock_SDB2B定义一个功能块或数据块形参变量,调用时给块类形参赋予实际的块编号,如FC101、DB42指针(Pointer)6B该形参是内存的地址指针。例如,调用时可给形参赋予实参P#M50.0,以访问内存M50.0ANY10B当实参的数据类型未知时,可以使用该类型第5章S7系列程序结构与程序设计3.块调用过程及内存分配CPU提供块堆栈(B堆栈)来存储与处理被中断块的有关信息。当发生块调用或有来自更高优先级的中断时,就有相关的块信息存储在B堆栈里,并影响部分内存和寄存器。图5.2显示了调用块时B堆栈与L堆栈的变化。图5.3提供了关于STEP7的块调用情况。第5章S7系列程序结构与程序设计图5.2堆栈与L堆栈先前块的数据(仍是激活的)·DB寄存器(DB和DI)·临时数据指针·块号·返回地址先前块的数据(仍是激活的)·DB寄存器(DB和DI)·临时数据指针·块号·返回地址块堆栈(B堆栈)可执行的用户程序·逻辑块·数据块工作内存仍是激活的先前块的临时数据L堆栈数据块寄存器打开的数据块号当前块的临时数据打开的背景数据块号被中断块的数据·DB寄存器(DB和DI)·临时数据指针·块号·返回地址第5章S7系列程序结构与程序设计图5.3调用指令对CPU内存的影响逻辑块调用其它块被调用块的局部数据存储到L堆栈顶部先前块的局部数据压入L堆栈新的背景数据块号先前的背景数据块号DI寄存器DB寄存器先前激活着的调用块的信息压入块堆栈调用块的信息装入块堆栈程序第5章S7系列程序结构与程序设计1)B堆栈与L堆栈B堆栈存储以下被中断块的数据:(1)块号、块类型、优先级、被中断块的返回地址;(2)块寄存器DB、DI被中断前的内容;(3)临时变量的指针(被中断块的L堆栈地址)。L堆栈在块调用时被重新分配。L堆栈用来存储逻辑块中定义的临时变量,也分配给临时本地数据使用。梯形图的方块指令与标准功能块也可能使用L堆栈存储运算的中间结果。第5章S7系列程序结构与程序设计2)调用功能块FB当调用功能块FB时,会有以下事件发生:(1)调用块的地址和返回位置存储在块堆栈中,调用块的临时变量压入L堆栈;(2)数据块DB寄存器内容与DI寄存器内容交换;(3)新的数据块地址装入DI寄存器;(4)被调用块的实参装入DB和L堆栈上部;(5)当功能块FB结束时,先前块的现场信息从块堆栈中弹出,临时变量弹出L堆栈;(6)DB和DI寄存器内容交换。第5章S7系列程序结构与程序设计3)调用功能块FC当调用功能块FC时会有以下事件发生:(1)功能块FC实参的指针存到调用块的L堆栈;(2)调用块的地址和返回位置存储在块堆栈,调用块的局部数据压入L堆栈;(3)功能块存储临时变量的L堆栈区被推入L堆栈上部;(4)当被调用功能块FC结束时,先前块的信息存储在块堆栈中,临时变量弹出L堆栈。因为功能块FC不用背景数据块,不能分配初始数值给功能块FC的局部数据,所以必须给功能块FC提供实参。第5章S7系列程序结构与程序设计5.1.3功能块编程与调用举例对功能块编程分两步进行:第一步是定义局部变量(填写局部变量表);第二步是编写要执行的程序,并在编程过程中使用定义了的局部变量(数据)。第5章S7系列程序结构与程序设计定义局部变量的工作内容包括:(1)分别定义形参、静态变量和临时变量(FC块中不包括静态变量);(2)确定各变量的声明类型(Decl.)、变量名(Name)和数据类型(DataType),还要为变量设置初始值(InitialValue)(尽管对有些变量初始值不一定有意义)。如果需要还可为变量注释(Comment)。在增量编程模式下,STEP7将自动产生局部变量地址(Address)。第5章S7系列程序结构与程序设计写功能块程序时,可以用以下两种方式使用局部变量:使用变量名,此时变量名前加前缀“#”,以区别于在符号表中定义的符号地址。增量方式下,前缀会自动产生。直接使用局部变量的地址,这种方式只对背景数据块和L堆栈有效。在调用FB块时,要说明其背景数据块。背景数据块应在调用前生成,其顺序格式与变量声明表必须保持一致。在增量方式下,调用FB块时,STEP7会自动提醒并生成背景数据块。第5章S7系列程序结构与程序设计1.二分频器假设功能块FC10是二分频器产生程序,功能是对不同的输入位进行二分频处理。以下给出了FC10的变量声明表和语句表程序。在程序中使用了跳变沿检测指令。1)FC10的变量声明表(见表5.3)表5.3FC10的变量声明表AddressDecl.SymbolDataTypeInitialValueComment0.0InINPBOOLFALSE脉冲输入信号1.0OutOUTPBOOLFALSE脉冲输出信号2.0In_OutETFBOOLFALSE跳变沿标志第5章S7系列程序结构与程序设计2)语句表程序Network1A#INP//对脉冲输入信号产生RLOFP#ETF//对前面的RLO进行跳变沿检测NOT//取反RLOBEC//若RLO=1(没有正跳沿),结束块;//若RLO=0(有正跳沿),继续执行下一条指令AN#OUTP=#OUTP//输出信号反转BEU//无条件结束块第5章S7系列程序结构与程序设计在功能块FCl0中定义了三个形参,调用时为形参分别赋予实参I0.0、Q4.0和M10.0,以对输入位I0.0进行二分频以产生输出脉冲Q4.0。调用方式:CALLFC10INP:=I0.0OUTP:=Q4.0ETF:=M10.0第5章S7系列程序结构与程序设计2.读模拟输入量程序一些S7-300的应用系统中,使用8通道模拟量模块采集信号,当模块数量较多时,读模拟输入量就很繁琐。下面给出一个通用程序FC100,利用它可以方便地把模拟量读回并顺序存入数据块,因为模入模块的起始地址、通道数、存储数据块号及数据在数据块中的存储起始位置均是可变的,所以可在调用FC100时灵活确定。第5章S7系列程序结构与程序设计1)FC100的变量声明表(见表5.4)表5.4FC100的变量声明表AddressDecl.SymbolDataTypeInitialValueComment0.0InPIW_AddrINT模入模块通道起始地址2.0InCH_LENINT要读入的通道数4.0InDB_NoINT存储数据块号6.0InDBW_AddrINT存储在数据块中的字地址第5章S7系列程序结构与程序设计Network1L#DB_NoTLW0OPNDB[LW0]//打开存储数据块L#PIW_AddrSLD3//形成模入模块地址指针TLD4//在临时本地数据双字LD4中存储模入模块地址指针L#DBW_AddrSLD3//形成数据块存储地址指针TLD8//在临时本地数据双字LD8中存入数据块存储地址指针L#CH_LEN//以要读入的通道数为循环次数,装入累加器12)语句表程序第5章S7系列程序结构与程序设计LLD4LARl//将模入模块地址指针装入地址寄存器1LPIW[ARl,P#0.0]//读模入模块装入累加器1TLW2//将累加器1的内容暂存入缓冲器LW2LLD8LARl//将数据块存储地址指针装入地址寄存器1LLW2//将数据缓冲器中的内容装入累加器1TDBW[ARl,P#0.0]//将累加器的内容存入数据块中LLD4//AR1+P#2.0→AR1+L#16//ACC1+(.._0001_0000)TLD4//调整模入模块地址指针,指向下一通道Acc1+(bbbbbbbxxx)LLD8+L#16TLD8//调整数据块存储地址指针,指向下一存储地址LLW0//将循环次数计数器LW0的值装入累加器1LOOPNEXT//若累加器1的值不为0,将累加器减1继续循环;若累加//器为0,则结束NEXT:TLW0第5章S7系列程序结构与程序设计举例说明如何使用FC100。在某应用中,机架0的4号槽位安装了一个8模入模块(地址256开始),若要将前6个模入模块信号读回,存入DB50.DBW10开始的6个字单元中,可按下列形式调用FC100:CALLFC100PIW_Add:=256CH_LEN:=6DB_No:=50DBW_Addr:=10第5章S7系列程序结构与程序设计5.2数据块与数据结构5.2.1数据块数
本文标题:S7-300程序设计
链接地址:https://www.777doc.com/doc-2856801 .html