技术论坛

 让CPU停下来,找到错误的程序

返回主题列表
作者 主题
西门子Auto
官方工程师
西门子官方工程师西门子官方工程师

经验值:2465
发帖数:132
精华帖:16
楼主    2014-10-23 13:25:27
主题:让CPU停下来,找到错误的程序

SIMATIC S7-300/400 CPU中的组织块 (OB) 是指CPU 的操作系统与用户程序之间的接口。发生特定的事件后CPU 的操作系统会调用相应的组织块,在OB中编写执行程序可以获取特定事件的信息。例如,如果一个模块具有诊断能力,并且已为它启用了诊断中断,那么当它检测出其诊断状态发生变化时,它将发送一个诊断中断请求到CPU,操作系统就会调用诊断中断组织块OB82。在OB82中编程读取局部变量可以知道故障模块的逻辑基址和四字节的诊断数据。但是如果CPU中没有下载特定事件发生所需调用的组织块,那么CPU将会停止,进入STOP模式。所以,很多工程技术人员在项目刚开始编程时,就会先创建一些特定事件对应空的组织块直接下载到CPU中,这样就可以避免发生特定事件时由于CPU中没有相应OB而导致CPU转为STOP模式。这样做的好处是避免了CPU停止,但是对于查找错误的原因也会带来一定的麻烦。下面我们就举一个技术支持热线上经常遇到的现象:
工程师:“您好,我是西门子技术支持,请问您有什么技术问题?”
客户:“我正在现场调试,使用的CPU315-2DP,程序运行正常,可是我的CPU上的SF灯一直是亮的。”
工程师:“那是系统故障灯代表的是硬件故障或软件错误,请问您的其他模块有没有红灯?”
客户:“其他模块上没有红灯。”
工程师:“那就是可能程序有错误,您能在线查看CPU的诊断缓冲区吗?”
客户:“我能在线。”
工程师:“好的,那您把诊断缓冲区的信息给我念一下。”
客户:“哦,等一下。。。。。全是一样的内容,什么区域长度错误。”
工程师:“信息都是一样的吗?”
客户:“是的,全是这个。”
工程师:“您点中一条,看下面的详细信息。”
客户:“读时区域长度错误,什么全局DB,字访问,地址200,所需的OB(OB121)。”
工程师:“这个就是说您的程序里访问了一个DB块里面的DBW200,但是这个DB块实际没有那么长,也就是没有DBW200。您需要找到这句程序,看一下是写错地址了,还是DB块创建的不够长。”
客户:“是哪个DB块啊,是DB200吗?”
工程师:“不是。”
客户:“那可麻烦了,我程序里使用了很多DB,这个得查什么时候去啊!”
工程师:“您是不是已经下载了OB121啊?”
客户:“是的,里面啥也没写,没有OB块CPU不时会停机吗?”
工程师:“对,那么您现在调试允许CPU停机吗?”
客户:“可以。”
工程师:“好的,如果CPU可以停止就好办了,您先在线把CPU中的OB121删除。”
客户:“等一下。。。。删完了,哦,我的CPU也停了。”
工程师:“再看诊断信息第一条。”
客户:“。。。。哦,是由编程错误导致的停止。”
工程师:“好的,鼠标点中这一条,然后点下面的‘打开块’按钮。”
客户:“我点了,有个提示什么在线、离线?”
工程师:“选择在线就行,不要动鼠标了就,STEP7会打开您的程序,看看的这段程序,有没有关于DB的?”
。。。。
客户:“有,是个MOVE指令,DB2.DBW200。”
工程师:“好的,打开您的DB2看一下实际长度。”
。。。。
客户:“哦,我看一下,只到198”
工程师:“那就对了,您DB2没有DBW200,程序却用到了,您自己查一下是您写错地址了,还是DB2长度不够。”
客户:“哦,好的,谢谢。”

上面是一个技术热线上经常发生的场景,技术支持工程师利用CPU缺少相应事件对应的OB会导致停机的性质,利用诊断缓冲区帮助客户找到问题的原因。下面,通过一个简单的例子,有图有真相说明。
一个S7-300项目,在OB1中编写一个简单的语句,将DB1.DBW2使用MOVE指令送到MW100中,实际在创建DB1时采用的默认长度,只有2个字节,没有DBW2。创建一个空的OB121,将项目下载到CPU中。见图1、图2。

                                                                           图1

                                                                      图2

下载后,CPU的SF指示灯亮,由于有OB121所以可以正常运行,诊断缓冲区中充满了发生区域长度访问错误的信息,见图3。

                                                                   图3


这个时候采用在线删除的方法将OB121从CPU中删除,见图4。CPU进入到停止状态,继续查看诊断信息,见图5,第二条诊断信息说明CPU发生区域长度访问错误,第一条显示由编程错误引起的停止模式,缺少相应事件的OB121。鼠标点中第一条诊断信息,接着再点击下面的“Open Block”按钮,就直接打开之前OB1故意编写出错的程序,如图6。这条语句读取了DB1.DBW2这个地址,可打开DB1发现实际长度只有2个字节(图7),不存在DBW2这个地址,所以才会产生区域长度访问错误。使用同样方法也可以查找造成IO访问错误的语句。

                                                                         图4

                                                                           图5

                                                                      图6

                                                                   图7

您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。