/// <summary> /// Remove a registered a publishedDataSet /// </summary> /// <param name="publishedDataSet"></param> public void RemovePublishedDataSet(PublishedDataSetDataType publishedDataSet) { if (publishedDataSet == null) { throw new ArgumentException(nameof(publishedDataSet)); } if (m_publishedDataSetsByName.ContainsKey(publishedDataSet.Name)) { m_publishedDataSetsByName.Remove(publishedDataSet.Name); } }
public void ValidateRemovePublishedDataSet() { //Arrange DataCollector dataCollector = new DataCollector(new UaPubSubDataStore()); PublishedDataSetDataType publishedDataSet = new PublishedDataSetDataType(); publishedDataSet.Name = "Name"; //Act dataCollector.AddPublishedDataSet(publishedDataSet); dataCollector.RemovePublishedDataSet(publishedDataSet); DataSet collectedDataSet = dataCollector.CollectData(publishedDataSet.Name); //Assert Assert.IsNull(collectedDataSet, "The '{0}' publishedDataSet was not removed correctly.", publishedDataSet.Name); }
/// <summary> /// Register a publishedDataSet /// </summary> /// <param name="publishedDataSet"></param> public void AddPublishedDataSet(PublishedDataSetDataType publishedDataSet) { if (publishedDataSet == null) { throw new ArgumentException(nameof(publishedDataSet)); } // validate publishedDataSet if (ValidatePublishedDataSet(publishedDataSet)) { m_publishedDataSetsByName[publishedDataSet.Name] = publishedDataSet; } else { Utils.Trace(Utils.TraceMasks.Error, "The PublishedDataSet {0} was not registered because it is not configured properly.", publishedDataSet.Name); } }
/// <summary> /// Validates a <see cref="PublishedDataSetDataType"/> configuration object. /// </summary> /// <param name="publishedDataSet">The <see cref="PublishedDataSetDataType"/> that is to be validated.</param> /// <returns>true if configuration is correct.</returns> public bool ValidatePublishedDataSet(PublishedDataSetDataType publishedDataSet) { if (publishedDataSet == null) { throw new ArgumentException(nameof(publishedDataSet)); } if (publishedDataSet.DataSetMetaData == null) { Utils.Trace(Utils.TraceMasks.Error, "The DataSetMetaData field is null."); return false; } PublishedDataItemsDataType publishedDataItems = ExtensionObject.ToEncodeable(publishedDataSet.DataSetSource) as PublishedDataItemsDataType; if (publishedDataItems != null && publishedDataItems.PublishedData != null) { if (publishedDataItems.PublishedData.Count != publishedDataSet.DataSetMetaData.Fields.Count) { Utils.Trace(Utils.TraceMasks.Error, "The DataSetSource.Count is different from DataSetMetaData.Fields.Count."); return false; } } return true; }
public void ValidateCollectDataFromExtensionFields() { //Arrange UaPubSubDataStore dataStore = new UaPubSubDataStore(); DataCollector dataCollector = new DataCollector(dataStore); #region set up published data set that collects data from extension fields PublishedDataSetDataType publishedDataSetSimple = new PublishedDataSetDataType(); publishedDataSetSimple.Name = "Simple"; // Define publishedDataSetSimple.DataSetMetaData publishedDataSetSimple.DataSetMetaData = new DataSetMetaDataType(); publishedDataSetSimple.DataSetMetaData.DataSetClassId = new Uuid(Guid.Empty); publishedDataSetSimple.DataSetMetaData.Name = publishedDataSetSimple.Name; publishedDataSetSimple.DataSetMetaData.Fields = new FieldMetaDataCollection() { new FieldMetaData() { Name = "BoolToggle", DataSetFieldId = new Uuid(Guid.NewGuid()), DataType = DataTypeIds.Boolean, ValueRank = ValueRanks.Scalar }, new FieldMetaData() { Name = "Int32", DataSetFieldId = new Uuid(Guid.NewGuid()), DataType = DataTypeIds.Int32, ValueRank = ValueRanks.Scalar }, new FieldMetaData() { Name = "Int32Fast", DataSetFieldId = new Uuid(Guid.NewGuid()), DataType = DataTypeIds.Int32, ValueRank = ValueRanks.Scalar }, new FieldMetaData() { Name = "DateTime", DataSetFieldId = new Uuid(Guid.NewGuid()), DataType = DataTypeIds.DateTime, ValueRank = ValueRanks.Scalar } }; //initialize Extension fields collection publishedDataSetSimple.ExtensionFields = new KeyValuePairCollection() { new Opc.Ua.KeyValuePair() { Key = new QualifiedName("BoolToggle"), Value = true }, new Opc.Ua.KeyValuePair() { Key = new QualifiedName("Int32"), Value = (int)100 }, new Opc.Ua.KeyValuePair() { Key = new QualifiedName("Int32Fast"), Value = (int)50 }, new Opc.Ua.KeyValuePair() { Key = new QualifiedName("DateTime"), Value = DateTime.Today } }; PublishedDataItemsDataType publishedDataItems = new PublishedDataItemsDataType(); publishedDataItems.PublishedData = new PublishedVariableDataTypeCollection(); //create PublishedData based on metadata names foreach (var field in publishedDataSetSimple.DataSetMetaData.Fields) { publishedDataItems.PublishedData.Add( new PublishedVariableDataType() { SubstituteValue = new QualifiedName(field.Name) }); } publishedDataSetSimple.DataSetSource = new ExtensionObject(publishedDataItems); #endregion //Act dataCollector.AddPublishedDataSet(publishedDataSetSimple); DataSet collectedDataSet = dataCollector.CollectData(publishedDataSetSimple.Name); //Assert Assert.IsNotNull(publishedDataItems, "The m_firstPublishedDataSet.DataSetSource is not PublishedDataItemsDataType."); Assert.IsNotNull(collectedDataSet, "collectedDataSet is null."); Assert.IsNotNull(collectedDataSet.Fields, "collectedDataSet.Fields is null."); Assert.AreEqual(collectedDataSet.Fields.Length, publishedDataItems.PublishedData.Count, "collectedDataSet and published data fields count do not match."); // validate collected values Assert.AreEqual(collectedDataSet.Fields[0].Value.Value, true, "collectedDataSet.Fields[0].Value.Value does not match."); Assert.AreEqual(collectedDataSet.Fields[1].Value.Value, (int)100, "collectedDataSet.Fields[1].Value.Value does not match."); Assert.AreEqual(collectedDataSet.Fields[2].Value.Value, (int)50, "collectedDataSet.Fields[2].Value.Value does not match."); Assert.AreEqual(collectedDataSet.Fields[3].Value.Value, DateTime.Today, "collectedDataSet.Fields[3].Value.Value does not match."); }
public void ValidateCollectDataFromDataStore() { //Arrange UaPubSubDataStore dataStore = new UaPubSubDataStore(); dataStore.WritePublishedDataItem(new NodeId("BoolToggle", NamespaceIndex), 0, new DataValue(new Variant(false))); dataStore.WritePublishedDataItem(new NodeId("Int32", NamespaceIndex), 0, new DataValue(new Variant(1))); dataStore.WritePublishedDataItem(new NodeId("Int32Fast", NamespaceIndex), 0, new DataValue(new Variant(2))); dataStore.WritePublishedDataItem(new NodeId("DateTime", NamespaceIndex), 0, new DataValue(new Variant(DateTime.MaxValue))); DataCollector dataCollector = new DataCollector(dataStore); #region set up published data set that collects data from extension fields PublishedDataSetDataType publishedDataSetSimple = new PublishedDataSetDataType(); publishedDataSetSimple.Name = "Simple"; // Define publishedDataSetSimple.DataSetMetaData publishedDataSetSimple.DataSetMetaData = new DataSetMetaDataType(); publishedDataSetSimple.DataSetMetaData.DataSetClassId = new Uuid(Guid.Empty); publishedDataSetSimple.DataSetMetaData.Name = publishedDataSetSimple.Name; publishedDataSetSimple.DataSetMetaData.Fields = new FieldMetaDataCollection() { new FieldMetaData() { Name = "BoolToggle", DataSetFieldId = new Uuid(Guid.NewGuid()), DataType = DataTypeIds.Boolean, ValueRank = ValueRanks.Scalar }, new FieldMetaData() { Name = "Int32", DataSetFieldId = new Uuid(Guid.NewGuid()), DataType = DataTypeIds.Int32, ValueRank = ValueRanks.Scalar }, new FieldMetaData() { Name = "Int32Fast", DataSetFieldId = new Uuid(Guid.NewGuid()), DataType = DataTypeIds.Int32, ValueRank = ValueRanks.Scalar }, new FieldMetaData() { Name = "DateTime", DataSetFieldId = new Uuid(Guid.NewGuid()), DataType = DataTypeIds.DateTime, ValueRank = ValueRanks.Scalar } }; PublishedDataItemsDataType publishedDataItems = new PublishedDataItemsDataType(); publishedDataItems.PublishedData = new PublishedVariableDataTypeCollection(); //create PublishedData based on metadata names foreach (var field in publishedDataSetSimple.DataSetMetaData.Fields) { publishedDataItems.PublishedData.Add( new PublishedVariableDataType() { PublishedVariable = new NodeId(field.Name, NamespaceIndex), AttributeId = Attributes.Value, }); } publishedDataSetSimple.DataSetSource = new ExtensionObject(publishedDataItems); #endregion //Act dataCollector.AddPublishedDataSet(publishedDataSetSimple); DataSet collectedDataSet = dataCollector.CollectData(publishedDataSetSimple.Name); //Assert Assert.IsNotNull(publishedDataItems, "The m_firstPublishedDataSet.DataSetSource is not PublishedDataItemsDataType."); Assert.IsNotNull(collectedDataSet, "collectedDataSet is null."); Assert.IsNotNull(collectedDataSet.Fields, "collectedDataSet.Fields is null."); Assert.AreEqual(collectedDataSet.Fields.Length, publishedDataItems.PublishedData.Count, "collectedDataSet and published data fields count do not match."); // validate collected values Assert.AreEqual(collectedDataSet.Fields[0].Value.Value, false, "collectedDataSet.Fields[0].Value.Value does not match."); Assert.AreEqual(collectedDataSet.Fields[1].Value.Value, (int)1, "collectedDataSet.Fields[1].Value.Value does not match."); Assert.AreEqual(collectedDataSet.Fields[2].Value.Value, (int)2, "collectedDataSet.Fields[2].Value.Value does not match."); Assert.AreEqual(collectedDataSet.Fields[3].Value.Value, DateTime.MaxValue, "collectedDataSet.Fields[3].Value.Value does not match."); }
/// <summary> /// Create and return a DataSet object created from its dataSetName /// </summary> /// <param name="dataSetName"></param> /// <returns></returns> public DataSet CollectData(string dataSetName) { PublishedDataSetDataType publishedDataSet = GetPublishedDataSet(dataSetName); if (publishedDataSet != null) { if (publishedDataSet.DataSetSource != null) { DataSet dataSet = new DataSet(dataSetName); PublishedDataItemsDataType publishedDataItems = ExtensionObject.ToEncodeable(publishedDataSet.DataSetSource) as PublishedDataItemsDataType; if (publishedDataItems != null && publishedDataItems.PublishedData != null && publishedDataItems.PublishedData.Count > 0) { dataSet.Fields = new Field[publishedDataItems.PublishedData.Count]; for (int i = 0; i < publishedDataItems.PublishedData.Count; i++) { try { PublishedVariableDataType publishedVariable = publishedDataItems.PublishedData[i]; dataSet.Fields[i] = new Field(); // set FieldMetaData property dataSet.Fields[i].FieldMetaData = publishedDataSet.DataSetMetaData.Fields[i]; // retrieve value from DataStore DataValue dataValue = null; if (publishedVariable.PublishedVariable != null) { //todo handle missing value in data store dataValue = m_dataStore.ReadPublishedDataItem(publishedVariable.PublishedVariable, publishedVariable.AttributeId); } if (dataValue == null) { //try to get the dataValue from ExtensionFields /*If an entry of the PublishedData references one of the ExtensionFields, the substituteValue shall contain the * QualifiedName of the ExtensionFields entry. * All other fields of this PublishedVariableDataType array element shall be null*/ QualifiedName extensionFieldName = publishedVariable.SubstituteValue.Value as QualifiedName; if (extensionFieldName != null) { KeyValuePair extensionField = publishedDataSet.ExtensionFields.Find(x => x.Key == extensionFieldName); if (extensionField != null) { dataValue = new DataValue(extensionField.Value); } } if (dataValue == null) { dataValue = new DataValue(StatusCodes.Bad, DateTime.UtcNow); } } else { dataValue = Utils.Clone(dataValue) as DataValue; //check StatusCode and return SubstituteValue if possible if (dataValue.StatusCode == StatusCodes.Bad && publishedVariable.SubstituteValue != Variant.Null) { dataValue.Value = publishedVariable.SubstituteValue.Value; dataValue.StatusCode = StatusCodes.UncertainSubstituteValue; } } dataValue.ServerTimestamp = DateTime.UtcNow; #region FieldMetaData -> MaxStringLength size validation Field field = dataSet.Fields[i]; Variant variant = dataValue.WrappedValue; bool shouldBringToConstraints(uint givenStrlen) { if (field.FieldMetaData.MaxStringLength > 0 && givenStrlen > field.FieldMetaData.MaxStringLength) { return(true); } return(false); } switch ((BuiltInType)field.FieldMetaData.BuiltInType) { case BuiltInType.String: if (field.FieldMetaData.ValueRank == ValueRanks.Scalar) { string strFieldValue = variant.Value as string; if (strFieldValue != null && shouldBringToConstraints((uint)strFieldValue.Length)) { variant.Value = strFieldValue.Substring(0, (int)field.FieldMetaData.MaxStringLength); dataValue.Value = variant; } } else if (field.FieldMetaData.ValueRank == ValueRanks.OneDimension) { string[] valueArray = variant.Value as string[]; if (valueArray != null) { for (int idx = 0; idx < valueArray.Length; idx++) { if (shouldBringToConstraints((uint)valueArray[idx].Length)) { valueArray[idx] = valueArray[idx].Substring(0, (int)field.FieldMetaData.MaxStringLength); } } } dataValue.Value = valueArray; } break; case BuiltInType.ByteString: if (field.FieldMetaData.ValueRank == ValueRanks.Scalar) { byte[] byteStringFieldValue = variant.Value as byte[]; if (byteStringFieldValue != null && shouldBringToConstraints((uint)byteStringFieldValue.Length)) { byte[] byteArray = (byte[])byteStringFieldValue.Clone(); Array.Resize(ref byteArray, (int)field.FieldMetaData.MaxStringLength); variant.Value = byteArray; dataValue.Value = variant; } } else if (field.FieldMetaData.ValueRank == ValueRanks.OneDimension) { byte[][] valueArray = variant.Value as byte[][]; if (valueArray != null) { for (int idx = 0; idx < valueArray.Length; idx++) { if (shouldBringToConstraints((uint)valueArray[idx].Length)) { byte[] byteArray = (byte[])valueArray[idx].Clone(); Array.Resize(ref byteArray, (int)field.FieldMetaData.MaxStringLength); valueArray[idx] = byteArray; } } } dataValue.Value = valueArray; } break; default: break; } #endregion dataSet.Fields[i].Value = dataValue; } catch (Exception ex) { dataSet.Fields[i].Value = new DataValue(StatusCodes.Bad, DateTime.UtcNow); Utils.Trace(Utils.TraceMasks.Information, "DataCollector.CollectData for dataset {0} field {1} resulted in ex {2}", dataSetName, i, ex); } } return(dataSet); } } } return(null); }
/// <summary> /// Updates the metadata. /// </summary> public void UpdateMetaData(PublishedDataSetDataType publishedDataSet) { }
/// <summary> /// Creates a PubSubConfiguration object programmatically. /// </summary> /// <returns></returns> public static PubSubConfigurationDataType CreatePublisherConfiguration() { // 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 publish 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 WriterGroup1 WriterGroupDataType writerGroup1 = new WriterGroupDataType(); writerGroup1.Name = "WriterGroup 1"; writerGroup1.Enabled = true; writerGroup1.WriterGroupId = 1; writerGroup1.PublishingInterval = 5000; writerGroup1.KeepAliveTime = 5000; writerGroup1.MaxNetworkMessageSize = 1500; writerGroup1.HeaderLayoutUri = "UADP-Cyclic-Fixed"; UadpWriterGroupMessageDataType messageSettings = new UadpWriterGroupMessageDataType() { DataSetOrdering = DataSetOrderingType.AscendingWriterId, GroupVersion = 0, NetworkMessageContentMask = (uint)(UadpNetworkMessageContentMask.PublisherId | UadpNetworkMessageContentMask.GroupHeader | UadpNetworkMessageContentMask.WriterGroupId | UadpNetworkMessageContentMask.GroupVersion | UadpNetworkMessageContentMask.NetworkMessageNumber | UadpNetworkMessageContentMask.SequenceNumber) }; writerGroup1.MessageSettings = new ExtensionObject(messageSettings); writerGroup1.TransportSettings = new ExtensionObject(new DatagramWriterGroupTransportDataType()); // Define DataSetWriter 'Simple' DataSetWriterDataType dataSetWriter1 = new DataSetWriterDataType(); dataSetWriter1.Name = "Writer 1"; dataSetWriter1.DataSetWriterId = 1; dataSetWriter1.Enabled = true; dataSetWriter1.DataSetFieldContentMask = (uint)DataSetFieldContentMask.RawData; dataSetWriter1.DataSetName = "Simple"; dataSetWriter1.KeyFrameCount = 1; UadpDataSetWriterMessageDataType uadpDataSetWriterMessage = new UadpDataSetWriterMessageDataType() { ConfiguredSize = 32, DataSetOffset = 15, NetworkMessageNumber = 1, DataSetMessageContentMask = (uint)(UadpDataSetMessageContentMask.Status | UadpDataSetMessageContentMask.SequenceNumber), }; dataSetWriter1.MessageSettings = new ExtensionObject(uadpDataSetWriterMessage); writerGroup1.DataSetWriters.Add(dataSetWriter1); // Define DataSetWriter 'AllTypes' DataSetWriterDataType dataSetWriter2 = new DataSetWriterDataType(); dataSetWriter2.Name = "Writer 2"; dataSetWriter2.DataSetWriterId = 2; dataSetWriter2.Enabled = true; dataSetWriter2.DataSetFieldContentMask = (uint)DataSetFieldContentMask.RawData; dataSetWriter2.DataSetName = "AllTypes"; dataSetWriter2.KeyFrameCount = 1; uadpDataSetWriterMessage = new UadpDataSetWriterMessageDataType() { ConfiguredSize = 32, DataSetOffset = 47, NetworkMessageNumber = 1, DataSetMessageContentMask = (uint)(UadpDataSetMessageContentMask.Status | UadpDataSetMessageContentMask.SequenceNumber), }; dataSetWriter2.MessageSettings = new ExtensionObject(uadpDataSetWriterMessage); writerGroup1.DataSetWriters.Add(dataSetWriter2); pubSubConnection1.WriterGroups.Add(writerGroup1); #endregion #region Define PublishedDataSet Simple PublishedDataSetDataType publishedDataSetSimple = new PublishedDataSetDataType(); publishedDataSetSimple.Name = "Simple"; //name shall be unique in a configuration // Define publishedDataSetSimple.DataSetMetaData publishedDataSetSimple.DataSetMetaData = new DataSetMetaDataType(); publishedDataSetSimple.DataSetMetaData.DataSetClassId = Uuid.Empty; publishedDataSetSimple.DataSetMetaData.Name = publishedDataSetSimple.Name; publishedDataSetSimple.DataSetMetaData.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 }, }; publishedDataSetSimple.DataSetMetaData.ConfigurationVersion = new ConfigurationVersionDataType() { MinorVersion = 1, MajorVersion = 1 }; PublishedDataItemsDataType publishedDataSetSimpleSource = new PublishedDataItemsDataType(); publishedDataSetSimpleSource.PublishedData = new PublishedVariableDataTypeCollection(); //create PublishedData based on metadata names foreach (var field in publishedDataSetSimple.DataSetMetaData.Fields) { publishedDataSetSimpleSource.PublishedData.Add( new PublishedVariableDataType() { PublishedVariable = new NodeId(field.Name, PublishedValuesWrites.NamespaceIndexSimple), AttributeId = Attributes.Value, }); } publishedDataSetSimple.DataSetSource = new ExtensionObject(publishedDataSetSimpleSource); #endregion #region Define PublishedDataSet AllTypes PublishedDataSetDataType publishedDataSetAllTypes = new PublishedDataSetDataType(); publishedDataSetAllTypes.Name = "AllTypes"; //name shall be unique in a configuration // Define publishedDataSetAllTypes.DataSetMetaData publishedDataSetAllTypes.DataSetMetaData = new DataSetMetaDataType(); publishedDataSetAllTypes.DataSetMetaData.DataSetClassId = Uuid.Empty; publishedDataSetAllTypes.DataSetMetaData.Name = publishedDataSetAllTypes.Name; publishedDataSetAllTypes.DataSetMetaData.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 }, }; publishedDataSetAllTypes.DataSetMetaData.ConfigurationVersion = new ConfigurationVersionDataType() { MinorVersion = 1, MajorVersion = 1 }; PublishedDataItemsDataType publishedDataSetAllTypesSource = new PublishedDataItemsDataType(); //create PublishedData based on metadata names foreach (var field in publishedDataSetAllTypes.DataSetMetaData.Fields) { publishedDataSetAllTypesSource.PublishedData.Add( new PublishedVariableDataType() { PublishedVariable = new NodeId(field.Name, PublishedValuesWrites.NamespaceIndexAllTypes), AttributeId = Attributes.Value, }); } publishedDataSetAllTypes.DataSetSource = new ExtensionObject(publishedDataSetAllTypesSource); #endregion //create the PubSub configuration root object PubSubConfigurationDataType pubSubConfiguration = new PubSubConfigurationDataType(); pubSubConfiguration.Connections = new PubSubConnectionDataTypeCollection() { pubSubConnection1 }; pubSubConfiguration.PublishedDataSets = new PublishedDataSetDataTypeCollection() { publishedDataSetSimple, publishedDataSetAllTypes }; return(pubSubConfiguration); }
/// <summary> /// Creates the "AllTypes" DataSet /// </summary> /// <returns></returns> private static PublishedDataSetDataType CreatePublishedDataSetAllTypes() { PublishedDataSetDataType publishedDataSetAllTypes = new PublishedDataSetDataType(); publishedDataSetAllTypes.Name = "AllTypes"; //name shall be unique in a configuration // Define publishedDataSetAllTypes.DataSetMetaData publishedDataSetAllTypes.DataSetMetaData = new DataSetMetaDataType(); publishedDataSetAllTypes.DataSetMetaData.DataSetClassId = Uuid.Empty; publishedDataSetAllTypes.DataSetMetaData.Name = publishedDataSetAllTypes.Name; publishedDataSetAllTypes.DataSetMetaData.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 = "UInt64", DataSetFieldId = new Uuid(Guid.NewGuid()), BuiltInType = (byte)DataTypes.UInt64, DataType = DataTypeIds.UInt64, 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 }, new FieldMetaData() { Name = "String", DataSetFieldId = new Uuid(Guid.NewGuid()), BuiltInType = (byte)DataTypes.String, DataType = DataTypeIds.String, ValueRank = ValueRanks.Scalar }, new FieldMetaData() { Name = "ByteString", DataSetFieldId = new Uuid(Guid.NewGuid()), BuiltInType = (byte)DataTypes.ByteString, DataType = DataTypeIds.ByteString, ValueRank = ValueRanks.Scalar }, new FieldMetaData() { Name = "Guid", DataSetFieldId = new Uuid(Guid.NewGuid()), BuiltInType = (byte)DataTypes.Guid, DataType = DataTypeIds.Guid, ValueRank = ValueRanks.Scalar }, new FieldMetaData() { Name = "DateTime", DataSetFieldId = new Uuid(Guid.NewGuid()), BuiltInType = (byte)DataTypes.DateTime, DataType = DataTypeIds.DateTime, ValueRank = ValueRanks.Scalar }, new FieldMetaData() { Name = "UInt32Array", DataSetFieldId = new Uuid(Guid.NewGuid()), BuiltInType = (byte)DataTypes.UInt32, DataType = DataTypeIds.UInt32, ValueRank = ValueRanks.OneDimension }, }; publishedDataSetAllTypes.DataSetMetaData.ConfigurationVersion = new ConfigurationVersionDataType() { MinorVersion = 1, MajorVersion = 1 }; PublishedDataItemsDataType publishedDataSetAllTypesSource = new PublishedDataItemsDataType(); //create PublishedData based on metadata names foreach (var field in publishedDataSetAllTypes.DataSetMetaData.Fields) { publishedDataSetAllTypesSource.PublishedData.Add( new PublishedVariableDataType() { PublishedVariable = new NodeId(field.Name, PublishedValuesWrites.NamespaceIndexAllTypes), AttributeId = Attributes.Value, }); } publishedDataSetAllTypes.DataSetSource = new ExtensionObject(publishedDataSetAllTypesSource); return(publishedDataSetAllTypes); }
/// <summary> /// Creates the "Simple" DataSet /// </summary> /// <returns></returns> private static PublishedDataSetDataType CreatePublishedDataSetSimple() { PublishedDataSetDataType publishedDataSetSimple = new PublishedDataSetDataType(); publishedDataSetSimple.Name = "Simple"; //name shall be unique in a configuration // Define publishedDataSetSimple.DataSetMetaData publishedDataSetSimple.DataSetMetaData = new DataSetMetaDataType(); publishedDataSetSimple.DataSetMetaData.DataSetClassId = Uuid.Empty; publishedDataSetSimple.DataSetMetaData.Name = publishedDataSetSimple.Name; publishedDataSetSimple.DataSetMetaData.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 }, }; publishedDataSetSimple.DataSetMetaData.ConfigurationVersion = new ConfigurationVersionDataType() { MinorVersion = 1, MajorVersion = 1 }; PublishedDataItemsDataType publishedDataSetSimpleSource = new PublishedDataItemsDataType(); publishedDataSetSimpleSource.PublishedData = new PublishedVariableDataTypeCollection(); //create PublishedData based on metadata names foreach (var field in publishedDataSetSimple.DataSetMetaData.Fields) { publishedDataSetSimpleSource.PublishedData.Add( new PublishedVariableDataType() { PublishedVariable = new NodeId(field.Name, PublishedValuesWrites.NamespaceIndexSimple), AttributeId = Attributes.Value, }); } publishedDataSetSimple.DataSetSource = new ExtensionObject(publishedDataSetSimpleSource); return(publishedDataSetSimple); }
/// <summary> /// Creates a PubSubConfiguration object for MQTT & Json programmatically. /// </summary> /// <returns></returns> private static PubSubConfigurationDataType CreatePublisherConfiguration_MqttJson(string urlAddress) { // Define a PubSub connection with PublisherId 100 PubSubConnectionDataType pubSubConnection1 = new PubSubConnectionDataType(); pubSubConnection1.Name = "Publisher Connection3 MQTT Json"; pubSubConnection1.Enabled = true; pubSubConnection1.PublisherId = (UInt16)2; pubSubConnection1.TransportProfileUri = Profiles.PubSubMqttJsonTransport; NetworkAddressUrlDataType address = new NetworkAddressUrlDataType(); // Specify the local Network interface name to be used // e.g. address.NetworkInterface = "Ethernet"; // Leave empty to publish 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 = "Json_WriterGroup_1"; string brokerMetaData = "$Metadata"; #region Define WriterGroup1 - Json WriterGroupDataType writerGroup1 = new WriterGroupDataType(); writerGroup1.Name = "WriterGroup 1"; writerGroup1.Enabled = true; writerGroup1.WriterGroupId = 1; writerGroup1.PublishingInterval = 5000; writerGroup1.KeepAliveTime = 5000; writerGroup1.MaxNetworkMessageSize = 1500; JsonWriterGroupMessageDataType jsonMessageSettings = new JsonWriterGroupMessageDataType() { NetworkMessageContentMask = (uint)(JsonNetworkMessageContentMask.NetworkMessageHeader | JsonNetworkMessageContentMask.DataSetMessageHeader | JsonNetworkMessageContentMask.PublisherId | JsonNetworkMessageContentMask.DataSetClassId | JsonNetworkMessageContentMask.ReplyTo) }; writerGroup1.MessageSettings = new ExtensionObject(jsonMessageSettings); writerGroup1.TransportSettings = new ExtensionObject(new BrokerWriterGroupTransportDataType() { QueueName = brokerQueueName, } ); // Define DataSetWriter 'Simple' Variant encoding DataSetWriterDataType dataSetWriter1 = new DataSetWriterDataType(); dataSetWriter1.Name = "Writer Variant Encoding"; dataSetWriter1.DataSetWriterId = 1; dataSetWriter1.Enabled = true; dataSetWriter1.DataSetFieldContentMask = 0;// Variant encoding; dataSetWriter1.DataSetName = "Simple"; dataSetWriter1.KeyFrameCount = 1; JsonDataSetWriterMessageDataType jsonDataSetWriterMessage = new JsonDataSetWriterMessageDataType() { DataSetMessageContentMask = (uint)(JsonDataSetMessageContentMask.DataSetWriterId | JsonDataSetMessageContentMask.MetaDataVersion | JsonDataSetMessageContentMask.SequenceNumber | JsonDataSetMessageContentMask.Status | JsonDataSetMessageContentMask.Timestamp), }; dataSetWriter1.MessageSettings = new ExtensionObject(jsonDataSetWriterMessage); BrokerDataSetWriterTransportDataType jsonDataSetWriterTransport = new BrokerDataSetWriterTransportDataType() { QueueName = brokerQueueName, MetaDataQueueName = $"{brokerQueueName}/{brokerMetaData}", MetaDataUpdateTime = 10000 }; dataSetWriter1.TransportSettings = new ExtensionObject(jsonDataSetWriterTransport); writerGroup1.DataSetWriters.Add(dataSetWriter1); // Define DataSetWriter 'Simple' - Variant encoding DataSetWriterDataType dataSetWriter2 = new DataSetWriterDataType(); dataSetWriter2.Name = "Writer RawData Encoding"; dataSetWriter2.DataSetWriterId = 2; dataSetWriter2.Enabled = true; dataSetWriter2.DataSetFieldContentMask = (uint)DataSetFieldContentMask.RawData; dataSetWriter2.DataSetName = "AllTypes"; dataSetWriter2.KeyFrameCount = 1; jsonDataSetWriterMessage = new JsonDataSetWriterMessageDataType() { DataSetMessageContentMask = (uint)(JsonDataSetMessageContentMask.DataSetWriterId | JsonDataSetMessageContentMask.SequenceNumber | JsonDataSetMessageContentMask.Status | JsonDataSetMessageContentMask.Timestamp), }; dataSetWriter2.MessageSettings = new ExtensionObject(jsonDataSetWriterMessage); dataSetWriter2.TransportSettings = new ExtensionObject(jsonDataSetWriterTransport); writerGroup1.DataSetWriters.Add(dataSetWriter2); pubSubConnection1.WriterGroups.Add(writerGroup1); #endregion // Define PublishedDataSet Simple PublishedDataSetDataType publishedDataSetSimple = CreatePublishedDataSetSimple(); // Define PublishedDataSet AllTypes PublishedDataSetDataType publishedDataSetAllTypes = CreatePublishedDataSetAllTypes(); //create the PubSub configuration root object PubSubConfigurationDataType pubSubConfiguration = new PubSubConfigurationDataType(); pubSubConfiguration.Connections = new PubSubConnectionDataTypeCollection() { pubSubConnection1 }; pubSubConfiguration.PublishedDataSets = new PublishedDataSetDataTypeCollection() { publishedDataSetSimple, publishedDataSetAllTypes }; return(pubSubConfiguration); }
/// <summary> /// Creates a PubSubConfiguration object for UDP & UADP programmatically. /// </summary> /// <returns></returns> private static PubSubConfigurationDataType CreatePublisherConfiguration_UdpUadp(string urlAddress) { // Define a PubSub connection with PublisherId 1 PubSubConnectionDataType pubSubConnection1 = new PubSubConnectionDataType(); pubSubConnection1.Name = "Publisher Connection1 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 publish on all available local interfaces. address.NetworkInterface = String.Empty; address.Url = urlAddress; pubSubConnection1.Address = new ExtensionObject(address); #region Define WriterGroup1 WriterGroupDataType writerGroup1 = new WriterGroupDataType(); writerGroup1.Name = "WriterGroup 1"; writerGroup1.Enabled = true; writerGroup1.WriterGroupId = 1; writerGroup1.PublishingInterval = 5000; writerGroup1.KeepAliveTime = 5000; writerGroup1.MaxNetworkMessageSize = 1500; writerGroup1.HeaderLayoutUri = "UADP-Cyclic-Fixed"; UadpWriterGroupMessageDataType uadpMessageSettings = new UadpWriterGroupMessageDataType() { DataSetOrdering = DataSetOrderingType.AscendingWriterId, GroupVersion = 0, NetworkMessageContentMask = (uint)(UadpNetworkMessageContentMask.PublisherId | UadpNetworkMessageContentMask.GroupHeader | UadpNetworkMessageContentMask.WriterGroupId | UadpNetworkMessageContentMask.GroupVersion | UadpNetworkMessageContentMask.NetworkMessageNumber | UadpNetworkMessageContentMask.SequenceNumber) }; writerGroup1.MessageSettings = new ExtensionObject(uadpMessageSettings); // initialize Datagram (UDP) Transport Settings writerGroup1.TransportSettings = new ExtensionObject(new DatagramWriterGroupTransportDataType()); // Define DataSetWriter 'Simple' DataSetWriterDataType dataSetWriter1 = new DataSetWriterDataType(); dataSetWriter1.Name = "Writer 1"; dataSetWriter1.DataSetWriterId = 1; dataSetWriter1.Enabled = true; dataSetWriter1.DataSetFieldContentMask = (uint)DataSetFieldContentMask.RawData; dataSetWriter1.DataSetName = "Simple"; dataSetWriter1.KeyFrameCount = 1; UadpDataSetWriterMessageDataType uadpDataSetWriterMessage = new UadpDataSetWriterMessageDataType() { ConfiguredSize = 32, DataSetOffset = 15, NetworkMessageNumber = 1, DataSetMessageContentMask = (uint)(UadpDataSetMessageContentMask.Status | UadpDataSetMessageContentMask.SequenceNumber), }; dataSetWriter1.MessageSettings = new ExtensionObject(uadpDataSetWriterMessage); writerGroup1.DataSetWriters.Add(dataSetWriter1); // Define DataSetWriter 'AllTypes' DataSetWriterDataType dataSetWriter2 = new DataSetWriterDataType(); dataSetWriter2.Name = "Writer 2"; dataSetWriter2.DataSetWriterId = 2; dataSetWriter2.Enabled = true; dataSetWriter2.DataSetFieldContentMask = (uint)DataSetFieldContentMask.RawData; dataSetWriter2.DataSetName = "AllTypes"; dataSetWriter2.KeyFrameCount = 1; uadpDataSetWriterMessage = new UadpDataSetWriterMessageDataType() { ConfiguredSize = 32, DataSetOffset = 47, NetworkMessageNumber = 1, DataSetMessageContentMask = (uint)(UadpDataSetMessageContentMask.Status | UadpDataSetMessageContentMask.SequenceNumber), }; dataSetWriter2.MessageSettings = new ExtensionObject(uadpDataSetWriterMessage); writerGroup1.DataSetWriters.Add(dataSetWriter2); pubSubConnection1.WriterGroups.Add(writerGroup1); #endregion // Define PublishedDataSet Simple PublishedDataSetDataType publishedDataSetSimple = CreatePublishedDataSetSimple(); // Define PublishedDataSet AllTypes PublishedDataSetDataType publishedDataSetAllTypes = CreatePublishedDataSetAllTypes(); //create the PubSub configuration root object PubSubConfigurationDataType pubSubConfiguration = new PubSubConfigurationDataType(); pubSubConfiguration.Connections = new PubSubConnectionDataTypeCollection() { pubSubConnection1 }; pubSubConfiguration.PublishedDataSets = new PublishedDataSetDataTypeCollection() { publishedDataSetSimple, publishedDataSetAllTypes }; return(pubSubConfiguration); }
/// <summary> /// Creates a PubSubConfiguration object for MQTT & UADP programmatically. /// </summary> /// <returns></returns> private static PubSubConfigurationDataType CreatePublisherConfiguration_MqttUadp(string urlAddress) { // Define a PubSub connection with PublisherId 3 PubSubConnectionDataType pubSubConnection1 = new PubSubConnectionDataType(); pubSubConnection1.Name = "Publisher 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 publish 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 WriterGroup1 WriterGroupDataType writerGroup1 = new WriterGroupDataType(); writerGroup1.Name = "WriterGroup 1"; writerGroup1.Enabled = true; writerGroup1.WriterGroupId = 1; writerGroup1.PublishingInterval = 5000; writerGroup1.KeepAliveTime = 5000; writerGroup1.MaxNetworkMessageSize = 1500; writerGroup1.HeaderLayoutUri = "UADP-Cyclic-Fixed"; UadpWriterGroupMessageDataType uadpMessageSettings = new UadpWriterGroupMessageDataType() { DataSetOrdering = DataSetOrderingType.AscendingWriterId, GroupVersion = 0, NetworkMessageContentMask = (uint)(UadpNetworkMessageContentMask.PublisherId | UadpNetworkMessageContentMask.GroupHeader | UadpNetworkMessageContentMask.WriterGroupId | UadpNetworkMessageContentMask.PayloadHeader | UadpNetworkMessageContentMask.GroupVersion | UadpNetworkMessageContentMask.NetworkMessageNumber | UadpNetworkMessageContentMask.SequenceNumber) }; writerGroup1.MessageSettings = new ExtensionObject(uadpMessageSettings); // initialize Broker transport settings writerGroup1.TransportSettings = new ExtensionObject(new BrokerWriterGroupTransportDataType() { QueueName = brokerQueueName, }); // Define DataSetWriter 'Simple' DataSetWriterDataType dataSetWriter1 = new DataSetWriterDataType(); dataSetWriter1.Name = "Writer 1"; dataSetWriter1.DataSetWriterId = 1; dataSetWriter1.Enabled = true; dataSetWriter1.DataSetFieldContentMask = (uint)DataSetFieldContentMask.RawData; dataSetWriter1.DataSetName = "Simple"; dataSetWriter1.KeyFrameCount = 1; UadpDataSetWriterMessageDataType uadpDataSetWriterMessage = new UadpDataSetWriterMessageDataType() { ConfiguredSize = 32, DataSetOffset = 15, NetworkMessageNumber = 1, DataSetMessageContentMask = (uint)(UadpDataSetMessageContentMask.Status | UadpDataSetMessageContentMask.SequenceNumber), }; dataSetWriter1.MessageSettings = new ExtensionObject(uadpDataSetWriterMessage); BrokerDataSetWriterTransportDataType uadpDataSetWriterTransport = new BrokerDataSetWriterTransportDataType() { QueueName = brokerQueueName, MetaDataQueueName = $"{brokerQueueName}/{brokerMetaData}", MetaDataUpdateTime = 60000 }; dataSetWriter1.TransportSettings = new ExtensionObject(uadpDataSetWriterTransport); writerGroup1.DataSetWriters.Add(dataSetWriter1); // Define DataSetWriter 'AllTypes' DataSetWriterDataType dataSetWriter2 = new DataSetWriterDataType(); dataSetWriter2.Name = "Writer 2"; dataSetWriter2.DataSetWriterId = 2; dataSetWriter2.Enabled = true; dataSetWriter2.DataSetFieldContentMask = (uint)DataSetFieldContentMask.RawData; dataSetWriter2.DataSetName = "AllTypes"; dataSetWriter2.KeyFrameCount = 1; uadpDataSetWriterMessage = new UadpDataSetWriterMessageDataType() { ConfiguredSize = 32, DataSetOffset = 47, NetworkMessageNumber = 1, DataSetMessageContentMask = (uint)(UadpDataSetMessageContentMask.Status | UadpDataSetMessageContentMask.SequenceNumber), }; dataSetWriter2.MessageSettings = new ExtensionObject(uadpDataSetWriterMessage); dataSetWriter2.TransportSettings = new ExtensionObject(uadpDataSetWriterTransport); writerGroup1.DataSetWriters.Add(dataSetWriter2); pubSubConnection1.WriterGroups.Add(writerGroup1); #endregion // Define PublishedDataSet Simple PublishedDataSetDataType publishedDataSetSimple = CreatePublishedDataSetSimple(); // Define PublishedDataSet AllTypes PublishedDataSetDataType publishedDataSetAllTypes = CreatePublishedDataSetAllTypes(); //create the PubSub configuration root object PubSubConfigurationDataType pubSubConfiguration = new PubSubConfigurationDataType(); pubSubConfiguration.Connections = new PubSubConnectionDataTypeCollection() { pubSubConnection1 }; pubSubConfiguration.PublishedDataSets = new PublishedDataSetDataTypeCollection() { publishedDataSetSimple, publishedDataSetAllTypes }; return(pubSubConfiguration); }