# Reading Allen Bradley UDT as Document Tags

**URL:** <https://forum.inductiveautomation.com/t/reading-allen-bradley-udt-as-document-tags/104923>\
**Category:** Ignition\
**Created:** [April 9, 2025, 8:18pm UTC](https://forum.inductiveautomation.com/t/reading-allen-bradley-udt-as-document-tags/104923 "2025-04-09T20:18:45Z")\
**Posts on this page:** 14\
**Page:** 1

<div class="post-metadata">

**Author:** ![Monica\_Gangwar](https://avatars.discourse-cdn.com/v4/letter/m/e47774/32.png) [@Monica\_Gangwar](https://forum.inductiveautomation.com/u/Monica_Gangwar)\
**Post date:** [April 9, 2025, 8:18pm UTC](https://forum.inductiveautomation.com/t/reading-allen-bradley-udt-as-document-tags/104923/1 "2025-04-09T20:18:45Z")

</div>

Hi, I am wondering if there is a way to read a UDT from an Allen Bradley PLC in the same way that it is possible with the S7-1500, using a document tag and the jsonGet and jsonSet functions.

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [April 9, 2025, 8:22pm UTC](https://forum.inductiveautomation.com/t/reading-allen-bradley-udt-as-document-tags/104923/2 "2025-04-09T20:22:34Z")

</div>

Not with IA native drivers or my alternate driver. Have you tried using the OPC server in recent Logix firmware? It might do this.

(Be beware, that way lies performance miseries, and major issues with writeback. To be clear: accessing a Siemens that way is a **kludge** due to limitations in the Siemens platform. It isn't intended to be considered a best practice.)

---

<div class="post-metadata">

**Author:** ![Monica\_Gangwar](https://avatars.discourse-cdn.com/v4/letter/m/e47774/32.png) [@Monica\_Gangwar](https://forum.inductiveautomation.com/u/Monica_Gangwar)\
**Post date:** [April 9, 2025, 8:34pm UTC](https://forum.inductiveautomation.com/t/reading-allen-bradley-udt-as-document-tags/104923/3 "2025-04-09T20:34:53Z")

</div>

I see, thanks Phil for the quick response.

---

<div class="post-metadata">

**Author:** ![nminchin](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/nminchin/32/6911_2.png) [@nminchin](https://forum.inductiveautomation.com/u/nminchin)\
**Post date:** [April 9, 2025, 10:40pm UTC](https://forum.inductiveautomation.com/t/reading-allen-bradley-udt-as-document-tags/104923/4 "2025-04-09T22:40:02Z")

</div>

> [@pturmel](#):
>
> accessing a Siemens that way is a **kludge**

This times 1000. Phil was being polite

---

<div class="post-metadata">

**Author:** ![Monica\_Gangwar](https://avatars.discourse-cdn.com/v4/letter/m/e47774/32.png) [@Monica\_Gangwar](https://forum.inductiveautomation.com/u/Monica_Gangwar)\
**Post date:** [April 10, 2025, 1:37pm UTC](https://forum.inductiveautomation.com/t/reading-allen-bradley-udt-as-document-tags/104923/5 "2025-04-10T13:37:06Z")

</div>

From first-hand experience, using the document tag + derived tags with Siemens OPC-UA has significantly improved loading performance of our screens, compared to creating all tags as OPC tags. We have also not experienced any writeback issues.

Do either of you have any resources or threads to read as to why this method is not recommended?

Thank you for the help!

---

<div class="post-metadata">

**Author:** ![Kevin.Herron](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kevin.herron/32/7259_2.png) [@Kevin.Herron](https://forum.inductiveautomation.com/u/Kevin.Herron)\
**Post date:** [April 10, 2025, 1:48pm UTC](https://forum.inductiveautomation.com/t/reading-allen-bradley-udt-as-document-tags/104923/6 "2025-04-10T13:48:01Z")

</div>

Don't worry, it is actually the recommended approach with the OPC UA server on the Siemens S7 PLCs.

The drawbacks are mostly that there's a lot of overhead in setting up all the tag configuration in Ignition, and that if you'll be writing to any of the tags in the structure, you need to have the Optimized Writes option enabled for the Tag Group they belong to. This is true in general for writing to tags within OPC UA structured values, because what actually has to happen is we need to modify the local value of the structure (document) and then write the entire structure.

When an OPC UA server models structures as both a single Variable Node with a structured value (or an Object Node), and then breaks out all the children into their own Variable/Object Nodes underneath, you don't have to do all the document / derived tag configuration because you can just bring every tag in.

Siemens actually does do this, but they have very strict Monitored Item limits on their servers, and if you subscribed to every Variable Node individually instead of just the parent with the structured value you will quickly hit your item limits and generally hurt the performance of the server.

This is not universally true for all OPC UA servers, but it is for many of the ones embedded into PLCs, where the hardware / resources are very limited.

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [April 10, 2025, 2:07pm UTC](https://forum.inductiveautomation.com/t/reading-allen-bradley-udt-as-document-tags/104923/7 "2025-04-10T14:07:53Z")

</div>

> [@Kevin.Herron](#):
>
> modify the local value of the structure (document) and then write the entire structure.

Ergo, race. If the PLC is updating anything within the structure when Ignition constructs the write, the PLC update will be lost. In exactly the same way that modifying bits in words using any read-modify-write pattern on the whole word can stomp on other bits.

> [@Kevin.Herron](#):
>
> breaks out all the children into their own Variable/Object Nodes underneath

> [@Kevin.Herron](#):
>
> Siemens actually does do this

This was one of the inspirations for my new **Divert\*Write** [tag actions](https://www.automation-pros.com/toolkit/doc/actors.html) in my Integration Toolkit. Instead of writing back from the derived tag with `jsonSet()`, write back to the individual node via the diversion. It gets you the best update performance on the subscription, while minimizing the monitored items limit, but completely avoiding the write race condition, too.

---

<div class="post-metadata">

**Author:** ![Kevin.Herron](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kevin.herron/32/7259_2.png) [@Kevin.Herron](https://forum.inductiveautomation.com/u/Kevin.Herron)\
**Post date:** [April 10, 2025, 2:22pm UTC](https://forum.inductiveautomation.com/t/reading-allen-bradley-udt-as-document-tags/104923/8 "2025-04-10T14:22:40Z")

</div>

Yeah, the race condition still exists if the structured value changes on the server at the same time a client is writing to it.

The divert tag write action is clever. I've seen some servers that don't expose structure members as individual Nodes, and don't expose array elements as individual Nodes, but it seems like most of them are?

Wish we had better OPC UA support in the tag system 🙃

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [April 10, 2025, 2:25pm UTC](https://forum.inductiveautomation.com/t/reading-allen-bradley-udt-as-document-tags/104923/9 "2025-04-10T14:25:31Z")

</div>

> [@Kevin.Herron](#):
>
> The divert tag write action is clever.

Woo hoo! I'm going to have to frame this! 🥲

For devices that do not expose the individual nodes, I strongly recommend using separate tags in each direction.

All of this is moot where the target device has a properly optimizable, high performance, native protocol (and Ignition is on the same LAN).

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [April 10, 2025, 2:33pm UTC](https://forum.inductiveautomation.com/t/reading-allen-bradley-udt-as-document-tags/104923/10 "2025-04-10T14:33:21Z")

</div>

> [@Kevin.Herron](#):
>
> better OPC UA support

You speculated on adding `system.opc.*` functions that would support OPC Node **attribute** read/write. I'd very much like to see that. It would solve all of the current unhappiness around return types in scripting support for OPC browse.

---

<div class="post-metadata">

**Author:** ![Luke\_Reznecheck](https://avatars.discourse-cdn.com/v4/letter/l/b487fb/32.png) [@Luke\_Reznecheck](https://forum.inductiveautomation.com/u/Luke_Reznecheck)\
**Post date:** [April 16, 2025, 3:14pm UTC](https://forum.inductiveautomation.com/t/reading-allen-bradley-udt-as-document-tags/104923/11 "2025-04-16T15:14:54Z")

</div>

Yes, use Rockwell's FactoryTalk Linx Gateway. That will allow you to read the UDT as a Document and then parse out the tag properties.

---

<div class="post-metadata">

**Author:** ![Monica\_Gangwar](https://avatars.discourse-cdn.com/v4/letter/m/e47774/32.png) [@Monica\_Gangwar](https://forum.inductiveautomation.com/u/Monica_Gangwar)\
**Post date:** [April 16, 2025, 5:24pm UTC](https://forum.inductiveautomation.com/t/reading-allen-bradley-udt-as-document-tags/104923/12 "2025-04-16T17:24:53Z")

</div>

@Luke_Reznecheck thank you. Do you have an example screenshot of how the UDT is structured in the PLC to do so?

---

<div class="post-metadata">

**Author:** ![Luke\_Reznecheck](https://avatars.discourse-cdn.com/v4/letter/l/b487fb/32.png) [@Luke\_Reznecheck](https://forum.inductiveautomation.com/u/Luke_Reznecheck)\
**Post date:** [July 31, 2025, 7:09pm UTC](https://forum.inductiveautomation.com/t/reading-allen-bradley-udt-as-document-tags/104923/13 "2025-07-31T19:09:53Z")

</div>

That is all unique to the UDT in the PLC. I just set the Ignition tag to be Document type and then go check the value it reads in.

---

<div class="post-metadata">

**Author:** ![Arnaud\_Declerck](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/arnaud_declerck/32/44872_2.png) [@Arnaud\_Declerck](https://forum.inductiveautomation.com/u/Arnaud_Declerck)\
**Post date:** [July 31, 2025, 7:12pm UTC](https://forum.inductiveautomation.com/t/reading-allen-bradley-udt-as-document-tags/104923/14 "2025-07-31T19:12:35Z")

</div>

I can confirm the Siemens OPC UA kuldge WHAT A NIGHTMARE...
