OPC DataHub =========== Copyright © 1995-2008 Cogent Real-Time Systems Inc. Product Name: OPC DataHub Product Version: 6.4.5 File Updated: June 6, 2008 ------------------------------------------------------------------------- 1. Product Overview =================== Cogent Middleware is a set of complimentary software products that work together to provide data connectivity between Windows, Linux and QNX applications. The OPC DataHub is a real-time data transfer mechanism that offers multiple simultaneous connections to DDE, OPC, TCP, Web, ODBC and MATLAB. 2 System Requirements ====================== OPC DataHub is compatible with: * Windows 2003 Server * Windows XP Home & Professional * Windows 2000 * Windows NT 4.0 - All Service Packs must be installed. 3. Installation Procedure ========================= To install OPC DataHub from an archive downloaded from the Cogent web site, follow these steps: 1. Double-click on the program archive OPCDataHub-6.x.x-xxxxxx-Windows.exe. 2. Follow the instructions. 4. New Features in this release =============================== Version 6.4.5 - June 6, 2008 ---------------------------- * Change OPC client connection to mark data as not connected before attempting to disconnect the server. This means that the not connected status shows up immediately instead of after a COM timeout period. * Add code to count dropped points when data arrives too fast to transmit. * Report the URL for a streaming AJAX connection in the connection viewer. * Fix some potential crash conditions when dealing with a poorly behaved OPC server * Allow an OPC Client connection to reload its data set without disconnecting. * Do not fail a connection if a group refresh2 returns a failure. OPC spec says a refresh can fail if there are no points to refresh. That is not grounds for a disconnect. * Add the ability to programmatically remove items from the manually selected item list. * Fix a bug where NT would not connect to an OPC server on the local machine. * Add new command OPCModify, OPCDetach, OPCEnable, OPCApply, OPCRefresh * Add arguments to command OPCReload * Change TCP connection status from "Connected" to "Running" to match other plugins. * Add new example web pages * Add per-thread CPU reporting to the connection viewer * Change data viewer window to add points to the list when they are created. This sometimes results in the points being reported twice if the viewer is open to the tree branch that is getting the points added. Changing branches away and back again fixes this. * Ensure that internal COM objects are not added to the registry. This reduces registry clutter * Add Gamma commands reg_create_key, reg_delete_key, reg_set_value, reg_get_value, reg_get_values, reg_get_subkeys, reg_delete_value * Change COM permissions applied by /regserver to include Administrators, SELF, SYSTEM, ANONYMOUS and GUESTS * Improve speed in some circumstances * Add Gamma scripts for dealing with hierarchy, operating on OPC connections, and implementing a form of redundancy. They are not documented, but they work. Version 6.4.5Beta - May 9, 2008 ------------------------------- * Fix a crash bug in Linux/QNX when transmitting an unrecognized data type. * Fix a problem where arrays stored as strings were being misinterpreted and changed to VT_EMPTY in Linux/QNX. * Fix a crash when we don't get back a string from an expected string type. * Accept assembly names that contain '.' characters. * Fix a crash in dhview in Linux/QNX * Fix a memory error when a TCP link is rejected for license reasons. * Fix a crash if an OPC connection fails. * Allow Gamma to write quality and timestamp through datahub_write() * Change AJAX and ASP web examples to use non-evaluated arguments for safety. * Add an option to ODBC logging for updating rather than inserting. * Cause a left-button click on the tray icon to bring up the menu. You need to press, hold for 1/2 second, then release to get the menu. This is necessary to support touch-screen use. * Removed 6 functions that are not present in the API for MATLAB V7.5 * Fix a bug that caused Linux/QNX datahub not to send data marked as NOT CONNECTED * Plug some memory leaks in DDE and TCP connections. * Fix a bug in the Sysmon plugin that meant that Sysmon would not write anything to the DataHub if all properties were invalid, such as a monitored process failing. * Fix web server to handle simple HTTP POST requests. * Add a splitter between panes in the web-based data viewer. * Move all OPC connections into their own threads. This stops the interface from locking up when OPC DataHub encounters a misbehaved client or server, or a network problem. * Add the ability to set the minimum timer resolution for Gamma and DataHub timers through the registry. Set DWORD "TimerResolution" in the current user's registry settings. Value is in milliseconds. * Make registry read operations not require write permissions in the registry. * Add a new connection viewer window that allows you to monitor the status of all connections to the OPC DataHub. * Fix a crash when shift-selecting many thousands of items in the manual OPC item selection dialog. Version 6.4.3 - March 2, 2008 ----------------------------- * Add a system monitor plugin to map Windows performance counters to DataHub points. * Make OPC client connections able to connect to a remote server that is not running OPCEnum. * Add safety checks to some Gamma calls. * Fix goofy processing of the escape key in Gamma programs. * Fix a bug where you could save the configuration file after the demo expires, causing corruption. * Make all list controls show a tool tip if the contents of the list are truncated due to column width limits. * Add a data type column to the Data Viewer * Columns in the Data Viewer can now be re-ordered by dragging * Minor fixes for better OPC DA3 compliance * Fix the web server to not accept URLs that end in a "." character. * Improvements to presentation of AJAX sample pages * Allow larger data sets in the AJAX data browser. * Add the option to update a row in the ODBC logger instead of always inserting a new row. * Change the OPC server search mechanism to allow connections to computers that are not running OPCEnum.exe. When configuring an outbound connection to an OPC server, the the server name can be one of: - a selection from the server combo box, if available - a server ProgID of the form: Cogent.OPCDataHub.1 - a server ProgName of the form: OPC DataHub - a pattern containing *, [], {}, ? pattern forms (see the documentation of the Gamma shell_match function). This pattern will be matched against the server ProgID and the ProgName if they are available. - a GUID of the form: {8F45BA0C-AE9B-4D6B-B3B7-91F87F5DE091} The computer name can be one of: - a selection from the computer name combo box - an IP address, of the form: 192.168.1.1 - a DNS name, of the form: computer.example.com - a NETBIOS name, of the form: MYCOMPUTER - the word: localhost When searching for the OPC server, the OPC DataHub will search in the following order: 1) If OPCEnum is available on the remote machine, look for a matching server using the information from OPCEnum 2) If the server name is a GUID or a ProgID, and the corresponding information is present in the local computer's registry, use that. 3) Search the local registry for an OPC server that matches the given server name, and assume that the OPC server on the remote computer uses the same identifying information. If you are explicitly specifying the server name, it is best to use the ProgID or the GUID. This avoids the registry search in step 3 above. * Fix a crash bug when an OPC client rapidly disconnects and reconnects. * Speed up binary point messages. * Demote several logging messages from Info to Debug. * Fix a licensing problem where a tunnel/mirror connection was treated as a TCP link. * Change the default settings so that client and server capability is turned on by default. * Reduce memory fragmentation with large data sets. * Allow the OPC DataHub to connect to an in-process OPC server on the local machine. * Allow the user to set the minimum tick size for all OPC DataHub timers. This is helpful if running on a machine (like a VMWare virtual machine) that is very sensitive to ticks per second. You can set this by creating the registry entry HKCU/Software/Cogent/OPC DataHub/TimerResolution as a DWORD in milliseconds. * Change the installer to put standard Microsoft system files into the system32 directory if and only if there is not already a copy there. This applies to atl71.dll, msvcr71.dll and mfc71u.dll. * Fix a bug where an OPC server that only has attributes at the root shows no points in the point trees for the email and ODBC logging interfaces. * Fix a bug where it became impossible to turn on or off the email functionality without also changing part of the configuration. * Fix a race in the TCP interface where the order of starting and stopping clients could result in points incorrectly marked as NOT CONNECTED. * Fix an error reporting bug in the ODBC table creation code that caused no error to be reported when using a reserved word as a column name. * Fix a bug in the ODBC scripting support where updating a row with a non-numeric primary key would generate an error. * Be more verbose when reporting errors in ODBC and Email events. Version 6.4.2 - January 17, 2008 -------------------------------- * Changes to Gamma: - Create a Gamma function cache_integers(n). This causes Gamma to create a table of integers in the range -n to n that is faster than allocating memory for each number. The trade-off is that it uses more memory in small applications. If this function is not called, the Gamma engine uses 1024. - Change the minimum free space algorithm in the Gamma garbage collector to keep more free cells available. This reduces the number of times the garbage collector is called, using much less CPU in exchange for some memory increase and longer garbage collections when they do occur. - Add the concept of a constant array to Gamma - Speed up the underlying "set" function in Gamma by removing a try/catch block. - Fix the method_p function in Gamma - Fix an internal scoping inconsistency where a CATCH would not restore the current scope. - Improve the Gamma Application.g file to provide sensible defaults for more controls. - Improve the speed of the GPointBrowser class to better handle large data sets. This eliminates a pause while opening the Email and ODBC configuration windows. - Change Gamma's datahub_read such that specifying only a domain name will respond with a "root" point that contains information about the top level points in the domain. - Increase the maximum array size in Gamma from 16384 to 1048576 - Increase the size of the Gamma symbol table allocation to reduce memory fragmentation. - Fix a bug with at() timers in Gamma where specifying the year as a list of values would fail, causing the timer to fire immediately. - Change the Gamma Script Log to handle high volumes of writes more efficiently. This will delay writes to the log slightly, but will use much less CPU under load. - Change the initial point synchronization between Gamma and the DataHub engine to remove a recursion condition under high load. This will avoid a stack overflow when thousands of points are declared at once. This also simplifies the synchronization, using fewer context switches. - Improve the transfer of data between the DataHub engine and the Gamma engine to better handle high load conditions with fewer context switches. - Create Java gauge and trend applets. - Make more Java applets respond to format and background image parameters. - Add international support to Gamma. - Change the Gamma datahub_command() call to return the result of the command as a string. - Add the Gamma calls: set_point_queue_depth(N) - Set the depth of the per-point queue from DataHub to Gamma get_point_queue_depth() - Query the depth of the per-point queue from DataHub to Gamma get_point_queue_count() - Query the total number of point queued from DataHub to GammaCall - Add the Gamma call: datahub_write(pointname, value) This is the same as force(point,value), but the pointname is a string so the symbol never needs to be created in the Gamma engine. This can be used to reduce Gamma engine load when using a large number of points. - Add the Gamma call: datahub_read(pointnames...) This reads the point identified by each string in pointnames, and returns a DH_Item structure for each point, or nil if the point does not exist. The return value is an array in the same order as the specified point names. If the first argument is a list, then it is used for pointnames, and all following arguments are ignored. * Changes to OPC: - Change manual configuration of OPC points to reduce the time spent populating the tree, to provide feedback as the tree is being populated, and to avoid hanging the OPC DataHub when working with large data sets. - Improve responsiveness of the GUI while loading the initial data set from an OPC server. - Fix a bug when writing to an OPC server using AsyncWrite. DataHub was disconnecting if it received a return code of CONNECT_E_ADVISELIMIT. It now backs off for 100ms and then tries the write again. This is acceptable under the OPC specification. - Work around an OPC server behaviour where the server will transmit back any data sent to it. If the client is transmitting data very quickly, this can cause a race condition where the OPC server and client disagree on the value of an item. The result is either a difference in value between client and server or a dropped write from the client to the server. This race is only really solvable in the client. - Improve speed when reading the data set from an OPC server. - Always perform network server search in a separate thread. This removes a wait condition in a drop-down box during OPC client configuration. - Automatically suggest a label and machine name for OPC client configuration. - Add a button to select the local machine in the OPC client configuration. - When connecting to an OPC server, detect whether the target computer is the local machine, and make a local COM connection if so. This does not affect Windows XP, but will allow local connections to be made correctly when using Windows NT. - Fix a potential crash when an OPC server suddenly fails while the OPC DataHub is reading the item hierarchy. - Add the DataHub command (OPCEnable label 0|1) to enable and disable existing OPC client connections. This command will result in the OPC DataHub disconnecting and connecting to the server. * Changes to tunneling, mirroring and TCP connections: - Speed up TCP/IP handling and tunnels using ASCII mode. - Fix a potential crash when reconfiguring a mirror/tunnel client connection that is already connected. - Fix a UTF-8/UTF-16 bug that caused mirroring the data hierarchy to mangle non-English characters. - Fix a bug where an unlicensed TCP/IP connection could transmit and receive data for up to 5 seconds before being disconnected. - Change the TCP mirror/tunnel configuration to supply default values for heartbeat and timeout, and to enforce sensible values for these (heartbeat < timeout) if the user enters nonsensical values. - Supply sensible defaults for mirror/tunnel configuration - most of the time these are used to mirror from an authoritative data source. * Web server and application changes: - Add completely new web demonstrations. - Change the DataHub web server to look for index.asp as a possible index file when the URL specifies a directory. - Change the DataHub web server to look for a URL parameter "content-type=xxx/yyy". If this is found, it overrides the default mime type based on the URL. Use this to force an XML mime type from an ASP page, for example. - Change the DataHub web server to generate cache control directives in the HTTP header to eliminate client-side caching for ASP pages. - Change the streaming AJAX plugin to terminate the connection earlier when the client disconnects. - Add an automatic log rotation feature to the DataHub web server. This will rotate logs every 12 hours, keeping a maximum of 6 previous log files. This avoids filling the disk with old log files in high-query environments like polling AJAX. - Make Java applets double-buffered. - Fix a bug in the web server that rejected UTF-8 characters in the page header. * Make inbound DDE connections treat all items, services and topics as case-insensitive. This works around some ridiculous Excel behaviour. The side effect is that two points with the same name, differing only by case, cannot both be accessed from a DDE client. * Change bridging interface so that it will not block when filling the source and destination trees with a large number of points. Indicate progress in the tree title. Speed up filling the tree. * Fix a problem in the bridging dialog where the destination tree might expand unexpectedly. * Only allow one event log window to be open at a time. * Update Japanese interface translations. * Change handling of write-only points so that a write to a write-only point will always result in a change event, even if the point value has not changed. * Change some window spacing to accommodate Japanese strings. * Improve tracking of NOT CONNECTED status when a client or server disconnects. * Improve handling of NOT CONNECTED points when the client or server reconnects. * No longer store exception buffer size in the configuration file. It is no longer used. * Stop DataPid from constantly writing the same values to the DataHub. * Fix a bug where DataPid always appears in the top-left corner of the screen. * Fix the language selection drop-down box in the DataHub properties to show the currently selected language, and to show the English translation of the language name. This helps if the user does not have a font installed that is capable of displaying the language. * Change the Data Viewer window so that it no longer collapses the tree when it gets new hierarchy information. * Fix an installation problem where MSVCR71.DLL is not available to DataSim and DataPid. * Improve the round-robin event handling to give a fair share of the event queue to Windows updates during times of high point change rate. This reduces apparent GUI lock-ups in high load conditions. * Change the point change queueing to a plugin to allow each plugin to choose its own point queue depth, and also to make the queue management more efficient during periods of high load. * Change the Email plugin so it only updates the email server information when the user presses Apply if something has changed. * Make DataPid take arguments to assist running more than one at a time. * Add support for interface translation. New languages can be added using the GNU gettext tools. * Add the (domains) command to allow a client to query for all DataHub domain names. * Add the (save_config) command to allow an external client to force the DataHub to save its configuration. * Add the DataHub command flush_log() to force the Script Log to write to update immediately. This is rarely useful. * Change the trigger handler during ODBC logging and email transmission to give better control in the Condition. There are now automatic variables available in the Condition code: lasttrigger - the value of the trigger point the last time this trigger was fired thistrigger - the value of the trigger point now lastevent - the value of the trigger the last time the event was actually executed lasteventtime - the time that the last event was executed, in UNIX epoch time curtime - the UNIX epoch time now Version 6.4.1 - October 4, 2007 ------------------------------- * Fix a bug where binary mode point messages that failed would always return a generic error message rather than a specific description of the failure. Linux and QNX only. Version 6.4.0 - September 14, 2007 ---------------------------------- * Add support functions for authentication to the C++ API. * Add authentication support to the .Net API * Improve the ODBC logging engine by making it share connections when more than one action is configured to a single DSN. This way if you configure 100 writes to a single database, only one connection is made instead of 100. This will hugely reduce the overhead on systems that have many ODBC actions configured. * Fix a bug in the C++ API caused by thread collision accessing the read buffer. This could cause a crash in rare circumstances. * Fix a bug in C++ and datahub where binary point messages caused memory corruption if they carried strings containing escaped characters. * Change C++ API header to be more efficient about allocating and copying memory, and to make fewer context switches to process incoming messages. * Fix a bug in C++ API where the data connection thread and the main program thread could try to modify a buffer at the same time. * Fix a bug in Gamma where timers fired too early if a timer was deleted while running a timer function. * Change the Gamma clock() function to use the same timer as nanoclock() * Fix a bug in the script log window where the start of a line of text would occasionally be truncated. * Fix the ODBC interface to better handle the case where the database is not connected. * Improve TcpTest to include options for transmitting a 1000-point data set, and to optionally transmit in binary mode. Version 6.3.25 - September 5, 2007 ---------------------------------- * Fix a problem where plugins were not authenticating with full permissions if the user had modified the anonymous permissions. * Fix a crash bug in OPC client connections when re-loading the data set. * Fix an authentication bug in OPC server connections that was using anonymous instead of OPC permissions. * Add datahub command (set_canonical pointname variant_type [force]) * Fix a mistake with canonical type name "string" pointing at a bogus type. * Fix a drag-and-drop problem with names of points whose values are arrays. * Fix Gamma editor problems with Japanese characters on Japanese computers (that worked fine on English computers). * Fix problem with non-English characters in the web server. * Fix a bug where OPC clients with manual point assignments were being temporarily saved twice in the .cfg file. * Changed DataPid to generate a sane hierarchy and to always reset to sensible defaults when it starts. * Add an optimization to not re-send OPC client update rate unless necessary. * Make DDE server accept both locale-specific and locale-neutral floating point numbers. * Fix an OPC server memory bug when enumerating items. * Fix a numeric conversion bug in Gamma when given an unsigned int32 greater than 2^31-1. * Fix a start-up bug where mirror/tunnel connections were configured by did not connect until the user pressed "Apply". * Change the web server to always generate floating point numbers with a period for a decimal separator instead of using the locale. JavaScript only accepts a period. Version 6.3.24 - July 25, 2007 ------------------------------ * Add support for binary point messages in the DataHub and the C++ API. * Ensure that all configuration files and Gamma output use "." for a decimal, regardless of the current locale. This is needed in order to keep read/write duality in Gamma, and to keep configuration files locale-neutral. * When sending the data model to a slave connection, ensure that domain mapping occurs properly. * Change some configuration messages to be forced out instead of going out only if there is space in the output buffer. * Change locale code so that there are only two locales: C and User. The UT_Locale* functions no longer use their locale parameter. There is an added flag parameter that indicates whether the underlying UT_* calls should treat their input and output as C or User locale. * Change binary point messages so you can supply an optional "ESCAPED" flag to them. This will escape backslash and newline characters even in a binary message. This allows binary messages to be transmitted intermingled with ASCII LISP-style messages that expect a newline termination. * Fix a bug where DataSim was sending NUL user and password, causing a warning in the DataHub. * Add a button to the DataSim that allows you to switch between binary and ASCII messaging. * Make OPC Client interfaces to periodically process messages so we don't get total lockup while loading the data set from a large server. Produce progress messages in the event log. Allow the user to cancel a server load by simply disabling the particular client interface and pressing Apply. * Delay declaration of points from DataHub to Gamma until it is safe to do so without triggering a re-entrancy situation that could result in a stack overflow if there are enough points being declared at once, as in some start-up situations. * Change OPCSim to accept 0 timing as "flat-out". * Change all TCP mirror/tunnel connection handling into a pair of plugins. Each connection is handled by its own thread. This allows us to support synchronous TCP connections, which therefore allows the DataHub to support SSL connections. * Change the installer system to use the NullSoft installer. The resulting installation files are both smaller and faster, and will install on both Windows XP and Windows NT with a single installation archive. * Added support for single-dimensional arrays from OPC servers and clients. * Improve read-only correctness when mirroring/tunneling data. If a point is marked read-only then all downstream consumers of that point will also mark that point as read-only. When no connection marks a point as read-only it will revert to being read-write automatically. * Add Gamma functions "force", "forceq" and "forceqq". These functions are identical to set, setq and setqq except that they force the on_change functions to run even if the value did not change. These are necessary for writing arrays from Gamma into the DataHub engine. * Fix a bug that would not accept %% in a format directive when formatting a string in Gamma. * Fix the datahub launcher so that it cannot run more than a single copy. This still allows users to run more copies, but the launcher will only allow one automatic launch through COM. * Fix a bug where a \n\n in an incoming TCP message would cause an infinite loop. * Reject unsupported data types from OPC servers immediately on load instead of connecting them and then dealing with the failure each time a change arrives. When loading an OPC data set, use private attributes instead of public types to build the model. This is faster, and allows us to preserve data types. * Fix a couple of crash bugs due to races during shutdown. * Make the data view window focus on the point value when you select a single point. * Improve error reporting for SSL connections. * Change the test for a legal ODBC identifier to include UTF-8 characters. This allows Japanese column names in tables. * Add the DataHub command (unreport_domain "domain") * Fix a synchronization bug where a connection that overrides the remote values with local ones would reject points that only exist on the remote domain. * Fix a bug where a buffered socket would retain information through a disconnect/reconnect cycle. * Change the OPC server configuration so that it does not search the network for hosts until you press the drop-down button on the combo box. * Data Viewer so that the user cannot attempt to change a read-only point. * Add an option in a mirror/tunnel slave to target a server created using the Cogent Embedded Toolkit. This results in a different message content expectation from a regular slave connection. * Add a warning when choosing a write-only slave configuration. Write-only slaves mark the data at the master as read-only. * Plug some memory leaks in TCP connections when resetting heartbeat rates. * Fix some bugs for scripts that create custom sub-menus in the tray icon menu. * Fix a destructor race in the ODBC and Email configuration screens. * Fix a bug in the Linux SRR kernel module where it instantly fires a timer that started before the "jiffies" wrap around and was intended to fire after the wrap around. * Update the Gamma MySQL library in Linux to handle MySQL clientlib version 15. Add many new Windows functions to the auto-generated Gamma bindings. * Allow unicode characters in the script log. * Allow an ODBC driver to submit multiple queries to create a primary key. Report errors for each query. * Improve support for Oracle database. Do a better job of creating a table with a primary key. * Remove several internal or useless DataHub commands. * Create a source-only embedded toolkit for operating systems other than QNX and Linux. This is experimental. * Do not allow the DataHub to write its configuration file if the demo time has expired. This fixes a bug where TCP, DDE and OPC interfaces were unexpectedly turned off in demo mode. * Do not allow the user to enter more than one OPC client connection with the same connection name. Version 6.3.23 - June 5, 2007 ----------------------------- * Fix a problem with forced writes and checking for insignificant changes where forced writes with the same value were being ignored. * Try to fix a problem where DataPid starts with zero parameters. * Fix a problem where DataPid ignored input from the Data Viewer window. * Make the help buttons on various pages go to a more appropriate page within the docs. * Do not try to load help if the OS is Windows NT. It causes a crash. * Add a SafeHtmlHelp function to Gamma that will generate a warning on Windows NT. * Add fair-share handling of different input threads to ensure that no fast-acting thread can starve other threads of an opportunity to interact with the DataHub engine. * Make it possible to queue a small number of point changes per point moving from the DataHub engine to a thread. This makes retiring old values less likely in periods where CPU is sufficient but thread timing favours the DataHub engine. * Fix email so that if your ISP does not require a user/password you don't have to provide a bogus one. * Change message boxes in many Gamma scripts to be modal relative to their parents so they don't accidentally get put behind other windows. * Change ODBC engine so that is does not connect to the database if the action is not active. * Try putting the tray menu on the button up instead of the button down event to see if that will stop the click from opening multiple menus. It doesn't. * Add support for sending email and sms messages when events occur. * Add support for writing data to an ODBC database when events occur. * Change window close buttons on sample scripts and internal scripts to SendMessage instead of PostMessage. This gets around a race where an event can happen to a freed object. * Add an Application Manager window that shows what scripts are running and allows the user to terminate a running script. * Add sample email messages to the installation to match the documentation. * Change the icon order so that plugin icons come before security and scripting. * Move the view data, script log and event log buttons to the permanent part of the dialog window. * Add a script manager button to the scripting properties. * Improve enable/disable logic for mirror slave dialog settings. * Improve OPC error reporting. * On an OPC Client (outgoing) connection, try to browse past a branch even when the server does not respond to the GetItemID on the branch. * For an incoming OPC connection, change the group activate handler to generate an asynchronous refresh instead of a synchronous one. Some clients just cannot handle the re-entrancy associated with an immediate refresh. * Fix a TCP license counting problem when in demo mode. * Make the top-right close button work in the data viewer. * Properly handle wide characters in the Gamma editor. * Improve the search bar in the Gamma editor slightly. Allow Ctrl-F and F3/Shift-F3 to work like most Windows programs. * Add Gamma function map_volatile_pointer. * Add Gamma global constants PRODNAME and HELPFILE. * Add Gamma global constant _config_path_ * Fix problem where the Gamma log did not always come to the front when it was supposed to. * Fix a bug where Gamma symbol metadata was not being set properly. * Change plugin thread synchronization code to be more robust in the face of global Windows messages. * Never show warning message boxes if running as a service. * Change all Windows message handling to act as a dialog instead of acting as a normal window. This allows the tab key to work, but breaks the right-click help function. * Fix a Gamma error introduced in 6.3.19 where the garbage collector could collect a valid data item, causing strange error messages. * Work around a VS2003 bug where bad code is generated for inline code that computes the real-time clock to wall clock offset. Result was timers mis-firing. * Make ODBC type checking more consistent throughout the ODBC config code. * Add verbose flags and logging to actions and triggers. There is no user interface for this yet. * Improve ODBC table column name lookup when identifying table metadata. Not all ODBC drivers return the same column names (with or without _ chars for example). * Add an ODBC driver for the Advantage (Sybase) database. * Ensure that floating point numbers convert comma into period for the decimal point, regardless of locale. * Attempt to bring windows to the foreground better. * Perform better error reporting when browsing an OPC server for individual point selection. * Fix OPC OnDataChange handling to mark the quality as bad if an error is returned for a point, even if the quality is good. * Report more OPC failure conditions in the event log. * Fix a sort by quality error in the data viewer. * Pass an empty string instead of NULL for szAccessPath in OPC items. Spec requires it, though OPCF is planning to relax the requirement. * Change the order of tests for significance to test value first. If that hasn't changed, the other tests do not need to be made. If a point must be re-emitted to the sender because the change was rejected, only tell the sender and no other client. * Do not count connection licenses for non-TCP connections or for tunnel/mirror slaves when running in demo mode. This produces a more accurate maximum connection count while running in demo mode to size a system. * Fix a bug where you could not remove a node license from the license list, though when you re-opened the window or removed a different license, it would then disappear. * Allow more than one outgoing OPC connection to the same OPC server. * Fix a bug where you had to press Apply twice to make changes to OPC client configuration take effect. * Sort the list of OPC servers when configuring an OPC client connection. * Fix the dropdown list size for combo boxes in Windows NT. * Fix a bug where the web server would not auto-start the first time the DataHub starts, even though it was configured to do so. * Make all text entry fields in scripts auto-hscrolling so that text lengths are not limited. * In the ODBC configuration, accept input to the transform entry field when the focus changes out of the entry field. Also automatically select the contents when editing the transform. * Fix a bug in the security settings window where the "Reset to Anonymous" button would reset the permissions, but not re-attach the user to the anonymous user. * Catch and log empty incoming TCP messages. These should never happen, but clients can do some funny things. * Increase the maximum line length in the event log window from 127 to 255 characters. After this length, the line will wrap. Version 6.3.19 - May 4, 2007 ---------------------------- * Fix a bug where mapping from a remote domain of one name to a local domain of a different name through a mirror/tunnel connection would map correctly from master to slave, but put points in wrong domain when sending from slave to master. * Fix a bug where if a Gamma on-change function modifies the on-change list for the same point, we get a memory reference error. * Add a new Java example using the table widget. * Add the files associated with the ODBC documentation as part of the installation. * Add an (OPCReload) command and a function that causes the datahub to disconnect and reconnect all outgoing OPC connections. * MS Windows DDEML library has a serious bug where DDE messages can be processed out of order, causing messages from one transaction to leak into another. Made changes to the DDE handling to try to detect and respond gracefullly when DDEML has this kind of failure. See http://support.microsoft.com/kb/165305 * Change the security window to have OK, Apply, Cancel buttons. * Change the trace window to use much less CPU when the message flow is heavy. It is far less likely to bog down the machine now. * Do not print out (sync...) messages on the log when they arrive via the TCP interface. * Fix a bug where opening the Script Log Window from the system tray menu was happening in the wrong thread, causing a race-to-crash condition. * Add numerous functions to Application.g to automatically clean up timers and to allow the script writer to add menu items to the system tray icon easily. * Add support in Gamma for a large number of functions and structures from winbase, htmlhelp and shellapi. Particularly interesting are HtmlHelp and process creation functions. * Do not send a valid license accross the network when doing license checking. * Improve coordination between master and slave on TCP mirror/tunnel connections. * Change some warnings into debug messages. * Stop the TCP connection state machine from running the "connected" state twice. This showed up as extra messages in the log, and was confusing. * Add a Gamma function to read from a file into a raw buffer. * Add asp_rewrite and asp_execute functions to Gamma to allow asp pages to be processed by any script. * Fix a bug in Gamma where the catch part of a try/catch block was executing in the scope in which the error was thrown, not in the scope of the function containing the catch block. * Add the ability to subclass windows in the WTL support library in Gamma. This lets us, for example, map an HWND into a Gamma class. * Add the ability to enumerate ODBC data sources in Gamma. Change destructors on handles in an attempt to work around an ODBC handle closure order bug in Windows. * Add a GetInfo method to the ODBCConnection handle in Gamma. * Change license checking to defer license messages for up to five seconds, and to squelch multiple messages regarding the same license. License checking does not have to be quick. * Fix a crash bug in bridging if the source or destination domain named in the bridge does not exist and cannot be created. * Ensure that the Gamma destructor for an object runs within an unwind-protect block so that the user-defined destructor code cannot abort object cleanup. * Made changes to ensure that all string conversions between UTF-16 and char* are done in the UTF-8 code page. * Stop DataSim from redundantly echoing values back to the DataHub. * Ensure that tracing in Linux/QNX puts a correct time stamp on trace messages. It was using local instead of UTC time. * Remove the test tunnel/mirror master from the default configuration. * Change the icons and icon layout for the properties window. * Improve windows support in Gamma. Change all Gamma-to-windows mappings to use wide characters instead of multi-byte characters. This allows international characters in all text fields. * Remove a reliance on the timezone global variable when computing local time from UTC. The recent change to daylight savings showed this to be unreliable. Version 6.3.14 - February 11, 2007 ---------------------------------- * Remove a race condition when a TCP connection terminates. * Fix a bug where mapping from a remote domain of one name to a local domain of a different name through a mirror/tunnel connection would map correctly from master to slave, but put points in the wrong domain when sending from slave to master. * Fix an obscure Gamma bug. * Add the command (OPCReload) that causes the OPC DataHub to disconnect and reconnect all of its outgoing OPC (act as client) connections. This is callable using datahub_command() from a Gamma script. * Change to threading mechanism to allow a thread to block if it does not explicitly open a Window. This eliminates a possible race condition with DDE initialize from another process. * Changed the event log window to use much less CPU under heavy load. It is far less likely to bog down the machine when debug messages are turned on. * Do not print out (sync...) messages to the event log. * Fix a bug where opening the Script Log Window from the system tray menu was happening in the wrong thread. * Add new functions to Application.g to assist when creating Gamma applications: - Application.TimerEvery (secs, expression) - a wrapper for every() that cleans up automatically when the application is destroyed. - Application.TimerAfter (secs, expression) - a wrapper for after() that cleans up automatically when the application is destroyed. - Application.TimerAt (day, month, year, hour, minute, second, fn) - a wrapper for at() that cleans up automatically when the application is destroyed. - Application.RemoveTimer (timer_id) - Cancels the timer and removes it from the application. - Application.RemoveAllChanges() - Removes all change functions associated with the application via Application.OnChange - Application.RemoveAllTimers() - Removes all timer functions and stops all timers in the application created by TimerEvery, TimerAfter and TimerAt - Application.RemoveAllEventHandlers() - Calls RemoveAllTimers and RemoveAllChanges. - Application.AddCustomSubMenu(label,position) - Creates a new submenu as a child of the DataHub's system tray icon menu. Position is a number. If position is absent, the new menu is placed at a reasonable default position. - Application.AddCustomMenuItem(label,expression) - Creates a menu item in a submenu of the system tray icon menu. When the user selects that item, run the associated expression. If the application has previously called Application.AddCustomSubMenu, then this item will be added to that submenu. Otherwise, Gamma will create its own submenu and this item to it. - Application.AddStopMenuItem(label) - Create a menu item that will cause this script application to terminate. - Application.RemoveAllMenus() - Remove all menus that this application added to the DataHub's system tray icon menu. * Wrap many more Windows functions from winbase.h. This includes the ability to run and terminate applications from a Gamma script. Version 6.3.10 - January 22, 2007 --------------------------------- * Change the way licenses are checked. There was a problem where interconnected DataHubs could reject valid licenses because they appeared to be in use. This is a breaking change. Versions prior to 6.3.10 will not work reliably with versions 6.3.10 and later. * Remove dependencies on Gamma for Linux and QNX versions of Cascade DataHub. * Add some extra debugging output. * Fix a floating point problem in Linux that was truncating all time stamps to the nearest second. * Fix some commands to respect the "force write" authorization flag. * Make GDialog in Gamma's Windows API to act like a GWindow instead of a prepackaged dialog. It still doesn't work - avoid GDialog. * Add an experimental option that forces synchronous OPC writes to the OPC DataHub to be passed through to an OPC server as a synchronous write. This makes an OPC write into a blocking call. Use with caution. * Add a command (OPCReload) to allow a Gamma script or external program to cause the OPC DataHub to reload data from OPC servers to which it is connected. This is the same as pressing the "Reload Data from all Servers" button. Version 6.3.3 - November 30, 2006 --------------------------------- * Fix a crash bug. Version 6.3.2 - November 29, 2006 --------------------------------- * Add controls to the event log to write the log messages to a file. * Add experimental support for authorization and access control on tunnel/mirror, TCP and DDE connections. Includes the ability to limit the capabilities of anonymous connections on any interface. * Add tests for unusual conditions generated by some non-compliant OPC servers. * Increase the maximum length of a string in Gamma from 64K to 238M Version 6.2.1 - October 16, 2006 -------------------------------- * Fix a timer error that caused average fire times below 1ms to delay future timers. * Fix a timer error that caused clock() and nanoclock() to drift apart over a long run period. Version 6.2.0 - October 12, 2006 -------------------------------- * Improve error reporting when enumerating remote OPC servers. * Improve COM permissions during installation, and when changing between service and user mode. Version 6.1.15 - October 3, 2006 -------------------------------- * Add licensing for the web server plugin. * Use the Windows multimedia timer for timers instead of using the less accurate system timer. Version 6.1.14 - September 22, 2006 ----------------------------------- * Add better error checking code to the ODBC Gamma bindings to accomodate the returns from some Oracle database calls. * Raise the priority of timer messages when processing the Gamma event queue. This should act to reduce timer latency under load. * Reduce the size of send and receive buffers in TCP to 8K bytes (from 16K and 80K respectively in Linux or 64K/64K in Windows). This will reduce latency on an overloaded connection, at the risk of dropping more intermediate values during burst loading. If the connection is constantly overloaded, the number of dropped intermediate values will be the same but latency will improve. Version 6.1.13 - September 19, 2006 ----------------------------------- * Fix a bug where more than two Gamma functions on a single point would cause some of them not to fire when the point changed. Version 6.1.12 - September 15, 2006 ----------------------------------- * Improve the mirror/tunnel synchronization code to allow more control over how the synchronization is done. * Add an option to OPC and TCP interfaces to override the incoming timestamp on points with the local time of the DataHub. * Improve the handling of licenses when DataHubs are configured in chains. There was an error that would sometimes mis-report that a license was already in use. * Add the ability to specify an OPC server as being read-only, regardless of how the items are specified. Items in the DataHub that originate from such an OPC server will be read-only to other clients. * Add the ability to specify that when a TCP mirror disconnects, its point get marked as NOT CONNECTED. * Make the heartbeat and timeout on slave/mirror connections configurable. * Change nanoclock() in Windows to use the high resolution free-running counter instead of the low resolution system clock. Synchronize this to the extent possible with the system clock. Make nanoclock() return UNIX epoch time. * Fix a bug where Gamma points were not always written to the DataHub with a valid timestamp. * Change the clock code to reduce the error introduced by multiple conversions between time representations. * If the data rate is set above 1000Hz, then DataSim will run as quickly as possible, without regard to the data rate setting. * Add several new options to the tunnel/mirror configuration window to better control data synchronization and timing. * Fix a problem where incoming DDE data was not necessarily given a valid timestamp. * Allow the user to specify that an OPC server is read-only. * Allow the user to specify that the DataHub's current time will override the timestamp on incoming data from an OPC server. * Fix a bug where changing the input language in Windows would cause DataHub to hang. * Fix a bug where bridging between two points with the same name but different domains would sometimes cause one of the changes to be skipped when sending to a plugin (such as Gamma). * Fix a memory leak when generating debug information on string values. * Change time handling so that if a point is rejected on the basis of timestamp, the point retains its original timestamp. * Allow the word "string" as well ast "BSTR" in a configuration file that spcifies a data model. * Work around an OPC client bug if the client cannot handle a shutdown message while it is in the process of disconnecting from the DataHub. * If a point in Gamma has been set to allow self-referential event handlers, ensure that the self-referential event is in fact triggered instead of being silently discarded. * Change the DLL initialization code in Gamma extensions to avoid a possible deadlock with a Windows library semaphore. Writers of Gamma extensions should contact Cogent to see if this applies to them. * Added email and web links to the "About" page. * Fix a memory bug that would cause a DataHub crash if an OPC client attempted to enumerate items in large blocks. * Change the queuing mechanism to plugins (like Gamma) to ensure that dropped intermediate values do not alter the time order when the new value is delivered. The new value is added at the end of the queue, not in the place where the dropped value used to be. * Fix the plugin mechanism to work on Windows 2000. * Modify the format of the point information returned from an AJAX call so that it is easier to parse in Javascript. * Add an option to the ODBC environment creation call in Gamma to allow the caller to choose the ODBC version. * Fix a Gamma parser bug that would enter an infinite loop if the input was only an open parenthesis. Version 6.1.7 - July 26, 2006 ----------------------------- * Fix a bug where an OPC server could crash the OPC DataHub while enumerating the items in a group. * Fix a memory corruption error that occurred when writing points from Gamma faster than the DataHub engine could consume them. This generally only happened on multi-processor systems. * Fix an external reference that stopped the Windows XP installation from running on Windows 2000. In fact, Windows 2000 users should use the Windows NT archive, otherwise Windows programming support under Gamma will not load. * Fix an off-by-one error in the Gamma log window that could cause memory corruption in just the right circumstances. * Change datahub_domains() and datahub_points() Gamma functions to return the complete set of domains and points respectively, not just the subset that is currently in use by Gamma. The points are now returned as instances of DH_Item, which provides substantially more information. * Change the delivery order for point changes to Gamma and Plugin threads when Gamma or the Plugin is unable to keep up with the data rate. When dropping old data changes (a data change that has not yet been delivered for a point when that point changes again), the new data change is queued after older data changes on other points. * Change the Gamma call, ODBC_AllocEnvironment, to accept an optional argument specifying the ODBC engine version requested. Valid arguments are 2 and 3. The default is 3, as before. * Fix a Gamma parsing error that would cause an infinite loop if the (malformed) expression consisted of an opening parenthesis followed by an end of file. * Change the way Gamma loads an extension DLL. It turns out that Windows has some hidden synchronization that makes it possible (though not predictable) to deadlock a thread if it synchronizes with the main thread during a DLL load. Gamma DLL loading now defers the Gamma initialization until after the DLL has been completely loaded. Extension writers: contact Cogent for changes in gammawrap.h. * Substantial overhaul of the Plugin threading mechanism to allow plugins to call directly to one another without synchronizing through the DataHub engine. Plugin writers must take care not to deadlock with other plugins. * Move the plugin discovery mechanism to run earlier in the DataHub startup sequence. * Add SSL support to the web server plugin. This is an all-or-nothing option: the web server plugin will listen for clear or SSL connections but not both. * Add /ajax URL to the web server, allowing the user to create his own AJAX handlers in Gamma that do not require disk reads and writes (like Gamma ASP files do). Version 6.0.3 - June 13, 2006 ----------------------------- * Add a built-in web server plugin that allows you to serve a web site directly from the DataHub, including - AJAX coding using the /point URL - ASP coding using the built-in Gamma engine - Serving the Java jar file to show live data in a web browser - static HTML pages * Add the ability to individually select OPC data points from the server, without ever traversing the entire server tree. The OPC server must be accessible during configuration for this to work. * Add the ability to specify any number of OPC server filters to reduce the total data set monitored by the DataHub. Each filter requires a full traversal of the OPC tree, which may be a problem for servers with very large point counts. * Add the ability to individually enable and disable connections to OPC servers. * Add an option to ignore item properties when connecting to an OPC server. By default, properties will not be retrieved from an OPC server. This can be changed from the OPC server setup dialog. Some OPC servers respond very slowly to requests to map properties as live items. * Add the ability to specify any number of filter strings to be passed to the OPC server during item discovery. Only items that match the filter strings will be attached. These filter strings are applied at the server, and the interpretation of them is server-dependent. For example, some servers treat these as case-insensitive, while others treat them as case-sensitive. Also some servers treat a filter string as a substring match, while others require a perfect match. * Add the ability to specify only certain items in an OPC server. The user can instruct the DataHub not to automatically browse the server's address space, instead only loading explicitly defined points. * Change the OPC item registration to make fewer calls to the server by combining several registrations into one call. * Allow "" to mean the same as "*" when client-side filtering item names during registration. There is currently no user interface to specify this filter string. * Respect the read-only flag set by OPC servers, and propagate it onward to clients. * Added a support script to make it easier to produce trend data suitable for trending in Excel. * Modified the ODBC support script and samples to run with MS-Access. MS-Access has a number of limitations that make it less than ideal for many situations. A database server would be better in most cases. * Make bridges force a write even if the point is marked as read-only. This allows the user to create a read-only copy of a writable point for public use. * Change write behaviour so that if a write fails for any reason except insignificant change, re-send the original point value to all clients. * Add DataHub functions (force name value [confidence]) and (cforce...) that will force a write to a read-only point. This will not cause a write to an OPC server that has the point marked read-only, but it will change the value locally in the DataHub. Version 6.0.2 - April 1, 2006 ----------------------------- * Fix a drag-and-drop crash when dragging many points at once from the data browswer. * Remove the point name and value from the selection field on the data browser when the user de-selects the point. * Split Windows NT 4.0 SP6 support into a separate installation archive. * Fix an error displaying the data hierarchy if an OPC server places leaves at the root of the hierarchy. * Plug a memory leak when destroying OPC groups. * Fix a bug where a request for some type conversions would result in the wrong data type being returned. * Fix a bug where the transaction ID in a Refresh2 call was being lost. * When a group is set to the active state from the inactive state, transmit all items in the group. It used to transmit all items even if the group had already been active when it was activated again. * Fix a crash if a subassembly could not be created while reading a server's point list. * Fix a bug where the OPC shutdown callback would be sent to a client once for each group, instead of just once. * Greatly improve the efficiency of the script engine when working with large data sets. Points are queued from the DataHub engine to the Gamma script engine more efficiently. Only points that are actually in use by the Gamma engine will be transmitted from the DataHub engine. * Improve detection of an OPC client or server vanishing without disconnecting properly. * Add an option to the scripting support that allows the user to stop point changes from being shared between Gamma scripts and the DataHub engine. Version 6.0.1 - March 9, 2006 ----------------------------- * Fix a memory leak in Gamma scripts that create windows and controls. * Add a button to the OPC property page to cause the DataHub to re-read the OPC data hierarchy of the OPC servers to which it is connected. * Add linear range mapping and clamping to the bridging interface. * Fix a bug in counting expiring or expired licenses. * Add code to ensure that the point names entered into the DDE client dialog are legal (do not contain ":" characters). * Added improvements to pass the OPC 3.0 compliance test with a larger range of data types. * Improve the connection algorithm when connecting to OPC servers to reduce or eliminate pauses in processing if the OPC server is unavailble on the network. * Added a property called _datahub_point_, available using getprop(), to symbols in Gamma scripts that are tied to DataHub points. This property returns an instance of the class DH_Item containing metadata for the DataHub point. Version 6.0.0 - February 9, 2006 -------------------------------- * First release as OPC DataHub. OPC DataHub now follows a separate development path from Cascade DataHub. Cascade DataHub no longer supports OPC. * Added bridging. Whenever a point changes, also change any points to which it is bridged. Added commands: bridge, bridge_remove, bridge_transform, enable_bridging * Added optional second argument to (create...). If 1, tells DataHub not to generate an error if the point already exists. * Added function new_unconstructed to the Gamma engine to allow the user to create an object and then construct it manually later. * Made the type of a variant explicit when setting it to avoid changing all ints into INT32 and all floats into REAL8. * Create a control panel applet that brings up the DataHub properties dialog when the DataHub is installed as a service. * Fix help to work regardless of the current working directory. * Change the order of the properties icons. * Fix some license summary errors. These did not affect actual licensing. * Add an option do decide whether to use external DCOM permissions or attempt to operate with minimum DCOM security. * Fix a problem with icon color depth. * Improve the performance of the Script Log window. * Automatically save the configuration file on shutdown. * Fix a problem where modal dialog boxes would cause TCP messages to stop being delivered, causing some point changes to be queued until the dialog was closed. * Improve the performance of the trace window by erasing 25% of the total number of lines when the window's buffer fills up. * Don't display Exit and Help buttons on the system tray menu when running as a service. 5. Known Issues =============== (Issue 122) - There is a memory leak of about 20K every time you open and close the properties dialog. (Issue 87) - You cannot run the DataHub as a service in Windows Vista (Issue 37) - When configuring DDE client connections, you must press Apply immediately after deleting a client, or the connection will re-appear when you re-open the properties dialog or after configuring another DDE client connection. (Issue 33) - The Data Viewer window display Excel arrays strangely, and dependent upon the locale settings of your operating system. The TAB and NEWLINE characters may or may not be displayed.