One goal is that the front-end effort here will reduce the manual labor required for individual GSV/module statuses and the effort to produce diagnostics across varying types of control devices. I can auto-populate a generalized "EtherNet" tree (realized as simple contiguous arrays) per node (5069 or 1756-EN2T EtherNet port, or otherwise) and dynamically list the modules attached to the system on an HMI. If you add another 525 for example, the array and its member count increases by one, an HMI visibility control shows a new item, and so on.
No need to recompile the HMI or remember to attach status AOIs to new node modules.
Another perk is that one can use the EPATH provided at the port level + module IP to dynamically probe the list of modules for their Identity, TCPIPInterface, and EtherNetLink objects.
One annoyance I run into all the time is figuring out (and remembering!) that Rockwell picks and chooses which CIP services are implemented for like objects on different devices. For example, TCPIPInterface (0xF5) responds to Get_Attribute_All on a CompactLogix, but only responds to Get_Attribute_Single on a PowerFlex 525. With that in mind, I can simply have a pair of global messages (GetAttrAll & GetAttrSingle) crawl my list of modules continuously without a concern in the world for what device implements what service. If one message fails, no big deal, just move on and let the other have a try. Then you have Moxa, who seems to hate Get_Attribute_All; no problem, just give GetAttrSingle the path!