<< Click to Display Table of Contents >> マニュアル > 画面作成ガイド > スクリプト > スクリプトの記述例 > スクリプトからのタグの読み書き > タグ読み書きのサンプル集 > タグへの書き込み |
概要
スクリプトからタグ値を読み書きする場合、事前に必ず「AddTag」する必要があります。タグ値を書き込む場合、予め「AddTag」したタグについて、「WriteVal」のメソッド呼び出しによって書き込みを行うことができます。
ここでは、タグへ値を書き込むサンプルで解説します。
サンプルのダウンロード
このサンプルは以下に格納されています。
設定
タグ設定
1.「Driver」を右クリックして、「ユニット追加」から仮想デバイスを追加します。
2.追加したユニットの「U01」を右クリックして、フォルダ追加から「F01」を追加します。
3.追加したフォルダの「F01」を右クリックして、タグ「T01」~「T02」を登録します。登録後、タグの「デバイス」を「04-D データレジスタ」で登録します。
ここで利用する仮想デバイスのタグについての詳細は、「仮想デバイス」を参照して下さい。 |
プログラム
書き込み処理を記述します。
※オブジェクトの配置及びプロパティ設定は、サンプルを参照下さい。
1.フォームオブジェクトに以下を記述します。
event OnInitialize() { this.AddTag("U01.F01.T01", F); this.AddTag("U01.F01.T02", T); }
event OnTagValueChanged(tagname,value) { switch(tagname){ case "U01.F01.T01": this.edtRead01.Text = value; break; case "U01.F01.T02": this.edtRead02.Text = value; break; }
} |
2.WriteVal1ボタンオブジェクトに以下を記述します。
event OnMouseUp(button) { if(button == 1){ if(parent.WriteVal("U01.F01.T01", parent.edt01.Text)){ parent.lbl01.Text = "Success"; }else{ parent.lbl01.Text = "Error"; } } } |
3.WriteVal2ボタンオブジェクトに以下を記述します。
event OnMouseUp(button) { if(button == 1){ if(parent.WriteVal("U01.F01.T02", parent.edt02.Text)){ parent.lbl02.Text = "Success"; }else{ parent.lbl02.Text = "Error"; } } } |
解説
フォームオブジェクトの「OnInitialize」でタグの書き込みを行うタグを「AddTag」します。ここでは、タグを個別に「AddTag」しています。
「U01.F01.T01」のタグについては「AddTag」の第2パラメータをFALSE(省略してF)を指定しています。本指定により、書き込みしか行わないタグへのAddTagとなります。詳しくは、「書き込みしか行わないタグのAddTag処理」を参照下さい。
また、「U01.F01.T02」のタグについては「AddTag」の第2パラメータをTRUE(省略してT)を指定しています。本指定により、タグからの値取得も可能となり「OnTagValueChanged」イベントが発生します。
WriteVal1ボタンオブジェクトでは、「WriteVal」を使用して1点のタグに対してエディットボックスの入力値を書き込みます。今回のサンプルでは、「AddTag」はフォームオブジェクトの「OnInitialize」イベント内で行っています。そのタグに値を書き込むので、「WriteVal」は「parent.WriteVal("U01.F01.T01",parent.edt01.Text))」という記述になります。また、タグへ値が正常に書き込み出来たかを判定するには、「WriteVal」の返値で判定できます。
WriteVal1ボタンオブジェクトで値を書き込みしてもフォームオブジェクトの「OnTagValueChanged」イベントは発生しません。WriteVal2ボタンオブジェクトの書き込みでは、同様の処理で「U01.F01.T02」へ書き込みを行っていますが、こちらは「OnTagValueChanged」イベントが発生します。
「this」/「parent」で表現されるオブジェクトの階層構造については、「オブジェクトの階層構造と参照」を参照下さい。 |
「AddTag」の第2パラメータには、追加したタグの値を取得するか否かのフラグを指定することができます(TRUE:値を取得する,FALSE:値を取得しない)。このパラメータを省略するとTRUE扱いとなります。不必要にタグ値を取得する指定を行うと、不要な値取得に伴う処理負荷が発生してしまいます。スクリプトからタグ書き込みしか行わないことが明確な場合は、AddTagの第2パラメータにはFALSEを指定する事を推奨します。
尚、値取得をFALSEとした場合には、「OnTagValueChanged」イベントが発生しないため、無駄なイベント発生を防ぐ効果もあります。
「AddTag」で、値取得をFALSEとした場合、Panel Serverのタグモニタランプが黄色で表示されます。黄色表示は、Panel Browserから「自動更新なし」でタグに接続している状態を表します。値取得をTRUEとした場合は、タグモニタランプは赤色で表示されます。赤色表示は、外部から「自動更新あり」でタグに接続していることを表します。 |
タグ書き込み処理のエラーハンドリング
「WriteVal」や「WriteRefresh」などのタグ書き込みメソッドは、戻り値として書き込み処理の成否をTRUE/FALSEで返してくれます。書き込み処理でエラーが発生しうる可能性としては、通信障害、サーバダウン、あるいはPLC側での問題発生などが考えられます。
実際にシステムを設計する際には、スクリプトからの書き込み処理がエラーとなった場合に、どのようなエラーハンドリングを行うのかをあらかじめ取り決めておくべきです(書き込みのリトライを行う、メッセージを表示する、エラーを無視する、etc)。いずれの場合にせよ、書き込みメソッドを直接呼び出すのではなく、これらのメソッドをオブジェクト内で共通のユーザ定義関数としてラップしておくことで、エラー処理を一箇所にまとめることができます。
•タグ書き込みメソッドのエラーハンドリング例(Form01オブジェクト)
event OnInitialize() { this.AddTag( c( "$D0", "$D1", "$D2") ); //AddTag
if(!WriteValEx("$D0", 100)) { //ここに個別のエラー処理を記述する return; }
if(!WriteValEx("$D1", 150)) { //ここに個別のエラー処理を記述する return; }
if(!WriteValEx("$D2", 200)) { //ここに個別のエラー処理を記述する return; } }
/* * 書き込み処理をラップした共通関数。 * このオブジェクト内でのタグ書き込みは必ずこの関数を呼び出すルールとする */ function WriteValEx(tagname, value) { if(!this.WriteVal(tagname, value)){ /* * ここに、書き込みエラー時の全体的な共通処理を記述する */ return F; } return T; } |