技术论坛

 我对硬件中断的理解

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

经验值:4925
发帖数:210
精华帖:47
楼主    2021-04-14 15:10:30
主题:我对硬件中断的理解 精华帖 

        大家可能对硬件中断已经非常熟悉了,硬件中断也称为过程中断用于快速响应的场合,例如输入模块连接一个信号,如果该信号发生变化,在不包含通信影响的情况下CPU的响应时间为:

  模块内部处理时间 +

  模块输入延时 +

  更新输入过程影像区 +

  2*OB1(最长)+

  更新输出过程影像区 +

  模块输出时间。

        主要瓶颈是OB1的执行时间,最长可能是2倍的循环时间,另外普通模块的输入延时也比较长。如果使用硬件中断处理,CPU的响应时间为:

  CPU 硬件中断响应时间(不同CPU的响应时间不同)+

  模块内部中断处理时间 +

  模块输入延时+ 

  OB40(硬件中断处理时间) +

  模块输出时间。

  主要区别在于OB块的响应时间。

        硬件中断的配置也非常简单,例如在具有中断能力的输入模块中,选择需要触发中断的通道,再选择触发事件,例如上升沿或者下降沿触发,如图1所示。

        这样事件到来时就会调用分配的中断OB,如图2所示。S7-300 CPU(除CPU318外)只有一个中断OB。


        好了,基本功能介绍完了,问题也来了,有的工程师对硬件中断的使用可能存在一些误区或者一些非常规的应用,例如事件顺序记录功能。下面是我对硬件中断的理解和总结,为了便于理解,以问答方式体现,如有错误,也请大家指出,一起探讨!

        第一个问题:如果多个通道使用相同的硬件中断,例如OB40,怎么判断哪一个通道触发的?

        假设使用S7-300 CPU315-2DP/PN CPU,SM321模块三个通道I0.0、I0.1和I0.2触发三个事件,分别调用不同的事件处理程序。下面的程序是否正确?

        这个程序肯定是错误的,因为执行硬件中断OB40比更新过程输入映像区早,可能永远不会调用FC1/2/3。应该从OB40的启动信息中进行判断,主要通过参数OB40_MDL_ADDR(模块地址)和OB40_POINT_ADDR(模块状态),不同的模块有不同的OB40_POINT_ADDR参数,SM321的参数如图3所示。

        使用OB40启动信息判断的程序如图4所示。

        先判断哪一个模块,模块的地址为0,使用OB40_MDL_ADDR进行判断,然后再判断哪一个通道,通道信息参考图3。

        第二个问题:如果I0.0触发OB40运行,在运行过程中I0.0再次触发,是否执行OB40完成后再次运行一次?

        这个在OB40的帮助文档中有这样的描述:“当模块触发硬件中断后,操作系统将标识插槽并确定相关硬件中断 OB。如果该 OB 的优先级高于当前优先级,则启动该 OB。当执行完此硬件中断 OB 后,将发送通道特定的确认。如果在对硬件中断进行标识和确认的这段时间内,在同一模块中发生了触发硬件中断的另一事件,则应用以下规则:

(1) 如果该事件发生在先前触发硬件中断的通道中,则将丢失相关中断(参考图5)。

(2) 如果事件发生在相同模块的另一通道中,则在该时刻不会触发硬件中断。但是,此中断不会丢失,在确认当前激活的硬件中断之后会触发此中断。”

        结论是,相同通道的会丢失,不同通道的事件保留一次。

        第三个问题:OB40怎样对事件进行确认?

        这个在手册中没有描述,CPU的背板总线没有办法测试,通过PROFINET IO连接一个站点,在站点上安装一个具有中断能力的模块,通过抓包软件可以监控报文,从而得出中断响应以及确认的过程(只是测试结果),如图6所示。

        第四个问题:如果I0.0触发OB40运行,在运行过程中I0.1和I0.2同时触发,I0.1和I0.2触发的事件是否丢失?

        从第二问题的帮助文档中可以知道I0.1和I0.2触发的事件不会丢失。如果OB40资源释放即确认I0.0事件,I0.1和I0.2是各自触发一次OB40运行(运行两次),还是只运行一次?

        这个问题是分别对待的,如果是ET200S,例如2DI DC24V HF,OB40_POINT_ADDR参数如图7所示。

        这样一个模块的每一个通道状态都可以通过一个位信号表示。编写的程序如图4所示,I0.1和I0.2同时触发事件后会调用不同程序块,OB40只运行一次就可以完成了,如果在程序中有计数的操作,例如每一个事件触发OB40运行一次,然后计数一次,这样可能就会造成偏差了。

        如果三个触发信号位于三个模块上,例如I0.0、I2.0和I4.0分别位于三个模块上,同时触发,OB40将运行几个周期?

        答案肯定是三个周期,因为使用OB40的参数OB40_MDL_ADDR(模块地址)判断中断源,一次只能判断一个模块。

        如果使用是ET200SP模块,例如DI 8x24VDC HF模块,I0.1和I0.2同时触发,是调用OB40一次还是两次?先看一下该模块的OB40_POINT_ADDR参数,如图8所示。


        模块的中断信息是使用数字进行表示的,一次只能表示一个通道,这样只能每一个信息独立触发一次OB40。为什么会发生这样的变化?因为ET200S只能表示上升沿,即使多个点同时触发也是相通的事件类型,而ET200SP更加精确,可以分辨不同的事件类型,例如上升沿或者下降沿触发,这样就不可能一次处理多个事件了(例如I0.1的上升沿和I0.2的下降沿),只能一个一个地处理了。

        第五个问题:S7-1500 CPU是否响应ET200S模块的硬件中断?

        为了使用S7-1500的新功能,许多S7-300的项目都移植到了S7-1500,但是一些模块并没有更新,还是使用原有I/O系统,例如通过PROFINET连接的I/O系统,那么S7-1500是否可以响应ET200S的硬件中断事件?先看一下S7-1500 硬件中断OB块的启动信息。

