/// <summary> /// Atempt to Decode dataset /// </summary> /// <returns></returns> public void DecodePossibleDataSetReader(BinaryDecoder binaryDecoder, DataSetReaderDataType dataSetReader) { UadpDataSetReaderMessageDataType messageSettings = ExtensionObject.ToEncodeable(dataSetReader.MessageSettings) as UadpDataSetReaderMessageDataType; if (messageSettings != null) { //StartPositionInStream is calculated but different from reader configuration dataset cannot be decoded if (StartPositionInStream != messageSettings.DataSetOffset) { if (StartPositionInStream == 0) { //use configured offset from reader StartPositionInStream = messageSettings.DataSetOffset; } else if (messageSettings.DataSetOffset != 0) { //configuration is different from real position in message, the dataset cannot be decoded return; } } else { StartPositionInStream = (int)(binaryDecoder.BaseStream.Position); } } if (binaryDecoder.BaseStream.Length <= StartPositionInStream) { return; } binaryDecoder.BaseStream.Position = StartPositionInStream; DecodeDataSetMessageHeader(binaryDecoder); DataSet = DecodeFieldMessageData(binaryDecoder, dataSetReader); }
/// <summary> /// Atempt to Decode dataset /// </summary> /// <returns></returns> public void DecodePossibleDataSetReader(BinaryDecoder binaryDecoder, DataSetReaderDataType dataSetReader) { UadpDataSetReaderMessageDataType messageSettings = ExtensionObject.ToEncodeable(dataSetReader.MessageSettings) as UadpDataSetReaderMessageDataType; if (messageSettings != null) { //StartPositionInStream is calculated but different from reader configuration dataset cannot be decoded if (StartPositionInStream != messageSettings.DataSetOffset) { if (StartPositionInStream == 0) { //use configured offset from reader StartPositionInStream = messageSettings.DataSetOffset; } else if (messageSettings.DataSetOffset != 0) { //configuration is different from real position in message, the dataset cannot be decoded return; } } else { StartPositionInStream = (int)(binaryDecoder.BaseStream.Position); } } if (binaryDecoder.BaseStream.Length <= StartPositionInStream) { return; } binaryDecoder.BaseStream.Position = StartPositionInStream; DecodeDataSetMessageHeader(binaryDecoder); DecodeErrorReason = ValidateMetadataVersion(dataSetReader.DataSetMetaData.ConfigurationVersion); if (!IsMetadataMajorVersionChange) { if ((DataSetFlags2 & DataSetFlags2EncodingMask.DataDeltaFrame) == DataSetFlags2EncodingMask.DataDeltaFrame) { DataSet = DecodeMessageDataDeltaFrame(binaryDecoder, dataSetReader); } else { DataSet = DecodeMessageDataKeyFrame(binaryDecoder, dataSetReader); } } }
/// <summary> /// Creates a PubSubConfiguration object programmatically. /// </summary> /// <returns></returns> public static PubSubConfigurationDataType CreateSubscriberConfiguration() { // Define a PubSub connection with PublisherId 100 PubSubConnectionDataType pubSubConnection1 = new PubSubConnectionDataType(); pubSubConnection1.Name = "UADPConnection1"; pubSubConnection1.Enabled = true; pubSubConnection1.PublisherId = (UInt16)100; pubSubConnection1.TransportProfileUri = Profiles.UadpTransport; NetworkAddressUrlDataType address = new NetworkAddressUrlDataType(); // Specify the local Network interface name to be used // e.g. address.NetworkInterface = "Ethernet"; // Leave empty to subscribe on all available local interfaces. address.NetworkInterface = String.Empty; address.Url = "opc.udp://239.0.0.1:4840"; pubSubConnection1.Address = new ExtensionObject(address); #region Define 'Simple' MetaData DataSetMetaDataType simpleMetaData = new DataSetMetaDataType(); simpleMetaData.DataSetClassId = new Uuid(Guid.Empty); simpleMetaData.Name = "Simple"; simpleMetaData.Fields = new FieldMetaDataCollection() { new FieldMetaData() { Name = "BoolToggle", DataSetFieldId = new Uuid(Guid.NewGuid()), BuiltInType = (byte)DataTypes.Boolean, DataType = DataTypeIds.Boolean, ValueRank = ValueRanks.Scalar }, new FieldMetaData() { Name = "Int32", DataSetFieldId = new Uuid(Guid.NewGuid()), BuiltInType = (byte)DataTypes.Int32, DataType = DataTypeIds.Int32, ValueRank = ValueRanks.Scalar }, new FieldMetaData() { Name = "Int32Fast", DataSetFieldId = new Uuid(Guid.NewGuid()), BuiltInType = (byte)DataTypes.Int32, DataType = DataTypeIds.Int32, ValueRank = ValueRanks.Scalar }, new FieldMetaData() { Name = "DateTime", DataSetFieldId = new Uuid(Guid.NewGuid()), BuiltInType = (byte)DataTypes.DateTime, DataType = DataTypeIds.DateTime, ValueRank = ValueRanks.Scalar }, }; simpleMetaData.ConfigurationVersion = new ConfigurationVersionDataType() { MinorVersion = 1, MajorVersion = 1 }; #endregion #region Define 'AllTypes' Metadata DataSetMetaDataType allTypesMetaData = new DataSetMetaDataType(); allTypesMetaData.DataSetClassId = new Uuid(Guid.Empty); allTypesMetaData.Name = "AllTypes"; allTypesMetaData.Fields = new FieldMetaDataCollection() { new FieldMetaData() { Name = "BoolToggle", DataSetFieldId = new Uuid(Guid.NewGuid()), BuiltInType = (byte)DataTypes.Boolean, DataType = DataTypeIds.Boolean, ValueRank = ValueRanks.Scalar }, new FieldMetaData() { Name = "Byte", DataSetFieldId = new Uuid(Guid.NewGuid()), BuiltInType = (byte)DataTypes.Byte, DataType = DataTypeIds.Byte, ValueRank = ValueRanks.Scalar }, new FieldMetaData() { Name = "Int16", DataSetFieldId = new Uuid(Guid.NewGuid()), BuiltInType = (byte)DataTypes.Int16, DataType = DataTypeIds.Int16, ValueRank = ValueRanks.Scalar }, new FieldMetaData() { Name = "Int32", DataSetFieldId = new Uuid(Guid.NewGuid()), BuiltInType = (byte)DataTypes.Int32, DataType = DataTypeIds.Int32, ValueRank = ValueRanks.Scalar }, new FieldMetaData() { Name = "SByte", DataSetFieldId = new Uuid(Guid.NewGuid()), BuiltInType = (byte)DataTypes.SByte, DataType = DataTypeIds.SByte, ValueRank = ValueRanks.Scalar }, new FieldMetaData() { Name = "UInt16", DataSetFieldId = new Uuid(Guid.NewGuid()), BuiltInType = (byte)DataTypes.UInt16, DataType = DataTypeIds.UInt16, ValueRank = ValueRanks.Scalar }, new FieldMetaData() { Name = "UInt32", DataSetFieldId = new Uuid(Guid.NewGuid()), BuiltInType = (byte)DataTypes.UInt32, DataType = DataTypeIds.UInt32, ValueRank = ValueRanks.Scalar }, new FieldMetaData() { Name = "Float", DataSetFieldId = new Uuid(Guid.NewGuid()), BuiltInType = (byte)DataTypes.Float, DataType = DataTypeIds.Float, ValueRank = ValueRanks.Scalar }, new FieldMetaData() { Name = "Double", DataSetFieldId = new Uuid(Guid.NewGuid()), BuiltInType = (byte)DataTypes.Double, DataType = DataTypeIds.Double, ValueRank = ValueRanks.Scalar }, }; allTypesMetaData.ConfigurationVersion = new ConfigurationVersionDataType() { MinorVersion = 1, MajorVersion = 1 }; #endregion #region Define ReaderGroup1 ReaderGroupDataType readerGroup1 = new ReaderGroupDataType(); readerGroup1.Name = "ReaderGroup 1"; readerGroup1.Enabled = true; readerGroup1.MaxNetworkMessageSize = 1500; readerGroup1.MessageSettings = new ExtensionObject(new ReaderGroupMessageDataType()); readerGroup1.TransportSettings = new ExtensionObject(new ReaderGroupTransportDataType()); #region Define DataSetReader 'Simple' for PublisherId = (UInt16)100, DataSetWriterId = 1 DataSetReaderDataType dataSetReaderSimple = new DataSetReaderDataType(); dataSetReaderSimple.Name = "Reader 1"; dataSetReaderSimple.PublisherId = (UInt16)100; dataSetReaderSimple.WriterGroupId = 0; dataSetReaderSimple.DataSetWriterId = 0; dataSetReaderSimple.Enabled = true; dataSetReaderSimple.DataSetFieldContentMask = (uint)DataSetFieldContentMask.RawData; dataSetReaderSimple.KeyFrameCount = 1; dataSetReaderSimple.DataSetMetaData = simpleMetaData; UadpDataSetReaderMessageDataType uadpDataSetReaderMessage = new UadpDataSetReaderMessageDataType() { GroupVersion = 0, DataSetOffset = 15, NetworkMessageNumber = 0, NetworkMessageContentMask = (uint)(uint)(UadpNetworkMessageContentMask.PublisherId | UadpNetworkMessageContentMask.GroupHeader | UadpNetworkMessageContentMask.WriterGroupId | UadpNetworkMessageContentMask.GroupVersion | UadpNetworkMessageContentMask.NetworkMessageNumber | UadpNetworkMessageContentMask.SequenceNumber), DataSetMessageContentMask = (uint)(UadpDataSetMessageContentMask.Status | UadpDataSetMessageContentMask.SequenceNumber), }; dataSetReaderSimple.MessageSettings = new ExtensionObject(uadpDataSetReaderMessage); TargetVariablesDataType subscribedDataSet = new TargetVariablesDataType(); subscribedDataSet.TargetVariables = new FieldTargetDataTypeCollection(); foreach (var fieldMetaData in simpleMetaData.Fields) { subscribedDataSet.TargetVariables.Add(new FieldTargetDataType() { DataSetFieldId = fieldMetaData.DataSetFieldId, TargetNodeId = new NodeId(fieldMetaData.Name, NamespaceIndexSimple), AttributeId = Attributes.Value, OverrideValueHandling = OverrideValueHandling.OverrideValue, OverrideValue = new Variant(TypeInfo.GetDefaultValue(fieldMetaData.DataType, (int)ValueRanks.Scalar)) }); } dataSetReaderSimple.SubscribedDataSet = new ExtensionObject(subscribedDataSet); #endregion readerGroup1.DataSetReaders.Add(dataSetReaderSimple); #region Define DataSetReader 'AllTypes' for PublisherId = (UInt16)100, DataSetWriterId = 2 DataSetReaderDataType dataSetReaderAllTypes = new DataSetReaderDataType(); dataSetReaderAllTypes.Name = "Reader 2"; dataSetReaderAllTypes.PublisherId = (UInt16)100; dataSetReaderAllTypes.WriterGroupId = 0; dataSetReaderAllTypes.DataSetWriterId = 0; dataSetReaderAllTypes.Enabled = true; dataSetReaderAllTypes.DataSetFieldContentMask = (uint)DataSetFieldContentMask.RawData; dataSetReaderAllTypes.KeyFrameCount = 1; dataSetReaderAllTypes.DataSetMetaData = allTypesMetaData; uadpDataSetReaderMessage = new UadpDataSetReaderMessageDataType() { GroupVersion = 0, DataSetOffset = 47, NetworkMessageNumber = 0, NetworkMessageContentMask = (uint)(uint)(UadpNetworkMessageContentMask.PublisherId | UadpNetworkMessageContentMask.GroupHeader | UadpNetworkMessageContentMask.WriterGroupId | UadpNetworkMessageContentMask.GroupVersion | UadpNetworkMessageContentMask.NetworkMessageNumber | UadpNetworkMessageContentMask.SequenceNumber), DataSetMessageContentMask = (uint)(UadpDataSetMessageContentMask.Status | UadpDataSetMessageContentMask.SequenceNumber), }; dataSetReaderAllTypes.MessageSettings = new ExtensionObject(uadpDataSetReaderMessage); subscribedDataSet = new TargetVariablesDataType(); subscribedDataSet.TargetVariables = new FieldTargetDataTypeCollection(); foreach (var fieldMetaData in allTypesMetaData.Fields) { subscribedDataSet.TargetVariables.Add(new FieldTargetDataType() { DataSetFieldId = fieldMetaData.DataSetFieldId, TargetNodeId = new NodeId(fieldMetaData.Name, NamespaceIndexAllTypes), AttributeId = Attributes.Value, OverrideValueHandling = OverrideValueHandling.OverrideValue, OverrideValue = new Variant(TypeInfo.GetDefaultValue(fieldMetaData.DataType, (int)ValueRanks.Scalar)) }); } dataSetReaderAllTypes.SubscribedDataSet = new ExtensionObject(subscribedDataSet); #endregion readerGroup1.DataSetReaders.Add(dataSetReaderAllTypes); #endregion pubSubConnection1.ReaderGroups.Add(readerGroup1); //create pub sub configuration root object PubSubConfigurationDataType pubSubConfiguration = new PubSubConfigurationDataType(); pubSubConfiguration.Connections = new PubSubConnectionDataTypeCollection() { pubSubConnection1 }; return(pubSubConfiguration); }
/// <summary> /// Creates a Subscriber PubSubConfiguration object for UDP & UADP programmatically. /// </summary> /// <returns></returns> private static PubSubConfigurationDataType CreateSubscriberConfiguration_MqttUadp(string urlAddress) { // Define a PubSub connection with PublisherId 3 PubSubConnectionDataType pubSubConnection1 = new PubSubConnectionDataType(); pubSubConnection1.Name = "Subscriber Connection MQTT UADP"; pubSubConnection1.Enabled = true; pubSubConnection1.PublisherId = (UInt16)3; pubSubConnection1.TransportProfileUri = Profiles.PubSubMqttUadpTransport; NetworkAddressUrlDataType address = new NetworkAddressUrlDataType(); // Specify the local Network interface name to be used // e.g. address.NetworkInterface = "Ethernet"; // Leave empty to subscribe on all available local interfaces. address.NetworkInterface = String.Empty; address.Url = urlAddress; pubSubConnection1.Address = new ExtensionObject(address); // Configure the mqtt specific configuration with the MQTTbroker ITransportProtocolConfiguration mqttConfiguration = new MqttClientProtocolConfiguration(version: EnumMqttProtocolVersion.V500); pubSubConnection1.ConnectionProperties = mqttConfiguration.ConnectionProperties; string brokerQueueName = "Uadp_WriterGroup_1"; string brokerMetaData = "$Metadata"; #region Define ReaderGroup1 ReaderGroupDataType readerGroup1 = new ReaderGroupDataType(); readerGroup1.Name = "ReaderGroup 1"; readerGroup1.Enabled = true; readerGroup1.MaxNetworkMessageSize = 1500; readerGroup1.MessageSettings = new ExtensionObject(new ReaderGroupMessageDataType()); readerGroup1.TransportSettings = new ExtensionObject(new ReaderGroupTransportDataType()); #region Define DataSetReader 'Simple' for PublisherId = (UInt16)1, DataSetWriterId = 1 DataSetReaderDataType dataSetReaderSimple = new DataSetReaderDataType(); dataSetReaderSimple.Name = "Reader 1 MQTT UADP"; dataSetReaderSimple.PublisherId = (UInt16)3; dataSetReaderSimple.WriterGroupId = 0; dataSetReaderSimple.DataSetWriterId = 1; dataSetReaderSimple.Enabled = true; dataSetReaderSimple.DataSetFieldContentMask = (uint)DataSetFieldContentMask.RawData; dataSetReaderSimple.KeyFrameCount = 1; BrokerDataSetReaderTransportDataType brokerTransportSettings = new BrokerDataSetReaderTransportDataType() { QueueName = brokerQueueName, MetaDataQueueName = $"{brokerQueueName}/{brokerMetaData}", }; dataSetReaderSimple.TransportSettings = new ExtensionObject(brokerTransportSettings); UadpDataSetReaderMessageDataType uadpDataSetReaderMessage = new UadpDataSetReaderMessageDataType() { GroupVersion = 0, NetworkMessageNumber = 0, NetworkMessageContentMask = (uint)(uint)(UadpNetworkMessageContentMask.PublisherId | UadpNetworkMessageContentMask.GroupHeader | UadpNetworkMessageContentMask.WriterGroupId | UadpNetworkMessageContentMask.PayloadHeader | UadpNetworkMessageContentMask.GroupVersion | UadpNetworkMessageContentMask.NetworkMessageNumber | UadpNetworkMessageContentMask.SequenceNumber), DataSetMessageContentMask = (uint)(UadpDataSetMessageContentMask.Status | UadpDataSetMessageContentMask.SequenceNumber), }; dataSetReaderSimple.MessageSettings = new ExtensionObject(uadpDataSetReaderMessage); // Create and set DataSetMetaData for DataSet Simple DataSetMetaDataType simpleMetaData = CreateDataSetMetaDataSimple(); dataSetReaderSimple.DataSetMetaData = simpleMetaData; // Create and set SubscribedDataSet TargetVariablesDataType subscribedDataSet = new TargetVariablesDataType(); subscribedDataSet.TargetVariables = new FieldTargetDataTypeCollection(); foreach (var fieldMetaData in simpleMetaData.Fields) { subscribedDataSet.TargetVariables.Add(new FieldTargetDataType() { DataSetFieldId = fieldMetaData.DataSetFieldId, TargetNodeId = new NodeId(fieldMetaData.Name, NamespaceIndexSimple), AttributeId = Attributes.Value, OverrideValueHandling = OverrideValueHandling.OverrideValue, OverrideValue = new Variant(TypeInfo.GetDefaultValue(fieldMetaData.DataType, (int)ValueRanks.Scalar)) }); } dataSetReaderSimple.SubscribedDataSet = new ExtensionObject(subscribedDataSet); #endregion readerGroup1.DataSetReaders.Add(dataSetReaderSimple); #region Define DataSetReader 'AllTypes' for PublisherId = (UInt16)1, DataSetWriterId = 2 DataSetReaderDataType dataSetReaderAllTypes = new DataSetReaderDataType(); dataSetReaderAllTypes.Name = "Reader 2 MQTT UADP"; dataSetReaderAllTypes.PublisherId = (UInt16)3; dataSetReaderAllTypes.WriterGroupId = 0; dataSetReaderAllTypes.DataSetWriterId = 2; dataSetReaderAllTypes.Enabled = true; dataSetReaderAllTypes.DataSetFieldContentMask = (uint)DataSetFieldContentMask.RawData; dataSetReaderAllTypes.KeyFrameCount = 1; dataSetReaderAllTypes.TransportSettings = new ExtensionObject(brokerTransportSettings); uadpDataSetReaderMessage = new UadpDataSetReaderMessageDataType() { GroupVersion = 0, NetworkMessageNumber = 0, NetworkMessageContentMask = (uint)(uint)(UadpNetworkMessageContentMask.PublisherId | UadpNetworkMessageContentMask.GroupHeader | UadpNetworkMessageContentMask.WriterGroupId | UadpNetworkMessageContentMask.PayloadHeader | UadpNetworkMessageContentMask.GroupVersion | UadpNetworkMessageContentMask.NetworkMessageNumber | UadpNetworkMessageContentMask.SequenceNumber), DataSetMessageContentMask = (uint)(UadpDataSetMessageContentMask.Status | UadpDataSetMessageContentMask.SequenceNumber), }; dataSetReaderAllTypes.MessageSettings = new ExtensionObject(uadpDataSetReaderMessage); // Create and set DataSetMetaData for DataSet AllTypes DataSetMetaDataType allTypesMetaData = CreateDataSetMetaDataAllTypes(); dataSetReaderAllTypes.DataSetMetaData = allTypesMetaData; // Create and set SubscribedDataSet subscribedDataSet = new TargetVariablesDataType(); subscribedDataSet.TargetVariables = new FieldTargetDataTypeCollection(); foreach (var fieldMetaData in allTypesMetaData.Fields) { subscribedDataSet.TargetVariables.Add(new FieldTargetDataType() { DataSetFieldId = fieldMetaData.DataSetFieldId, TargetNodeId = new NodeId(fieldMetaData.Name, NamespaceIndexAllTypes), AttributeId = Attributes.Value, OverrideValueHandling = OverrideValueHandling.OverrideValue, OverrideValue = new Variant(TypeInfo.GetDefaultValue(fieldMetaData.DataType, (int)ValueRanks.Scalar)) }); } dataSetReaderAllTypes.SubscribedDataSet = new ExtensionObject(subscribedDataSet); #endregion readerGroup1.DataSetReaders.Add(dataSetReaderAllTypes); #endregion pubSubConnection1.ReaderGroups.Add(readerGroup1); //create pub sub configuration root object PubSubConfigurationDataType pubSubConfiguration = new PubSubConfigurationDataType(); pubSubConfiguration.Connections = new PubSubConnectionDataTypeCollection() { pubSubConnection1 }; return(pubSubConfiguration); }
/// <summary> /// Creates a Subscriber PubSubConfiguration object for UDP & UADP programmatically. /// </summary> /// <returns></returns> private static PubSubConfigurationDataType CreateSubscriberConfiguration_UdpUadp(string urlAddress) { // Define a PubSub connection with PublisherId 1 PubSubConnectionDataType pubSubConnection1 = new PubSubConnectionDataType(); pubSubConnection1.Name = "Subscriber Connection UDP UADP"; pubSubConnection1.Enabled = true; pubSubConnection1.PublisherId = (UInt16)1; pubSubConnection1.TransportProfileUri = Profiles.PubSubUdpUadpTransport; NetworkAddressUrlDataType address = new NetworkAddressUrlDataType(); // Specify the local Network interface name to be used // e.g. address.NetworkInterface = "Ethernet"; // Leave empty to subscribe on all available local interfaces. address.NetworkInterface = String.Empty; address.Url = urlAddress; pubSubConnection1.Address = new ExtensionObject(address); // configure custoom DicoveryAddress for Dicovery messages pubSubConnection1.TransportSettings = new ExtensionObject() { Body = new DatagramConnectionTransportDataType() { DiscoveryAddress = new ExtensionObject() { Body = new NetworkAddressUrlDataType() { Url = "opc.udp://224.0.2.15:4840" } } } }; #region Define ReaderGroup1 ReaderGroupDataType readerGroup1 = new ReaderGroupDataType(); readerGroup1.Name = "ReaderGroup 1"; readerGroup1.Enabled = true; readerGroup1.MaxNetworkMessageSize = 1500; readerGroup1.MessageSettings = new ExtensionObject(new ReaderGroupMessageDataType()); readerGroup1.TransportSettings = new ExtensionObject(new ReaderGroupTransportDataType()); #region Define DataSetReader 'Simple' for PublisherId = (UInt16)1, DataSetWriterId = 1 DataSetReaderDataType dataSetReaderSimple = new DataSetReaderDataType(); dataSetReaderSimple.Name = "Reader 1 UDP UADP"; dataSetReaderSimple.PublisherId = (UInt16)1; dataSetReaderSimple.WriterGroupId = 0; dataSetReaderSimple.DataSetWriterId = 1; dataSetReaderSimple.Enabled = true; dataSetReaderSimple.DataSetFieldContentMask = (uint)DataSetFieldContentMask.RawData; dataSetReaderSimple.KeyFrameCount = 1; dataSetReaderSimple.TransportSettings = new ExtensionObject(new DataSetReaderTransportDataType()); UadpDataSetReaderMessageDataType uadpDataSetReaderMessage = new UadpDataSetReaderMessageDataType() { GroupVersion = 0, NetworkMessageNumber = 0, NetworkMessageContentMask = (uint)(uint)(UadpNetworkMessageContentMask.PublisherId | UadpNetworkMessageContentMask.GroupHeader | UadpNetworkMessageContentMask.WriterGroupId | UadpNetworkMessageContentMask.GroupVersion | UadpNetworkMessageContentMask.NetworkMessageNumber | UadpNetworkMessageContentMask.SequenceNumber), DataSetMessageContentMask = (uint)(UadpDataSetMessageContentMask.Status | UadpDataSetMessageContentMask.SequenceNumber), }; dataSetReaderSimple.MessageSettings = new ExtensionObject(uadpDataSetReaderMessage); // Create and set DataSetMetaData for DataSet Simple DataSetMetaDataType simpleMetaData = CreateDataSetMetaDataSimple(); dataSetReaderSimple.DataSetMetaData = simpleMetaData; // Create and set SubscribedDataSet TargetVariablesDataType subscribedDataSet = new TargetVariablesDataType(); subscribedDataSet.TargetVariables = new FieldTargetDataTypeCollection(); foreach (var fieldMetaData in simpleMetaData.Fields) { subscribedDataSet.TargetVariables.Add(new FieldTargetDataType() { DataSetFieldId = fieldMetaData.DataSetFieldId, TargetNodeId = new NodeId(fieldMetaData.Name, NamespaceIndexSimple), AttributeId = Attributes.Value, OverrideValueHandling = OverrideValueHandling.OverrideValue, OverrideValue = new Variant(TypeInfo.GetDefaultValue(fieldMetaData.DataType, (int)ValueRanks.Scalar)) }); } dataSetReaderSimple.SubscribedDataSet = new ExtensionObject(subscribedDataSet); #endregion readerGroup1.DataSetReaders.Add(dataSetReaderSimple); #region Define DataSetReader 'AllTypes' for PublisherId = (UInt16)1, DataSetWriterId = 2 DataSetReaderDataType dataSetReaderAllTypes = new DataSetReaderDataType(); dataSetReaderAllTypes.Name = "Reader 2 UDP UADP"; dataSetReaderAllTypes.PublisherId = (UInt16)1; dataSetReaderAllTypes.WriterGroupId = 0; dataSetReaderAllTypes.DataSetWriterId = 2; dataSetReaderAllTypes.Enabled = true; dataSetReaderAllTypes.DataSetFieldContentMask = (uint)DataSetFieldContentMask.RawData; dataSetReaderAllTypes.KeyFrameCount = 1; dataSetReaderAllTypes.TransportSettings = new ExtensionObject(new DataSetReaderTransportDataType()); uadpDataSetReaderMessage = new UadpDataSetReaderMessageDataType() { GroupVersion = 0, NetworkMessageNumber = 0, NetworkMessageContentMask = (uint)(uint)(UadpNetworkMessageContentMask.PublisherId | UadpNetworkMessageContentMask.GroupHeader | UadpNetworkMessageContentMask.WriterGroupId | UadpNetworkMessageContentMask.GroupVersion | UadpNetworkMessageContentMask.NetworkMessageNumber | UadpNetworkMessageContentMask.SequenceNumber), DataSetMessageContentMask = (uint)(UadpDataSetMessageContentMask.Status | UadpDataSetMessageContentMask.SequenceNumber), }; dataSetReaderAllTypes.MessageSettings = new ExtensionObject(uadpDataSetReaderMessage); // Create and set DataSetMetaData for DataSet AllTypes DataSetMetaDataType allTypesMetaData = CreateDataSetMetaDataAllTypes(); dataSetReaderAllTypes.DataSetMetaData = allTypesMetaData; // Create and set SubscribedDataSet subscribedDataSet = new TargetVariablesDataType(); subscribedDataSet.TargetVariables = new FieldTargetDataTypeCollection(); foreach (var fieldMetaData in allTypesMetaData.Fields) { subscribedDataSet.TargetVariables.Add(new FieldTargetDataType() { DataSetFieldId = fieldMetaData.DataSetFieldId, TargetNodeId = new NodeId(fieldMetaData.Name, NamespaceIndexAllTypes), AttributeId = Attributes.Value, OverrideValueHandling = OverrideValueHandling.OverrideValue, OverrideValue = new Variant(TypeInfo.GetDefaultValue(fieldMetaData.DataType, (int)ValueRanks.Scalar)) }); } dataSetReaderAllTypes.SubscribedDataSet = new ExtensionObject(subscribedDataSet); #endregion readerGroup1.DataSetReaders.Add(dataSetReaderAllTypes); #endregion pubSubConnection1.ReaderGroups.Add(readerGroup1); //create pub sub configuration root object PubSubConfigurationDataType pubSubConfiguration = new PubSubConfigurationDataType(); pubSubConfiguration.Connections = new PubSubConnectionDataTypeCollection() { pubSubConnection1 }; return(pubSubConfiguration); }