|
作为一个热线工程师,平时在热线工作中经常碰到有关子程序和中断子程序调用的问题,这些问题单靠客户描述有时没有程序很难解释和复现,有次就接到一个客户问题,是有关格雷码转换库在S7-200中使用中不工作的问题,客户反映在S7-200SMART上测试正常,同样的程序转换成S7-200的程序下载到S7-200CPU中就无法正常执行,仔细了解后得知,客户是在定时中断中调用了格雷码转换库,S7-200SMART转换正常,S7-200中正常工作,第一次碰到该问题,实在是无法解释,我就按照客户的思路重建了程序如下:
图1 主程序 启用100ms定时中断 图2 中断子程序 调用格雷码库
首先,下载到S7-200 SMART中,监控数据如下:
图3 S7-200SMART状态图表 由S7-200SMART状态图表可以看到VB0=2#00100010,可以正常转换成格雷码VB1=2#11000011,程序运行正常。
然后把同样的程序下载到S7-200中,监控数据如下:
由S7-200状态图表可以看到VB0=2#00100010,无法正常转换成格雷码VB0=0,即程序在S7-200中无法执行。
复现了客户的问题现象,就要开始寻找原因,在S7-200中的plc信息中查看,无意中看到了如下图的信息:
图5 S7-200 PLC信息
报错信息为:已超过最大用户子程序嵌套层数,而程序中只有一个中断事件调用了子程序,其他并没有调用,那么问题就应该出现在中断事件中调用的子程序上,于是仔细翻看了系统手册,找到了针对子程序和中断子程序的描述如下:
S7-200手册中子程序调用规定: 在主程序中,可以嵌套调用子程序(在子程序中调用子程序), 最多嵌套8层。在中断程序中,不能嵌套调用子程序。
S7-200SMART手册中规定: 从主程序调用时子例程的嵌套深度是 8 级,从中断例程调用时嵌套深度 是 4 级。
由此问题很明显,S7-200中断子程序中不能嵌套调用子程序,而格雷码库至少嵌套了2层子程序调用,故在S7-200中会报错,无法执行。
通过以上问题,我明白了看是再不可思议的问题一定有其产生的根源,只有明白其工作原理,才能在工控道路上有所突破。
-------来自 西门子技术支持工程师
|
|