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();
            }
        }