Overview: The Multi-Server Tag Editing Problem
Managing setpoints, alarm limits, and configuration values across a campus of identical PLC-controlled buildings is a recurring engineering problem. When each building hosts its own Ignition gateway (or a parallel set of HMI/SCADA nodes) and shares 30–50 tags with the same semantic role, manual point-and-click editing becomes error-prone. This reference compares three field-proven workflows: Ignition scripting with system.tag.writeBlocking and system.tag.configure, Studio 5000 Logix Designer CSV import/export, and KEPServerEX bulk write. Each method fits a different layer of the automation stack and a different ownership model.
Method 1: Ignition Gateway Script Console (Recommended for Cross-Building Tag Writes)
Ignition by Inductive Automation exposes a Python-compatible scripting environment on every gateway, and the same script can be authored once and pushed to N gateways via the Ignition 8.1 Scripting Functions appendix. The recommended pattern is to keep the source-of-truth spreadsheet in Excel, generate a JSON payload, and use the script console as the write engine.
Prerequisites
- Ignition 8.1.x or later (script console,
system.tagmodule) - Uniform tag folder structure per building (e.g.,
[default]BuildingA/Setpoints/SP_Temp) - Read/write permission on the target tag provider for the script-runner account
Step-by-Step Procedure
- Build an Excel template with three columns:
tag_path,value, anddatatype(optional, for verification). - Use a VBA macro to format the rows into a JSON array, e.g.
[{"path":"[default]BuildingA/Setpoints/SP_Temp","value":72.5},...]. - Copy the JSON into the Ignition Script Console payload field.
- Run a generic write script that iterates the payload and calls
system.tag.writeBlockingin batches of 25–50 paths to avoid gateway timeouts.
Working Script
# Ignition Script Console - generic bulk writer
payload = [{'path':'[default]BuildingA/Setpoints/SP_Temp','value':72.5},
{'path':'[default]BuildingA/Setpoints/SP_Press','value':14.2}]
paths = [p['path'] for p in payload]
values = [p['value'] for p in payload]
results = system.tag.writeBlocking(paths, values)
failed = [(paths[i], values[i]) for i,r in enumerate(results) if not r.isGood()]
print 'Wrote', len(results)-len(failed), 'of', len(results), 'tags'
print 'Failures:', failed
For property changes (engineering units, alarm limits, deadbands) that writeBlocking cannot touch, escalate to system.tag.getConfiguration and system.tag.configure per the system.tag scripting reference. The PLCtalk thread on bulk-editing AOI tags documents the same pattern at the Studio 5000 layer, where an L5X export is the equivalent of the JSON payload.
Tag Report Tool Alternative
For one-time bulk edits of a single property to a single value, the built-in Tag Report Tool in the Ignition Designer web interface supports multi-select tag operations without scripting. The tool is useful for setting documentation strings or initial alarm limits but does not scale to per-tag calculated values, which is where the JSON payload method dominates.
Method 2: Studio 5000 Logix Designer CSV Import/Export
When the source of truth lives in Logix Designer (CompactLogix, ControlLogix) rather than in Ignition, the L5X/CSV export-import cycle is the canonical bulk-edit path. The Inductive Automation CSV import demo shows the analogous workflow for Ignition's own tag database.
Procedure for Studio 5000 v33/v34
- Open the AOI or program that contains the bulk tags.
- Export →
.L5X(XML). For Logix Designer v33 and later, the CSV Export/Import option is available under Logic → Export Tags and Import Tags. - Edit the CSV externally (Excel, Notepad++). Required columns:
Name, DataType, Value (or Specifier). - Re-import and allow Logix Designer to merge or overwrite based on your selection.
- Verify by reading the tags through Monitor Tags in Studio 5000 or via RSLinx.
Method 3: KEPServerEX Bulk Write via Quick Client or API
For installations where KEPServerEX is the OPC DA/UA server fronting a Mitsubishi, Allen-Bradley, or Siemens PLC, the PTC community thread on KEPServerEX bulk updates confirms that the Quick Client and the KEPServerEX Configuration API both support iterating the tag list and writing each value. For 2,000+ tags, batch the writes in groups of 100 to avoid exhausting the OPC session's subscription buffer.
KEPServerEX REST Config API Skeleton
POST /config/v1/project/channels/Channel1/devices/PLC1/tags
Authorization: Basic <base64 user:pass>
Content-Type: application/json
[
{"common.ALLTYPES_NAME":"SP_Temp","servermain.TAG_DATA":"72.5"},
{"common.ALLTYPES_NAME":"SP_Press","servermain.TAG_DATA":"14.2"}
]
This is a write to the tag definition, not a runtime value override. For runtime value writes from the Ignition side, use the Ignition KEPware driver or the OPC-UA client; the runtime path is preferred for setpoint changes that should not persist to the server's project file.
Method Comparison
| Criterion | Ignition Script Console | Studio 5000 CSV/L5X | KEPServerEX Config API |
|---|---|---|---|
| Layer | SCADA/HMI runtime | Controller program | OPC server project |
| Best for | Setpoints, alarm limits, mode bits | AOI instance parameters, tag database overhaul | Initial commissioning, 2,000+ tag sweeps |
| Change scope | Value + select properties | Full tag definition | Tag definition (not runtime value) |
| Rollback | Re-run script with prior JSON | Git diff on L5X | Server project backup restore |
| Multi-gateway scaling | High (same script, N gateways) | Medium (one program per controller) | Low (one server per site) |
| Prereq tools | Excel + VBA, Python in Ignition | Logix Designer v33+ |
Field-Proven Caveats and Standards References
Three operational constraints surface repeatedly when bulk-editing tags across a campus:
-
Atomicity. Neither
writeBlockingnor the L5X import is transactional. A partial failure leaves the database in a mixed state. Always log successes and failures, and design the JSON payload to be idempotent (re-runnable without side effects). -
Permissions. Per the Ignition Gateway Security documentation, the script console runs under the gateway's user context, which may differ from a designer session. Confirm the role has
Tag - Writeon the target provider. -
Standards. OPC UA Part 100 (IEC 62541) defines bulk-read/bulk-write service sets that Ignition's
writeBlockingand KEPServerEX'sWriteTagsCOM call both implement. For regulated environments (21 CFR Part 11, IEC 62443), maintain an audit log of the JSON payloads, the operator ID, and a hash of the pre/post tag values.
Verification Procedure
After any bulk edit, verify in three layers:
- Controller layer: Read back the tag from the PLC via RSLinx/Studio 5000 (if Studio 5000 path) or via an OPC-UA browse.
- SCADA layer: Confirm in an Ignition Vision or Perspective client window that the new value is bound and showing good quality.
- Application layer: Trigger a downstream consumer (PID loop, alarm, interlock) and observe correct response within the expected scan period.
What is the fastest way to bulk-write 50 setpoints to one Ignition gateway?
Build a JSON array of {path, value} pairs in Excel using a VBA macro, paste it into the Ignition Script Console, and run a script that calls system.tag.writeBlocking(paths, values) in batches of 25–50. Total runtime is typically under 2 seconds for 50 tags on a local gateway.
Can I edit the same 50 tags across 10 Ignition gateways in one operation?
Yes, but not from a single script. Author the JSON payload once, then either (a) script the writes remotely through the Gateway Network, or (b) paste the payload into each gateway's Script Console and execute. Option (b) is the most auditable; option (a) requires a Gateway Network configuration and is faster but harder to roll back per-site.
Does Studio 5000 CSV import overwrite tag values or full definitions?
In Logix Designer v33 and later, the CSV Import operation can be scoped to values only or to full definitions. Always export the current AOI/program to an L5X file first, perform the CSV edit, and diff the L5X before going online to confirm no unintended structural changes.
How do I bulk-write 2,000 tags through KEPServerEX?
Use the KEPServerEX Configuration REST API (POST to /config/v1/project/channels/.../tags) in batches of 100, or use the COM WriteTags call from a Python/C# script. The Quick Client is useful for one-off spot checks but is not designed for 2,000-tag sweeps.
Where can I find the official scripting reference for Ignition's system.tag module?
The canonical reference is the Inductive Automation system.tag scripting functions page for Ignition 8.1, which documents writeBlocking, getConfiguration, configure, and the asynchronous writeAsync variant.