13

Proficy Historian/iHistorian から生の時系列データを取得するにはどうすればよいですか?

理想的には、2 つの日付の間の特定のタグのデータを要求します。

4

4 に答える 4

17

さまざまなサンプリング モードを試すことができます。

  • 補間
  • 研究室
  • 傾向
  • 計算済み

これらのモードは、次のすべての API を使用して利用できます。

  • ユーザー API (ihuapi.dll)
  • SDK (ihsdk.dll)
  • OLEDB (iholedb.dll)
  • クライアント アクセス API (Proficy.Historian.ClientAccess.API)

これらのうち、トレンド サンプリング モードは、チャート作成/トレンド分析用に特別に設計されているため、おそらく必要なものです。ただし、lab と interpolated も同様に役立つ場合があります。

各サンプリング モードの詳細については、電子ブックを参照してください。私のマシンでは、C:\Program Files\GE Fanuc\Proficy Historian\Docs\iHistorian.chmバージョン 3.5 がインストールされています。以下のセクションに特に注意してください。

  • Historian OLE DB プロバイダーの使用
  • 高度なトピック | 検索

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 Reporting Services で使用する場合、これは目を見張るものがあります。
  • サンプルをアーカイブに書き込んだり、タグの追加/変更、メッセージの書き込みなど、Historian の構成を変更したりすることはできません。
  • 場合によっては、少し遅くなることがあります。
  • 複数のタグ名を列にクロス集計してからサンプルを繰り越して、タイムスタンプとタグの組み合わせごとに値が存在するようにする機能はありません。トレンド サンプリング モードでは途中までしか到達できませんが、それでもクロス集計は行われず、生のサンプルは実際にはロードされません。また、ユーザー API と SDK もこれを行うことができません。
于 2010-07-23T16:45:39.797 に答える
4

私の同僚はこれをまとめました:

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 の開始または終了の近くでタグが更新されなかった場合、傾向は悪く見えます。さらに悪いことに、要求されたウィンドウ中に明示的なポイントがない場合もありました。データが返されませんでした。

これを解決するには、次の 3 つのクエリを作成しました。

  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];
    }
}

もちろん、これらのクエリはパラメーター化する必要があります。

于 2008-11-20T19:59:48.010 に答える
0

Michael--IP21 には、「実際の」データ ポイント テーブルだけでなく、「補間」テーブルもあります。Proficyにもそれはありますか?

于 2010-02-01T02:46:26.377 に答える