# タグ値の読み書き

マニュアル > 画面作成ガイド > スクリプト > スクリプトの書き方 > # タグ値の読み書き |

タグアクセスの概要

スクリプトからタグにアクセスするためには、必ずAddTagメソッドを呼び出してアクセスするタグの宣言（登録）を行う必要があります。AddTagは各オブジェクトから呼び出すことができます。通常は、OnInitializeイベントでタグを登録します。

AddTagの呼び出し後は、そのタグに対して下記のメソッドが利用できるようになります。

GetVal / ReadVal / WriteVal / ReadRefresh / WriteRefresh /

ReadRequestRefresh / WriteRequestRefresh

尚、AddTagはオブジェクト毎に行うため、どのオブジェクトにAddTagされているのかを意識する必要があります。上記の各メソッドの呼び出しは、AddTagを行ったオブジェクトのメソッドとして呼び出す必要がある点に注意してください。例えば、Form01でAddTagしたタグをGetValで読み込むには、Form01オブジェクトを介して行う必要があります。

また、登録したタグの値が変化すると、AddTagを行ったオブジェクトのOnTagValueChangedイベントが呼び出され、タグ値の変化をイベントして検知することができるようになります。

| バックグラウンドフォームは実行中に常に存在するフォームとして動作するため、スクリプトから頻繁に読み書きが必要なタグがある場合などは、バックグラウンドフォーム上でAddTagを行い、他の利用箇所からはバックグラウンドフォームを介してGetVal等を行うこともできます（ルートオブジェクトでも同様の事が可能です）。詳細は「バックグラウンドフォーム」を参照してください。

クライアントキャッシュとサーバキャッシュ

タグから値取得を行うためのいくつかのメソッドでは、タグのデータソースを指定することができます。

FA-Panelにおけるタグの授受は、デバイス値、サーバキャッシュ、クライアントキャッシュの３つの経路を介して行われます。キャッシュ値はデバイス値によって定期的に更新されます。確実に実デバイスの値を取得したいときはデバイス値から直接取得することも可能ですが、キャッシュから取得することで高いパフォーマンスを得ることができます。

どの経路でタグ値を取得するべきかは、アプリケーションの要件に応じて選択してください。基本的な考え方としては、現時点の最新値を確実に取得する必要がある場合についてのみデバイス値を取得し、そうでない場合にはパフォーマンスを優先してキャッシュ値を取得するようにします。

AddTagの処理例（配列を利用した一括登録）

オブジェクト内で参照したいタグが多数ある場合、一つ一つのタグに対してAddTagを呼び出すのは非効率的です。

AddTagのパラメータには配列を渡すことができるため、AddTagしたいタグを配列にまとめて格納しておくことで、AddTagの呼び出しは１行の記述みで済むようになります。

例）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の第二引数には、Addしたタグの値を取得するか否かのフラグを指定することができます（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を返すので、ここにエラー処理を記述する
    	}
    }