TagMonitor.g — monitors DataHub points for changes in quality or failure to change value.
The code for this and other example scripts can be found in the DataHub distribution archive, typically at one of these locations: C:\Program Files\Cogent\OPC DataHub\scripts\ C:\Program Files\Cogent\Cascade DataHub\scripts\ Please refer to Section 3.1, “How to Run a Script” for more information on using scripts. |
/* * This script monitors tags (or DataHub points) for two conditions: * * 1) change of quality * 2) failure to change within a time period * * For each of these, the script creates synthetic points (the "target") * that hold the result of monitoring the watch points. Email and * database events can then be triggered from the synthetic points. * * You can modify the constructor function in this script to change the * point names, or to add additional watch conditions as needed. */ require ("Application"); class TagMonitor Application { } /* * Set up a watch tag and a target tag such that the quality of the * watch tag is copied into the value of the target tag. */ method TagMonitor.copyQuality(poll_seconds, watch, target) { // Ensure that the input and output tags exist. datahub_command(format("(create %s 1)", stringc(watch)), 1); datahub_command(format("(create %s 1)", stringc(target)), 1); // Periodically copy the quality of the watch point into the value of the target .TimerEvery(poll_seconds, `set(#@target, PointMetadata(#@watch).quality)); } /* * Set up a watch tag, a target tag and a time such that the target tag * will be set to 1 if the watch tag has changed within the timer period, * or zero if the watch tag has not changed within the time period. The * time period is specified by dead_seconds, which may be fractional. */ method TagMonitor.copyChangeStatus(dead_seconds, watch, target) { // Ensure that the input and output tags exist. datahub_command(format("(create %s 1)", stringc(watch)), 1); datahub_command(format("(create %s 1)", stringc(target)), 1); // Start the watch point off as having changed setprop(watch, #has_changed, t); // Whenever the watch point changes, set its property "has_changed" to t. .OnChange(watch, `(@self).watchHasChanged(#@watch, #@target)); .TimerEvery(dead_seconds, `(@self).checkChange(#@watch, #@target)); } /* * A callback function that checks for a change in a point and puts a 1 or 0 * into the target. Reset the changed flag to zero. */ method TagMonitor.checkChange(watch, target) { set(target, getprop(watch, #has_changed) ? 1 : 0); setprop(watch, #has_changed, nil); } /* * A callback whenever a change watch point changes. We use this to change from * 0 to 1 as soon as we see a change in a watch point instead of waiting for the * poll delay. */ method TagMonitor.watchHasChanged(watch, target) { setprop(watch, #has_changed, t); set(target, 1); } /* Write the 'main line' of the program here. * * As written, the points to watch for quality and change, as well as the * target points to modify, are all in the "default" domain, as follows: * * Point to watch for quality: default:quality_watch * Point to watch for change: default:change_watch * Target point for quality: default:quality_target * Target point for change: default:change_target * * You can change these to different domain and point names. Also, you can * add any number of other points to monitor quality and change, following * the same syntax. * * The first argument of .copyQuality is the poll rate in seconds on the * quality of the point. The first argument of .copyChangeStatus is the * number of "dead" seconds to wait for a change, before notifiying of * a failure. */ method TagMonitor.constructor () { .copyQuality(1, #$default:quality_watch, #$default:quality_target); .copyChangeStatus(5, #$default:change_watch, #$default:change_target); } /* Any code to be run when the program gets shut down. */ method TagMonitor.destructor () { } /* Start the program by instantiating the class. If your * constructor code does not create a persistent reference to * the instance (self), then it will be destroyed by the * garbage collector soon after creation. If you do not want * this to happen, assign the instance to a global variable, or * create a static data member in your class to which you assign * 'self' during the construction process. ApplicationSingleton() * does this for you automatically. */ ApplicationSingleton (TagMonitor);
Copyright © 1995-2010 by Cogent Real-Time Systems, Inc. All rights reserved.