A DataHub script has complete access to all the data in the DataHub instance. Every point in the DataHub instance is available in the Gamma engine as a global variable, with the syntax:
$domain_name:point_name
The dollar sign character ($) tells the Gamma engine that the
colon is part of the variable name. A colon in the Gamma language is normally a
syntactic element and can't be used in a variable name. However, the DataHub program
uses a colon (:) in point names to separate the domain name from
the rest of the point name. So we need to use the dollar sign. The dollar sign is
not part of the variable name.
![]() | |
For these examples, ensure that the DataSim program is running and connected to the DataHub instance. |
To start with, here's how to read a value one time.
Create a new script with a class named AccessData,
selecting . Here's how.
Scroll down to the .constructor method, and enter the
following:
method AccessData.constructor ()
{
princ("The sine is: ", $DataSim:Sine, "\n");
}Make sure the DataSim program is running, and that the Script Log is open so you'll be able to see the script output.
Click the blue arrow icon
in the Script Editor toolbar. You should see a value
appear in the Script Log window, like this:

Click the blue arrow icon several more times. Each time, a new value should appear in the Script Log. The values will differ because the value for the sine wave in DataSim is constantly changing.
Getting a single value from the DataHub instance is fine, but we can do much better. Let's print each new value from a point every time it changes.
First you should move the princ statement out of the
.constructor. This may seem trivial in this
example, but it is a good habit to get into. Move the
princ statement to the
AccessData.sample method, and edit the method
name and princ statement to look like this:
method AccessData.print_point (pt)
{
princ("The sine is: ", pt, "\n");
}Edit the .constructor method like this:
method AccessData.constructor ()
{
.OnChange(#$DataSim:Sine,
`(@self).print_point($DataSim:Sine));
}The OnChange method is inherited from the parent
class, Application. This method is a wrapper
for the on_change function, which tells the Gamma
engine to evaluate an expression when a given symbol changes value. In this
case, the symbol is $DataSim:Sine and the expression is
our print_point function. The first expression is
protected from evaluation by the #
quote
operator.
The second expression is also quoted so that it doesn't run until the
point actually changes. However, the self that is usually
understood must be explicitly written and evaluated so that the Gamma
engine knows what the .print_point method applies
to. Therefore, we use the ` and @
quote
operators.
Click the blue arrow icon
in the Script Editor toolbar.
A new value gets written twice a second. To see it really fly, bring up the DataSim window, click the button, and change the Update Frequency to 200 (don't forget to click ). To make it stop, click DataSim's button.
But what if you can't stop the data flow? How do you get the
princ function to stop?
Often you will want a script's change functions to stop when the class instance is
destroyed. Conveniently, the Application
class has a destructor that runs any time a child class gets destroyed, and which
removes all OnChange functions. One way to destroy the
instance of class is with a timer.
![]() | |
The timer is used here for demonstration purposes. Most Windows programs get destroyed by clicking a button or some other means. |
Go to .constructor method and adding the
following code:
after(3, `destroy(@self));
This uses the Gamma after timer function, which in this
case will activate 3 seconds after the instance is constructed and cause the
instance to destroy itself. Again, to prevent the destroy function from being evaluated and
destroying our instance prematurely, we have to quote it. And again, we use
the ` and @
quote operators
to evaluate the self argument. After 3 seconds, the
destroy function will be evaluated, and the
instance gets destroyed.
Your two methods should now look like this:
method AccessData.print_point (pt)
{
princ("The sine is: ", pt, "\n");
}
method AccessData.constructor ()
{
.OnChange(#$DataSim:Sine,
`(@self).print_point($DataSim:Sine));
after(3, `destroy(@self));
}Run the script. You should see output in the Script Log for 3 seconds, then nothing.
To verify that the instance of the class has been destroyed, type
instance_p(_AccessData_Singleton) in the text
entry field at the bottom of the Script Log and press
Enter. The output should look like this:
--> instance_p(_AccessData_Singleton); nil
The instance_p function is a Gamma predicate that
checks to see if accessdata is an instance. The Gamma
engine returns nil, indicating that it is not an
instance.
Since accessdata was an instance and is no more, it is
probably a destroyed instance. To check, type
destroyed_p(_AccessData_Singleton); and press
Enter. The output should look like this:
--> destroyed_p(_AccessData_Singleton); t
The Gamma engine returns t, indicating that it is a destroyed
instance.