タグの一括読み込み/書き込み

<< Click to Display Table of Contents >>

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

タグの一括読み込み/書き込み

概要

単一のタグへのアクセス以外にも、スクリプトから複数タグを一括で読み込み/書き込みすることができます。例えば、初期化時に複数のタグ値を一括で取得したい、ボタン操作時に複数のパラメータを一括で書き込みたい、といった場面で有効です。単一タグ操作の繰り返しでも同じ結果を得ることができますが、メソッドを発行した回数分だけシステム・通信に負荷が発生するため、一括で処理した方がスマートです。

 

一括読み込みは「GetVal」で対応可能です。「GetVal」は配列を扱うことが可能で、パラメータを配列で授受することで一括読み込みができます。一括書き込みには「WriteRefresh」を使用します(※「WriteVal」は配列指定できません)。

 

ここでは、タグの一括読み込みと書き込みを行うサンプルで解説します。
 

fap_script_0072

 

このサンプルは以下に格納されています。

 

設定

タグ設定
 

1.「Driver」を右クリックして、「ユニット追加」から仮想デバイスを追加します。
fap_script_0067
 

2.追加したユニットの「U01」を右クリックして、フォルダ追加から「F01」を追加します。
fap_script_0068
 

3.追加したフォルダの「F01」を右クリックして、タグ「T01」~「T08」を登録します。登録後、タグの「デバイス」を「04-D データレジスタ」で登録します。
fap_script_0073
 

hint

ここで利用する仮想デバイスのタグについての詳細は、「仮想デバイス」を参照して下さい。

 

 

プログラム

一括読み込み/書き込み処理を記述します。

※オブジェクトの配置及びプロパティ設定は、サンプルを参照下さい。

 

1.フォームオブジェクトに以下を記述します。

var vUnit = "U01!Alive";

var vTags = c(        "U01.F01.T01",

                 "U01.F01.T02",

                 "U01.F01.T03",

                 "U01.F01.T04",

                 "U01.F01.T05",

                 "U01.F01.T06",

                 "U01.F01.T07",

                 "U01.F01.T08");

 

event OnInitialize()

{

       this.AddTag(vUnit);

       this.ReadRefresh(vUnit, "device");

 

 this.AddTag(vTags);

 this.ReadRefresh(vTags, "device");

}

 

2.GetValボタンオブジェクトに以下を記述します。

event OnMouseUp(button)

{

 if(button == 1){

         var vValues = parent.GetVal(parent.vTags);

         var vCount = ::GetValueTotalElement(vValues);

         

         if(parent.GetVal(parent.vUnit)){

                 for(var i = 0; i < vCount; i++){

                         var vEdtBox = parent.GetChildObj("edt" + ::NS(i + 1, 0, 2, F));

                         vEdtBox.Text = vValues[i];

                 }

         }else{

                 ::MsgBox("Unit Error");

         }

         

 }

}

 

3.WriteRefreshボタンオブジェクトに以下を記述します。

event OnMouseUp(button)

{

 if(button == 1){

         var vWriteValues[8];

         for(var i = 0; i < 8; i++){

                 var vEdtBox = parent.GetChildObj("edt" + ::NS(i + 1, 0, 2, F));

                 vWriteValues[i] = ::CNum(vEdtBox.Text);

         }

 

         if(!parent.WriteRefresh(parent.vTags, vWriteValues)){

                 ::MsgBox("WriteRefresh Error");

         }

 }

}

 

 

解説

フォームオブジェクトの「OnInitialize」でタグの読み書きを行うタグを「AddTag」します。ここでは、一括読み書きするタグを配列で「AddTag」しています。また、「U01!Alive」を「AddTag」していますが、これはユニット「U01」の生存状態を取得出来るシステムプロパティです。「AddTag」後に「ReadRefresh」を呼び出していますが、これは起動直後のクライアントキャッシュを更新する処理になります。

 

GetValボタンオブジェクトでは、「GetVal」を使用して複数のタグを一括で読み出しします。読み出した後のforループ処理にてエディットボックスに読み出した値を設定しています。また、タグの値が正常に読み込めるかを、「U01」の生存状態を取得出来るシステムプロパティを「GetVal」で取得し判定しています。

 

WriteRefreshボタンオブジェクトでは、一括で書き込みたい値の配列を用意して、「WriteRefresh」により値を書き込みます。また、タグへ値が正常に書き込み出来たかを判定するには、「WriteRefresh」の返値で判定できます。

 

 

hint

「this」/「parent」で表現されるオブジェクトの階層構造については、「オブジェクトの階層構造と参照」を参照下さい。