Как я запрашиваю необработанные данные от Историка Proficy?

  1. Можно ли заставить джедая не порождать подпроцессы, а вместо этого запускать его код в том же экземпляре Python, в котором он сам работает? Я не смог найти ничего об этом в документации или в исходном коде, имеющем дело с средами, и, экстраполируя это из обсуждения здесь, я подозреваю, что ответ может быть отрицательным.
  2. Это определенно возможно. Все инструменты есть. Здесь ведутся дискуссии: https://github.com/davidhalter/jedi-vim/issues/870 .

    ИМО нужен патч для джедая, который использует jedi.api.environment.InterpreterEnvironment в некоторых случаях, таких как ваш. Это определенно возможно, это просто глючит в данный момент.

13
задан Michael Haren 20 November 2008 в 19:59
поделиться

3 ответа

Есть несколько различных режимов выборки, с которыми вы можете поэкспериментировать.

  • Исходное
  • Интерполированное
  • Лабораторное
  • Тренд
  • Рассчитанное

Эти режимы доступны с использованием всех следующих API.

  • Пользовательский API (ihuapi.dll)
  • SDK (ihsdk.dll)
  • OLEDB (iholedb.dll)
  • Клиентский API доступа (Proficy.Historian.ClientAccess.API)

Из них тенденция Вероятно, вам нужен режим выборки, поскольку он специально разработан для построения графиков / трендов. Хотя лабораторные и интерполированные тоже могут быть полезны.

Прочтите электронную книгу для получения дополнительной информации о каждом режиме выборки. На моей машине он хранится как C: \ Program Files \ GE Fanuc \ Proficy Historian \ Docs \ iHistorian.chm , и у меня установлена ​​версия 3.5. Обратите особое внимание на следующие разделы.

  • Использование Historian OLE DB Provider
  • Дополнительные темы | Retrieval

Вот как вы можете построить OLEDB для выполнения выборки тренда.

set 
    SamplingMode = 'Trend',
    StartTime = '2010-07-01 00:00:00',
    EndTime = '2010-07-02 00:00:00',
    IntervalMilliseconds = 1h
select 
    timestamp, 
    value, 
    quality 
from 
    ihRawData 
where 
    tagname = 'YOUR_TAG'

Отображение эквивалентных методов с использованием пользовательского API и SDK является сложным (особенно с пользовательским API), поскольку для их настройки требуется много врезки в код. API клиентского доступа новее и негласно использует WCF.

Между прочим, у метода OLEDB есть несколько ограничений.

  • Несмотря на то, что говорится в документации, я никогда не мог заставить работать собственные параметры запроса. Это отличный вариант, если вы хотите использовать его, например, со службами отчетов SQL Server.
  • Вы не можете записывать образцы в архив или каким-либо образом вносить изменения в конфигурацию Historian, включая добавление / изменение тегов, написание сообщений и т. Д.
  • В некоторых случаях это может быть немного медленным.
  • В нем нет условий для перекрестной таблицы нескольких тэгов в столбцы и последующего переноса выборок, чтобы значение существовало для каждой комбинации метки времени и тэга. Режим выборки тренда поможет вам на полпути, но по-прежнему не выполняет перекрестную таблицу и фактически не загружает необработанные выборки. Опять же, User API и SDK не могут этого сделать.
17
ответ дан 1 December 2019 в 22:40
поделиться

Мой коллега соединил это:

В web.config:

<add name="HistorianConnectionString" 
     providerName="ihOLEDB.iHistorian.1" 
     connectionString="
       Provider=ihOLEDB.iHistorian;
       User Id=;
       Password=;
       Data Source=localhost;"
/>

В слое данных:

public DataTable GetProficyData(string tagName, DateTime startDate, DateTime endDate)
{
    using (System.Data.OleDb.OleDbConnection cn = new System.Data.OleDb.OleDbConnection())
    {
        cn.ConnectionString = webConfig.ConnectionStrings.ConnectionStrings["HistorianConnectionString"];
        cn.Open();

        string queryString = string.Format(
                "set samplingmode = rawbytime\n select value as theValue,Timestamp from ihrawdata where tagname = '{0}' AND timestamp between '{1}' and '{2}' and value > 0 order by timestamp",
                tagName.Replace("'", "\""), startDate, endDate);

        System.Data.OleDb.OleDbDataAdapter adp = new System.Data.OleDb.OleDbDataAdapter(queryString, cn);
        DataSet ds = new DataSet();

        adp.Fill(ds);
        return ds.Tables[0];
    }
}

Обновление:

Это работало хорошо, но мы столкнулись с проблемой с тегами, которые не обновляют очень часто. Если бы тег не обновил около запуска или конца требуемого startDate и endDate, то тенденции выглядели бы плохо. Хуже, все еще были случаи, где не было никаких явных точек во время окна, которое требуют - мы не вернем данных.

Я разрешил это путем создания трех запросов:

  1. Предыдущее значение перед датой начала
  2. Точки между startDate и endDate
  3. Следующее значение после endDate

Это - потенциально неэффективный способ сделать это, но Это Работы:

public DataTable GetProficyData(string tagName, DateTime startDate, DateTime endDate)
{
    DataSet ds = new DataSet();
    string queryString;
    System.Data.OleDb.OleDbDataAdapter adp;

    using (System.Data.OleDb.OleDbConnection cn = new System.Data.OleDb.OleDbConnection())
    {
        cn.ConnectionString = proficyConn.ConnectionString;
        cn.Open();

        // always get a start value
        queryString = string.Format(
             "set samplingmode = lab\nselect value as theValue,Timestamp from ihrawdata where tagname = '{0}' AND timestamp between '{1}' and '{2}' order by timestamp",
            tagName.Replace("'", "\""), startDate.AddMinutes(-1), startDate);
        adp = new System.Data.OleDb.OleDbDataAdapter(queryString, cn);
        adp.Fill(ds);

        // get the range
        queryString = string.Format(
             "set samplingmode = rawbytime\nselect value as theValue,Timestamp from ihrawdata where tagname = '{0}' AND timestamp between '{1}' and '{2}' order by timestamp",
            tagName.Replace("'", "\""), startDate, endDate);
        adp = new System.Data.OleDb.OleDbDataAdapter(queryString, cn);
        adp.Fill(ds);

        // always get an end value
        queryString = string.Format(
             "set samplingmode = lab\nselect value as theValue,Timestamp from ihrawdata where tagname = '{0}' AND timestamp between '{1}' and '{2}' order by timestamp",
        tagName.Replace("'", "\""), endDate.AddMinutes(-1), endDate);
        adp = new System.Data.OleDb.OleDbDataAdapter(queryString, cn);
        adp.Fill(ds);

        return ds.Tables[0];
    }
}

И да, я знаю, те запросы должны быть параметризованы.

4
ответ дан 1 December 2019 в 22:40
поделиться

Майкл - в IP21 есть «интерполированная» таблица, а также «фактическая» таблица точек данных. У вас тоже есть что-то?

0
ответ дан 1 December 2019 в 22:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: