STEP7结构化程序设计.ppt
第六章STEP7结构化程序设计,一个复杂的生产过程或大规模的分散被控对象,总是可以把它分解为若干个较小的分过程。自动化过程的这种分解处理,得到了STEP7“开发软件包”在各个技术层次上的支持。它将控制任务分为项目,项目可以由一个或多个CPU 程序组成,而每个CPU 程序又是由它的各种逻辑块和数据块构成,逻辑块中的功能块总是对应一个控制分过程。S7系列PLC 中的通信联网功能和“全局数据”概念,可协调整个控制系统的正常运行。,这是一种模块化的思想,在程序设计阶段,有助于编写出结构化程序,这不仅使应用程序简洁明了,而且易于程序的测试与维护。,第一节结构化编程与中断,一、结构化编程,在为一个复杂的自动控制任务做设计时,我们会发现部分控制逻辑常常被重复使用。这种情况便可采用结构化编程方法来设计用户程序。编一些通用的指令块来控制那些相同或相似的功能,这些块就是功能块(FB)或功能(FC)。在功能块中编程用的是“形参”,在调用它时要给“形参”赋给“实参”,依靠赋给不同的“实参”,便可完成对多种不同设备的控制,这是一个功能块能多处使用的道理。,在STEP7软件中,结构化编程的用户程序都是以“块”的形式出现的。“块”是一些独立的程序或数据单元,所以,结构化编程的用户程序由组织块(OB)、功能块(FB、FC)和数据块(DB)构成。,组织块(OB)是操作系统和用户应用程序在各种条件下的接口界面,OB1 是主程序循环块,即可以循环执行的主程序块,是用户程序的主干,在任何情况下它都是需要的。其他组织块OB除了启动程序和背景程序等非中断类的OB之外,大多数组织块OB则对应不同的中断处理程序。,二、PLC中断,用户根据生产控制的复杂程度,将程序放在不同的逻辑块(包括OB、FC和FB)中。程序运行时所需的大量数据或变量存储在数据块中,调用功能块FB 时也必须为其指定一个相应的背景数据块DI,它随功能块FB 的调用而打开,随功能块FB的结束而关闭。在块调用时,调用块可以是任何逻辑块(OB、FB、FC、SFB、SFC),被调用的块只能是功能块(除OB 外的逻辑块)。,块调用时,OB的临时变量数据压入L堆栈,所有OB要求至少20字节的L堆栈中的内存空间。所以OB1 即使没有声明使用其他额外的临时变量,也要使用20 字节的L堆栈中的内存空间。,S7 系列PLC 采用循环程序处理与中断程序处理结合的工作方式。中断处理方式在计算机和PLC 中均得到广泛应用。这种工作方式是当有中断申请时,CPU 将暂时中断现有程序的执行,转而执行相关的中断程序,中断程序执行完毕后,再返回原程序执行。但不同PLC 对中断的处理可能各有不同,下面介绍S7-300/400 系列PLC 的中断。,(一)中断源,所谓中断源,即发出中断请求的来源。PLC 的中断源可能来自PLC模块的硬件中断或是CPU 内部的软件中断。S7 型PLC 因型号不同,中断源的个数与类型也有所不同。它以组织块(OB)的形式出现,S7 提供了各种不同的组织块,每个组织块OB 给与一个编号,用于实现不同的中断申请及相应的中断处理。S7 型PLC 的中断源,或者说中断组织块OB 的类型,归纳起来有以下两大类:,(1)定期的时间中断组织块 定期的执行某中断程序,有两种方式:日时钟中断组织块(OB10 OB17)。它可以是某特定时间执行1 次,或从某特定时间开始并按指定的间隔时间(如每分钟、每小时、每天)重复地执行中断。如重复在每天17:00保存数据。循环中断组织块(OB30 OB38)。它是CPU 从RUN 开始计算,每隔一段预定时间(如100ms)执行一次中断。例如,在这些组织块中调用循环采样控制程序。,(2)事件驱动的中断组织块 这是一类在发生特定事件时申请的中断,有以下3 种方式:硬件中断组织块(OB4O 0B47)。它具有硬件中断能力。信号模板出现的过程事件中断信号可立即打断循环程序,转而执行中断程序。延时中断组织块(OB20 OB23)。可以在一个过程事件出现后延时一段时间响应。错误中断组织块。错误中断是在CPU 检测到PLC内部出现了错误和故障时而产生的中断。它也将中断循环程序的执行并决定系统如何处理。它分为:同步错误组织块(OB121、OB122)和异步错误组织块(OB80 OB87)。同步错误出现在用户程序执行过程中。异步错误有PLC故障、优先级错误或循环时间超过等。,各组织块OB都规定了优先级,同时申请中断时,高优先级的中断总是优先执行的,而且高优先级中断组织块还可中断低优先级的中断组织块的程序执行(在指令边界处),这被称为中断嵌套。具有同等优先级的 OB 不能相互中断,而是按照中断发生的先后顺序执行。,(二)中断优先级,在STEP7中,优先级的范围从129,其中28 优先级最高,29实际上是0.29,即OB29的优先级最低,其次就是OB1,它的优先级是1。对于S7-300PLC的CPU,各个OB的优先级都是固定的,用户无法改变。表6-1 列出了S7系列PLC的CPU支持的OB以及与其对应的类型和默认的优先级。,(三)中断工作过程,1.中断工作过程,中断处理用来实现对特殊内部事件或外部事件的快速响应。如果没有中断,CPU 循环执行组织块 OBl。在循环执行用户程序的过程中,如果CPU 检测到有中断请求,因为OB1 的优级最低(背景组织块OB90除外),所以操作系统在现有程序的当前指令执行结束后(称断点)立即响应中断,调用申请中断的组织块OB,执行该OB 中的程序。当该OB 中程序执行完毕后,返回原程序断点处继续原程序的执行。,当正在执行某组织块OB 的中断程序时,CPU 又检测到一个中断请求,此时操作系统要进行优先级比较。具有同等优先级的OB 不能相互中断,而是按照发生的先后顺序执行。若后面申请中断OB的优先级高,则当前的OB将被中断,转而执行高优先级OB的程序。因此中断允许按优先级嵌套调用。,一个组织块OB 被另一个新组织块OB 中断时,保护中断现场的工作由操作系统完成。包括被中断OB 的局部数据压人L堆栈;被中断OB 的断点现场信息分别保存到中断堆栈(I 堆栈)和块堆栈(B 堆栈)中。,图6-1 表示CPU314 为优先级分配L 堆栈的情况。CPU314 的L 堆栈为1 536 字节,整个L 堆栈供程序中的所有优先级划分使用。CPU314的每个组织块可以多层嵌套调用,但一个组织块OB的临时变量的总数不能超过256 字节。当来一个新组织块中断调用时,新组织块的临时变量也在L 堆栈中生成。图6-1 示出了OB1 被OB10 中断,OB10 又被OB81中断时L 堆栈中局域数据的分配情况。,图6-1CPU314为优先级分配L堆栈,(四)中断控制,用户程序能够对一个中断发生后是否真正产生中断调用来进行控制,即在程序运行中适时地屏蔽或允许中断调用,对中断的控制功能用STEP7 提供的SFC 完成。SFC39(DIS _ IRT)可禁止处理所有优先级的中断和异步错误,也可有选择地禁止某个优先级的中断或使优先级范围的中断和异步错误得到处理。被SFC39 禁止的中断需用SFC40 允许,在CPU 完全再启动后,SFC39 的作用自动失效。SFC40(EN _ IRT)允许处理由SFC39 禁止的中断和异步错误,可以全部允许,也可有选择地允许。SFC40 一般与SFC39 配对使用。SFC41(DIS _ A IRT)可延迟处理比现行优先级更高的中断和异步错误,直到用SFC42 允许。SFC 42(EN _ AIRT)允许处理由SFC 41 暂时禁止的中断和异步错误。所以,SFC 42 与SFC 41 必须配对使用。,第二节数据块及其数据结构,一、数据块中存储数据的类型和结构,用户数据为何要存在数据块中?因为生产过程中会遇到很多过程数据、基准值、给定值或预置值,有些经常需要进行修改,分类集中放置在不同数据块中有利于进行数据管理;数据块也是用于实现各逻辑块之间交换、传递和共享数据的重要途径;数据块丰富的数据结构有助于程序高效率管理复杂的变量组合,提高程序设计的灵活性。,在第四章第二节中介绍了S7的数据类型,下面对这些数据在数据块中的存储方式及结构建立进行介绍。,(一)数据块中存储的数据类型 在数据块中的数据,既可以是基本数据类型,也可以是复合数据类型。1.基本数据类型 表4-4的基本数据类型可以分为3类,即位数据类(BOOL、BYTE、WORD、DWORD、CHAR);数学数据类(INT、DINT、REAL);定时器类(S5TIME、TIME、DATE、TIME_OF_DAY)。,基本数据类型的数据长度不超过32位,可利用STEP7基本指令处理,能完全装入累加器中。,2.复合数据类型,复合数据类型是基本数据类型的组合,其数据长度超过32位。因为数据长度超过累加器的长度,所以不能用装入指令一次把整个数据装入累加器,往往需要利用一些特殊的方法(如调用标准程序库中的系统功能块)来处理这些数据。复合数据类型如表6-2所示。,(二)数据块中数据类型的生成和使用 在复合数据类型中,日期_时间(DATE_AND_TIME)类型的名称、位数及格式是由操作系统定义的,用户不可改变,并且该数据类型在S7-300PLC中必须用标准功能块SFC才能访问。其他复合数据类型可在逻辑块变量声明表中或数据块中定义。,1.数组(ARRAY)的生成与访问,(1)建立数组。在逻辑块变量声明表中或数据块中生成一个数组时,应指定数组的名称,例如PRESS,声明数组的类型时要使用关键字ARRAY,用下标(Index)指定数组的大小,下标的上、下限放在方括号中,数组的维数最多为6维,各维之间用逗号隔开,每一维的首、尾数字之间用双点隔开。,图6-3在数据块DB3中建立一个23数组,图6-3所示是一个在共享数据块DB3中建立的23的数组。图中各栏目的说明如下:,Address(地址):由STEP7自动分配的地址,它是变量占用的第一个字节地址,存盘时由程序编辑器产生。其中:“+”项表示与STRUCT(表示构造开始,END_STRUCT表示结 束构造)有关联的初始地址;“*”项表示一个数组元素所占的地址字节数;“=”项表示该STRUCT要求的总的存储区字节数。,Name(名称):输入数组的符号名。如PRESS、Motor_data等。Type(数据类型):数组的数据类型。如BOOL、WORD、INT、STRACT、UDT等基本数据类型或复合数据类型,注意不能用ARRAY类型。Initial Value(初值):如果不想用缺省值可输入初值。如“30、22、-3、3(0)”(这里的3(0)表示后3个数组元素全为0,是一种简化的写法)。当数据块第一次存盘时,若用户没有明确地声明实际值,则初值将被用于实际值。Comment(注释):用于栏目的文字注释,最多可为80个字符。如“23数组”。(2)访问数组。利用数组中指定元素的下标可访问数组中的元素数据,这时数据块名、数组名及下标一起使用并用英语的句号分开。如图6-5中声明的数组在DB3(假设符号名MOTOR)数据块中,可用以下符号地址或绝对地址访问存在DB3中数组的第3个元素(数据类型为整数INT,占用一个字或2个字节):MOTOR.PRESS1,3 或DB3.DBW5,(3)用数组作参数传递。数组可以在逻辑块变量声明表中或数据块中定义。如果在逻辑块变量声明表中把其形参定义为数组类型时,可将实际参数数组作为参数传送,但必须将整个数组而不是数组的某些元素作为参数传递。当然,在调用快时。也可以将某个数组的元素赋值给同一类型的参数。将数组作为参数传递时,并不要求作为形参和实参的二个数组有相同的名称,但它们必须有同样的组织结构、相同的数据类型并按相同的顺序排列。例如都是由整数组成的23格式的数组。,2.结构(STRUCT)的生成与访问,结构(STRUCT)可以将不同数据类型的元素组合成一个整体,或者说结构是不同类型的数据组合。如图6-4所示。可以用基本数据类型、复合数据类型(包括数组、结构和用户定义的数据类型UDT)。但由数组或结构组成的结构最多只能嵌套8层。用户可以将过程控制中有关的数据统一组织在一个结构中,作为一个数据单元来使用,而不是使用大量的单个的元素,这为统一处理不同类型的数据或参数提供了方便。,(1)建立结构。结构可以在数据块中定义,也可以在逻辑块变量声明表中定义。在图6-5中的数据块DB3中,定义了一个符号名为PRESS的数组和一个符号名为STACK的结构,还定义了一个独立的名为VOLTAGE的整数型变量。可以为结构中各元素设置初值(Initial Value)和加上注释(Comment)。,(2)访问结构 可以用结构中的元素的符号地址或绝对地址来访问结构中的元素。下面以图6-5为例来说明:设数据块DB3的符号名为TANK,结构的符号名已定义为STACK,则存放“总量(AMOUNT)”数据(数据类型为整数INT,占用一个字或2个字节)的符号地址为TANK.STACK.AMOUNT;存放“总量(AMOUNT)”的绝对地址为DB3.DBW12。(3)用结构作参数传递 结构可以在逻辑块变量声明表中或数据块中定义。如果在逻辑块变量声明表中把其形参定义为结构类型时,可将实际参数结构作为参数传送,但必须将整个结构而不是结构的某些元素作为参数传递。当然,在调用快时。也可以将某个结构的元素赋值给同一类型的参数。将结构作为参数传递时,并不要求作为形参和实参的二个结构有相同的名称,但它们必须有同样的组织结构、相同的数据类型并按相同的顺序排列。,3.用户定义的数据类型(UDT)的生成与访问,用户定义的数据类型(UDT)是一种特殊的数据结构,由用户自己生成,定义好后在用户程序中多次使用。UDT也是由基本数据类型或复合数据类型组成,只是其组合方式是由用户定义的。但它和结构(STRUCT)不同,UDT是一个模板,可以用来定义其他变量,使用前必须首先单独建立,并存放在称为UDT的特殊数据块中,故称为UDT块。定义好后,这个UDT块便可作为一个数据类型在多个数据块中使用它。,(1)建立UDT。建立一个名称为UDT3的用户定义的数据类型,其数据结构如下:,STRUCT Speed:INT Current:REALEND_STRUCT,可按以下步骤建立:,首先在SIMATIC管理器中选择S7项目的S7程序(S7 Program)的块文件夹(Blocks);然后执行菜单命令InsertS7 BlockData Type,如图6-6所示 在弹出的数据类型属性对话框Properties-Data Type内,可设置要建立的UDT属性,如UDT的名称(UDT1、UDT2)。设置完毕点击OK按钮确认。在SIMATIC管理器的右视窗内,双击新建立的UDT3图标,起动LAD/STL/FBD编辑器。如图6-7所示。在编辑器变量列表的第二行Address的下面“0.0”处单击鼠标右键,用快捷命令Declaration Line after Selection在当前行下面插入二个空白描述行。按图6-7所示的格式输入二个变量(Speed和Current)。最后单击保存按钮保存UDT3,这样就完成了UDT3的创建。,编辑窗口内各列的含义如下:Address(地址):由STEP7自动分配的地址,它是变量占用的第一个字节地址,存盘时由程序编辑器产生。Name(名称):输入变量的符号名。如Speed、Current等。,Type(数据类型):变量的数据类型。单击鼠标右键,在快捷菜单Elementary Type内可选择。可用的数据类型有BOOL、WORD、DWORD、INT、DINT、REAL、S5TIME、TIME、DATE、TIME_ OF_DAY和CHAR。Initial Value(初值):为数据单元设定一个默认值。如果不输入初值,就以0为初值。Comment(注释):用于栏目的文字注释,最多可为80个字符。,图6-8给出了一个在数据块DB2中使用UDT的例子。数据块DB2中定义了二个变量,一个为整数INT,另一个为用户定义的数据类型UDT3。由图6-8可见,在数据块中UDT的用法与基本数据类型类似。,(2)访问UDT。用符号地址或绝对地址两种方式可以访问UDT中的变量。例如图6-8 在DB2 中使用了UDT,设DB2定义的符号名为Process,访问UDT3的元素Speed,用符号地址为:Process.stack_2.Speed;用绝对地址为:DB2.DBW2。(3)数据块使用UDT 的优点。建立UDT,是为了将UDT 作为一种数据类型使用,以方便定义多个有相同数据结构的数据块,如图6-8 建立的stack_2与图6-5 的STACK 相比,结构基本相同,但使用了UDT 使得数据块的建立过程显然要快得多。特别是多处使用同样的UDT 时,这一优点更加突出。当相同的数据结构需要多次使用时,往往先把它定义为UDT(UDT1UDT65535),再输入数据块中。把UDT作为一种数据类型来使用,可节省数据块的录入时间。因为使用UDT时,只需对它定义一次,就可以用它来产生大量的具有相同数据结构的数据块,可以用这些数据块来输入用于不同目的的实际数据。例如可以建立用于颜料混合配方的UDT,将这个UDT 指定给几个数据块DB,并使用这些数据块为特定任务存入不同的实际值,然后用它生成用于不同颜色配方的数据组合。,(一)数据块的类型,数据块一般分为共享数据块(DB或Shared DB)和背景数据块(DI或Instance DB)两种。用户定义的数据类型也可以看成一种特殊的用户定义数据块(DB of Type)。,共享数据块又称为全局数据块,它不附属于任何逻辑块。在共享数据块中和全局符号表中声明的变量都是全局变量。用户程序中所有的逻辑块(FB、FC、OB 等)都可以使用(读写)共享数据块和全局符号表中的数据。背景数据块是专门指定给某个功能块(FB)或系统功能块(SFB)使用的数据块,它是FB 或SFB 运行时的工作存储区。当用户将数据块与某一功能块相连时,该数据块即成为该功能块的背景数据块,功能块的变量声明表决定了它的背景数据块的结构和变量。不能直接修改背景数据块,只能通过对应的功能块的变量声明表来修改它。调用FB 时,必须同时指定一个对应的背景数据块。只有FB 才能访问存放在它的背景数据块中的数据。在符号表中,共享数据块的数据类型是它本身,背景数据块的数据类型是对应的功能块。,一般情况下,一个FB 都有一个对应的背景数据块,但一个FB可以根据需要使用不同的背景数据块。如果几个FB 需要的背景数据完全相同,也可定义成一个背景数据块,供它们分别使用。通过多重数据块,也可将几个FB 需要的不同的背景数据定义在一个背景数据块中,以优化数据管理(其体参看本章第三节静态变量的设置)。背景数据块与共享数据块在CPU的存储器中是没有区别的,只是因为打开方式不同,才在打开时有背景数据块和共享数据块之分。一般说任何一个数据块都可以当作共享数据块或背景数据块来使用,但实际上一个数据块DB 当作背景数据块使用时,必须与FB 的要求格式相符。,(二)建立数据块 在编程阶段和程序运行中都能定义(即生成、建立)数据块。大多数数据块在编程阶段和其他块一样,在SIMATIC 管理器或增量编辑器中生成。用户可以选择创建共享数据块或背景数据块,创建一个新的背景数据块时必须指定它所属的功能块FB。定义数据块的内容包括数据块号及块中的变量(如变量符号名、数据类型、初始值等)。定义完成后,数据块中变量的顺序及类型,决定了数据块的数据结构,变量的多少决定数据块的大小。数据块在使用前,必须作为用户程序的一部分下载到CPU中。,1.建立共享数据块DB 建立共享数据块的方法和建立程序块的方法一样。在 SIMATIC Manager 窗口下,用鼠标右键点击 Blocks,然后选中 InsertS7 Block-Data Block,就会弹出 Properties-Data Block 对话框,如图6-9所示。,在对话框中的 Name and Type 栏中做出正确选择(即填写DB5,在Shared DB、Instance DB、DB of Type的三种选项中选择Shared DB)后,点击 OK 按钮,就建立了一个新的共享数据块DB5。和打开程序块进行编辑一样,双击这个数据块图标,就把这个数据块打开了,如图6-10所示。,Name 和 Type 是必须填写的。系统会根据数据类型自动地为每个变量分配地址(Address)。这是一个相对地址,它相当重要。因为我们往往需要根据地址来访问这个变量。在初始值(Initial Value)栏目,可以按需要填上初始值也可以不填。若不填写,则初始值就为零;若填了初始值,则在首次存盘时系统会将该值复制(Copy)到实际值(Actual Value)栏中。下载数据块时,下载的值是实际值,初始值不能下载。注释(Comment)栏目,填写该变量的注释,也可以让它空着。每个数据块的长度取决于实际编辑的长度。而最大的长度,对于 S7-300 来说是 8KB,对于 S7-400 来说是 64KB。,2.建立背景数据块DI,要生成背景数据块,首先应生成对应的功能块(FB),然后再生成背景数据块。所以,背景数据块直接附属于功能块,它是自动生成的。例如,当编好的功能块FB 存盘时,背景数据块中所含数据为功能块的变量声明表中所存数据。功能块的变量决定了其背景数据块的结构(变量的初始值取自关联块)。背景数据块数据结构的修改只能在相关的功能块中进行,不能独自修改。对于背景数据块来说,用户可以修改变量的实际值。为修改变量的实际值,用户必须工作在数据块的数据显示(浏览)方式中。,数据块有两种显示方式,即声明表显示方式和数据显示方式,菜单命令“View”“Declaration View”和“View”“Data View”分别用来指定这两种显示方式。声明表显示状态用于定义和修改共享数据块中的变量,指定它们的名称、类型和初值,STEP7 根据数据类型给出默认的初值,用户可以修改初值。可以用中文给每个变量加上注释,声明表中的名称只能使用字母、数字和下划线,地址是CPU 自动指定的。,在数据显示状态,显示声明表中的全部信息和变量的实际值,用户只能改变每个元素的实际值。复合数据类型变量的元素(例如数组中的各元素)用全名列出。如果用户输入的实际值与变量的数据类型不符,将用红色显示错误的数据。在数据显示状态下,用菜单命令“Edit”“Initialize Data Block”可以恢复变量的初始值。在SIMATIC 管理器中,用菜单命令“Insert”“S7 Block”“Data Block”生成数据块,在弹出的窗口中,选择数据块的类型为背景数据块(Instance),并输入对应的功能块的名称。操作系统在编译功能块时将自动生成功能块对应的背景数据块中的数据,其变量与对应的功能块的变量声明表中的变量相同,不能在背景数据块中增减变量,只能在数据显示(Data View)方式修改其实际值。在数据块编辑器的“View”菜单中选择是声明表显示方式还是数据显示方式。背景数据块声明表显示方式如图6-11所示。背景数据块声明表包括栏目的内容说明如表6-3所示。,共享数据块不附属于任何逻辑块,它可含有生产线或设备所需的各种数值。请注意,共享数据块的声明表中无表6-3栏目中“参数类型”(Declaration)这一栏。定义时用户按其栏目,可输人想存放在数据块中的各种变量。共享数据块声明表显示格式如图6-8所示。,三、访问数据块,只有打开的数据块才能访问。由于有两个数据块寄存器(DB和DI寄存器),所以最多可同时打开两个数据块。一个作为共享数据块,共享数据块的块号存储在DB寄存器中;一个作为背景数据块,背景数据块的块号存储在DI寄存器中。没有专门的数据块关闭指令,在打开一个数据块时,先打开的数据块自动关闭。,(一)寻址数据块 与位存储器相似,数据块中的数据单元按字节进行寻址,S7-300的最大块长度是8kB。可以装载数据字节、数据字或数据双字。当使用数据字时,需要指定第一个字节地址(如:L DBW2),按该地址装入两个字节。使用双字时,按该地址装入4个字节,如图6-12所示。(二)访问数据块 访问数据块时需要明确数据块的编号和数据块中的数据类型及位置,在STEP 7中可以采用传统访问方式,即先打开后访问,也可以采用完全表示的直接访问方式。,1.先打开后访问 可用指令“OPN DB”打开共享数据块(自动关闭之前打开的共享数据块),或用指令“OPN DI”打开背景数据块(自动关闭之前打开的背景数据块)。,图6-12数据块寻址,2.直接访问数据块 直接访问数据块,就是在指令中同时给出数据块的编号和数据在数据块中的地址。可以用绝对地址,也可以用符号地址直接访问数据块。使用绝对地址访问数据块,必须手动定位程序中的数据块单元,采用符号就可以很容易地用源程序调整。数据块中的存储单元的地址由两部分组成,如:DB1.DBW2 则表示数据块DB1 的第二个数据字单元。用绝对地址直接访问数据块,如:L DB1.DBW2/打开数据块DB1,并装入地址为2 的字数据 单元 T DB1.DBW4/将数据传送到数据块DB1 的数据字单元 DBW4 要用符号地址直接访问数据块,必须在符号表中为DB 分配一个符号名,同时为数据块中的数据单元用LAD/STL/FBD S7程序编辑器分配符号名。如:L“My_DB”.V1/打开符号名为“My _ DB”的数据块,并装入 名为“V1”的数据单元 在程序中两种寻址方式均可使用,但在同一条指令中符号名和绝对地址不能混用,如DB29.Number的用法是错误的。使用符号名访问数据块使程序易读,易确保访问的正确,易修改数据块的结构。,3.打开与关闭数据块 如果可能,建议使用合成指令访问数据块,不易出错。在数据块访问中要注意当前打开的究竟是哪个数据块,以免出错。(1)打开的数据块一直保持到一个新的数据块打开(用OPN 指令打开或合成指令打开)时才关闭。(2)一个OB 或FC 块在调用另一个FC 块时退出,但当前打开的数据块保持有效。返回到调用的OB、FC 时,退出时有效的数据块再次打开,参见图6-13。(3)功能块FB 调用不同。FB 总是带着背景数据块DB,调用时自动打开背景数据块(所以一般不在FB 程序中用OPN DIn 指令打开数据块)。但当返回调用块时,先前打开的全局数据块不再有效,为此,必须重新打开需要的全局数据块。图6-13 中在执行“L DBW10”指令时应明确打开的数据块。,四、多重背景数据块 每次调用一个FB 块时都需要一个背景数据块。由于数据块的数量有限,当功能块FB进行多层调用时,可生成一个多重背景数据块,供多个FB 使用,而不需要生成几个背景数据块。具体办法如图6-14所示。,功能块FB100被调用是(如OB1调用它),将只需要一个公用的(多重)背景数据块DB100。功能块FB100中调用FB12、FB13本来均需要背景数据块。现将其数据放在DB100中。在FB100定义变量声明表时,将FB12、FB13定义为静态变量,在FB100中用符号名调用,如“CALL Motor_10”,“CALL Pump_10”,这样就不需要为其单独指定背景数据块了。,第三节功能块编程与调用,一、功能块的结构,在结构化编程中要用到许多逻辑块和数据块。功能块FB、FC、SFB、SFC和组织块(OB)统称为逻辑块(或程序块)。实质上它们都是用户编写的子程序。这些程序可以被反复调用,功能块中编写的程序是用户程序的一部分,。功能块(FB)有一个数据结构与该功能块的参数完全相同的数据块,称为背景数据块,背景数据块依附于功能块,它随着功能块的调用而打开,随着功能块的结束而关闭。存放在背景数据块中的数据在功能块结束时继续保持。而功能(FC)则不需要 背景数据块,功能(FC)调用结束后数据不能保持。组织块(0B)别是由操作系统直接调用的逻辑块。下面对FB、FC 进行具体介绍。,逻辑块(OB、FB、FC)由变量声明表、代码段及其属性等几部分组成。其结构如图6-15所示。在打开一个逻辑块之后,所打开的窗口右上半部分是功能块的变量声明表(包括变量列表视窗和变量详细列表视窗),而窗口右下半部分编写的是该功能块的程序。对逻辑块编程时必须编辑下列三个部分:,(1)变量声明表。分别定义形参、静态变量和 临时变量(FC块中不包括静态变量);确定各变量的声明类型(Decl.)、变量名(Name)和数据类型(Data Type),还要为变量设置初始值(Initial Value)。如果需要还可为变量注释(Comment)。在增量编程模式下,STEP7 将自动产生局部变量地址(Address)。(2)代码段。在代码段中,对将要由 PLC 进行处理的块代码进行编程。它由一个或多个程序段组成。要创建程序段,可使用各种编程语言。例如,梯形图(LAD)、语句表(STL)或功能块图(FBD)。(3)块属性。块属性包含了其他附加的信息。例如由系统输入的时间标志或路径。此外,也可输入相关详细资料,如名称、系列、版本以及作者等,还可为这些逻辑块分配系统属性。,(一)功能块变量声明表的结构,功能块变量声明表的结构如图6-15 所示。功能块变量声明表的在变量声明表中定义该块用到的局部数据(或变量)。该块的程序要用到变量声明表中的名称,因此变量声明表和其下面的指令部分是紧密联系的。,变量声明表中定义的局部数据(或变量)分为“参数(包含IN、OUT、IN_OUT)”、“静态变量(STAT)”和“临时变量(TEMP)”。参数是在调用块和被调用块间传递的数据,所以可定义一个参数为块的输入值或块的输出值,或块的输入/输出值。所以要声明参数类型为输入(IN)、输出(OUT)和输入/输出(IN_OUT)。静态变量和临时变量(暂态变量)是仅供功能块本身使用的数据。表6-4给出了逻辑块变量声明表中局部数据的声明类型及其使用说明。,表6-4中参数与变量排列的顺序,也是在创建逻辑块变量声明表时声明的顺序和变量在内存中的存储顺序。在逻辑块中不需使用的局部数据类型,不必在变量声明表中声明。,在执行逻辑块时,用户应清楚了解数据被存储的情况:当执行功能块FB时,背景数据块中保留有输入、输出、输入/输出和静态变量的运行结果。在调用FB 时,若没有提供实参,则功能块FB 使用背景数据块中的数值。FB的临时变量存在L 堆栈中(不保留)。功能FC没有背景数据块,所以不能使用静态变量。其输入、输出、输入/输出参数作为调用块提供的指向实参的指针,存储在操作系统专为参数传递而保留的额外空间中。FC的临时变量存在L 堆栈中;对于组织块OB,它是由操作系统调用的,用户不能参与,因此OB 中只定义临时变量,执行时存在L 堆栈中。变量声明表中各栏目的含义及规定可参看表6-5。,(二)功能块变量声明表的定义与使用 1.用形式参数定义输人、输出、输入输出参数,为了保证功能块对某一类设备控制(即控制工艺过程相同的不同对象)的通用性在程序中能多处被调用,用户在编写功能块程序时就不能使用实际设备对应的存储区地址参数(如不能使用I1.0、Q8.3等),而应使用这一类设备的抽象地址参数。这些抽象参数称为形式参数,简称形参。例如:下面的程序为不可分配参数的逻辑块的程序:,A I1.0A M40.1=Q8.3 下面的程序为可分配参数的逻辑块块的程序A#Acknow/#表示变量声明表中的局部变量A#Report=#Display,功能块程序应编成可分配参数形式,在调用功能块对具体设备控制时,将该设备的相应实际存储区地址参数(简称实参)传递给功能块,功能块在运行时以实参替代形参,从而实现对其体设备的控制。当对另一设备控制时,同样将另一设备的实参传递给功能块。,因此,对可传递参数功能块的变量声明表中定义参数名(Name)时要用形参,实参在调用功能块时给出,但实参的数据类型必须与形参一致。功能块中的输人参数(IN)只能读,输出参数(OUT)只能写,输入/输出参数(IN_OUT)可读可写。参数传递可将调用块的信息传递给被调用块,也能把被调用块的运行结果返回给调用块。另外,还有一个“RETURN”参数,它是依据IEC61131-3额外定义的有特殊名称的参数,该参数用于功能FC中。,用形式参数定义输入、输出、输入输出参数的具体步骤如下:(1)创建或打开一个功能块(FB)或功能(FC),如图6-16所示(2)在图6-16所示的变量声明表内,首先选择参数类型(IN、OUT、IN_OUT),然后输入参数名称(如Engine_On),再选择该参数的数据类型(有下拉列表),如果需要还可以为每一个参数分别加上相关注释。一个参数定义完后,按键即出现新的空白行。,2定义静态变量,静态变量(STAT)在PLC 运行期间始终被存储,S7将静态变量定义在背景数据块中。当功能块被调用运行时,能读出或修改静态变量;功能块被调用运行结束后,静态变量保留在数据块中。由于只有功能块FB 有关联的背景数据块,所以只能为功能块FB 定义静态变量功能FC 不能有静态变量。功能块FB 用多重背景数据块时,要将其调用的功能块FB 定义为静态变量并给予符号名,以减少DB 个数(见本章第二节)。,3.定义临时变量 临时变量仅在逻辑块运行时有效,逻辑块结束时存储临时变量的内存被操作系统另行分配。S7将临时变量定义在L堆栈(L stack)中,L堆栈是为存储逻辑块的临时变量而专设的,当逻辑块程序运行时,在L堆栈中建立该逻辑块的临时变量,一旦逻辑块执行结束,堆栈重新分配,因而信息丢失。在使用临时变量之前,必须在功能块的变量声明表中进行定义,在TEMP行中输入变量名和数据类型,临时变量不能赋予初值。当完成一个TEMP 行后,按 键,一个新的TEMP 行添加在其后。L堆栈的绝对地址由系统赋值并在 Address 栏中显示。如图6-17所示,在功能 FC1 的局部变量声明列表内定义了一个临时变量 result。,在图6-17中,Network1为一个用符号地址访问临时变量的例子。减运算的结果被储存在临时变量#result中。当然,也可以采用绝对地址来访问临时变量(如T LW0),由于这样会使得程序的可读性变差,所以最好不要采用绝对地址。,4程序库 程序库用来存放可以多次使用的程序部件,可以从己有的项目中将它们复制到程序库,也可以在程序库中直接生成程序部件。用程序编辑器中的菜单命令“View”“Overviews”可以显示或关闭图 6-17 左边的指令目录和程序库(Libraries)。STEP 7 标准软件包提供下列的标准程序库:(1)系统功能块(SFB)、系统功能(SFC)和标准组织块(OB)。(2)IEC 功能块。处理时间和日期信息、比较操作、字符串处理与选择最大值和最小值等。(3)PID 控制块与通信块。用于 PID 控制和通信处理器(CP)。(4)其他功能块(Miscellaneous Blocks),例如用于时间标记和实时钟同步等的块。用户安装可选软件包后,还会增加其他的程序库。,(三)逻辑块中局部数据的类型 在逻辑块的变量声明表中有一栏明确所用局部数据的“数据类型”(Data type),以便操作系统给变量分配所需的存储空间。局部数据类型除“基本数据类型(如表4-4 所列)和复合数据类型(如表6-2 所列)之外,还有专门为逻辑块之间的参数类的形参传递数据的参数类型。参数类的形参包括定时器形参、计数器形参、块地址形参、指针和ANY类形参,如表6-6所示。,下面对表6-6作补充说明:(1)指针参数类型(POINTER)。一个指针给出的是变量的地址而不是变量的数值大小。在有些功能块中,可能使用指针编程更为方使。定义指针类型的形参,就能在功能块中先使用一个虚设的指针,待调用功能块时,再为其赋予确定的地址。例如:用P#M50.0 以访问内存M50.0。(2)ANY类型。当实参的数据类型不能确定或在功能块中需要使用变化的数据类型时,可以把形参定义为ANY参效类型。这样就可以将任何数据类型的实参给ANY 类形参,而不必像其他类型那样保证实参形参类型一致。STEP7自动为AN