硬件中断OB块启动信息说明如下:

        可以通过参数LADDR和IChannel进行判断事件触发的信号源,程序如图9所示

        示例中为一个模块的两个输入点,通道0和1,程序中首先判断是哪一个模块(硬件标识符),然后再判断是哪一个通道触发的中断,最后再调用与中断相关联的程序。

        移植后,除了中断的程序需要更改外,还需要考虑一个问题,如果ET200S一个模块多个通道同时触发,S7-1500的CPU怎样处理?S7-1500 CPU不能批量处理同时到来的中断事件,如果同时触发可能会丢失。所以在TIA 博途V14以及后续版本才添加了参数PointAddr,这样才可以判断同时触发的中断事件而不至于丢失,所以在V14以前的版本可能会有问题,这里只是猜测,可能也是为了更方便的程序移植。

        第六个问题:中断OB在运行期间其它通道触发的中断事件存储在哪里?

        是存储在模块吗?一个模块的多个点触发,模块可以识别存储的顺序,但是不同模块触发的顺序就不能识别了,所以推测只能是模块的管理者,在中央机架上,模块的管理者是CPU,在分布式IO站点上,模块的管理者是接口模块。这些管理者中带有中断的存储缓存区。

1)中央机架

        对于ET200S模块(或者ET200M),管理者是S7-300或者ET200S CPU,CPU的中断缓存区是基于模块的,一个模块作为一条缓存信息,一个模块同时多个通道触发,作为一条缓存信息。如果多个模块触发,则生成多条缓存信息。

        对于ET200SP模块(或者ET200MP),管理者是S7-1500或者ET200SP CPU,CPU的中断缓存区是基于通道的,一个模块同时多个通道触发,作为多条缓存信息。

2)分布式IO站点

        这个与在中央机架上是类似的,中央机架是通过背板总线通信的,分布式IO是通过总线通信的。有一个区别就是模块的中断信息是先存储于接口模块的,然后再发送到CPU的中断缓存区中,因为通信是在主站与从站建立的,而不是主站与模块。同时触发中断特性与中央机架上的特性应该相同,也需要区分ET200S和ET200SP。使用S7-1500 CPU 通过PROFINET网络分别连接ET200S和SP做了一个测试。ET200SP的测试如图10所示。

        ET200SP中断缓存基于通道,ET200SP接口模块缓存长度为9,超出后调用诊断诊断。ET200S的测试如图11所示。

        ET200S中断缓存基于模块,同时触发的事件合并为一个,减少接口模块的缓存长度。

        除ET200SP外,其它的模块管理者的缓存长度没有测试。

        第七个问题:模块布置在分布式IO站点上,PROFIBUS与PROFINET对中断的响应有什么影响?PROFIBUS是令牌的访问机制,如图12所示。

        使用PROFIBUS,即使从站上的模块接收到中断的触发信号,也不能及时发送到主站,只能等待主站轮询时才能发送,如果通信速率比较低,又是多主站结构,则响应的时间较长。PROFINET是全双工的工作模式,硬件中断的发送有独立的通道,如图13所示。所以说使用PROFINET处理中断的响应时间非常快。

第八个问题:OB40与OB41的区别?

        使用上没有区别,我认为就是一个资源问题,一个OB就会有一个中断缓存区,S7-300只有一个(除CPU 318外),S7-400最多有8个,S7-1500有50个。使用S7-1500可以将不同的通道分给不同的中断OB,这样可以不用使用编程的方式判断触发的信号源。

 

注意:

1:同时触发多个硬件中断将造成循环程序的严重超时。

2:上面的探讨基于测试和推测,只是一个参考和探讨,不代表西门子官方数据。


来自西门工业子技术支持 高级专家
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。