Here is what it looks like. The tag import dialog rejects the file, or it accepts it and you get half the tags. Otherwise your tag browser fills with hundreds of AOI members you never wanted. Meanwhile you still have roughly 1000 alarm bits to bring in, one BOOL per AOI instance.
Work back from that. You don't have a tag problem. You have a file-generation problem.
Skip the Fixes That Waste the Day
Engineers usually try three fixes first. All three fail at this scale.
- Drag the whole AOI instance into the tag browser. You get every member of every instance: inputs, outputs, locals, timers. At 1000 instances that is thousands of subscribed tags you have to scan, license against, and then hide or delete. That does not fix anything.
-
Drag only the alarm
BOOL, then rename it. The path is right, but every tag lands with the member name, so 1000 tags all end up called some variant ofAlarm. You end up doing 1000 manual renames and 1000 alarm configurations. Expect typos. - Hand-edit the exported XML. This format carries everything, including alarm configuration. It is also strict. One missed closing element or one mis-copied line kills the import, and you end up hunting through thousands of lines for the break.
Understand Why CSV Works and Alarms Don't Come With It
Ignition accepts tag imports in two practical ways, and they carry different amounts of data:
- Flat CSV import. One row per tag: name, type, data type, OPC path, and similar core properties. This format is easy to build from a spreadsheet. It does not carry alarm configuration, because alarms are nested objects under the tag and a flat row has no place for them.
- Structured export format. Depending on your Ignition release this is XML or JSON. Export one tag to see which one your gateway uses. It carries the full tag definition, including alarms, but it has to be well-formed.
The cure is not choosing between easy and complete. Let a machine write the structured file, so nobody hand-copies lines.
Diagnose What Your Import Is Telling You
| Symptom | Likely cause | Check first |
|---|---|---|
| XML import fails outright | Malformed structure, such as an unclosed element or a bad paste | Open the file in a browser or XML validator. It reports the first bad line. |
| Import fails at a specific tag | Unescaped &, <, > or a quote in a description pulled from Logix |
Search the descriptions column for those characters. |
| CSV import misaligns columns | Commas inside Logix descriptions | Drop the description column or quote the field. |
| Tags import but show bad quality | Wrong OPC path: missing program prefix, wrong device name, wrong member name | Compare against one drag-dropped tag that reads correctly. |
| Tags good, no alarms | Imported via CSV | Expected behavior. Use the template method below. |
| Some instances missing | AOI instances stored in arrays | Check the Logix CSV DATATYPE for array dimensions. |
Build the Import From One Known-Good Tag
Start here. Every generated line must come from something that already imports cleanly.
-
Make one perfect tag in Designer. Drag one alarm
BOOLfrom one AOI instance. Rename it the way you want all 1000 named, then configure its alarm completely: priority, display path, and any notes or labels. - Export that single tag. This file is your template. Find the text that changes per instance. Normally that is the tag name, the instance name inside the OPC item path, and possibly the alarm label.
-
Replace those strings with tokens such as
{NAME},{INSTANCE}, and{DESC}. Leave everything else byte-for-byte as exported. -
Export controller tags from Logix to CSV. Delete the remark and header rows above the data. Filter the
DATATYPEcolumn to your AOI's name. KeepNAME,SCOPE, andDESCRIPTION. -
Fix scope. Controller-scoped instances use the bare name. Program-scoped instances need
Program:<ProgramName>.<TagName>in the path, using theSCOPEcolumn value as the program name. - Expand arrays. If instances live in an AOI array, the CSV lists the array once. Generate one row per element index.
-
Escape descriptions before they touch XML. Replace
&first, then<,>, and quotes. - Generate the file using one of the two methods below.
- Import into an empty test folder first, not into your production tag tree.
Spreadsheet method
Collapse the template to a single line, because whitespace between XML elements is insignificant. Paste it into one cell, $T$1. Then fill down:
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE($T$1,"{NAME}",A2),"{INSTANCE}",B2),"{DESC}",C2)
SUBSTITUTE beats CONCATENATE here because you never have to double every quote in the template. Copy the result column into a plain-text editor, and add the file's header and footer from your exported template.
Pitfall: if a template cell contains line breaks, Excel wraps each copied cell in quotes. Keep the template on one line.
Script method
Any command-line scripting language works: PHP, Python, or whatever you have on the laptop. The pattern is the same. Read the CSV, loop over the rows, substitute into the template, and write one output file.
template = read("one_tag_template.xml") # single tag body, tokens in place
header, footer = read("header.xml"), read("footer.xml")
out = header
for row in csv_rows("clx_tags_filtered.csv"):
out += template.replace("{NAME}", row.name) \
.replace("{INSTANCE}", row.path) \
.replace("{DESC}", xml_escape(row.desc))
out += footer
write("import_1000_alarms.xml", out)
This runs in seconds and is repeatable. When the PLC programmer adds 40 more instances, rerun it.
Alternative: CSV for tags, UDT for alarms
If you prefer to stay with CSV, define an Ignition UDT with one parameterized BOOL member and configure the alarm once in the UDT definition. Every instance inherits it. You then only generate instances, each carrying a single parameter for the PLC instance name. Build those instances from an exported instance template the same way.
Verify Before You Hand It Over
- Count. The number of imported tags must equal the number of filtered Logix rows after array expansion.
- Quality. Every tag shows good quality. Sort by quality and look at the bottom of the list, not the top.
- Spot-check paths. Pick the first tag, the last tag, one program-scoped tag, and one array element. Compare each against the Logix tag monitor.
- Fire an alarm. With the process safe, toggle one alarm bit in the PLC. Confirm it goes active in the alarm status view with the right name and label, then clears.
- Move the test folder into the production tag tree only after steps 1–4 pass.
Avoid the Recurring Traps
- Don't build a template from memory. Always export from a working tag. Property names and structure differ between Ignition releases.
- Don't import over existing tags on the first pass. Collision handling can overwrite hand-tuned alarms.
- Logix descriptions are dirty data. They contain ampersands, commas, and line breaks. Sanitize them or leave them out.
- Re-export the Logix CSV after every PLC download that adds or renames instances. A stale CSV produces bad-quality tags, not an import error, so you won't get a warning.
FAQ
How do I import tags into Ignition from a ControlLogix CSV export?
Filter the Logix CSV to the rows you need and build Ignition's CSV tag columns in a spreadsheet. Model the name and OPC path on one tag you drag-dropped and confirmed. CSV import creates the tags but does not carry alarm configuration.
How do I add alarms to 1000 imported Ignition tags without editing each one?
Generate the structured import file from a single exported tag that already has its alarm configured, substituting only the name and path per row. Alternatively, put the alarm on a member of an Ignition UDT so every instance inherits it.
How do I find the bad line when an Ignition XML tag import fails?
Open the file in a browser or XML validator, which reports the first malformed line and column. The usual culprits are unescaped ampersands or angle brackets in descriptions copied from Logix, and cells pasted from Excel with added quotes.
When should I stop troubleshooting and contact support?
Escalate to Inductive Automation support when a validator-clean file generated from your own exported template still fails to import, or imports but drops properties. Escalate to Rockwell Automation support if the Logix CSV export omits or misreports AOI instances. Send the template, the generated file, and the gateway log entries from the import attempt.