|
<< Click to Display Table of Contents >> マニュアル > 画面作成ガイド > スクリプト > スクリプトの記述例 > スクリプトからのタグの読み書き |
概要
コントロールに連結してタグの値を読み書きしたい場合は、バインド機能を利用することによりスクリプト無しで簡単に実現できます。一方で、細かな条件文による判断や、一括書き込みが必要な場合は、スクリプトで自由にタグの値の読み書きを行うことができます。
本章では、スクリプトからタグにアクセスして読み込みや書き込みを行うために必要となる基礎知識について説明します。
タグアクセスの手順
■まずAddTagを行う
スクリプトからタグにアクセスするためには、必ず「AddTag」メソッドを呼び出してアクセスするタグの宣言(登録)を行う必要があります。「AddTag」は各オブジェクトから呼び出すことができます。
通常は、「OnInitialize」イベントでAddTagを呼び出してタグを登録します。
■AddTag後に、タグアクセス用のメソッドを呼び出す
AddTagの呼び出し後は、そのタグに対して以下のメソッドが利用できるようになります。
GetVal / ReadVal / WriteVal / ReadRefresh / WriteRefresh / ReadRequestRefresh / WriteRequestRefresh
尚、「AddTag」はオブジェクト毎に行うため、どのオブジェクトに「AddTag」されているのかを意識する必要があります。前述の各メソッドの呼び出しは、「AddTag」を行ったオブジェクトのメソッドとして呼び出す必要がある点に注意してください。例えば、Form01で「AddTag」したタグをGetValで読み込むには、Form01オブジェクトを介して行う必要があります。
また、登録したタグの値が変化すると、「AddTag」を行ったオブジェクトのOnTagValueChangedイベントが呼び出され、タグ値の変化をイベントして検知することができるようになります。
|
バックグラウンドフォームは実行中に常に存在するフォームとして動作するため、スクリプトから頻繁に読み書きが必要なタグがある場合などは、バックグラウンドフォーム上でAddTagを行い、他の利用箇所からはバックグラウンドフォームを介してGetVal等を行うこともできます(ルートオブジェクトでも同様の事が可能です)。詳細は「バックグラウンドフォーム」を参照してください。 |
タグから値取得を行うためのいくつかのメソッドでは、タグのデータソースを指定することができます。
FA-Panelにおけるタグの授受は、デバイス値、サーバキャッシュ、クライアントキャッシュの3つの経路を介して行われます。キャッシュ値はデバイス値によって定期的に更新されます。確実に実デバイスの値を取得したいときはデバイス値から直接取得することも可能ですが、キャッシュから取得することで高いパフォーマンスを得ることができます。
どの経路でタグ値を取得するべきかは、アプリケーションの要件に応じて選択してください。基本的な考え方としては、現時点の最新値を確実に取得する必要がある場合についてのみデバイス値を取得し、そうでない場合にはパフォーマンスを優先してキャッシュ値を取得するようにします。

