Proficy Historian/iHistorian から生の時系列データを取得するにはどうすればよいですか?
理想的には、2 つの日付の間の特定のタグのデータを要求します。
さまざまなサンプリング モードを試すことができます。
これらのモードは、次のすべての API を使用して利用できます。
これらのうち、トレンド サンプリング モードは、チャート作成/トレンド分析用に特別に設計されているため、おそらく必要なものです。ただし、lab と interpolated も同様に役立つ場合があります。
各サンプリング モードの詳細については、電子ブックを参照してください。私のマシンでは、C:\Program Files\GE Fanuc\Proficy Historian\Docs\iHistorian.chm
バージョン 3.5 がインストールされています。以下のセクションに特に注意してください。
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 方式にはいくつかの制限があります。
私の同僚はこれをまとめました:
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 つのクエリを作成しました。
これは潜在的に非効率的な方法ですが、うまくいきます:
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];
}
}
もちろん、これらのクエリはパラメーター化する必要があります。
Michael--IP21 には、「実際の」データ ポイント テーブルだけでなく、「補間」テーブルもあります。Proficyにもそれはありますか?