Resource Center

Granite 9 OS

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

Granite 9 OS

v3.2.0

This OS should only be updated via direct connection with the Granite 9. 

This download is for the Granite 9 datalogger. Execution of this download places the Operating System file(.obj) on your computer. It also updates the CRBasic Editor compiler and support files. 

Note/Warning: Campbell Scientific always recommends updating operating systems on site if possible. When remote updates are required, it is recommended that you implement the necessary precautions to handle unexpected OS upload complications. All datalogger settings should be retained when updated remotely. If you choose to roll back to a previous operating system, the datalogger settings will be reset to default.

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

Revision History

v3.2.0December 23, 2025
  • Minor
    Fixed IIF() to work with Type Double. This also fixed a potential "Pointer is out of bounds" compile error.
  • New Feature
    MQTT publish now includes a publish timestamp "publish_ts" in the payload for the GEOJSON format.
  • Minor
    Fixed an issue where TLS certificates specified in settings were applied to all internet clients using TLS, instead of only to the MQTTS client when mutual TLS authentication was enabled.
  • Minor
    Lowered the TCP keepalive interval for FTPClient() command connections to prevent firewalls from closing them during long transfers. On slow links, the command connection can sit idle while data is still transferring, triggering idle timeouts.
  • Minor
    Improved MQTT trace in terminal. It now includes PUBACK ID's.
  • New Feature
    Added extra recovery mechanism for MQTT TLS Mutual Authentication failure.
  • New Feature
    Added TableFieldNames() to the CRBasic Instruction list. Retrieves the name of a data table or one of its fields by index, enabling dynamic (at run time) identification of a DataTable and field names.
  • New Feature
    Added GOESAppend compile directive; see CRBasic help for details.
  • Minor
    Modified GOES behavior for the TX325 to allow tables to be concatenated in a transmission.
  • Major
    Fixed memory allocation for MQTT during compile time. This resolved a potential "out of memory" compile error or a watchdog fault.
  • New Feature
    Added a compile warning when PanelTemp() is used on Granite 9/10, which uses CPUTemp() instead.
  • Major
    Fixed an issue where heavy PPP traffic could overwhelm the system, causing the datalogger to drop outgoing packets. This sometimes led to missed LCP echo packets and unexpected connection closures, even when the link appeared healthy. Although the TCP layer would perform retries to prevent data loss, these retries significantly reduced data transfer rates.
  • New Feature
    Added Base64() instruction; see CRBasic help for details.
  • New Feature
    Added support for web.obj.gz files to automatically execute an embedded recipe.json when detected.
  • Minor
    Improved handling of PPP flag bytes to ensure correct packet boundaries after a transmission error.
  • Minor
    Updated datalogger HTTP client to correctly handle absolute URLs in Location and Content-Location headers during redirection.
  • New Feature
    Added TableName.BytesPerRecord to return number of bytes in a DataTable record.
  • Minor
    Fixed the PACP capture on the PPP interface.
  • Major
    Refined the Operating System download process over MQTT.
  • Minor
    Fixed an issue where Implicit FTPS Active Mode incorrectly used reserved ports for data connections, leading to server rejections.
  • Minor
    The PakBus/TCP port (default 6785) is now restricted to PakBus traffic only; previously, if Telnet was enabled, the datalogger terminal could also be accessed on this port in addition to the standard Telnet port 23.
  • Minor
    When viewing the password settings via the CR1000KD, the value will now be displayed as '...' for security purposes.
  • New Feature
    Added support for Precision Time Protocol PTPSlave().
  • Minor
    A compile error is now triggered if FieldNames() contains a dot (.), and a warning is issued for other operator symbols; non-CRBasic-compliant field names will be deprecated and disallowed in a future update.
  • Major
    Fixed watchdog resets caused by memory corruption due to TCP task queue buildup over slow data links, most observed when RTMC projects were published on the datalogger.
  • New Feature
    Added a new setting "FTPClientActivePort". This setting specifies the starting port the datalogger may use in Active FTP mode. It defines the lower bound of a block of 1000 consecutive TCP ports, which will be used for FTP data connections initiated by the datalogger. Each new data connection will use the next available port within this range. Default value: 48000. Allowed range: 8000 to 48000.
