Thanks for the feedback, everyone. Between the prebuilt AOI and indirect addressing for some message instructions, I've got a program that pretty much meets my requirements.
I have another question - not directly related to AOIs and MSG instructions, but I didn't think it warranted another thread since it's for the same project.
I've defined a UDT that represents a port on a Stratix switch, and an array of 26 of these to represent the ports on a given switch. The UDT has numerous arrays as members, such as an array of six SINTs for the MAC address.
Because of the way the CIP Generic "Get Single Attribute" message works, I can't programmatically change the index of the destination element. To get around this, I've declared another instance of the port UDT, this one to serve as temporary storage for the data. The idea is that the message gets written here, and then it gets copied to the port with the appropriate index.
The problem I'm having is with the copying part. If I use a COPY instruction with my source as Temp_Port.MAC_Address and the destination as Port_Array[index].MAC_Address, I get an error: "Invalid data type. Argument must match parameter data type." I get the same error if I try to copy Temp_Port.MAC_Address[0] to Port_Array[index].MAC_Address[0]. I don't understand this because both data types are an array of 6 SINTS.
If I try to use a MOVE instruction, I get that same error, though I can get around it by using the instruction on a single byte - Temp_Port.MAC_Address[5] to Port_Array[index].MAC_Address[5], for example.
I feel like there's something I'm not understanding about the way the MOV and COP instructions work with regard to arrays and UDTs. Can anyone help clarify this?