Granite 9 OS
Granite 9 OS
v3.2.0This 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
- MinorFixed IIF() to work with Type Double. This also fixed a potential "Pointer is out of bounds" compile error.
- New FeatureMQTT publish now includes a publish timestamp "publish_ts" in the payload for the GEOJSON format.
- MinorFixed 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.
- MinorLowered 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.
- MinorImproved MQTT trace in terminal. It now includes PUBACK ID's.
- New FeatureAdded extra recovery mechanism for MQTT TLS Mutual Authentication failure.
- New FeatureAdded 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 FeatureAdded GOESAppend compile directive; see CRBasic help for details.
- MinorModified GOES behavior for the TX325 to allow tables to be concatenated in a transmission.
- MajorFixed memory allocation for MQTT during compile time. This resolved a potential "out of memory" compile error or a watchdog fault.
- New FeatureAdded a compile warning when PanelTemp() is used on Granite 9/10, which uses CPUTemp() instead.
- MajorFixed 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 FeatureAdded Base64() instruction; see CRBasic help for details.
- New FeatureAdded support for web.obj.gz files to automatically execute an embedded recipe.json when detected.
- MinorImproved handling of PPP flag bytes to ensure correct packet boundaries after a transmission error.
- MinorUpdated datalogger HTTP client to correctly handle absolute URLs in Location and Content-Location headers during redirection.
- New FeatureAdded TableName.BytesPerRecord to return number of bytes in a DataTable record.
- MinorFixed the PACP capture on the PPP interface.
- MajorRefined the Operating System download process over MQTT.
- MinorFixed an issue where Implicit FTPS Active Mode incorrectly used reserved ports for data connections, leading to server rejections.
- MinorThe 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.
- MinorWhen viewing the password settings via the CR1000KD, the value will now be displayed as '...' for security purposes.
- New FeatureAdded support for Precision Time Protocol PTPSlave().
- MinorA 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.
- MajorFixed 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 FeatureAdded 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.
(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.
- MinorFixed an API call issue that caused the TableDisplay page to not load.
- MajorImproved session resumption and logging for FTPS.
- MinorThe "FileName" parameter in NewFile() can now accept a variable of type string.
- MinorFixed an issue where the CR1000X datalogger republished all data from the microSD card to the MQTT broker after an OS update.
- New FeatureMQTTPublishTable() will now send all unsent data ahead of OS update or program change, reducing potential data loss.
- MinorFixed 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.
- MajorFixed 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 FeatureAdded 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.
- MinorFixed Invalid JSON responses across several settings when requested via MQTT.
- MinorFixed a CPI buss data shift issue.
- MinorEnhanced 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 FeatureAdded FieldOrigin() to the CRBasic instruction set, providing additional support for MQTTPublishTable(). Refer to the CRBasic help for more information.
- New FeatureAdded PING to the terminal commands.
- New FeatureAdded a self-hosted recovery webpage to the datalogger OS for uploading .obj and .web.obj.gz files to restore custom user interfaces. [ /recovery]
- MinorFixed 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.
- MajorFixed 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.
- MinorFixed 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.
- MajorFixed a memory leak issues when Campbell Cloud certificates rotate.
- MinorRTMC 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.
- MajorRemoved TLS cipher suites that do not support forward secrecy.
- MinorFixed 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 FeatureAdded FieldClassify() to the CRBasic instruction set, providing additional support for MQTTPublishTable(). Refer to the CRBasic help for more information.
- MajorImproved system performance, stability, and resource management for enhanced efficiency and reliability.
- MinorFixed a formatted print buffer overwrite. This improved operations such as the data logger’s terminal output and logging IP Trace info.
- MinorFixed 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.
- MajorFixed SerialOpen() so watchdogs no longer occur if the Comport is open and an interrupt is received while the Comport is being reconfigured.
- MinorGOES channel can now be set to a value up to 566.
- MajorImproved CPI memory structure when using multiple scans to prevent watchdogs.
- MinorPakBus WebSockets now only enables when the Enable is set and the PakBus URL is set.
- MinorARP messages are now transmitted correctly to improve address mapping on a network.
- MinorImproved 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.
- MinorMove() now works with a multidimensional arrays in a loop.
- MajorFixed task handling issues that could stop data storage to the SSD.
- MinorEncryption() with option 0 returns the correct length of the original input.
- MinorA variable of Type Double can now be aliased.
- MinorDouble-precision now uses a maximum resolution of 15 digits instead of 14.
- MinorSettings are retained when updating the datalogger OS using a web.obj.gz file.
- MinorImproved CDM module support.
- New FeatureStructures are now supported with StructureType/EndStructureType.
- New FeatureGetDataRecord(), AcceptData(), SendData(), and GetVariables() are now supported.
- MajorBefore 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.
- MajorThe 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.
- MajorThe streaming options in HTTPPost() are supported.
- MinorThe compiler was updated to generate an error when quotes are used to declare an Alias. Example: Alias V = “newName” (error), Alias V = newname (correct).
- MajorThis OS release has many improvements to overall system stability over release 1.0.
- New FeatureModbus is now supported.
- MinorWaitDigTrig() flags a compile error if it is declared inside a loop within a Scan.
- MinorThe 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 FeatureThe CPIStatus table now displays CDM OS versions.
- MinorThe Granite 9 now pass all the SDI-12 Verifier tests.
- New FeatureAVW200() is now supported.
- MinorImproved SDM module support.
- MinorThe compiler was updated to allow spaces in Alias() array declarations.
- New FeatureQuadrature() is now supported.
- MinorFlag an error if string operand to *,\,/,mod operators.
- MinorImproved micro-SD card insertion detection.
- Major(Granite 10) Fixed CAN not working on ports 2-4.
- MinorPWM() allows the Period parameter to be a variable of Type Float.
- MinorTOA5 format options in TableFile() display "NAN" instead of null for floating point numbers.
- MinorReplace() performs boundary checks correctly on strings larger than 24 bytes.
- MinorResolved a clock issue that could set an erroneous Station Date/Time on program startup.
- MinorRS-485 half-duplex operation now correctly handles transmit and preparing the interface for reception.
- MinorFiles with a wild card name are uploaded correctly by LoggerNet scheduled file collection.
- MinorImproved detection of Ethernet cable removal.
- New FeaturePortBridge() now supports the SDM-SIO1A and the SDM-SIO4A.
- MinorSFTP key authentication is supported.
- MinorPortBridge() 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.
- MajorSettings 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 FeatureExternal GPS devices can be connected to COMC1 through COMC7.
- New FeatureThe terminal 'F' command now displays predefined constants as well as setting names.