v3.0.1April 7, 2025
  • (New Feature) Added the MQTT Auto-Publish Data option to the MQTT settings. This feature potentially simplifies the onboarding of existing datalogger applications to the Campbell Cloud without requiring program updates. Data Tables will automatically be published if the following conditions are met:

    • No Existing MQTTPublishTable(): The CRBasic program must not include any instances of the MQTTPublishTable() instruction.
    • Data Table with DataInterval(): The Data Table must utilize the DataInterval() instruction.
    • Data storage intervals less than 1 minute are excluded.
    • Data storage intervals between 1 minute and 10 minutes are published every 10 minutes.
    • Data storage intervals greater than 10 minutes are published at their defined interval.
  • Minor
    Fixed an API call issue that caused the TableDisplay page to not load.
  • Major
    Improved session resumption and logging for FTPS.
  • Minor
    The "FileName" parameter in NewFile() can now accept a variable of type string.
  • Minor
    Fixed an issue where the CR1000X datalogger republished all data from the microSD card to the MQTT broker after an OS update.
  • New Feature
    MQTTPublishTable() will now send all unsent data ahead of OS update or program change, reducing potential data loss.
  • Minor
    Fixed an issue with MQTTPublishTable() that caused data to be published every other interval when the scan, data, and publish intervals were identical. Prior to the fix, no data was lost, as any missed data was included in the next successful publish.
  • Major
    Fixed memory allocation issues in FTPClient() when using FTPS or SFTP put/get options. If a variable was used for the put/get option, insufficient memory was allocated. Conversely, negative values caused memory overallocation.
  • New Feature
    Added an optional “Timeout” parameter to NetworkTimeProtocol().
    • Timeout = 0/Omitted: Default timeout is applied (75 seconds).
    • Timeout > 0: Acts as a timeout, specifying the maximum time the instruction will run before moving on.
    • Timeout < 0: The absolute value acts as a timeout and enables time servo mode. Time servo mode allows the datalogger to gradually adjust its clock to sync with the NTP server rather than making abrupt time changes. While this mode improves time tracking, accuracy is influenced by factors such as network latency and server variability.
      • Dependencies:
        • Execute the instruction every 2 to 5 minutes.
        • Set the "NTPMaxMSec" parameter to 1 second or less to maintain reliable synchronization.
  • Minor
    Fixed Invalid JSON responses across several settings when requested via MQTT.
  • Minor
    Fixed a CPI buss data shift issue.
  • Minor
    Enhanced MQTTPublish() to handle arrays. The payload parameter now accepts elements from a string array, and the return value can be stored in an array.
  • New Feature
    Added FieldOrigin() to the CRBasic instruction set, providing additional support for MQTTPublishTable(). Refer to the CRBasic help for more information.
  • New Feature
    Added PING to the terminal commands.
  • New Feature
    Added a self-hosted recovery webpage to the datalogger OS for uploading .obj and .web.obj.gz files to restore custom user interfaces. [ /recovery]
  • Minor
    Fixed an issue were setting the "Timeout" parameters to 0 in client instruction may cause an infinite wait time. A value of 0 is now interpreted as the default timeout of 75 seconds.
  • Major
    Fixed a memory leak in the MQTT process that occurred during reconnection events. This issue was observed when Cambell Cloud repeatedly rejected or dropped the communication link. This issue led to resource exhaustion over time, triggering the system to watchdog.
  • Minor
    Fixed an issue in sequential mode where a subroutine containing measurements, when called from a slow sequence, could cause the slow sequence to lock up due to incorrect handling of analog power control.
  • Major
    Fixed a memory leak issues when Campbell Cloud certificates rotate.
  • Minor
    RTMC projects published to a datalogger now take priority over default web pages by lowering the priority of the default web pages. This fix was originally implemented in a previous version, but the issue was reintroduced in version 8.0.
  • Major
    Removed TLS cipher suites that do not support forward secrecy.
  • Minor
    Fixed an issue where the MQTT command response incorrectly reported "File upload succeeded" when a file upload via MQTT command and control failed. The response now correctly states "File upload failed" on failure.
  • New Feature
    Added FieldClassify() to the CRBasic instruction set, providing additional support for MQTTPublishTable(). Refer to the CRBasic help for more information.
  • Major
    Improved system performance, stability, and resource management for enhanced efficiency and reliability.
  • Minor
    Fixed a formatted print buffer overwrite. This improved operations such as the data logger’s terminal output and logging IP Trace info.
  • Minor
    Fixed a TLS memory allocation that caused an infinite reboot loop and over-allocated TLS memory when CRBasic functions requiring TLS were called within subroutines or functions.
v2.01May 4, 2021
  • Major
    Fixed SerialOpen() so watchdogs no longer occur if the Comport is open and an interrupt is received while the Comport is being reconfigured.
  • Minor
    GOES channel can now be set to a value up to 566.
  • Major
    Improved CPI memory structure when using multiple scans to prevent watchdogs.
  • Minor
    PakBus WebSockets now only enables when the Enable is set and the PakBus URL is set.
  • Minor
    ARP messages are now transmitted correctly to improve address mapping on a network.
  • Minor
    Improved data transfer rates over Ethernet with the RV50(X) modem. The modem should be configured for full-duplex 100Mb Ethernet to see the full benefit of this change.
  • Minor
    Move() now works with a multidimensional arrays in a loop.
  • Major
    Fixed task handling issues that could stop data storage to the SSD.
v2.00January 19, 2021
  • Minor
    Encryption() with option 0 returns the correct length of the original input.
  • Minor
    A variable of Type Double can now be aliased.
  • Minor
    Double-precision now uses a maximum resolution of 15 digits instead of 14.
  • Minor
    Settings are retained when updating the datalogger OS using a web.obj.gz file.
  • Minor
    Improved CDM module support.
  • New Feature
    Structures are now supported with StructureType/EndStructureType.
  • New Feature
    GetDataRecord(), AcceptData(), SendData(), and GetVariables() are now supported.
  • Major
    Before creating a WIFI host network, the data logger now checks for an existing network with the same SSID. If a network with the same SSID as the data logger already exists, the data logger will not create a host network.
  • Major
    The CommsMode option is set correctly when SerialOpen() is placed between BeginProg and Scan. In Granite 9/10 OS version 1.0, the CommsMode state would alternate between RS485 and Not Configured on subsequent program restarts.
  • Major
    The streaming options in HTTPPost() are supported.
  • Minor
    The compiler was updated to generate an error when quotes are used to declare an Alias. Example: Alias V = “newName” (error), Alias V = newname (correct).
  • Major
    This OS release has many improvements to overall system stability over release 1.0.
  • New Feature
    Modbus is now supported.
  • Minor
    WaitDigTrig() flags a compile error if it is declared inside a loop within a Scan.
  • Minor
    The size of an array index is set to the expected value when an expression uses constants of Type Long. For example: Const A as Long = 1, Const B as Long = 2, myArray(A+B).
  • New Feature
    The CPIStatus table now displays CDM OS versions.
  • Minor
    The Granite 9 now pass all the SDI-12 Verifier tests.
  • New Feature
    AVW200() is now supported.
  • Minor
    Improved SDM module support.
  • Minor
    The compiler was updated to allow spaces in Alias() array declarations.
  • New Feature
    Quadrature() is now supported.
  • Minor
    Flag an error if string operand to *,\,/,mod operators.
  • Minor
    Improved micro-SD card insertion detection.
  • Major
    (Granite 10) Fixed CAN not working on ports 2-4.
  • Minor
    PWM() allows the Period parameter to be a variable of Type Float.
  • Minor
    TOA5 format options in TableFile() display "NAN" instead of null for floating point numbers.
  • Minor
    Replace() performs boundary checks correctly on strings larger than 24 bytes.
  • Minor
    Resolved a clock issue that could set an erroneous Station Date/Time on program startup.
  • Minor
    RS-485 half-duplex operation now correctly handles transmit and preparing the interface for reception.
  • Minor
    Files with a wild card name are uploaded correctly by LoggerNet scheduled file collection.
  • Minor
    Improved detection of Ethernet cable removal.
  • New Feature
    PortBridge() now supports the SDM-SIO1A and the SDM-SIO4A.
  • Minor
    SFTP key authentication is supported.
  • Minor
    PortBridge() was updated to prevent a memory leak that could occur if a TCP connection handle was specified for one of the bridge ports, but the TCP connection was not successful.
  • Major
    Settings of Type String are updated correctly when using SetSetting(). For example, SetSetting(“IPAddressEth”,”192.168.1.1”). In OS version 1.0, string settings were only updated when the fist character of the string was changed, or after factory defaults were applied.
  • New Feature
    External GPS devices can be connected to COMC1 through COMC7.
  • New Feature
    The terminal 'F' command now displays predefined constants as well as setting names.

Connect With Us

envelope icon
Phone Numbers
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.