I am having an occasional problem with a transaction group that mixes data from two different subscription updates.
The data (a series of process data for a specific machined part) is received by a custom OPC-UA driver that makes sure that all subscribed values are updated consecutive and consistent. The driver also updates a special trigger tag only after all other data tags.
My expectation was that the transaction group would log the data that was received by the last subscription update before the change of the trigger value. This works ok most of the time, but every few hours (logging rate is about 1 part per second) data from two consecutive parts is mixed. I also tried read instead of sucscribe mode, but with this setting the problem gets worse.
The following log shows an example from a test system running Ignition7.8.5. Sorry if it gets a bit complicated .
At timestamp 20:15:58,658 the trigger tag _MessageCount is updated by the driver.
At 20:15:58,678 the transaction group evaluates the trigger but still sees the old value
At 20:15:58,857 the ua client seems to receive the updated values
At 20:15:58,881 the transaction group evaluates the trigger with a new value. At this point i expected the value -6526 to be stored to the database for all tags. In this case, one of the values in the database contained the previous value -6527.
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [Subscription ] [20:15:58,657]: Subscription updating tag DATEN1/_Timestamp Value:value=1509650158447, status=StatusCode[Severity=Good, Subcode=NotSpecified], source=Thu Nov 02 20:15:58 CET 2017, server=null
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [Subscription ] [20:15:58,658]: Subscription updating tag DATEN1/_MessageCount Value:value=55802, status=StatusCode[Severity=Good, Subcode=NotSpecified], source=Thu Nov 02 20:15:58 CET 2017, server=null
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [Subscription ] [20:15:58,658]: Subscription updating tag DATEN1/Daten1 Value:value=-6526, status=StatusCode[Severity=Good, Subcode=NotSpecified], source=Thu Nov 02 20:15:58 CET 2017, server=Thu Nov 02 12:28:20 CET 2017
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [Subscription ] [20:15:58,658]: Subscription updating tag DATEN1/Array1[24] Value:value=-6526, status=StatusCode[Severity=Good, Subcode=NotSpecified], source=Thu Nov 02 20:15:58 CET 2017, server=Thu Nov 02 12:28:20 CET 2017
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [Subscription ] [20:15:58,658]: Subscription updating tag DATEN1/Array1[22] Value:value=-6526, status=StatusCode[Severity=Good, Subcode=NotSpecified], source=Thu Nov 02 20:15:58 CET 2017, server=Thu Nov 02 12:28:20 CET 2017
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [Subscription ] [20:15:58,658]: Subscription updating tag DATEN1/Array1[21] Value:value=-6526, status=StatusCode[Severity=Good, Subcode=NotSpecified], source=Thu Nov 02 20:15:58 CET 2017, server=Thu Nov 02 12:28:20 CET 2017
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [Subscription ] [20:15:58,658]: Subscription updating tag DATEN1/Array1[7] Value:value=-6526, status=StatusCode[Severity=Good, Subcode=NotSpecified], source=Thu Nov 02 20:15:58 CET 2017, server=Thu Nov 02 12:28:20 CET 2017
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [Subscription ] [20:15:58,658]: Subscription updating tag DATEN1/Array1[20] Value:value=-6526, status=StatusCode[Severity=Good, Subcode=NotSpecified], source=Thu Nov 02 20:15:58 CET 2017, server=Thu Nov 02 12:28:20 CET 2017
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [Subscription ] [20:15:58,658]: Subscription updating tag DATEN1/Array1[42] Value:value=-6526, status=StatusCode[Severity=Good, Subcode=NotSpecified], source=Thu Nov 02 20:15:58 CET 2017, server=Thu Nov 02 12:28:20 CET 2017
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [Subscription ] [20:15:58,658]: Subscription updating tag DATEN1/Array1[41] Value:value=-6526, status=StatusCode[Severity=Good, Subcode=NotSpecified], source=Thu Nov 02 20:15:58 CET 2017, server=Thu Nov 02 12:28:20 CET 2017
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [Subscription ] [20:15:58,658]: Subscription updating tag DATEN1/Array1[40] Value:value=-6526, status=StatusCode[Severity=Good, Subcode=NotSpecified], source=Thu Nov 02 20:15:58 CET 2017, server=Thu Nov 02 12:28:20 CET 2017
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [Subscription ] [20:15:58,658]: Subscription updating tag DATEN1/Array1[6] Value:value=-6526, status=StatusCode[Severity=Good, Subcode=NotSpecified], source=Thu Nov 02 20:15:58 CET 2017, server=Thu Nov 02 12:28:20 CET 2017
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [Subscription ] [20:15:58,658]: Subscription updating tag DATEN1/Array1[3] Value:value=-6526, status=StatusCode[Severity=Good, Subcode=NotSpecified], source=Thu Nov 02 20:15:58 CET 2017, server=Thu Nov 02 12:28:20 CET 2017
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [Subscription ] [20:15:58,658]: Subscription updating tag DATEN1/Array1[4] Value:value=-6526, status=StatusCode[Severity=Good, Subcode=NotSpecified], source=Thu Nov 02 20:15:58 CET 2017, server=Thu Nov 02 12:28:20 CET 2017
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [Subscription ] [20:15:58,658]: Subscription updating tag DATEN1/Array1[1] Value:value=-6526, status=StatusCode[Severity=Good, Subcode=NotSpecified], source=Thu Nov 02 20:15:58 CET 2017, server=Thu Nov 02 12:28:20 CET 2017
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [Subscription ] [20:15:58,658]: Subscription updating tag DATEN1/Array1[2] Value:value=-6526, status=StatusCode[Severity=Good, Subcode=NotSpecified], source=Thu Nov 02 20:15:58 CET 2017, server=Thu Nov 02 12:28:20 CET 2017
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [Subscription ] [20:15:58,658]: Subscription updating tag DATEN1/Array1[0] Value:value=-6526, status=StatusCode[Severity=Good, Subcode=NotSpecified], source=Thu Nov 02 20:15:58 CET 2017, server=Thu Nov 02 12:28:20 CET 2017
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [Subscription ] [20:15:58,658]: Subscription updating tag DATEN1/Daten2 Value:value=-6526, status=StatusCode[Severity=Good, Subcode=NotSpecified], source=Thu Nov 02 20:15:58 CET 2017, server=Thu Nov 02 12:28:20 CET 2017
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [Subscription ] [20:15:58,658]: Subscription updating tag DATEN1/_Timestamp Value:value=1509650158447, status=StatusCode[Severity=Good, Subcode=NotSpecified], source=Thu Nov 02 20:15:58 CET 2017, server=null
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [Subscription ] [20:15:58,658]: Subscription updating tag DATEN1/_MessageCount Value:value=55802, status=StatusCode[Severity=Good, Subcode=NotSpecified], source=Thu Nov 02 20:15:58 CET 2017, server=null
INFO | jvm 1 | 2017/11/02 20:15:58 | INFO [Daten2 ] [20:15:58,662]: Trigger did not evaluate - source item currently has bad quality [[0, Unknown, Thu Nov 02 12:28:20 CET 2017]].
INFO | jvm 1 | 2017/11/02 20:15:58 | DEBUG [Daten1 ] [20:15:58,678]: Trigger evaluated. Value: [55801, Good, Thu Nov 02 20:15:58 CET 2017], Active evaluation: false, Return value: false, First exec cancellation: false
INFO | jvm 1 | 2017/11/02 20:15:58 | DEBUG [Daten1 ] [20:15:58,768]: Historical forward transaction completed successfully.
INFO | jvm 1 | 2017/11/02 20:15:58 | DEBUG [OpcUaSubscriptionManager ] [20:15:58,856]: Received PublishResponse, sequenceNumber=55858
INFO | jvm 1 | 2017/11/02 20:15:58 | DEBUG [OpcUaSubscriptionManager ] [20:15:58,856]: Sending PublishRequest, requestHandle=67415, acknowledgements=[id=3/seq=55856, id=3/seq=55857]
INFO | jvm 1 | 2017/11/02 20:15:58 | DEBUG [OpcUaSubscriptionManager ] [20:15:58,856]: onPublishComplete() response for subscriptionId=3
INFO | jvm 1 | 2017/11/02 20:15:58 | DEBUG [OpcUaSubscriptionManager ] [20:15:58,856]: [id=3] PublishResponse sequence=55858, available sequences=[id=3/seq=55857, id=3/seq=55858]
INFO | jvm 1 | 2017/11/02 20:15:58 | DEBUG [OpcUaSubscriptionManager ] [20:15:58,857]: onNotificationMessage(), subscriptionId=3, sequenceNumber=55858, publishTime=DateTime{utcTime=131541237588560000, javaDate=Thu Nov 02 20:15:58 CET 2017}
INFO | jvm 1 | 2017/11/02 20:15:58 | DEBUG [OpcUaSubscriptionManager ] [20:15:58,857]: Received 18 MonitoredItemNotifications
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [OpcUaSubscriptionManager ] [20:15:58,857]: MonitoredItemNotification: clientHandle=31, value=DataValue{value=Variant{value=-6526}, status=StatusCode{name=Good, value=0x00000000, quality=good}, sourceTime=DateTime{utcTime=131541237584470000, javaDate=Thu Nov 02 20:15:58 CET 2017}, serverTime=DateTime{utcTime=131541237586570000, javaDate=Thu Nov 02 20:15:58 CET 2017}}
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [OpcUaSubscriptionManager ] [20:15:58,857]: MonitoredItemNotification: clientHandle=32, value=DataValue{value=Variant{value=-6526}, status=StatusCode{name=Good, value=0x00000000, quality=good}, sourceTime=DateTime{utcTime=131541237584470000, javaDate=Thu Nov 02 20:15:58 CET 2017}, serverTime=DateTime{utcTime=131541237586570000, javaDate=Thu Nov 02 20:15:58 CET 2017}}
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [OpcUaSubscriptionManager ] [20:15:58,857]: MonitoredItemNotification: clientHandle=33, value=DataValue{value=Variant{value=55802}, status=StatusCode{name=Good, value=0x00000000, quality=good}, sourceTime=DateTime{utcTime=131541237586530000, javaDate=Thu Nov 02 20:15:58 CET 2017}, serverTime=DateTime{utcTime=131541237586570000, javaDate=Thu Nov 02 20:15:58 CET 2017}}
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [OpcUaSubscriptionManager ] [20:15:58,857]: MonitoredItemNotification: clientHandle=34, value=DataValue{value=Variant{value=-6526}, status=StatusCode{name=Good, value=0x00000000, quality=good}, sourceTime=DateTime{utcTime=131541237584470000, javaDate=Thu Nov 02 20:15:58 CET 2017}, serverTime=DateTime{utcTime=131541237586570000, javaDate=Thu Nov 02 20:15:58 CET 2017}}
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [OpcUaSubscriptionManager ] [20:15:58,857]: MonitoredItemNotification: clientHandle=35, value=DataValue{value=Variant{value=-6526}, status=StatusCode{name=Good, value=0x00000000, quality=good}, sourceTime=DateTime{utcTime=131541237584470000, javaDate=Thu Nov 02 20:15:58 CET 2017}, serverTime=DateTime{utcTime=131541237586570000, javaDate=Thu Nov 02 20:15:58 CET 2017}}
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [OpcUaSubscriptionManager ] [20:15:58,857]: MonitoredItemNotification: clientHandle=36, value=DataValue{value=Variant{value=-6526}, status=StatusCode{name=Good, value=0x00000000, quality=good}, sourceTime=DateTime{utcTime=131541237584470000, javaDate=Thu Nov 02 20:15:58 CET 2017}, serverTime=DateTime{utcTime=131541237586570000, javaDate=Thu Nov 02 20:15:58 CET 2017}}
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [OpcUaSubscriptionManager ] [20:15:58,857]: MonitoredItemNotification: clientHandle=19, value=DataValue{value=Variant{value=-6526}, status=StatusCode{name=Good, value=0x00000000, quality=good}, sourceTime=DateTime{utcTime=131541237584470000, javaDate=Thu Nov 02 20:15:58 CET 2017}, serverTime=DateTime{utcTime=131541237586570000, javaDate=Thu Nov 02 20:15:58 CET 2017}}
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [OpcUaSubscriptionManager ] [20:15:58,857]: MonitoredItemNotification: clientHandle=20, value=DataValue{value=Variant{value=-6526}, status=StatusCode{name=Good, value=0x00000000, quality=good}, sourceTime=DateTime{utcTime=131541237584470000, javaDate=Thu Nov 02 20:15:58 CET 2017}, serverTime=DateTime{utcTime=131541237586570000, javaDate=Thu Nov 02 20:15:58 CET 2017}}
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [OpcUaSubscriptionManager ] [20:15:58,857]: MonitoredItemNotification: clientHandle=21, value=DataValue{value=Variant{value=-6526}, status=StatusCode{name=Good, value=0x00000000, quality=good}, sourceTime=DateTime{utcTime=131541237584470000, javaDate=Thu Nov 02 20:15:58 CET 2017}, serverTime=DateTime{utcTime=131541237586570000, javaDate=Thu Nov 02 20:15:58 CET 2017}}
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [OpcUaSubscriptionManager ] [20:15:58,857]: MonitoredItemNotification: clientHandle=22, value=DataValue{value=Variant{value=-6526}, status=StatusCode{name=Good, value=0x00000000, quality=good}, sourceTime=DateTime{utcTime=131541237584470000, javaDate=Thu Nov 02 20:15:58 CET 2017}, serverTime=DateTime{utcTime=131541237586570000, javaDate=Thu Nov 02 20:15:58 CET 2017}}
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [OpcUaSubscriptionManager ] [20:15:58,857]: MonitoredItemNotification: clientHandle=23, value=DataValue{value=Variant{value=-6526}, status=StatusCode{name=Good, value=0x00000000, quality=good}, sourceTime=DateTime{utcTime=131541237584470000, javaDate=Thu Nov 02 20:15:58 CET 2017}, serverTime=DateTime{utcTime=131541237586570000, javaDate=Thu Nov 02 20:15:58 CET 2017}}
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [OpcUaSubscriptionManager ] [20:15:58,857]: MonitoredItemNotification: clientHandle=24, value=DataValue{value=Variant{value=-6526}, status=StatusCode{name=Good, value=0x00000000, quality=good}, sourceTime=DateTime{utcTime=131541237584470000, javaDate=Thu Nov 02 20:15:58 CET 2017}, serverTime=DateTime{utcTime=131541237586570000, javaDate=Thu Nov 02 20:15:58 CET 2017}}
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [OpcUaSubscriptionManager ] [20:15:58,857]: MonitoredItemNotification: clientHandle=25, value=DataValue{value=Variant{value=-6526}, status=StatusCode{name=Good, value=0x00000000, quality=good}, sourceTime=DateTime{utcTime=131541237584470000, javaDate=Thu Nov 02 20:15:58 CET 2017}, serverTime=DateTime{utcTime=131541237586570000, javaDate=Thu Nov 02 20:15:58 CET 2017}}
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [OpcUaSubscriptionManager ] [20:15:58,857]: MonitoredItemNotification: clientHandle=26, value=DataValue{value=Variant{value=-6526}, status=StatusCode{name=Good, value=0x00000000, quality=good}, sourceTime=DateTime{utcTime=131541237584470000, javaDate=Thu Nov 02 20:15:58 CET 2017}, serverTime=DateTime{utcTime=131541237586570000, javaDate=Thu Nov 02 20:15:58 CET 2017}}
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [OpcUaSubscriptionManager ] [20:15:58,857]: MonitoredItemNotification: clientHandle=27, value=DataValue{value=Variant{value=-6526}, status=StatusCode{name=Good, value=0x00000000, quality=good}, sourceTime=DateTime{utcTime=131541237584470000, javaDate=Thu Nov 02 20:15:58 CET 2017}, serverTime=DateTime{utcTime=131541237586570000, javaDate=Thu Nov 02 20:15:58 CET 2017}}
INFO | jvm 1 | 2017/11/02 20:15:58 | DEBUG [+SubscriptionManager ] [20:15:58,880]: Notify global listeners of tag change: com.inductiveautomation.ignition.common.sqltags.model.event.TagChangeEvent@1aed18[tagPath=[__GROUP__]_MessageCount,prop=Value,indexes=<null>]
INFO | jvm 1 | 2017/11/02 20:15:58 | TRACE [Daten1 ] [20:15:58,881]: Trigger received subscription update: [55802, Good, Thu Nov 02 20:15:58 CET 2017]
INFO | jvm 1 | 2017/11/02 20:15:58 | DEBUG [Daten1 ] [20:15:58,881]: Trigger evaluated. Value: [55802, Good, Thu Nov 02 20:15:58 CET 2017], Active evaluation: true, Return value: true, First exec cancellation: false
Can somebody from IA please explain the internal timings of a triggered transaction group with OPC-UA subscriptions? Or maybe someone has a tip or a how to for logging consistent data from an OPC-UA server?