# Basic table from device status

**URL:** <https://forum.inductiveautomation.com/t/basic-table-from-device-status/105364>\
**Category:** Ignition\
**Created:** [April 22, 2025, 12:30am UTC](https://forum.inductiveautomation.com/t/basic-table-from-device-status/105364 "2025-04-22T00:30:24Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![will.martin](https://avatars.discourse-cdn.com/v4/letter/w/65b543/32.png) [@will.martin](https://forum.inductiveautomation.com/u/will.martin)\
**Post date:** [April 22, 2025, 12:30am UTC](https://forum.inductiveautomation.com/t/basic-table-from-device-status/105364/1 "2025-04-22T00:30:24Z")

</div>

Hi there,

I am trying to make a basic table that will display some of the device status. I have already made UDT's using bit masking to get all the values I want.

Additionally, i have been able to make a template and tie it to a the UDT and make the UDT instances drag and drop. This has worked well.

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

The trouble is I'm looking at this for about 125+ processors and was thinking a table might be the way to go. I tried doing this a prospective table and can get data bound and working, but only entry by entry. Nothing to make creating it 125 times simple.

I am fairly new with ignition so my approach could be completely wrong. I'm looking for feedback on if I'm even headed the right direction. and if so, maybe some pointers on where I can study up. I have poked around through the manual, watched a ton of videos on Inductive University and Youtube. All help is welcomed.

---

<div class="post-metadata">

**Author:** ![David\_Stone](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/david_stone/32/79749_2.png) [@David\_Stone](https://forum.inductiveautomation.com/u/David_Stone)\
**Post date:** [April 22, 2025, 12:34am UTC](https://forum.inductiveautomation.com/t/basic-table-from-device-status/105364/2 "2025-04-22T00:34:23Z")

</div>

Perspective or Vision?  
This will change the methods you get quite a bit.

---

<div class="post-metadata">

**Author:** ![will.martin](https://avatars.discourse-cdn.com/v4/letter/w/65b543/32.png) [@will.martin](https://forum.inductiveautomation.com/u/will.martin)\
**Post date:** [April 22, 2025, 4:38pm UTC](https://forum.inductiveautomation.com/t/basic-table-from-device-status/105364/3 "2025-04-22T16:38:35Z")

</div>

I am open to both. We have mix of vison and perspective.

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [April 22, 2025, 4:39pm UTC](https://forum.inductiveautomation.com/t/basic-table-from-device-status/105364/4 "2025-04-22T16:39:46Z")

</div>

If this is Vision, change your template to accept a tag path _string_ parameter, and use an indirect binding inside the template.

Then use a template repeater with a dataset of your 125 tag paths to create all the instances you want.

You can do basically the exact same thing in Perspective, using a "template" view and the flex repeater.

---

<div class="post-metadata">

**Author:** ![Simon\_Hathout\_Willar](https://avatars.discourse-cdn.com/v4/letter/s/3da27b/32.png) [@Simon\_Hathout\_Willar](https://forum.inductiveautomation.com/u/Simon_Hathout_Willar)\
**Post date:** [April 22, 2025, 4:47pm UTC](https://forum.inductiveautomation.com/t/basic-table-from-device-status/105364/5 "2025-04-22T16:47:07Z")

</div>

Just to check, the reason to use tag paths is due to much better performance from indirect tag bindings, compared to UDTs, yes?

Getting this to work using perspective's built in table would be possible (if you have a binding for each element in the table), but you'd want to generate these bindings with scripting, which is beyond my level of knowledge.

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [April 22, 2025, 6:25pm UTC](https://forum.inductiveautomation.com/t/basic-table-from-device-status/105364/6 "2025-04-22T18:25:40Z")

</div>

The footgun in Vision is specifically the UDT **parameters** you can add as custom properties. Because of the way they work, if you bind to a UDT parameter you're reading **all of the UDT** , all the time, even if you only need a couple of individual tags within it for whatever your template/etc is doing. If you use indirect tag bindings, you're forced to be more deliberate about which elements you actually pull out.

---

<div class="post-metadata">

**Author:** ![will.martin](https://avatars.discourse-cdn.com/v4/letter/w/65b543/32.png) [@will.martin](https://forum.inductiveautomation.com/u/will.martin)\
**Post date:** [May 12, 2025, 4:15pm UTC](https://forum.inductiveautomation.com/t/basic-table-from-device-status/105364/7 "2025-05-12T16:15:02Z")

</div>

I was able to get it to work using another thread I thread I found on here.

The other thread:[UDT to power table](https://forum.inductiveautomation.com/t/udt-to-power-table/33028)

My final version:

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

The final script I created I placed under a timer gateway event script.

Open to feedback!

```python
tagPath = '[default]PLC Status/All PLCs'
udtID = 'PLC Status/PLC Status'

keys = ["Parameters/DeviceName", "Key Switch Postion","Fault Status","Program State","Full Revision","PLC Connection"]
headers = ["Name", "Key Switch Postion","Fault Status","Program Status","Revision","Connection"]

    # Browse the tags. Filters on tagType to look only for UDT instances,
browse = system.tag.browse(path = tagPath, filter = {'tagType':'UdtInstance'})

    # Create tag names from browse results and keys.
tagsIn = [str(r['fullPath']) + '/' + key for r in browse.getResults() for key in keys if r['typeId'] == udtID]

    # Get tag values
values = [t.value for t in system.tag.readBlocking(tagsIn)]

    # Group the values by the number of keys
data = [values[i:i+len(keys)] for i in range(0, len(values)-(len(keys)-1), len(keys))]
dataset = system.dataset.toDataSet(headers, data)
system.tag.writeBlocking('[default]PLC Status/PLC Status', dataset)

```
