Resource Center

CR3000 OS

Software applications, data logger operating systems, firmware, and drivers for Campbell Scientific products

CR3000 OS

v32.07

Execution of this download installs the CR3000 Operating System and Compiler on your computer.  It also updates the CR3000 support files for the CRBasic Editor.  

Note: The Device Configuration Utility is used to upload the included operating system to the datalogger.

Upgrading from versions prior to version 28 of the Operating System will reset the datalogger’s CPU drive.  This is due to a change in the format of the file system from FAT16 to FAT32.  In order for the datalogger to operate correctly, as part of the upgrade, the CPU drive is formatted to FAT32.  Any programs stored and running from the CPU drive will be lost.  It is not recommended to update the datalogger’s Operating System over a remote connection where program control regulates the communication equipment (turning it on or off, etc.).  In these cases, an on-site visit and a backup using DevConfig’s backup utility is necessary to update the datalogger’s Operating System.

Watch the Video Tutorial: Sending an OS to a Local Datalogger.

In all cases where the datalogger is being updated from an Operating System prior to 28, the use of DevConfig’s backup utility is recommended due to the CPU drive being formatted using the new FAT32 format.

Revision History

v32.07May 15, 2024
  • Major
    Fixed a situation in which PakBus WebSockets were inadvertently enabled, leading to a substantial rise in TCP traffic. In this OS the “PakBus Web URL” will be set to NULL and “PakBus/WS Enabled” will be set to 0. See the following product notification for additional information about the issue. OS 32.06 Potential Excessive IP Traffic.
v32.06November 6, 2023
  • Fixed longevity of the TX325/TX326 EEPROM by eliminating unnecessary writing during the setting of DCP addresses for GOES transmissions.
  • Fixed setting the output power on the TX325/TX326. The data logger now only resets the power level setting when there is a difference between the current setting in the transmitter and the desired setting.
  • Expanded available GOES cannel capacity to 556.
  • Expanded available GOES channel capacity to 556.
v32.05January 6, 2020
  • (CRITICAL) Upgrading from versions prior to version 28 of the Operating System will reset the datalogger’s CPU drive. This is due to a change in the format of the file system from FAT16 to FAT32. In order for the datalogger to operate correctly, as part of the upgrade, the CPU drive is formatted to FAT32. Any programs stored and running from the CPU drive will be lost. It is not recommended to update the datalogger’s Operating System over a remote connection where program control regulates the communication equipment (turning it on or off, etc.). In these cases, an on-site visit and a backup using DevConfig’s backup utility is necessary to update the datalogger’s Operating System. In all cases where the datalogger is being updated with an Operating System prior to 28, the use of DevConfig’s backup utility is recommended due to the fact that the CPU drive is formatted using the new FAT32 format. Watch the Video Tutorial: Sending an OS to a Local Datalogger.
  • (WARNING) This operating system version (starting with operating system version 31.02), and all versions moving forward, will disable the datalogger FTP, Telnet, and Ping servers by default. Updating the operating system using the Send OS tab of Device Configuration Utility will revert all datalogger settings to factory defaults, and these services will be disabled. Sending the operating system as a program or by way of File Control will update the operating system but leave the FTP, Telnet, and Ping enabled settings intact. Note that disabling the FTP, Telnet, and Ping servers does not prevent the datalogger from acting as a client; the datalogger will continue to be able to use instructions such as FTPClient() and PingIP().
  • Minor
    EnviorSatData() now supports the UTC offset setting.
  • Minor
    EnviroSatData() now supports the UTC offset setting.
v32.04November 6, 2019
  • (CRITICAL) Upgrading from versions prior to version 28 of the Operating System will reset the datalogger’s CPU drive. This is due to a change in the format of the file system from FAT16 to FAT32. In order for the datalogger to operate correctly, as part of the upgrade, the CPU drive is formatted to FAT32. Any programs stored and running from the CPU drive will be lost. It is not recommended to update the datalogger’s Operating System over a remote connection where program control regulates the communication equipment (turning it on or off, etc.). In these cases, an on-site visit and a backup using DevConfig’s backup utility is necessary to update the datalogger’s Operating System. In all cases where the datalogger is being updated with an Operating System prior to 28, the use of DevConfig’s backup utility is recommended due to the fact that the CPU drive is formatted using the new FAT32 format. Watch the Video Tutorial: Sending an OS to a Local Datalogger.
  • (WARNING) This operating system version (starting with operating system version 31.02), and all versions moving forward, will disable the datalogger FTP, Telnet, and Ping servers by default. Updating the operating system using the Send OS tab of Device Configuration Utility will revert all datalogger settings to factory defaults, and these services will be disabled. Sending the operating system as a program or by way of File Control will update the operating system but leave the FTP, Telnet, and Ping enabled settings intact. Note that disabling the FTP, Telnet, and Ping servers does not prevent the datalogger from acting as a client; the datalogger will continue to be able to use instructions such as FTPClient() and PingIP().
  • New Feature
    Added basic support for the TX325/TX326 (EnviroSatData(), EnviroSatRandomSetup(), EnviroSatStatus(), EnviroSatSTSetup()).
  • Minor
    Units for ETsz() now displays correctly.
  • Minor
    Constant values set As Long fixed for values larger than float resolution values.
  • Minor
    GRANITE logger constants (GRANITE6, GRANITE9, GRANITE10) now supported when using LOGGERTYPE = in #if/#endif statements.
  • Minor
    Fixed a time drift issue in the CR3000.
  • Minor
    Fixed a time drift issue that was caused by slow sequences that were skipped in pipeline mode.
  • Minor
    Improved table auto-allocation.
  • New Feature
    Added basic support for the TX325 (EnviroSatData(), EnviroSatRandomSetup(), EnviroSatStatus(), EnviroSatSTSetup()).
v32.03August 13, 2018
  • (CRITICAL) Upgrading from versions prior to version 28 of the Operating System will reset the datalogger’s CPU drive. This is due to a change in the format of the file system from FAT16 to FAT32. In order for the datalogger to operate correctly, as part of the upgrade, the CPU drive is formatted to FAT32. Any programs stored and running from the CPU drive will be lost. It is not recommended to update the datalogger’s Operating System over a remote connection where program control regulates the communication equipment (turning it on or off, etc.). In these cases, an on-site visit and a backup using DevConfig’s backup utility is necessary to update the datalogger’s Operating System. In all cases where the datalogger is being updated with an Operating System prior to 28, the use of DevConfig’s backup utility is recommended due to the fact that the CPU drive is formatted using the new FAT32 format. Watch the Video Tutorial: Sending an OS to a Local Datalogger.
  • (WARNING) This operating system version (starting with operating system version 31.02), and all versions moving forward, will disable the datalogger FTP, Telnet, and Ping servers by default. Updating the operating system using the Send OS tab of Device Configuration Utility will revert all datalogger settings to factory defaults, and these services will be disabled. Sending the operating system as a program or by way of File Control will update the operating system but leave the FTP, Telnet, and Ping enabled settings intact. Note that disabling the FTP, Telnet, and Ping servers does not prevent the datalogger from acting as a client; the datalogger will continue to be able to use instructions such as FTPClient() and PingIP().
  • Minor
    TimeUntilTransmit() is no longer allowed outside a Scan/NextScan.
  • Minor
    The GPS() instruction now accepts values prefaced with + or -.
  • Minor
    The public declarations for the EssVariables() instruction now require a ten-element array for indexed OIDs.
  • Minor
    The SNMPVariable() instruction now allows new OIDs to be inserted before the EssVariable space.
  • Minor
    The ETsz() instruction now outputs the correct units.
  • Minor
    The PakBus verify interval advertised in the 'Hello Exchange' is now equal to the verify interval setting rather than the setting / 2.5.
  • Minor
    Settings.PPPInterface now disables auto baud functionality. A specific baud rate must be set.
  • Minor
    The SDI12Recorder() instruction now detects if an error occurred while waiting for the ttt seconds timeout before getting data with the D command.
  • Minor
    The SDI12Recorder() instruction timeout now ignores noise spikes while waiting for the sensor to be ready.
  • Minor
    A Pointer can now be sent into an Array when the index is not constant. In previous operating systems, for P(i), at run time i was used as the pointer rather than P.
  • Minor
    Fixed an erroneous compile error when the index of an array is an expression with the first number equal to 0 (e.g., X(0+1), X(0+i)). Note that variable array indexes always start at 1, so if the expression used for the index returns 0, a runtime variable out of bounds warning is generated.
  • Minor
    The timeout parameter in the EmailRelay() instruction is the value specified (not twice the value, as in previous operating systems).
  • Minor
    The Subject parameter in the EmailRelay() instruction now allows the subject to be Constant.
  • Minor
    Function declarations now output the Return value when no parameters have been defined.
  • Major
    PPP now discards packets with a bad Checksum when a modem is attempting to establish the PPP session.
  • Major
    Settings.PPPDial now keeps the RS-232 port awake when the setting equals "PPP." In previous operating systems, the RS-232 port would go into sleep mode, which disabled communication between the datalogger and the cell modem. This issue was only present with datalogger and Raven XT combinations. Datalogger and RV50 combinations were not affected.
  • Minor
    DNS will now attempt to resolve IPv6 first then IPv4.
  • Minor
    The default DNS server is now listed last. The specified DNS address is listed first.
  • Minor
    Storage to a one-byte string is now allowed (String * 1).
  • Minor
    The Timer() instruction now uses the system time instead of the clock so the timer is independent of the clock being adjusted.
  • Major
    The ClockSet() instruction now avoids skipped records when the clock adjustments are less than one second.
  • Minor
    The ClockSet() instruction will now allow "/" in the date if the parameter is of type String.
  • Major
    The memory error that occurred when two PakBus/TCP Client connections were pointing to each other no longer occurs.
  • Major
    Fixed an issue that could result in corrupt data on an external memory card after a power cycle. The issue only occurred for data tables that were sized to ~ 20 records or smaller and contained a CardOut() instruction. In this case, if power was lost during program run time, the read pointer for the card in internal memory was not established correctly on program start up, resulting in corrupt data on the card.
  • Minor
    The Skipped System Scan counter no longer increments when the 4 second background calibration is deferred to the next available time slot due to measurements in a SlowSequence.
  • Minor
    UDPDataGram() can now receive from multiple clients.
  • Major
    Fixed ComME dead lock issue that could occur at program startup.
  • Minor
    Added optional parameter (ExcusiveOption) to the IPRoute() instruction that is useful if more than one active interface is available (e.g., PPP and Ethernet) but the specified interface should be used exclusively for this outgoing communication.
  • (CRITICAL) Upgrading from versions prior to version 28 of the Operating System will reset the datalogger’s CPU drive. This is due to a change in the format of the file system from FAT16 to FAT32. In order for the datalogger to operate correctly, as part of the upgrade, the CPU drive is formatted to FAT32. Any programs stored and running from the CPU drive will be lost. It is not recommended to update the datalogger’s Operating System over a remote connection where program control regulates the communication equipment (turning it on or off, etc.). In these cases, an on-site visit and a backup using DevConfig’s backup utility is necessary to update the datalogger’s Operating System. In all cases where the datalogger is being updated with an Operating System prior to 28, the use of DevConfig’s backup utility is recommended due to the fact that the CPU drive is formatted using the new FAT32 format. Watch the Video Tutorial: Sending an OS to a Local Datalogger.
v32.02December 21, 2017
  • (CRITICAL) Upgrading from versions prior to version 28 of the Operating System will reset the datalogger’s CPU drive. This is due to a change in the format of the file system from FAT16 to FAT32. In order for the datalogger to operate correctly, as part of the upgrade, the CPU drive is formatted to FAT32. Any programs stored and running from the CPU drive will be lost. It is not recommended to update the datalogger’s Operating System over a remote connection where program control regulates the communication equipment (turning it on or off, etc.). In these cases, an on-site visit and a backup using DevConfig’s backup utility is necessary to update the datalogger’s Operating System. In all cases where the datalogger is being updated with an Operating System prior to 28, the use of DevConfig’s backup utility is recommended due to the fact that the CPU drive is formatted using the new FAT32 format. Watch the Video Tutorial: Sending an OS to a Local Datalogger.
  • (WARNING) This operating system version (starting with operating system version 31.02), and all versions moving forward, will disable the datalogger FTP, Telnet, and Ping servers by default. Updating the operating system using the Send OS tab of Device Configuration Utility will revert all datalogger settings to factory defaults, and these services will be disabled. Sending the operating system as a program or by way of File Control will update the operating system but leave the FTP, Telnet, and Ping enabled settings intact. Note that disabling the FTP, Telnet, and Ping servers does not prevent the datalogger from acting as a client; the datalogger will continue to be able to use instructions such as FTPClient() and PingIP().
  • IMPORTANT: Resolved an issue with PPP connections that timed out or were closed with the PPPClose() instruction and then reopened with the PPPOpen() instruction. This type of connection is often used with cellular modems. A flag that tells the datalogger that the network is online was not being reset correctly, resulting in an unresponsive PPP network interface.
  • Fixed terminal W mode so the terminal will not exit when receiving a character on another comport unless CR (carriage return), or ESC (escape) is received.
  • Fixed terminal mode monitoring via W command when a new connection is made. The datalogger now ignores a new connection unless it is via PakBus or Telnet. The datalogger recognizes a connection when a CR (carriage return) or ESC (escape) character is received from the new connection.
  • Fixed Tablename.Fieldname when sampled into another table when a record did not exist in the source table. The operation now returns a NAN when this condition occurs.
  • Fixed GoesTable() to output commas instead of spaces.
  • (CRITICAL) Upgrading from versions prior to version 28 of the Operating System will reset the datalogger’s CPU drive. This is due to a change in the format of the file system from FAT16 to FAT32. In order for the datalogger to operate correctly, as part of the upgrade, the CPU drive is formatted to FAT32. Any programs stored and running from the CPU drive will be lost. It is not recommended to update the datalogger’s Operating System over a remote connection where program control regulates the communication equipment (turning it on or off, etc.). In these cases, an on-site visit and a backup using DevConfig’s backup utility is necessary to update the datalogger’s Operating System. In all cases where the datalogger is being updated with an Operating System prior to 28, the use of DevConfig’s backup utility is recommended due to the fact that the CPU drive is formatted using the new FAT32 format. Watch the Video Tutorial: Sending an OS to a Local Datalogger.
