
我们在项目中,如果是西门子PLC的分布式IO模块,可以通过调用 DeviceStates 指令或者ModuleStates指令来获取模块的详细信息。

下图是采用DeviceStates指令来获取两个IO device的状态信息,当IO device故障的时候,state的对于的bool量值置为TRUE:

那针对第三方支持PN通信的一些IO模块的状态可以通过什么指令获取呢?


打开博图软件,我们可以在【指令】-->【诊断】栏下方找到详细的诊断指令,包括我们提到的DeviceStates和ModuleStates,如下图所示:

还有可以读取LED状态来读取CPU上面LED的状态等等,这样就可以很方便的在程序中使用它,并且可以做在触摸屏HMI上做详细的报警或指示,很方便查看设备的状态和实际的故障。

GET_DIAG
我们这次项目用到的是第三方的国产PN IO模块,从说明书及资料上看,可以通过GET_DIAG指令来获取具体的模块状态信息。

具体的参数:

其中,Mode模式的选择参考下面解释:

我们此示例采用Mode=1即可获取IO模块的所有状态信息。而当参数 MODE = 1 时,以 DIS 结构输出诊断信息。此时,在变量声明中输入系统数据类型“DIS”作为数据类型。

DIS数据结构
数据类型“DIS”具体包括以下几个参数:




具体的接口信息可以打开TIA,按下F1进入帮助系统查询。

示例
我们通过这种方式,新建程序后下载,打开监视,如下图所示:

我们通过这个DIS结构里面的OwnState可以确定:

模块不可访问,实际我们查看现场,确实该模块没有通电,所以处于不可访问的状态。
另外,IOState为16进制的8020,我们转换成2进制:

即第15位和第5位=1,查询对照如下表:

结合这些信息,就是硬件无法访问,跟实际现场对应上了,这样把它做成报警信息,显示在触摸屏上,直接可以看到模块无法访问,就能直接准确快速定位到具体IO模块设备,实现高效快速解决问题。
好了,关于第三方设备的通信问题,你是通过哪种方式获取的呢?有更好的方法请留言讨论哦!