<< Click to Display Table of Contents >> マニュアル > 監視システム構築ガイド > 主要機能の構築 > ロギング/トレンドグラフ > ヒストリカルデータサーバの利用 > ログデータをスクリプトから取得する |
概要
ここでは、「ヒストリカルデータコントロール」によるログデータの利用について説明します。
ヒストリカルデータコントロールを用いると、対象のアクションに対してスクリプトから接続を行い、検索条件(例えば、取得対象のデータソース、日時の範囲、最大件数など)を指定してログデータを取得することができます。取得したログデータは、グリッドやチャートに表示したり、独自の集計演算処理などに利用したりすることができます。
サンプルのダウンロード
このページで紹介されている作成例には、サンプルが用意されています。
サンプルは以下からダウンロードすることができます。
上記のサンプルプロジェクトには、以下のようなサンプル画面が実装されています。
(サンプルの画面イメージ)
このサンプル画面では、ヒストリカルデータコントロールを利用してログデータを取得して画面中央のグリッドコントロールに表示するとともに、取得した各フィールドのログデータの平均値を算出して、画面の右側のラベルに表示します。
また、サーバ側の設定として、あらかじめ「A01」としてヒストリカルデータサーバ(CSV)アクションが登録されています。このヒストリカルデータサーバは、サンプルに含まれているCSVファイルをマッピングするように設定されており、時刻フィールドの「F01」以降に、「DATA1」から「DATA8」までのフィールドが定義されています。
本サンプルに含まれているCSVファイルは以下のとおりです。
((プロジェクトフォルダ)\server_data\import)
(CSVファイルのイメージ)
サンプルの動作確認
それでは、実際にサンプルを動作させてみましょう。
Panel Serverの画面上部にあるオンライン(黄矢印)をクリックしてください。
Panel Serverを起動したら、Panel Browserを実行して、サンプル画面を表示してください。
まず、画面上部の右にある「範囲読込」ボタンをクリックしてみてください。
すると、グリッドに対象のログデータが表示されるとともに、画面右側のラベルに各列の平均値が表示されました。
また、グリッドに表示されたデータは、表示範囲指定のエディットボックスに指定されている日時の範囲となっています。
続いて、「最大件数」を10に変更し、「直近データ読込」ボタンをクリックしてみてください。
すると、グリッド上のログデータが最新の10件のみとなりました。
続いて、「最大件数」は10のままで、日付の範囲を「2018/9/12 05:00:00」と「2018/9/12 05:59:59」の1時間分に変更し、「範囲読込」ボタンをクリックしてみてください。
すると、グリッド上のログデータは、表示範囲で指定された期間内の先頭10件のみになりました。
続いて、日付の範囲はそのままで、最大件数を3600に変更し、「範囲読込」ボタンをクリックしてみてください。
すると、グリッド上には表示範囲で指定された1時間分の全てのデータが表示されました(※1秒周期ログのため、1時間の最大件数は60秒*60分で3600件となります)。
このように、ヒストリカルデータコントロールを使うことで、サーバからログデータを取得して画面上で利用することができます。
機能解説
以下に、サンプルに実装されているスクリプトについて、主な処理内容について説明します。
Panel Editorでサンプルプロジェクトを開き、Userフォルダの下にある「Form01」フォームを選択してください。
フォームの右上に「HistoricalData」と表示されているグレーの四角形のオブジェクトが、ヒストリカルデータコントロールです。このように、編集中は見ることができます。
■オブジェクト名(Nameプロパティ)
スクリプトから参照する必要のあるオブジェクトには、Nameプロパティに名前を付ける必要があります。以下は、ミニプロパティボックスにNameプロパティを表示した状態です。
名前が付与されている各オブジェクトの名称は以下のように設定されています。
•最大件数エディット:edtMax
•日時範囲(開始)エディット:edtFrom
•日時範囲(終了)エディット:edtTo
•ヒストリカルデータコントロール:HDClient
•データ表示用グリッド:Grid
•平均値表示用ラベル:lblData1 ~ lblData8
■ヒストリカルデータコントロールのスクリプト
ヒストリカルデータコントロールのOnInitializeイベントには、以下の処理が記述されています。
OnInitializeイベントは、初期化時に一度だけ実行されます。
event OnInitialize() { var vFields = c("A01.DATA1","A01.DATA2","A01.DATA3","A01.DATA4", "A01.DATA5","A01.DATA6","A01.DATA7","A01.DATA8");
this.AddField(vFields);
if (!this.Connect()) { ::OpenMsg("接続に失敗しました"); } } |
まず、AddFieldメソッドにより、サーバにログデータを要求するフィールド名を配列で指定します。フィールド名の指定では、A01.DATA1などのように「アクション名.フィールド名」の書式で指定します。そして、AddFieldを実行した後に、必ずConnectメソッドを呼び出します。
Connectメソッドの呼び出しにより、サーバ側に「A01」として登録されているヒストリカルデータサーバ(CSV)アクションに接続が行われます。
ヒストリカルデータコントロールのプロパティ、メソッド、イベントに関する詳細については、コントロールリファレンスの「ヒストリカルデータコントロール」を参照してください。 |
ヒストリカルデータコントロールで指定するフィールド名の書式指定では、サマリアクションについてはA01.RAW::DATA1などのように「アクション名.サマリ名::フィールド名」の書式で指定します。その他のアクション(ロガーアクション、ヒストリカルデータサーバアクション)については、A01.DATA1などのように「アクション名.フィールド名」の書式で指定します。 |
■グリッドコントロールのスクリプト
グリッドには以下の処理が記述されています。
event OnInitialize() { this.Cols = 9; this.Rows = 0 ; this.SetColWidth(0, 160); }
function fncRefresh(vDate, vValue) { this.SetTableData(vValue, 1); this.SetColData(0, ::CTimeStr(vDate), FALSE);
parent.lblData1.Text = ::Math.Ave(vValue[0, ]); parent.lblData2.Text = ::Math.Ave(vValue[1, ]); parent.lblData3.Text = ::Math.Ave(vValue[2, ]); parent.lblData4.Text = ::Math.Ave(vValue[3, ]); parent.lblData5.Text = ::Math.Ave(vValue[4, ]); parent.lblData6.Text = ::Math.Ave(vValue[5, ]); parent.lblData7.Text = ::Math.Ave(vValue[6, ]); parent.lblData8.Text = ::Math.Ave(vValue[7, ]); } |
OnInitializeイベントでは、グリッド表示の列数、表示幅などの初期化処理を行っています。
ユーザー定義関数として「fncRefresh」を定義し、グリッドの表示更新処理を実装しています。引数vDateにはログデータの時刻フィールドの値を1次元配列で渡し、引数vValueには、ログデータの値フィールドの値を2次元配列で渡します。
このユーザー定義関数が呼び出されると、SetTableDataメソッドおよびSetColDataメソッドを呼び出してグリッドにログデータを流し込んで表示します。また、vValueの配列の情報を列単位でMath.Aveメソッドに渡して平均値を求めて、lblData1などの表示用ラベルのTextプロパティに代入しています。
尚、上記のfncRefresh関数は、「直近データ読込」ボタンおよび「範囲読込」ボタンのスクリプトから呼び出されるように実装されています。
グリッドコントロールのプロパティ、メソッド、イベントに関する詳細については、コントロールリファレンスの「グリッドコントロール」を参照してください。 |
■直近データ読込ボタンのスクリプト
このボタンには以下の処理が記述されています。
event OnMouseUp(button) { var vCount, vDate, vValue;
if (!parent.HDClient.ReadHistoricalData("future", T, "past", T, parent.edtMax.Text, vCount, vDate, vValue)) { ::OpenMsg("読み込みに失敗しました"); return; }
parent.Grid.fncRefresh(vDate, vValue); } |
このボタンのOnMouseUpイベントでは、ReadHistoricalDataメソッドによりヒストリカルデータコントロールを介したログデータの読み込み要求を行っています。ヒストリカルデータサーバから受け取った日付フィールド(vDate)およびログデータ(vValue)を、グリッドに実装されているユーザー定義関数「fncRefresh」に渡して呼び出すことで、グリッドと平均値の更新を行います。
ReadHistoricalDataメソッドはヒストリカルデータコントロールのメソッドです。引数の仕様は以下のとおりです。
ReadHistoricalData( |
|
StartTime, |
・・・取得したいデータの開始時刻。”future” で最も未来の日時。 |
bIncludeStartTime, |
・・・開始時刻のレコードを含めるか否か(T/F)。 |
bIncludeStartTime, |
・・・取得したいデータの終了時刻。”past” で最も過去の日時。 |
bIncludeEndTime, |
・・・終了時刻のレコードを含めるか否か(T/F)。 |
MaxRecord, |
・・・最大レコード件数のリミット。 |
&Count, |
・・・最大レコード件数のリミット。 |
&DateTime, |
・・・取得したレコードの時刻フィールドを変数で受け取る。 |
&Data |
・・・取得したレコードの値フィールドを変数で受け取る。 |
) |
上記のスクリプトでは、StartTimeに”future”、EndTimeに”past”を固定的に指定しています。これらは特別なキーワードとなっており、全ての期間のレコードからMaxRecordで指定した件数分取得します。未来(つまり、直近)から過去に向かって遡って検索が行われるため、結果として、存在するログデータの最新レコードから指定件数分の直近データが取得される事となります。
また、上記では、MaxRecordにparent.edtMax.Textを指定しています。この記述により、edtMaxテキストボックスに入力されている値が件数のリミット値として採用されます。
vDateTimeにはvDate変数を指定しています。これにより、時刻フィールドの取得結果がvDateに格納されます。
vDataにはvValue変数を指定しています。これにより、値フィールドの取得結果がvValueに格納されます。
■範囲読込ボタンのスクリプト
このボタンには以下の処理が記述されています。
event OnMouseUp(button) { var vCount, vDate, vValue;
if (!parent.HDClient.ReadHistoricalData(parent.edtFrom.Text, T, parent.edtTo.Text, T, parent.edtMax.Text, vCount, vDate, vValue)) { ::OpenMsg("読み込みに失敗しました"); return; }
parent.Grid.fncRefresh(vDate, vValue); } |
このボタンのOnMouseUpイベントでは、ReadHistoricalDataメソッドによりヒストリカルデータコントロールを介したログデータの読み込み要求を行っています。直近データ読込ボタンの処理と同様に、ログデータの取得結果をグリッドの「fncRefresh」に渡してグリッドと平均値の更新を行っています。
このボタンと直近データ読込ボタンの処理内容との違いとしては、ReadHistoricalDataメソッドに渡す引数のうち、StartTimeにはparent.edtFrom.Textを、EndTimeにはparent.edtTo.Text を指定している点です。これにより、2つのエディットボックスで指定された日付範囲による検索が行われます。
また、MaxRecord引数にはparent.edtMax.Textを指定しているため、範囲指定検索においてもedtMaxテキストボックスに入力されている値が件数の上限値として採用されます。