之前我曾经写过S7-300/400利用诊断错误组织块进行错误诊断的文章(见:如何使用中断组织块OB82对系统进行故障诊断?),由于S7-1200/1500的组织块接口有些不同,今天我们来介绍下在S7-1200/1500下利用诊断错误组织块来诊断模块错误的方法。
很多模块本身具有诊断功能,比如S7-1500的模拟量输入模块AI 4xU/I/RTD/TC,它是具有4个模拟量输入通道的模块,能接收电压/电流/热电阻/热电偶等模拟量信号(通过硬件配置选择不同的信号类型)。它集成了多种诊断功能,比如可以检测信号的上溢、下溢、断线、无电源电压等,如下图所示:
不过这些诊断功能默认是关闭的,当我们想激活某个诊断功能时,比如断线,需要手动勾选它。当勾选后,该功能就被激活。如果模块检测到该通道连接的传感器出现断线故障,它就会发送一个诊断中断给CPU。CPU接收到该诊断中断后,会尝试调用诊断错误组织块(OB82)。如果CPU没有找到该组织块,将进入停机模式。所以,要启用诊断并且不让CPU停机,首先要添加诊断错误组织块(OB82)并下载到CPU中。
添加的方法如下:
在项目树“程序块”双击“添加新块”,在弹出的对话框中选择“组织块”→“Diagnostic error interrupt(诊断错误中断)”,如下图所示:
该组织块的输入参数如下图所示:
各参数的含义如下:
IO_State:表示模块的状态(16位)。第0位表示组态是否正确,1=正确,0=错误;第4位表示是否出现错误,1=有错误,0=无错误;第6位表示是否有I/O范围错误,1=有错误,0=无错误;
LADDR:模块的硬件标识符;
Channel:模块的通道编号;
MultiError:是否有多个错误,1=有,0=无;
CPU在接收到诊断错误中断后,会调用诊断错误中断组织块(OB82),并且将相关的信息赋值给该组织块的输入参数,我们可以在组织块OB82中编写代码将相关信息保存到全局数据块中,以便在某个具体模块的中进行判断。
比如,我创建了全局数据块“GlobalDiagnostic_DB82”,如下图所示:
在OB82中编写代码如下:
在传感器的函数块中,可以通过与GlobalDiagnostic_DB82中的信息进行比较,获得模块的诊断信息,从而判断传感器是否发生断线等错误。如果有错误发生,可以触发报警提醒操作人员。
诊断错误中断组织块在错误发生时被操作系统调用一次,当错误消失后会再调用一次。如果有多个模块发生类似错误,只能当上一个错误消除后,才会触发下一个错误的消息。
我的书《西门子S7-1200/1500 PLC SCL语言编程 ——从入门到精通》对西门子PLC的软件架构(组织块)有比较详细的介绍,如果你感兴趣的话,可以扫描下面的二维码:
如果你想了解该书的详细内容,请点击左下角【阅读原文】或下面的链接:
新书《西门子S7-1200/1500 SCL语言编程——从入门到精通》出版啦!
如果你已经购买了该书,可以私信我(请备注“SCL”)交流。
发表评论