Hello Support Team,
I work with version 1.9.0 ANSI C Based UA SDK. I use modified lesson 2 example project against 3rd party server (Kepware). I have added one new item on server and I am able to read the item on client side.
New item details (client side):
createRequest[2].RequestedParameters.ClientHandle = 2;
createRequest[2].ItemToMonitor.AttributeId = OpcUa_Attributes_Value;
createRequest[2].ItemToMonitor.NodeId.NamespaceIndex = 2;
createRequest[2].ItemToMonitor.NodeId.IdentifierType = OpcUa_IdentifierType_String;
createRequest[2].ItemToMonitor.NodeId.Identifier.String.strContent = "Channel1.Device1.Tag01";
createRequest[2].ItemToMonitor.NodeId.Identifier.String.uLength = strlen("Channel1.Device1.Tag01");
I need to read this item cyclically also without value change therefore my intention turned into applying of Data Change Filter for this item. Firstly I tested my idea with UaExpert against server and Data Change Trigger setting Status/Value/Timestamp worked with expected behavior - item refreshed cyclically also without value change. Now I want to implement similar configuration into modified Lesson 2 code. After more attempts I am not able to achieve the goal. I understand that I should properly modify ExtensionObject Filter in createRequest[2].RequestedParameters.Filter.
Would it be possible to provide any sample code or description how to proceed ?
Thanks & Regards,
Roman
Client - data change filter on Monitored Item
Moderator: uasdkc
-
- Jr. Member
- Posts: 1
- Joined: 26 Jan 2020, 11:53
- Support Team
- Hero Member
- Posts: 3068
- Joined: 18 Mar 2011, 15:09
Re: Client - data change filter on Monitored Item
Dear Roman,
Here is sample code for setting a DataChange filter in the lesson 2 example in function SampleSubscription_CreateMonitoredItem.
The sample code is for setting a deadband value but you can also just set a different trigger and OpcUa_DeadbandType_None.
But you should be aware that the setting OpcUa_DataChangeTrigger_StatusValueTimestamp is NOT a cyclic delivery of values even without change. It only delivers a value if the ServerTimeStamp changed. This is normally not the case if the value did not change.
If a server is constantly updating the ServerTimeStamp, I would consider this as a bug or special behavior but you cannot expect this from other OPC UA servers.
Here is sample code for setting a DataChange filter in the lesson 2 example in function SampleSubscription_CreateMonitoredItem.
The sample code is for setting a deadband value but you can also just set a different trigger and OpcUa_DeadbandType_None.
Code: Select all
/* Sample code for creation of data change filter */
/* Trigger setting (default is StatusValue) */
/* Deadband setting is 0.1% of last value (Absolute) */
OpcUa_DataChangeFilter* pDataChangeFilter = NULL;
OpcUa_EncodeableObject_CreateExtension(
&OpcUa_DataChangeFilter_EncodeableType,
&createRequest[i].RequestedParameters.Filter,
(OpcUa_Void**)&pDataChangeFilter);
if (pDataChangeFilter)
{
pDataChangeFilter->DeadbandType = OpcUa_DeadbandType_Absolute;
pDataChangeFilter->DeadbandValue = 0.1;
pDataChangeFilter->Trigger = OpcUa_DataChangeTrigger_StatusValue;
}
If a server is constantly updating the ServerTimeStamp, I would consider this as a bug or special behavior but you cannot expect this from other OPC UA servers.
Best regards
Unified Automation Support Team
Unified Automation Support Team