v32October 18, 2017
  • (CRITICAL) Upgrading from versions prior to version 28 of the Operating System will reset the datalogger’s CPU drive. This is due to a change in the format of the file system from FAT16 to FAT32. In order for the datalogger to operate correctly, as part of the upgrade, the CPU drive is formatted to FAT32. Any programs stored and running from the CPU drive will be lost. It is not recommended to update the datalogger’s Operating System over a remote connection where program control regulates the communication equipment (turning it on or off, etc.). In these cases, an on-site visit and a backup using DevConfig’s backup utility is necessary to update the datalogger’s Operating System. In all cases where the datalogger is being updated with an Operating System prior to 28, the use of DevConfig’s backup utility is recommended due to the fact that the CPU drive is formatted using the new FAT32 format. Watch the Video Tutorial: Sending an OS to a Local Datalogger.
  • (WARNING) This operating system version (starting with operating system version 31.02), and all versions moving forward, will disable the datalogger FTP, Telnet, and Ping servers by default. Updating the operating system using the Send OS tab of Device Configuration Utility will revert all datalogger settings to factory defaults, and these services will be disabled. Sending the operating system as a program or by way of File Control will update the operating system but leave the FTP, Telnet, and Ping enabled settings intact. Note that disabling the FTP, Telnet, and Ping servers does not prevent the datalogger from acting as a client; the datalogger will continue to be able to use instructions such as FTPClient() and PingIP().
  • Added support for SDI-12 specification version 1.4 when the datalogger is used as a sensor (SDI12SensorSetup() and SDI12SensorResponse()). The datalogger is SDI-12 standard version 1.3 compliant when used as a SDI-12 recorder.
  • lwIP libraries updated from to version 1 to version 2 in order to support SNMP version 3 and to further enhance and stabilize the datalogger TCP/IP stack.
  • Changed the default username and password used by the datalogger FTP server. The new username and password are now both NULL. This change requires the user to set their own username and password (both required) in order to use the datalogger FTP server. Neither the username or the password can be blank. This change was made to better secure the datalogger FTP server against malicious attacks. This change does not affect the FTPClient() instruction.
  • Added the MaxRun() instruction. MaxRun() is used to output the running maximum of a measurement.
  • Added the Restart() instruction. Restart() is used to restart the program under program control.
  • Added the DataFilled field to the DataTableInfo table.
  • Changed reset tables via the keyboard display to require first level security.
  • Changed terminal sniff on Ethernet to show the entire Ethernet packet instead of just the first 54 bytes.
  • Allow backspace when editing a hex value in terminal mode.
  • Added TOACI1 option to TableFile() to support Ameriflux applications. This option uses bit 8 (256) for the file type and the 3 LSBs to determine the record, timestamp, and header combinations.
  • Added support for GPS() with no PPS on the RS-232 port.
  • Added append mode to Tablefile(). Append mode is activated by negating the Options parameter.
  • Modified TCPClose(socket) to close and remove the socket handle immediately.
  • Changed the CheckPort() instruction to return a Long instead of a Float.
  • Changed the error message when an element of an array is assigned units. For example: Cannot assign units to Var(2), a singular element of an array, unless the element is aliased and the units are assigned to the alias name.
  • Changed TableInfo.Tablefilled to not include the % sign in the string.
  • Changed SDI12Recorder() when it receives an M command but has an array of > 9 values defined; the instruction should return a maximum of 9 values.
  • Added an optional parameter called NewFileName to NewFile() to return the name of a new file found.
  • Added a compile warning for SerialOpen() if the optional parameter CommsMode is set to invalid options.
  • List the default DNS server last in the list so it is not tried first.
  • CRBasic Sprintf() fixed to allow %% in the format string to output the % character.
  • PakBusClock(PakBusAddr) changed so PakBusAddr can be a variable.
  • Changed SerialIn(): if the timeout = 0 and the termination character/string is < 0 or a NULL string then it will record any characters in its buffer and then exit.
  • ESSVariables(): enhanced the pre-compiler to flag an error if variables are declared as the wrong type or wrong dimensions.
  • Changed GetDataRecord() and AcceptDataRecord() so that the DataInterval() declaration in the DataTable referenced can match the remote Datainterval() without flagging a compile error. This is useful if the remote DataInterval is shorter than the scan interval that GetDataRecord() is in. In other words, this change allows the DataInterval() declaration in the collector datalogger to specify the data interval in the remote without flagging a compile error due to its scan interval. A compile error will still occur if CallTable() rather than GetDataRecord() is populating the data table.
  • Various fixes and adjustments made to make the PC CRBasic pre-compiler more robust and more verbose with warnings and error messages.
  • Fixed various settings of type Boolean (BOOL4 and BOOL) that were not being set correctly via the SetSetting() instruction.
  • Fixed EmailRelay() if the ServerResponse parameter is not a variable of type STRING.
  • Fixed TableName.FieldName() when FieldName is a timestamp passed into a function as type string. The logger now allocates enough memory for the string instead of just the 8 bytes of the time stamp.
  • Changed GetDataRecord() so that when the next collect data is issued the transaction number increments. This resolves a problem that could occur when a response came in late from the first command, but was assumed to be a response to the next command.
  • Fixed EXP(Number) when Number is a type of DOUBLE.
  • Fix double precision when using ABS().
  • Fix double precision constant assignment when the expression is of type FLOAT.
  • Fixed NetworkTimeProtcol() which could have had a 500 msec offset error.
  • HTTPGet(): If neither Content-Length: nor Transfer-Encoding: chunked are in the header response from the server, chunked encoding is assumed.
  • Fixed changing an encrypted program when changing the Constant Table values.
  • Fixed User Functions and Subroutines with measurement in Sequential Mode. There was a potential of deadlock if called simultaneously from different sequences. The fix was to get the measurement semaphore prior to entering the function.
  • Renew PPP timeout when we get a network packet in, else we will timeout in 31 minutes.
  • Fixed timestamps for one record tables.
  • Fixed setting a BOOLEAN in a Constant Table. Prior to this change, the timestamp would increment at every scan regardless of whether the table was updated or not.
  • Fixed HTTP authorization prefix to URL (http://username:password@www.campbellsci.com).
  • Fixed ModemCallback() result. This was broken in a previous operating system and was not returning the correct result.
  • Fixed EmailRelay() when sending multiple files and/or to multiple to addresses. When there was a failure to write or receive, the commas were not restored to the variable for resending.
  • Fixed the keyboard display when displaying RS232Power to show correctly and not a value of 255 when set to True.
  • Fixed the keyboard display when displaying floating point numbers greater than 2.0465E9.
  • Fixed a memory leak when using PingIP().
  • Fixed a memory lead when using EmailRelay().
  • Fixed DNP()so that it correctly sets the baudrate for COM1 to COM4 (TX/RX pairs). Previous to this change, the Settings Editor would show that baudrate was set on these communication ports when it was not.
  • Fixed a problem with the M terminal command that would momentarily cause a communication loss if the logger had a NL115 or NL120 attached to it.
  • Fixed an issue with the Constant Table when setting the ApplyAndRestart field to -1 and the CRBasic program was encrypted. Prior to this fix, the program would fail to compile.
  • Fixed an issue with the Datalogger Web API command of /?command=NewestRecord&table=Settings.The issue was that all the Neighbors field was not being displayed correctly.
  • Fixed SendData() when sending data from the Public table. The bug was that data was being transmitted from the DataTableInfo table instead of the Public table.
  • Fixed an issue with FileClose() when files were open for 30 minutes. The datalogger no longer sets a timeout on files that are open and being written to from within the CRBasic program.
  • Fixed an issue with SerialOutBlock() when the timeout was 0 (forever) that could cause the datalogger's running program to hang.
  • Fixed an issue with SDI12Recorder() in both the main scan and a Slowsequence that caused the first SDI12Recorder() in the SlowSequence to be missed.
  • (CRITICAL) Upgrading from versions prior to version 28 of the Operating System will reset the datalogger’s CPU drive. This is due to a change in the format of the file system from FAT16 to FAT32. In order for the datalogger to operate correctly, as part of the upgrade, the CPU drive is formatted to FAT32. Any programs stored and running from the CPU drive will be lost. It is not recommended to update the datalogger’s Operating System over a remote connection where program control regulates the communication equipment (turning it on or off, etc.). In these cases, an on-site visit and a backup using DevConfig’s backup utility is necessary to update the datalogger’s Operating System. In all cases where the datalogger is being updated with an Operating System prior to 28, the use of DevConfig’s backup utility is recommended due to the fact that the CPU drive is formatted using the new FAT32 format. Watch the Video Tutorial: Sending an OS to a Local Datalogger.
v31.08June 30, 2017
  • (CRITICAL) Upgrading from versions prior to version 28 of the Operating System will reset the datalogger’s CPU drive. This is due to a change in the format of the file system from FAT16 to FAT32. In order for the datalogger to operate correctly, as part of the upgrade, the CPU drive is formatted to FAT32. Any programs stored and running from the CPU drive will be lost. It is not recommended to update the datalogger’s Operating System over a remote connection where program control regulates the communication equipment (turning it on or off, etc.). In these cases, an on-site visit and a backup using DevConfig’s backup utility is necessary to update the datalogger’s Operating System. In all cases where the datalogger is being updated with an Operating System prior to 28, the use of DevConfig’s backup utility is recommended due to the fact that the CPU drive is formatted using the new FAT32 format. Watch the Video Tutorial: Sending an OS to a Local Datalogger.
  • (WARNING) This operating system version (starting with operating system version 31.02), and all versions moving forward, will disable the datalogger FTP, Telnet, and Ping servers by default. Updating the operating system using the Send OS tab of Device Configuration Utility will revert all datalogger settings to factory defaults, and these services will be disabled. Sending the operating system as a program or by way of File Control will update the operating system but leave the FTP, Telnet, and Ping enabled settings intact. Note that disabling the FTP, Telnet, and Ping servers does not prevent the datalogger from acting as a client; the datalogger will continue to be able to use instructions such as FTPClient() and PingIP().
  • Fixed the HTTPGet() instruction when neither Content-Length: nor Transfer-Encoding: chunked existed in the returned header. Chunked encoding is now assumed when the header is missing these two items in the returned header.
  • Improved checking for sufficient buffers in pipeline mode.
  • Changed waking a waiting task from another. It will only wake the waiting task if it is in the correct wait queue.
  • Modified the SlowMeas task to wake from scan tasks if it is waiting for the periodic event SLOW_MEAS. Unconditionally waking the task when the other scans started was causing the wait for slow sliced measurements to end early and possibly cause measurement watchdogs.
  • Fixed loading encrypted programs when using and changing the Constant Table values. This was failing in previous versions of the operating system and would produce a compile error when the program tried to start with the new settings.
  • Fixed a case where subroutine or function containing a measurement instruction was called from a slow sequence in sequential mode. This had the possibility of a deadlock condition where the slow sequence would stop running.
  • NL115/NL121 low level Ethernet driver was fixed to handle multiple buffers combined together when one of those buffers contains an odd number of bytes. Previously, this would result in a malformed TCP/IP packet, which caused connection problems.
v31.03April 28, 2017
  • (CRITICAL) Upgrading from versions prior to version 28 of the Operating System will reset the datalogger’s CPU drive. This is due to a change in the format of the file system from FAT16 to FAT32. In order for the datalogger to operate correctly, as part of the upgrade, the CPU drive is formatted to FAT32. Any programs stored and running from the CPU drive will be lost. It is not recommended to update the datalogger’s Operating System over a remote connection where program control regulates the communication equipment (turning it on or off, etc.). In these cases, an on-site visit and a backup using DevConfig’s backup utility is necessary to update the datalogger’s Operating System. In all cases where the datalogger is being updated with an Operating System prior to 28, the use of DevConfig’s backup utility is recommended due to the fact that the CPU drive is formatted using the new FAT32 format. Watch the Video Tutorial: Sending an OS to a Local Datalogger.
  • (WARNING) This operating system version (starting with operating system version 31.02), and all versions moving forward, will disable the datalogger FTP, Telnet, and Ping servers by default. Updating the operating system using the Send OS tab of Device Configuration Utility will revert all datalogger settings to factory defaults, and these services will be disabled. Sending the operating system as a program or by way of File Control will update the operating system but leave the FTP, Telnet, and Ping enabled settings intact. Note that disabling the FTP, Telnet, and Ping servers does not prevent the datalogger from acting as a client; the datalogger will continue to be able to use instructions such as FTPClient() and PingIP().
  • Fixed a minor issue when the TCP/IP memory buffer was set to NULL. This condition would mainly occur when set up to listen on TCP/IP ports.
  • Fixed Status.UTC offset.
  • Fixed a Declaration bug that occurred when whitespace (spaces and tabs) were used.
  • Fixed an issue when pulling data via LoggerNet when certain table conditions were present. (auto-allocated, interval driven tables that resulted in only one frame of data).
  • Fixed response of ModBusSlave() when a packet comes in that is not addressed to the datalogger.
  • Adjusted the maximum transmission unit (MTU) size of TCP/IP packets to 1380 from 1460. It was found that certain cellular networks reduce the size of the MTU, causing the packets from the datalogger to be fragmented. This specifically affected the use of TCP/IP instructions such as EmailRelay() and FTPClient().
  • Changed SetSetting() reference from "UTC Offset" to "UTCOffset". The syntax is now SetSetting("UTCOffset",value). This is consistent with the TableName.Fieldname syntax of Status.UTCOffset used to read the setting.
v31.02March 17, 2017
  • (CRITICAL) Upgrading from versions prior to version 28 of the Operating System will reset the datalogger’s CPU drive. This is due to a change in the format of the file system from FAT16 to FAT32. In order for the datalogger to operate correctly, as part of the upgrade, the CPU drive is formatted to FAT32. Any programs stored and running from the CPU drive will be lost. It is not recommended to update the datalogger’s Operating System over a remote connection where program control regulates the communication equipment (turning it on or off, etc.). In these cases, an on-site visit and a backup using DevConfig’s backup utility is necessary to update the datalogger’s Operating System. In all cases where the datalogger is being updated with an Operating System prior to 28, the use of DevConfig’s backup utility is recommended due to the fact that the CPU drive is formatted using the new FAT32 format. Watch the Video Tutorial: Sending an OS to a Local Datalogger.
  • (WARNING) This operating system version, and all versions moving forward, will disable the datalogger FTP, Telnet, and Ping servers by default. Updating the operating system using the Send OS tab of Device Configuration Utility will revert all datalogger settings to factory defaults and these services will be disabled. Sending the operating system as a program or by way of File Control will update the operating system but leave the FTP, Telnet, and Ping enabled settings intact. Note that disabling the FTP, Telnet, and Ping servers does not prevent the datalogger from acting as a client; the datalogger will continue to be able to use instructions such as FTPClient() and PingIP().
  • Resolved an issue with the datalogger HTTP server that would cause the datalogger to lose memory due to a failure in one of the TCP timers.
  • Fixed an issue that would cause a TCP timer to reset when http packets were not complete. This would cause the pbufs to never close, and the datalogger would lose pbuf memory.
  • Fixed the Ethernet driver for smsc9221 (NL116 and NL121). When getting bombarded with packets the receive overflow interrupt was occurring faster than could be dealt with. This caused task stacks to fill up with interrupt context and eventually crash. The fix was to disable the interrupt which is later enabled by the task when the next packets are read.
  • Fixed the Ethernet output driver used in the NL121 and NL116 when sending more than 1500 bytes, such as with HTTP output packets.
v31December 21, 2016
  • (CRITICAL) Upgrading from versions prior to version 28 of the Operating System will reset the datalogger’s CPU drive. This is due to a change in the format of the file system from FAT16 to FAT32. In order for the datalogger to operate correctly, as part of the upgrade, the CPU drive is formatted to FAT32. Any programs stored and running from the CPU drive will be lost. It is not recommended to update the datalogger’s Operating System over a remote connection where program control regulates the communication equipment (turning it on or off, etc.). In these cases, an on-site visit and a backup using DevConfig’s backup utility is necessary to update the datalogger’s Operating System. In all cases where the datalogger is being updated with an Operating System prior to 28, the use of DevConfig’s backup utility is recommended due to the fact that the CPU drive is formatted using the new FAT32 format. Watch the Video Tutorial: Sending an OS to a Local Datalogger.
  • Fixed HTTPS when using HTTPPost() with large files.
  • Added the ability to display type double in custom menus.
  • Fixed an issue when CardOut() files are being allocated. It no longer allows other files to be opened for writing on the card until the process is finished.
  • Fixed referencing TableName.FieldName() when field is of type Double.
  • Fixed the datalogger’s FTP server so it will append the final packet to the incoming file.
  • Fixed PortsConfig() when SDM is active.
  • Fixed PPP dialing when dialing is done.
  • Fixed DHCP_release() when DHCP has not been started.
  • DNS client fixed to check for a negative TTL which can cause a much larger timeout before the DNS client tries to get a new IP address.
  • Fixed function declaration with (). Changes recently made to my_stricmp() internal function caused compile errors.
  • Updated operating system to get FILE_SEM when starting os_recompile() to avoid deadlock with SETTING_SEM elsewhere.
  • Fixed IP tracing of HTTP. It could possibly overwrite memory in certain conditions.
  • Fixed DHCP for non-Wi-Fi loggers.
  • Fixed GetDataRecord() when a data interval is specified and when the maximum number of records parameter is either 1 or -1.
  • Modified the operating system to avoid writing a file via IPTrace from the IP task or BMP task since it might take longer than the watchdog timer for these tasks.
  • Added DHCP_release before stopping DHCP so specific PPP modems will work when re-starting DHCP.
  • Fixed PPPClose() to not execute a callback function that has not yet been initialized. This can happen if PPP is opened, but the program closes PPP before the callback function is initialized.
  • Fixed TableName.TimeStamp() from using a bogus pointer.
  • Modified the operating system when an out-of-bounds condition is detected within a data table to no longer allow the compile to continue. This was causing the PC compiler to crash.
  • Modified the pre-compiler to allow new line _ continuation to be before the beginning of a comment.
  • Fixed false error for units "already assigned" by fixing my_stricmp() function when tabs and/or spaces are at the end of the two strings to be compared.
  • Fixed ArrayLength(X) when X is a parameter passed into a subroutine that is not an Array. It now returns 0 instead of the local array's dimension.
  • Fixed a very unlikely bug: If PPP dial string is PPP or blank and "CLIENT" is received while trying to close PPP and PPP is on a comport that uses the flusher.
  • Fixed ArrayLength() when called within a large program.
  • Fixed ArrayLength() to return 0 if a variable array is not passed in.
  • Fixed parsing parameters; the operating systems now inserts a 4 byte value for line number at the start of each parsed instruction. Previously, one 4 byte value was used to maintain instruction number, structure size, and program line number. This allowed only 12 bits for the line number. With longer programs, this caused confusion in compile error messages.
  • Fixed PC compiler showing the wrong program name when an include file is used.
  • Removed extra space between <html> and <head> that were not needed in the Web API html output.
  • Removed extra <!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\"> that was being added to the html output of WebAPI commands ListFiles, SetValue, BrowseSymbols, and ClockCheck.
  • Modified the datalogger's web server to add <HEAD> and <TITLE> tags and to report the title with the same message that is sent in the http header (like other web servers do). For example, a 404 error now reports 404 Not "Found".
  • Changed SetClock() so the usec and seconds passed in are adjusted to be in bounds before converting to usec since 1990. This allows CRBasic code to adjust the clock by simply adjusting the usec component of the RealTime() instruction.
  • Fixed Include files with : and \ in them which resulted in erroneous error message of "file too long" in the pre-compiler.
  • Added the ability to send all the data tables when streaming files and the source parameter is "" (a NULL string).
  • Limited UDPDataGram() instruction queue to 10 before the head of the queue is released and the memory freed.
  • Changed SendGetVariables() to abort if it tries to access variables or store into variables out of bounds.
  • Modified the operating system when Status.WatchdogErrors is non-zero. It will no longer write to an IP Trace file that is writing via the 3212 option in the Files Manager setting.
  • Modified GetVariables() to allow a variable index into the destination variable.
  • Changed GetVariables() and SendVariables() to skip writing if they would write out of bounds in an array.
  • Enhanced EmailSend(...,Attachments,..) and FTPClient(...,LocalFileNames,...) when sending multiple files when some of the files are "streaming" data files. The comma-separated files can now include streaming data files intermixed with other files.
  • Modified DataEvent() to restart if the RecAfter parameter is negated and the start trigger condition occurs during the RecAfter count.
  • Modified Web service: if DataQuery references a field name that does not exist, return no command.
  • Modified the TCP client data streaming functions (Email, HTTP, FTP). If the parameter specifying the data table is a variable, then state of variable is kept for all the declared data tables independently so the same instance of the function can be called referencing different data tables.
  • Fixed SIO4 getting output from a variable of type Long.
  • Fixed the CRBasic pre-compiler to flag an error if the Public or Dim declaration of an array is missing the ")" character terminating the dimension.
  • Modified the SDMSIO4() instruction so the Dest option can be of type Long.
  • Modified CheckSum() to work on a file if the source parameter is a file name present in the datalogger's file system.
  • Fixed the Datalogger Web Service API for the ClockCheck instruction when using the JSON formation option. Removed the extra space in the "description: " field.
  • Fixed CheckSum() using the CRC32 option to work with the CheckSum() of a File.
  • Fixed the Datalogger Web Service API "ListFiles" instruction's "last write" field for the drive. It is meant to be the date of the operating system, Status.OSDate.
  • Improved the TimerIO() port conflict error message. Changed from "To return time since chan %d, it must be programmed for a function < %d. to "To return time since chan %d, chan %d must be programmed for a function < %d.".
  • Modified the CRBasic pre-compiler to use our native csi_atof function rather than GCC library function to convert strings to floats. This brings the CR3000, CR1000, and CR8X0 pre-compilers in line with the CR6 pre-compiler which was already using this method.
  • Fixed HTTPPut() to not respond until the end of the message (file) in the event that it is not authorized (HTTP error 401). The web browser is not able to see the header response before the entire file is sent.
  • A hidden constant table can now be displayed via the keyboard display only if security is set to the highest level.
  • Fixed a typo in the error message "Result must be a variable of typpe string" to "Result must be a variable of type string" in GOES instruction.
  • Web service services HTTPPost() the same as HTTPGet(). API commands like FileControl would generally be issued as HTTPPost() instead of HTTPGet().
  • Fixed GetDataRecord() to not insert a -1 for the interval of the local data table. This -1 erroneously flagged the table to act as an interval-driven table that resulted in a misleading compile error if the same table was referenced by a subsequent GetDataRecord(). The error was removed.
  • Fixed re-syncing the CPI bus with SC-CPI and slow sequences when a module is disconnected.
  • Modified the operating system to allow "then" with the "#ifdef" preprocessor directive.
  • (CRITICAL) Upgrading from versions prior to version 28 of the Operating System will reset the datalogger’s CPU drive. This is due to a change in the format of the file system from FAT16 to FAT32. In order for the datalogger to operate correctly, as part of the upgrade, the CPU drive is formatted to FAT32. Any programs stored and running from the CPU drive will be lost. It is not recommended to update the datalogger’s Operating System over a remote connection where program control regulates the communication equipment (turning it on or off, etc.). In these cases, an on-site visit and a backup using DevConfig’s backup utility is necessary to update the datalogger’s Operating System. In all cases where the datalogger is being updated with an Operating System prior to 28, the use of DevConfig’s backup utility is recommended due to the fact that the CPU drive is formatted using the new FAT32 format. Watch the Video Tutorial: Sending an OS to a Local Datalogger.
v30.01October 6, 2016
  • (CRITICAL) Upgrading from versions prior to version 28 of the Operating System will reset the datalogger’s CPU drive. This is due to a change in the format of the file system from FAT16 to FAT32. In order for the datalogger to operate correctly, as part of the upgrade, the CPU drive is formatted to FAT32. Any programs stored and running from the CPU drive will be lost. It is not recommended to update the datalogger’s Operating System over a remote connection where program control regulates the communication equipment (turning it on or off, etc.). In these cases, an on-site visit and a backup using DevConfig’s backup utility is necessary to update the datalogger’s Operating System. In all cases where the datalogger is being updated with an Operating System prior to 28, the use of DevConfig’s backup utility is recommended due to the fact that the CPU drive is formatted using the new FAT32 format. Watch the Video Tutorial: Sending an OS to a Local Datalogger.
  • Removed PPP support for "VJ" compression protocol that was added in OS 30. This caused the RV-50 and LS-300 modems to no longer pass PakBus packets when PPP was enabled.
  • Removed an extra time out that was causing the datalogger to report incorrectly "timing out after close" after closing a PPP connection.
v30October 3, 2016
  • (CRITICAL) Upgrading from versions prior to version 28 of the Operating System will reset the datalogger’s CPU drive. This is due to a change in the format of the file system from FAT16 to FAT32. In order for the datalogger to operate correctly, as part of the upgrade, the CPU drive is formatted to FAT32. Any programs stored and running from the CPU drive will be lost. It is not recommended to update the datalogger’s Operating System over a remote connection where program control regulates the communication equipment (turning it on or off, etc.). In these cases, an on-site visit and a backup using DevConfig’s backup utility is necessary to update the datalogger’s Operating System. In all cases where the datalogger is being updated with an Operating System prior to 28, the use of DevConfig’s backup utility is recommended due to the fact that the CPU drive is formatted using the new FAT32 format. Watch the Video Tutorial: Sending an OS to a Local Datalogger.
  • Fixed XMLParse() when it failed to open files as "r" instead of "rb".
  • Modified the operating system so it will check to see if there are modules present on peripheral bus before turning it off. (CR1000 and CR3000 only)
  • Fixed ModBus TCP so it will skip looking for more data in the same packet. Before it could get in a loop and watchdog the datalogger if the data was bad.
  • Fixed ModBus slave when it receives a bad address.
  • Fixed #ifdef by stripping off trailing whitespace prior to comparing constant names with the incoming string. (beta, private)
  • Introduced #ifdef to allow checking to determine if a constant has been declared. If so, the expression evaluates as true and all code to the next #else or #endif is included. This allows for code to be inserted without the constant being present.
  • Switch closure and PWM() cannot be active together on shared timer units. This means if C4 is used for PWM() C1..C4 cannot do switch closure, and if C5 or C7 is used for PWM() C6, or C8 respectively is not available for switch closure. (CR1000, CR3000, CR8X0 only)
  • Fixed FTPClient() append with optional header when the server is in active mode.
  • Fixed the FTP server to not send the 220 ready response until after the stack call back function is completed. The logger was progressing too quickly and not updating when the remote window size was being advertised.
  • The FTP server now returns error code 550 instead of 501 if it cannot find a file or if the path specified in the filename is too long.
  • When the FTP server is in active mode FTPClient() will no longer fail when appending a file that does not exist (error 550) on the FTP server.
  • Changed the variable type of “Delete_Files_on_Mismatch” (datalogger setting) to a boolean so "true" and "false" are shown on the keyboard display rather than 0 and 255.
  • Multiple RTU ModBusSlaves with different start register offsets are now allowed. This functionality was already allowed when using TCP/IP ModBus slaves.
  • Fixed SerialInBlock() when passing in a negative maximum number of bytes through the MaxNumberBytes parameter.
  • Internal operating system stack pointer changed to a type float instead of type double in the XMLParse() instruction.
  • @(variable_name) operation now allows variable_name to contain the name of a declared variable or TableName.FieldName.
  • Removed an error message at run time if a TableName.FieldName cannot be found when searched for inside the @(variable_name) operation.
  • Added sha1 and hmac_sha1 options to the CheckSum() function.
  • When Ethernet is very busy the start of a packet may be missed causing a buffer overflow and corrupting memory. Checks were added to limit the max bytes read into the temporary buffer to avoid overfilling it. The datalogger will now also throw away UDP packets that need reassembly and UDP packets over 1500 bytes. This was done to match specifications and to meet what is listed in our help and documentation.
  • After sending an operating system to a CPI module over CPI, the bus query is turned on for 30 seconds to make sure the module comes back on the bus after the operating system is loaded.
  • When SC-CPI module is used for CPI communications, give compile error if COM2 is being used. COM1 was already checked.
  • Changed CPIFileSend() so the CPIStatus table will show up.
  • Changed CPIFileSend() when sending an operating system to first reset the bus to make sure modules identify themselves. Increased the timeout to allow devices time to check their operating system.
  • Neighbor list is altered at start up by removing any neighbors that are on an inactive comport. This prevents a possible memory leak sending messages to a comport mailbox without an active task to receive the messages.
  • NetworkTimeProtocol() fixed so the datalogger can be both a NTP client and a NTP server at the same time.
  • NetworkTimeProtocol() has to be set to "" to be a NTP server. This prevents the server being activated when the logger only needs to be a client.
  • Fixed NetworkTimeProtocol() when two different clients are in the program.
  • Fixed ArrayLength() when used as a parameter passed into a subroutine.
  • Enabled PPP_IPV6_SUPPORT.
  • PPP support for "VJ" compression protocol added.
  • Modified the operating system TCP/IP stack when a remote connection closes. It now sends fin_ack and abandons the connection rather than calling tcp_close. This releases the pcb which was being subsequently used, and would eventually cause a crash due to loss of memory.
  • An OS load in the CR800 now correctly restores settings. The RS-232 baud rate was being overwritten due to too many beacon ids in the settings list. Removed 2 beacons, 2 verify intervals, and 2 baud rates from the settings list for the CR800. The arrays in the structure had room for 10, but 12 were showing up in the list. (CR800 only)
  • Modified changing the SDC baud rate setting to change all of the baud rates for the cs9pin port. Without this, the setting was only changing to the correct value every other time the SDC baud rate was changed.
  • Send one-way table definitions no longer sends the version number.
  • Changed the Files Manager setting. If the name coming in is the same name as the base name, then do not keep looking for another setting of the same type to create a duplicate copy of the file.
  • Modified the operating system to allow SNMPVariables() following ESSVariables().
  • Fixed an optional parameter in Resistance() to work with all integration types in the CR3000.
  • Flag error if ReadOnly(variable_name) is missing the variable name.
  • Added a message in compile results and in the CardStatus field of the Status Table when out of space for writing TableFile().
  • TriggerSequence() expressions now checked when editing a value via the keyboard display.
  • Input buffer now allocated when SerialOpen() is called and PakBus format set.
  • Fixed the datalogger’s web server when using web sockets to detect Connection: ... Upgrade.
  • Illegal numbers cannot be set via the web service or PakBus.
  • Fixed setting Web Service values via Post method.
  • Fixed displaying Web service newest record when the value is a large string.
  • Setting Status.FullMemReset via the web service is now ignored.
  • Fixed Settings.Security to display correctly via the http server.
  • Fixed SpaCov().
  • Fixed GetRecord() when TableName.FieldName is in the 3rd parameter expression.
  • Changed Rso ET calculation to avoid NAN values at nighttime.
  • Flagged an out of bounds error when an Alias name is referenced in an output instruction and the reps results in out of bounds.
  • Fixed double precision conversion to a string when specifying a precision greater than 15.
  • Modified the web server so it now decodes + into spaces after the ? sign in the URL.
  • If the number of TLS connections is 0 upon initialization, set it to 10.
  • Added support to new setting to skip ring and finish packets.
  • CType(x,double) now functions as Ctype(x,float) on loggers that do not support double precision (CR1000, CR800, CR3000).
  • Modified the operating system to not NAN CPI data when setting the datalogger clock.
  • Fixed FTP server when the client shuts down abnormally and concurrently when the IP task is servicing the connection.
  • Pointers enhanced with array indexing and pointing at structures.
  • Added debug tracing dumped out in CPI stream.
  • Fixed duplicate routes. It now searches the entire router list and doesn't stop when the first NULL entry is found. Routers can be removed at any time from any spot in the list.
  • Fixed processing of expressions where operands of type long precede the ^ (power). Ex: 40 * 2 ^ 8
  • Added a check for valid channel mask string when being set by keyboard display or CRBasic.
  • Fixed showing a single dimensioned string when sampled into a data table field whose type is not a string.
  • Modified the operating system to keep clients setting timeout going.
  • Fixed HTTPPost and HTTPGet() to output the header when specified as a variable.
  • Don’t allow “Copy Data to Card” via keypad for tables using CardOut().
  • Pointer to x.y fixed when assigned to an array element.
  • Added syntax to write to TableName.FieldName.
  • Added pointer functionality to be able to point to TableName.FieldName.
  • Fixed HTTPS web service and other SSL server applications.
  • Fix PPP writing when out of memory.
  • Fixed possible multiple tcp_abort() of a tcp_pcb that has already been aborted and removed to prevent corruption the TCP_PBUF pool.
  • Fixed a situation when the stack calls back with an error or that the remote is closing and aborts the tcp_pcb and free its memory. When we shutdown our side of the connection, we do not abort it to keep memp pool from corruption.
  • FindRecord() changed: 1) when searching for the oldest record, check to see if it could be in the internal data storage memory. 2) if a requested search fails to the card check to see if there is a better match in the internal memory.
  • Fixed DNS client when the IP address of the name cannot be found.
  • Fixed specifying email send authorization specification.
  • Fixed constant table ApplyandRestart when user did not set the apply inside the sequence.
  • Changing the constant table is no longer required to recompile using ApplyandRestart.
  • Fixed some non TLS authorizations (plain, login, cram-MD5).
  • Fixed SortSpa() when sorting on the least significant column (sort option = 1).
  • Fixed SortSpa() of an array of type float with the optional Dimension parameter.
  • TimedControl() now synchronizes its interval to midnight rather than the nearest hour. This change was only for intervals < 1 Hr. Greater intervals were sync'd correctly.
  • Increased packet size for AVW200() to support more than 8 individual AVW200() instructions running in pipeline mode.
  • Added support for wide character type in the command line for the PC CRBasic pre-compiler. This allows extended character set file paths to be used.
  • Fixed Include(FileName Expression) without a space before the (.
  • Added Modbus to PC CRBasic pre-compiler.
  • Fixed a possible semaphore deadlock with the TCP semaphore and the Routes semaphore when writing IP packets and a write error forced a socket close. A PakBus Main watchdog was triggered.
  • When receiving a multi-line response, FTPClient() will allow QUIT to pass even with an incorrect response (not 221).
  • Parsing a file with “#if_no_remove” no longer causes duplicate declarations to be written to the output file.
  • Added TDR200() instruction.
  • Added UART BREAK Send.
  • Added a screen to "Copy Data to CRD" via the keyboard display which shows the result of the copy and displays any problems (i.e. disk full).
  • Added CTYPE(expression, type) instruction. Where type can be FLOAT (or IEEE4), STRING, DOUBLE, or LONG.
  • Authorization checked before allowing websockets.
  • Changed EmailSend() to optionally add an authorization specification to the user name separated by a semi-colon. Options are CRAM-MD5, PLAIN, STARTTLS, and LOGIN.
  • Added MonitorComms(Destination,Comport,Ascii (1 or 0)) instruction.
  • Fixed measurements in sequential mode outside of Scan()/NextScan with SC-CPI.
  • Changed CONST to not release expression memory if there is an error in the expression. This was causing the PC CRBasic pre-compiler to crash.
  • Fixed PC compiler crash with MMx() and min() when using TableName.FieldName. The expression memory was being released twice.
  • Added DataTableNames(Names).
  • Updating a String constant in the Constant Table to a NULL string ("") no longer causes a compile error upon ApplyAndRestart().
  • TimeIsBetween() now evaluates correctly when called outside of Scan()/NextScan.
  • Websockets no longer watchdogs when a write error is generated by pulling the Ethernet cable during a write cycle.
  • Modified GetVariables() to flag a compile error if the local destination parameter is not a variable.
  • Quadrature() now fully operational.
  • Resistance3W() and Resistance2W() changed to allow optional parameter to return the measured excitation current.
  • Added CDM_Delay() instruction.
  • CDM devices now recover reliably when CPI cable is disconnected while logger is in low power mode.
  • Adjusted the FileControl response code to 23 (cannot format a drive because it is open for writing) and code 22 (cannot delete a file because the program has it open, i.e., it is the running program or the program specified to run on power up).
  • Calling !Ptr when Ptr = 0 no longer flags an out of bounds warning.
  • Constants cast as "DOUBLE" in a constants table now work correctly.
  • Fixed ModBus Datagram which was broken in OS 29 and OS 4.
  • A solitary erroneous line feed character from an SDI-12 sensor no longer locks up the slow sequence
  • Allow 100 msec gap between C! to multiple SDI-12 sensors.
  • Increased wait time from 20 msec to 100 msec when servicing multiple SDI-12 sensors.
  • Fixed I! command to record data correctly in an array when multiple SDI-12 sensors are specified.
v29February 29, 2016
  • Major
    Upgrading from versions prior to version 28 of the Operating System will reset the datalogger’s CPU drive. This is due to a change in the format of the file system from FAT16 to FAT32. In order for the datalogger to operate correctly, as part of the upgrade, the CPU drive is formatted to FAT32. Any programs stored and running from the CPU drive will be lost. It is not recommended to update the datalogger’s Operating System over a remote connection where program control regulates the communication equipment (turning it on or off, etc.). In these cases, an on-site visit and a backup using DevConfig’s backup utility is necessary to update the datalogger’s Operating System. In all cases where the datalogger is being updated with an Operating System prior to 28, the use of DevConfig’s backup utility is recommended due to the fact that the CPU drive is formatted using the new FAT32 format. Watch the Video Tutorial: Sending an OS to a Local Datalogger.
  • (WARNING) There is a known issue with this operating system when using CDM devices. If the cable is pulled from the CDM device or from the datalogger while the CDM device is running, the datalogger may not be able to get the CDM device running again. The datalogger will require a restart via a power cycle or by resending the program to get the CDM device working again. Please contact Campbell Scientific to receive a beta operating system that resolves this issue. The issue will also be fixed in the next release of the datalogger operating system.
  • Major
    This operating system is not compatible with earlier beta CDM OSs. Make sure the CDMs are running operating system version 1.0.
  • Added a check for Alias names that already exist as variables.
  • Fixed VibratingWire() when it is used outside of Scan() / NextScan and has Reps greater than 1.
  • Modified TableFile() to return an error upon detecting an invalid drive (CPU:). Before it would try to establish drive parameters and this would send the datalogger into a continuous compile loop.
  • Reordered the keyboard display configuration so the Constant table and the Field Calibration, if present, are above the settings.
  • Fixed SDI12SensorSetup() when the source variable is of type LONG.
  • Fixed SDI12SensorSetup() to respond to 'V' command when the 'D!' command does not come right away, as is the case when driving the sensor via the terminal mode.
  • Modified SDI12Recorder() by adding an optional parameter and the ability to work with multiple sensors in a single instruction call.
  • Fixed SDI12SensorSetup() where in some cases it would send trailing zeroes after the decimal.
  • Added optional parameter to SDI12Recorder() to fill array with NAN when communications fail.
  • Modified the operating system so when the use is in the SDI12 terminal, if "SDI12 Failed" appears or happens, exit SDI12 terminal.
  • Modified the operating system so when editing the constant table via the keyboard display do not ask the user to "Save Changes?" if backing out of a change.
  • Modified the operating system so the table names of hidden tables are blanked out in DataTableInfo.
  • Fixed double precision Sprintf() with the Format %Lf and the number is larger than 14. Also allowed the precision digits to go to 15 instead of 14.
  • Modified the operating system so PakBus instructions (ie. SendData(), SendGetVariables(), SendVariables(), etc.) are forced to use a static route unless the ComPort parameter is set to 0. If the ComPort parameter specified is set to 0 and a dynamic route exists, the dynamic route will be used instead.
  • Fixed streaming data in FTPClient(), EmailSend(), HTTPPost(), etc. when an element within an array is specified that is part of a table and that variable is being streamed.
  • Fixed EmailSend() when streaming from a data table that does not exist. When this was done previously, it would watchdog the datalogger.
  • Fixed an issue when using large constant table, CPI table, and table information when the size of the data in the table exceeded the PakBus maximum packet size. The issue was seen when displaying the table in any Campbell Scientific software that displays the datalogger tables.
  • Fixed the operating system so when parsing parameters with trailing spaces caused an error in the case where an optional parameter was not present.
  • Fixed ArrayLength() so it reports the size correctly. There were certain conditions where it would report erroneously.
  • Fixed the keyboard display’s categorization of settings.
  • Fixed the spelling of comports in the keyboard display to display Comports instead.
  • Fixed the sort used with Median() and SortSpa() to put NAN always at the beginning of the array.
  • Changed Erase() instruction to allow a variable index in the EraseVar parameter.
  • Modified the start of the process of updating PakBus neighbor information to routers from 0 to 1 seconds to 0 to 15 seconds to help with congestion when an update is necessary.
  • Changed GOESData() to allow a constant declaration of the data table name. (This also fixes GetRecord() when the optional Format parameter was added to also work with a constant declared table name.)
  • Changed the minimum gap time on all but control ports for Modbus to 30 milliseconds instead of 20 milliseconds. The CR3000 could not handle a gap time of 20 milliseconds on SDC.
  • Added a new LineNum() instruction.
  • Fixed the streaming Public and Status tables.
  • Changed FTPClient() so the response code of 230 (logged in) is accepted after issuing the user name.
  • Modified Settings.SDCInfo so it is set to a null string if no SDC device is attached.
  • Modified the operating system to update the Response parameter if used to store the file name in HTTPGet() when Files Manager is active.
  • Fixed an issue with the datalogger reporting Card OK when there was an error with the card.
  • Added an optional Timeout parameter to TCP Client instructions (HTTPGet(), FTPClient(), HTTPPost(), EmailSend(), etc.).
  • Modified the operating system to allow 4 optional parameters (NumRecs/TimeIntoInterval, Interval, IntervalUnits, FileOption) for IP data table streaming to be blank, as in ,,,, to get to the new Timeout parameter in EmailSend(), FTPClient(), HTTPPost(), etc.
  • Added redirection to a different URL in HTTPGet() when the webpage returns with a 302 status code.
  • Added more categories to the keyboard display in the settings menu to correspond with the tabs in the settings editor of DevConfig.
  • Fixed the timeout so it will be more precise when trying to get a TCP/IP address that was retrieved from a domain name server (DNS).
  • Added a new command line options to the PC pre-compiler. -i works like -p but expands non-encrypted include files into the specified output file.
  • Added HTTP Header setting to DevConfig and the datalogger.
  • Fixed ^ power operator when an operand is of type DOUBLE.
  • Fixed uploading a .gz file. Modified the timeout and now return an error if takes too long and return an error if cannot allocate space for the task.
  • Modified GoesData() format 0 and 1 so it now will convert any data type to FP2.
  • Added optional parameters to DisplayMenu() and SubMenu() to specify the default line to show the cursor at.
  • Modified the messages for IP networks that are powered down to be less ambiguous.
  • Modified the operating system so TPC/IP over CSIO(1,2) when they are not active to filter out packets except when sent a shutdown packet.
  • Modified GetRecord() by adding an optional "format" parameter with the GOES format options. The parameter is variable. A fixed -1 format acts as if the parameter was not present.
  • Fixed an issue with FTPClient() when under some conditions of failure it would return 0 instead of a connection handle.
  • Modified the operating system so when reading string settings it accommodates, in all cases, fragmentation of the string.
  • Changed TCPClose() to wait for remote to ACK to close and abort instead of closing if the state is not established. This prevents holding on to memory too long (over one minute) and cause a problem with rapid TCPOpen() and TCPClose().
  • Fixed ModBus RTU on ComUSB and ComRS232.
  • Modified SerialClose() to allow shut down RS232 power unless always on or handshaking settings are active.
  • Fixed SendData() so when the optional parameter (Number of Records) is > 0 then it will send that many records back regardless if there are no new records stored since the last execution.
  • Added new power mode setting for the CR1000 and CR3000 that matches a similar setting on the CR6.
  • Changed the settings tabs that are displayed by DevConfig.
  • Fixed IPv6 having duplicate entries in the router list.
  • Fixed code in comport timeouts controlling comport off and also controlling ModBus RTU timeouts.
  • Modified CommsMemFree to not show the third line (IP PBUFS) if there are not any networks enabled. In this case this memory does not exist.
  • Added the ability to do ModBus RTU over USB with working timeouts.
  • Fixed FileGet() if the request for a swath is 0.
  • Fixed a slow slicing problem with the AM25T.
  • Fixed network enable setting to recompile when necessary.
  • Modified the DHCP server if there are no networks enabled. This was done so the logger would not try to allocate memory for a network that does not exist.
  • Fixed recursive calls to TCPOpen() when there is no network active and there is a PakBus TCP ClientSetting. Previously this would cause memory corruption.
  • Changed dhcps_init() so the DHCP server starts up again after it has been closed.
  • Modified the binary 'W' monitor so it is now again compatible with Log View.
  • Fixed ip_frag.c LWiP stack bug when fragmenting a TCP packet and the packet needs to be resent, i.e., it is not ACKED. This could have caused a memory corruption and watchdogs caused by the ip task looping inside ip_frag() forever.
  • Changed receiving PakBus Get and Send variables to accept little endian longs (CSILONG, data type type 20).
  • Fixed PPP to not leak memory (PBUF_POOL) in the event that the comport task for the PPP interface is not running or in the event that we run out of services.
  • Fixed wireless sensor instructions when the configuration parameter is an expression using the & operator.
  • Modified the datalogger web service so it does not eliminate the security= command but rather nulls the string after the last digit in the command so only the security is copied into the links rather than a possible XXS string.
  • Fixed TableFile Mode 64 output occurring at the same time as FileMark.
  • Modified the PPP start up after reset and dial connect to hold off for 2 seconds. The Sierra Modems expect some hold off after dial connect else they keep echoing.
  • Implemented range checking parsing the processing field when changing settings via keyboard display, CRBasic, or remotely.
  • Changed the Terminal W watch binary to now include ASCII characters.
  • Chanded SolarPosition() so the TimeOffset parameter can now be variable as well as a constant.
  • Changed NewFile() to allow FileName to be an expression.
  • Added StationNameSetting to the pre-defined constant list. Its value is the station name setting of type string.
  • Added optional parameter to the Resistance() instruction to return the measured current as the last measurement in the array.
  • Fixed initializing boolean variables so a non-zero value is set to -1 (TRUE).
  • Modified the operating system to now discard Ethernet packets whose MAC address is our own.
  • Fixed a memory leak of PBUF_POOL in the event an https client which tries to connect on port 443. In the CR1000, CR3000, and CR800.
  • Modified the operating system so when the station name is changed, restart DHCP on all the networks.
  • Fixed HTTP newest record date/time for Status and Public tables.
  • Added New PakBus windowing get and receive file and data collect commands.
  • Modified terminal W mode to only abort if the different connection is not PakBus or telcom or if the character coming in is CR or ESC.
  • Removed disabling PPP if the DEL key is pressed and held on the keyboard display that aborts a program running.
  • Changed PPP ECHO REQUEST response timeout for 1 try (2 tries total) to 105 seconds from 90 seconds, so the total timeout is 3.5 min instead of 3 min.
  • Changed the operating system so while polling TCP connections, if any connection is using a local IP address that is not the IP address of a network (PPP, Ethernet, Wi-Fi, etc.) then close the connection.
  • Fixed PC pre-compiler issue where Windows XP 32-bit users could not use the pre-compilers. All logger pre-compilers are now 32-bit operating system compatible.
  • Added CR300 to list of predefined constants, so programs can use it in LoggerType.
  • Fixed PC pre-compiler crash when using ConstTable with no name.
  • Allow Get/Send values to specify the "Settings" table along with "Status" to get or set settings.
  • Changed DataTable: If a user specifies only 1 record, provide only one record. This allows for multiple "public" type tables.
  • Fixed sprintf() with the '*' specifying dynamic width or precision.
  • Fixed NewFieldNames() when the entire generic array is named and an attempt is made to rename the fields again.
  • Changed the keyboard display pick list when working with a constant table.
  • Fixed EssVariables() when used in the same program as SNMPVariable().
  • Modified the operating system to allow ping via a PPP network to ping yourself instead of flagging an echoing error.
  • Fixed the code for GPs. It now sends the entire GPRMC string even if the GPS does not have a valid fix. Previously, the string was only sent if the 'A' was returned in the fix location.
  • Added a compile error if a Constant Table has the same name as another table, including the "settings" table.
  • Modified the PC pre-compiler to Allow up to 1000 warnings. This same process is limited to 3 in the datalogger. This was done because we enabled the unused variable check which would require many more listings than just three.
  • Fixed an error with ModBus TCP to RTU datagram.
  • Added line number information for the PC pre-compiler when reporting unused variables.
  • Enabled GPS() so it will work without a PPS signal. This is activated by using COMnum < 0 in the instruction.
  • Added a special PakBus DataGram destination ID of 506 which translates TCP ModBus into RTU ModBus.
  • Fixed promoting to float operands preceding the ^ operation. It will now always returns a float.
  • Fixed !Ptr when Ptr points to a String and !Ptr is the entire expression, as in MoveBytes() where !Ptr is the source pointer.
  • Added Websocket Service support.
  • Added more precise timestamps on 'W' sniffing.
  • Fixed TableFile() with MaxFiles = -2 when no card present at compile time.
  • Modified the operating system to clear the card LED's when card inserted and no errors. When using CardOut() this was working correctly, but with TableFile(), the green LED remained on after the card was inserted.
  • Fixed ConstantTable data types (float and double).
  • Fixed TCP Client Connections setting to handle port numbers greater than 32767.
  • Fixed EditTable(TableName, Record).
  • Modifyed ETsz() to not inherit units from source variables like windvector and also to allow user defined units if done with Filednames: Units.
  • Modified FTPClient() when appending a data file, allow response codes to NLST of 450 or 550 (no directory or file).
  • Modified DataInterval() so if the Units of DataInterval() is MON (month) and auto allocation of the number of records is specified, seconds per record is set to 30*24*3600 rather than the scan interval of the CallTable() instruction.
  • Changed the keyboard display realtime data display of floats to show more digits when no digits right of decimal are present.
  • Fixed editing the constant table to keep comments once edited and to handle more than one constant per line (using : syntax).
  • Added an optional parameter to TriggerSequence() that enables remote setting of variables to trigger the sequence.
  • Fixed initializing double variables and constants with non-scalar expressions.
  • Modified FTPClient() modified to allow for a response of 550 to comeback from the NLST command when appending to a data file, even though 550 is not listed as a legal response to the NLST command in the FTP RFC 959.
  • Fixed Const As Type = expression when expression is not a simple scalar.
  • Added a number with 'R' or 'r' suffix is Double precision when declaring a constant as a double.
  • Added a number with 'F' or 'f' suffix is Floating point single precision when declaring a constant as a float (optional).
  • Fixed AM25T() in slow sequence in pipeline mode when Reps = 1 and RevDiff was used. The RevDiff was not being done. Also, improve the slice time accuracy when using Reps of 1 and AM25T starts with AM25TChan > 1, to take into account all of the extra clocks to get the AM25T channel to the correct position.
  • Changed the behavior of the ^ operator to always return a floating point value rather than in some cases an integer.
  • Added a warning message to SubScan() if the scan interval is not an integral of 100 usec.
  • Increased the size of the error output for the PC pre-compiler. Use a different buffer than the status table so the table definitions between the PC and the logger will be the same for the association feature to work. The size was increased from 256 to 4096.
  • Changed TableInfo record number so it is updated when polled via BMP5 so it does not break status client.
  • Fixed "variable not used" warning with aliases.
  • Changed operating system so flag reps <- 0 as a compile error for all data table instructions, including Sample().
  • Changed DNPUpdate() so the datalogger can optionally enable unsolicited data when a new connection is made by the datalogger as a TCP Client.
  • Changed TCPOpen() when there is a routing error. Changed it so it does not try forever but rather just what the timeout specifies.
  • Fixed a ETsz() fieldnames issue where a fieldname with _Rso inside was being overwritten with _Rso.
  • Added support for the CDM_SW12() and CDM_SW5() instructions
  • Changed keyboard display to split up Settings (general) into Settings (general) and Settings (TCP/IP).
  • Fixed setting items in the Settings table via the keyboard display that are UINT2_T data type.
  • Fixed first element of a sampled array to show as array(1) instead of as a scalar.
  • Changed TableInfo and ConstTable time stamps to update when they are changed instead of when they are monitored.
  • Changed DNP3 for broadcast packets and control when an unsupported point is selected for control.
  • Changed DNP3, PC pre-compiler to flag a compile error if the comport is in error.
  • Fixed SerialOutBlock() and MoveBytes() so they can move or output an entire record or partial record from a data table. I.e., they will successfully cross field boundaries if the number of bytes specified is greater that the starting field size. This is the case only if the number of bytes parameter is not variable.
  • Removed Niche references.
  • Changed STATUS_NUMFIELDS to the correct value for all loggers.
  • Fixed CAO_Offset field in the CR3000.
  • Modified the parameter list for IPNetPower() (changed 2nd parameter from 2 to 25 and added an optional parameter).
  • Changed FileOpen() so if it is used in conjunction with the files manager setting, then change the name (if a variable) of the file in the public table also.
  • Changed functions that are used in conjunction with the Files Manager setting so if a new name is passed in then the variable holding the name is large enough.
  • Added line number information to the units structure in order to provide line number in compile errors that are detected at completion of compile.
  • Fixed preserving com1..com4 baudrates through operating system download.
  • Fixed SDI12Sensor() to allow a response time up to 999 seconds instead of 99 seconds.
  • Fixed missing Sub crashing compiler; FunctionsPtr was NULL yet was used.
  • Fixed ApplyAndStart() to be true if non-zero.
  • Changed SetSetting() and SetStatus() so when they are within any kind of sequence like a subroutine or a function then they will not execute at compile time.
  • Changed the PC pre-compiler to not flag an error in SerialInRecord() when the comport is SDM-SIO1 based on the number of bytes parameter since it does not know the size allocated by SerialOpen().
  • Fixed SerialInRecord() so when writing "NAN" into a variable of type String where the destination address is on an odd boundary (as it would be if, for example it is referenced as Destination(1,1,4), the 4th character into the string), then "NAN" would be written starting at 1 character before the specified destination, for example, at Destination(1,1,3) instead of Destination(1,1,4).
  • Changed UDPDatagram() to queue multiple packets between calls.
  • Changed UDPDataGram() to queue incoming data up to 20 datagrams before it discards.
  • Changed FTPClient() in conjunction with the files manager setting (3210) to return the new filename controlled by the files manager setting into the local file name variable.
  • Changed HTTPGet()/HTTPPost() to insert authorization into the header if the URL parameter is prefaced with username:password@.
  • Added an optional parameter to IPNetPower() to specify a timeout after inactivity to power back down.
  • Fixed FTPClient() when getting or putting multiple files.
  • Changed FTPClient() to allow the NLST command to return 450 ("No such directory or fi.e") when using the optional header function for appending files in the remote.l.
  • Changed the NL200, NL240 net mask and gateway exchange along with the TCP/IP address.
  • Fixed setting values in the status or constant table via an RTMC project so security is ignored since the .csipassword file is used instead as the security mechanism.
  • Changed hidden data tables to allow access via HTTP if the highest security level is authorized.
  • Fixed UTF-8- character set for http and quote non-printable characters for JSON so KANJI comes through correct.
  • Changed dns_svr to use DeviceConfig setting (domain_name) as the domain name to which it will respond (rather than hard-coded to model.com).
  • Added code to handle a DHCP renewal request. Art changed the DHCP lease time to 30 seconds and added the function joined_networks() to look through the DHCP cache and see if there are any clients in it that haven't timed out.
  • Changed sniff(w) and talk through(p) terminal commands to not have timeouts when connected via PakBus.
  • Changed Constant Table so if editing in the terminal and it fails, display a failure message of ‘out of space’.
  • Fixed warning message when get or sending variables via PakBus but the packet will not fit into a PakBus frame.
  • Changed Get/Set Variables to allow swath parameter to be variable.
  • Changed PakBus directory response so it accommodates a '/' character instead of the ':' character in a file specification. This allows older LoggerNet versions to work that mistakenly replaced the colon with the forward slash character.
  • Fixed GetDataRecord(), GetFile() and SendFile() so the expression function is not called erroneously, possibly resulting in an out of bounds warning and/or in rare cases a variable set erroneously.
  • Fixed GetDataRecord() to start at the current record number in the event of reset and maximum records is negative (collect all data).
  • Fixed a data collect bug where data was written beyond the end of the holding buffer. A call to FindRecord() was requesting too much data. This affected non-interval data tables with small (<= 8 bytes) record sizes.
  • Modified GPS for setting clock with no PPS signal.
  • Extended timeout for file upload (including table definitions upload) to 5 minutes.
  • Changed error code for file upload to return an error code of 9 if there is a fragment offset error instead of 13.
  • Added TCP ModBus-PakBus DataGram routing.
  • Enhanced RTU ModBus-PakBus DataGram routing.
  • Changed FTPUserName and FTPPassword settings so these settings are now accessible via CRBasic and the keyboard display.
  • Added DNS setting via keyboard display.
  • Fixed IP trace code reading via CRBasic or keyboard display.
  • Fixed TLS Status on the keyboard and via CRBasic and remotely.
  • Fixed some issues with Files Manager setting for sniffing and IP Tracing when changing the maximum file size and also when the file size is very small.
  • Added pointer type casting that will ensure floating point operations will not truncate to integers.
  • Enhanced operating system so double numbers must be "forced" using the 'L' or 'l' character at the end of the number.
  • Fixed ArrayLength(!VariablePtr).
  • Fixed a problem with re-assigning a pointer.
  • Changed CRBasic pointer method such that once a pointer variable is assigned to point to a variable, it can never be 0, i.e., 0 would be an out of bounds, illegal pointer that can be detected by the program.
  • Fixed ! (pointer) pointing to a variable of type String.
  • Fixed Pointer = @(Setting) where variable reference by setting is an array of type string.
  • Fixed the compiler to allow a reference to tablename.fieldname() to act the same as tablename.fieldname.
  • Fixed CRBasic to flag an error if an assignment statement tries to assign a new value to a constant string.
  • Added UDP IPv6 support.
  • Added option 24 to the CheckSum() function for a 16 bit Fletcher checksum.
  • Added a check for the maximum number of tables that can be used with Tablefile(), which is currently set to 30.
  • Added a check for duplicate file names when using TableFile().
  • Fixed PC pre-compiler when it needs declarations before any code.
  • Fixed DataTableInfo when its size is larger than all other tables for buffer used by findrecord() during data collection.
  • Fixed ConstTable setting MaxNumBytes (size of memory to allocate for data storage). If any table was larger than the Status table, and there was a ConsTable, the buffer was not large enough to store data into.
  • Fixed units for WindVector() output options 3 and 4.
  • Fixed a PC pre-compiler crash when not able to find a specific settings.field.
  • Change the Rx timeout calculation when changing baud rate. Give at least 35 bit periods to conform to Modbus.
  • Fixed SMTP via IPv6 to look for the port number after ]:port.
  • Changed CheckDataGram(service) so it takes care of service.
  • Fixed ModBus datagram and multiple TCP Modbus within a single packet.
  • Fixed Replace() when the SearchString string is NULL.
  • Fixed EmailReceive() using APOP authorization. The server includes this capability in its greeting, not in its CAPA list.
  • Fixed BroadCast() to not use uninitialized variables.
  • Changed throttling down PakBus client communication when the comport mailbox is backed up to limit it to no more than 4 in the queue or a 5 second timeout.
  • Checked sndmsg() for failure in the event we need to release communications memory.
  • Change the subclass from 0x20 to 0x02. This allows Windows 10 to load the usbser.sys driver without a .inf file.
  • Increased the requested current limit from 200 to 300.
  • Modified DNP3 waiting for unsolicited response confirmation will always service a read request.
  • FileManage changed so changing attribute hidden does not update the directory information if the attribute is already set. This was found when a customer was hiding a file unconditionally in a 10 second scan and destroyed flash chips after ~1.5 years.
  • Added little Endian support for Ping().
  • Changed the password settings via the keyboard display and remote access so they are hidden with "..." notation.
  • Fixed GetDataRecord() when table is interval driven and there are multiple frames per request. An erroneous response code of either 8 or 9 was returned sometimes.
  • Modified the code when receiving a one way table definitions command to not respond with a no type error response.
  • Fixed GetDataRecord() and AcceptDataRecord() in the case where the table they are storing into has DataInterval() with 0 lapses.
  • Fixed PakBus client instructions via TCP when the socket handle number mod 256 is within the range of COM1..COM4 (4..7 in a CR1000, 4..11 in a CR6), causing them to erroneously return -10 for a response code.
  • Fixed seconds per record output in 'O' command.
  • Fixed SC115 file hiding.
  • Fixed validate_query_name to use case insensitive string compare.
  • Allowed access to hidden data tables via HTTP if the highest security level is authorized.
  • Disabled SHA256 encryption for the CR1000, CR800, and CR3000 in order to save code space.
  • Removed Com3 and Com4 from pre-defined constants for the CR800.
  • Fixed the CRBasic PC pre-compiler so it no longer flags an error in SerialInRecord() when the comport is SDM-SIO1 based on the number of bytes parameter because it does not know the size allocated by SerialOpen().
  • Removed settings from the keyboard display settings that are not applicable for the CR8X0.
  • Fixed type casting constants.
  • Changed security policy related to set value actions over HTTP directed at the Status or ConstTable. Permissions are solely taken from .csipasswd now. Traditional BMP three level security codes are not considered or used.
  • Fixed possible lockup in file system if FAT is corrupted.
  • TableFile 64 mode changed to close input file and output new TOB3 file when the Tablefile() output fails. This fixes a problem when the disk fills up in ring mode. This was already fixed in OS 28.02 for non CR6 dataloggers.
  • Increased the number of allowed user-defined DataTables from 30 to more than 250. The datalogger may now have a maximum of 255 tables, including system tables such as Public, Status, DataTableInfo, CPIStatus, and ConstTable. This feature was already added in OS 28.02 for non CR6 dataloggers.
  • Changed items to accommodate up to 255 tables. Public Table is now an int instead of char. Bumped the maximum scroll menu size to 256 lines from 100. Removed the start value maximum of 72 on scrolling.
  • Added keyboard display menu option that allows user to copy table data to a file on the USB or CRD drives. Located under Data-Final Storage Data-Copy Data To CRD
  • USB. This feature is used for PC-less collection of data, for example when using a CR1000KD and a SC115, without requiring the use of TableFile.
  • Enhanced compiler so an error is reported when an invalid ComPort is specified for DNP()
  • Fixed PC compiler crash that was caused by calling a missing sub-routine. FunctionPtr was null yet used.
  • Fixed PC compiler crash caused by an unhandled Case() occurring outside of Select().
