1.在OB1中调用SFC13的原因
编程的一条重要的原则是尽量减少中断程序的执行时间。SFC13读取诊断数据的操作采用异步执行方式,需要多次调用SFC13才能完成。在编程时通过判断SFC13的BUSY信号的状态来确定是否继续调用SFC 13。如果在中断组织块(例如OB86)中调用SFC13来读取从站故障的诊断数据,中断组织块执行的时间可能较长。
为了解决这一问题,可以在OB1中调用SFC 13。以7号从站为例,它出现故障时,在OB86中将M20.0置位为1;故障消失时,在OB86中将M20.0复位为0。OB1的程序检测到M20.0的上升沿或下降沿时调用SFC 13,将读取的诊断数据分别保存到DB7中不同的区域。对其他从站的故障诊断可以按同样的方法处理。4号和5号从站的故障刚发生和刚结束时,分别将M30.0和M40.0置位和复位。在运行时用变量表监控M20.0、M30.0和M40.0,可以看到它们与各从站故障出现和消失之间的关系。
2.项目简介
在前面介绍的项目SFC_13的基础上,创建一个名为OB1SFC13的项目(见随书光盘中的同名例程),两个项目的硬件结构和程序结构相同,OB82中的程序完全相同。
3.OB86的程序设计
将项目SFC_13的OB86中调用SFC 13的程序删除,保留下列程序:MW84加1、保存OB的局部变量、根据局部变量字LW8判断是哪个从站触发的中断、对从站故障标志M20.0、M30.0和M40.0置位和复位。下面是对7号从站故障标志M20.0置位和复位的程序:
程序段4:7号从站故障标志处理(www.xing528.com)
4.OB1的程序设计
在M20.0、M30.0和M40.0的上升沿和下降沿调用SFC 13,分别读取7号、4号和5号从站的诊断数据。FP和FN分别是上升沿检测和下降沿检测指令。
SFC 13的请求信号REQ在M20.0、M30.0和M40.0的上升沿和下降沿时有效,持续的时间为一个扫描循环周期。用跳转指令JC实现的SFC 13的循环调用是在CPU的一个扫描循环周期内完成的。
下面是读取7号从站诊断数据的程序。在程序段1,如果不是7号从站故障刚出现时产生的诊断中断,SFC 13的使能位M20.2为0,不会触发SFC 13来读取诊断数据。BUSY信号M21.3为0状态时(读取诊断数据的操作结束),跳转指令的条件不满足,将进入程序段2。
程序段1:读取7号从站故障刚出现时的诊断数据
程序段2:读取7号从站故障刚消失时的诊断数据
实验时发现在M20.0、M30.0和M40.0的上升沿、下降沿读取的同一从站的诊断数据基本上相同,可以将代表同一方波信号的上升沿、下降沿的变量(例如上面程序中的M20.2和M20.4)作“或”运算后,作为SFC 13的请求信号REQ,这样可以少调用一次SFC 13。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。