Automation Professionals' Integration Toolkit Module

Phil, thanks for all the work you put into this module! I don't know how many times I've thought I will have to write a new utility function only to find that you already have!

One request on the documentation, can you add something indicating which version a function was added in? I keep finding myself a few versions behind and wondering why something isn't working only to discover I need to update.
Thanks again!

1 Like

Yeah, but maybe only going forward. (The version the docs correspond to is shown on the main page.)

OK I've got something I'm trying to do, and for the life of me, I can't get it to work even in the simplest form. Note... this is in Vision

I have an indirect binding on the template that will bring an integer from a tag based on a tag path passed. I'm trying to generate a list of tags that would be related according to the indirect number.

However, it seems that when the number is being provided to the template via indirect binding, things don't work as expected. If I remove the binding and just give it a static number then the dataset is created.

This is the expression that I'm using:

Expression
unionAll(
	asMap('baseTag','str','index','i'),
	forEach(
		{New Template.totalInstances},
		asList(concat('tagPathHere ',idx()),idx())
	)
)

When given a static number rather than indirect binding, this is what I get (expected)

Expected and Working result
"#NAMES"
"baseTag","index"
"#TYPES"
"str","I"
"#ROWS","2"
"tagPathHere 0","0"
"tagPathHere 1","1"

however, when changing the {New Template.totalInstances} property to an indirect binding, I get an exception:

Exception
java.lang.Exception: Error executing expression binding on
New Template.New Template.tagDataSet
	at com.inductiveautomation.factorypmi.application.binding.ExpressionPropertyAdapter.runExpression(ExpressionPropertyAdapter.java:92)
	at com.inductiveautomation.factorypmi.application.binding.ExpressionPropertyAdapter$1.run(ExpressionPropertyAdapter.java:59)
	at com.inductiveautomation.ignition.client.util.EDTUtil$ProcessQueue.run(EDTUtil.java:126)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.desktop/java.awt.EventQueue$4.run(Unknown Source)
	at java.desktop/java.awt.EventQueue$4.run(Unknown Source)
	at java.base/java.security.AccessController.doPrivileged(Unknown Source)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
	at java.desktop/java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.desktop/java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.lang.RuntimeException: Unable to handle rowSource #1
	at com.automation_pros.simaids.common.expressions.UnionAll.execute(UnionAll.java:121)
	at com.inductiveautomation.ignition.client.expressions.ClientDynamicDispatchFunction.execute(ClientDynamicDispatchFunction.java:43)
	at com.inductiveautomation.ignition.common.expressions.FunctionExpression.execute(FunctionExpression.java:69)
	at com.inductiveautomation.factorypmi.application.binding.ExpressionPropertyAdapter.runExpression(ExpressionPropertyAdapter.java:83)
	... 15 more
Caused by: java.lang.NullPointerException: Cannot invoke "Object.getClass()" because "value" is null
	at com.automation_pros.simaids.common.expressions.UnionAll.buildWith(UnionAll.java:174)
	at com.automation_pros.simaids.common.expressions.UnionAll.execute(UnionAll.java:117)
	... 18 more

Ignition v8.1.38 (b2024030513)
Java: Azul Systems, Inc. 17.0.9

Any ideas? I'm probably missing something fairly basic on this...

Need more coffee. PLC was offline... sigh.

8 Likes

The number of times.....

You are not alone friend.

5 Likes

The embarrassing part, is that it is our internal development PLC. And it is sitting on my desk... right next to me.

15 Likes

Heh. Get busy with something, come back to the forum, and questions for me solve themselves. :grin:

11 Likes

Phil,

I'm back with another similar issue. I can not figure out why this expression is returning <No Data>. I've been staring at it for a couple of hours trying to get it to work with no success so, time to ask for another more knowledgeable set of eyes.

I have some custom properties on a power table in Vision, their current status looks like this:

This is the binding on summedData:

summedData binding
orderBy(
	selectStar(
		{Root Container.Processing Group.processingMinsTable.pivotedData},
		asMap('Last 8','D','Last 24', 'D'),
		asMap(
			transform(
				groupBy(
					{Root Container.Processing Group.processingMinsTable.last8HistoricalData},
					split(it()['path'],'_')[0]
				),
				forEach(
					value(),
					asList(
						case(
							it()[0],
							'productlevel','No Product',
							'caps','No Caps',
							'empty','No Bottles',
							'Packaging'
						),
						round(sum(it()[1],'value') / 60.0, 1)
					)
				)
			)
		)[it()['Occurrence']],
		asMap(
			transform(
				groupBy(
					{Root Container.Processing Group.processingMinsTable.historicalData},
					split(it()['path'],'_')[0]
				),
				forEach(
					value(),
					asList(
						case(
							it()[0],
							'productlevel','No Product',
							'caps','No Caps',
							'empty','No Bottles',
							'Packaging'
						),
						round(sum(it()[1],'value') / 60.0, 1)
					)
				)
			)
		)[it()['Occurrence']],
		asMap(
			'No Bottles', 6,
			'No Caps', 4,
			'No Product', 1,
			'Packaging', 5
		)[it()['Occurrence']]
	),
	it()['Occurrence']
)

Here is sample data that can be used for the other three properties:

historicalData
"#NAMES"
"path","value","quality","timestamp"
"#TYPES"
"str","L","I","date"
"#ROWS","120"
"productlevel_at_sp","3600","192","2025-01-12 15:00:00.000"
"cap_supply","3600","192","2025-01-12 15:00:00.000"
"downstream_stop_request","3600","192","2025-01-12 15:00:00.000"
"empty_bottles_present","0","200","2025-01-12 15:00:00.000"
"empty_bottles_primied","0","192","2025-01-12 15:00:00.000"
"productlevel_at_sp","3600","192","2025-01-12 16:00:00.000"
"cap_supply","3600","192","2025-01-12 16:00:00.000"
"downstream_stop_request","3600","192","2025-01-12 16:00:00.000"
"empty_bottles_present","0","200","2025-01-12 16:00:00.000"
"empty_bottles_primied","0","192","2025-01-12 16:00:00.000"
"productlevel_at_sp","3600","192","2025-01-12 17:00:00.000"
"cap_supply","3600","192","2025-01-12 17:00:00.000"
"downstream_stop_request","3600","192","2025-01-12 17:00:00.000"
"empty_bottles_present","0","200","2025-01-12 17:00:00.000"
"empty_bottles_primied","0","192","2025-01-12 17:00:00.000"
"productlevel_at_sp","3600","192","2025-01-12 18:00:00.000"
"cap_supply","3600","192","2025-01-12 18:00:00.000"
"downstream_stop_request","3600","192","2025-01-12 18:00:00.000"
"empty_bottles_present","0","200","2025-01-12 18:00:00.000"
"empty_bottles_primied","0","192","2025-01-12 18:00:00.000"
"productlevel_at_sp","3600","192","2025-01-12 19:00:00.000"
"cap_supply","3600","192","2025-01-12 19:00:00.000"
"downstream_stop_request","3600","192","2025-01-12 19:00:00.000"
"empty_bottles_present","0","200","2025-01-12 19:00:00.000"
"empty_bottles_primied","0","192","2025-01-12 19:00:00.000"
"productlevel_at_sp","3600","192","2025-01-12 20:00:00.000"
"cap_supply","3600","192","2025-01-12 20:00:00.000"
"downstream_stop_request","3600","192","2025-01-12 20:00:00.000"
"empty_bottles_present","0","200","2025-01-12 20:00:00.000"
"empty_bottles_primied","0","192","2025-01-12 20:00:00.000"
"productlevel_at_sp","3600","192","2025-01-12 21:00:00.000"
"cap_supply","3600","192","2025-01-12 21:00:00.000"
"downstream_stop_request","3600","192","2025-01-12 21:00:00.000"
"empty_bottles_present","0","200","2025-01-12 21:00:00.000"
"empty_bottles_primied","0","192","2025-01-12 21:00:00.000"
"productlevel_at_sp","3132","192","2025-01-12 22:00:00.000"
"cap_supply","3600","192","2025-01-12 22:00:00.000"
"downstream_stop_request","3600","192","2025-01-12 22:00:00.000"
"empty_bottles_present","0","200","2025-01-12 22:00:00.000"
"empty_bottles_primied","0","192","2025-01-12 22:00:00.000"
"productlevel_at_sp","282","192","2025-01-12 23:00:00.000"
"cap_supply","889","192","2025-01-12 23:00:00.000"
"downstream_stop_request","1384","192","2025-01-12 23:00:00.000"
"empty_bottles_present","0","200","2025-01-12 23:00:00.000"
"empty_bottles_primied","180","192","2025-01-12 23:00:00.000"
"productlevel_at_sp","605","192","2025-01-13 00:00:00.000"
"cap_supply","0","192","2025-01-13 00:00:00.000"
"downstream_stop_request","1372","192","2025-01-13 00:00:00.000"
"empty_bottles_present","0","200","2025-01-13 00:00:00.000"
"empty_bottles_primied","0","192","2025-01-13 00:00:00.000"
"productlevel_at_sp","304","192","2025-01-13 01:00:00.000"
"cap_supply","7","192","2025-01-13 01:00:00.000"
"downstream_stop_request","0","192","2025-01-13 01:00:00.000"
"empty_bottles_present","0","200","2025-01-13 01:00:00.000"
"empty_bottles_primied","0","192","2025-01-13 01:00:00.000"
"productlevel_at_sp","0","192","2025-01-13 02:00:00.000"
"cap_supply","0","192","2025-01-13 02:00:00.000"
"downstream_stop_request","0","192","2025-01-13 02:00:00.000"
"empty_bottles_present","0","200","2025-01-13 02:00:00.000"
"empty_bottles_primied","0","192","2025-01-13 02:00:00.000"
"productlevel_at_sp","0","192","2025-01-13 03:00:00.000"
"cap_supply","0","192","2025-01-13 03:00:00.000"
"downstream_stop_request","0","192","2025-01-13 03:00:00.000"
"empty_bottles_present","0","200","2025-01-13 03:00:00.000"
"empty_bottles_primied","0","192","2025-01-13 03:00:00.000"
"productlevel_at_sp","0","192","2025-01-13 04:00:00.000"
"cap_supply","0","192","2025-01-13 04:00:00.000"
"downstream_stop_request","0","192","2025-01-13 04:00:00.000"
"empty_bottles_present","0","200","2025-01-13 04:00:00.000"
"empty_bottles_primied","0","192","2025-01-13 04:00:00.000"
"productlevel_at_sp","1141","192","2025-01-13 05:00:00.000"
"cap_supply","0","192","2025-01-13 05:00:00.000"
"downstream_stop_request","0","192","2025-01-13 05:00:00.000"
"empty_bottles_present","0","200","2025-01-13 05:00:00.000"
"empty_bottles_primied","0","192","2025-01-13 05:00:00.000"
"productlevel_at_sp","3280","192","2025-01-13 06:00:00.000"
"cap_supply","0","192","2025-01-13 06:00:00.000"
"downstream_stop_request","0","192","2025-01-13 06:00:00.000"
"empty_bottles_present","0","200","2025-01-13 06:00:00.000"
"empty_bottles_primied","0","192","2025-01-13 06:00:00.000"
"productlevel_at_sp","3464","192","2025-01-13 07:00:00.000"
"cap_supply","0","192","2025-01-13 07:00:00.000"
"downstream_stop_request","0","192","2025-01-13 07:00:00.000"
"empty_bottles_present","0","200","2025-01-13 07:00:00.000"
"empty_bottles_primied","0","192","2025-01-13 07:00:00.000"
"productlevel_at_sp","1640","192","2025-01-13 08:00:00.000"
"cap_supply","0","192","2025-01-13 08:00:00.000"
"downstream_stop_request","565","192","2025-01-13 08:00:00.000"
"empty_bottles_present","0","200","2025-01-13 08:00:00.000"
"empty_bottles_primied","0","192","2025-01-13 08:00:00.000"
"productlevel_at_sp","229","200","2025-01-13 09:00:00.000"
"cap_supply","0","192","2025-01-13 09:00:00.000"
"downstream_stop_request","907","192","2025-01-13 09:00:00.000"
"empty_bottles_present","0","200","2025-01-13 09:00:00.000"
"empty_bottles_primied","348","192","2025-01-13 09:00:00.000"
"productlevel_at_sp","0","200","2025-01-13 10:00:00.000"
"cap_supply","761","200","2025-01-13 10:00:00.000"
"downstream_stop_request","611","192","2025-01-13 10:00:00.000"
"empty_bottles_present","0","200","2025-01-13 10:00:00.000"
"empty_bottles_primied","58","192","2025-01-13 10:00:00.000"
"productlevel_at_sp","0","200","2025-01-13 11:00:00.000"
"cap_supply","0","200","2025-01-13 11:00:00.000"
"downstream_stop_request","468","192","2025-01-13 11:00:00.000"
"empty_bottles_present","0","200","2025-01-13 11:00:00.000"
"empty_bottles_primied","155","192","2025-01-13 11:00:00.000"
"productlevel_at_sp","0","200","2025-01-13 12:00:00.000"
"cap_supply","0","200","2025-01-13 12:00:00.000"
"downstream_stop_request","0","192","2025-01-13 12:00:00.000"
"empty_bottles_present","0","200","2025-01-13 12:00:00.000"
"empty_bottles_primied","101","192","2025-01-13 12:00:00.000"
"productlevel_at_sp","0","200","2025-01-13 13:00:00.000"
"cap_supply","0","200","2025-01-13 13:00:00.000"
"downstream_stop_request","515","200","2025-01-13 13:00:00.000"
"empty_bottles_present","0","200","2025-01-13 13:00:00.000"
"empty_bottles_primied","151","200","2025-01-13 13:00:00.000"
"productlevel_at_sp","0","200","2025-01-13 14:00:00.000"
"cap_supply","0","200","2025-01-13 14:00:00.000"
"downstream_stop_request","0","200","2025-01-13 14:00:00.000"
"empty_bottles_present","0","200","2025-01-13 14:00:00.000"
"empty_bottles_primied","0","200","2025-01-13 14:00:00.000"
last8historicalData
"#NAMES"
"path","value","quality","timestamp"
"#TYPES"
"str","L","I","date"
"#ROWS","40"
"productlevel_at_sp","3464","192","2025-01-13 07:00:00.000"
"cap_supply","0","192","2025-01-13 07:00:00.000"
"downstream_stop_request","0","192","2025-01-13 07:00:00.000"
"empty_bottles_present","0","200","2025-01-13 07:00:00.000"
"empty_bottles_primied","0","192","2025-01-13 07:00:00.000"
"productlevel_at_sp","1640","192","2025-01-13 08:00:00.000"
"cap_supply","0","192","2025-01-13 08:00:00.000"
"downstream_stop_request","565","192","2025-01-13 08:00:00.000"
"empty_bottles_present","0","200","2025-01-13 08:00:00.000"
"empty_bottles_primied","0","192","2025-01-13 08:00:00.000"
"productlevel_at_sp","229","200","2025-01-13 09:00:00.000"
"cap_supply","0","192","2025-01-13 09:00:00.000"
"downstream_stop_request","907","192","2025-01-13 09:00:00.000"
"empty_bottles_present","0","200","2025-01-13 09:00:00.000"
"empty_bottles_primied","348","192","2025-01-13 09:00:00.000"
"productlevel_at_sp","0","200","2025-01-13 10:00:00.000"
"cap_supply","761","200","2025-01-13 10:00:00.000"
"downstream_stop_request","611","192","2025-01-13 10:00:00.000"
"empty_bottles_present","0","200","2025-01-13 10:00:00.000"
"empty_bottles_primied","58","192","2025-01-13 10:00:00.000"
"productlevel_at_sp","0","200","2025-01-13 11:00:00.000"
"cap_supply","0","200","2025-01-13 11:00:00.000"
"downstream_stop_request","468","192","2025-01-13 11:00:00.000"
"empty_bottles_present","0","200","2025-01-13 11:00:00.000"
"empty_bottles_primied","155","192","2025-01-13 11:00:00.000"
"productlevel_at_sp","0","200","2025-01-13 12:00:00.000"
"cap_supply","0","200","2025-01-13 12:00:00.000"
"downstream_stop_request","0","192","2025-01-13 12:00:00.000"
"empty_bottles_present","0","200","2025-01-13 12:00:00.000"
"empty_bottles_primied","101","192","2025-01-13 12:00:00.000"
"productlevel_at_sp","0","200","2025-01-13 13:00:00.000"
"cap_supply","0","200","2025-01-13 13:00:00.000"
"downstream_stop_request","515","200","2025-01-13 13:00:00.000"
"empty_bottles_present","0","200","2025-01-13 13:00:00.000"
"empty_bottles_primied","151","200","2025-01-13 13:00:00.000"
"productlevel_at_sp","0","200","2025-01-13 14:00:00.000"
"cap_supply","0","200","2025-01-13 14:00:00.000"
"downstream_stop_request","0","200","2025-01-13 14:00:00.000"
"empty_bottles_present","0","200","2025-01-13 14:00:00.000"
"empty_bottles_primied","0","200","2025-01-13 14:00:00.000"
pivotedData
"#NAMES"
"Occurrence","_7A","_8A","_9A","_10A","_11A","_12P","_1P","_2P","_3P","_4P","_5P","_6P","_7P","_8P","_9P","_10P","_11P","_12A","_1A","_2A","_3A","_4A","_5A","_6A"
"#TYPES"
"str","I","I","I","I","I","I","I","I","I","I","I","I","I","I","I","I","I","I","I","I","I","I","I","I"
"#ROWS","4"
"No Product","0","0","0","0","7","0","0","0","0","0","0","0","0","0","45","42","43","4","0","0","0","0","0","0"
"Packaging","6","10","14","6","1","6","12","0","0","0","0","0","0","0","0","0","0","0","11","17","13","20","22","9"
"No Bottles","0","0","4","0","0","0","1","0","0","0","0","0","0","0","45","41","0","0","0","0","0","0","0","0"
"No Caps","2","1","0","2","0","0","1","60","60","60","60","60","60","60","60","60","60","11","0","0","0","0","0","2"