v28.02August 7, 2015
  • Major
    Upgrading from versions prior to version 28 of the Operating System will reset the datalogger’s CPU drive. This is due to a change in the format of the file system from FAT16 to FAT32. In order for the datalogger to operate correctly, as part of the upgrade, the CPU drive is formatted to FAT32. Any programs stored and running from the CPU drive will be lost. It is not recommended to update the datalogger’s Operating System over a remote connection where program control regulates the communication equipment (turning it on or off, etc.). In these cases, an on-site visit and a backup using DevConfig’s backup utility is necessary to update the datalogger’s Operating System. In all cases where the datalogger is being updated with an Operating System prior to 28, the use of DevConfig’s backup utility is recommended due to the fact that the CPU drive is formatted using the new FAT32 format. Watch the Video Tutorial: Sending an OS to a Local Datalogger.
  • Extended the .tdf close timeout from 1 minute to 5 minutes. This timeout is used when LoggerNet retrieves the table definition file (tdf) from the logger. In some RF networks, it was taking LoggerNet longer than 1 minute to acknowledge when it had received a packet containing tdf information due to network latency. Consequently, LoggerNet would never receive the complete tdf that is needed for scheduled collections.
v28.01July 1, 2015
  • Major
    Upgrading from versions prior to version 28 of the Operating System will reset the datalogger’s CPU drive. This is due to a change in the format of the file system from FAT16 to FAT32. In order for the datalogger to operate correctly, as part of the upgrade, the CPU drive is formatted to FAT32. Any programs stored and running from the CPU drive will be lost. It is not recommended to update the datalogger’s Operating System over a remote connection where program control regulates the communication equipment (turning it on or off, etc.). In these cases, an on-site visit and a backup using DevConfig’s backup utility is necessary to update the datalogger’s Operating System.In all cases where the datalogger is being updated with an Operating System prior to 28, the use of DevConfig’s backup utility is recommended due to the fact that the CPU drive is formatted using the new FAT32 format.
  • Made a change to allow the use of “/” as a path delimiter when a directory listing is requested by LoggerNet during automated File Retrieval. Stricter matching of the expected path delimiter of “:” was introduced with version 28.00. The symptom was that when using LoggerNet 4.3 to retrieve files from a datalogger running OS 28.00, files could only be retrieved if the drive was omitted or if more than one file pattern entry was entered. For example, specifying usr:*.csv no longer worked when using LoggerNet 4.x with a datalogger using OS 28.00. The work around in LoggerNet was to specify a pattern that did not contain the drive name, for example *.jpg, or to add a second entry. The problem arose because the LoggerNet server was using a “/” character as the path delimiter instead of the “:” character.
  • Fixed GetDataRecord() by initializing an uninitialized pointer. The symptom was the process of running GetDataRecord() would corrupt the first variable in memory.
  • Fixed FTPClient() when using comma separated file names for LocalFileName. Introduced with OS version 28, the first comma in the list of file names was being replaced by a null character, causing FTPClient() to think only one file name was being specified, subsequently causing unexpected behavior.
  • Changed BRHalf() by returning to a new safe state (ready for Battery()). The symptom was a voltage spike was being generated on the SE channel when the BRHalf() instruction was not preceded by a Battery() instruction. This was found because of, but not limited to, an observed 10-15 deg measurement when the potentiometer of a 05103 was actually within its deadband.
  • Changed PPP to fix memory leak when the modem drops the connection but the datalogger did not detect the drop.
  • Changed the LwIP code to close IP connections without using additional memory. The symptom was that that datalogger in a heavy traffic TCP/IP environment was watchdogging. The LwIP code was modified so that when closing a connection it always calls the error call back function. This is done so that the API knows that the connection is truly closed. Previously it was looping and causing a doubling of pbufs which would eventually watchdog the datalogger.
  • Fixed a memory (TCP_PBUF) leak when a connection times out when waiting in a closed state or in a sync received state.
  • Modified the TCPOpen() server time-out so it now renews when transmitting data. Previously the timer only renewed incoming data.
  • Fixed VibratingWire() instruction so it now works. It was broken in OS 27.00.
  • TableFile 64 mode changed to close input and output TOB3 files when the tablefile output fails. This fixes a problem when the disk fills up in ring mode.
  • Fixed the data collection find record calculation to not request more records than will fit in the allocated output buffer. This was only for non-interval tables. With record sizes <= 8 bytes, there was a possibility of memory corruption if no table in the program had a record frame size < ~1600 bytes and the max PakBus packet size was set at 1000.
  • Fixed possible lock-up in file system if FAT is corrupted on a SD card. Prior to this fix, the card would have to be removed in order for the datalogger program to resume running.
  • Fixed Status table by reinserting the CAOOffset field which had been removed in OS 28.00. CAO is working properly in OS 28.00, but the field was omitted from the Status table.
  • Major
    Upgrading from versions prior to version 28 of the Operating System will reset the datalogger’s CPU drive. This is due to a change in the format of the file system from FAT16 to FAT32. In order for the datalogger to operate correctly, as part of the upgrade, the CPU drive is formatted to FAT32. Any programs stored and running from the CPU drive will be lost. It is not recommended to update the datalogger’s Operating System over a remote connection where program control regulates the communication equipment (turning it on or off, etc.). In these cases, an on-site visit and a backup using DevConfig’s backup utility is necessary to update the datalogger’s Operating System.In all cases where the datalogger is being updated with an Operating System prior to 28, the use of DevConfig’s backup utility is recommended due to the fact that the CPU drive is formatted using the new FAT32 format. Watch the Video Tutorial: Sending an OS to a Local Datalogger.
