Hello,
In order to understand my issue, I need to first explain to you my project.
The goal of the project is to collect and display production metrics over time. This needed to be standard for all equipment across the company while being easily deployable and easy to mass-edit. I did this by creating a single Perspective view which would display the data dynamically. The tag names are parameterized via view params, which then point to a UDT instance in my tags. The UDT instance contains approximately 15 tags that have tag change events tied to them, and that drives the collection of the data, for example, when a part is produced, the tag change script executes and records a part back to my sql server. This is a basic example, but there are several of these tag change event scripts to handle different types of data recording and updating.
The tag change event scripts can’t call project scripts directly due to scope issues, so I opted to use several message handlers inside of the project to handle this. This worked well at first, but as the project grew and was deployed to more and more equipment, the tag change event scripts started missing events due to long script execution.
My solution to this was to use a thread handler which my message handlers would hand off the events to, making my message handler scripts execute in sub 1ms times and the longer tasks get queued up in my thread pool. This solved the majority of my missed events issues. However, the project is ever growing and will need to grow still to be 10x the size it currently is, so I am in need of a better performing, more reliable way of doing this. Performance is important, but data accuracy is more important. With it missing events, I could be missing valuable production data.
I already added the below to my ignition.conf:
wrapper.java.additional.3=-Dignition.tags.scriptqueuemaxsize=20
wrapper.java.additional.4=-Dignition.tags.scriptthreads=16
Those java tunables made a big difference, but I wasn’t comfortable going higher than that, maybe I can though? I was hoping someone at inductive could weigh in on that. The gateway stays around 20% cpu usage, spiking to 45% at busy times. Memory is not an issue.
I’m out of ideas on how I can do this while maintaining the super simple deployment method. I have a script set to browse OPC devices for the UDT in the PLC, and when it finds it, it auto creates the ignition tags and then everything just works, no further setup required. This is an important requirement of the project, otherwise I would just use project scoped event scripts, which, as far as I can tell, are incapable of missing events somehow.
Thanks for any help, I’m open to all advice.