I have a nearly identical binding working on another table on the same window. The only differences being that there are only two columns added, they're of type double, and the sum is not divided by 60.0 to convert to mins

The only error I get is from a binding, where a columnsOf() expression is complaining that this dataset is null, which of course it is, for whatever reason.

Any assistance is appreciated.

Consider moving the two transforms into a single transform before the orderBy(), yielding value()[0] and value()[1], so that the grouping hard work only occurs once. Perhaps add a Document property to the window so that you can see those intermediate values.

{ I don't immediately see the problem, and cannot spend much time on this at the moment. }

1 Like

Phil,

I started this over again today, and for whatever reason, it decided it was going to work.

I believe there is some minor bug that has to do with Vision, but I am having trouble making something that reliably replicates the issue.

If I manage to figure out what is happening I'll be sure to let you know my finding.

Thanks for your help.

2 Likes

Hey Phil,

How do I use view(), or any of your custom tools?

Have you looked at the documents:

Yes... I tried system.dataset.view() and view(). I checked system.db as well.

Are you able to post your code or attempts at code, along with example data and what you want your data to look like? What error(s) are you getting?

Dataset from Query:

"#NAMES"
"MenuID","MenuName","DisplayName","DisplayOrder","ParentMenu","MenuNumber"
"#TYPES"
"I","str","str","I","I","I"
"#ROWS","3"
"1","Dashboards","Dashboards","1","0","1"
"2","PartsInventory","Parts Inventory","2","0","2"
"3","Ordering","Ordering","3","0","3"

Transform on query binding:

def transform(self, value, quality, timestamp):
	output = view('Select min(MenuID) As FirstMenu',value)
	return output

Error: global name 'view' is not defined

output = system.dataset.view('Select min(MenuID) As FirstMenu',value)
Error: object has no attribute 'view'

view() is for an expression not scripting. Change the transform to an expression type.

1 Like

@dkhayes117 They also tried system.dataset.view and got an error.

@mdemaris
Double check the status of the module on the gateway page. Did you restart the gateway after installing the module? If you did not, it might need a restart.

Edit: only view exists, system.dataset.view does not.

however, you don't need the view() expression, you can just use the min() expression.
min | Ignition User Manual

1 Like

:man_facepalming:

1 Like

It is also worth noting that everything that view() can do (except pivots) can now be done more efficiently with combinations of unionAll(), selectStar(), where(), orderBy(), and groupBy(). They run a lot faster because they do not rely on jython under the hood.

3 Likes

On Ignition 8.1.24, we recently upgraded Simulation Aids to Integration toolkit and lost some window functionality in Vision (both in Designer and in clients). There have been no changes made to these Vision components, neither before or after the module upgrade.
The errors seem related to the Transient Dataset function, and I cannot find a way to edit the windows that won't launch because they, well...won't launch. I've traced through some of our designer scripts (both shared and project), but haven't found the link yet to this Transient Dataset function, so my impression is that the scripting issue is within the window itself and not a project script. Other Vision windows launch just fine within the same projects.
Is this something we'd need to roll back to some prior version of SimAids, edit, and then roll forward into Integration Toolkit to fix?

Error
com.inductiveautomation.ignition.common.xmlserialization.SerializationException: Unexpected parsing error during binary deserialization.
	at com.inductiveautomation.ignition.common.xmlserialization.deserialization.XMLDeserializer.deserializeBinary(XMLDeserializer.java:367)
	at com.inductiveautomation.ignition.common.xmlserialization.deserialization.XMLDeserializer.deserialize(XMLDeserializer.java:268)
	at com.inductiveautomation.factorypmi.application.model.WindowCache._deserializeWindow(WindowCache.java:382)
	at com.inductiveautomation.factorypmi.application.model.WindowCache._loadWindow(WindowCache.java:325)
	at com.inductiveautomation.factorypmi.application.model.WindowCache.openWindow(WindowCache.java:299)
	at com.inductiveautomation.factorypmi.designer.workspace.WindowWorkspace$DesigntimeWindowOpener.openWindow(WindowWorkspace.java:3778)
	at com.inductiveautomation.factorypmi.designer.workspace.WindowWorkspace.openWindow(WindowWorkspace.java:1520)
	at com.inductiveautomation.factorypmi.designer.model.navtree.WindowNode.open(WindowNode.java:260)
	at com.inductiveautomation.ignition.designer.navtree.model.AbstractResourceNavTreeNode.onDoubleClick(AbstractResourceNavTreeNode.java:407)
	at com.inductiveautomation.ignition.designer.navtree.NavTreePanel$MouseListener.lambda$mousePressed$0(NavTreePanel.java:698)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.desktop/java.awt.EventQueue$4.run(Unknown Source)
	at java.desktop/java.awt.EventQueue$4.run(Unknown Source)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
	at java.desktop/java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.desktop/java.awt.EventDispatchThread.run(Unknown Source)
Caused by: org.apache.commons.io.IOExceptionWithCause: java.lang.ClassNotFoundException: com.automation_pros.simaids.TransientDataset
	at com.inductiveautomation.ignition.common.xmlserialization.encoding.Decoders$ClassDecoder.getClassForName(Decoders.java:386)
	at com.inductiveautomation.ignition.common.xmlserialization.encoding.Decoders$ClassDecoder.binaryToObject(Decoders.java:400)
	at com.inductiveautomation.ignition.common.xmlserialization.encoding.Decoders$ClassDecoder.binaryToObject(Decoders.java:359)
	at com.inductiveautomation.ignition.common.xmlserialization.deserialization.BinaryParser.readAttributes(BinaryParser.java:179)
	at com.inductiveautomation.ignition.common.xmlserialization.deserialization.BinaryParser.readElement(BinaryParser.java:148)
	at com.inductiveautomation.ignition.common.xmlserialization.deserialization.BinaryParser.readElement(BinaryParser.java:157)
	at com.inductiveautomation.ignition.common.xmlserialization.deserialization.BinaryParser.readElement(BinaryParser.java:157)
	at com.inductiveautomation.ignition.common.xmlserialization.deserialization.BinaryParser.readElement(BinaryParser.java:157)
	at com.inductiveautomation.ignition.common.xmlserialization.deserialization.BinaryParser.readElement(BinaryParser.java:157)
	at com.inductiveautomation.ignition.common.xmlserialization.deserialization.BinaryParser.readElement(BinaryParser.java:157)
	at com.inductiveautomation.ignition.common.xmlserialization.deserialization.BinaryParser.readElement(BinaryParser.java:157)
	at com.inductiveautomation.ignition.common.xmlserialization.deserialization.BinaryParser.readElement(BinaryParser.java:157)
	at com.inductiveautomation.ignition.common.xmlserialization.deserialization.BinaryParser.readElement(BinaryParser.java:157)
	at com.inductiveautomation.ignition.common.xmlserialization.deserialization.BinaryParser.readElement(BinaryParser.java:157)
	at com.inductiveautomation.ignition.common.xmlserialization.deserialization.BinaryParser.readElement(BinaryParser.java:157)
	at com.inductiveautomation.ignition.common.xmlserialization.deserialization.BinaryParser.readElement(BinaryParser.java:157)
	at com.inductiveautomation.ignition.common.xmlserialization.deserialization.BinaryParser.parse(BinaryParser.java:51)
	at com.inductiveautomation.ignition.common.xmlserialization.deserialization.XMLDeserializer.deserializeBinary(XMLDeserializer.java:358)
	... 22 more
Caused by: java.lang.ClassNotFoundException: com.automation_pros.simaids.TransientDataset
	at java.base/java.net.URLClassLoader.findClass(Unknown Source)
	at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
	at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
	at java.base/java.lang.Class.forName0(Native Method)
	at java.base/java.lang.Class.forName(Unknown Source)
	at com.inductiveautomation.ignition.common.xmlserialization.ClassNameResolver.classForNameImpl(ClassNameResolver.java:196)
	at com.inductiveautomation.ignition.common.xmlserialization.ClassNameResolver.classForName(ClassNameResolver.java:169)
	at com.inductiveautomation.ignition.common.xmlserialization.encoding.Decoders$ClassDecoder.getClassForName(Decoders.java:376)
	... 39 more

Ignition v8.1.24 (b2023011208)
Java: Azul Systems, Inc. 11.0.16.1