public DataTable QueryTagInterpolatedValues(DateTime queryStart, DateTime queryEnd, uint samples, string tagName) { //int totalSamples = 0; Connect(); if (!IsConnected) { Connect(); } Historian.DataQueryParams query = new Historian.InterpolatedQuery(queryStart, queryEnd, samples, tagName) { Fields = Historian.DataFields.Time | Historian.DataFields.Value | Historian.DataFields.Quality }; Historian.DataSet set = new Historian.DataSet(); query.Criteria.SamplingMode = Historian.DataCriteria.SamplingModeType.Interpolated; sc.IData.Query( ref query, out set, out _); //totalSamples += set.TotalSamples; var tagData = new List <TagData>(); for (int i = 0; i < set[tagName].Count(); i++) { var data = new TagData { TagName = tagName, Value = set[tagName].GetValue(i) == null ? string.Empty : Convert.ToDecimal(set[tagName].GetValue(i)).ToString("N", CultureInfo.GetCultureInfo("hu-HU")), //the decimal separator is dot in the US or UK, etc. (decimal point), comma in Hungary, Germany, etc. Quality = set[tagName].GetQuality(i).ToString(), TimeStamp = set[tagName].GetTime(i).ToString("yyyy.MM.dd. HH:mm:ss") }; tagData.Add(data); } return(Extensions.ConvertToDataTable(tagData)); }
public List <ControlLoopDataModel> QueryControlLoopsTagData(List <ModeTagsDataModel> modeTagsData, DateTime queryStart, DateTime queryEnd) { var controlLoopData = new List <ControlLoopDataModel>(); try { Connect(); if (!IsConnected) { Connect(); } foreach (var modeTagData in modeTagsData) { Historian.DataQueryParams query = new Historian.InterpolatedQuery(queryStart, queryEnd, NumOfSamples, modeTagData.TagName) { Fields = Historian.DataFields.Time | Historian.DataFields.Value | Historian.DataFields.Quality }; Historian.DataSet set = new Historian.DataSet(); query.Criteria.FilterMode = Historian.DataCriteria.FilterModeType.AfterTime; //obviously query.Criteria.SamplingMode = Historian.DataCriteria.SamplingModeType.Interpolated; //we need interpolated sampling query.Criteria.FilterComparisonMode = Historian.DataCriteria.FilterComparisonModeType.GreaterThanEqual; query.Criteria.FilterComparisonValue = ComparisonValue; //fix 70 percent query.Criteria.FilterTag = modeTagData.PlantLoadFilterTagName; //here we filter by a tag what shows the plant (where the control loop is installed) load in percentage sc.IData.Query( ref query, out set, out Historian.ItemErrors errors); //okay, about errors we don't care here... *sad smiley here* if (modeTagData.ConditionFilter) //additional filtering, for example based on running signals of a motor or a value measured by a flow metering instrument out on the field { query.Criteria.FilterMode = Historian.DataCriteria.FilterModeType.AfterTime; query.Criteria.SamplingMode = Historian.DataCriteria.SamplingModeType.Interpolated; query.Criteria.FilterTag = modeTagData.ConditionFilterTagName; query.Criteria.FilterComparisonMode = GetHistFilterType(modeTagData.ConditionFilterType); //filtering comparison mode stroed in the database too, depending on the filter tag query.Criteria.FilterComparisonValue = modeTagData.ConditionFilterValue; sc.IData.Query( ref query, out set, out errors); controlLoopData.Add(ProcessDataSet(set, modeTagData.TagName)); } else { controlLoopData.Add(ProcessDataSet(set, modeTagData.TagName)); } } return(controlLoopData); } catch (Exception ex) { Console.WriteLine("Tag query error: " + ex.Message); throw; } finally { Disconnect(); } }