v28February 26, 2015
  • Added auto-IP to all Ethernet interfaces. The default auto-IP address for each interface is 169.254.67.85.
  • Removed IPInfo from the status table. It remains in the settings table, via CRBasic, and the settings editor.
  • Added the IPInfo() instruction which provides a way to return the remote IP address of a connection handle. If the handle number is greater than or equal to 100, it will return either an IPv4 or IPv6 address. The second option of IPInfo() is ignored when the connection handle is greater than or equal to 100.
  • Changed Status.CommsMemFree to a multi-line string field. Previously it was an array of three integers. Access via CRBasic using StringVar = Status.CommsMemFree.
  • Fixed updating CommsMemFree when monitoring the status field via CRBasic.
  • Changed FTPClient(), EmailSend(), HTTPPost(), and HTTPPut() so that, when streaming data, a -2 will be be returned if the interval > 0 and the table is Status, Public, or the Constant table.
  • Fixed stack allocation when email, FTP, and HTTP clients are within a subroutine or function that is declared in a different sequence than when executed at run time. This sometimes resulted in a watchdog.
  • Limited IPRoute() to not execute at compile time unless it is before BeginProg in the CRBasic program.
  • Modified IPRoute() so it can be changed on the fly.
  • Fixed PPPOpen() when assigning return value to an element in an array.
  • Changed serial comport shutdown process used by PPPClose() and SerialClose() to wait for the comm task to finish transmitting before they shutoff the comport.
  • Fixed data table streaming of a single element of an array as in "DataTable.FieldName(2).
  • Added a DHCP server that can be used for WiFi interfaces (e.g. NL240). Includes support for NL240 configured for ad hoc mode ("create a network") and connected by CSIOIP() (configured with Bridge Mode Enabled = TRUE)
  • Added a default DNS server address so that when no DNS servers are specified or none are discovered through DHCP, the logger still has a DNS entry it can try. This default DNS server will always have the lowest priority when present.
  • Changed keeping track of DNS servers so when a network closes, the DNS servers obtained via DHCP for that network will be removed.
  • Added the 0x1000 bit to W sniff of TCP/IP for DNS debug messages.
  • Fixed EmailSend() and other client instructions so they can correctly run in the 4th slow sequence.
  • Changed EmailRecv() so that "From" (sender) information is not required to be enclosed in < > when parsing.
  • Enhanced EmailSend() so that leading spaces are stripped from email addresses before using, when multiple addresses are passed to the ToAddr parameter. Previously, the user needed to make sure the addresses specified in ToAddr contained no leading spaces.
  • Fixed TLS for email so that it will work every time instead of every other time.
  • Fixed email authorization when using CRAM MD5.
  • Added domain name to the EHLO request in our email client.
  • Fixed EmailRecv() to work with base64 encoded messages and attachments.
  • Changed EmailSend() so that the file name drive prefix is removed when specified as an attachment.
  • Enhanced EmailSend() so that leading spaces in file names specified as attachments are removed.
  • Added support for the NL116 and NL121.
  • Add support for IPv6 on all IP / Ethernet interfaces.
  • Fixed EthernetPower to skip turning PPP off.
  • Enhanced FTPClient() in conjunction with the files manager setting (3210) so that it will return the new filename that is controlled by the files manager setting. The new filename is now placed into the local file name variable.
  • Added the ability to access all datalogger settings and status from CRBasic and keyboard display. Previously, some settings were not accessible from the keyboard display or program.
  • Fixed the FTP Server so that is does not release memory twice.
  • Fixed the FTP Server so that ensure that the command buffer is not overwritten.
  • Enhanced FTPClient() by adding NLST option for directory listing.
  • Enhanced FTPClient() by allowing the destination for GET, LIST, and NLST to be a local variable of type string instead of a file.
  • Enhanced FTPClient() by allowing LocalFileName parameter to be a variable array when PutGetOption is -6, -16, -7, or -17. In this case, each file name returned will be written to different elements of the array. Elements not written to will be nulled.
  • Modified the FTPClient() response, written to the LocalFileName parameter, by removing the path from the file name when the LocalFileName parameter is a variable/array (not a local file name) and the PutGetOption is -6, -16, -7, or -17.
  • Changed FTPClient() so that it will null the variable/array passed to the LocalFileName parameter when doing a directory listening and there is no response from the server.
  • Enhanced FTPClient() by stripping spaces after the , (comma) when multiple files are specified for LocalFileName or RemoteFileName.
  • Changed FTPClient() to allow a line without a 3 digit leading code through when parsing responses.
  • Changed FTPClient() so that it starts listening for a data connection before it issues the PORT command. This was done to make sure it is ready to accept when the server tries to open the connection.
  • Changed FTPClient() so that if commands on multiple files are specified, finish operating on the rest, even if the current one fails.
  • Fixed FTPClient() by not requiring multiple local files to be specified when attempting to delete multiple remote files.
  • Changed FTP Client so that it sends "QUIT" command before closing with a failure due to an error response code from the FTP server. This should cause the connection to the server to end sooner.
  • Fixed FTPClient() when streaming with the option to either put in the header or not based on if the file is present on the server. After storing successfully without a header, i.e., detecting the file is present, if the file is deleted on the server we did not redetect properly that it was no longer there.
  • Changed the FTP Server so that the LIST and NLST commands can have paths prefixed.
  • Enhanced FTPClient() so that when streaming a data file, if the FileOption is negative, the header is added only if the file currently does not exist on the remote server. An example of a common example is FTPClient(host,user,pass,"TableName","data.dat",9,0,60,Min,-1008). Note that in this example, the PutGetOption is append and FileOption is both +1000 and negated.
  • Added the maximum number of concurrent FTP Server connections and limited it to 8.
  • Fixed HTTPGet() when the response transfer encoding is "chunked". Symptoms were HTTPGet() not completing / timing out after 75 seconds and chunk values not being parsed but instead showing up in the result.
  • Updated http by setting a timeout if a stray http packet is received to help prevent using datalogger bandwidth. This was done so we don't waste bandwidth trying to poll for the rest of the packet continually.
  • Changed HTTPGet() so that if there is an error and the response is directed to file, it then writes the error message to the header parameter if it is a variable.
  • Added a new IP trace code of 0x800 (2048) for http.
  • Fixed the HTTP web server for file names and unknown file types.
  • Modified HTTPGet(), HTTPPut(), and HTTPPost() so that they can be used against a HTTPS:// URI even when the URI is a variable. TLS will be enabled and memory allocated for each Sequence when it contains a HTTPGet/Put/Post command and a URI that is a variable or when the URI is a constant specifying a HTTPS:// address.
  • Added Content-Disposition to the web server.
  • Removed possible window (very small) where JSON files would return "more-true" when there is no more. (significant)
  • Fixed web server when displaying string variables with a '%' embedded.
  • Changed web server so that the number of records displayed is not limited to the size of the CPU table size when a card is in use.
  • Changed HTTPGet() so that if the destination is a file, it will not be opened until after the connection to the server is made. This prevents a file serial number, controlled by the Files Manger, from incrementing when the connection cannot be made, avoiding gaps in the serial numbering and hence fewer files kept than specified by the Files Manager Setting.
  • Fixed NTP when the domain is not cached and needs to be obtained via DNS server. A 0 offset was
  • Changed PakBus hop metric for TCP connections to be 1 sec instead of 5 sec unless the connection is over PPP.
  • Changed PakBus/TCP to not close the TCP connection if a route is lost but neighbors still exists on the connection.
  • Fixed PakBus/TCP Password authorization so that the TCPOpen() does not return a connection before the authorization is complete. This manifested as not being able to connect with Konect GDS.
  • Fixed dialing a modem via PPP or Modem Callback so that if dialing fails, and the modem outputs unknown characters to the datalogger, that the echo process continues to work.
  • Fixed PPPClose() to get rid of the 5 second delay and to not inadvertently close the NL240 also.
  • Fixed possible asynchronous problem when dialing a modem with PPP.
  • Removed looking for "CLIENT" while connected in PPP.
  • Modified PPP so that if a comport is setup for PPP, don't let any characters enter the Terminal Mode even if the program has closed PPP.
  • Changed PPP so that when closing the session is unsuccessful, send +++ and AT+CGATT=0 to try to get the modem off line.
  • Enhanced PPP dialing messages in IP trace and IP status.
  • Fixed PPP so that a static IP address can be used.
  • Modified SNMP string variable to make sure we cannot overwrite size of 255 characters max.
  • Fixed SNMP ESS stations for setting strings and for a blank community name.
  • Added SNMPVariable() to map variables into an SNMP OID.
  • Changed TCPOpen() to allow listening on a port for multiple concurrent connections.
  • Enhanced TCPOpen() so that when it is listening on a port (IP address is null), it will handle multiple concurrent connections up to MaxConnect connections. When used this way, TCPOpen() is not to be called in a loop for each connection as is done when the multiple connections are as a TCP client. Rather, for each connection that is accepted, a vacant slot in the array is found and filled in with the connection handle. This allows multiple connections to be handled by the service protocol defined by serial I/O instructions. TCPOpen("",3000,1000,7500,Handles,MaxConnections) 'listen for multiple connections on port 3000. For I = 1 to MaxConnections : If Handles(I) > 100 Then : IPAddress(I) = IPInfo(Handles(I),1) : Else : IPAddress(I) = "" : EndIf : Next I
  • Changed TLS memory allocation to accommodate more than 1 HTTPS connection concurrent within the same sequence since these connections can stay open after the instruction exits.
  • Increased the stack size for TLS needed for TLS client connections.
  • Changed TLS memory allocation to wait for up to 3 minutes if memory is not available instead of watchdogging. This will help when running TLS concurrently in different CRBasic sequences.
  • Modified UDPDatagram() so that when the IP address is blank, it will listen for and queue up incoming datagrams. Also UDPDataGram() will return a connection handle when a datagram is queued, put the received data into the UDPRecVar variable, and indicate the message length of the received data in the UDPSendLen variable.
  • Fixed keyboard display security challenge to not incorrectly re-challenge when backing out of a secured menu.
  • Changed indentation (reduced) of displayed values while editing constant in ConstTable.
  • Added in keyboard display ConstTable editor an "Apply and Restart" flag that will cause the changes to the ConstTable to be applied and the program restarted. This behaves the same way as when you escape from the ConstTable menu and are prompted to save the changes.
  • Updated keyboard display of settings to show all logger settings available. Previously only a subset of settings were displayed for editing.
  • Changed keyboard display of settings. Settings are split into "general" and "com ports".
  • Fixed keyboard display directory of a card with > 2 Gig memory.
  • Changed the Communication Allocation setting to also adjust the big packet size (the second field in the first line in CommsMemFree). This is needed so the logger can stream in large generic data packets for serial I/O.
  • Changed FTP and HTTP putting files onto the datalogger to do it from the IPServer task so that if was it was taking too much time in the IP task, it would cause it to not watchdog.
  • Fixed writing an IP trace file in cases where the disk/drive was full.
  • Modified IP static and dynamic routes to give precedence to static routes.
  • Changed TCP/IP Info so that the default network is listed. The default network is listed as “XXXXX is Default Network” where XXXXX could be CSIO(1), CSIO(2), ppp, or eth. Instructions that need access to a specific TCP/IP address (or DNS name) that has not been listed in the IPRoute() instruction will use the default network to try to do its work. Those listed in the IPRoute() instruction will use the specified Ethernet interface to do its work.
  • Modified it so that IP Info displays ipv6 default routers.
  • Changed 'W' sniffing of IP trace so that it restores the original trace code when it exists.
  • Fixed SetSetting("PakBusTCPClients","1.1.1.1:6785") to allow a : (colon) before port. The officially recommended syntax is SetSetting("PakBusTCPClients","(host1,port1)(host2,port2)(host3,port3)(host4,port4)"), however in reality the host and ports need only a) to be specified as one single string and b) be separated by a delimiter like space, comma, colon, semi-colon, etc.
  • Shortened the advertised wait time for TCP when doing os_recompile.
  • Fixed data streaming triggered by the offset into interval parameters when the units were something other than seconds.
  • Fixed data table streaming of a single element within an array.
  • Enhanced IPNetPower() so that when turning power off to an IP network, if no other network is active, all the IP connections will be closed.
  • Changed IP tracing we don't run into a possible, rare, memory leak of CommsMemFree when concurrent tasks are IP tracing.
  • Modified TCP/IP Info so that if no IP networks are present, it will display "No IP Networks".
  • Fixed some communication instructions including AVW200's when the route is via TCP/IP but with a static route.
  • Added string length attribute to JSON and XML queries.
  • Fixed JSON formatted files (missing head) generated by TableFile and by streaming via FTP, email, and http. (significant)
  • Changed initialization of data streaming based on interval in the case there are records already stored on the first execution.
  • Added a 6th parameter (optional) to DNP instruction; 1 means TLS enabled.
  • Fixed DNP3 when the swath for the DNPVariable instruction is 1.
  • Fixed SDM-SIO1 DNP3 Master.
  • Changed the DNPFlag parameter so that if the flag parameter is smaller than the array for the source parameter, then the last element of the flag array is used for all of the remaining source array elements.
  • Changed the DNPEvent parameter so that if the DNPEvent array is smaller than the source array, the last element of the DNPEvent array is used for all of the remaining source array elements.
  • Changed DNP3 so that more than 65535 events can be stored and so that it does not use twice as much memory as needed.
  • Added DNP3 indexing into arrays so that multiple DNP3 classes can be specified with one source array.
  • Changed DNP datagram implementation so that if DNP comport parameter is negative then PakBus Datagram is activated.
  • Added support for DNP3 object 110 (string).
  • Added support for DNP3 group 21 (frozen counter).
  • Added DNP3 group 0, variations 240, 241, 242, 243, 247, 248, 250, 252, 254, 255.
  • Added an optional parameter to DNPUpdate() called ConnectHandle that provides a TCP Connection Handle controlled by TCPOpen().
  • Added support for DNP3 Unsolicited Responses.
  • Added support in DNP3 for single precision floating point.
  • Added DNP3 support for object 50, variation 1 (read time and date).
  • Changed the meaning of the link verification, timeout parameter in DNP() as follows: 1000 = Disable link layer confirmation, disable link verification, application layer timeout is 60 seconds. 1sss = Disable link layer confirmation, disable link verification, application layer timeout is sss seconds (max is 60 seconds). 0000 = Disable link layer confirmation, enable link verification, application layer timeout is 60 seconds. 0sss = Enable link verification, link layer and application layer confirmation timeout is sss seconds (max is 60 seconds).
  • Fixed erroneous closing of comport that is open for PPP or serial comms when characters directed to the terminal are intercepted.
  • Fixed GetVariables() responding to command when the remote wants ASCII and our variable is NSEC (timestamp), return the date/time instead of NAN.
  • Fixed GetVariables() when the destination variable is an array of type string and is referenced with a variable index into the array.
  • Fixed GetVariables() when the destination variable is of type string but the value in the remote is of some other type.
  • Changed PakBus routing so that if a static route is specified by the neighbor address and there is also a route to the destination with the same neighbor address as specified statically, then use the comport to the neighbor in the list instead of the statically declared comport.
  • Changed PakBus set value so that it can set an FP2 value when the source is not FP2.
  • Fixed the Routes() instruction for a non-router in the case that there are "potential neighbors", as in the case when there are allowed neighbors that have not been verified.
  • Modified SerialOpen() so that if a delay is specified before transmit on the comport, then wait an extra 3 * the delay time when sending ring packets out before the main packet.
  • Increased terminal stack size by 1K.
  • Fixed Network() for a fixed begin address.
  • Fixed displaying SDI-38 in status instead of SDI-12 when using CWB100.
  • Changed terminal mode so that characters cannot enter terminal from a comport that is being used by the program via SerialOpen().
  • Modified fwrite_bytes so that if MBX is full and does not succeed, releases memory.
  • Fixed SendData (PakBus one way data send) when sending the Public table.
  • Changed behavior when the Beacon Interval or Verify Interval is changed so that PakBus neighbors are verified instead of a broadcast hello request message sent out the comport.
  • Files Manager setting for 3209 ("sniff") and 3212 ("IP trace") changed so that (1) a drive can be formatted if the setting is actively writing to the drive, (2) if writing to a CRD, pushing the card button will temporarily halt writing to the file, and (3) deleting the setting will allow the file to be deleted.
  • Modified SerialOut() so that when waiting for echo, or for a string, will flush the buffer before each output.
  • Changed SDE Enable Comport to 31 instead of 16 and allow the compiler to pass this comport into SerialOpen without error.
  • Fixed initializing card pointers after a power cycle. Problem occurs if there is a power cycle and a table using DataInterval is writing to the card and has written a sector to the disk but has not gone far enough to write a full TOB3 frame and update the card record number. When power is restored, the file pointers are not correctly aligned after resuming operation. This results in a file that cannot be converted without the repair option. The fix is to move the read pointer back to the start of the CPU buffer so the first sector is written again.
  • Changed the behavior on program start when using existing files on a card. If a power cycle occurred during card initialization, it often resulted in a yellow light and data not being written to the card. The behavior was changed so that if at program startup, initialization of an existing data file fails. The associated files are deleted and new files are created. The thinking here is that the files were deemed to be corrupt anyway, so removing them and starting fresh seems better than leaving the logger not writing to the files. (significant)
  • Fixed SendVariables() and GetVariables() when the timeout expires at the same time the response is received in the case where the response code and/or source or destination parameters are variably indexed.
  • Modified SerialOpen() if it specifies PakBus Active and TXDelay and fragment size, then delay 4 * TXDelay extra before retrying hello message.
  • Changed Files Manager setting for 3209 ("sniff") and 3212 ("IP trace") so that (1) a drive can be formatted if the setting is actively writing to the drive, (2) if writing to a CRD, pushing the card button will temporarily halt writing to the file, and (3) deleting the setting will allow the file to be deleted.
  • Removed adding 8192 bytes to the size specified when setting the USR drive size.
  • Modified starting a slow scan to wake up slow measurement task immediately.
  • Added SC115 change file attributes.
  • Changed shutting down a comport when it is used as a control port instead.
  • Changed setting user (USR) drive size so that it maxes at 2990000 bytes.
  • Added warning message if the CPU: drive cannot be opened; give warning message and format the drive.
  • Changed SerialInChk for SDM-SIO1 to return 13 bits of receive data. It is no longer meant to return the most significant bit.
  • Corrected a problem using the Const declaration when using values exceeding (2^31) – 1 (2,147,483,647). If a value greater than (2^31) -1 was used as the constant, the actual value used in the program was 2,147,483,647. If a user's program contains a Const declaration with a desired floating point value greater than 2,147,483,647, they can correct previously gather data by doing a simple calculation. To correct calculation errors caused by this issue a user will need to reprocess values obtained using the erroneous constant. For example if the Const in question was used as a multiplier, you should divide the result by 2,147,483,647, then multiply by the actual desired constant.
  • Changed compiler to allow a reference to tablename.fieldname() to act the same as tablename.fieldname.
  • Fixed compiling a program that is missing a referenced sub routine. This was crashing the PC compiler since FunctionsPtr is NULL yet was used.
  • Changed compile time error checking so that we don't flag a compile out of bounds error for covariance if a variable index is issued for the source. At run time an out of bounds will be flagged if necessary.
  • Modified SpaAvg() so a compile error will be reported if the swath parameter is a constant that is beyond the boundary of the source array.
  • Add -u command line in PC compiler. This option will instruct the PC compiler to check for and report unused variables and subroutines. For example "cr1comp.exe -u myprog.cr1" would report "Warning: VarA declared but not used" if myprog.cr1 had a variable VarA declared, but VarA is not actually used within the program.
  • Enhanced Instr() function by adding Search Options 9 and 10. Search options 9 and 10 find the start of FilterString, starting at the end of the string and searching backwards through SearchString until it finds the beginning of FilterString, reaches the StartString position, or reaches the beginning of SearchString. Option 9 performs a case sensitive search. Option 10 performs a case insensitive search.
  • Modified the pre-compiler code so it no longer allows Subroutines to be declared inside If..EndIf. Catch unterminated If in EndSub.
  • Added OSVersion to predefined constant list. This predefined constant can be used to determine the datalogger operating system version at compile time, which can be particularly helpful for conditional compilation of programs using #IF/#ELSEIF/#ENDIF.
  • Changed SetStatus() changed so that the settings list is checked first to determine if the field to be set is in both the status table and in the settings (like "StationName"). If so, the setting will be changed along with the status table. This change was introduced due to the restructuring of the Status table and settings and with the introduction of the SetSetting() instruction.
  • Added new datalogger settings, EthernetEnable, CSIO1netEnable, CSIO2netEnable. Setting to FALSE will turn off / disable the associated interface unless the setting is changed to TRUE or unless IPNetPower() or EthernetPower() are used to turn it on under program control. The new settings specify the power state of the interface at boot up.
  • Added new datalogger setting, DeleteCardFilesOnMisMatch. This setting controls the behavior of the datalogger when it restarts with a different program and it detects that data files created by the CardOut() are present but do not match the new program. If this value is set to one, the datalogger will delete these files so that new files can be stored. If set to a value of zero, the datalogger will retain the existing files and prevent any data from being appended to these files. The default is 0 so that the default behavior is the same as it has been prior to the addition of this setting.
  • Removed compile warning message in the case that an infinite scan/nextscan is inside a conditional statement.
  • Enchanced IfTime(), TimeIntoInterval(), and DataInterval() by adding interval Units option of Mon (Month). MON is the predefined constant for MONTH and has a value of 6. This option behaves differently than the other parameters. If the UNITS parameter is MON, the INTERVAL parameter is specified in months, and TINTOINT parameter is specified in seconds into the current month. The INTERVAL is synchronized to the beginning of the year, January 1st. If the current month of the year modulo the INTERVAL equals 1 and the seconds into the current month matches the TINTOINT, then the condition is true. If TINTOINT is negative, then the TRUE condition will be in the previous month. Examples, IfTime(0,1,Mon) 'true at midnight on the first day of every month : IfTime(1209600,1,Mon) 'true at midnight on the fifteenth day of every month : IfTime(-43200,1,Mon) 'true at noon on the last day of every month : IfTime(0,3,Mon) 'true at midnight on the first day of January, April, July, and October
  • Modified the compiler to flag an error if the iterative variable in For/Next is not a variable.
  • Fixed PWM() when using multiple PWM() instructions on same port. Previously doing this caused caused the duty cycle of the non-first PWM's to be zero due to an uninitialized pointer. The work around for previous OS version is to use one PWM per port and make the duty cycle a variable.
  • ETsz() changed to force units and fieldnames.
  • Array manipulation fixed when the dimensionality is 2 or 3.
  • Added default units of mm and MJ/m^2 for ETsz().
  • Fixed compile error for PC compiler due to an out of place declaration.
  • Fixed setting of an array element contained in an array that is only partially aliased. The problem only occurs when the array is split into more than one part (through discontinuities in the alias process) and you are accessing a part that is above the alias. When I found in the table the array name (the first part, below the alias) but found that the element requested was not in that first part, I aborted looking beyond and flagged the error. The fix is to instead keep looking through the table.
  • Fixed NewFile() to work with a Boolean result. If the type is Boolean, rather than incrementing if the file is not there, it is set to -1.
  • Modified subroutines to pass back strings and make sure the last character is 0.
  • Fixed maximum error check to make sure the error message is not too large. The bug would cause an out of bounds memory crash on the PC compiler for errors in a long line.
  • Changed SolarPosition() to use UTC_OFFSET setting if it is not -1 (inactive).
  • Fixed sprintf(dest,"%b",val) when val is negative.
  • Modified Files Manager setting 3209 so sniffing will start up when card is inserted. Also when the card is removed or the drive formatted, it will close the file it was writing to.
  • Fixed FieldNames() so it will flag an error if the parameter is a variable.
  • Fixed alias strings when the variable they are aliasing has a string length of 1 (single character aliases).
  • Fixed Public declaration of d (or D) followed by 3 or more spaces or tabs. This was causing compile issues.
  • Added OS version to the watchdog file.
  • Modified the compiler so units name of " (empty string) is flagged as illegal.
  • Changed FieldNames() so that it accepts a constant string.
  • Added an optional parameter to Sample() which will define the field in the most recent record as READ_WRITE if the parameter is 1.
  • Modified the precompiler so it no longer allows subscan to call a subroutine with measurements.
  • Enhanced it so that we now initialize exe_time_us so PC CRBasic compiler does not crash.
  • Changed CDM instructions to allow certain parameters to be searched from module specific predefined constants rather than the global datalogger defined constants.
  • Added Encryption AES128 support in CRBasic.
  • Enhanced the OS so we now allow ! (at pointer) operation on user function calls.
  • Added new instruction TimeIsBetween(Begin,End,Interval,Units). This instruction will return true if the datalogger's time is between Begin and End, otherwise it will return false. If used within a Scan() the scan time will be used, otherwise it will use real time; this is the same behavior as the RealTime() instruction. A common application of this instruction is to turn a communications peripheral on between 9:00 and 17:00 and off during all other times, TimeIsBetween(9,17,24,Hr).
  • Added a specific error message on SetSettings() and SetStatus() if they cannot find the wanted field.
  • Fixed array assignment so that this case C(1)() = A() is now possible.
  • Added ! and @ operators that provides pointers to variables.
  • Fixed formatting CRD: for very large (>2G) cards.
  • Fixed the PC CRBasic precompiler. A variable declared inside of code does not compile in the Microsoft environment.
  • Fixed to now allow the table name in GetRecord() to be a variable.
  • Modified it so that if the table name is a constant, then allow Tablename.Fieldname and GetRecord(tablename) to work with the constant declaration, as in : Public MyInfo As String, MyRecord As String * 50 : Const T = "Table" : Public Name As String : DataTable(T,TRUE,-1) : Sample (1,Name,String) : Sample (1,"Hi",String) : EndTable : BeginProg : Name = "Hello" : Scan(1,sec,0,0) : CallTable(T) : MyInfo = T.Name : GetRecord(MyRecord,T,1) : NextScan : EndProg
  • SDI-12 recorder changed so that if 0 is returned for the number of values in response to the M or C command, NAN is put into the first element of the array and the instruction returns.
  • Modified the OS so that the CPU: is now FAT32 formatted. This eliminates the error of insufficient space for file names. (significant)
  • Thermistor parameter changed: removed reverse diff option.
  • Fixed compiler a crash for this and other possible illegal syntaxes: Public = name.
  • The default string size is now 23. (significant)
  • Changed the string declaration minimum size from 23 to 3.
  • Changed the error message when declaring units to a variable that are not declared Public nor referenced as a source in a Data Table.
  • Fixed FP2 to string conversion that were causing errors in conversions.
  • Modified Table.Field(x) to now ignore x if only 1 single dimensioned field name "Field".
  • Fixed calling a table from a scan with an interval greater than 1 hour when the table does not use DataInterval().
  • Fixed For .. Next name(i) to not flag an error ("Too many parameters").
  • Fixed Windvector() standard deviation calculation when disabled at output time.
  • Added new IPAddress() CRBasic instruction.
  • Added a reset optional parameter to AvgRun().
  • Added TotalRun() instruction. The TotalRun() instruction The TotalRun instruction is used to output a running total of a measurement.
  • Modified the compilers so they will work with optional parameters in a user function. Commas are not required when calling the function without the optional parameters.
  • ArrayLength(Field) changed to allow the Field parameter to be TableName.FieldName.
  • Added command line switch -s for signature to the PC CRBasic precompiler.
  • Modified SetStatus() and SetSettings() so they will execute at compile time if the value is not variable and if the setting is changed and requires a reset. The reset will not happen until the compile process is complete, which avoids possible multiple resets if multiple settings are changed.
  • Fixed frequency bounds checking for CDM-VW300.
  • Improved VibratingWire swept frequency when using the auto-step size.
  • Modified the compiler so it no longer allows PulseCount() within a SubScan.
  • Fixed the Case expression so that conversion of the expression or the test expression from string to numeric, if necessary, is performed before the equality test is performed.
  • Changed Select() to not require Case before the test expression. Select expression is legal and is the same as Select Case Expression.
  • Fixed the "Case NAN" statement to work correctly when the test expression is a NAN.
  • Fixed the precompiler when there is a CASE IS statement and the required comparison operator is missing. It now flags an error.
  • Modified the OS so we can store Settings.name via the Sample() instruction in a data table.
  • Fixed passing subroutine parameters in and out and when doing a conversion from float to string is necessary. The string was formatted as "%7g" instead of "%.7g".
  • Enhanced the OS so that when passing a parameter of type string, we copy the size allocated for the destination variable instead of the size of the incoming string. This will allow null characters to be passed in.
  • Fixed format printing FormatFloat() and sprintf() when using %.ng (and G) where n is the precision (the number of significant digits) needed.
  • Allow the syntax ArrayName(Index)() to be used with the Disable Processing parameter to rep through an array starting with Index.
  • Modified SolarPosition() by removing limiting the zenith angle to 9 degrees.
  • Changed SolarPosition() Azimuth calculation to match SolPos.c rather than the Fortran and CRBASIC adaptations received from RSR2. This was done to help make SolarPosition() more accurate.
  • Added the EncryptExempt() instruction. The EncryptExempt instruction is used to define one or more PakBus addresses to which the datalogger will not send encrypted PakBus messages, even though PakBus encryption is enabled.
  • Fixed XMLParse() so that if the result code is an error or it is at the end of the file, then close the file and release any memory used by the large string. Also, eliminated the need to "Initialize" and added "Finished" in the element name space to specify done with parsing.
  • Fixed XMLParse() where, in some cases, it did not parse correctly when white space followed an = character.
  • Added two optional parameters to ConstTable so that it now has the optional syntax of ConstTable(TableName,Hidden). TableName is specified as a unquoted literal. The Hidden parameter specifies if the table should be hidden always when security is not used or only shown when security level 1 is entered, i.e. the same behavior TableHide() creates for DataTable. Specifying TableName, causes the datalogger to map the constants in the ConstTable to a one record datatable (like Public, Status, and DataTableInfo). The table will automatically include an "ApplyAndRestart" field that when set true (non-zero), will cause the current values of datatable fields to map back into the constants in the ConstTable and then restart/recompile the program. This process updates/changes the text of the CRBasic program residing in memory. This new feature allows the ConstTable to be easily updated from software just like the Public table can be.
  • Added the ability to change constants in ConstTable(TableName)/EndConstTable under program control using the syntax of SetSetting("TableName.ConstantName",Value), including the auto-created ApplyAndRestart field. This only applies when the ConstTable has been assigned a table name.
  • Added a new program structure called ApplyAndRestartSequence/EndApplyAndRestartSequence. This instructions inside this sequence are executed when the ApplyAndRestart field of the ConstTable(TableName) is remotely set true, i.e. set from outside the program - most likely from KD or software, but before the values are mapped back and the program recompiles. The intention is that a user can validate the values of the ConstTable before they are applied. Example usage is : ConstTable(Settings) : Const A = 1 : Const B = "Hello" : EndConstTable : ApplyAndRestartSequence : 'if trying to apply an out of bounds value for A, set it back to the current value : If Settings.A < 1 OR Settings.A > 10 Then SetSetting("Settings.A",A) : 'if trying to apply an empty value, set to "ERROR" : If Settings.B = "" Then SetSetting("Settings.B","ERROR") : 'REQUIRED AFTER VALIDATION IS COMPLETED : SetSetting("Settings.ApplyAndRestart",TRUE) : EndApplyAndRestartSequence
  • Fixed Function references with op eq (+=, -=, &=, etc.) when operating on a function return variable.
  • Added a flag to account for a compile error when doing FunctionName +=, &=, etc., operations.
  • Modified the Move() instruction's source parameter expression so it can be more than a simple expression and allow an auto indexed variable, as in SrcVar1() * 2 + SrcVar2().
  • Added %I in snprintf() to allow printing IPV4 addresses from a LONG input.
  • Fixed ABS(X) which was broken in OS26 when the expression X is of type float and ABS() is inside an expression with arguments with a type of LONG preceding ABS(), as in 100 * ABS(X).
  • Quadrature() changed to allow multiple data types in result.
  • Fixed AVW200() to allow .01 as a valid threshold. This problem was caused by a double precision comparison of a float value. The MIN_THRESH_HOLD was defined as .01. The compiler used doubles to represent this value. The user input was .01 as a float which is not exact. The fix was to force the defined threshold to be a float.
  • Added options to InStr() to search from end of string.
  • Fixed a memory failure issue with Windvector().
  • Modified OS to allow ApplyAndStart() to be true if non-zero.
  • Fixed pointer operations and added a . qualifier to the ! operation to ensure pointers to floats do not truncate the fractional part when used in an expression where the following operand is long.
  • Changed GoesSetup() to that the minimum interval can be set to 5 minutes rather than 10.
  • Changed SDI12Sensor() so that if the response time specified is 0, then 1 second is used in the response. In reality the logger is not ready to receive data instantaneous.
  • Modified the OS so when resetting the settings coming from OS download. For the control port /comports, set the flag that says the baud rate was set via the settings instead of from serial open.
  • Changed warning message from "Default Settings were removed" to "Default Settings might have been removed" since when coming from downloading an OS via LoggerNet or FileControl, if the settings are different, the default settings are restored but then all the settings that were the same in the old OS are then restored, meaning that only new settings are set to default.
  • Removed OS version from check to using data on a card.
  • Fixed loading a .gz zipped OS file.
  • Added a 40 second timeout loading OS via file tab, after which it will commit the OS if not Set maximum number of tables that have Tablefile() to 30. (significant)
  • Modified the OS for streaming data so that the optional parameter 'interval' cannot be non-zero when the table specified is Public, Status, ConstTable, or DataTableInfo. Also, when streaming Public, Status, Constant, or Datatableinfo, increment the record number so there is a record to send.
  • Fixed the compiler to flag an error if more than 1 DataEvent is declared inside a Data Table.
  • Fixed compile error for reps=0 in final storage instructions.
  • CPUBytesFree, USRBytesFree, and CardMemFree moved out of the Status table but can still be accessed via CRBasic, or PakBus, or the K/D under Settings.
  • Allow CPI fields to be cleared.
  • Moved the Data Table information from Status to DataTableInfo. (significant)
  • Changed Status.CommsMemFree to a string variable. (significant)
  • Enhanced expressions so that an entire array can be assigned to an expression.
  • Fixed getting tablename.fieldname(N) where N > 1 and the field's beginning index is > 1.
  • Allow > 30 data tables. (significant)
  • Removed several items from the Status Table that are settings. All settings can be set with SetSettings() and with the keyboard display. SetStatus() is identical to SetSettings(). Access to all settings is through the syntax of Settings.name or through Status.name.
  • Enhanced the OS so it now reads port status and SW12 when getting the Status table.
  • Fixed SDM-SIO1 ModbusMaster() problem with back to back requests if the timeout happened a little before data comes in from a preceding request.
  • Fixed ModBusMaster() to properly respond with -11, -16, and -20 for internal errors.
  • Enhanced ModbusSlave() so that ReadOnly instruction also applies to Modbus registers and coils; previously it only applied to PakBus communication. If a master/client attempts to write to a register or coil that has been marked as ReadOnly, the datalogger (slave/host) will set the most significant bit in the function code when responding, indicating an error, and the actual error code to a value of 0x01. It is very common for the datalogger acting as a Modbus slave/host to only need to serve up data values and not allow them to be changed. Example, Public Reg(5), Coil(2) as Boolean : ReadOnly Reg, Coil : BeginProg : ModbusSlave(502,0,1,Reg,Coil,2) : EndProg
  • Fixed ModBusMaster() over TCP when more than 1 response is in a single IP packet.
  • Enhanced ModBusMaster() instruction to optionally not wait until the response is returned.
  • Enhanced the Modbus option so that at run time the Modbus option can switch back and forth from ASCII to not ASCII.
  • Fixed ModBus ASCII Slave over a SDC comport and also if there are more characters input beyond the line feed terminator of the packet.
  • Fixed ModBus ASCII over a serial comport if there are delays in the packet returned.
  • Changed ModBus Master over TCP so that an incrementing transaction number is sent and multiple Modbus Masters can run concurrently in difference sequences.
  • Added ModBus Slave to be a TCP Client using the connection comport handle returned by TCPOpen().
  • Added ModBus start register offset to be greater than 10000.
  • Fixed ModBusSlave() when multiple instructions over TCP/IP are used in order to map different Modbus registers of different types to datalogger variables. Before, this worked only if all of the instructions specified a non-zero offset.
  • Added a 16 bit unsigned integer data type to ModBusMaster() and ModbusSlave().
  • Fixed Modem Dial to delay long enough for PakBusMain to start dialing before it monitors when dialing is complete to flag whether or not it was successful.
  • Added support for DNP3 single-precision floating point variations to Objects 30, 32, 40 and 41.
  • Enhanced IfTime(), TimeIntoInterval(), and DataInterval() by adding interval Units option of Mon (Month). MON is the predefined constant for MONTH and has a value of 6. This option behaves differently than the other parameters. If the UNITS parameter is MON, the INTERVAL parameter is specified in months, and TINTOINT parameter is specified in seconds into the current month. The INTERVAL is synchronized to the beginning of the year, January 1st. If the current month of the year modulo the INTERVAL equals 1 and the seconds into the current month matches the TINTOINT, then the condition is true. If TINTOINT is negative, then the TRUE condition will be in the previous month. Examples, IfTime(0,1,Mon) 'true at midnight on the first day of every month : IfTime(1209600,1,Mon) 'true at midnight on the fifteenth day of every month : IfTime(-43200,1,Mon) 'true at noon on the last day of every month : IfTime(0,3,Mon) 'true at midnight on the first day of January, April, July, and October
  • Modified OS to allow value in SetSetting("ApplyAndRestart",value) to be true if non-zero.
v27.05December 5, 2014
  • Fixed an error with the datalogger’s Telnet server where memory was not being freed correctly and duplicating use of the packet queues. The symptom of the bug is that the datalogger runs out of communication memory and becomes unresponsive after a period of time.
v27.04July 7, 2014
  • Fixed an issue with the ModBusMaster where ResultCode was not incrementing correctly when not receiving a response from a ModBus slave.
  • Corrected an issue with overflowing integers that caused scan intervals greater than 70 minutes to act erratically and not run on their set interval.
  • Fixed FTPClient() to timeout correctly if the attempt to make a non-passive data connection that is used for the data transfer fails. The symptom is that the FTPClient() instruction will hang forever. Note, this is not the command connection initially opened to the server but rather after this succeeds the server fails to open the data connection with the datalogger.
  • Added a fix to disable the Ethernet interrupt long enough to guarantee a busy logger has time available to recover after a sustained burst of Ethernet activity.
  • Fixed an issue in the CR800 with an uninitialized pointer when doing SendData with the public table. In the CR800, memory lined up in such a way that the pointer wrote to hardware which then immediately triggered a watchdog. On a CR3000 and CR1000, this same issue would sometimes cause erroneous "Variable Out of Bounds" messages.
  • Fixed email authorization when using CRAM MD5.
  • Fix ftpclient when server responds with a multi-line response.
v27October 18, 2013
  • Added the EncryptExempt() instruction which allows for encrypted communication with a set of predefined PakBus nodes.
  • Improved CardOut() and TableFile(64) immunity to unexpected power cycles. Previously, file pointers could become misaligned when resuming from a power cycle. This would occur when the power cycle occurred after a data table using DataInterval() and CardOut() had written a data sector to disk but had not written a full TOB3 frame. The resultant file cannot be converted without using the repair option in Card Convert. An improvement was made to move the read pointer back to the start of the CPU buffer so that the first data sector is written again.
  • Changed the behavior on program start when using existing files on a card. If a power cycle occurred during card initialization, it could result in a yellow light and data not being written to the card. The behavior was changed so that if at program starts up, initialization of an existing data file fails. The associated files are deleted and new files are created. The deleted files were deemed to be corrupt, so removing them and starting fresh is better than leaving the logger not writing to the files.
  • Fixed EmailRecv() to work with base64 encoded messages and attachments.
  • Revised SolarPosition() solar azimuth calculation to match INREL SolPos.c (2001).
  • Fixed web server so that the number of records requested are returned or displayed, including those residing only on the CRD drive.
  • Fixed http when displaying string variables that have a '%' embedded in them.
  • Fixed OS upload via program send so that memory is released when the upload is cancelled.
  • Fixed the BMP server task that hangs on occasion during operating system uploads.
  • Changed terminal W mode so that when a comport has been set up for PPP, we don't let any characters enter the terminal. This also includes those times when the logger's CRBasic programming has closed PPP on the comport.
  • Enhanced PPPClose() by sending the command “+++ and AT+CGATT=0” to get the modem to go offline if the hang up process is previously unsuccessful.
  • Enhanced modem dialing so that when there is a failure the commands “+++ ATH” or “AT+CGATT=0” is sent along with pulsing the hardware (DTR or ME) off then back on.
  • Changed PPPClose() by removing the 5 second delay.
  • Fixed PPPClose() so that it does not inadvertently close the CSIOIP session with the NL240.
  • Increased the buffer size for modem dialing.
  • Changed EmailSend() so that the drive prefix of filenames is not included in attachments. For example, make attachment File.dat instead of USR:File.dat.
  • Changed EmailSend() to trim whitespace in front of file names specified in the attachment parameter.
  • Improved Email streaming from data tables.
  • Enchanced FTPClient(), HTTPPut(), HTTPPost(), and EmailSend() so that they return -1 if successful, 0 if failed, or -2 if execution did not occur when the instruction was called.
  • Fixed data table streaming of JSON formatted files so that header is properly included.
  • Fixed data table streaming so that it is properly executed the first time it it called.
  • Fixed DNP3 communications when getting multiple application fragments. Now, when aborted, confirmed fragments are marked as retrieved.
  • Fixed DNP3 so that watchdog events and skipped scans do not occur prematurely when retrieving event data.
  • Changed DNP3 to not send ResetLinkState when unnecessary and to not request confirmation when the response is NULL.
  • Fixed DNP3 so that FIR bit is not set in single fragment responses.
  • Enhanced DNP3 so that object requests containing supported and unsupported objects are properly parsed and handled. Previously, when an unsupported object was encountered during parsing the transaction would fail.
  • Improved DNP3 to allow a read request to contain a mixture of class and non-class objects.
  • Improved DNP3 to support object 50, variation 1.
  • Fixed DNP3 over IP to handle incorrect start byte(s) or CRC.
  • Changed disable processing parameter of data table output instructions to allow a syntax of ArrayName(Index)(). For example, “Minimum (5,DataArray,IEEE4,DataArray(1)()=NAN,False)”.
  • Fixed the compiler to flag an error for illegal assignments via +=, -=, etc.
  • Fixed Select Case so that "Case NAN" works correctly when the test expression is NAN.
  • Changed SerialOpen() to delay 4*TXDelay before retrying a hello message when the format is PakBus Active, TXDelay is non-zero, and BufferSize is non-zero
  • Enhanced the W terminal mode to more precisely capture the time of TX when packets are broken up with preceding time gaps specified by SerialOpen() TXDelay and BufferSize parameters.
  • Improved the Files Manager setting for 3209 and 3212 so that (1) a drive can be formatted if the setting is actively writing to the drive, (2) if writing to a CRD (card), pushing the card button will temporarily halt writing to the file, and (3) deleting the setting will allow the file to be deleted.
  • Removed COM3 and COM4 options from W and P terminal modes of CR800
  • Changed SerialOpen() so that a ComPort value of 31 represents CS I/O with SDE enabled. Previously this mode was represented by a value of 16.
  • Improved P terminal mode by increasing the talk through buffer.
  • Fixed SendVariables() and GetVariables() to handle data received at the at the same time the transaction timed out. This was generally only a problem when the destination was variably indexed. The data could be put into the wrong index or generate a variable out of bounds warning.
  • Fixed FTPClient() to timeout correctly when an attempt to make a non-passive (Active) FTP data port connection for data transfer failed. Prior to this fix, FTPClient() would never timeout.