AddTagの処理例(配列を利用した一括登録)
オブジェクト内で参照したいタグが多数ある場合、一つ一つのタグに対して「AddTag」を呼び出すのは非効率的です。
「AddTag」のパラメータには配列を渡すことができるため、「AddTag」したいタグを配列にまとめて格納しておくことで、「AddTag」の呼び出しは1行の記述みで済むようになります。
例)AddTagしたいタグ名を配列で渡す
// Form01での例
event OnInitialize()
{
var TP = “U01.F01.”; //タグパスの接頭辞
//AddTagしたいタグを配列として定義
var vTags =
c(
TP + “D0000”, TP + “D0001”, TP + “D0002”, TP + “D0003”, TP + “D0004”,
TP + “D0005”, TP + “D0006”, TP + “D0007”, TP + “D0008”, TP + “D0009”,
TP + “M0000”, TP + “M0010”, TP + “M0011”, TP + “M0012”, TP + “M0050”
);
//AddTagに配列で渡す
this.AddTag( vTags );
}
AddTagの処理例(書き込みしか行わないタグ)
「AddTag」の第二引数には、追加したタグの値を取得するか否かのフラグを指定することができます(TRUE:値を取得する,FALSE:値を取得しない。省略するとTRUE扱いとなる)。書き込み処理しか行わないことが明白なタグの場合は、この引数にFALSEを指定することで不要な値取得に伴う処理負荷を軽減できます。
尚、FALSEを指定した場合には、「OnTagValueChanged」イベントも発生しません。
例)値取得を行わないAddTag
// Form01での例
var TP = “U01.F01.”; //タグパスの接頭辞
event OnInitialize()
{
//AddTagしたいタグを配列として定義
var vWriteTags = c( TP + “D0”, TP + “D1”, TP + “D2”, TP + “D3”, TP + “D4” );
//AddTagに配列で渡す(値取得を行わない)
this.AddTag( vWriteTags, F );
}
スクリプトからのタグ読み込み/書き込み
「AddTag」されたタグは、「GetVal」、「WriteVal」などのメソッド呼び出しによって読み書きを行うことができます。
タグ読み込みの際には、ほとんどの場合「GetVal」を使用します。「GetVal」はキャッシュからタグ値を読み込むため処理も高速です(実デバイスの値を読み込みたい場合には「ReadVal」を使用します)。1点のみのタグ書き込みの場合には、「WriteVal」を使用します。
「AddTag」はオブジェクト毎に行うため、どのオブジェクトに「AddTag」されているのかを意識する必要があります。
例)スクリプトからのタグ読み込み/書き込み
// Form01でAddTag
event OnInitialize()
{
//AddTagするタグ
var vTags = c( “$D0”, “$D1”, “$D2”, “$D3” );
//AddTagに配列で渡す
this.AddTag( vTags );
}
// Form01上のBtn01オブジェクト(ボタン)からのタグ読み書き
event OnMouseUp( button )
{
var vWork = 0;
/*
* GetValによるタグ読み込み
*/
if(parent.GetVal(“$D0”) == 1) {
//タグ$D0が1の時、$D1 + $D2を変数に格納
vWork = parent.GetVal(“$D1”) + parent.GetVal(“$D2”);
}
else {
//それ以外の時、$D1 * $D2を変数に格納
vWork = parent.GetVal(“$D1”) * parent.GetVal(“$D2”);
}
/*
* WriteValによるタグ書き込み
*/
if(parent.WriteVal(“$D3”, vWork) == F) {
//エラーが発生するとFalseを返すので、ここにエラー処理を記述する
}
}
|
「GetVal」はクライアントキャッシュからタグの値を取得します。「AddTag」を呼び出して実際にクライアントキャッシュが更新されるまでの間にはタイムラグがあり、「AddTag」を呼び出した直後に「GetVal」を行っても正しく値を取得できない場合があります。そのような処理要件の場合は、「GetVal」を行う前に「ReadRefresh」を呼び出すことによってクライアントキャッシュをリフレッシュすることができます(※但し、「ReadRefresh」の呼び出しによって、システム全体のパフォーマンスに影響を与える可能性があります。利用に際しては慎重に検討してください)。詳細については「ReadRefresh」を参照してください。
|
スクリプトからの一括タグ読み込み/書き込み
配列の利用によって、スクリプトから複数タグを一括で読み込み/書き込みすることができます。例えば、初期化時に複数のタグ値を一括で取得したい、ボタン操作時に複数のパラメータを一括で書き込みたい、といった場面で有効です。単一タグ操作の繰り返しでも同じ結果を得ることができますが、メソッドを発行した回数分だけシステムに負荷が発生するため、一括で処理した方がスマートです。
一括読み込みは「GetVal」で対応可能です。「GetVal」は配列を扱うことが可能で、パラメータを配列で授受することで一括読み込みができます。一括書き込みには「WriteRefresh」を使用します(※「WriteVal」は配列指定できません)。
例)スクリプトからのタグ一括読み込み/一括書き込み
// Form01上のBtn01オブジェクト(ボタン)からのタグ読み書き
event OnMouseUp( button )
{
var vReadTags = c( “$D0”, “$D1”, “$D2”, “$D3” ); //一括読み込みタグ
var vWriteTags = c( “$D10”, “$D11”, “$D12”, “$D13” ); //一括書き込みタグ
var vRecvTags ; //読み込んだタグ値を格納
//AddTagに配列で渡す
this.AddTag( vReadTags );
this.AddTag( vWriteTags, F );
/*
* GetValによる一括タグ読み込み
*/
vRecvTags = this.GetVal(vReadTags);
parent.Label1.Text = vRecvTags[0]; //利用例(ラベル表示)
parent.Label2.Text = vRecvTags[1];
parent.Label3.Text = vRecvTags[2];
parent.Label4.Text = vRecvTags[3];
/*
* WriteRefreshによる一括タグ書き込み
*/
if(this.WriteRefresh(vWriteTags, c(10,20,30,40)) == F) {
/エラーが発生するとFalseを返すので、ここにエラー処理を記述する
}
}