拓扑诊断
2.1.1 TIA 博途拓扑视图
TIA 博途的拓扑视图,可以通过组态期望的连接关系来为 PLC 提供拓扑检查的功能。实际的网络连接关系和组态的拓扑不一致,虽然不会影响通信的结果,但是 PLC 会产生响应的报警信息。
如下图的例子,S7-1500 控制器连接了两个分布式 I/O,设备名称分别为 “io device_1” 的ET200MP和 “io device_2” 的ET200SP, “io device_2” 的P1接口应该连接到交换机的P3 口,如果连接错误了,PROFINET 虽然正常,但是通过 TIA 博途拓扑视图在线和在线诊断功能,我们可以看到 ET200 SP 和交换机都产生了报警。
借助 TIA 博途的在线诊断,我们可以知道拓扑连接错误的故障,ET200SP 站点连接在了错误的接口上。但是在实际工程中,获得的诊断信息也有几点不足:
1) 诊断是借助 TIA 博途软件,PLC 程序不能直接获得状态
2) 除了知道拓扑连接错了,程序中能不能知道 ET200SP 当前连接到交换机的哪个接口呢?
为了实现这两点要求,我们接下来看看 PLC 程序上该如何处理。
2.1.2 MAC 地址表
以太网数据在2层转发,依靠的是设备的 MAC 地址,MAC 地址和设备端口的对应关系就是我们常说的 MAC 地址表,交换机转发数据就是依靠MAC 地址表。如下图,通过检查交换机的 MAC 地址表,我们可以知道了设备名 “io device_2” 的设备按照设计应该连接在交换机 P3 口,但是此时错误的出现在了 P6 口上。
因此,如果在 PLC 程序中能够获得交换机的 MAC 地址表信息,就可以知道哪个设备接错了,而且还可以知道实际接到了哪个接口上。借助 SNMP 的程序块,CPU 可以获得所有这些信息,只需要知道查询 MAC 地址表的OID 即可。
2.1.3 SIMATIC PLC SNMP 获得拓扑连接信息
交换机等网络设备的 MAC地址表,已经在通用的 MIB-2 规范中定义了,其中 MAC 地址对应的端口号的根 OID 为1.3.6.1.2.1.17.7.1.2.2.1.2。
如果需要查询具体的 MAC 地址对应的端口号,需要在 OID 的最后增加需要查询设备 VLAN 和 MAC 地址 (如下图,红色的 “1”表示查询的交换机的 VLAN1;蓝色部分表示需要查询的设备 MAC 地址。注意,OID 中的MAC地址需要将实际 MAC 地址转换为十进制数,例如上面列出的 io device_2,MAC地址:28-63-36-8b-da-7d→40.99.54.139.218.125),因此最终的 OID 如下。
“io device_1” MAC地址端口 OID:1.3.6.1.2.1.17.7.1.2.2.1.2.1.40.99.54.139.218.125
“io device_2” MAC地址端口 OID:1.3.6.1.2.1.17.7.1.2.2.1.2.1.0.27.27.33.9.205
程序上,我们分别调用两个“LSNMP_GET” 指令,来查询交换机的 MAC 地址表,分别读取两个分布式设备的 MAC 地址连接在交换机的哪个端口。返回的数据会存储在 “varBinding” 定义好的 DB 中。
通过在状态表中监控获得的数据,可以看到 io device_1 连接在交换机的P2 口,和拓扑组态一致;io device_2 连接在交换机的 P6 口,因此和组态的拓扑不一致。这样,通过程序的处理,我们不仅很容易知道哪个设备连错了,而且这个设备当前连接在哪里也能够知道了。
在实际工程中,我们也对程序块做了重新的封装,方便最终的应用,如下图,我们简单的输入交换机的 IP 地址和需要查询的设备的 MAC 地址,这个 MAC 地址在交换机的哪个端口就可以一目了然看到了。
2.1.4 SIMATIC PLC SNMP 批量处理
按照我们上面的介绍,如果我们需要查询的设备 MAC 比较多,就需要调用大量的 “LSNMP_GET “ 指令,那有没有办法通过一个指令就获得交换机的所有 MAC 地址表信息呢?
SIMATIC PLC SNMP 的指令块还提供了批处理的指令 “LSNMP_GetBulk” ,通过这个指令可以一键读取一定范围的 OID,如下图,我们输入 MAC 地址表的根 OID,“maxRepetitions” 表示查询从根 OID 开始的数量(我们这里读取5条,注意读取的数量不能超过当前交换机 MAC 地址表的最大条目数)
输出的结果保存在 “varBindings” 定义的数据块类型中,如下图,通过OID 字符串的后六个字节,可以知道是哪个设备的 MAC 地址,程序上我们做一下简单的梳理,整个交换机的 MAC 地址表都可以存储在 PLC 的 DB 中了。