v26April 25, 2013
  • Implemented support for CPI. Added instruction CPISpeed().
  • Added support for CDM-VW300 and CDM-VW305. Added instructions CDM_VWConfig(), CDM_VW300Dynamic(), CDM_VW300Rainflow(), and CDM_VW300Static().
  • Added PakBus communication encryption using AES-128. Added PakBus Encryption Key setting.
  • Enhanced ModBusMaster() and ModBusSlave() by adding support for ModBus ASCII.
  • Added HTTPPut().
  • Added ability to stream table data using FTPClient(), HTTPPost(), HTTPPut(), or EMailSend() based on number of records or time-into-interval.
  • Improved SerialOpen() by adding 76800 baud rate option for COM1-COM4.
  • Changed TDR100() so that all configuration parameters are variable except for SDMAddress, Option, Mux/ProbSelect, and Points.
  • Fixed IfTime() / TimeIntoInterval() to properly evaluate when a variable expression is used for time-into-interval or units and when the interval is > 1 hour and the time into is non-zero.
  • Changed IfTime() / TimeIntoInterval() so that parameters of type float create a compile warning; parameters will be rounded to nearest integer.
  • Changed default string size from 16 characters to 24 characters.
  • Fixed TableName.Timestamp()returning date/time string when from within another instruction.
  • Added new date/time formats to TableName.Timestamp() and SecsSince1990(). Option 5 excludes fraction of a second if zero and follows "YYYY-MM-DD_HH-MM-SS[.xx]". Option 6 always includes fractional seconds and follows "YYYY-MM-DD_HH-MM-SS.xx"
  • Improved TableName.FieldName when converting number to string.
  • Changed the numeric parameter behavior of CRBasic Functions so that if a String is passed in, a conversion to numeric is performed at run time. Previously a compile error was flagged.
  • Added format string 'b' to FormatLong(); returns base 2 (binary) representation.
  • Changed FormatFloat to remove a trailing '.'.
  • Added Sprintf(); Sprintf(Dest,Format,Argument1..Argument10).
  • Fixed string expressions when the concatenate operations are nested.
  • Improved the TCPOpen() when it specifies multiple connections so that the array of connection handles specified will indicate that the remote side has closed the connection by setting the handle to 0 without needing to execute the TCPOpen() instruction.
  • Changed TCPOpen() so that timeout parameter also applies to listening. Timeout parameter specifies amount of inactivity allowed before active connections are closed. 0 means no timeout.
  • Added ability to use TCPOpen() to create listening socket for ModbusSlave(). This allows one to use TCPOpen() to specify an inactivity timeout for the connection.
  • Changed IP handling so that all connections are closed when the datalogger goes to reset; this applies to all reset conditions expect unexpected events like loss of power.
  • Changed IP reassembly of fragmented IP packets so that its memory usage is limited to 2176 bytes instead of 384K and the timeout for reassembly is 3 seconds instead of 120 seconds. This change prevents large UDP data grams that needed fragmentation or other fragmented IP packets that are coming in fast over Ethernet from eating up communication memory and therefore stopping all communication.
  • Changed TLS to load user settings for certificate, key, and password.
  • Changed UDPDatagram() so that it can optionally receive a UDP message response after transmission during the time specified by the timeout parameter.
  • Enhanced FTPClient() so that local and remote filename parameters can be comma separated lists; e.g. "USR:file1.dat,USR:file2.dat"
  • Changed EmailRecv() so it will decode with messages that are Base64 encoded.
  • Changed EmailSend() to encode the message in base64. An '=' in the message would cause a problem.
  • Fixed http data query of html formatted data of a single field when the time of query is > .5 seconds. After .5 seconds, the entire record was output instead of just the single field.
  • Fixed HTTP server so that it properly handles the first IP packet received being less than 5 characters.
  • Changed HTTP service to require administrative authorization to retrieve datalogger program files.
  • Changed default HTTP home page to not display hidden files.
  • Changed the HTTP Client instruction to not require the heading to specify either the length of the web page or "chunked" transfer encoding. If neither is specified it will wait instead for either the server to close or the 75 second timeout before quitting.
  • Added a hold off delay of 200 milliseconds after a remote TCP Connection shuts down before its buffers that might hold incoming characters is closed. This change allows the last characters to be serviced from TCP clients or servers other than PakBus, e.g., HTTP, that close the connection immediately after sending their payload.
  • Improved communication with NL200/NL240 with bridge mode enabled. Servicing them was slowed when an Ethernet module (NL120, NL115) was not also attached. Additionally, packets from the NL200/NL240 are now immediately sent to the IP receive task instead of waiting 200ms; this improves performance and memory management.
  • Fixed DHCP so that it does not act on a network interface unless the device is present. Previously, if no NL240 or NL200 was connected there were still attempts to use DHCP.
  • Changed the Ethernet driver so that it is more efficient discarding IP packets that are not for it.
  • Fixed Serial I/O instructions to work with a TCP/IP handle of 255. 255 is the default terminal mode "talk through not active" com port, which caused a TCP/IP "com port" of 255 to not output or input to the serial buffer.
  • Improved POWERUP.INI: a) fixed the delete associated data operation; b) fixed format command (5); c) added support for formatting any drive (CPU:, CRD:, USR:, USB:); d) added copy command (7). Command 7, copies files to the destination drive but does not set the run now or run on power-up attributes.
  • Changed formatting a drive via the K/D and via File Control so that if a file is open for writing on the drive, formatting is disallowed.
  • Fixed SetStatus() when setting a string variable array element that is not the first one.
  • Changed ModbusMaster() and ModbusSlave() using SDM-SIO1 as interface to not over-ride settings specified for that interface by previously executed SerialOpen().
  • Changed ModBusSlave() so that if a register below the specified starting register offset is queried, an error code of 2 will be returned instead of simply not responding.
  • Changed ModBusSlave and DNP3 so that they can listen on multiple TCP ports.
  • Changed DNP to serve up to 3 Masters instead of 2.
  • Added support for the Delay Measurement and Record Current Time function codes used in time synchronization over DNP3.
  • Changed DNP() by adding 2 parameters: UTC Offset and Max Msec Difference that are used to control setting the clock via DNP3.
  • Implemented Object 11, Variation 1 and 2, in DNP3.
  • Fixed DNP3 so it keeps data tables thru powerup. Previous OS's would not keep data if type 1 variables were not active.
  • Changed DataGram()to allow a variable expression for the com port parameter and to allow the com port to be a TCP/IP socket handle returned by TCPOpen().
  • Added to CRBasic SetStatus() to change the FTP, HTTP, and PakBus/TCP Service Port settings.
  • Added action 21 to FileControl via HTTP and via BMP5 that is used for data recovery. It restarts the file specified, puts the data tables in a state so that the entire table can be collected, and stops the program from running before it can get started.
  • Removed IP Information from the status table if no IP is active.
  • Added indexing of disable variable arrays. Variable must be followed by empty parenthesis (). For example, Average (3,TempF(),IEEE4,TempF()=NAN)
  • Allowed CR1000KD DEL key held down at startup to disable default.cr1 from running just like other programs.
  • Changed CheckSum to add type 23. This returns the sum of all of the bytes with no masking. User can mask results as needed.
  • Improved IPNetPower() so that it can be used at the very beginning of a program to turn off power to NL200/NL240.
  • Fixed aliasing of variables within sub routines and functions
  • Fixed Status.StartTime where data type of NSEC can now be sampled correctly.
  • Fixed Sample() when the source is from another table with field type of UINT2.
  • Changed Include File Name setting to trim leading and trailing spaces in file name.
  • Fixed table definitions from hanging when updating after resetting status table.
  • Fixed TableFile(64) TOB3 mode so that the read pointer is properly synchronized after a power cycle. A new file is always created at startup and will contain any previously unwritten buffered data.
  • Fixed DataEvent() when using DataInterval() so that the correct number of records were written to final storage.
  • Fixed precompiler to work with SendTableDef().
  • Changed display of CommsMemFree array to be base 1. It will be displayed as CommsMemFree(1)...(3) instead of CommsMemFree(0)...(2).
  • Increased File Control's reset advertise to 50 seconds hold off instead of 35 if PPP is active to give PPP time to shut down and start up again after reset.
  • Changed File Control so that if we are already stopped when responding to the Stop Program command, we do not go through reset.
  • Changed Keyboard menu to include USB: when copying files. Also made a change to accommodate longer file names.
  • Improved auto allocation on cards. When auto allocating on the CF card and limiting the size of the file to not exceed 2G, include the size of the header in the check. Very large headers were causing attempts to create a file > 2G.
  • Fixed preprocessing output to not duplicate lines of compound statements. Alias var()=al_name : Units al_name = m/s resulted in two identical lines in the output when using the precompiler with -p command line option.
  • Changed COM320 Voice support so that garbage bytes handled to prevent premature hanging up.
  • Removed sending Hello message to a router when set up as a leaf node in the case of a failed Send/Get Variable instruction. This was causing unnecessary communications traffic.
  • Fixed Trim(), Left(), DisplayMenu() and other functions that return a string when their parameter is of type string and is Tablename.TimeStamp.
  • Fixed single line If...Then...Else statements so that EndIf is implied at the end of the line and not after the first statement following Then. Example - If A Then B+=1 : C+=1 Else B=0 : C=0
  • Changed ABS(Expression) to return as a LONG if Expression is of type LONG. This prevents loss of precision if the LONG Expression has more precision than Float. No longer need ABSLONG instruction; ABSLong() removed from CRBasic instruction pick list.
  • Fixed status table units on calibration volts variable from Volts to mVolts.
  • Fixed problem calling subroutine with a Scan...NextScan, when the main scan is set to run a fixed number of times.
  • Fixed GetDataRecord() and AcceptDataRecords() when a communication error or timeout happens sometime after the second fragment of a multi-fragment record is received.
  • Fixed terminal command SDI12 talk through to display exit message correctly when connected via TCP.
  • Fixed compiler so that it does not crash while parsing SDI12Recorder() instructions that contain a SDICommand that is a compound string expression.
  • Changed Terminal Mode 'P' talk through command so that it can handle a higher rate of incoming characters from the remote device being monitored.
  • Changed Terminal mode 'F' command to ensure there is a valid public table before dumping the binary contents of it.
  • Added to the Files Manager Setting node 3209 to specify logging communication traffic similar to that of the 'W' command. The "number of files" specifies the file size in bytes. The first character of the file name (after the drive) should specify 'W' for binary, 'w' for ASCII. The "com port" selection is specified by the number starting at the 2nd position. For example, "USR:W13Sniff.txt" would specify binary, 13 = TCP/IP communication.
  • Added IP Trace option to terminal mode 'W' command.
  • Added Ethernet misses to IP tracing.
  • Added Ethernet packet sniff options to terminal mode 'W' command; shows first 54 bytes of Ethernet packets
  • Fixed terminal mode 'D' command submenu when entering a task or command to not overwrite memory and therefore possibly cause a watch dog when 33 or more characters are input without a carriage return or space.
  • Changed terminal mode 'D' so that names of tasks can be entered and recognized. This has not worked since all characters coming in the terminal mode are upper case and the names of tasks have lower case letters.
  • Changed terminal mode to (1) allow the 'U' command only via PakBus, (2) provide a margin of 150 characters instead of 80 in print statements, and (3) display the maximum number of characters in a print statement at the top of the 'D' command.
  • Fixed CRBasic Move() when moving within the same array and the array is of type STRING and when the Move must be done from end to start to prevent the destination overwriting the original source.
  • Fixed sending PakBus messages over TCP/IP when the message including the low level quote characters are over 1500 bytes (about half of the characters in a 1000 byte packet are either 0xbc or 0xbd). The symptom is a watchdog with a watchdog text file indicating "Panic ptr underflow".
  • Changed the Hello Request broadcast to "expect more client" instead of "expect more neutral". This changes the timeout for a response from 1.5 seconds to 40 seconds. The 1.5 seconds is sometimes too short when going through a modem via ComME, causing ModemCallback to fail.
  • Fixed converting a long into a string to not convert to a float first which results in loss of resolution for numbers > 6 digits.
  • Fixed TCP/IP serial output issue where several back to back output instructions plugged up the output stream.
  • Fixed Slow Sequence scans sync'ing scan interval to new time when time is set multiple times between scan intervals.
  • Fixed PPP dialing in the event that a PPP session is terminated and before dialing is resumed characters from the modem enter the terminal mode causing PPP dialing to possibly not resume.
  • Fixed For...Next so that start, end, and step conditions are evaluated before the statement block executes to match behavior of other Basic languages. Examples of conditions in which a For block will not execute include "For I=1 to 0" and "For I=0 to 1 Step -1". Also fixed compiler crash when "For I=1 to 1".
  • Improved consistency of conversions from FP2 to String to eliminate reporting of false precision or and trailing zeros.
  • Fixed editing ConstTable contained in an encrypted file Include file.
  • Fixed DisplayValue() and MenuItem() so that the display is properly cleared after displaying long lines of text.
v25July 10, 2012
  • Changed capability so OS can no longer be remotely downloaded into 2M dataloggers because of size increase in the OS. It can still be downloaded directly via DevConfig into 2M dataloggers.
  • Changed PakBus Comms watchdog timeout from 30 seconds to 10 minutes so that an inadvertent watchdog does not occur while a valid process is active. Addresses triggering of PAKBUS COMMS watchdog timer.
  • Added support for compact flash cards greater than 2G.
  • Changed SecsSince1990() to return date formatted as a String instead of as a Long if the return variable is of type STRING.
  • Added Append File (APPE) to FTP Server.
  • Added Append File options to FTPClient.
  • Added TableFile TOB3 output.
  • Added CWB100Diagnostics() instruction.
  • Added NL240 support as separate IP settings.
  • Added HTTPPost() and XMLParse() instructions.
  • Added CustomMenu DisplayLine().
  • Changed CWB100Routes() to parse each route into a separate array element of the destination if the destination variable is an array.
  • Changed CWB100() to not attempt to update the Card header information at compile time before the Card is initialized. When the card starts, the new table info will be used to create the header.
  • Fixed TableName.FieldName() reference so that in some expressions it is not truncated to an integer.
  • Fixed TableName.FieldName() when passed into a user function and when the type is FP2 or a timestamp converted to a date string.
  • Fixed expressions with table.field using a special field (Record etc.) using an uninitialized pointer when it is the endo of the expression (e.g. IIF(Test.Record(1,1)<0,0,Test.Record(1,1))). This was crashing pre-compiler.
  • Changed directory list behavior so that files currently being written by TableFile() will not be displayed. This prevents unsafe file access during the file write process.
  • Improved SortSpa: A new, optional, "dimension" parameter is added that will specify the dimension to sort on. 3 would be used with a 3 dimensioned array, 2 with a 2 dimensioned array. 1 (or the parameter is not present) would sort as it does currently.
  • Enhanced spatial instructions MaxSpa(), MinSPa(), AvgSpa(), RMSSpa(), and StdDevSpa() to allow the source to be type Long. When Source is LONG the destination can be either FLOAT or LONG. CovSpa() still only allows Float.
  • Fixed Compressed OS download.
  • Fixed GetVariables() when requesting type string and the swath requested exceeds the size of the variable. This was causing a hang condition.
  • Fixed TimeIntoInterval() / IfTime() problem introduced in OS 24. Not evaluating as true when the interval is a variable and is > 1 hour.
  • Changed Maximum() and Minimum() to store NAN if any NANs occur in the input.
  • Changed Median() output instruction to store NAN if any NANs occur in the data set.
  • Changed WindVector() to load all outputs with NAN if no values were processed for the current output interval. This can occur if the disable variable is set for all executions of the table. It is preferable to output NAN instead of 0 to flag the user not to consider the data valid.
  • Fixed SlowSequence scans syncing scan interval to system time when multiple clock sets occur between scan intervals.
  • Fixed PPP dialing in the event that a PPP session is terminated and before dialing is resumed characters from the modem enter the terminal mode causing PPP dialing to possibly not resume.
  • Improved PPP by having DTR (or ME or SDC) turned off during 2 to 3 second delay before starting to dial for PPP.
  • Fixed PPPOpen() to correctly return if initially closed then re-opened. Previously it was erroneously waiting 30 seconds and then erroneously returning "0.0.0.0".
  • Improved TCP by only doing TCP Beacon once if not yet a neighbor to avoid excessive traffic during a denial of service attack.
  • Changed threshold for triggering Out of IP Memory watchdog from 10 minutes to one hour. There are circumstances where it is acceptable for the memory to be low for a longer period of time (such as when downloading large files over IP).
  • Changed access to terminal mode. If the TELNET service is disabled then also disable entering terminal mode except through BMP/PakBus.
  • Changed EssVariables so that ?EssVariables Dim? declares all the ESS variables as DIM instead of PUBLIC.
  • Disabled SNMP protocol until ESSInitialize() executes at run time.
  • Allowed PakBus Node setting to adjust the TCP/IP Memory available. This can be monitored by the COMMSMemFree(2). (Default of 50 nodes results in 32 packets of memory.)
  • CR1000/CR800: Improved excitation channels by switching excitation channel to an off state when turning off switched analog power. This change was made to avoid voltage spikes on excitation channels when turning on analog power.
  • Changed internal function findrecord() to handle dealing with a hole in the record number differently. Previously the record prior to the hole was returned. This resulted in duplicating records in requested data. Now the record following the hole is returned so collection can proceed. Holes are introduced if a card is used and removed long enough for the internal memory to ring around completely, then the same card inserted again.
  • Fixed not writing data to card if the following sequence occurred: a) card removed; b) powered removed; c) card inserted; d) power restored. Records stored in SRAM while the card was removed before loss of power were not being written to the card when power was restored.
  • Fixed watchdog condition trigged by closing card files that were left open across a power cycle. (Introduced in OS24)
  • Improved AcceptData() so that compile error is flagged for a duplicate source PakBus address and Data Table ID.
  • Improved SDM. Enforced a timeout for SDM measurements. When time is changed and the SDM task resyncs with measurement there was a chance of stopping the program scan.
  • Added ModBus support via SDM-SIO1.
  • Enhanced ModBusSlave(port,...) so that if port is >=502 and <= 65535 ModBusSlave will listen on this TCP port number.
  • Improved HTTP and FTP. When the HTTP server and/or FTP server is disabled, close all existing connections to the disabled server.
  • Extended timeout on a file opened for writing to accommodate the time for TLS negotiation when using an HTTPS client.
  • Changed HTTPGet() and HTTPPost(): If the custom header includes "User-Agent:" at the beginning of a line, the default "User-Agent:" line is omitted.
  • Fixed web service data query and sending data via FTPClient(), HTTPPost(), and EmailSend() when the data specified is a single field and the beginning index is not 1.
  • Fixed HTTP data query for data types TOA5 and TOB1 when using the TableName.FieldName syntax to query a single field in the table. (This was OK with xml, json, and html.)
  • Fixed IPNetPower() and EthernetPower() so memory is released. Could have resulted in watchdog when Ethernet was off for a long time.
  • Changed TLS memory allocation to wait for up to 3 minutes if memory is not available instead of watchdog. This will help when running TLS concurrently in different CRBasic sequences.
  • Changed Custom menu to clear screen if CR1000KD attachment is detected.
  • Changed DisplayValue() parameter type to match MenuItem().
  • Changed display initialization to accommodate CD100 better. Also, fixed situation where CD100 would continue in a high power state even when display was not active.
  • Changed SendData() so that multiple datatable records or all previously unsent datarecords can be sent with each execution.
  • Changed low level COM (1-4) driver to avoid the rare occurrence of getting duplicate bytes in the input buffer.
  • Increased processing stack size to 16K when TLS is active.
  • Increased the number of chained certificates allowed by TLS from 3 to 8.
  • Enhanced IIF() function so that it can be used with strings for the True/False parameters.
  • Fixed Function / EndFunction of type STRING to work when used as parameters within instructions.
  • Enhanced IP security by not allowing the FTP Server to connect the data socket via the PORT command to a machine other than the one that connected to it as the FTP Client.
  • Added DNP CRC option 22 to CheckSum().
  • Fixed DNP3 protocol when returning a swath of static values not starting at index = 0; also removed setting the "operation in progress" bit when executing control objects.
  • Fixed referencing special table fields such as TableName.TIMESTAMP or TableName.RECORD when used inside expressions which expected the reference to be of type STRING.
  • Improved consistency of units in Status Table.
  • Changed CalFile to handle reading a file larger or smaller than what is requested. If the signature matches the file will load up to the bytes requested or the end of the file whichever comes first. This allows previous values to not be lost if the program changes.
  • Fixed PortGet() when reading the state of Pulse Channels.
  • Fixed table output instructions, when not using OpenInterval, so that intermediate storage is cleared if a record is skipped. For example, Totalize() will now occur over 1 output interval and not two if record is skipped in between.
  • Changed background calibration so that it is re-enabled after leaving a scan where the datalogger automatically disabled it.
  • Fixed displaying UINT2 values in Final Storage on keyboard display.
  • Improved UDP discovery response by adding PakBus address and PakBus TCP port parameters.
  • Changed ModemCallback() so that it sends a value of type 4 byte integer so that a datalogger on the receiving end can accept it.
  • Change receiving a PakBus Get or Send values message to accept a 2 byte signed integer type as if it were an unsigned 2 byte integer type so that it will accept a ModemCallback message from earlier OS's.
  • Changed ModemCallback() to give up trying to find a neighbor after 10 tries (one try per second) after dialing was successful. The result code returned is -21 (cannot find route).
  • Changed Delay() instruction to allow the interval parameter to be of type Float.
  • Changed terminal mode 'W' sniff command to insert a carriage return character before the line feed for the benefit of telnet.
  • Improved CRBASIC to ignore line continuation '_' within comments. This was causing the line following to be ignored.
  • Added de-bounce to GPS PPS signal.
  • Changed GPS so that the NMEA string and the Pulse Per Second must be sync'd for 60 seconds instead of 10 seconds.
  • Changed GPS to not change time if the NMEA string time syntax is incorrect.
  • Changed GPS to not erroneously set new time if the NMEA strings are lagging more than 1 second behind the PPS because of receiver latency.
  • Fixed Units when an array is partially aliased and units need to be assigned to the remaining un-aliased fields in the array.
  • Fixed setting IPAddress and mask via keyboard display. (Introduced in OS24.)
  • Removed warning message about memory being re-initialized at compile time.
  • Changed XMLParse() to allow a file as the source.
  • Changed FTP Server to use ephemeral port starting at 1024.
  • Changed IPNetPower() for the CR800 to flag a program error if option 1 is used (NL115 or NL120).
  • Changed FileList() so that files that are open for writing are excluded.
  • Fixed WaitTriggerSequence from falsely triggering when time was changed.
  • Changed TableFile() by adding an option to not flush data to card when removal button is pressed. To use this, add 100 to the data format option parameter. For example, 108 for no-flush TOA5.
  • Added support for decompression of *.gz operating systems. For example, CR1000.Std.25.obj.gz.
v24December 23, 2011
  • Added HTTPGet instruction.
  • Added DataTime instruction as optional DataTable modifier. Parameter = 1 means time stamp the records with System Time instead of the Scan Time; parameter = 0 (default) means time stamp with Scan Time. Note that DataInterval will still use the top of scan to trigger the table.
  • Added IPAddressCSIO, IPGatewayCSIO, and IPMaskCSIO settings to support new NL200 bridge mode. Old settings (IPAddress, IPMask, & IPGateway) remain. This allows multiple IP devices to be connected at the same time.
  • Added IPNetPower instruction to turn power on or off for either the Ethernet or the NL200/NL240 network.
  • Added EthernetPower() instruction to the CR800 so it can be used with a NL200.
  • Added compile error if RETURN is used inside of a Subroutine.
  • Added Compile Warning message if initialization of an array is out of bounds.
  • Added .OGG files ("audio/ogg") as a content type returned with HTTP requests.
  • Added support for decompression of *.gz programs. For example, myProgram.cr1.gz
  • Added SolarPosition instruction. If Pressure is <0 then use the AirTemp to calculate an estimation of pressure. If Time is not a variable array then use the current time. Disclaimer: Only tested at Logan, Utah USA. Feedback on how it performs at other locations is welcome.
  • Improved AVW200 by adding optional threshold parameter. The instruction will return NAN for frequency if the amplitude is less than the threshold. An error will be flagged at compile time if a constant mv level is entered that is < .01; i.e., < 10 uv.
  • Improved TCP/IP so serial output instructions can send more than 1479 bytes of data.
  • Changed TCP write when over PPP to wait for acknowledgement when > 2880 bytes have not yet been acknowledged, which makes transferring large files via ftp and HTTP over PPP more reliable.
  • Changed large file transfer via FTP and HTTP over PPP so that it is more reliable by waiting for TCP acknowledgments using a smaller window.
  • Improved FTP and HTTP servers so that they can receive large files much faster.
  • Changed memory allocation for IP if datalogger memory size is less than 4 Meg and no program is running.
  • Changed IP stack to start if PPP is active.
  • Improved FTP server so that large files that take over 2 minutes to send are sent successfully.
  • Changed FTP server when writing a file and a timeout error occurs to delete the partially written file.
  • Improved TCPOpen() & UDPOpen() to add optional timeout parameter (4th parameter), in units of .01 seconds. If it is not present, it will default to 7500 (75 seconds).
  • Change TCP/IP stack in how it handled out of memory condition. Sockets will be closed by TCP IP task when it detects the flag set when out of memory is detected. This avoids getting a semaphore lock in an interrupt.
  • Improved FTPClient instruction to support FTPS if the option code is 1xx.
  • Improved FTPClient instruction to allow directory retrieval in ACTIVE & PASSIVE mode.
  • Added "Host: " field to header in HTTPGet/Post functions.

  • Changed FTPClient so that when getting a file but some error is detected, (e.g., cannot open the data socket) the file is removed from the datalogger.
  • Changed HTTP so if the .csipassword file is present it is used instead of the datalogger PakBus security settings.
  • Changed TCP Port settings for PakBus, HTTP, and FTP to be unsigned instead of signed so that port numbers > 32767 are accepted.
  • Changed PingIP to wait for DNS request.
  • Changed DNPVariable such that if the flag parameter is a constant 0 then it will default all the flags to 1 ("On Line").
  • Changed DNP3 so that more than 65535 events can be stored and so that it does not use twice as much memory as needed.
  • Enhanced UDPOpen()to allow a zero length server name so that it can listen for communication from an unknown IP address.
  • Improved AXTLS stack to accept asn1 type 0x0c used by some TLS servers, allowing the datalogger to work with them.
  • Changed FTP Data Port range to 8019..8018 so that firewalls can be set up to accommodate this narrower range. It has been 8000..65535.
  • Changed pre-compiler's table definitions of the status table in most cases identical to that of the dataloggers, in which case LoggerNet will not have to collect the status table's definition from the datalogger.
  • Changed the TCP/IP windowing so that large files that are published to the datalogger via FTP or HTTP are throttled back enough to prevent running out of memory, possibly causing a watchdog error. The window is put to 0 if the datalogger has used 3/4 of its allocated big IP packets.
  • Changed TableFile instruction's field names and HTTP DataQuery field names to look like a scalar if it is only 1 value and the beginning index is 1.
  • Changed data query via HTTP and via BMP5 so that that no data is returned if the start time is newer than the newest record and so that the last record returned is the record just previous to the end date.
  • Changed TCPOpen to not return until the connection is established.
  • Changed HTTP BrowseSymbols command so it expands BOOL8 datatype to 8 Boolean fields per byte.
  • Changed EmailRecv() so that the filters apply to the entire line in the header, not just the first N characters where N is the length of the filter string.
  • Improved EmailSend and EmailRecv by adding tracing so that the conversation is traced if the trace code bit 16384 is set.
  • Changed TLS setting to be set to enabled if not already enabled when a CRBasic program includes Email (EmailSend or EmailRecv ) or an HTTPPut HTTPPost??? or HTTPGet instruction that might use TLS.
  • Improved EmailSend, EmailRecv, and FTPClient so that they do the work in the CRBasic user sequences.
  • Fixed EmailReceive() when the optional parameters are present.
  • Improved MenuRecompile to work when there is no constant table present.
  • Changed retrieving data via time so that if the time requested is older than the oldest data, then the oldest data will be collected. This affects BMP5 and HTTP data retrieval.
  • Changed SerialIn() when waiting for input on a TCP/IP connection to return with 0 bytes if the connection is lost rather than continue to wait according to the user's timeout parameter.
  • Changed HTTP so that if a drive but not file is referenced, as in /USR/, and an index.html or default.html exists on that drive, it will be served.
  • Improved record allocation to allocate a record buffer for HTTP separate from the buffer used by the display so that concurrent use of the display and HTTP browsing data does not have problems.
  • Removed listening on the HTTPS 443 port.
  • Improved HTTP web service: error 404 handled without an extra crlf; if no tables exist, the data query acts correctly; files coming via the PUT or POST command that are "chunked" are read correctly.
  • Added HTTP and FTP servers into socket task so file transfer does not interfere with the niche task. File transfer broken up so if the servicing task has other work it can be completed
  • Changed Web Service and xml and json Data File display of BOOL8 data types so that they are converted to an array of Booleans as is done by LoggerNet.
  • Changed SerialInRecord to optionally use a local read pointer out of the serial buffer to facilitate multiple SerialInRecords on the same COMPort. The option parameter accommodates this using the 3 least significant digit.
  • Changed SerialInRecord to add an option so that the most negative integer (&H80000000) can be used for either the Start Word or the End Word to specify a NULL character.
  • Moved TCP activity that involves file access out of the Niche Task so that IP memory is used more efficiently, lowering the probability of running out of IP memory that can cause a watchdog.
  • Improved auto switch to sequential mode to not switch to sequential mode when SerialOut and SerialInRecord occur in the slow sequence.
  • Improved starting up tables when reading data from the CF Card. 1) the file position was not set to the end of data correctly and 2) the read pointer into the copied data was such that the data copied in from the card was subsequently written back to the card resulting in duplicated data on the Card. This was only a problem in the CR9000X because the battery backed RAM of the other loggers removes the need to copy from the Card to internal memory at power up.
  • Added checks in Card accesses to avoid reads/writes, from other tasks, while the card is in the process of being removed.
  • Change CardOut allocation to accommodate > 2G cards. Limit individual files to be no larger than 2G.
  • Added TableFile mode to not flush all data to card when removal button is pressed. This is done by adding 100 to the option parameter.
  • Changed Card removal to wait for TableFile to finish baling its data before turning the LED green.
  • Added Force a frame footer to be placed in interval tables when reading data from cards.
  • Changed AddUnits to allow Units to be assigned to 2 and 3 dimensional arrays.
  • Improved calling a function with optional parameters to not require trailing commas.
  • Changed PWM to recalculate the duty cycle setting when period is changed.
  • Changed FileReadLine so that it returns 0 if a variable is out of bounds or there is no space for the line.
  • Improved Status so when monitoring Status.CommsMemFree values are refreshed first.
  • Changed the COMPort prompt in the terminal mode 'W' command if CWB100 is active on a control port.
  • Changed internet date/time displays. Changed "Tues" to "Tue" and "Thurs" to "Thu" and GMT displayed if the UTC offset is active.
  • Modified PortGet to allow ports 9, 11, and 12 to read SW12, pulse channel 1, and pulse channel 2, respectively. In the CR3000 9, 10, 11, and 12 are valid, this corresponds to SW1, SW2, pulse channel 1, and pulse channel 2.
  • Changed 'W' and 'P' command in terminal mode, allow a max of 2 days for the timeout entry.
  • Improved terminal mode 'P' and 'W' to add some messages if the mode is exited and also changed to keep the terminal mode comport open during the user's specified timeout.
  • Changed "Exiting from talk thru" to "Exiting" when exiting from either talk through ('P') or sniffer ('W') in terminal mode.
  • Changed telnet/terminal/sniffer ('W') command so that the timeout specified by the user will keep the telnet connection open 40 seconds beyond the timeout of the sniffer.
  • Changed CWS100 RSSI and Routes so they put the priority of their task back to normal. It previously was left in a high priority state that did not allow communication tasks to get in if the program contained tight loops, as does Send and Get Variables.
  • Changed ModBusMaster to allow a constant Variable parameter if the Function parameter is also constant and is not in the range of 1..4.
  • Changed to not allow Aliasing of Aliases.
  • Changed IfTime() and TimeIntoInterval to flag a compile error if they cannot be synced to the scan interval.
  • Improved SampleMaxMin to work with string source variables.
  • Improved memory functions to detect insufficient memory for variable space and don't initialize.
  • Changed FileEncrypt to only check the first byte in the file to determine if the file is already encrypted. Since control characters can be entered into strings they may have the MSB set and be legitimate so we don't want to stop encrypting.
  • Added listening for a connection to a UDP "Discover Port" 6785. This is used by DevConfig.
  • Optimized handling ARP packets via Ethernet that are not for the datalogger to ease use of IP memory packets.
  • Optimized TLS memory usage to use less memory; CommsMemFree(1), when TLS is active, starts out at 0225459999.
  • Accept Constant strings to be used as TableNames in DataTable and CallTable.
  • Changed TableFile to correctly establish the number of files when the disk is full.
  • Changed TableFile to not add error into compile results at run time when the drive fills up.
  • Changed TimerIO to synchronize all involved timers when doing time since edge or time since channel 1. Also fixed case where error condition of signal too fast was causing an extra value to be written to user variable if timing since another edge.
  • Changed SlowSequence in PipeLine Mode to allow CS616 and PeriodAvg.
  • Reformatted IP information in the Settings and Status table to include before the so that telnet displays it better.
  • Changed web service so that HTTP DataQuery & BrowseSymbols retrieving data arrays by including index of name when there is only one value & the index is greater than one.
  • Fixed issues when flushing card (via eject button or CardFlush ()) and TableFile & CardOut are active so that the most recent data was correctly stored on the card.
  • Improved OutofMemory() (internal function) to not cause a watchdog if called while stopping currently running program to start a new program.
  • Fixed terminal mode 'W' command to not include COM3 and COM4 for CR800.
  • Fixed synchronization of Digital task sequencer when it skips scans due to being too long in acquisition.
  • Fixed DialModem instruction when using control ports, COM port was mapped incorrectly.
  • Fixed HTTP data query via date range.
  • Fixed PPP so that if PPP is not open packets trying to be sent will be freed, avoiding an eventual watchdog because IP memory (CommsMemFree(3)) is exhausted.
  • Adjusted TCP window advertisement so that large incoming files do not use all of the IP memory available, which can cause a watchdog.
  • Improved IP memory handling when memory is exhausted to reduce watchdogs. When IP memory is exhausted, it first tries to free memory by closing sockets that have more than one packet waiting to output. This affects applications that have several sockets opened and then are suddenly disconnected.
  • Fixed TLS stack so that if an error occurs, for example "bad certificate", it does not duplicate freeing up memory.
  • Fixed ClockSet via HTTP to be insensitive to the order of the parameters.
  • Fixed putting files via HTTP PUT/POST when the file is an OS to act like sending an OS file via LoggerNet, which stops the scans and frees memory used by data tables to make temporary space for the OS. Subsequent HTTP GET with the FileControl command will cause the new OS to install, similar to the actions taken by LoggerNet.
  • Fixed web service SetValue when the value is to be set to "true".
  • Fixed terminal mode serial talk through with SDM-SIO1 so that the I/O in the program is halted correctly.
  • Fixed SDM-SIO1 so that when the buffer fills the serial input functions do not miss data in some rare conditions.
  • Fixed calling functions and subroutines when the last optional parameter is not passed in; a ',' was expected whereas a ')' should be expected.
  • Fixed error where datalogger was returning incorrect bytes free for USR: drive.
  • Changed File system so that files left open for writing at reset are closed to prevent loss of drive size.
  • Fixed FileClose instruction to initialize the controller if it has not yet been initialized. With recent changes close can be called before open and if that happens the controller must be initialized.
  • Fixed a watchdog condition caused by a SlowSequence with measurement, running in PipelineMode, when the main scan was setup to only run once and took a very long time (> 1 minute) to complete.
  • Fixed an erroneous compile error when calling a subroutine when there is no space between the subroutine name and the opening parenthesis and when the first parameter is itself enclosed in parentheses.
  • Fixed problem where memory was corrupted caused by plugging RS-232 cable into CS I/O port with SC115 being the last device to be connected to the CS I/O port.
  • Fixed CWB100 so that programs with variable names that start with the ArrayName in CWB100() do not erroneously get their name changed.
  • Fixed CWB100() instruction so that data tables are not reinitialized on a power reset.
  • Fixed ModBusMaster() when the function code is 1 or 2 (get coils).
  • Fixed Move(y(i),n,y(j),m) when i > j; that is, when the destination and source overlap.
  • Fixed IfTime (TimeIntoInterval) function when the interval and offset both have the same seconds component and when the interval also has a sub second component.
  • Fixed the precompiler when parsing #if to 1) allow % in strings, and 2) not output comments within disabled sections.
  • Fixed slicing AutoRange measurements in Pipeline Slow sequences.
  • Fixed FieldCalibration for slope only calibrations via keyboard.
  • Fixed EC100Configure so that SDM instructions that follow it will work properly.
  • Fixed string initialization when CHR() is used in the initialization.
  • Fixed AM25T in Slow sequence running in Sequential Mode. The measurements were being stored into the wrong buffer.
  • Fixed BOOL8 for TOA5 & TOB1 files & TOB3 header.
  • Changed internal function get_ptr() which determines if expressions can be evaluated prior to run time by checking the loaded expression opcodes. Under very rare circumstances this was crashing the pre compiler because the opcodes were read in advance and if read via pointers that caused the read to be out of bounds the .exe crashed. This was not a real problem because the values were only used if the context warranted it, but just the read caused the PC program to crash. The change was to only read from the pointers when they are actually used. This does change the OS too.
  • Fixed FinalStorageCompile() an internal function. It had an out of memory problem caused by lack of memory when executing FinalStorageCompile(). When the Card bytes free field in the status table was populated, there was insufficient memory to initialize the Card and open the directory. The fix was to allocate memory prior to locking allocations, then free it just before updating Status.card_mem_free.
  • Changed system to automatically allocate additional memory for TLS communications (TLS Enabled = 1) when a CRBasic program includes EmailSend(), EmailRecv(), HTTPGet(), and HTTPPost().
