图3 主程序
图4 子程序
程序的调用关系为:中断子程序INT0调用子程序SBR1,SBR1中调用子程序SBR2,SBR2中的程序如图4所示,下载到CPU中,通过状态图表监视程序状态,发现没有结果输出,如图5所示:
图5 状态图标监控无输出
进一步监控PLC信息,可以看到图6的非致命错误报警:超出最大用户子例程嵌套级别(错误码:0008)
图6 PLC信息
S7-200 SMART手册中规定:从主程序调用子例程的嵌套深度是 8 级,从中断例程调用嵌套深度是 4 级。
现在来看上述程序的调用关系:
INT0→SBR1→SBR2→GRAY_BIN_DW,表面上也仅仅嵌套了3级,满足中断嵌套深度要求,但是仔细查看GRAY_BIN_DW功能库可以发现,该库也嵌套了几层,嵌套关系如下:
GRAY_BIN_DW→GRAY_BIN→XOR,这样下来,嵌套关系就变成如下:
INT0→SBR1→SBR2→GRAY_BIN_DW
→GRAY_BIN→XOR,总共5层嵌套关系,超过了CPU支持的最大嵌套深度,导致CPU 无法运行,知道了原因,我们可以减少调用嵌套为4层以内,则程序就可以正常执行了。
通过以上描述就可以明白,有些看似不可理解的问题其实有其发生的原因,只有深入了解对应产品的技术细节,才能抽茧剥丝,找到问题的根源所在。
S7-200 SMART如何快速提高编程效率在日常的编程过程中,我们可能需要不少的逻辑运算和算术运算,如果这种运算很多,有可能会导致程序量很大,CPU的扫描周期加长,在这种情况下,找到其中的规律,可以大大简化程序。
假设一个场景,现场有16台设备,需要控制16台泵的启停,IO地址如下表所示: