FixQuality.g — changes point quality for OPC clients that treat bad quality as a disconnection.
![]() | 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 application monitors a set of points in the "input domain" and copies
* them to the "output domain". If the quality of the input point is not
* GOOD, then the script modifies the point value to -1 and the quality to
* GOOD. This is to handle an OPC client that treats bad quality as a
* disconnection.
*
* To configure this application, modify the class variables:
* domain_in = the name of the input domain
* domain_out = the name of the output domain
* value_if_bad = the value to substitute on the point if the quality is bad
* If this is nil, then do no value substitution.
*/
require ("Application");
class FixQuality Application
{
domain_in = "test";
domain_out = "test2";
value_if_bad = -1;
}
/* Monitor a point. This includes creating the point if it does not exist,
* and then creating the output domain's mirror of the point. This function
* also sets up an event handler to map any future changes of the point into
* the output domain. */
method FixQuality.Monitor (ptname)
{
local outname, ptsym;
outname = string(.domain_out, ":", ptname);
ptname = string(.domain_in, ":", ptname);
.OnChange(symbol(ptname), `(@self).BridgeQuality(#@ptname, #@outname));
datahub_command(format("(create %s 1)", stringc(ptname)), 1);
ptsym = symbol(ptname);
if (!undefined_p(eval(ptsym)))
.BridgeQuality(ptname, outname);
}
/* This is the function that does the work of mapping from the input domain
* to the output domain. */
method FixQuality.BridgeQuality(ptname, outname)
{
local info = PointMetadata(symbol(ptname));
local value = info.value;
if (info.quality != OPC_QUALITY_GOOD && .value_if_bad)
value = .value_if_bad;
datahub_write(outname, value, 1, OPC_QUALITY_GOOD, info.timestamp);
}
method FixQuality.MonitorDomain(domain)
{
local points = datahub_points(domain, nil);
with point in points do
{
.Monitor(point.name);
}
}
/* This is the mainline of the program. You can either call .Monitor("pointname") for
* each point, or you can call .MonitorDomain(.domain_in) to monitor all existing points
* in the input domain. If you choose to monitor the whole domain, you must re-run
* this application whenever new points are added to the domain. */
method FixQuality.constructor ()
{
.Monitor("point001");
.Monitor("point002");
.MonitorDomain(.domain_in);
}
/* Any code to be run when the program gets shut down. */
method FixQuality.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 (FixQuality);
Copyright © 1995-2010 by Cogent Real-Time Systems, Inc. All rights reserved.