在s7-cpu中使用嵌套程序需要注意什么,如何使用?
回答:s7-cpu支持嵌套程序,但对于不同的cpu类型,在使用时需要注意一些问题。
1. 不同的cpu类型,支持的嵌套程序深度不同,用户可在cpu的技术数据中查到此参数,以6es7315-2ag10-0ab0为例。
图1:cpu的嵌套深度参数
2. 用户可以按照如下方式使用嵌套功能:
a) 在某个优先级组织块中调用多个嵌套fc/fb。例如,在ob1 (优先级为1)调用fc1,fc1中调用fc2,fc2中调用fc3,等等,一直到fc7,与ob1共8层深度。如果在fc7 中又调用了fc8 ,此时会导致cpu 停机,在cpu在线信息界面中可查看到此情况,如图2所示。用户也可在ob35(优先级为12)调用fc11,fc11中调用fc12,fc12中调用fc13,等等,一直到fc17。
图2:嵌套调用
b) 在某个优先级中调用某个fc,此fc多次调用自身。例如,在ob1 (优先级为1)调用fc1,fc1中仍然调用fc1,用户在fc1 的程序中必须编程累计fc1被调用的次数,如果达到了7次,则需要从fc1 中跳出调用(此方法即为软件行业广泛应用的递归编程方法)。如果在fc1 调用自身次数超出了cpu允许的嵌套深度,此时会导致cpu 停机。
3. 当用户在使用嵌套功能时,可能出现几种错误:
a) the nesting depth of block calls (u-stack) is too high(嵌套深度太高)。例如:
• 用户在某个优先级(如ob1)中调用嵌套程序深度超出所使用cpu支持深度,如第2节(a) 部分所描述。
• 用户在某个优先级(如ob1)中调用嵌套程序深度超出所使用cpu支持深度,如第2节(b) 部分所描述。
此时cpu将报16#4575错,如图3所示:
图3:同步错误嵌套1
b) the nesting depth of synchronous errors is too high(同步错误嵌套深度太高)。例如:
• 用户在ob1中使用l db1.dbb0 语句(cpu中并未下载db1),
• 此时cpu出现编程错误,将调用ob121。
• 如果用户在下载的ob121中又使用了l db1.dbb0 指令,将导致cpu停机
此时cpu将报16#4573错,如图4所示:
图4:同步错误嵌套2
c) error during allocation of local data (分配本地数据错误) 。对于s7-cpu每个优先级都有对本地数据大小的限制,如果用户使用的范围超出了此限制,cpu将出现错误。以6es7315-2ag10-0ab0为例,其每个优先级下的本地数据大小为512 byte。如下错误使用都可能导致此错误:
• ob1 调用fc1,fc1 中定义的local data(temp数据类型)与ob1中定义的local data(temp数据类型)总和超出了cpu 对此优先级分配的local data 数量。
• ob1 中嵌套调用多个fc, 这些fc 使用的local data 与ob1中定义的local data(temp数据类型)总和超过了分配给此优先级的local data 数量。
此时cpu将报16#3576错,如图5所示:
图5:分配本地数据错误
• 对于s7-400cpu, 用户可以在硬件配置中调节每个优先级下的本地数据大小,以6es7412-2xg04-0ab0为例,如图6所示:
图6:分配本地数据
4. 当用户在使用嵌套功能出现错误时,对于支持ob88的cpu(例如s7-400cpu),可用通过下载ob88来防止cpu停机,此时cpu将处于sf状态,但ob88不可以再出现嵌套使用错误,否则cpu将进入停机状态。对于不支持ob88的cpu(例如s7-300cpu),当出现嵌套调用错误时,无法避免cpu进入停机状态。
注意:本文中主要以ob1为例说明嵌套调用,在实际使用中,用户应当注意每个优先级下对嵌套调用的注意事项。