Changes on library script doesnt apply to running client instances

Hello to everyone,

I have an issue inside one of my projects. I have a project library script “TrkPanels_Dev” which has a method called "Update”. This is called by a client timer event every two seconds.

Whenever I change the TrkPanels_Dev.Update method and save, in order to update it on the running client instance, I need to logout or to close the instance. It seems a little strange to do all this work in order to change the library script at runtime.

I start to notice that inside the gateway, this message appears:

org.python.core.PySyntaxError: SyntaxError: mismatched input '\n\n' expecting INDENT (<<[Middleware] Update Script>>, line 4)

at org.python.core.ParserFacade.fixParseError(ParserFacade.java:95)

at org.python.core.ParserFacade.parse(ParserFacade.java:205)

at org.python.core.Py.compile_flags(Py.java:2269)

at com.inductiveautomation.ignition.common.script.ScriptManager.compileFunction(ScriptManager.java:899)

at com.inductiveautomation.ignition.gateway.project.ProjectScriptLifecycle$TrackingProjectScriptManager.compileFunctionSuper(ProjectScriptLifecycle.java:1124)

at com.inductiveautomation.ignition.gateway.project.ProjectScriptLifecycle$AutoRecompilingScriptFunction.getOrCreateDelegate(ProjectScriptLifecycle.java:1240)

at com.inductiveautomation.ignition.gateway.project.ProjectScriptLifecycle$AutoRecompilingScriptFunction.<init>(ProjectScriptLifecycle.java:1231)

at com.inductiveautomation.ignition.gateway.project.ProjectScriptLifecycle$TrackingProjectScriptManager.compileFunction(ProjectScriptLifecycle.java:1104)

at com.inductiveautomation.ignition.gateway.project.ProjectScriptLifecycle.lambda$getUpdateScriptContext$11(ProjectScriptLifecycle.java:603)

at com.inductiveautomation.ignition.gateway.project.ProjectScriptLifecycle.runUpdateScript(ProjectScriptLifecycle.java:697)

at com.inductiveautomation.ignition.gateway.project.ProjectScriptLifecycle.onAfterChanges(ProjectScriptLifecycle.java:1055)

at com.inductiveautomation.ignition.gateway.resourcecollection.ResourceCollectionLifecycle$LifecycleResourceListener.onAfterChanges(ResourceCollectionLifecycle.java:183)

at com.inductiveautomation.ignition.common.resourcecollection.AbstractResourceCollection.notifyListener(AbstractResourceCollection.java:386)

at com.inductiveautomation.ignition.common.resourcecollection.AbstractResourceCollection.notifyResourceListeners(AbstractResourceCollection.java:315)

at com.inductiveautomation.ignition.common.resourcecollection.AbstractResourceCollection.updateEffectiveState(AbstractResourceCollection.java:156)

at com.inductiveautomation.ignition.common.resourcecollection.RuntimeResourceCollection.applyChange(RuntimeResourceCollection.java:267)

at com.inductiveautomation.ignition.gateway.resourcecollection.ResourceCollectionLifecycleFactory$1.lambda$updateOrStartAffected$5(ResourceCollectionLifecycleFactory.java:210)

at java.base/java.util.ArrayList.forEach(Unknown Source)

at com.inductiveautomation.ignition.gateway.resourcecollection.ResourceCollectionLifecycleFactory$1.updateOrStartAffected(ResourceCollectionLifecycleFactory.java:190)

at com.inductiveautomation.ignition.gateway.resourcecollection.ResourceCollectionLifecycleFactory$1.collectionUpdated(ResourceCollectionLifecycleFactory.java:167)

at com.inductiveautomation.ignition.gateway.resourcecollection.ResourceCollectionManagerImpl.notifyCollectionChanged(ResourceCollectionManagerImpl.java:1627)

at com.inductiveautomation.ignition.gateway.resourcecollection.ResourceCollectionManagerImpl.lambda$fireCollectionChanged$31(ResourceCollectionManagerImpl.java:1606)

at com.inductiveautomation.ignition.gateway.resourcecollection.ResourceCollectionManagerImpl.lambda$submitToQueue$30(ResourceCollectionManagerImpl.java:1591)

at com.inductiveautomation.ignition.gateway.resourcecollection.ResourceCollectionManagerImpl.lambda$wrapNotificationTask$0(ResourceCollectionManagerImpl.java:205)

at com.inductiveautomation.ignition.common.util.ExecutionQueue$PollAndExecute.run(ExecutionQueue.java:238)

at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)

at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)

at java.base/java.lang.Thread.run(Unknown Source)

But I dont have script that have “Update Script” as name. I have tried also to delete unused script and now it seems fixed.

Some details about Ignition installed:

Gateway Version: 8.3.2 (b2025120210)
Running inside Hyper-V VM
OS Windows 11 Pro
1 Like

Does your project push updates out or require the client to update manually?

1 Like

This (and the stacktrace) are identifying the "Project Update" script configured in Gateway Events as the culprit.

I tried both the methods, event with Update Mode on Notify, it doesnt update.

Ok, I find that. I disabled it since I dont use it.

The issue still remains. Is there a function that flush the client cache? At this point it seems that the client is keeping an old copy of the client script.

Is your script running an infinite loop? Event scripts won't automatically be replaced on update if they are still running. (Event scripts should not use unbounded loops--they need to run to completion without waiting indefinitely for external signals.)

No, it collects data from PLC Tags and from a database to generate a dataset with information to populate a canvas template. For cycles ranges are defined.

I dont use while cycles inside and the result are written inside both gateway tags and client tags.

The fact is that the only way to stop the old script and to start with the new one is to disconnect the client session or to shutdown it.

1 Like

Perhaps it is time to get support involved. I'm stumped.

2 Likes