<< Click to Display Table of Contents >> マニュアル > 監視システム構築ガイド > サーバロジックの構築 > バックグラウンドで独自のロジックを実行する(SC2) > スクリプトVer2からタグの値変化を検出する |
概要
スクリプトVer2で定周期でタグの値変化を検出し、変化したタグの値に応じた処理を行うサンプルを紹介します。
使用アクション:スクリプトVer2アクション
サンプルのダウンロード
このページで紹介されている作成例には、サンプルが用意されています。
サンプルは以下からダウンロードすることができます。
サーバ設定ファイル:script2_sample05.txt
スクリプトファイル:script.txt
サンプルで使用している各イベントやメソッドの詳細については、コントロールリファレンスを参照してください。 |
動作確認
Panel Serverからサンプルのサーバ設定ファイルを読み込み、アプリケーションをオンラインにしてください(黄色矢印)。
オンライン後、Output01にスクリプトの動作結果がログとして出力されます。
U01.F01.D0000のタグの値を変更すると、D0002に10倍された値が書き込まれます。
同じく、U01.F01.D0001にタグを書き込むと、D0003に10倍された値が書き込まれます。
解説
U01.F01.D0000およびD0001タグの値の変化をモニタリングし、当該タグの値が変化する都度、10倍した値をU01.F01.D0002およびD0003タグに書き込みを行います。
1)初期処理
初期処理はOnInitializeイベントで行います。ここでのポイントは、AddTagメソッドによる登録処理を2回に分けて行っている点です。2回目のAddTagメソッドの呼び出しでは、第二引数に「F」が指定されています。この引数に「F」を指定する事で、タグの値更新が行われない動作となり、OnTagValueChangedの発生を抑止することができます。
また、この例ではグローバル変数を使用し、読み込みを行うタグ、書き込みのみを行うタグを別々の配列として宣言しています。このような記述とすることで、スクリプト内でのタグパスの記述箇所を一か所にまとめることができます。
スクリプト例
var mvMonitorTags = c("U01.F01.D0000","U01.F01.D0001"); var mvWriteTags = c("U01.F01.D0002","U01.F01.D0003"); var mvTagCnt = 0; var mvCnt = 0; event OnInitialize() { ::SvsDump("OnInitialize:" & ::SvsGetActionName()); mvTagCnt = ::GetValueElement(mvMonitorTags, 0); ::AddTag(mvMonitorTags); ::AddTag(mvWriteTags, F); }
処理内容
i.GetValueElementメソッドを使用して、グローバル変数「mvTagCnt」に読み込みを行うタグの要素数を格納しています。この処理の目的は下記にて別途説明します。
ii.AddTagメソッドを用いて、使用するタグの登録を行います。本メソッドは配列を用いることで、一度の呼び出しでまとめて処理することができます。尚、本メソッドの第二引数に「F」を指定すると、タグの値更新が行われない動作となり、OnTagValueChangedの発生を抑止することができます
OnTagValueChangedイベントによる値変化のモニタリングを行う場合、書き込みしか行わないタグ(すなわち、値の変化を検知する必要がないタグ)については、AddTagメソッドの第二引数に「F」を指定するようにします。尚、この引数は省略可能であり、省略すると「T」を渡したものとみなされ、タグの値更新が行われます。 |
2)タグの値の変化を検出し、演算結果をタグに書き込む
AddTagメソッドの第二引数を省略して登録したタグは、タグの値が変化するとOnTagValueChangedイベントが発生します。OnTagValueChangedイベントの引数を介して、対象のタグパス(tagname)と、タグの値(value)を受け取ることができます。
尚、OnTagValueChangedイベントは、タグの値の変化の有無にかかわらず、AddTagが行われた直後に1度発生します。従って、初回のイベントを無視したい場合は、AddTagで登録したタグの個数分、イベントを読み飛ばすような処理記述を行うようにします。このサンプルの手法では、OnInitializeイベント内でAddTagする配列の要素数をグローバル変数に格納しておき、OnTagValueChangedイベント内でイベントの発生回数をカウントして、件数分を無視(return)するように実装しています。
スクリプト例
event OnTagValueChanged(tagname,value) { ::SvsDump("OnTagValueChanged(Tag:" & tagname & " Value:" & ::CStr(value) & ")"); if(mvTagCnt > mvCnt) { mvCnt++; ::SvsDump("Ignore first event."); return; } var vVal = value * 10; if(tagname == "U01.F01.D0000"){ if(::WriteVal("U01.F01.D0002", vVal)){ ::SvsDump("WriteVal " & ::CStr(vVal)& " to U01.F01.D0002"); } else { ::SvsDump("WriteVal failed."); } }else if(tagname == "U01.F01.D0001"){ if(::WriteVal("U01.F01.D0003", vVal)){ ::SvsDump("WriteVal " & ::CStr(vVal)& " to U01.F01.D0003"); } else { ::SvsDump("WriteVal failed."); } } }
処理内容
i.OnTagValueChangedイベントの発生件数をカウントし、OnInitializeイベント内でグローバル変数「mvTagCnt」に格納した件数と比較し、タグの件数になるまでイベントを読み飛ばします。
ii.valueで受け取ったタグ値を10倍し、結果を変数に代入します。
iii.WriteValメソッドを呼び出して、上記で算出した値をタグに対して書き込みます。ここで、tagnameで受け取ったタグパスをチェックし、U01.F01.D0000の場合はD0002に、D0001の場合はD0003に書き込みを行います。
WriteValメソッドは1点のタグ書き込みのみ可能です。複数のタグに一括で書き込みを行いたい場合は、WriteRefreshメソッドを使用します。 |
設定手順
タグの設定
1.スクリプトVer2で使用するタグを追加してください。
ここでは例として、仮想デバイスのユニット「U01」を追加し、以下のタグが登録されているものとします。
U01.F01.D0000
U01.F01.D0001
U01.F01.D0002
U01.F01.D0003
アクションの設定
1.Actionを右クリックしてメニューを表示し、「追加」-「アクション」を選択します。
2.スクリプトVer2アクションを追加します。
ここでは例として、「A01」という名称のアクションが追加されているものとします。
3.追加したアクションのプロパティを開き、スクリプトファイルを選択します。
尚、本来であれば、実行するスクリプトの処理記述をスクリプトファイルに事前に記述しておきます。
今回は例として、サンプルに含まれている「script.txt」を選択します。
イベントの設定
1.追加したアクションをイベントに登録します。
ここでは例として、定周期イベントを選択し、「E01」という名称の1秒周期の定周期イベントを追加します。
定周期イベント「E01」の実行アクションに、先ほど作成したスクリプトVer2アクション「A01」の呼び出しを登録します。パラメータの指定は必要ありません。
この設定により、スクリプトVer2アクション「A01」が1秒周期で実行される動作となります。