#pragma warning disable RECS0154 // Parameter is never used /// <summary> /// Loads the item configuaration. /// </summary> public bool LoadConfiguration(ISystemContext context, ArchiveItem item) #pragma warning restore RECS0154 // Parameter is never used { using (var reader = item.OpenArchive()) { while (!reader.EndOfStream) { var line = reader.ReadLine(); // check for end or error. if (line == null) { break; } // ignore blank lines. line = line.Trim(); if (string.IsNullOrEmpty(line)) { continue; } // ignore commented out lines. if (line.StartsWith("//", StringComparison.CurrentCulture)) { continue; } var dataType = BuiltInType.String; var valueRank = ValueRanks.Scalar; // get data type. if (!ExtractField(1, ref line, out dataType)) { return(false); } // get value rank. if (!ExtractField(1, ref line, out valueRank)) { return(false); } // get sampling interval. if (!ExtractField(1, ref line, out int samplingInterval)) { return(false); } // get simulation type. if (!ExtractField(1, ref line, out int simulationType)) { return(false); } // get simulation amplitude. if (!ExtractField(1, ref line, out int amplitude)) { return(false); } // get simulation period. if (!ExtractField(1, ref line, out int period)) { return(false); } // get flag indicating whether new data is generated. if (!ExtractField(1, ref line, out int archiving)) { return(false); } // get flag indicating whether stepped interpolation is used. if (!ExtractField(1, ref line, out int stepped)) { return(false); } // get flag indicating whether sloped interpolation should be used. if (!ExtractField(1, ref line, out int useSlopedExtrapolation)) { return(false); } // get flag indicating whether sloped interpolation should be used. if (!ExtractField(1, ref line, out int treatUncertainAsBad)) { return(false); } // get the maximum permitted of bad data in an interval. if (!ExtractField(1, ref line, out int percentDataBad)) { return(false); } // get the minimum amount of good data in an interval. if (!ExtractField(1, ref line, out int percentDataGood)) { return(false); } // update the item. item.DataType = dataType; item.ValueRank = valueRank; item.SimulationType = simulationType; item.Amplitude = amplitude; item.Period = period; item.SamplingInterval = samplingInterval; item.Archiving = archiving != 0; item.Stepped = stepped != 0; item.AggregateConfiguration = new AggregateConfiguration { UseServerCapabilitiesDefaults = false, UseSlopedExtrapolation = useSlopedExtrapolation != 0, TreatUncertainAsBad = treatUncertainAsBad != 0, PercentDataBad = (byte)percentDataBad, PercentDataGood = (byte)percentDataGood }; break; } } return(true); }
/// <summary> /// Creates new data. /// </summary> public void CreateData(ArchiveItem item) { // get the data set to use. var dataset = item.DataSet; if (dataset == null) { dataset = CreateDataSet(); } // generate one hour worth of data by default. var startTime = DateTime.UtcNow.AddHours(-1); startTime = new DateTime(startTime.Year, startTime.Month, startTime.Day, startTime.Hour, 0, 0, DateTimeKind.Utc); // check for existing data. if (dataset.Tables[0].Rows.Count > 0) { var index = dataset.Tables[0].DefaultView.Count; var endTime = (DateTime)dataset.Tables[0].DefaultView[index - 1].Row[0]; endTime = startTime.AddMilliseconds(item.SamplingInterval); } var currentTime = startTime; var generator = new Opc.Ua.Test.DataGenerator(null); while (currentTime < DateTime.UtcNow) { var dataValue = new DataValue { SourceTimestamp = currentTime, ServerTimestamp = currentTime.AddSeconds(generator.GetRandomByte()), StatusCode = StatusCodes.Good }; // generate random value. if (item.ValueRank < 0) { dataValue.Value = generator.GetRandom(item.DataType); } else { dataValue.Value = generator.GetRandomArray(item.DataType, false, 10, false); } // add record to table. var row = dataset.Tables[0].NewRow(); row[0] = dataValue.SourceTimestamp; row[1] = dataValue.ServerTimestamp; row[2] = dataValue; row[3] = dataValue.WrappedValue.TypeInfo.BuiltInType; row[4] = dataValue.WrappedValue.TypeInfo.ValueRank; dataset.Tables[0].Rows.Add(row); // increment timestamp. currentTime = currentTime.AddMilliseconds(item.SamplingInterval); } dataset.AcceptChanges(); item.DataSet = dataset; }