v23December 22, 2011
  • OS version 23 was not released. See version 24.
v22April 26, 2011
  • Fixed initialization of scalar values declared as Long when the value is > 2^24. The value was getting loaded into a float then back to an integer, which caused lost resolution.
  • Improved FieldCal when working with shared mode variables. FieldCal also modified so reps of zero disables operation with no error code. This provides the wizard another way to disable shared FieldCals.
  • Increased timeout for OS download from 75 seconds to 100 seconds.
  • Changed FTPClient to not use up file handles when ACTIVE mode is set but the server returns an error since it requires PASSIVE mode.
  • Improved FTPClient to return a failure if the connection is successful but the file transfer in some way fails.
  • Improved dialing so that bytes arriving immediately after dialing is successful are not thrown away.
  • Changed FTP server to not allow HIDDEN files to be retrieved.
  • Fixed http in the case that when memory has been depleted possible memory corruption occured.
  • Improved TCP to enhance FTPClient success and lessen chances of a watchdog error.
  • Extended minimum TCP retransmission from 1 second to 4 seconds.
  • Fixed PakBus/TCP password.
  • Improved SerialOpen and SerialClose to use a new flag so that SerialClose does not disturb PPP dialing if SerialOpen had not opened the comport.
  • Added FTP client and server to the 'W' terminal mode to "sniff" on TCP commands.
  • Fixed FTPClientso that it does not occasionally fail unnecessarily.
  • Improved PPPOpen by adding a 30 second timeout to wait.
  • Changed PPPClose to work better when called multiple times; changed SerialOpen and SerialClose to coordinate better with PPP.
  • Changed PPP negotiation timeout to 6 seconds from 4 seconds to prevent PPP connection to a very slow server.
  • Added PPP status information to IPINFO status.
  • Improved TCP SerialIn. When using TCP serial in and out via CRBasic, flush the input buffer when TCP is closed.
  • Fixed possible memory corruption using tablefile and web services JSON output when reading from a final storage string type. If the string length was greater than 64 characters the stack buffer space was not larger enough and memory was corrupted.
  • Fixed JSON and XML format in the case there are no records.
  • Improved FileUpload when the file cannot be opened or some other error happens that could lead to multiple uses of the same comms memory, possibly causing memory corruption and a watchdog.
  • Improved FileUpload if an error is encountered in the middle of reading the file.
  • Fixed possible problem uploading a file if a fragment needs to be resent .
  • Changed PakBus file upload. When uploading a file that is associated with an active CardOut, the data will be flushed to the card prior to starting the upload. The program may continue storing during the upload, this may give unexpected results in the retrieved file after conversion.
  • Improved reserving memory for Card Task to keep the memory locked up to the point where the task starts so another task does not get the memory. This problem was causing out of memory errors in a test suite program when TLS was enabled.
  • Improved CardOut by pre-allocating memory for Card thread stack size and file information, to ensure there is enough memory available after locking Final Storage memory. This was causing some programs to fail compile after a power cycle with a CardOut instruction.
  • Fixed ACPower Split Phase measurement.
  • Fixed DNP3 so that the flags for all objects and variations are recorded correctly.
  • Changed DNP3 so that by default there is no Confirm Link Data Request. Confirm Link Data Request is activated by setting the (optional) timeout parameter to non-zero, specifying the time in seconds to wait for the Data Link response.
  • Changed DefaultSettings for BaudRateSDC to 115200.
  • Changed calibration check to give a warning rather than error and force the gain range of bad cals to NAN.
  • Improved Terminal 'W' "sniff" command to allow TCP sniffing on a TCP com port for all connections except the connection we are sniffing on.
  • Changed 'W' terminal mode ASCII(Y)? so a carriage return will default to Y instead of exiting.
  • Fixed PakBus Terminal mode 'P' and 'W' possible memory overwrite when sending small packets back.
  • Changed TableFile when running in interval mode and the table is set up as non-interval, to not use the calculated approximate output file size in determining whether to delete old files. The approximate file size information is used to avoid attempting a write failing, then having to delete a file and try again. If the table is called or outputs conditionally, then the approximate file size can cause premature deletion of files and reduction of the number of files stored on the drive.
  • Improved PortGet to allow ports 11 and 12, these return the state of pulse channel 1 and pulse channel 2, respectively. The CR3000 also allows port 13 for Pulse channel 3.
  • Changed TimerIO to not be allowed outside Scan..NextScan, and don't crash compiler if it is.
  • Enhanced TableFile to force a flush of all internal storage every time an SC115 is attached. This enhanced milking mode is enabled by setting the NumRecs parameter to 0 while the interval is -1. With the Interval -1 and the NumRecs > 0, NumRecs back from the current record will be stored to the file. Also changed the behavior when MaxFiles = 0. The filename will remain fixed with no number appended. The old file, if ones exists, will be overwritten at each output.
  • Improved SDMIO16 to allow Longs in Dest/Source and Status parameters.
  • Synchronized SDM and processing after setting time and before re-starting the task sequencer. NOTE: This had the potential of hanging programs using SDM devices when time was set.
  • Enhanced pre-compiler with a new mode to process a program with conditional compiling (#if..#end, etc.) to store the program that results from evaluating the conditional compilation directives. This is accessed in CRBasic from the Compile
  • Conditional Compile and Save menu item (version 3.3 or greater) or enabled from the pre-compiler command line by using -p . This allows a master file to be processed to generate desired "configurations".
  • Improved HydraProbe instruction by adding LOAM soil type.
  • Fixed float to long conversion problems in expressions with multiple AND, OR, XOR, =, IMP, <<, and >> operators.
  • Fixed SDI12 terminal snooping ('W' command).
  • Fixed Central Routers to stop a memory leak on CommsMemFree(2)
  • Fixed a possible problem with the Files Manager setting when removing files with older serial numbers.
  • Changed web service to return "Last-Modified-Date" of files and to return 304 "Not Modified" if the file has not been modified since. This allows the http client to use the cached file instead of retrieving the same file again.
  • Changed FileList to guard against a file name that is larger than the string size, which was corrupting adjacent memory.
  • Changed ArrayLength for variables of type String to return the number of Strings in the array instead of the total number of characters.
  • Changed ConstTable editing to not append a each time a constant is modified.
  • Improved FFT instruction by adding checking to make sure the source is as large as needed according to N and option parameters.
  • Changed Move instruction to not use null pointer to field information when the source is an expression.
  • Increased buffer size for keyboard/display buffers that receive the time information. With the null it can go beyond the previously allocated 21 characters.
  • Removed warning for WorstCase table not being called.
  • Changed to not allow CallTable to be used with WorstCase table.
  • Changed loading OS from keyboard/display file menu to check for memory before allocating, so that a warning can notify the user to stop the running program and try again.
  • Fixed sprintf problem with -0. We thought we had fixed this twice previously but found that the compiler was optimizing away our intended fix. The check for -0 was working as the value on the stack was changed but the compiler had already loaded the value in a register and did not detect that it needed to re-read the modified value. This allowed the -0 to pass into our optimized conversion routine causing a lock up.
  • Changed EmailRecv so date, subject, etc. are only stored if the file is found.
  • Fixed For loop with no index variable assigned to not crash compiler.
  • Improved ModBusMaster and ModBusSlave to allow them to get and receive String Data (2 bytes per register, Null terminated.)
  • Added UINT4 (Unsigned Integer) data type in DataTable fields
  • Changed ConstTable editing to accommodate encrypted files.
  • Improved USB to allow it to work with FileManage.
  • Fixed subroutine error message for a subroutine name that begins with numeric, causing compiler to crash.
v21November 17, 2010
  • Added CWB100 instruction to work with wireless sensor base.
  • Added support for TLS servers.
  • Added Line Continuation. A line continuation consists of at least one white-space character that immediately precedes a single underscore character as the last character (other than white space) in a text line. A line continuation allows a logical line to span more than one physical line. Line continuations are treated as if they were white space, even though they are not.
    Example:
    Public A, B,_
    C,D, E, F
    If (A And B)_
    Or (C And D)_
    Or (E And F) then Exit Scan
  • Improved ACPower() instruction to include Wild AC power.
  • Enhanced ModBusSlave so that multiple ModBus slave instructions referencing the same address can reference different start registers via the offset specified in the ModBus address parameter.
  • Changed SampleMaxMin() so that the disable parameter is allowed to rep with the () syntax.
  • Fixed default units for WindVector.
  • Fixed Units problem when variable_name(constant_index_name) exceeded 38 characters.
  • Relaxed error checking for subroutines calling tables and being called from different sequences.
  • Fixed timestamp problem for interval tables using disable var to not output on the interval.
  • Fixed a problem with long interval (>1hr) tables where there was a skipped record and a write to the table on the first call due to using the wrong time.
  • Fixed “off-by-one error” in record number calculation for SC115 in "milking" mode.
  • Allowed call to Subroutine with no parameters defined using the () to have white space following the () notation.
  • Changed the PPP interface so that it will get a gateway via the PPP DHCP client even if it already has a gateway from the Ethernet interface.
  • Enhanced HTTP web service with NewFile, ClockSet, and ClockCheck commands.
  • Changed to flag a compile error if a Function is invoked with the "Call" instruction.
  • Changed FileSize and FileTime so that if the parameter is of type String then it is assumed to be a file name instead of a file handle.
  • Changed output modes of EC100 instruction.
  • Added 218 command to EC100Configure and reworked instruction to allow running in the SDM measurement task.
  • Changed PakBus Callback so that an extra 5 seconds is added to the timeout waiting for the Public.Callback response.
  • Extended the guard time around the +++ "go off line" message to modems used by the DialModem instruction and by PPP dialing from 1.2 seconds to 2 seconds, since some modems expect 2 seconds instead of the original Hayes modem of 1 second guard time.
  • Changed EmailReceive so that the optional parameter specifying where to return Date, From, and Subject will work irrespective of the order they are returned by the POP3 server. Previously the order returned by GMAIL worked but not the order returned by other email servers.
  • Added tracing for EmailSend and EmailReceive if the datalogger’s IP Trace code is 4.
  • Changed IPRoute() instruction so that the next hop is the gateway instead of its own address.
  • Changed TCP and FTP user name and password to accept up to 64 characters (include null teminator) from 32.
  • Changed DNP3 protocol: (1) multiple master connections are possible. (2) Flag arrays will index along with the data arrays. (3) The DNP "on line" flag is controled by the program's flag, bit 0, instead of forced to always on-line. (4) A TCP/IP connection will use TLS Secure Sockets if the TLS Server setting and TLS setting are active.
  • Changed EC100 & TGA to load -99999 into first input location if a signature error on SDM data occurs.
  • Improved communications so If in terminal mode over Modem Enable and the 'W' mode, keep the ME line high for the duration of the timeout specified.
  • Changed the reps parameter of Move, RMSSpa, StdDevSpa, MaxSpa, MinSpa, AvgSpa, CovSpa, and SplitStr from integer constant to variable integer.
  • Fixed parsing a constant expression that begins with &H (hexadecimal) or &B (binary) and includes a subsequent operator; e.g., &H8000 + 2.
  • Fixed GetDataRecord and AcceptData when the record is large enough to require multiple fragments.
  • Fixed SerialInRecord in the case that number of bytes is specified, along with either the begin word or the end word.
  • Improved synchronization between SDM task and processing when skipped scans occur due to SDM task taking too long.
v13July 9, 2010
  • Added CRBasic operators ,*=, +=,-=, /=, =,^=, and &=.
  • Added CSIJSON file format to TableFile option.
  • Added EC100 and EC100Configure.
  • Added CWB100Routes(port, Destination as String) instruction
  • Added an option to TableName.TimeStamp(2,n) when returning to a string so that date/time is formatted with a standard Internet timestamp; e.g., as Tue, 20 Apr 2010 03:25:15
  • Added DHCPRenew instruction that restarts DHCP on the Ethernet interface.
  • Added New datalogger web service, including basic authentication using cpu:.csipasswd file.
  • Added Optional Parameters to user functions and subroutines using the "Optional" keyword. Optional parameters must be initialized and required parameters cannot be initialized. When Function and Subroutine calls want to use the default optional parameter, they pass in a comma.
  • Added ArrayLength (Variable) function that returns the length of the Variable. In the case of variables of type String, the total number of characters that the array of strings can hold is returned.
  • Added ReadOnly declaration that will flag a comma separated list of variables (Public or Alias name) as read only.
  • Added an optional variable array parameter to FFTSpa that, if present, will be initialized at compile time with the frequency axis of the FFT.
  • Added ArrayIndex(name) function that will return the index of the name in the Wireless Sensor Network array or the New Field Names array.
  • Added up to 3 optional parameters to EmailRecv so that the From, Subject, and Date fields in the response header can be returned.
  • Added an option (2) to the SecsSince1990 function that assumes the date/time format is that in the header of a received email; e.g. "Fri, 26 Mar 2010 03:21:56", a somewhat standard Internet format.
  • Added optional parameter to ModBusMaster that will specify register ordering and length of integers with the same specification as the optional parameter in ModBusSlave.
  • Added CommsMemFree(3) to Status Table that helps keep track of TCP/IP memory usage.
  • Implemented Secure Socket (TLS) for DNP3 and HTTPS. Must have the TLS setting active.
  • Fixed -0.0 string conversion from hanging the running program.
  • Changed TimeIntoInterval/IfTime to allow the parameters to be variable.
  • Changed SerialOpen to allow it to have a variable baud rate.
  • Changed Subroutines and user declared Functions so that they can be called with fewer arguments than the number declared. Also, the array length of the local variables in Sub take on the array length of the variable passed into the local variable.
  • Changed Modem Dialing so that the response is not case sensitive.
  • Fixed Maximum, Minimum, SampleMaxMin, Totaltize, Average, StdDev, and Moment when the source is TableName.FieldName and is of type FP2.
  • GetDataRecord 1) Changed so that multiple records of an interval driven table can be collected by specifying DataInterval in both the remote and the local datalogger. 2) Changed so that the timestamp is always that of the remote. Previously, if only one record was collected, it was the timestamp of the local datalogger.
  • Fixed TableFile writing tob1 files for tables with BOOL4 in them.
  • Fixed SDI12 sensor I! return string.
  • Fixed Slow sequence scan in pipeline mode when running with a main scan that has a long scan interval (~10min) causing watchdog when the slow scan executes.
  • Changed time of max/min timestamp to not always use the main scan timestamp.
  • Fixed first timestamp in table that is running outside of scan..nextscan.
  • Fixed sampling expressions in output tables to not use inlocnames space.
  • Changed PWM to detect if port has been changed to input, and if so re-configure the port to function as PWM.
  • Changed PWM instruction to allow a variable period. Also, modified the checking of used ports to detect conflicts with PWM and TimerIO. Finally, allowed multiple PWM instructions to be used on the same port.
  • Fixed EssVariables memory allocation problem.
  • Fixed Expression with string concatenation, using tablename.fieldname and a string array with variable index causing a pre-compiler crash, due to null pointer access.
  • Changed DNP to allow up to 4 master sessions.
  • Fixed PortSet(9,X) writing "Output" into status table outside the port_config array bounds.
  • Forced reinitialization of comms memory after OS load.
  • Changed option 2 of date/time format to print the day as single digit if it is < 10.
  • Fixed the declaration of string variables so that the size specification can be expressed as an expression.
  • Changed ModBusMaster so that if the response comes back with an incorrect length, then keep looking as opposed to flagging an error. This helps prevent late responses from a previous request to abort looking for the response from the current request.
  • Changed ModBusMaster so that the result code will always be correct and so that it will wait correctly for either success or a timeout. Previously, it was possible for the response to another ModBus Master instruction to cause the current instruction to think prematurely that it has successfully communicated.
  • Improved ModBasSlave to allow to send back 64 floats instead of only 63.
  • Fixed SplitStr when the result variable is of type string and is the same variable as the Search string.
  • Changed how scan synchronization to real time works. Previously, a delay time was calculated and the running sequence was unconditionally delayed until the sync time came. This made it impossible to detect time changes that occurred during the delay. For long scan intervals, this caused problems for people trying to force execution of scans for testing purposes. Now the sequence is delayed a single tick and the delay end time and the setting of a new time are polled each time through the loop.
  • Fixed Slow sequence scan synchronization to real time when the scan interval is > 1 hr.
  • Fixed SDMCan used outside of scan crashing pre-compiler.
  • Fixed ArgosData crashing pre-compiler when there are not enough data values to cover all of the fields in the table.
  • Increased headroom for auto-range calculation for ACPower ranges.
  • Relaxed calibration check parameters.
  • Fixed FieldCal alias problem introduced with changes to speed up alias evaluation (OS 18.01). Also, add a check in SampleFieldCal to make sure the same field does not get loaded multiple times.
  • Changed TimedControl to advance to next index if a value <= 0 is loaded into the scan count at the newly entered index. All indices are checked and if all counts are <= 0, the current index will remain active (this avoids looping forever when all counts are zero).
  • Fixed TableFile not writing after table is reset.
  • Fixed the first value stored by Minimize and Maximize when the source variable is a different type than the value stored.
  • Fixed Alias when several aliases are declared on one line.
  • Fixed GPS when attempting to write into a NMEA sentence string beyond its dimension size. Adjacent variables would be over written.
  • Changed to not start HTTPS server if running no program preceded by OS download.
  • Changed EthernetPower to 1) rely on global (rather than local to the instruction) to determine whether or not the Ethernet chip should really be shutdown/restarted. 2) when resuming from Ethernet power off reinitialize DHCP if not configured with a static IP address. 3) Fix so that it will not possibly stop out going IP packets when it is turned back on.
  • Fixed possible watchdog timer due to excessive TCP traffic.
  • Changed EmailRecv using the "TLS" option but without the TLS setting enabled to return gracefully with an appropriate response message instead of resetting the datalogger.
  • Change the SDI12 aI! command so that it conforms to a standard response.
  • Change RTOS function call getres() to not reschedule if the resource (semaphore) is available. This will speed up tasks that get semaphores very frequently (e.g., comms), when other tasks running at the same priority are very busy (i.e., "hog loops" in slow sequences).
  • Added a mechanism to lock out heap memory allocations before initializing final storage memory. A small window between allocating final storage and running the program resulted in heap memory allocation attempting to take memory from final storage memory area after it was initialized for use as final storage. This resulted in a mem fail 5 error.
  • Changed format of Status.CommsMemFree(1). so that it displays 4 different memory areas in base 100.
  • Added a check of the calibration values at startup.
  • Fixed a possible erroneous "Out of memory." error when an expression includes a string variable and a TableName.FieldName value.
  • Enhanced Alias so that local variables and global variables with the same name can be aliased correctly.
  • Increased the maximum possible concurrent File Uploads, including uploading table definitions, from 4 to 8.
  • Fixed a rare erroneous result code of success returned to a PakBus instruction if a response from a previously timed out instruction came in while waiting.
  • Fixed decryption when the main program file and an include file are both encrypted.
  • Improved datalogger so it will not watchdog if TCP/IP packets are used up, since they can eventually be freed up.
  • Changed TCP/IP write function so that a broken socket cannot use up all the global TCP memory thus causing general IP communication to temporarily stop.
  • Expanded the runtime memory when TLS is active to prevent possible instances of out of memory when servicing a secure socket.
  • Fixed erroneous DataInterval skipped records when the table disable variable is set at the output interval and not the scan following.
  • Changed serial I/O buffer management so that if writing into the buffer catches up to the read pointer, then the read pointer will be set one byte in front of the write pointer, resulting in the size of the buffer minus one byte of "unread" bytes. This affects SerialInChk, SerialIn, SerialInBlock, and SerialInRecord instructions.
  • Changed FFT and FFTSpa so that the sample interval parameter accepts a non-integer floating point entry.
  • Increased the ASIC conversion time by two ticks (Fclk/2 resolution) to align the overall measurement loop to a Fclk/8 boundary so that single measurement reps on the same channel will be aligned. This allows the user to calculate the exact sample interval. The calculation is: #if logger_type = CR3000 Fclk = 14.7456 #else Fclk = 7.3728 #endif Tsample = (8.0/Fclk) * Int((settle*Fclk/8.0) + 0.5) Where settle is the sample interval (entered in the settling time parameter). This Tsample can now be fed as a float into the FFT functions, to give the exact sample interval used to generate the time series data. This will result in correct bin frequency representation of FFT data.
  • Changed StdDevSpa to subtract out the first value from all input values as an estimate of the mean to reduce precision errors. This is how the output instruction has always worked.
  • Changed to ensure no skipped scans when setting time.
  • Fixed a problem where a slow sequence FileOpen occasionally failed if it was the first instruction in the slow sequence. There was a flag tested to ensure that the program was running before any files were allowed to open. The flag was set by the main scan processing task after other tasks had been started.
v12January 1, 1912
  • Added ACPower instruction.
  • Added the ability to increment the disable variable when Reps parameter is greater than 1, using the () syntax, to Maximum, Minimum, Average, Totalize, StdDev, Moment, and Covariance instructions.
  • Improved DNP3: Added ability for DNP3 messages to be routed over a PakBus network via PakBus datagrams.
  • Added ability to declare multiple, comma separated, alias names of an aliased array with a single Alias declaration. For example, Alias Array = FrontRoom, GreatRoom(4), BedRoom
  • Removed an arbitrary limitation of 12 or so TCPOpen() and UDPDatagram() instructions.
  • Changed Allowed PakBus Neighbors setting so that if a setting is cleared, the end setting is put to 0 instead of left the way it was. The only consequence was that the display by on the keyboard/display would show something like 0,22 instead of 0,0.
  • Changed PPP so that AC and P Compression default to 0 instead of 1 to accommodate a wi-fi unit.
  • Fixed WindVector so that the default units of "Deg" is inserted correctly.
  • Changed Units declaration to a FieldNames list of more than one name in a single declaration.
  • Fixed TableFile working with variable interval when interval is changed from < 1hr to >= to 1 hr.
  • Fixed TableFile so that starting file number does not overwrite files already on the drive. This problem was introduced with the fix for filenames with numerics at the end of the name (OS 16.01).
  • Fixed ModBusMaster, DNP3, and DataGram on Com1..Com4 so that they keep parity and other settings.
  • Fixed possible (harmless) watchdog during reset when using PPP. Semaphore that is used by the task that strobes the hardware watchdog was locked by the shutdown code prior to calling PPP shutdown. PPP shutdown can take several seconds, which is beyond the watchdog interval.
  • Changed TCPClose() so that it waits until it is closed, fixing possible comms memory leak.
  • Fixed the GPS instruction so that is does not lock up if a NMEAstring contains a values with greater than 5 digits behind the decimal point.
  • Improve pipeline mode slicing algorithm for slow sequence measurements. Time allocated for measurements was incorrect, causing certain combinations to not slice correctly.
  • Fix ModBusMaster over TCP/IP so that it does not leak Comms Memory in the case that the TCP/IP socket was closed just before it tries to send the command to the slave.
  • Changed Custom menu so if it is configured to skip the system menus and there is a compile error, it shows the error instead of going right to the custom menu.
  • Changed the Rso clear sky solar radiation calculation in Etsz instruction from the simplified version to the extended version as specified in Appendix D of the ASCE-EWRI Standardization Equation Bulletin.
  • Fix TableName.FieldName to not overwrite variables during compile. When Preserve Variables was used and TableName.FieldName was in an expression that stored to a variable, that variable was not being maintained after re-compile.
  • Changed Alias declarations to speed up compile operation.
  • Fixed ComRS232 to not go to standby if the RS232 power ON is set to stay powered up.
  • Fixed a hang condition caused by converting -0 to a string. The -0 can be created when converting FP2 to float (introduced in OS17).
  • Fixed FP2 storing to not create -0.
  • Fixed file upload, including getting the directory, when more than 4 different PakBus client addresses have uploaded.
  • Removed compile warning if voice.txt is absent and a COM320 is not connected.
  • Fixed filename wild card matching. When using * matching, the strings were synchronized to the character after the '*'. If the strings did not match from that point to the end of the string, the match failed. This caused "name.name.png" to fail the wild card search "*.png". Now, the wild card search is reset when a mismatch occurs, this goes on until the end of the searched string is detected. If at the end, the two string pointers are not at the end of their respective string there is not a match. This effects NewFile, the Files Manager setting, and the communication directory upload command.
  • Improved FieldCalStrain to prevent pre-compiler crash when invalid parameter used as strain_dest.
