S7-1500CPU的组织块所支持的优先级从1(Zui低)到26(Zui高),这意味着发出多个OB请求时,将执行优先级Zui高的OB块。如果OB有相同的优先级,则当触发事件到来时,组织块将按事件出现的顺序(进入系统的顺序)触发。部分组织块的优先级是可以修改的。
如果到来事件的优先级低于正在处理的OB块优先级,则CPU不会中断当前正在执行的OB块。如果此时相同的低优先级事件多次发生,那么CPU会对这些相同事件进行排队。当执行完高优先级OB块后,CPU执行队列中低优先级事件对应的OB块。
当来自同一事件源的事件发生速度大于CPU的处理速度时,会发生过载。如果要控制临时过载,可以限制未处理事件的数量(队列中相同事件的数量)。当达到OB块属性设置中的未处理事件的数目时,则丢弃随后的事件。可以在某些OB块(比如循环中断组织块、时间中断组织块)的“待进入队列的事件”参数中设置这个事件队列的数目。如果设置此参数值为1,则仅临时存储一个事件。在这个OB块的下一次调用中,可在其优化的启动信息中的“event_count”输入参数中获取已丢失事件的数目,对过载情况作出适当的响应。
例如,循环中断组织块OB30的周期为10ms,优先级设置为16,“待进入队列的事件”设置为1。硬件中断组织块OB40的优先级为17,用户程序执行时间为30ms。那么当硬件中断发生时,OB30只进入队列一次(本该执行三次,但实际上会丢失两次),当OB40执行完毕后,不会执行丢失的那两次OB30。
如果CPU丢失了OB启动事件,那么之后的行为特性将取决于OB块的属性参数“报告事件溢出到诊断缓冲区”,如果选中了该复选框,CPU将把此次过载情况写入诊断缓冲区。
OB块的属性参数“启用时间错误”用于指定在达到类似事件的指定过载级别时是否调用时间错误OB80。如果调用(选中复选框),则需使用参数“时间错误的事件阈值”指定调用OB80时队列中类似事件的数量。取值范围为:1≤“时间错误的事件阈值”≤待排队的事件数。示例中,此参数设置为1,则排队队列数目为1时,就会调用OB80。事件队列在OB块的属性中设置,如图1所示。
图1 组织块的事件队列设置
2 组织块的本地数据区堆栈(L 堆栈)
S7-1500CPU为每个优先级分配了64K的临时变量,包括下列数据:
程序块中的临时变量
组织块的开始信息(非优化存储的组织块与操作系统的接口区)
FC、FB的参数接口
如果在一个程序块中使用了临时变量,它将占用调用它的组织块的L堆栈,程序块嵌套调用越深,占用L堆栈空间越大。例如在OB1中调用FC1,在FC1中调用FC10、FC11,在FC11中又调用FC12、FC13,占用L堆栈大小的计算方式参3。
表3组织块的L堆栈
注意:
如果使用的临时变量超过L堆栈规定的限制,又没有进行编程错误处理,则S7-1500 CPU将停机报错。
在创建组织块时(非优化的存储方式),系统自动在接口区声明了一些不能被修改的临时变量,用于记录组织块的启动信息。如果用户需要自定义临时变量,必须在这些启动信息之后创建。临时变量仅在其所属的块执行时可用,当该块执行完毕后,这些临时变量(L堆栈)可能由于其它块的执行而被覆盖。
4组织块的接口区
在组织块的接口区中,除了自动生成的变量之外,用户可以自行定义临时变量及本地常量,所支持的数据类型如表4所示。
表4组织块OB接口区的数据类型