# Ignition & Logix Best Practice Tips for better communications

**URL:** <https://forum.inductiveautomation.com/t/ignition-logix-best-practice-tips-for-better-communications/60386>\
**Category:** Ignition\
**Tags:** rockwell\
**Created:** [June 5, 2022, 11:46pm UTC](https://forum.inductiveautomation.com/t/ignition-logix-best-practice-tips-for-better-communications/60386 "2022-06-05T23:46:38Z")\
**Posts on this page:** 20\
**Page:** 3

<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:** [June 26, 2024, 3:49pm UTC](https://forum.inductiveautomation.com/t/ignition-logix-best-practice-tips-for-better-communications/60386/41 "2024-06-26T15:49:35Z")

</div>

I've got nothing to say about scan times used in your PLC program, but yes, it's meaningless for a number of reasons when it comes to Ignition Tag Group rates and the way drivers queue requests to be polled.

---

<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 25, 2025, 12:34am UTC](https://forum.inductiveautomation.com/t/ignition-logix-best-practice-tips-for-better-communications/60386/42 "2025-04-25T00:34:13Z")

</div>

I recently decided it was time to actually test the theories with scan rates for different structures in the PLC, and found the results below.

What I found (obviously) backed Phil's recommendations to only read UDT tags and to _ensure_ that _all members_ of them are set to at least read access. However what I found was negligible difference in response rate at 100ms when reading the UDT tags from within different structures (e.g. individual UDT instances at the root/controller level, addressing UDTs within an array, or addressing aliases to UDTs within an array)

Ignition request scan rate for all tests (except one): **100ms**  
Number of instances read: 250 (+800ish UDT tags outside of the test, however all are set to ext access = read/write)  
Driver used: IA's Logix driver  
PLC: L82

| **Test** | **Tag Count** | **Actual PLC Response Rate** | **Request Count** |
| --- | --- | --- | --- |
| Individual UDT instances | 7845 | 100.39ms | 20 |
| **Individual UDT instances, Scan rate set to 1ms, CIP Connection Size = 4000** | 6787 | 1.05ms | 2 |
| Array of UDT instances | 7845 | 101.19ms | 21 |
| Aliases to each item in an Array of UDT instances | 7872 | 100.69ms | 21 |
| **AOIs** with same tags as in UDTs | 7899 | **978.20ms** | 303 |
| Individual UDT instances _with a single member set to External Access = None (Note: SCADA didn't actually read this tag)_ | 7845 | **714ms** | 20 |

(all members set to read/write ext. access)

 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/d/9/d97f381701b271d19503c72709481cb28f88c754.jpeg)

(all members set to read/write ext. access, CIP Connection Size = 4000)

 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/8/6/866d043550f64e135e2399f707b27f9a36e63e87.png)

(all members set to read/write ext. access)

 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/d/a/dadf4d56fd4e5991475bc688b8407fc95fd26c58.png)

(all members set to read/write ext. access)

 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/b/3/b395dc59cf6076b38812b63f2e7f60197a28536a.png)

(all members set to read/write ext. access)

 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/9/e/9e8a8e058c1aa5db7242ca0f2bb8e316e1932ac2.png)

 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/e/6/e680e87150155fcca2c5e9d3d149e720c5485e52.png)

_Note: I think the slight difference in tag counts is a result of reading 1 or 2 fewer udt/aoi instances, but it shouldn't make much of a difference_

---

<div class="post-metadata">