v11January 1, 1911
  • Fixed WorstCase not storing the correct number of records.
  • Eliminated possible file handles leak with hidden files.
  • Fixed TableFile interval mode tables off by one record between file data and table data.
  • TDR100: Added more delay for TDR to respond after sending command and before receiving echoed command. Fixed loading the cable length in the waveform data when the TDR does not respond to commands.
  • Fixed TCP/IP when sending PakBus packets with excessive amount of quoting. Packet size was exceeding the allowed size for Ethernet. Fix was to break up packet into smaller pieces.
  • When converting a string to numeric, "TRUE" converts to -1 and "FALSE" converts to 0.
  • Improved DNP3: Fixed problems with group 10, variation 1 and 2. Changed the response if the group and/or variation do not exist so that the sequence number is correct. Changed so that event timestamps are kept in UTC, using the datalogger's UTC offset setting if active. Fixed setting negative 16 bit integers.
  • Changed String functionality: When comparing a String variable with a numeric variable, convert the string to numeric before comparing. Previously, if the string variable was on the left side of the operator, the numeric variable on the right was converted to a string before comparison.
  • Improved checking for valid variable names. Don't allow ']', '[', or '#' characters.
  • Changed SDM handling out of sync with measurement. Don't run through the acquisition code.
  • Changed Files Manager Setting operation to eliminate possible corruption of the setting.
  • Fixed possible problem with Files Manager setting partially changing the setting while concurrently recompiling. This is done by waiting for and locking the semaphore that protects the settings.
  • Fixed terminal mode writing to an erroneous pointer in the case it timed out waiting for more input. For OS 16 this bug caused the table definitions to be corrupted due to overwriting the type of the CPUDriveFree field in the Status Table. In OS 17 this caused the Status table as a whole and the individual field CPUBytesFree to be uncollectable.
  • Corrected a problem where the check for switching to sequential mode was being skipped. The "Do" instruction was not being detected as a conditional, so instructions that switched to sequential in conditionals were not.
  • Change CallTable to 1) detect if called from outside Scan..NextScan and get pointer to correct time (system or scan). 2) Add checking to make sure the same table is not called simultaneously from multiple sequences.
  • Added an optional parameter to GetDataRecord, MaxRecords. If MaxRecords is < 0, it will collect up to MaxRecords of the uncollected data, beginning with the oldest. If it is > 0, it will collect the uncollected data up to MaxRecords, beginning with the more recent. If not present, the default is 1 (the most recent record). Note that if the parameter is not 1, two exchanges will take place. The first will determine the current record number. Then a command to collect from beginning record number to ending record number will follow. - Fixed AVW200 when the destination has a variable index so that the data does not always store into the first variable that was accessed.
  • Fixed potential FTP problem when dealing with file names longer than 12 characters. This was due to an OS build issue, where long file name support was not enabled in a header file accessed by the TCP/IP source code.
  • If a default program compiled successfully after an attempt to compile another program resulted in errors, the error messages of the failed program will be appended to the compile results of the default program.
  • Fixed SendFile instruction so that it does not sometimes erroneously report a file seek error -25 result code.
  • Added a 3 second timeout when the VoiceSequence ends in the event that VoiceDial had triggered the voice sequence. This allows the COM320 to hang up properly before another attempt at dialing is made.
  • Limited to only allow PWM instruction to occur once per port in a program.
  • Fixed pipeline mode slow slicing issue that caused time to advance incorrectly due to the background calibration executing the task sequencer with the wrong starting opcode pointer. This was timing dependent, and required the measurement time to be 4 seconds long.
  • Fixed AVW200 with variable reps so that the instruction will wait the extra 2 seconds per rep needed for the AVW200 to make the measurement.
  • Removed non-interval table information from the pre-compiler's ?Show Labels? list output. Displaying this information caused confusion.
  • Limited the number of files and COM ports that the user can open without closing in CRBasic so that the system does not run out of memory for normal file operations.
  • Fixed reference to function names of type Long or Float, previously assigned, inside the function itself.
  • Allowed variable initialization to occur on multiple lines, as long as the line break is after a ',' value separator.
  • Fixed possible semaphore deadlock when retrieving files or getting table definitions while also concurrently servicing FTP or other file transactions via TCP/IP.
  • Changed ModBusSlave as follows: 1) Accept a command to address 0 (a broadcast) 2) Added an optional parameter code that will allow Longs to be treated at 16 bits or treat 32 bit Floats or Longs as fully big Endian; i.e., it will reverse the order of the 16 bit registers.
  • Changed terminal mode 'P' (talk through mode) and 'W' (snoop mode) to allow the user to override the default 40 second timeout. In addition the 'P' command will also stay on, like the 'W' command, if PakBus is active on the terminal COM port.
  • Added "plain/txt" as a file type for http.
  • Fixed sending attachments via EmailSend if the size of the attachment file is greater than roughly 3000 bytes. With these larger attachments, the boundary after the end of the attachment was not correct.
  • Added globalLocalTimeDifference MIB to NTCIP.
  • Added the FormatLongLong function which will convert a 64 bit long integer into an decimal string. The source is assumed to be 2 adjacent longs. Example: dim src(2) as Long = {2,3} public ID as String ID = FormatLongLong(src) ' ID is 8589934595
  • Improved SNMP (NTCIP) as follows: 1) Allow time as mask variables' range to be the full 32 bits instead of just half. 2) Community names limited to only two, one with read/write access (default "private") and the second with read only access (default "public"). 3) Added an optional parameter to ESSInit that is of type String, can be variable, with two community names, comma separated, the first one with read/write access, the second with read only access.
  • Fixed FormatFloat when trailing 0's need to be added since the precision specified is > than the precision of the value, when using "%.nf" where n is the precision.
  • Improved TableFile: 1) updated the output status and the output file name at the same time. 2) Added more checking of return codes to improve robustness of the SC115. A power loss (or disconnected cable) during a write resulted in missing records. Now the failed write is detected and the last saved record number is not updated unless everything succeeds.
  • Changed Custom menus to allow Constants from the constant table to be modified. To get this feature use MenuItem with the constant as the value to display, then use MenuPick with the Constant as the first name in the pick list, and subsequent pick choices as desired. Editing this constant will modify the value of the constant. For the change to be permanent (i.e., changed in the program) a new instruction: MenuRecompile(string,var) was added. After this menu item is selected for editing the expression for the variable is evaluated and if non zero the constants are saved and the program recompiles.
  • Enhanced auto-switching to sequentialmode to include SerialInRecord and SerialOutBlock inside conditionals.
v10January 1, 1910
  • Added IPRoute() instruction.
  • Added UTC Offset setting, used by SendEmail and HTTP. Also modified DaylightSaving/DaylightSavingUS functions to change the setting by one hour if in use and the time changes.
  • Added FormatLong() function.
  • Added variable initialization feature, as in Public Name(Dim) as Type = {v1,v2,...vN}.
  • Added an optional 3rd parameter for the DNP() instruction such that DSSS means: D = 1, disable 60 second Link Verification; SSS is retry timeout of SSS seconds (000 defaults to 3 seconds).
  • Improved DNP: 1) Don't keep the previous structure when the data tables are not preserved. 2) Fix possible memory corruption from releasing memory multiple times. 3) Fixed possible watch dog when large responses with event data are longer than one fragment.
  • Optimized internal function that converts floats to string. This improves performance of TableFile when creating TOA5 files.
  • Improved TableFile. Created a new task to handle writing to files without holding up the processing. One task will handle all TableFiles. If the last write is not complete when it is time to write again then processing will wait. Task also handles SC115 being first being plugged in. 2) Fixed the filename creation and sequencing when digits are at the end of the file name, e.g., Table1.
  • Improved GPS: 1) Fixed occasional, unnecessary changing of the clock every second or two when the maximum allowable error is < 20 msec. 2) Improved better track time. 3) Changed so proprietary strings can be read and so that it works with all variations of NMEA RMC and GGA strings. 4) Improved detection of no PPS signal.
  • Changed FillStop so when table fills, record number and table defs are updated so LoggerNet can collect all of the data.
  • Changed SDI12Recorder so that if the variable command is 'C' instead of a previously issued 'C!", the datalogger will return 1e-9 until the timeout response from the previous "C!" expires. At this time it will query for the data and return the data (or NAN if unsuccessful) and exit, without issuing a subsequent measurement command.
  • Fixed SDI12Recorder so that at least 100 msec elapses between successive calls.
  • Changed so SDI12 communication is displayed via the terminal 'W' snoop command.
  • Changed SDI12Recorder to return NAN under the following conditions: 1) When busy with terminal commands. 2) When the command is an invalid command. 3) When the sensor aborts with CR LF and there is no data.
  • Modified histogram to detect special disable var = 12345. This overrides the constant NoReset and resets the histogram (if outputting). If disable var is -12345 then the histogram is reset whether outputting or not.
  • Fixed RWIS (NTCIP) clock set function and TimeZone such that if the UTC Offset setting is active, then it becomes the RWIS Time Zone variable.
  • Changed FTP Server to not drop the connection if it gets an AUTH request that it cannot satisfy.
  • Changed HTTP to work with Google Client and also to be more efficient when retrieving a file or default web page by not requesting that the client ask for a new location.
  • Changed HTTP syntax for entering security on URLs such that when there are multiple commands, it is entered as the last command as "&security=xxxx".
  • Added Rename command to FTP Server which uses the CRBasic semaphore #4, as does the HTTP get file.
  • Changed the HTTP web server so that it gets and uses the CRBasic semaphore #4 before serving up a file. This can be used along with CRBasic programming to coordinate access to a file with the same name.
  • Fixed HTTP when setting a variable of type String.
  • Changed ModBusMaster so that the Function, Start, and Length parameters can be variable.
  • Improved ModBusSlave to allow multiple ModBusSlave instructions, with different addresses, over TCP/IP.
  • Fixed Public variable declared as "is" crashing precompiler when used later.
  • Fixed Log10 to return NAN when it receives a value <= 0. It was returning 0.
  • Fixed SDM synchronization with measurement.
  • Fixed VoiceNumber(timeout) function.
  • Fixed AVW200 so that if it times out without response it will set the result code correctly and put NAN into the return values correctly.
  • Fixed possible memory problem with file upload when aborted with two different tasks releasing the same memory.
  • Fixed PakBus file retrieve so files are closed when file transfer is aborted by the client. The symptom was that the datalogger could run out of file handles so that the drives were not accessible.
  • Changed support for COM320 so that servicing keys does not get behind speaking.
  • Modified SDI-12 Sensor to clean up verifier failures.
  • Fixed precompiler when working with encrypted Include files.
  • Fixed using fieldname when sampling Status.TimeStamp in a data table. This was crashing the precompiler.
  • Added CS7500 Mode 3. It returns only the diagnostic, bandwidth, and delay interval.
  • Fixed SerialFlush for Com1, Com2, Com3, and Com4 so that a usec window of time is protected from incoming bytes possibly causing a watchdog interrupt and garbage bytes read into the serial buffer.
  • Fixed a problem with auto-ranging measurements in SlowSequences when using 50Hz and 60Hz rejection integration.
  • Changed updating CompactFlash card bytes free to check if the info sector is used. If it is not then update it. This avoids the repeated long delays of determining bytes available on the card.
  • Improved SequentialMode scans so when starting SequentialMode scans, the datalogger doesn?t lock the measurement semaphore while synchronizing time to the new scan interval.
  • Changed CardFlush instruction to flush all pending TableFile data as well as CardOut data.
  • Fixed a problem calculating offsets into an existing TOB3 file. This caused corrupt file headers when a table storing to a card was reset after starting to store to it. Also if the file existed when the program compiled then the table was filled and rung, the header was corrupted.
  • Changed DataInterval as follows: If the TrigVar in the DataTable instruction is not True when the DataInterval time for output is due, discard and reset the intermediate processing values right then rather then waiting for a time when the TrigVar is true. This way, on the next Interval step, if the TrigVar is true (and the table is called), we can get good output, with processing based on the correct Interval (based on the DataInterval instruction).
  • Removed a change made in OS 15.05 (released OS 16) which forced x ^ y to a double to avoid over ranging integers. This was causing incorrect evaluation of expressions like 180/2^15. If the result will over range an integer then the expression should be forced to a float.
  • Allow Alias and Units declarations to reference a declared string constant as an aid to foreign language support, as in: Const PTempUnits = CHR(HexToDec ("C9")) CHR(HexToDec ("E3")) CHR(HexToDec("CA")) CHR(HexToDec ("CF")) CHR(HexToDec("B6")) CHR(HexToDec ("C8")) Const PTempAlias = CHR(HexToDec ("CE")) CHR(HexToDec ("C2")) CHR(HexToDec("B6")) CHR(HexToDec ("C8")) Alias PTemp = PTempAlias Units PTemp = PTempUnits
  • Changed PWM to force the hardware to be updated the first time through when the duty cycle is zero. It was already updating for all other values, but zero was leaving the hardware unchanged.
  • Fixed ExitScan in SequentialMode not releasing the semaphore when executed from the main scan.
  • Added DisplayMenu mode -4. This works like -3 (show only the user menu with no system option), but adds the Display Settings menu to allow changing display parameters (timeout, contrast, etc.). Also changed mode -2 and -1 to include constant table menu (ConstTable) if one is active.
  • Improved precompiler for VoiceSpeak - If voice.txt is not present, don't give an error and assume program is being compiled for a COM320. Also, only try to open the voice file once.
  • Changed Alias declaration so that a constant string expression is legal.
  • Fixed Pwr(x,j) when x < 0.
  • Changed setting the baud rate for Com1..Com4 such that if it was changed (via the keyboard/display or via DevConfig)from 0 to non-zero or from non-zero to 0, the datalogger will recompile its program. If changed to non-zero, activate the ComPort as a PakBus port.
  • Changed keyboard/display editing so that when Num Lock is Off, the up and down cursor keys will scroll through the alphanumeric characters.
  • Changed editing the ConstTable and editing files via the keyboard/display so that the prompting is more responsive.
  • Fixed the User Function so that a reference to a user function name must be followed by a '(' if the function is meant to be called, else it is simply assigning or referencing a return value for the function. Also, flag an error if a function is recursively called.
  • Changed TimedControl to allow for synchronization intervals greater than one hour.
  • Added another output mode to output duty cycle 1 and 2 for TGA instruction.
  • Fixed some of the options in CheckSum so that if the length parameter is negative, it will exit immediately instead of locking up for a long time.
  • Fixed modem connecting using the COM320 when the Voice Sequence is using long delays.
  • Changed constant table (ConstTable) so it can be used in an Include file.
  • Added a compile error if a subroutine name is entirely numeric.
  • Fixed HexToDec("0") ? Function was returning NAN instead of 0. This was a bug in the low level scanf function when using the %x format.
  • Fixed expressions such as A - B*C in the case that A is of type Float while B and C are both of type Long.
  • ReadIO, WriteIO and SW12 changed to allow the source variable to be a variable of type Long.
  • Changed SerialOutBlock when outputting in PipelineMode so that the 'W' snoop command in the terminal mode will show the output.
  • Changed AVW200 instruction so that the destination, multiplier, and offset can be variable.
  • Improved COM320 - 1) Don't duplicate the compile warning message that the file Voice.Txt is not present (the COM320 does not use Voice.Txt, and this message is only for the Com310.) 2) When there is no VoiceBeg/VoiceEnd sequence active, exit as soon as a tone is received instead of staying on line for 3 messages.
  • Fixed RoutersNeighbors() in the case that the array is not large enough to hold all the routers. Also included the datalogger itself as one of the routers if it is a router.
  • Added feature to PakBus File Directory retrieval such that ".DIR/DRV/Filename" can be used to retrieve only the information for "DRV:FileName". Filename can have wild card characters.
  • Allow both Ethernet and PPP interfaces to work concurrently by adding a route when an IP packet is received back to the same source that it came in on for the first hop.
  • Fixed Move() instruction to work correctly with Boolean arrays.
  • Fixed SplitStr when the filter is white space (space or tab), and also when the right justify option is used when the destination variable is numeric (not a string).
  • Added feature to File Manager Setting so that an incoming file can be copied into two different files if there are two settings with the same node ID and the same file extension.
  • Fixed the Files Manager setting in the case where more than one setting is active and the sources are not both from a PakBus node, or not both from an FTP source, or not both from a FileOpen source. If the two files came in at the same time from two different types of source, then the file name might be corrupted.
  • Changed CR800 compiler to return a compile error if EthernetPower() is in a program.
  • Added a compile error when there are multiple instances of NewFieldNames or of the wireless network instruction.
  • Removed possibility of PipelineMode skipped scan measurements overwriting processing data for one scan prior to detecting the skip.
  • Fixed precompiler to work with encrypted program files.
  • Improved the compiler's catch of a syntax error in the For statement.
  • Fixed table called outside of Scan..NextScan. Calling table multiple times was hanging the task that called it.
  • Added TLS (Transport Layer Security) protocol which can be used with EmailSend and EmailReceive.
v9January 1, 1909
  • Changed Default datalogger generated web pages so that they pass "validation".
  • Changed PPPClose to also look for "NO CARRIER" when ppp is closed before "AT" verification command is sent.
  • Fix Precompiler checking for valid program filename length.
  • Median fixed for reps>1 using FP2 data type.
  • Fix Pipeline mode slow sequence slicing for Delay, and PulsePort instructions.
  • Fix Status variable RunSignature to include the expression memory into the signature. Changing constants in a program was not giving a different signature. This caused LoadFieldCal to erroneously load the calibration data.
  • FieldCal: include the reps as part of the signature used to determine whether or not to create a new file. Reps was changed and the old file was still used. This confused the FieldCal wizard. Also added checking for the gf_raw parameter to force it to be the same size as the other arrays etc. And fixed gf_raw when indexing into an array with reps set to 1.
  • FieldCal: 1) added more checking for successful file creation. 2) improved checking to determine whether or not to use existing calibration file. 3) Added checking for reading and writing the file created. Will now give an error if the file cannot be created due to full disk.
  • Fix sequential mode problem starting main scan causing the slow sequence to hang. This was only encountered in a CR5000 (because it is faster than the others), but was a potential problem for CR1000, and CR3000 too.
  • Fixed a problem accessing TableName.Fieldname when in a parameter type that expects a pointer to possibly multiple values rather than a single value. The problems will exist in: SerialInBlock(comport,Source,..), the Source parameter CheckSum(Source,...), the Source parameter FileWrite/FileRead(handle,Source,..), the Source parameter FindSpa(SoughtLow, SoughtHigh, Step, Source), the SoughtLow, SoughtHigh, and Source parameters. Also fixed a problem when this type of parameter is an expression involving more than a simple reference to a variable.
  • Changed Com1..Com4 activation so that if its baud rate setting is set to non-zero by some means other than SerialOpen(), then it will remain active even after switching from a program that uses SerialOpen to a program that does not. Previously, if a program was shut down that used SerialOpen, the comport would also be shut down.
  • Fixed DNS client time to live to work with roll over timer.
  • Changed PPP authorizations retry timeout to 15 seconds from 3 seconds.
  • PPP PAP authentication tries reduced from 10 to 3.
  • Allow Sequences like DialSequence/EndDialSequence, WebPageBeg/WebPageEnd, and VoiceBeg/EndVoice to be located inside a SlowSequence.
  • Fixed FindSpa as follows: (1)when assigned to a non-scalar, (2) when the Low, High, and Source are Strings, and (3) when Low, High and Source are of different type, then a compile error is flagged.
  • Fix Case statements with functions.
  • Fix Alias problem when declaring an alias array. Very rarely an obscure and incorrect compile error resulted due to un-initialized memory.
  • 'W' command in terminal mode enhanced to include TCP communication.
  • TCP ModBus Master fixed to advertise number of bytes in packet correctly.
  • Change main scan to recognize new time set without waiting for the next scan interval. The new time will now be detected as soon as processing for the current scan is completed.
  • Fix memory problem created by the internal function that checks filename for tables storing to the card. The problem occurred only if the length of the table name (not file name) was greater than 8 characters. The problem was manifest by not being able to download files to the PCCard when the program had a CardOut instruction for the table that had > 8 characters in its name.
  • Change FFT and FFTSpa options 1..4 to correctly return DC and Nyquist values.
  • Changed compiler and pre-compiler to flag an error for alias declarations that are clearly illegal.
  • Fixed x to power of y when x and y are long.
  • Fixed sub 1 second error when setting the clock via LoggerNet.
  • Changed GetDataRecord and AcceptDataRecords to work with TableFile.
  • Changed FTPClient() to optionally do Passive Mode. The option code 2 = Send Passive, 3 = Receive Passive.
  • Changed HTTP so that wget can be used to retrieve files since it could not handle "Chunk" data transfer protocol.
  • Changed DialSequence to have its own thread so that it will not hold up various PakBus messages.
  • Change FieldCal to give a compile error if KnownVar and MeasVar are different sizes.
  • Fixed Network instruction to flag correctly overlapping networks that are identical.
  • Allow declaration of public variables and constants to not cause a compile error when declared after variables declared locally to a subroutine with the same name.
  • Change tob3 header creation to include array dimension info for fields that are created by sampling a single value from within an array.
  • Card Storage change: When ringing the CPU memory force a flush of the file system to make sure there are no sectors hanging around in case power is lost.
  • Improved synchronization between dig TS and processing when skipped scans occur or time is changed.
  • Removed timeout waiting for the DIG_MEAS event. Will now wait forever.
  • Fix data types reported in Pre-compiler table definition files to match the logger type rather than the endianness of the machine that the code is built for.
  • Change PulseCount configure option to be a variable. This allows different sensor types to be configured within the same program.
  • Change field formatting in table list option of precompiler. Added after each element of an array (to avoid lines too long). Also fixed dimension information for single values sampled from within an array.
  • Changed string operators to all be case sensitive. Fixed String <, > <= >= and - operators to not return the negative value expected.
  • Changed communications memory allocation so entire PakBus packet for output can be sent at once, else ComME packets could be broken up with pause/ready packets.
  • Fixed SDC PakBus packets when specified to be broken up by the SerialOpen command to send the correct minimum size packets.
  • Changed SDC output when special SDC addresses are specified by the SerialOpen (e.g., special communication with GOES) to used the baud rate specified by the SerialOpen command (the baud rate specified for ComME).
  • Fixed the Network() instruction to (1) return the correct result code if the result code is of type float, and (2) to correctly advise the remotes on the correct time gap between each other's transmissions instead of telling them all to transmit with 0 time gap (on top of each other). This problem was introduced in version 15 when we made it work with Long. The problem was it forced it to Long instead of allowed it to be either Long or Float.
  • Fixed the Routes instruction when not enough space is allocated for all the routes.
  • Changed SerialOpen to allocate enough buffer space if PakBus format was specified with a larger buffer size than a previous SerialOpen had allocated.
  • Fixed Email Send and Receive and TCPOpen to connect to a new server specified by a change in the server address parameter.
  • Enhanced FileCopy to not return success if the filesize changes between opening the file and writing the bytes out, or if the file size is zero. This was done because of an application that was copying a file that was asynchronously sent to the logger on a periodic interval. Sometimes the copy in the program was occurring at the same time as the communications copy, this was resulting in a zero length file.
  • Fixed array indices that are expressions that include floats and longs.
  • Augmented 'W' command to optionally display ASCII and to not timeout if the terminal mode is via BMP5.
  • Changed the Running Average instruction to zero the running total if the buffer is filled completely with NAN's.
  • Changed http so that '?' used at the end of a file name will tell the browser not to use the cached file.
  • Improved synchronization between processing and SDM task when skipped scans occur.
  • Fixed TOB1 data file type in TableFile when a Boolean data type is present.
  • Changed TOA5 data file type in TableFile to express 7 significant digits instead of 5 for IEEE4 data.
  • Changed the filename parameter in CalFile to allow all types of strings.
  • Fixed ClockSet to work with a Long array and with a string.
  • Changed Status port configuration to reflect SerialOpen setting.
  • Fixed DataGram when relatively long files are received.
  • Changed Network instruction so that if the gap parameter < 0, no response is sent.
  • Changed file download response to "invalid file name" if the file name is too large, and to a new code 15 (Root directory is full) if the root directory is full.
  • Fixed communications so in a multi-drop network if a packet is received that is not for us, do not shut down the comport (e.g., drop Modem Enable) if the comport is currently opened.
  • Fixed the directory update in the case that a file name length is >= 60 characters.
  • Fixed SerialOut to return the number of characters successfully echoed in the case that not all characters were echoed.
  • Changed File Upload so that a client can successfully retry getting the last fragment.
  • Fixed very rare possibility that ModBus or PakBus would get or set a variable in the middle of being used or set by the running program.
  • Fixed SecsSince1990 for option 1.
  • Set timeout when retrieving via Terminal Mode the Status table or Public table, timeout after 30 seconds if no key hit for more data.
  • Changed terminal mode so if entered via BMP, then extend the timeouts. This will allow the user to work with it remotely via interfaces like the RF95A.
  • Protected the terminal mode when used concurrently by different clients.
  • Reduced the allowable size of filenames for the file system from 64 to 60. This now matches the size of the run-now and run on power-up name lengths (they include the drive and :, and the file system does not).
  • Fix Max when first value of a new interval is NAN.
  • Added new GPS() instruction. This is used to read in data from a GPS sensor. It can read in information such as Latitute, Longitude, Speed, Course, etc. This can also be used to keep a datalogger's clock synchronized with the GPS system.
  • Added support for COM320.
  • Added support for SC115.
  • Added SemaphoreGet and SemaphoreRelease
  • Added SerialBrk(port,duration) instruction. Sends a break on Com1..Com4 com ports. The duration parameter is in mSec.
  • Added EthernetPower(state) instruction. The state parameter is a variable. Non-zero is on and zero is off.
  • Added NewFieldNames(GenericName, NewNames) instruction. Used to assign a fieldname to a generic variable.
  • Added GetFile() instruction.
  • Added ClockChange() function that returns the change in the Clock, in milliseconds, since the last execution of the instruction.
  • Added EndSequence instruction and flagged compile error when illegally locating Declaration Sequences such Sub/EndSub, DataTable/EndTable, ShutDown/ShutdownEnd, DialSequence/EndDialSequence, ModemHangup/EndModemHangup, and WebPageBegin/WebPageEnd. EndSequence ends the current sequence that started at BeginProg or after a SlowSequence and any accompanying Declaration Sequences. Only Declaration Sequences can occur after EndSequence and before SlowSequence or EngProg. Declaration Sequences can be located (1) prior to BeginProg, (2) after EndSequence or an infinite Scan/NextScan and before EndProg or SlowSequence, and (3) immediately following SlowSequence. SlowSequence code starts executing after any Declaration Sequences. The rule prevents insertion of a Declaration Sequence in the middle of some other executing sequence of code.
  • Added PingIP("IPAddress",MsecTimeout). Returns response time in msec (0 if no response).
  • Added FileEncrypt(filename) function. Returns true (success) or false. Used to encrypt CRBasic program files in the datalogger.
  • Added Function/EndFunction, ExitFunction, and Return to CRBasic. Allows creation of user-defined functions.
  • Added MuxSelect instruction. MuxSelect(clk_port,res_port,clk_pulse_width,mux_chan,mode) selects the specified channel on a multiplexer. Mux_chan can be a variable in sequential mode (it will auto-switch to sequential). Mode of 0 uses AM16/32A clocking, 1 uses AM16/32B clocking. This instruction can be used in conjunction with SubScan and PulsePort to control multiplexers. Example: MuxSelect(1,2,5,4,1) ' selects the multiplexer to channel 4 in B Mode SubScan (0,0,5) VoltDiff(Meas(i),1,mV5000,1,0,3000,250,1.0,0.0) PulsePort(1,5000) ' advance the multiplexer i = i + 1 NextSubScan portset(2,0)'shut off multiplexer (whether in A or B mode)
  • Added ShutdownBegin/ShutdownEnd CRBasic declaration that defines a sequence of CRBasic code that will execute whenever the currently running program is gracefully shutdown. Such a shutdown event happens prior to compiling a new program or restarting the same program or by starting no program. Example: ShutdownBegin, SerialClose(Com1), ShutdownEnd
  • Added RoutersNeighbors(DestArray(MaxRouters,MaxNeighbors+1)). Returns a list of all PakBus routers and their neighbors known to the datalogger.
  • Added CSIXML data file type to TableFile. Model name, serial number, OS version, and program name are included with the xml file header.
  • Added function so when downloading a new OS via LoggerNet, it saves all of the old settings even in the case that a new setting has been added.
  • Added a new setting called Filter List that, if not empty, will allow only specified source and destination messages through that can alter the state of the datalogger. NOTE: This will cause settings to be reset, regardless of how the OS is loaded.
  • Added support for DNP3 to use non-volatile final storage memory. It uses non-volatile memory reserved for data tables so that state and history is preserved through power resets and other reset conditions that preserve data tables.
  • Added a warning in compile results if re-initializing final storage memory due to table mismatch or DNP3 change.
  • Added a check for invalid Measurements per excitation in bridge instructions.
  • Added SDM-SIO4 to terminal mode 'P' talk-through.
  • Added trace info on DNS queries: address, age, time to live.
  • Added Compile Error if a duplicate Sub is declared.
  • Added Compile Error if the option parameter in Delay is > 2.
  • Added "Name Server" and "Include File" as settings that can be changed via the SetStatus instruction. Name Server specifies up to two domain name servers that can be used for TCP/IP comms. Include File specifies a file that will be implicitly included at the end of CRBasic programs or a program to be run as the default program.
  • Added checking of the length of the program file name to make sure it will run in the datalogger.
  • Added a new setting: PakBus/TCP password. When active (not blank, and up to 31 characters in length), a log in process using this and md5 digest of a random number and this password must take place successfully before PakBus communication can proceed over the socket. The default setting is not active.
  • Fixed GetPort to correctly load Boolean destination.
  • Fixed encryption to work with Include files too.
  • Changed setting clock via the keyboard so that the minimum day and month is 1 instead of 0, and the year is 1990 instead of 0.
  • Fixed the keyboard/display for display of the dimensionality of an array of string names.
  • Changed GOES: 1) Fixed TableOpt = 0 to send the most recent record only if it has not yet been sent. 2) Fixed sending records to GOES after &H80000000 (~2 GB) records have been sent.
  • Improved SubScan..NextSubscan to be used in slow sequences. The interval parameter must be zero. This change was made to make using multiplexers in the slow sequence easier.
  • Changed AM25T to allow it to be used in pipeline mode slow sequences. If slicing is required it is done on each measurement. This means that if using revdiff the two measurements may be sliced.
  • Improved so if no card present then set all card table sizes to zero in status table.
  • Changed data table instructions so that an expression can be used as the source, in which case the default field name is "Anonymous" with an incrementing suffix. For example, Average(1,2+Sin(x),IEEE4,0).
  • Flagged a compile error if a string declaration is missing the '*' character before the size specification.
  • Fixed EmailSend() so that when sent to multiple recipients, all recipients show up in the header instead of just the last address in the list.
  • Fixed using TableName.FieldName as function parameters when the next parameter is a string parameter, as in FormatFloat(Table.Field,FormatString).
  • Changed so if table requested table allocations change between compiles, as when new program sent with maintain data option, then re-initialize final storage memory.
  • Improved to allow PortSet in pipeline slow sequences.
  • Fixed TCPOpen() to work when the Port parameter is changed at run time.
  • Changed AVW200 to allow Reps, Chan, Mux Chan, Vx, Begin Freq and End Freq to be variable expressions.
  • Changed AVW200 response in the case of sequential mode and communication is cut off in the middle.
  • Changed Warning Message to display the line number.
  • Fixed keyboard / display when attempting to change a numeric value by entering more than 16 characters.
  • Fixed Maximum and Minimum so that if one of the rep values is NAN on a scan when output occurs, all values are not set to NAN.
  • Fixed Network Time Protocol client and server to remove a possible +/- 1 second error.
  • Fixed PulseCount instruction when doing a running average of frequency to return correct values while the running average buffer is being filled.
  • Changed so if running a Default.cr1 (or Include File if the setting is active), then wait to set Compile Ready until the Default program is loaded.
  • Changed the DataTable time stamp to be the system time when called from outside a scan and when the table does not have a DataInterval declaration.
  • Fixed the FindSpa Function to work with Long and String data types.
  • Fixed adding and concatenating strings, including functions that have string parameters, to allocate enough memory.
  • Fixed the DHCP Client Fully Qualified Domain Name option.
  • Fixed HTTP displaying the Newest Record from the Public table when there are more bytes from variables declared as Dim and Public compared to the maximum number of bytes per record in the Data Tables and in the Public Table.
  • Fixed false alarm Warning message when a Scan appears inside a subroutine before BeginProg.
  • Limited the maximum size of the usr: drive to 400k - total memory available. When a larger value was entered the system crashed continuously.
  • Fixed the RealTime Usec when called outside a Scan/NextScan. (It had 100 usec units there instead of usec, i.e., the usec field was 100 times too large.)
  • Changed VoiceSpeak to handle case when voice.txt does not have a after the last word in the file.
  • Changed TOB3 files to work with changed field names.
  • Changed DHCP Client to advise the Server that its domain name is the Station Name.
  • Improved efficiency of PakBus File Upload and retrieving Table Definitions and the directory, especially when the directory is large.
  • Changed TableFile to allow Interval and TimeInto/Number of Records to be variable expressions.
  • Fixed Sort not traversing far enough into the sorting array on initial pass that sets up the heap sort.
  • Changed TimedControl to buffer the index values up to num_buffs deep and return the index that coincides with the scan that is being processed.
  • Fixed Move instruction when source is a constant string.
  • Fixed FieldNames description parsing when an array and description are both used.
  • Fixed CRBasic accessing Status fields referencing Data Table information, such as Status.DataTableName(2,1).
  • Changed CRBasic accessing TableName.FieldName(M,N) when the field data type is a time stamp. If M is > than the dimension of the field, and the destination is of type string, then M specifies the format of the time stamp returned as specified by TableName.TimeStamp(M,N).
  • Modified formatting CF-Cards to always format FAT32. When switching from FAT to FAT32 this required rewriting the partition sector. Since the partition sector does not always exist the format always reads the low level disk geometry information and creates a new partition sector then formats (quick variety) the media.
  • Flagged an error if a Boolean expression testing equality, such as (X = 1) is used out of context and would have no effect.
  • Changed Neighbors Allowed setting so that if more than 10 neighbors are in the allowed list and the beacon interval is 0, the beacon interval is changed to 60 seconds and beaconing is used for neighbor discovery instead of directed hello requests that can eat up communications memory.
  • Fixed GetVariables() and other PakBus communications instructions whose Result parameter is variably indexed so that the results for all iterations do not go into the first one.
  • Changed EmailSend() to not advertise CRAM-MD5 authorization in the case that both the user name and password are NULL.
  • Changed SerialIn so that the max number of characters can be a variable expression.
  • Removed a 40 msec error when setting the run time datalogger clock from the battery backed up clock at reset.
  • Improved going to low power standby when the system background calibration is waiting for the main scan to complete to slice in measurements.
  • Don't allow reps on the same channel for bridges unless measurements per excitation equals reps.
