Date:2020/3/3Page:1第五章S7系列程序结构•5.1S7-300的程序结构•5.2程序块类型•5.3用户定义的块Date:2020/3/3Page:25.1S7-300的程序结构STEP7为设计程序提供三种方法,即线性化编程、模块化编程和结构化编程,如图5.1。基于这些方法,可以选者最合适与你的应用程序设计方法。图5.1STEP73种设计程序的方法Date:2020/3/3Page:35.1S7-300的程序结构1、线性化编程线性化编程类似于硬件继电器控制电路,整个用户程序放在循环控制组织块OB1(主程序)中,循环扫描时不断地依次执行OB1中的全部指令,如图5.2。这种方式的程序结构简单,不涉及功能块、功能、数据块、局域变量和中断等比较复杂的概念,分析起来一目了然。这种结构是用于编写一些规模较小,运行过程比较简单的控制程序。由于所有的指令都在一个块中,即使程序中的某些部分在大多数时候并不需要执行,每个扫描周期都要执行所有的指令,因此没有有效地利用CPU。此外如果要求多次执行相同或类似的操作,需要重复编写程序。Network1电机控制Network2信息Network3取得操作的小时数OB1图5.2线性编程Date:2020/3/3Page:45.1S7-300的程序结构2、模块化编程程序被分为不同的逻辑块,每个块包含完成某些任务的逻辑指令,如图5.3。分块程序有更大的灵活性,适用于比较复杂、规模较大的控制工程的程序设计。组织块OB1(即主程序)中的指令决定在什么情况下调用哪一个块,功能和功能块(即子程序)用来完成不同的过程任务。被调用的块执行完后,返回到OB1中程序块的调用点,继续执行OB1。OB1FC1电机控制FC2信息FC3取得操作小时数图5.3模块化编程模块化编程的程序被划分为若干个块,易于几个人同时对一个项目编程。由于只是在需要时才调用有关的程序块,提高了CPU的利用率。Date:2020/3/3Page:55.1S7-300的程序结构3、结构化编程结构化编程将复杂的自动化任务分解为能够反映过程的工艺、功能或可以反复使用的小任务,这些任务由相应的程序快(或称逻辑块)来表示,程序运行时所需的大量数据和变量存储在数据块中。结构化程序比分块程序有更大的灵活性、继承性。适用于比较复杂、规模较大的控制工程的程序设计。某些程序块可以用来实现相同或相似的功能。这些程序块是相对独立的,它们被OB1或别的程序块调用,如图5.4。OB1FC1电机1FC2电机2FC3电机3图5.4结构化编程Date:2020/3/3Page:65.2程序块类型S7-300/400PLC的程序分系统程序和用户程序。系统程序是协调PLC内部事务的程序,与控制对象特定的任务无关,在从经销商购买CPU硬件的时候,CPU里面本身就包含了系统程序。系统程序完成PLC的启动/停止、I/O映像区的更新、用户程序的调用、中断的响应、错误及通信处理等任务。用户程序需要用户使用STEP7编程软件编写程序,然后下载到CPU中,可以完成需要的特定控制任务。用户程序包含用户编写的组织块(OB)、FB、FC和系统提供的SFB(系统功能块)与系统功能(SFC),被调用的块是OB之外的逻辑块。调用功能块时需要为它指定一个背景块,后者随功能块的调用而打开,在调用结束时自动关闭。图5.5STEP7调用块的过程示意图,OB1调用FB1,FB1调用FC1,应按下面的顺序创建块:FC1、FB1及背景数据块OB1,即编程时被调用的块应该是已经存在的。Date:2020/3/3Page:75.2程序块类型图5.5块调用的分层结构Date:2020/3/3Page:85.3用户定义的块STEP7将用户编写的程序和程序中所需要的数据放置在块中,使单个的程序部件标准化。通过在块内或块之间类似子程序的调用,使用户程序结构化,可以简化程序组织,使程序易于修改、查错和调试。块结构显著增加了PLC程序的组织透明性、可理解性和易维护性。STEP7软件中主要的各种块的简要说明见表5.1所示。表5.1逻辑块和数据块Date:2020/3/3Page:95.3.1组织块(OB)组织块是CPU的操作系统与用户程序的接口,由操作系统调用,用于控制扫描循环和中断程序的执行、PLC的启动和错误处理等。OB与不同的CPU类型是相关的,某一型号的CPU支持哪些OB是确定的。例如,OB35和OB40可以在CPU315-2DP中使用,而OB36和OB41则不行。因此用户只能编写目标CPU支持的OB。OB1是对应于循环执行的主程序的程序块,它是STEP7程序的主干。其他大多数OB则对应于不同的中断处理程序(另外还有启动程序和背景程序等非中断类的OB)。与每一个OB紧密相连的是它对应的类型和优先级。OB的类型指出了它的功能,例如延时中断、硬件中断等;OB的优先级则用于表明一个OB是否可以被另外一个OB中断,优先级较低的OB总是可以被优先级较高的OB中断。在S7系列CPU中,背景循环OB90的优先级最低,其次就是OB1,它的优先级是1,因此OB1通常总是可以被其他的OB中断。对于S7-300的CPU各个OB的优先级都是固定的,用户无法更改。Date:2020/3/3Page:105.3.1组织块(OB)SIMATICS7系列CPU的全部组织块的资源及优先权等级见表5.2。不同的CPU模板具有不同的功能,因此并不是任何CPU模板都具有表5.1所示的全部组织块资源,如CPU312IFM只有OB1,OB40和OB100。表5.2组织块Date:2020/3/3Page:115.3.1组织块(OB)表5.2组织块Date:2020/3/3Page:121、OB1(循环组织块,又称主程序)S7CPU的操作系统定期执行OB1。当操作系统完成启动后,将启动循环执行OB1。在OB1中可以调用其他功能(FC、SFC)和功能块(FB、SFB)。执行OB1后,操作系统发送全局数据。重新启动OB1之前,操作系统会将过程映像输出表写入输出模块中、更新过程映像输入表以及接收CPU的任何全局数据。操作系统在运行期受监视的所有OB模块中,OB1的优先级最低,也就是除OB90之外的所有OB块均可中断OB1的执行。S7专门有监视运行OB1的扫描时间的时间监视器,最大扫描时间的默认为150ms。用户编程时可以使用SFC43“RE_TRIGR”来重新启动时间监视。如果用户程序超出了OB1的最大扫描时间,则操作系统将调用OB80(时间错误OB块),如果没有发现OB80,则CPU将转为STOP模式。除了监视最大扫描时间外,还可以保证最小扫描时间。操作系统将延迟启动新循环(将过程映像输出表写入输出模块中),直至达到最小扫描时间为止。在OB1中系统定义了如表5.3所示的本地数据,其地址从L0.0~L19.7,地址从L20.0以上的本地数据允许用户定义。Date:2020/3/3Page:135.3.1组织块(OB)表5.3OB1中系统定义的本地数据符号名称数据类型地址说明OB1_EV_CLASSBYTE0.00~3位=1事件等级;4~7位是标识,=1表示OB1被激活OB1_SCAN_1BYTE1.0B#16#01:完成暖启动B#16#02:完成热启动B#16#03:完成主循环B#16#04:完成冷启动B#16#05:主站-保留站切换和停止上一主站之后新主站CPU的首个OB1循环OB1_PRIORITYBYTE2.0优先级1OB1_OB_NUMBERBYTE3.0OB编号(01)OB1_RESERVERD_1BYTE4.0保留OB1_RESERVERD_2BYTE5.0保留OB1_PREV_CYCLEINT6.0上一次扫描的运行时间(ms)OB1_MIN_CYCLEINT8.0自上次启动后的最小周期(ms)OB1_MAX_CYCLEINT10.0从上次启动后的最大周期(ms)OB1_DATE_TIMEDATE_AND_TIME12.0调用OB时的DATE_AND_TIMEDate:2020/3/3Page:142、时间中断组织块(OB10~OB17)时间中断组织块可以单次运行,也可以定期运行:每分钟、每小时、每天、每月、每个月末。对于每月执行的时间中断OB,只可将1、2、…、28日作为起始日期。要启动时间中断,必须先设置中断,然后再将其激活。有以下4种可能的启动方式:1)自动启动时间中断。一旦使用STEP7设置并激活了时间中断,即自动启动时间中断;2)使用STEP7设置时间中断,然后通过调用程序中的SFC30“ACT_TINT”来激活它;3)通过调用SFC28“SET_TINT”来设置时间中断,然后通过调用SFC30“ACT_TINT”来激活它;4)使用SFC39~SFC42禁用或延迟和重新启用时间中断。由于时间中断仅以指定的时间间隔发生,因此在执行用户程序期间,某些条件可能会影响OB的操作。表5.4列出了其中的一些条件,并说明了该条件对执行时间中断OB的影响。在OB10~OB17中系统定义了如表5.5(表中的符号以OB10为例)所示的本地数据,其中地址从L0.0~L19.7,地址从L20.0以上的本地数据允许用户定义。Date:2020/3/3Page:15表5.4影响时间中断OB的条件条件结果用户程序调用SFC29(CAN_TINT)并取消时间中断操作系统清除了时间中断的启动事件。如果需要执行OB,必须再次设置启动事件并再次调用OB之前激活它用户程序试图激活时间中断OB,但未将OB加载到CPU中操作系统调用OB85.如果OB85尚未编程(装载到CPU中),则CPU将转为STOP模式当同步或更正CPU的系统时钟时,用户提前设置了时间并跳过时间OB的启动事件日期或时间操作系统调用OB80并对时间OB的编号和OB80中的启动事件信息进行编码。随后操作系统将运行一次时间OB,而不管本应执行此OB的次数。OB80的启动事件信息给出了第一次跳过时间OB的DATE_AND_TIME当同步或更正CPU的系统时钟时,推后设置了时间以使OB的启动事件日期或时间得以修复S7-400CPU和CPU318:如果在推后设置时钟之前已激活了时间OB,则不会再次调用它。S7-300CPU:执行时间OBCPU通过暖启动或冷启动运行有SFC组态的所有时间OB会被改回在STEP7中指定的组态。如果已为相应的OB的单次启动组态了时间中断,使用STEP7对其进行了设置,并将其激活,则当所有组态的启动时间为已过去的时间(相对于CPU的实时时钟)时,会在暖启动或冷重启操作系统后调用一次OB当发生下一时间间隔的启动事件时,仍执行时间OB操作系统调用OB80.如果OB80没有编程,则CPU转为STOP模式。如果装载了OB80,则会首先执行OB80和时间中断OB,然后再执行请求中断Date:2020/3/3Page:16表5.5OB10中系统定义的本地数据符号名称数据类型地址说明OB10_EV_CLASSBYTE0.00~3位=1事件等级;4~7位是标识,=1表示OB激活OB10_STRT_INFOBYTE1.0B#16#11:OB10的启动请求(B#16#12:OB11的启动请求)(B#16#18:OB17的启动请求)OB10_PRIORITYBYTE2.0分配的优先级,缺省值为2OB10_OB_NUMBERBYTE3.0OB编号(10~17)OB10_RESERVERD_1BYTE4.0保留OB10_RESERVERD_2BYTE5.0保留OB10_PREIOD_EXEWORD6.0OB以指定的时间间隔执行W#16#0000:单次W#16#0201:每分钟一次W#16#0401:每小时一次W#16#1001:每天一次W#16#1201:每周一次W#16#1401:每月一次W#16#1801:每年一次W#16#2001:月末OB10_RESERVERD_3INT8.0保留OB10_RESERVERD_4INT10.0保留OB10_DATE_TIMEDATE_AND_TIME12.0调用OB时的DATE_AN