[quote="Colby.Clegg"]... I guess it's easier to look at than XML, which everyone seems to hate.
[/quote]
There are XML editors out there that have a table view.
No longer true. PanelView Plus Terminals export alarms tags in XML.
[quote="zxcslo"]What I'm doing is, that I export tags for alarms into xml file, then edit that file and copy paste the text for alarms from another source. Then import back that file to Ignition.
But I agree with you: it's time consuming.
What I would like to see is some kind of text editor inside Ignition, which will support importing alarm texts from another source in predefined structure...
It's simple text file...[/quote]
Which brings me to the point of this post. If it's all "simple text", why aren't we doing our own automation? I firmly believe that we (the community) have enough talent to roll out our own solutions to problem like this.
So, in the spirit of excellence and rugged individualism, I'll supply the first one. I'd even likely help supply others, if y'all want to work with me. 
This one pulls in information from a PV+ alarm export. I deliberately wrote it to work with only bit-type triggers (bits of a DINT), since that's all we really have here (no analog alarms). The resultant saved XML file may then be imported into any Ignition folder. The IALabs Scripting Module could have been used to create the tags directly, but creating the XML file gives a little more flexibility in where the import happens. 
Here's the code:
[code]import xml.etree.ElementTree as ET
originalDeviceName='[PLC]' #DeviceName set in the PV+
#Set OPC Sever and root path names
OPCServer='C489'
deviceName='[C489 Riveter]Global'
#Read in and parse the PV+ Alarms
readTree=ET.parse('c:\Alarms.xml')
readRoot=readTree.getroot()
Run through the PV+alarms
for topChild in readRoot:
for secondChild in topChild:
#Check to see which section we're in
if secondChild.tag=='triggers':
# Set up trigger dictionary. Defines relationships between trigger name set up in PV+ and the tag path.
triggerDict={}
for lastChild in secondChild:
if str(lastChild.attrib.get('type','None'))=='bit':
triggerElement=
triggerElement.append(str(lastChild.attrib.get('exp','None'))[1:-1].replace(originalDeviceName,deviceName+'.'))
triggerElement.append(str(lastChild.attrib.get('type','None')))
triggerID=str(lastChild.attrib.get('id','None'))
triggerDict[triggerID]=triggerElement
if secondChild.tag=='messages':
# Creates the Alarm List. Stores the tag path and the text of the alarm stores in the PV+
AlarmList=
for lastChild in secondChild:
trigger=triggerDict[lastChild.attrib.get('trigger','None')[1:]]
if trigger[1]=='bit':
bit=str(int(lastChild.attrib.get('trigger-value','None'))-1)
AlarmElement=
AlarmElement.append(trigger[0] + '.' + bit)
text=str(lastChild.attrib.get('text','None'))
if text.lower()=='spare':
text=trigger[0] + '.' + bit + ' Spare'
AlarmElement.append(text)
AlarmList.append(AlarmElement)
#Now that we have our alarm list, we can create our XML file for Ignition, complete with folder with alarms inside.
#Root
writeTree=ET.Element('Tags')
#Alarm Folder
alarmFolder=ET.SubElement(writeTree, 'Tag', {'name':'Alarms', 'path':'', 'type':'Folder'})
#Create a tag called '_Fault Enable'. I bind the enabled status of each alarm to this tag.
#That way, we don't accidentally trigger something upon import.
faultEnableTag=ET.SubElement(writeTree, 'Tag', {'name':'_Fault Enable', 'path':'Alarms', 'type':'DB'})
property=ET.SubElement(faultEnableTag, 'Property', {'name':'Value'})
property.text='false'
property=ET.SubElement(faultEnableTag, 'Property', {'name':'DataType'})
property.text='6'
#Create tag entries
for row in AlarmList:
#Set up tag name, type, path, etc.
tag=ET.SubElement(writeTree, 'Tag', {'name':row[1], 'path':'Alarms', 'type':'OPC'})
property=ET.SubElement(tag, 'Property', {'name':'Value'})
property.text='false'
property=ET.SubElement(tag, 'Property', {'name':'DataType'})
property.text='6'
property=ET.SubElement(tag, 'Property', {'name':'OPCServer'})
property.text=OPCServer
property=ET.SubElement(tag, 'Property', {'name':'OPCItemPath'})
property.text=row[0]
#Set up alarm properties
alarms=ET.SubElement(tag, 'Alarms')
alarm=ET.SubElement(alarms, 'Alarm',{'name':'Alarm 1'})
property=ET.SubElement(alarm, 'Property', {'name':'priority'})
property.text='1'
property=ET.SubElement(alarm, 'Property', {'name':'setpointA'})
property.text='1.0'
property=ET.SubElement(alarm, 'Property', {'name':'enabled', 'bindtype':'Tag'})
property.text='[.]_Fault Enable'
Prompt to save file.
path = system.file.saveFile(deviceName+".xml")
if path != None:
rough_string = ET.tostring(writeTree, 'utf-8')
system.file.writeFile(path,rough_string)
[/code]