v8January 1, 1908
  • Added SecsSince1990() function.
  • Added instructions TriggerSequence() and WaitTriggerSequence()
  • Added AcceptDataRecords() instruction.
  • Added Terminal command 'W' to snoop on a comport (ESC or 40 second timeout will terminate the command).
  • Added FindSpa(SoughtLow,SoughtHigh,Step,Source) function.
  • Added MessagesEnable.
  • Added Conditional compilation with #if, #elseif, #else and #endif. All expressions must evaluate to constants, but can use constants already declared.
  • Added Predefined Constants: CR1000, CR3000, CR800, CR5000, and CR9000X. Also added predefined constant LoggerType that will be set to the same value as the corresponding constant for the respective logger type. This allows the conditional compilation to work across logger types (one program can run in multiple logger types). Example: #if LoggerType = CR3000 const MYRANGE = MV20 #else const MYRANGE = MV25 #endif)
  • Added FileList function.
  • Added FileCopy function. Works like FileRename (when different drives are specified), but the source file is not removed.
  • Fixed GetRecord() when there are no records stored in the Data Table source and when one or more of the fields in the Data Table are of type String and when the destination array is not of type String. In this case, GetRecord() writes beyond the bounds of the destination variable array.
  • Changed RealTime(X) to allow X to be declared as type LONG.
  • Changed Round() function to be perfectly symmetrical.
  • Fix WindVector using aliases.
  • Added checking in WindVector of NaN due to sqrt of very small numbers < 0.
  • Changed GetDataRecord() to accept a large (>1000 bytes) record.
  • Changed SerialOutBlock so that when using SDM-SIO1 it can run in the digital task sequence along with other SDM instructions.
  • Changed NSEC data table field so that if the source is a float, it must be dimensioned >= 7 to avoid using incorrect values for the source.
  • Changed SerialClose(comport) in the case that comport is a TCP socket, in which case it will close the socket instead of corrupt memory.
  • Changed GetRecord to give out of bounds warning, and not proceed if destination array is not large enough to hold data.
  • Added a method to access data via a time stamp instead of record number. In GetRecord(Dest,TableName,N) and TableName.FieldName(M,N), if N is negative, it references a timestamp of Secs Since 1990.
  • Fixed Replace, Mid and other string functions when one of their parameters other than the first is an expression that includes a string function.
  • Fixed the CHR so that it does not use excess memory.
  • Fixed TimeIntoInterval() in the case when the clock was set backward the function returns true on the first instance of the time into the interval is TRUE.
  • Changed SerialClose() so that if the comport is Com1..Com4 it will remain active for PakBus communication.
  • Fixed comms instructions (PakBus and ModBus) to return a correct result code if the parameter included a variable index into an array.
  • Change SendData, and SendTableDef to send the non-hidden id mapping if the special string ".secured" is found after the tablename. This allows users who want to allow some users to see tables and others to not see tables (via security) to still be able to use SendData. If the .secured is not present then sending a hidden table results in a compile error. The user is responsible to program the correct PakBus address so that the table definitions LoggerNet has match up with the mapping used (e.g. If using .secured then LoggerNet should have security enabled when it retrieves the table defs).
  • Changed Network(ResultCode) instruction so that ResultCode can be of type LONG.
  • Fixed Move() instruction to work when the destination array overlaps the source array.
  • Fixed vibrating wire with reps > 1 and reps delay > 200mS. The task sequencer was using a loop to do the delay and the same loop counter for the reps.
  • Changed EmailRecv filters to ignore leading spaces.
  • Fixed SendData() when sending the Public Table to send the correct table id.
  • Changed DNP3: 1) fixed the problem during server shutdown and restart 2) fixed a bug for drop application layer packet. 3) separated link layer and application layer to different tasks 4) fixed bugs for new 300 packet version. 5) fixed memory leak 6) fixed event callback 7)Fixed communication issue with keepserver 8) fixed write problem 9) prevented losing events sometimes 10) removed timeout for linktimer when application packet comes in. 11) fixed a bug for converting floating 0 to double 0.
  • Changed PPP so that if the comport interface or the user name or pass word are changed via program control, do not recompile.
  • Changed PPP IPCP so that if we have not obtained a peer IP address by the time we bring IPCP up, we set the peer address as the same as our own. This allows us to connect with a new network that was previously un-connected.
  • Changed PPP connection initiation so it no longer waits until program compile is complete.
  • Fixed PPPOpen() so that it allocates the right amount of memory for itself.
  • Improved TCP/IP and PPP: limited the number of packets allocated for incoming data. If too much coming in, it throws it away. Previously, if all of the packets were used the internal function panic() forced a watchdog.
  • Improved PPP connect negotiations by removing check for loop back on Magic Number NAK's.
  • Improved TCP and PPP shutdown before OS recompile.
  • Improved PPP dialing so when changing PPP dial and/or dial response via SetSettings(), if both the current and the new are not NULL, then do not force a recompile.
  • Fixed using PPP on com1..com4 such that re-compiling will not disable the control ports being used as a comport.
  • When changing PPP or IP settings via DevConfig, disconnect PPP before recompile.
  • Changed PPP and DialCallback() dialing so that ';' in the DialString following a ';' adds a 1 second pause.
  • Changed dial string in ModemDial(), ModemCallback, PPP such that if it is not prefaced with "AT", then preface with "ATDT" instead of "ATV0;ATS7=180;ATDT".
  • Fixed measurement issue when running in sequential mode and making measurements outside of a Scan..NextScan in a slow sequence. Occasional NAN's showed up in the measurements because Analog Power was switched off. The problem only showed up in the CR3000 (because of the additional speed).
  • Fixed PeriodAvg measurement to avoid conflict if timeout occurs at the same instant that the number of cycles are measured. If both occurred simultaneously there was a chance that the task sequencer could be called twice when it should only advance once. This could cause memory corruption or timestamps to advance incorrectly.
  • Stopped slow processing when pausing program execution (stop without deleting data). If slow sequences were running in a loop and not in a scan..nextscan they were not stopped, only the scan was stopped.
  • Fixed slow sequence skipped scans getting incremented when the main scan stops due to running its required number of scans.
  • Fixed PipeLine mode background slow sequence not getting shut off when there was not enough time for the slices to be done. The warning message was correctly displayed at compile time, but when the scan started the slow sequence was not correctly getting disabled. In the case tested this resulted in the first measurements of the main scan returning erroneous values. This was only an issue if you received the warning about background calibration being disabled.
  • Change AutoRange measurements to delay the user specified settling time prior to the range determining measurement and then again prior to the real measurement. The exception to this is when doing Reps on the same channel with auto-ranging. This case gives about 450uS between range determining measurement and the actual. The user settling time for reps on the same channel (channel < 0) determines the sampling interval. This functionality is maintained for auto-ranging.
  • Fixed sampling interval (set with the settling time parameter) for reps on the same channel when doing 1/2 cycle integration (_50Hz/ 2500mv or 5000mv and _60Hz/ 2500mv or 5000mv). The delay between measurements was not correct. Also fixed reps on the same channel for reverse excitation and reverse differential measurements.
  • Changed excitation shutoff after bridge measurements. The excitation is set to zero (while still selected) wait 10 uS then de-select the excitation. Previously, the excitation was de-selected then the DAC was set to 0. This allowed the external excitation to float (or be pulled if loaded) down. This change was made to avoid asymmetry of excitation for bridges.
  • Fixed Pipeline mode slow slicing problem where measurements were still being sliced when the fast scan interval was due to start. This caused memory corruption.
  • Removed AC excitation asymmetries which resulted in certain sensors being polarized.
  • Fixed calling subroutines with a variable indexed string array.
  • Fixed comms instructions when called from a subroutine running in a different sequence than where they are declared in the program.
  • Fixed IfTime(), WorstCase(), and Timer() functions to use the correct timestamp when called from a subroutine.
  • Improved wizard for FieldCal: if reps is a constant it must either be 1 or the size of the measurement array for wizard to work properly. Other size will now give compile error. Added checking to make sure valid options are used for FielCalStrain.
  • Updated Custom menu: 1) don't leave '>' at end of line, if no sub menu, when scrolling. 2) Fixed mode -3 to not show the initial screen at startup. 3) Fixed to correctly show long strings in pick lists. 4) Improved to allow variable names to be string variables.
  • Changed TableFile 1) make sure the card bytes free is correct before verifying that the files will fit. 2) initialization of the current file number when first starting up is fixed. 3) When time to output and no records have been stored,don't create empty file and return 0 in result param.
  • Fixed ModBusMaster was using wrong baudrate when the comport is a variable. - Improved ModBusSlave: 1) Skips servicing any requests during program compilation else we could get Variable out of bounds errors. 2) Optional start register offset is initialized correctly at compile time if possible to initialize (for TCP). 3) Allowed to return an odd number of registers as 16 bit values.
  • Fixed SDMSW8A when incrementing the multiplier pointer via the () syntax and not returning the state of the port the multiplier was not "repping". The increment was taking place outside of the reps loop rather than each time through the loop.
  • Fixed Terminal TalkThru to SDM-SIO1 comport so that it does not corrupt memory.
  • Fixed compiler crash caused by invalid source parameter in SDMCD16AC.
  • Changed SDMSIO4 to remain at the same priority level when running the acquisition code.
  • Change SDMGeneric to handle destination type string when numvalues > 1 and bytes per value = 1, to not give out of bounds error at compile.
  • Changed SerialInRecord: 1) Fixed SDMSIO1 to set filled flag when buffer is filled, previously, would sometimes report erroneously "NO DATA". 2) Fix when both start and end sync words are 0 and when getting most recent record. 3) fixd when SyncChar and NBytes are both non-zero so that records are not missed. 4) When expected number of bytes (or size of SerialOpen buffer if bytes in = 0) is odd. Any SDM input instruction (or another SerialInRecord) that followed one with odd bytes would have a mismatch between where the data was stored and where processing thought it was.
  • Changed SDI12Recorder(): (1) store NAN into a string variable correctly and (2) fixed a possible problem on the first measurement if the destination variable is referenced with a variable index into an array. 3) storing into an array of strings fixed to not skip by 4. 4) Storing into a single string changed to store the literal string returned by the Sensor in response to the D! command, excluding the cr, lf terminator. 5) If the command terminator '!' is not present in the command parameter, then a measurement command will not be issued, even though it will still pick up the data when it is due from a previously issued "C!" command. 6) when loading a value that is out of range or NaN load up 9999999 instead of 99999999 (one less digit). This is what the spec requires.
  • Changed SDI12Sensor to handle retries of the 'D' commands. This was done by loading up the entire response in a buffer and then returning the appropriate string. Also, improved handling case where requested data is out of bounds of the source array.
  • Added REST command support in FTP Server.
  • Changed FTP Server to delete a file first before opening it for writing.
  • Fixed multiple instances of FTPClient() to work correctly.
  • Changed Status SlowScan fields so that"System" scan information is added and the numbering of the Slow Scan info follows the order of entry in the program.
  • Changed Status such that if there are no DataTables and/or no Slow Sequences, their respective fields are eliminated.
  • Changed Status.CommsMemFree such that the display is LargePktsFree * 1000000 + MiddlePktsFree * 1000 + LittlePktsFree.
  • Changed Long &H80000000 (NAN) to be stored as FP2 -7999 instead of 0.
  • Changed +INF float to be convert to string as "+INF" instead of "INF"
  • Changed Float to Long +INF converts to most positive integer instead of most negative integer.
  • Changed WaitDigTrig: 1) don't allow different edges to be used on same port. 2) fixed getting a false trigger when starting up a scan.
  • Improved Sampling of TableName.TimeStamp into a field of type NSEC to give the full resolution of the timestamp instead of only second resolution.
  • Changed Time of Maximum and Time of Minimum, to use the timestamp of the sequence that calls the table, not necessarily the main scan's timestamp.
  • Improved so if out of memory errors occur when creating tables, stopped the task and let software get the error. Don't continue running or system may crash. This will occur if variables are too large to fit in memory.
  • Reduced the amount of memory consumed by variable declarations.
  • Changed retrieving the Directory via BMP5 such that when small fragments are requested, it only calculates the card bytes free on the first fragment and thus is much faster when a card is present.
  • Fixed illegal units declaration from crashing the pre-compiler.
  • Changed precompiler to write the tdf file to the same directory as the program file (if using the -z command line option).
  • Changed precompiler -l and -z options to accept full path name with files as well as filename only. If only the filename is passed in, it is opened in the same directory that contains the CRBASIC program file.
  • Changed UDPDataGram() to work between two dataloggers.
  • Fixed PakBus routing to use a Static Route if necessary when forwarding a message.
  • Fixed Case statement to work with functions that have string parameters.
  • Fixed an erroneous "Variable out of bounds." message when strings are used inside expressions.
  • Fixed expression that is Long + String or Long & String.
  • Fixed RS-232 power always on setting so that it will, under all conditions, keep the main CPU awake to accept the first incoming characters. This requires more power, but ensures that no bytes will be dropped due to waking up hardware.
  • Improved to not require space between If and '(' or ')' and Then. Also applies to While and Select.
  • Fixed resolving the type of expressions using only table.field. This was found by DisplayValue when a type other than float was used.
  • Fixed spatial instructions, Sample and MoveBytes to work correctly with an array of TableName.FieldName data.
  • Fixed const strings. To conserve memory a change was made to release all constant expression memory after the constant was resolved. The problem with this was that string constants were using the expression memory space as the location for the string. A pointer to this location was later used to resolve references to the constant. With the memory freed the desired constant was no longer there. This was fixed by allocating new memory for the string alone, then the string is copied into the new memory and the expression memory released.
  • Fixed asynchronous (RS-232, and CS I/O ME) communications locking up. This occurred at high baud rates when comms were disrupted and then reestablished. When processing of packets was disrupted several bytes were received and required processing. Since the packet start was not detected the bytes are processed such that all ASCII chars are sent to terminal mode and non-ASCII cause a new service to be requested. This processing required more time than the 10 mS tick. The fact that the flusher was held off too long caused the input DMA stream to count down to zero, which resulted in an interrupt. The interrupt shut off the incoming stream to allow the processing of bytes to catch up. This all worked fine, but after the error condition caused data to stop, the flusher did not get things going again. Changes were made to reduce the time processing the bytes, but this error condition is still possible. The recovery from the condition is now handled correctly by the flusher.
  • Changed return code for file download when disk is full or root directory is full (no more files can be created). The error code will now be out of resources instead of inaccessible file.
  • Changed formatting drives and deleting files to nullify the powerup and run file if they are set, but the files do not exist.
  • Allowed expressions of length greater than 256 to compile correctly.
  • Fixed possible packet leak in DHCP if it has an error condition.
  • Changed receiving an OS file to detect wrong type or insufficient memory near the beginning of the download process.
  • Fixed router so it does not shut off a comport through which it is routing out but there have not been any in coming packets due to PleaseWait messages.
  • Changed Default Settings to restore ComME and ComRS232 to -115200 K baud.
  • Improved TimerIO so any non-zero interval < scan interval is now set to a timeout of 1 scan. Previously the interval had to be at least 100uS before it was set to 1.
  • Changed TDR100 cable length parameter to accept variables and also to allow "repping" through multiple cable lengths if the () syntax is used with an array.
  • Improved checking so when adding a variable it is checked to see if it is already used as an alias.
  • Added table definition output command line option to pre-compiler.
  • Fixed code that allows for concurrent retrieval of table definitions by multiple clients.
v7January 1, 1907
  • Fixed a bug in Select Case which resulted in incorrect evaluation of the Case statements. The problem was dependent on the state of memory.(Significant!)
  • Fixed possible source of skipped scans when using SDM instructions, SerialInRecord, or SerialOutBlock simultaneously in multiple sequences. The event used to synchronize measurement and processing in PipeLine Mode was being used in Sequential Mode and slow sequences. The synchronization is not needed in these cases because the acquisition code is called from processing. The problem was that the event was cleared prior to calling the acquisition code. If multiple threads (slow sequences) were using the event the possibility was present that the event could be cleared just after being set and prior to being recognized. This left a thread hanging until it timed out. This caused skipped scans. The fix was to only set and wait for the event if in PipeLine Mode in the fast scan. This added additional checking for the condition. This changed all SDM instructions, SerialInRecord, and SerialOutBlock. (Significant)
  • Added AVW200() instruction.
  • Added function FileTime(FileHandle). Returns file creation time as seconds since 1990. If the function fails it returns -2^31.
  • Added function FileRename(old_fname,new_fname) where the file names are strings. Returns TRUE if successful and FALSE if not. If no drive is specified CPU: is assumed. If the drives are different the file is moved to the new location and the old file is removed. If the new_fname already exists then FALSE is returned.
  • Added bit shift operators >> and <<.
  • Added a new mode to DisplayMenu to not show the system menu at all. This is done with AddToSystem parameter code -3. Security level 2 is used (same as setting variables from other display menus).
  • Added Range code MV2500C (MV5000C in the CR3000) which works like other open detect range codes but sets the excitation to full scale DAC (~2700mv for CR1000, and ~5200mV for CR3000) so that bridges will return a value > 1 if the bridge is open. Also added CR3000 range code MV1000C (sets excitation to ~1200 mV).
  • Added a check for empty DisplayMenu ... EndMenu, and empty SubMenu ... EndSubMenu. These were crashing the pre-compiler.
  • Added checking of security code before allowing variables to be changed in custom menus.
  • Added checking all Table instructions to make sure they are not used in conditional statements. Also, added checking to catch DataInterval occurring multiple times in a DataTable..EndTable.
  • Changed Security so that if it is set to -N, then it can be unlocked with 65536-N or with (-N AND 65535).
  • Changed Keyboard/Display security so that the Settings can be viewed (not changed) at the same level of security as viewing data tables.
  • Allow security parameter in communication instructions to be a variable or expression.
  • Fixed http (WebPageBegin/WebPageEnd) set value command when security is active.
  • Changed http security to be compatible with PakBus security.
  • FTP access to program files is restricted if security is active. Appending Admin to the username and the highest level of security to the password will allow program file access.
  • Mapped EX1..EX3 as predefined constants just like VX1..VX3. This matches the labeling on the datalogger wiring panel.
  • Changed Timer function to use "system time" as its reference. This eliminates issues with being called outside Scan...NextScan, and being called from subroutines etc., and allows timing within scans (with 10mS resolution) without disabling low power standby.
  • Fixed TimerIO edge setup. If setting for falling edge the adjacent channel in the pair shared by the internal register was setup instead of the desired one. The pairs are (1,2), (3,4), (5,6), and (7,8).
  • Enhanced Constant Table editing to include Alias declarations.
  • Changed Const to release the memory used for the expression after the constant is resolved.
  • Changed Data and DataLong to allow expressions. Expressions must evaluate to a constant.
  • Fixed passing constant strings in subroutines. The size of the string was not correctly evaluated if it was not a variable.
  • When declaring aliases make sure they are not predefined (or user defined) constants.
  • Don't increment Pipeline mode background calibration skipped scans while synchronizing the main scan to the scan interval.
  • Fixed If statement uninitialized variable passed into expression evaluator. This caused possible varoutofbounds errors if using a variable string in the expression.
  • Changed FileManage so if a variable is used in an expression to always evaluate the expression and check the operation. Also, changed checking of Run Now attribute to allow all drives (this fixed a problem where the logger could be left without a program to run).
  • Fixed Median with reps > 0. When the end of the table was reached data was being written beyond the end pointer causing possible watchdog errors.
  • Changed SendData, and SendTableDef to not be allowed with Hidden tables and to use the mapping of table ids that is sent to LoggerNet rather than the datalogger internal table id. This was required so that LoggerNet would only receive one way data from tables that it has in its table definitions and that map correctly to the id it associates with the tables.
  • Fixed a rare memory corruption bug caused by calling memory allocation routine requesting 0 bytes. The memory is checked two ways and if memory lined up just right the allocation of zero bytes caused the two passes to give different results for the number of unallocated blocks. This resulted in a mem fail3 error.
  • Fixed file download of OS to handle the case when there is not enough memory to store incoming OS. The memory was 1) being corrupted by the first packet that would not fit, and 2) was not being released after the failure was reported back to software.
  • Changed OS shutdown code to make sure pulse width modulation (PWM)is disabled.
  • Pulse width modulation (PWM) works with duty of 1.0 and 0.0.
  • Removed the edge parameter from the pulse width modulation (PWM) instruction. Not needed because inverting the edge is the same as 1 - duty.
  • Changed serial talk-through to not wait the full 100mS for characters from terminal mode. It now polls to see if a character is already present.
  • Changed serial talk-through mode to exit after receiving 3 ESC characters instead of 3 characters.
  • DNP3 implemented the object 40.4 (double precision), and fix a bug for variable slave address and master address. The addresses were being checked at compile time before they had valid values in them.
  • Changed DNP3 to make slave address a variable.
  • WebPageBegin/WebPageEnd: Added command=PakBusAddress. This command returns the next PakBus address, equal to or greater than 100, that is not contained in the datalogger?s routing table or neighbor list
  • Changed web page functionality to not hard code the content type in the header. This allows other font types to be used.
  • Fixed web page functionality to send out head and body tags, without which the Newest Records page will not refresh every 10 seconds.
  • Changed SMTP EmailSend so that larger attachments can be sent.
  • Fixed servicing multiple sockets using the same protocol (HTTP, TELNET, MODBUS, SMTP, POP3) concurrently.
  • Changed FTP Server to be more efficient such that errors writing to slow media due to out of buffer space, e.g., the CPU FLASH memory, are minimized.
  • Changed FTP so that it cannot read a hidden file.
  • Expanded hidden file support by not allowing a file that is hidden to be open for reading. Previously, hidden files were simply hidden from the directory.
  • If the routing table has been reset, then immediately try to find a neighbor on all PakBus TCP connections.
  • If a neighbor has not been established on a PakBus TCP connection, then attempt to find one through a Hello Request every 10 seconds.
  • Fixed DNS setting entry when attempting to delete existing entries.
  • Fixed PPP so communications can be throttled down during large file transfers in order to protect buffer memory.
  • If the PPP dial string is PPP, then act as a PPP client but bypass the AT command dialing operation, to be used when the Raven modem is setup for PPP.
  • Changed response to FileUpload and FileDownload when the file cannot be opened to "file not currently accessible". Previously insufficient memory code was returned.
  • Changed FileClose() to return EBADFP (17) if the file handle is not valid, instead of 0.
  • Changed ComME and Com310 set up as PPP to not shut down after timeout when rung up.
  • Changed the ^ operator to always return a float even when the operators are longs.
  • Changed Ln(X) when X is NaN or X <= 0 to return NaN instead of 0.
  • Fixed FileSend() so that it closes the file if the communication fails after a timeout.
  • Fixed attempt to read a hidden file so that a file handle is not left open.
  • Changed Delay to allow variable for interval if delaying processing.
  • Changed removing a neighbor who advertised that a modem was attached to not remove all the other neighbors on the comport.
  • Fixed GetDataRecord() to send the correct signature, used if the table id parameter is not or'd with &H8000.
  • Changed the response to a one way data packet to ignore it instead of responding with a PakBus delivery error.
  • Fixed niche stack domain name look up when the name is longer than 30 characters.
  • Fixed SortSpa and Median to deal with NAN's, and +/- INF. NAN will be sorted to the top of the array (most minimum values).
  • Fixed PortGet in Sequential Mode in slow sequence.
  • Fixed PulseCount memory allocation when using all 10 Pulse channels (2 PC, and 8 control ports), with individual instructions for each.
  • Added the CRBasic '&' operator that concatenates strings, which is compatible with Visual Basic.
  • Fixed TGA to handle signature of zero with valid data. When good data resulted in a signature of zero the logic to detect the non-zero data was incorrect and resulted in NAN being stored for good data.
  • Fixed custom collect of tables when some tables are hidden by returning the correct table ID.
  • Don't truncate table names in the tablenames field of the status table.
  • Changed Keyboard/Display Realtime Data display to deal with final storage read pointer not on a 4 byte boundary. CR1000/CR3000 can deal with reading and writing to 4 byte values that are not 4 byte address aligned, but the CR5000, and CR9000 crash (watchdog error) in this situation.
  • Changed table to table sampling to accommodate the CR9000. The upper bits of a address (pointer variable) were being used to pass information. This will not work in the CR9000 because the upper bits are needed for the address.
  • Fixed subroutine passing longs and floats to strings. The conversion to string was not correct.
  • Fixed converting parameters of different data types when entering subroutines. Since the parameters are copied upon entering, if the declared parameters are different data types than what was being passed, the parameters must be converted to the new type. There were cases where this conversion was not correct.
  • Translated NAN when converting from floats to integers and integers to floats.
  • Fixed setting time before the first background slow sequence completes. This was causing background gains to be wrong which in turn caused measurements to be converted to mV incorrectly. This was only a problem if the time was set within 90 Sec (worst case) after starting a program.
  • Fixed converting Long NaN to strings.
  • Histogram4D - if all 4 dimensions are used then the output will be linearized. Since the OS only keeps 3 dimensions internally, the output must be linearized to successfully pass the tabledefs to LoggerNet.
  • Fixed PPP when it needs to is there a better term than ?throttle down?? large file transfers. Throttle down is pretty descriptive of what is being done. You could say ?hold off rapid transfers? or ?slow down the transfer rate to avoid overrunning???
v6January 1, 1906
  • Added Output instruction Moment. This instruction outputs the statistical moment of an array of data.
  • Added the FileSize(FileHandle) function which returns the number of bytes in the file defined by the FileHandle parameter.
  • Added TableHide instruction. This allows a table to be hidden from LoggerNet. If security is set in the datalogger when using TableHide, the highest level security password must be entered to see all tables.
  • Removed SetSettings instruction.
  • Added initial support for DNP3 protocol.
  • Added new COM ports SDC10 & SDC11, which allow for communication with an addressed device via the datalogger's CS I/O port.
  • Updated ModBusSlave to allow the user to specify a start register offset for all commands. The offset can be specified by entering Starting Register * 1000 + the address for the instruction's ModBusAddr parameter.
  • Updated SerialInRecord: 1) Returns a negative number of bytes received into a float variable if the destination string variable is not sized large enough to accommodate the number of bytes received. 2) Allows a variable to be used for the ComPort parameter. The instruction will be managed by the datalogger's processing task if the ComPort is a variable or it will be managed by the measurement task if the ComPort is a constant. This allows the instruction to be better synchronized to measurement for improved sensor readings.
  • Changed SerialOutBlock so if (1) the source parameter is a constant, (2) the COM port is COM1, COM2, COM3, or COM4, and (3) the NumBytes parameter is non-zero, the program will be managed by the measurement task, else the program will be managed by the processing task. This allows the instruction to be better synchronized to measurement for improved sensor readings.
  • Updated DialModem Communications: 1) If a modem is attached, the datalogger removes a device from its neighbor list after communication, thus stopping the datalogger from sending neighbor verification packets to the modem that could put the modem into a non-responsive state. 2) Increased the wait time from 1 second to 2 seconds for echoes from AT commands. 3) The datalogger no longer sends ATZ to the modem.
  • Fixed communication via the CS I/O port when the datalogger is communicating with SDC devices: 1) After communication with an SDC device (including a keyboard display), the port did not go into low power standby mode. This could significantly affect power consumption. 2) Improved the concurrent use of modem enabled devices and SDC devices.
  • Added the capability to display the number of bytes free for the CPU drive. This allows software to display a value for the available memory.
  • Implemented several significant changes that affect use of the COM310 modem: 1) Changed communication on the datalogger's CS I/O port to allow concurrent communication with any SDC device while COM310 data mode is active. 2) Fixed an issue where in certain instances when using a COM310 and compiling a program that used voice instructions, the complete voice.txt file would not be loaded. This resulted in words missing from the datalogger. 3) Fixed a problem where communication was being dropped after a program was compiled. 4) Updated the OS so that a voice sequence can abort when a subroutine is running.
  • Increased the timeout for SDI12 terminal talk-through to 40 seconds.
  • Added the terminal mode 'C' command to allow editing values in the constant table (defined in the datalogger program by using the ConstTable..EndConstTable declaration).
  • Added functionality to WebPageBegin...WebPageEnd declaration: 1) Added the optional parameter units=TRUE to table commands. This will display the units for each field if defined by the Units instruction in the datalogger program. 2) Added the ability to apply a style sheet to the HTML page displayed by the datalogger (StyleSheet=filename.css).
  • Made significant improvements to TCP/IP, FTP, and PPP communication.
  • Fixed ComportIsActive instruction for non-TCP/IP communication ports.
  • Increased the amount of time the EmailSend instruction will wait for a response back from the email server before returning an error from 1 minute to 10 minutes.
  • Improved flushing the COM port buffer for COM1, COM2, COM3, and COM4. The potential existed for the end of the buffer to be overwritten if flushing the buffer was interrupted by another task.
  • Fixed the FileOpen function. Some of the Write options (specified by the Mode parameter) were not working correctly.
  • Improved subroutine calls to disallow concurrent execution of a subroutine by two different processing tasks.
  • Fixed subroutines so that ExitSub or Exit Sub can be used to exit a subroutine.
  • Changed TableName.Timestamp so that a timestamp returned as a string includes leading zeros.
  • Fixed TableName.FieldName(n,m) when trying to access an element in a multi-dimensioned String variable.
  • Changed the datalogger compiler to return an error when a string variable is not dimensioned large enough to hold the value returned.
  • Fixed the Sample output instruction when a source variable formatted as a Float was stored as a Boolean value. Values were not being stored as True/False (now, all non-zero values are stored as True (-1)).
  • Fixed Sample output instruction so usage of TableName.FieldName as the Source parameter will work correctly with FP2, NSEC, UINT2, and BOOL8 data types.
  • Fixed the Replace function to correctly replace the string when the two strings are not the same size.
  • Made changes to the CardOut instruction so that data tables on the datalogger's CPU will not be reset if a program storing data to a card is stopped, the CFM100 or NL115 card module is removed, and then the program is restarted.
  • Improved the data output formatting for the SDI12Recorder instruction. There were cases where invalid numeric sequences (such as exponential notation or NAN) were being sent to the sensor. This change forces values greater than 9 characters to return as +/-99999999.
  • Fixed SDMCD16AC instruction so that each array index represents a port on the SDM-CD16AC when the source variable is declared as LONG and >= reps*16.
  • Changed the SDMCAN instruction's ID parameter so that any value < -2047 will set the ID to an 11 bit ID of 0.
  • Fixed CRBasic compiler and datalogger OS so that they check string parameters for unmatched string delimiters (opening and closing quotes).
  • Changed the compile process so it is faster.
  • Fixed a problem where slow sequence scans were not synchronized with the datalogger's clock after the clock was set, which resulted in slow sequence scans not starting at the correct time.
  • Improved the processing of slow sequence tasks when a program is compiled. In rare instances, the datalogger would be put into a non-responsive state.
  • Fixed a problem where the datalogger was writing settings changes to flash on a timed interval. In some instances, a setting might be changed but not written immediately to flash. If the program was then recompiled, the setting would be set back to the previous value.
  • Updated InstructionTimes instruction to detect a variable out of bounds error and determine which line the error occurred.
  • Updated RealTime instruction to load the destination array with the current value of the datalogger's clock if the instruction is used outside of a Scan..NextScan (within a Scan, RealTime returns the time of the datalogger's clock that the scan began). The resolution of RealTime outside of a scan time is 10 ms.
  • Changed the PWR function to accept a non-integer exponent.
  • Fixed the MenuItem instruction when displaying and editing string variables.
  • Fixed the handling of floating points numbers when two very small numbers approaching 0 were multiplied together. The result returned was INF instead of 0.

Connect With Us

phone icon
Phone Number
General: (435) 227-9000
location icon
Corporate Address
815 W 1800 N
Logan, UT 84321
send icon
Email Address
sales@campbellsci.com

As a trusted leader in measurement systems for more than 50 years, our top priority at Campbell Scientific has always been to provide the most accurate, reliable data for research and industry.