**Author:** ![bmusson](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/bmusson/32/87530_2.png) [@bmusson](https://forum.inductiveautomation.com/u/bmusson)\
**Post date:** [April 25, 2025, 12:59am UTC](https://forum.inductiveautomation.com/t/ignition-logix-best-practice-tips-for-better-communications/60386/43 "2025-04-25T00:59:57Z")

</div>

> [@nminchin](#):
>
> However what I found was negligable difference in response rate at 100ms when reading the UDT tags from within different structures

This has been my (unquantified) experience too.

Even if it’s theoretically faster to have large global arrays for all UDT types, I don’t think the extra difficultly of working with those kinds of structures normally justifies it.

---

<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 25, 2025, 1:49am UTC](https://forum.inductiveautomation.com/t/ignition-logix-best-practice-tips-for-better-communications/60386/44 "2025-04-25T01:49:13Z")

</div>

Can you share the AOI and UDT definitions you used for this?

---

<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 25, 2025, 1:56am UTC](https://forum.inductiveautomation.com/t/ignition-logix-best-practice-tips-for-better-communications/60386/45 "2025-04-25T01:56:54Z")

</div>

This should hopefully be all of them...

This doesn't include the extra UDT member I added into \_M1\_Vlv\_Cmd that was set to ext access = None, but that's all I added when I tested this part

[AB Logix Driver Test Tags.zip](https://forum.inductiveautomation.com/uploads/short-url/osQKPFLtjSnpHlaLmHS2UN5nRck.zip) (5.6 MB)

Edit: I added ACD

Ignition tags:  
[Tags.json](https://forum.inductiveautomation.com/uploads/short-url/522mkFemBfNqgCMm5dohTNKmfwZ.json) (4.0 MB)

---

<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 25, 2025, 2:36am UTC](https://forum.inductiveautomation.com/t/ignition-logix-best-practice-tips-for-better-communications/60386/46 "2025-04-25T02:36:07Z")

</div>

Thanks. Just needed to see your UDT defs. I couldn't explain the request count difference between the AOI and the UDT w/ 1 ExternalAccess=None member at first.

But now I see your parent test UDT is comprised of 4 sub-UDTs. Adding a member we can't read means we can't read the parent, but we can still read the 4 sub UDTs as a whole. So better than AOI, but not as good as having all members accessible.

---

<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 25, 2025, 2:57am UTC](https://forum.inductiveautomation.com/t/ignition-logix-best-practice-tips-for-better-communications/60386/47 "2025-04-25T02:57:02Z")

</div>

> [@Kevin.Herron](#):
>
> Adding a member we can't read means we can't read the parent, but we can still read the 4 sub UDTs as a whole

Actually I added a member into one of the child UDT types, so I guess you can read the 3x other UDTs as a whole but the 4th not. I'm still confused a bit by the request count given this...

 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/a/7/a7e631ef5ec90158f77035674c3d1d48e3d102c1.png)

---

<div class="post-metadata">

**Author:** ![michael.flagler](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/michael.flagler/32/26272_2.png) [@michael.flagler](https://forum.inductiveautomation.com/u/michael.flagler)\
**Post date:** [April 25, 2025, 3:23am UTC](https://forum.inductiveautomation.com/t/ignition-logix-best-practice-tips-for-better-communications/60386/48 "2025-04-25T03:23:11Z")

</div>

You should also test embedding the UDT inside an AOI but only reading the UDT instance and no AOI tags. I think it should read quickly too but curious.

---

<div class="post-metadata">

**Author:** ![Chris\_Bingham](https://avatars.discourse-cdn.com/v4/letter/c/e5b9ba/32.png) [@Chris\_Bingham](https://forum.inductiveautomation.com/u/Chris_Bingham)\
**Post date:** [April 25, 2025, 12:21pm UTC](https://forum.inductiveautomation.com/t/ignition-logix-best-practice-tips-for-better-communications/60386/49 "2025-04-25T12:21:47Z")

</div>

This is great info. Thanks for the taking the time to trial!  
I’m surprised by the request count for AOI access. I should see if I can get access to the results of a project I recently worked on (where AOI-only access was my first attempt and yielded very positive results, with a MUCH lower tag/request count).

---

<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 25, 2025, 9:08pm UTC](https://forum.inductiveautomation.com/t/ignition-logix-best-practice-tips-for-better-communications/60386/50 "2025-04-25T21:08:33Z")

</div>

> [@Chris\_Bingham](#):
>
> (where AOI-only access was my first attempt and yielded very positive results, with a MUCH lower tag/request count).

Was that using Phil's driver or IA's?

---

<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 25, 2025, 9:17pm UTC](https://forum.inductiveautomation.com/t/ignition-logix-best-practice-tips-for-better-communications/60386/51 "2025-04-25T21:17:13Z")

</div>

@nminchin if you increased the CIP Connection Size from 500 to 4000 you would see less requests.

@Chris_Bingham that could explain some difference you saw. Or if you were using Phil's driver.

The whole test setup is still valid as a relative performance comparison between UDT and AOI access.

---

<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 25, 2025, 9:59pm UTC](https://forum.inductiveautomation.com/t/ignition-logix-best-practice-tips-for-better-communications/60386/52 "2025-04-25T21:59:49Z")

</div>

> [@Kevin.Herron](#):
>
> CIP Connection Size from 500 to 4000

I always forget about this...

Holy moly

 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/8/7/8762134e0c697be07479a5cbfa1b35889a9e0d60.png)

 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/1/9/19046f2f4bf97e071371e41a199c2130412c51fe.png)

Edit:  
Updated results with tests using different CIP Connection sizes:

| Test | Ext Access | CIP Connection Size | Tag Count | Requested Sample Rate (ms) | Actual Sample Rate (ms) | Request Count | Overload |
| --- | --- | --- | --- | --- | --- | --- | --- |
| UDTs | All Read/Write | 500 | 6787 | 10 | _45.48_ | 14 | _355%_ |
| UDTs | All Read/Write | 4000 | 6787 | 10 | 10.06 | 2 | 1% |
| AOI Local Tags (UDT) | All Read/Write | 500 | 6787 | 10 | _50.86_ | 14 | _409%_ |
| AOI Local Tags (UDT) | All Read/Write | 4000 | 6787 | 10 | 10.08 | 2 | 1% |
| AOI Parameter Tags | All Read/Write except EnableIn/Out | 4000 | 6787 | 10 | _ **519.02** _ | 33 | _ **5090%** _ |
| Aliased UDT Array Elements | All Read/Write | 4000 | 6760 | 10 | 10.06 | 2 | 1% |
| UDT Array Elements | All Read/Write | 4000 | 6787 | 10 | 10.06 | 2 | 1% |

---

<div class="post-metadata">

**Author:** ![Ghost](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/ghost/32/78380_2.png) [@Ghost](https://forum.inductiveautomation.com/u/Ghost)\
**Post date:** [April 25, 2025, 10:12pm UTC](https://forum.inductiveautomation.com/t/ignition-logix-best-practice-tips-for-better-communications/60386/53 "2025-04-25T22:12:21Z")

</div>

Thanks Nick, this seems like it'll be useful.

Do you happen to have the L82's class 3 MSG loading for these tests?

---

<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 25, 2025, 10:18pm UTC](https://forum.inductiveautomation.com/t/ignition-logix-best-practice-tips-for-better-communications/60386/54 "2025-04-25T22:18:27Z")

</div>

I broke it haha, still getting 110ms though with 29k tags!

 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/e/6/e6103554838a7391ec43dcfdcf4773f14df993fb.png)

> [@Ghost](#):
>
> Do you happen to have the L82's class 3 MSG loading for these tests?

How do I check this? (I'm not a PLC guy)

---

<div class="post-metadata">

**Author:** ![Ghost](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/ghost/32/78380_2.png) [@Ghost](https://forum.inductiveautomation.com/u/Ghost)\
**Post date:** [April 25, 2025, 10:35pm UTC](https://forum.inductiveautomation.com/t/ignition-logix-best-practice-tips-for-better-communications/60386/55 "2025-04-25T22:35:08Z")

</div>

You'd enable the Webpage to see this within Studio 5000 Logix Designer in the controller properties via the Security tab and then check "Enable Controller Web Pages". You'll need to download the PLC program to get it active within your PLC. (This also needs to be a real PLC and not an emulated one)

Then within a browser, point it to your PLC's IP address and the class 3 MSG loading will be visible as "Communication" and as a percent of the total class 3 MSG under the Tasks tab.

I haven't been able to figure out what all this entails, but I believe it's how much the processor is loaded and able to respond to class 3 MSG requests; anything above 100% would likely involve some delay, but no way to determine if you're 110% or 300% overloaded from this I believe.

You're also able to get at this value via a ~~GSV~~ MSG, but that's a bit more complicated...

---

<div class="post-metadata">

**Author:** ![michael.flagler](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/michael.flagler/32/26272_2.png) [@michael.flagler](https://forum.inductiveautomation.com/u/michael.flagler)\
**Post date:** [April 25, 2025, 10:47pm UTC](https://forum.inductiveautomation.com/t/ignition-logix-best-practice-tips-for-better-communications/60386/56 "2025-04-25T22:47:05Z")

</div>

Did you get a chance to test dropping that same large UDT as a local tag into a blank AOI and seeing if reading the UDT from inside yielded the same performance? In my testing it was slightly slower, but still fast, and the reason I liked it was because now I don't have to have separate InOut parameters for my UDT tags and can just clean up the AOI by embedding the UDT internally.

---

<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 26, 2025, 12:09am UTC](https://forum.inductiveautomation.com/t/ignition-logix-best-practice-tips-for-better-communications/60386/57 "2025-04-26T00:09:05Z")

</div>

250x AOIs with a UDT with nested UDTs in a local AOI tag, 100ms request rate, CIP connection size = 500:

 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/4/4/442b54a03a65c4cb69d904243abc553795812d19.png)

AOI definition:

 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/f/5/f5f7527cc64b015f503bf020556484b7c61a070c.png)

---

<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 26, 2025, 12:23am UTC](https://forum.inductiveautomation.com/t/ignition-logix-best-practice-tips-for-better-communications/60386/58 "2025-04-26T00:23:33Z")

</div>

How would you use the local UDT defined inside the AOI from outside of the AOI logic? I didn't think you could access local tags from logic outside of the AOI?

 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/6/5/655d675ac4f39324cdbb6a41fdecbb3c70ac861e.png)

All I see selectable are the two EnableIn/Out parameters.

Would you map the things you needed on the outside through to AOI Parameters?

---

<div class="post-metadata">

**Author:** ![michael.flagler](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/michael.flagler/32/26272_2.png) [@michael.flagler](https://forum.inductiveautomation.com/u/michael.flagler)\
**Post date:** [April 26, 2025, 1:17am UTC](https://forum.inductiveautomation.com/t/ignition-logix-best-practice-tips-for-better-communications/60386/59 "2025-04-26T01:17:07Z")

</div>

You can't, but since I only use local UDT tags in the AOI for HMI comms, it doesn't matter. Any tags I need to use for logic are on the AOI and if I need them on the HMI, I map them inside the AOI to the UDT.

---

<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 26, 2025, 2:43pm UTC](https://forum.inductiveautomation.com/t/ignition-logix-best-practice-tips-for-better-communications/60386/60 "2025-04-26T14:43:43Z")

</div>

I've found a small improvement to make in the scenario where individual tags are being read, such as when reading each AOI member individually. It looks like we're slightly over-calculating the size of each ReadTagService request, which means the requests are slightly under-filled compared to what they could be.

Not going to make anywhere near the kind of difference reading whole AOIs would, but it's still something...

edit: if anybody wants to try it, here's a Logix Driver module. It requires Ignition 8.1.46+. [https://www.dropbox.com/scl/fi/tm5p51sddlgup32306tom/Logix-Driver-module.modl?rlkey=6v60ve33n5jznm38ih23rvaeo&st=f6w3igvm&dl=0](https://www.dropbox.com/scl/fi/tm5p51sddlgup32306tom/Logix-Driver-module.modl?rlkey=6v60ve33n5jznm38ih23rvaeo&st=f6w3igvm&dl=0)

[Previous page](https://forum.inductiveautomation.com/t/ignition-logix-best-practice-tips-for-better-communications/60386.md?page=2)

[Next page](https://forum.inductiveautomation.com/t/ignition-logix-best-practice-tips-for-better-communications/60386.md?page=4)
