LogFile.g — logs data to a text file when a point changes 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 shows how to log data to a text file. It uses a trigger point * to signal an alarm condition (non-zero), which causes a value to be written * to the file. * * To use this script with your points, replace 'default:triggerpt' in the LogFile * class with your trigger point, and replace 'default:loggedpt' with the point * whose value you wish to log. You can also change the name of the log file. */ /* All user scripts should derive from the base "Application" class */ require ("Application"); /* Get the Gamma library functions and methods for ODBC and/or * Windows programming. Uncomment either or both. */ require ("WindowsSupport"); //require ("ODBCSupport"); /* Applications share the execution thread and the global name * space, so we create a class that contains all of the functions * and variables for the application. This does two things: * 1) creates a private name space for the application, and * 2) allows you to re-load the application to create either * a new unique instance or multiple instances without * damaging an existing running instance. */ class LogFile Application { // The trigger point whose value determines when logging takes place. trigger = #$default:triggerpt; // The point whose value gets logged. logged = #$default:loggedpt; // The name of the log file. log_file_name = "c:/tmp/logfile.txt"; // The file handle to the open file log_file; } /* * This method writes the trigger value and the logged point value * for alarm conditions and non-alarm conditions. The first argument * is the actual value of the trigger point, and the second is the * symbolic name of the point to be logged. */ method LogFile.AlarmOccurred(triggervalue, !logpoint) { local value = eval (logpoint); if (triggervalue != 0) { writec (.log_file, format ("Alarm: %-20s = %10g\n", string(logpoint), value)); princ ("Alarm condition: ", logpoint, ", ", value, "\n"); } else { writec (.log_file, format ("Cleared: %-20s = %10g\n", string(logpoint), value)); princ ("No alarm: ", logpoint, ", ", value, "\n"); } flush (.log_file); } /* Write the 'main line' of the program here. */ method LogFile.constructor () { /* If the trigger and logged points don't exist in the DataHub, create them.*/ datahub_command (string ("(create ", .trigger, " 1)"), 1); datahub_command (string ("(create ", .logged, " 1)"), 1); /* Attempt to open the log file. */ .log_file = open (.log_file_name, "a"); if (!.log_file) { MessageBox (0, string ("Could not open alarm log file: ", .log_file_name), "Error opening file", 0); } else { /* Log the data whenever the trigger point changes. */ .OnChange (.trigger, `(@self).AlarmOccurred (value, @.logged)); } } /* Any code to be run when the program gets shut down. */ method LogFile.destructor () { if (.log_file) close (.log_file); } /* 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 (LogFile);
Copyright © 1995-2010 by Cogent Real-Time Systems, Inc. All rights reserved.