Hi, thanks for the interest in libplctag.
The data types for CIP are defined in /src/protocols/ab/defs.h starting on line 128. That said, note that the type you get back from a tag read is not really a type. If the tag is an atomic type (DINT, SINT etc.) then you get one of the values in that file as a two byte type field. If the tag is an array or UDT, you get back a longer type field, usually 4 bytes but these do not seem to include the array dimensions. In the case of a UDT the "type ID" part of the type data (the last two bytes) is not an ID. It is a hash of some sort of the field names. It is not unique and I have never found a CIP command that uses it. I have no idea why AB sends it back.
If you list tags, you will get the UDT ID and you can get the array dimensions. But you cannot get that information when just reading a tag.
PCCC is the older protocol that is used by PLC/5, SLC 500 and MicroLogix PLCs. The version used in libplctag is wrapped in CIP commands. There is another version used by older PLC/5 equipment that is closer to the raw protocol used on DH+, DF1. There are documents from Allen-Bradley that describe that raw protocol, DF1, if you search their web site.
I hope that helps!
Best,
Kyle