<< Click to Display Table of Contents >> マニュアル > 監視システム構築ガイド > サーバロジックの構築 > バックグラウンドで独自のロジックを実行する(SC2) > スクリプトVer2から定周期でタグにアクセスする |
概要
スクリプトVer2で定周期でタグを読み込み、タグ同士の演算結果を別のタグに書き込むサンプルを紹介します。
使用アクション:スクリプトVer2アクション
サンプルのダウンロード
このページで紹介されている作成例には、サンプルが用意されています。
サンプルは以下からダウンロードすることができます。
サーバ設定ファイル:script2_sample04.txt
スクリプトファイル:script.txt
サンプルで使用している各イベントやメソッドの詳細については、コントロールリファレンスを参照してください。 |
動作確認
Panel Serverからサンプルのサーバ設定ファイルを読み込み、アプリケーションをオンラインにしてください(黄色矢印)。
オンライン後、Output01にスクリプトの動作結果がログとして出力されます。
U01.F01.SD0000とSD0001の各タグの値を加算した値が、U01.F01.D0000に5秒毎に書き込まれることを確認してください。
解説
U01.F01.SD0000およびSD0001タグの値を5秒の定周期で読み込み、各タグの値を加算した結果を、U01.F01.D0000タグに書き込みを行います。
1)初期処理
初期処理はOnInitializeイベントで行います。ここでのポイントは、スクリプトからタグにアクセスする際には、必ずAddTagメソッドを使用してタグの登録を行う必要がある点です。また、処理の開始後にすぐにタグの値を読み込みたい場合などは、AddTagの後にReadRefreshメソッドを呼び出すことにより、タグの値をリフレッシュするようにします。
スクリプト例
event OnInitialize() { ::SvsDump("OnInitialize:" & ::SvsGetActionName()); ::AddTag(c("U01.F01.D0000", "U01.F01.SD0000", "U01.F01.SD0001")); ::ReadRefresh(c("U01.F01.SD0000", "U01.F01.SD0001")); ::SetTimer(0, 5000, -1); }
処理内容
i.AddTagメソッドを用いて、使用するタグの登録を行います。本メソッドは配列を用いることで、一度の呼び出しでまとめて処理することができます。
ii.ReadRefreshメソッドを呼び出してタグの値を更新します。無駄な更新処理による負荷を避けるために、読み込みを行うタグのみ更新するようにします。
iii.SetTimerでタイマーのセットを行います。この例では5000ミリ秒(5秒)のタイマーを、実行回数を無制限(-1)としてセットしているため、5秒周期でOnTimerイベントが繰り返し発生するようになります。
Panel Serverのオンライン直後は、さまざなな処理が段階的に動作していきます。例えば、PLCと通信を行うタグについても、通信ドライバが初回の値を取得するまでの間は、値が読み込まれる前の状態(タグのステータスがUNCEARTAINの状態)となります。スクリプトの処理記述でタグの値を読み込んで処理を行うような場合は、タグの値が更新されるように、ReadRefreshメソッドによって明示的にタグの値を更新するようにすると安全です。ReadRefreshメソッドには省略可能な引数があり、タグの値をどこから取得するかを指定することができます(デバイス値か、サーバキャッシュ値か。省略するとサーバキャッシュ値となる)。この引数は用途にあわせて適切な引数を指定するようにしてください。尚、ReadRefreshメソッドでデバイス値を指定して頻繁に呼び出しを行うと、タグの更新周期全体に影響を及ぼす可能性があります。従って、ReadRefreshメソッドは繰り返し処理の中で毎回実行するのではなく、処理の初期化のタイミングや、実際のタグ値が確実に欲しい場面などに限定して呼び出すようにしてください。 |
2)定周期で2点のタグを読み込み、演算結果をタグに書き込む
5秒周期で発生するOnTimerイベント内で、GetValメソッドを呼び出してU01.F01.SD0000、SD0001のタグの読み込みを行い、読み込んだタグの値を加算してWriteValメソッドでD0000タグに書き込みます。
スクリプト例
event OnTimer(timerid,counter) { ::SvsDump("OnTimer Id:" & ::CStr(timerid) & " counter:" & ::CStr(counter)); var vVals = ::GetVal(c("U01.F01.SD0000", "U01.F01.SD0001")); var vVal = vVals[0] + vVals[1]; if(::WriteVal("U01.F01.D0000", vVal)){ ::SvsDump("WriteVal " & ::CStr(vVal)& " to U01.F01.D0000"); } else { ::SvsDump("WriteVal failed."); } }
処理内容
i.GetValメソッドは複数のタグの読込みを1回でまとめて処理することができます。複数のタグのタグパスを配列で渡す事により、各タグの値を配列として受け取ることができます。この例では2点のタグを一括で読み込みます。
ii.GetValで受け取った結果を加算し、結果を変数に代入します。
iii.WriteValメソッドを呼び出して、上記で加算した値をD0000に対して書き込みます。本メソッドは成功するとTRUEを返します。この例では、書き込み処理が成功したか否かにより、SvsDumpメソッドのログ出力内容を切り替えています。
WriteValメソッドは1点のタグ書き込みのみ可能です。複数のタグに一括で書き込みを行いたい場合は、WriteRefreshメソッドを使用します。 |
設定手順
タグの設定
1.スクリプトVer2で使用するタグを追加してください。
ここでは例として、仮想デバイスのユニット「U01」を追加し、以下のタグが登録されているものとします。
U01.F01.D0000
U01.F01.SD0000
U01.F01.SD0001
尚、仮想デバイスのSDタグは特種レジスタと呼ばれるタグで、自動的に値が変化するタグです。
アクションの設定
1.Actionを右クリックしてメニューを表示し、「追加」-「アクション」を選択します。
2.スクリプトVer2アクションを追加します。
ここでは例として、「A01」という名称のアクションが追加されているものとします。
3.追加したアクションのプロパティを開き、スクリプトファイルを選択します。
尚、本来であれば、実行するスクリプトの処理記述をスクリプトファイルに事前に記述しておきます。
今回は例として、サンプルに含まれている「script.txt」を選択します。
イベントの設定
1.追加したアクションをイベントに登録します。
ここでは例として、定周期イベントを選択し、「E01」という名称の1秒周期の定周期イベントを追加します。
定周期イベント「E01」の実行アクションに、先ほど作成したスクリプトVer2アクション「A01」の呼び出しを登録します。パラメータの指定は必要ありません。
この設定により、スクリプトVer2アクション「A01」が1秒周期で実行される動作となります。