Enumeration of BACnet MultiState Points

Hi,
I'm building UDTs for our sites that have Siemens PXC BACnet controllers on them. One datatype we have is a fair few MultiStateValue points. The driver currently lets me pull out ALMOST everything (current value, alarm state, priority array etc. etc.) however there is no path to the state_text which has the controller enumeration of each state value:

All the examples of MultiState points I can find online on Bacnet BMS devices show State_Text as being the location of the enumeration. Ignition has a reference to Present_Value.EnumStrings which on everything I have here on site returns a Null:

To work around this at the moment I have added a dataset within my UDT for the enumeration mapping, but this is a manual step to fill in the data. it would be preferable to have it access the actual enumerations in the controller at runtime (just in case something changes in the field), can this state_text be configured to be available in the BACnet driver or am I missing an obvious way to access this??

Happy to help test if needed!
(Running 8.1.25)

1 Like

Workaround found using system.bacnet.readRaw():

I have a subtag called PointState in this UDT that holds the Present_Value integer.
In the onchange script I have used system.bacnet.readRaw() to read the State_text object and put it in to my array in the UDT sub tag (text array) called StateEnum

	sController=tag['parameters']['ControllerName']
	iObjectID=int(tag['parameters']['PointNumber'])

	iObjectType=system.bacnet.enumerated.ObjectType.multiStateValue
	StateText=system.bacnet.enumerated.PropertyIdentifier.stateText
	
	#enumerate the state						
	arrayStateText=system.bacnet.readRaw(sController, iObjectType, iObjectID, StateText)

	arrayList=[]
	for line in arrayStateText:
		arrayList.append(line)

	if arrayList:
		system.tag.write("[.]StateEnum",arrayList)

As I run this without checking if it's an initial change it propagates as soon as the tag is refreshed and also any time the pointstate changes.

I also do this with PriorityArray values and using bacnet.writeRaw as bacnet.writeWithPriority does not work on my multistate values if I need to set the Priority Array from 8 back to 14 (placing tag value back in to auto):

#Unset Priority Array (Place in to Default mode)|
system.bacnet.writeRaw(sController,iObjectType,iObjectID,ipresentValue,None,8)|

Hope this helps somebody someday!

3 Likes