CR1000X(e) OS
CR1000X(e) OS
v8.5.1This download is for the CR1000X and CR1000Xe dataloggers. Execution of this download places the Operating System file(.obj) on your computer. It also updates the CRBasic Editor compiler and support files.
Why Update? New features and bug fixes. With this OS update it is recommended that you also update the Device Configuration Utility to the most recent version so that new datalogger features are available in the utility.
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
- MajorFixed an issue introduced in OS CR1000X.8.5.0/CR6.14.5.0 where EmailRelay() could fail during table streaming due to incorrect time conversion when the datalogger was not set to UTC.
- MajorFixed an issue introduced in OS CR1000X.8.5.0/CR6.14.5.0 where non-200 HTTP responses were not handled correctly during table streaming in EmailRelay(), HTTPPost(), and HTTPPut(), preventing response data from being written.
- MajorFixed an issue where the measurement semaphore was not acquired for measurements in subroutines running in sequential mode (functions were not affected). Prior to this fix, background tasks could interfere with excitation and measurement timing.
- MinorFixed an issue introduced in OS CR1000X.8.5.0/CR6.14.5.0 where a mbedTLS configuration issue that was causing slower secure connections.
- MinorFixed WebSocket issue introduced in OS CR1000X.8.5.0/CR6.14.5.0.
- MinorFixed a CR1000Xe Minion watchdog error on ComC1–ComC4 when configured for RS-485 full duplex under specific conditions.
- New FeatureAdded LoggerEndian, CR_LITTLE_ENDIAN and CR_BIG_ENDIAN defined constants. See CRBasic Help for details.
- New FeatureAdded UDPSocketOpen(), UDPSocketSend(), UDPSocketRecv(), and UDPSocketClose() to the CRBasic Instruction set. This function will allow protocols such as CoAP to operate over UDP. See the CRBasic help for details.
- New FeatureAdded DNSQuery() to the CRBasic Instruction set. See the CRBasic help for details.
- New FeatureAdded "DisableTcpDelayedAck" setting to control TCP delayed acknowledgements, improving performance for devices that experience delays due to interactions with Nagle’s Algorithm.
- New FeatureAdded CommsMode 8 (TTL Half Duplex) to SerialOpen().
- MajorFixed GOES settings corruption that could cause a factory reset.
- MajorUpdated the servo mode control loop in NetworkTimeProtocol().
- MajorFixed an issue with IPNetPower() that prevented the CELL2xx from entering a lower power state.
- MajorImproved server response handling in table streaming to prevent advancing past records when the server returns an error.
- MajorUpdated the Mbed-TLS stack, enabling support for password-encrypted TLS private keys.
- MinorUpdated the MQTT command response to the public table.
- MinorImproved the MQTT output trace in the terminal.
- MinorRemoved the trailing slash in the data loggers' MQTT state topic.
- 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.
- MinorFixed setting of CampbellCloudEnable via SetSettings() or Settings.CampbellCloudEnable = 1.
- MinorFixed PCAP capture on the PPP interface and added directional information to distinguish sent and received packets.
- MinorAdded program line number the compiler is processing to the CR1000KD display screen.
- MinorImproved the SFTP directory listing responce in FTPClient().
- MinorUpdated zlib to improve handling of gzip files, including web.obj.gz files.
- MinorImproved WebSocket API efficiency, enhancing performance for RTMC screens and the built-in data loggers webpage's.
- MinorImproved CPI communications when there are multiple unused modules on the BUS.
- MinorFixed an AvgRun() calculation error were including an extremely large Source value (> 1×10¹?) with smaller values could result in loss of precision.
- MajorFixed 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. IMPORTANT NOTE: (Only) If using TLS client certificates, ensure that MQTT Enable setting is Enable with TLS Mutual Authentication before deploying this OS update.
- New FeatureAdded a built-in constant named is_CR1000Xe, which can be used within #IF statements to conditionally compiled code.
- New FeatureAdded support for web.obj.gz files to automatically execute an embedded recipe.json when detected.
- New FeatureAdded GOESAppend compile directive; see CRBasic help for details.
- New FeatureAdded Base64Encode() instruction; see CRBasic help for details.
- New FeatureAdded extra recovery mechanism for MQTT TLS Mutual Authentication failure.
- New FeatureMQTT publish now includes a publishing timestamp "publish_ts" in the payload for the GEOJSON format.
- MajorUpdated the Real-Time Clock chip to assert the master reset line when voltage falls below 4.9 V, mitigating memory issues observed during brownout events.
- MajorFixed memory allocation for MQTT during compile time. This resolved a potential "out of memory" compile error or a watchdog fault.
- MinorFixed IIF() to work with Type Double. This also fixed a potential "Pointer is out of bounds" compile error.
- MinorImproved MQTT trace in terminal. It now includes PUBACK ID's.
(New Feature) Added a Basic JSON format to data streaming operations.
- MQTTPublishTable() Output format 3 = BASICJSON
- TableFile(), FTPClient(), HTTPPost(), HTTPPut() and, EmailRelay() Output format 36 = BASICJSON
(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
- 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 TableName.BytesPerRecord to return number of bytes in a DataTable record.
- MajorRefined the Operating System download process over MQTT.
- 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.
- MajorFixed watchdog resets caused by memory corruption due to TCP task queue buildup over slow data links, most commonly observed when RTMC projects were published on the datalogger.
- MinorFixed an issue where Implicit FTPS Active Mode incorrectly used reserved ports for data connections, leading to server rejections.
- 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.
- 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.
- MinorModified GOES behavior for the TX325 to allow tables to be concatenated in a transmission.
- MinorImproved handling of PPP flag bytes to ensure correct packet boundaries after a transmission error
- 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.
- MinorTemporarily provide access to MQTT v1 for units with a configured UID.
- MinorUpdated datalogger HTTP client to correctly handle absolute URLs in Location and Content-Location headers during redirection.
- 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]
- New FeatureAdded PING to the terminal commands.
- New FeatureMQTTPublishTable() will now send all unsent data ahead of OS update or program change, reducing potential data loss.
- New FeatureAdded FieldClassify() to the CRBasic instruction set, providing additional support for MQTTPublishTable(). Refer to the CRBasic help for more information.
- New FeatureAdded FieldOrigin() to the CRBasic instruction set, providing additional support for MQTTPublishTable(). Refer to the CRBasic help for more information.
(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.
- 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.
- MajorRemoved TLS cipher suites that do not support forward secrecy.
- 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.
- 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.
- MajorImproved session resumption and logging for FTPS.
- 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 issues when Campbell Cloud certificates rotate.
- MinorFixed an issue where the CR1000X datalogger republished all data from the microSD card to the MQTT broker after an OS update.
- 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.
- 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.
- 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.
- 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.
- MinorFixed a formatted print buffer overwrite. This improved operations such as the data logger’s terminal output and logging IP Trace info.
- MinorFixed an API call issue that caused the TableDisplay page to not load.
- 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.
- MinorFixed Invalid JSON responses across several settings when requested via MQTT.
- 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.
- MinorThe "FileName" parameter in NewFile() can now accept a variable of type string.
- MinorFixed a CPI buss data shift issue.
- MinorFixed GPS() time sync when using the PPS signal.
- MajorFixed GPS() time sync when using the PPS signal.
- New FeatureCRITICAL – See Revision notes for OS version CR1000X 8.00.
- MajorFixed an issue introduced in CR1000X version 8.00 where SerialOpen() failed to open communication ports on COMC1 and COMC3.
- MinorCorrected the handling of millisecond units for TimeIntoInterval in MQTTPublishTable().
- MinorFixed an issue where rotating TLS certificates for Campbell Cloud caused the data logger to miss a byte of data on the COMC port due to port unnecessary being reconfigured.
- New FeatureCRITICAL - The data logger's UID (unique identifier) is now utilized for enhancing security. a) When Factory Defaults are applied: i) PakBus Encryption key is assigned to the UID. ii) An HTTP user account is created (user: admin, password: UID). iii) WiFi defaults to “Create a Network” mode with the password set to the UID. iv) The FTP service is disabled, and the password is set to the UID. b) If your device does not have a UID the above changes will not apply. c) The UID is set during the manufacturing process. If your device does not have a UID you may obtain one by contacting Campbell Scientific.
- New FeatureAdded "USB Port Not Trusted" setting. The default is '0' (Trusted), allowing connections on the USB port without requiring PakBus encryption.
- New FeatureAdded "USB Disable" setting. Default is '0' (USB port active). Set to '1' (Disable) to deactivate the port, which will take effect after a datalogger reboot.
- New FeatureAdded support for the CR1000Xe.
- New FeatureAdded the ability for "SFTPPrivateKey" and "SFTPPublicKey" to be set with the CRBasic instruction SetSetting().
- New FeatureAdded an optional parameter "StdDevType" to StdDevRun(). See CRBasic help for details.
- New FeatureAdded the ability to initialize an array with all the same values when declared. For example, Public array(50) as Boolean = True, or Public array(50) = 10.
- New FeatureAdded two additional communication port configurations for SerialOpen(). a) Option 6 RS-485 Tx Only - In this configuration the transceiver is left on so the A(-) and B(+) idle in a marking state (logical '1'). b) Option 7 RS-422 - This configuration is full-duplex and the transceiver for the transmit pair is left on. The transmit pair A(-) and B(+) idle in a marking state (logical '1').
- MajorUpdated the LWIP stack.
- MajorFixed a condition when a watchdog timer IP Panic pbuf_free: p->ref > 0 triggered.
- MajorFixed a ComRS232-specific serial data overrun issue that manifested during intense PPP sessions.
- MajorFixed an intermittent watchdog that could be generated when connecting to an On-and-off MQTT broker.
- MajorMQTT tasks now detect an unopened TCP/IP socket and initiate primary retries immediately, without waiting for the keep-alive timeout to expire.
- MinorFixed an uncommon watchdog event triggered when an attached Volt108/116 has intermittent power.
- MinorResolved a potential memory allocation issue on the Miro SD card that could arise when the "Delete CardOut files if CardOut data table mismatch" setting is enabled.
- MinorAddressed communication issues with the SDM-SIO1A/SIO4/SIO2R, resolving the associated flush events that affected the adjacent channel's input and output buffers.
- MinorResolved a compile error that occurred when using SemaphoreGet(4).
- MinorFixed an issue where an unintended null byte was being appended to the payload message in MQTTPublish().
- MinorFixed the terminal watch for outbound HTTP traffic in the IPTrace > HTTP option.
- MinorFixed an erroneous ApplyAndRestartSequence CRBasic compile error.
- MinorAdded a compiler check for out-of-bounds errors in aliased array elements used during measurement repetitions.
- MinorResolved the issue allowing the publish MQTT statusInfo topic to be disabled.
- MinorFixed a problem where the MQTT publishing rate might slow down because of timeouts waiting for an ACK.
- MinorUpdated the syntax for accessing DataTable structures using FieldNames(): TableName.FieldName_StructureMemberName.
- MajorFixed the CRAM-MD5 authentication process within SMTP, exclusively influencing the EmailSend() function. It's important to note that this adjustment does not relate to EmailRelay().
- MinorMultiple bug fixes for websocket behavior. a)When a structure is freed it is not used erroneously. b)"queues_active" now behaves as it should.
- MinorFixed error when parsing output names with constants for Flux systems using Covariance() instruction.
- MinorFixed SpiRead() not waiting for bytes to transfer after first occurrence.
- MinorFixed 1200 baud rate format for MeteoSat/EuroSat data instructions.
- New FeatureAdded a find file option to the "NewFileVar" parameter of NewFile(). See the CRBasic help for details.
- New FeatureAdded result codes to CPIFileSend(). See the CRBasic help for details.
- New FeatureAdded MQTTPublish() to the CRBasic instruction set.
- New FeatureAdded SDMSIO2R() to the available CRBasic instructions. This controls the relays on the SDM-SIO2R device.
- New FeatureThe .csipasswd file must be updated with Device Configuration Utility. The data logger will no longer accept .csipasswd files sent with web API commands or from the RTMC Web Publisher. Clients using the RTMC Web Publisher to publish directly to a datalogger must now configure the .csipasswd with Device Configuration Utility.
- New FeatureClockSet() now supports a structure as the source parameter.
- New FeatureAdded an optional parameter to BrHalf4W() to return the voltage of V1.
- New FeatureAdded an optional parameter to CDM_BrHalf4W() to return the voltage of V1. Volt100 Series must also be running an OS built after 9/1/22.
- New FeatureAdded an optional parameter to BrFull6W() to return the voltage of V1.
- New FeatureAdded an optional parameter to CDM_BrFull6W() to return the voltage of V1. Volt100 Series must also be running an OS built after 9/1/22.
- New FeatureAdded #undef to allow reuse of constants at compile time.
- New FeatureAdded IncludeSection() to the available CRBasic instructions.
- New FeatureAdded optional parameters to AvgRun() which allow its use in a function or subroutine.
- New FeatureAdded optional parameters to MaxRun() which allow its use in a function or subroutine.
- New FeatureAdded optional parameters to MinRun() which allow its use in a function or subroutine.
- New FeatureAdded StdDevRun() to the CRBasic instruction set.
- New FeatureImproved Status.ProgSignature to account for changes to Include files when calculating the unique signature value.
- New FeatureThe WatchdogTimer() instruction can now output the remaining time until the expiration of the last programmed interval.
- New FeatureAdded a "MQTT Auto-Publish Data" setting to the MQTT settings.
- New FeatureAdded the ability to send a web.obj.gz file that contains a CRBasic program, and several Include files to a selected drive (CPU, USR, CRD). For example, cpu.web.obj.gz. This allows a data logger to easily extract a main CRBasic program and multiple include files from one web.obj.gz file.
- New FeatureAdded SortSpaIndexed() to the CRBasic instruction set.
- MinorFixed the output array of WindVector() when repetitions are used, ensuring coherence between the data and labels.
- MinorFixed the transmit time offset when Line SHEF format is used in GOESTable().
- MinorModbusClient() will wait to receive a response through its sequence mailbox, rather than utilizing polling.
- MinorFixed 'Dim' declared structures no longer appear as 'Public'.
- MinorFixed a timeout issue when the Logger is the FTP server and large files are being moved over a slow communication link.
- MinorTo handle NAN inputs, the SIN, COS, and TAN functions now return NAN.
- MinorFixed an intermittent Modbus data gap when an SDM-SIO1A/SIO4A port is used.
- MinorFixed the issue with the control ports state when using the "stop program and retain data" option. The control ports now return to the default state. This means PWM will stop driving and output ports are changed to inputs.
- MinorPWM() now checks for a 0 or 1 in the duty cycle parameter.
- MinorFixed a rare intermittent data spike in measurements, which was observed in a single known application, by addressing the presence of fast measurements that consumed nearly the entire scan duration.
- MinorDNS changed to try IPV4 first before IPV6.
- MinorIf the MQTT State is in the “Connection retry wait” mode the retry event will take place at a set interval of 6015820mS (~100 minutes) or when MQTTConnect() is called in a CRBasic program.
- MinorFixed the extra records returned by the HTTP response to the data query API commands.
- MinorOptimized the reconnection process for PakBusTCP Clients when connection drops occur in resource-intensive applications.
- MinorFixed a MQTT memory leak that occurred when a connection to a broker failed.
- MinorWhen the SerilInChk() is executed all the buffered data in the comport minion will be processed.
- MinorWhen a framing error is detected on the CPI bus the measurements returned from the CDM device will be NAN.
- MinorFixed using a Const in StationName().
- MinorFixed a compiler issue for measurements without excitation and repetitions. Surpassing the available channels will result in a compile error.
- MajorFixed longevity of the TX325/TX326 EEPROM by eliminating unnecessary writing during the setting of DCP addresses for GOES transmissions.
- MajorFixed 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.
- MinorFixed NTCIP globalTime to prevent adjustment during daylight saving time.
- MinorRemoved Default DNS address (208.67.222.222) to improve data logger network security.
- MinorRemoved the “Server:” line in the HTTP header response to improve data logger network security.
- MinorFixed a rare case where the serial port used for communications would revert to the default setting.
- MinorFixed an initialization error condition after ApplyAndRestart is triggered for constants declared as type Boolean in a ConstTable().
- MinorRTMC projects published to a datalogger will now be displayed before the data logger default web pages. The memory drive for the default data logger web pages was given a lower priority.
- MinorChanged when the OS checks the busy status of the micro SD card. The check is now performed before a write not after. This change lowers the power consumption when using Centon micro SD cards.
- New FeatureAdded GOESAntennaGain setting to allow the GOES antenna gain to be read and set when using a TX325/326.
- New FeatureModbusMaster() has been renamed to ModbusClient(). Existing programs that use ModbusMaster() will continue to work. This change was made to support the Modbus Organization Board of Trustee’s efforts to remove inappropriate language from its query/response protocol paradigm. https://www.modbus.org/docs/Client-ServerPR-07-2020-final.docx.pdf
- New FeatureModbusSlave() has been renamed to ModbusServer(). Existing programs that use ModbusSlave() will continue to work. This change was made to support the Modbus Organization Board of Trustee’s efforts to remove inappropriate language from its query/response protocol paradigm. https://www.modbus.org/docs/Client-ServerPR-07-2020-final.docx.pdf
- New FeatureAdded MQTTState to settings. A Device Configuration Utility update is required to expose the new setting in the MQTT tab.
- New FeatureAdded CSAT3B capability to make simultaneous CPI measurements with filters.
- New FeatureSplitStr() now supports a defined StuctureType as an output.
- MajorFixed GetDataRecord() with other data logger types. This issue was introduced in OS version CR1000X.Std.05.00.
- MajorFixed a memory leak for the web API data query.
- MinorFixed an error where the ModbusClient() instruction sent duplicate data when using Modbus function 6 (Write Single Register).
- MinorFixed a compile error for MoveBytes() that occurred when a space was used between the function name and the opening "(". This error only occurred if pointers were passed in the MoveBytes() parameters.
- MinorFixed the GOES header for pseudo-binary transmission to include the required tick character. This only affected the TX325/326.
- MinorGOES self-timed transmissions can now be greater than 1 hour. This only affected the TX325/326.
- MinorGOES self-timed transmissions now respect the data logger UTC offset setting. This only affected the TX325/326.
- MinorFixed SDI12SensorResponse() instruction’s response to the Identify commands to comply with the SDI-12 Version 1.4 specification.
- MinorAdded a compile error to catch lines in the program that contains several "------" or "++++++" without formatting them as a comment.
- MinorImproved MQTT implementation.
- MinorImproved HTTP data output to handle multiple connections and rapid queries.
- MinorImproved TCP communications with heavy loads.
- MinorFixed more than two concurrent PakBus clients collecting tables with records larger than one PakBus packet.
- MinorImproved handling of malformed communications packets between the data logger and the RV50. This was observed when using the LoggerLink app on an iOS device.
- MinorFixed the wait time for the HAYES modem protocol. The data logger now waits 1.2 seconds instead of 0.5 seconds after +++ is sent for the modem hang-up sequence.
- MinorDNP3 now supports more than 250 analog input values.
- MinorFixed a compiler crash that occurred when calling a function without parameters.
- MinorFixed the condition where NANs were not excluded from the StdDevSpa() instruction result.
- MinorFixed a "Watchdog Timer Minion Signature Ux Triggered" caused by SerialOpen().
- MinorFixed CDM instructions failing to execute in nested subroutines.
- MinorFixed overwriting an existing file when the file is opened using FileOpen() and the mode parameter set to option "a".
- MinorAdded a compiler check to generate an error if a string is used for the "SplitOption" in SplitStr(). "SplitOption" is an integer value.
- MinorAdded a compiler check to generate an error if a function name is equal to a declared Public variable.
- MinorFixed FTPClient() to properly handle a 550 response from a server. Before this change, the data logger failed to create a file on some FTP servers if the file was not already present and the "PutGetOption" parameter was set to append with a negative FileOption parameter setting (example, -1008).
- MinorFixed the "DisableVar" parameter in DataTable() instructions to handle referencing a value from a table.
- MinorFixed an SDM addressing issue when an SDM-SIO1A is set to address 8 and an SDM-CD16AC is set to address 0 on the same bus.
- MinorImproved FieldNames() to work with a variable as a defined StuctureType.
- MinorFixed an issue in the timeout parameter for TCP client instructions, such as HTTPGet(),HTTPOut(),HTTPPost(),HTTPPut(), FTPClient(), and EmailRelay(). In a rare case, the timeout parameter would not be applied when client instruction used a DNS address to the server and the server was offline.
- MinorFixed SerialBrk() over RS-485.
- New FeatureChange was made to be compatible with additional microcontroller types. CR1000X units with Serial Numbers greater than 34000 must use OS version 5.02 or greater.
- MajorPakBus WebSocket’s are now enabled only when the Enable Setting is True and the PakBus URL is set.
- MinorFixed a minion watchdog by improving interrupt handling. These Watchdogs can occur if there are comport configuration conflicts between the data logger settings and the running program.
- MinorFixed a potential watchdog event that can occur when using HTTP to list files when data logger memory resources are low.
- MinorARP messages are now transmitted correctly to improve static address mapping on a network.
- MinorGOES channel can now be set to a value up to 566.
- MinorThe delete all option in FileManage() now clears out the cashed buffers to make sure the directory and FAT information is current. This fixed a rare condition where the delete all incorrectly reported the presence of files that no longer existed.
- MinorImprove MQTT sensor talk-thru to parse sensor output before publishing to ensure proper JSON is returned in the response (i.e., JSON special characters are properly escaped).
- New FeatureMQTT is now supported.
- New FeatureStructures are now supported with StructureType/EndStructureType.
- New FeatureThe CPIStatus table now displays CDM OS versions.
- New FeaturePortBridge() now supports the SDM-SIO1A and the SDM-SIO4A.
- New FeatureUSB Configuration setting. This controls USB enumerating as a virtual comport and a virtual ethernet port (RNDIS) or a virtual comport only.
- New FeatureThe terminal 'F' command now displays predefined constants as well as setting names.
- New FeatureThe data logger now accepts a default program with. DLD or .CRB file extensions.
- New FeatureSFTP key authentication is supported with pem formatted Public and Private keys.
- MajorFixed a CR1000X analog measurement fault that occasionally showed NAN’s in data or calibration. This was most easily seen when internal analog measurements such as battery voltage and panel temperature return NAN.
- MajorSettings of Type String are updated correctly when using SetSetting(). For example, SetSetting(“IPAddressEth”,”192.168.1.1”). In previous OS versions, string settings were only updated when the fist character of the string was changed, or after factory defaults were applied.
- MajorUpdated SMSSend() to handle arrays. Warning - This update changed how SMSSend() was implemented in the operating system. Upgrading to this OS will also require the CRBasic programs running old instances of SMSSend() to be updated.
- MajorImproved streaming options in HTTPPost().
- MajorThe CommsMode option is set correctly when SerialOpen() is placed between BeginProg and Scan. Prior to this change the CommsMode state would alternate between RS485 and Not Configured on subsequent program restarts.
- MajorBefore creating a Wi-Fi 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 first GOES self-timed transmission now transmits when expected.
- MajorAdded format option 0 to GOESTable() to allow for the pseudo-binary use of FP2 data. This change matches the data output that was available in format option 0 of GOESData() used in older Campbell Scientific GOES/METEOSAT radios.
- MinorImproved Ethernet communication speeds with an RV50/RV50x.
- 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.
- MinorCRBasic now flags an error if a *, \, /, mod operator is used with a variable of Type String.
- MinorCRBasic now checks for divide by zero errors.
- MinorFiles with a wild card name are uploaded correctly by LoggerNet scheduled file collection.
- MinorWaitDigTrig() flags a compile error if it is declared inside a loop within a Scan.
- MinorA variable of Type Double can now be aliased.
- MinorThe compiler was updated to allow spaces in Alias() array declarations.
- 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).
- 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).
- MinorReplace() performs boundary checks correctly on strings larger than 24 bytes.
- MinorEncryption() with option 0 returns the correct length of the original input.
- MinorTOA5 format options in TableFile() display "NAN" instead of null for floating point numbers.
- MinorSettings are retained when updating the datalogger OS using a web.obj.gz file.
- MinorPWM() allows the Period parameter to be a variable of Type Float.
- MinorDouble-precision now uses a maximum resolution of 15 digits instead of 14.
- MinorImproved CDM module support.
- MinorModbusSlave() now outputs the correct response to a function 6 command.
- MinorSetSetting() now sets and reads the RadioNetID setting for the CR6-RF407.
- MinorMove() now works with multidimensional arrays in a loop.
- MinorThe data logger Station Name setting does not accept slash characters.
- MinorCase statements now evaluate a floating-point NAN.
- MinorFor GOES Table output, the “/” placeholder character now works as expected when using decimation.
- MinorFor GOES Table output containing historical values (Number of Values > 1) and using decimation, the most recent readings are now included.
- MinorGOES Table format option 3, ASCII Comma separated, now includes the trailing comma after the end of each line.
- MinorFTPClient() no longer waits until a new record is recorded before sending data when using values less than 0 in the NumRecs/TimeIntoInterval and Interval parameters.
- New FeatureFTPClient() now supports pem formatted Public and Private keys for SFTP connections.
- MinorFixed a brownout condition that could cause a minion processor to get stuck in a low power state. Symptom was a minion fault error appearing in compile results after recovering from the brownout condition.
- MajorGOESTable() now supports format option 0 (zero),pseudo-binary FP2, in order to match format option 0 of the GOESData() instruction used in older Campbell Scientific GOES/METEOSAT radios.
- MinorGOESTable() format option 1 (one) no longer outputs extra spaces after the comma.
- MinorFixed setting Boolean values via the keyboard display.
- MinorExiting the terminal talk through (‘P’ command) now leaves the communication port open and retains the mode set in SerialOpen().
- MinorGetRecord() now works correctly when passing a variable into the RecsBack parameter while using an optional format parameter.
- New FeatureAdded support for the TX326.
- MajorTableFile() now works when then Interval parameter is greater than 1 hour. Introduced in OS CR6.Std.10.00 and CR1000X.Std.04.00 TableFile() would not generate an output file if the interval was greater than 1 hour.
- MinorImproved double-precision floating-point Math.
- New FeatureAdded support for the TX326 - Satellite Transmitter for Meteosat.
- MajorTableFile() now works when the Interval parameter is greater than 1 hour. Introduced in OS CR6.Std.10.00 and CR1000X.Std.04.00 TableFile() would not generate an output file if the interval was greater than 1 hour.
- New FeatureAdded support for the TX325 - Satellite Transmitter for GOES.
- New FeatureCPIStatus now reports the CDM OS version in the ModuleInfo() array when used with CDM_VW300/VWIRE305 OS 6 or newer, or CDM_A100/VOLT116 OS 7 or greater, or TEMP120 OS 2 or greater. There is no requirement for the CDM or datalogger OS to be updated or matched, unless a customer wants to see the CDM OS version. If either the datalogger or CDM OS does not have this update, the OS information is just ignored (not reported in CPIStatus).
- New FeatureCDM_VW300Config() now allows the Device Type parameter to be specified as either 2 or VWIRE305. Prior to this change, only VWIRE305 was valid.
- New FeatureAdded WatchdogTimer() function that allows a user-programmed watchdog timer to be enabled.
- New FeatureDNS settings now allow IPv6 addresses. Requires Device Configuration Utility 2.23 or greater.
- New FeatureThe data logger IP stack now fully supports IPv6.
- New FeatureThe data logger now supports VJ TCP/IP Header Compression for compatibility with the RV50 firmware v4.11 and newer.
- New FeatureAdded Tablename.TableBytes functionality. This special field, TableBytes, will return the allocated size for a table on a card (or the CPU if a card is not used or not inserted). EXAMPLE: Tbytes = Test.TableBytes, Tsize = Test.TableSize, Recsize = Tbytes /Tsize.
- MajorFixed IP Panic watchdogs observed on busy networks and process intensive data logger programs. Increased memory for communication event handling.
- MajorCorrected Ethernet network ceasing operation. This was observed on 10Mbps networks when attempting to send significant amounts of data rapidly, often with the RV50 modem.
- MinorImplicit FTPS (FTP via TLS) now works as expected with port 990.
- MinorFTPS (FTP via TLS) now works correctly when running in a Slow Sequence.
- MinorA compile error is now generated if there is a PPP conflict with CPI on COMRS232.
- MinorTherm107(), Therm108(), and Therm109() functions now compile correctly when repetitions are used with excitation channels other than VX1.
- MinorConnect Screen, send Program Table Fill Times are now reported correctly when a program is resent with a different Scan rate, and no other modifications.
- MinorThe TCPOpen() optional timeout parameter can now be specified as ,, or as 0 for the default.
- MinorThe Field Name in Tablename.FieldName can now be declared as a constant. Note that Table Name could already be declared as a constant.
- MinorModified SDM operation to resolve skipped scans generated by SDM communications failures.
- MinorImproved timing for the SDM-IO16.
- MinorAdded the ability to detect and recover from lost communications to an SDM-SIO1.
- MinorImproved quiescent power drain for scans (~250mS) or faster.
- MinorImproved configuring control ports for serial communications operation.
- MinorSerialOpen() modified to configure the hardware port upon executing the SerialOpen() instruction. Previously, the presence of the instruction enabled the port prior to program execution. This change reduces power consumption.
- MinorImproved CELL2XX PPP throughput.
- MinorTableFile() now uses the correct timestamp when used with DataInterval() and GetDataRecord().
- MinorSDI-12 Terminal Mode now waits 2 seconds instead of 1 second for a sensor response.
- MinorLoggerNet file retrieval now works correctly with a wild card name when scheduled data collection is also enabled in LoggerNet.
- MinorWaitDigTrig() now works correctly in Slow Sequences.
- MinorA compile error now occurs if WaitDigTrig() is used inside a loop within a Scan.
- MinorThe CELL2xx PPP reset now works correctly on power up.
- MinorMenuPick() with constants now works correctly.
- MinorImproved retention of data logger settings when updating operating systems.
- MinorImproved CPI communications to CDM peripherals.
- MinorImproved SDI-12 v.1.4 compliance for the high-volume binary command per the verifier.
- MinorImproved operations of DataEvent() storage to an external card when removing the card during an event.
- MinorImproved operation of double-precision expressions.
- New FeatureAdded support for the TX325 satellite transmitter.
- New FeatureAdded support for VWIRE 305, VOLT 116, VOLT 108, TEMP 120.
- New FeatureAdded an optional count parameter to AvgRun() that returns the actual number of values used to calculate the running average. The actual number of values used may be different than the number specified for the calculation due to NAN values in the buffer of historical data.
- MajorThe CR6/CR1000x Datalogger no longer watchdogs when receiving DHCP packets larger than 500 bytes when the datalogger is the DHCP server. This change improves communication reliability over the RNDIS port and the integrated WIFI option when configured to create a network.
- MajorThe memory allocated for the CPU no logger gets corrupted when a task interrupt occurs during the write process of a watchdog file.
- MajorPPP will now properly restart when the PPP state in the data logger shows “User interrupt”.
- MinorThe CR1000X Datalogger PulseCount() no longer generates the occasional skipped scan.
- MinorPulseCount() no longer generates a rare skipped scan with a fast program scan (≥20Hz) or when available measurement time is used up. The actual pulse count results were not affected.
- MajorFixed an issue that could corrupt the CR6/CR1000x Datalogger settings when updating the operating system using File Control or the Device Configuration Manage OS. Prior to this fix the issue could occur if 1) the running program was not stopped, and 2) the delete data option was not selected, before updating the operating system.
- MinorThe terminal mode in the datalogger web interface now works as expected.
- New FeatureAdded support for Campbell Scientific external CELL2xx modem.
- New FeatureAdded "Trusted Hosts" setting that allows the user to specify up to 4 trusted IP addresses or IP address ranges. An IP address outside of the trusted host list will not be allowed to connect.
- New FeatureAdded TCPActiveConnections() which can be used to monitor information about TCP connections on a specified port.
- New FeatureMatrix() now allows the third parameter (B) to equal 0 for the Transpose and Invert options (options 4 and 5) that do not use the B parameter.
- New FeatureThe Const declaration can now be an array of bytes signaled by a comma separated list of bytes enclosed by {}; For example: Const A = {1,2,3,4,5,6,7,0,9,10}, SerialOutBlock(ComRS232,A,10).
- New FeatureMoveBytes() now has an optional parameter(Transfer) to handle endian byte swapping.
- New FeatureGPS() now allows the result variable array to be of type Double. This supports GPS units with higher-precision latitude and longitude.
- New FeatureIPNetPower() now supports the CELL2xx external modem (interface 5).
- New FeatureUDPDataGram() is now able to receive from multiple clients.
- New FeatureIPRoute() now has the ability to set the default network. To set the default network, the IPAddr parameter must be set to empty quotes (“”).
- New FeatureMaximum number of ESS subsurface sensors increased from 10 to 20.
- MajorThe MaxNumBytes (bytes allocated to buffering) now calculates memory for Dim variables correctly. Prior to this change, Dim variables allocated six times more memory than needed (same as Public variables). Large programs with many Dim variables may have generated OUT OF MEMORY errors in the compile results.
- MajorThe datalogger no longer causes anomalies on VX1 when performing background calibrations tasks.
- MinorScanTime now updates correctly when a single scan is missed due to a low12V condition.
- MinorEmailRelay() now allows attachment names to be a constant or a variable.
- MinorModBusSlave() function 6 now sets a single register correctly.
- MinorSDI12Recorder() now sends the command after the break as expected. The symptom of this error was excessive retries in the SDI-12 communication log.
- MinorSerialOpen() format options now correctly set the parity bit for ComME.
- MinorSerialOpen() does not alter the ComPort configuration that was set by Device Configuration Utility unless the optional CommsMode parameter is used.
- MinorThe optional PCAP interface now filters as expected.
- MinorDuplicate measurement instructions are now allowed in stacked scans. An example of stacked scans is a program that contains a pre-scan with a set number of scan counts. Once the pre-scan count is reached, the program will execute the main scan.
- MinorA function referenced without parentheses now behaves like a variable that holds the last value returned by the function.
- MinorCPI now works correctly with slow sequences in sequential mode. This resolves an issue that caused skipped scans and CDM frame errors with programs that have multiple scans and slow sequences.
- MinorTable auto-allocation now works correctly in the case that both a slow (e.g., 1 day) table and a fast (e.g., 20 mS) table are both auto-allocated. The problem was the calculated fill time was less than the output interval of the slow table and this resulted in running out of memory.
- MinorCPI Status now reports unused modules correctly, instead of reporting ‘Wait Config’.
- MinorSW12() no longer forces sequential mode if the PipeLineMode() instruction is used.
- MinorThe read pointer in internal memory for CardOut() is now established correctly on program start up 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 data on the card could be corrupted.
- MinorThe skipped-scan counter now includes scans skipped due to insufficient power to the datalogger.
- MinorOmniSatData(), OmniSatRandomSetup(), OmniSatStatus(), OmniSatSTSetup() now work with the OmniSat-3.
- MinorWeb API File control option 9 now works with a file name containing WEB.obj.gz.
- New FeatureAdded SDI-12 Version 1.4 support to SDI12Recorder() and SDI12SensorSetUp().
- New FeatureAdded the Quadrature() instruction
- New FeatureAdded PCAP Settings in the advanced section to allow the creation of a PCAP file.
- New FeatureAdded Settings.NTPServer. This setting keeps the datalogger clock synced with the specified server. This setting will be polled once per day. It will also be polled if something has changed the datalogger clock by more the 1.5 seconds. This setting is in the settings editor advanced section.
- New FeatureAdded Settings.TCPMSS. This setting can be used to set the maximum TCP segment length. Valid range is between 300-1460 bytes. Some modems require smaller TCP Packets. This setting is in the settings editor network services section.
- New FeatureAdded optional parameter to the PingIP() instruction to specify IP version.
- New FeatureAdded an optional parameter to the PPPOpen() instruction to select the IP version.
- New FeatureAdded Terminal Mode 'F' command to display datalogger setting names.
- New FeatureAdded "press ESC ESC ESC ESC to close" when opening the Terminal Serial Talk Through mode.
- New FeatureAdded a warning in the Status.CompileResult when a conflicting PakBus TCP route is found. This happens when there are two PakBus nodes with the same PakBus address on a network. While the conflict exists, PakBus polling will occur every 2 minutes instead of every 200 mSec to avoid unnecessary memory usage.
- New FeatureAdded TTL (Time to Live) when monitoring DNS communication traffic.
- New FeatureAdded Exclusive Option to the IPRoute() instruction.
- New FeatureAdded the ability to load an operating system stored on a card via the CR1000KD File Directory (E.g., CR1000KD/File/Load OS From Card).
- MinorThe GPS() instruction now accepts values prefaced with + or -.
- MinorThe ETsz() instruction now outputs the correct units.
- MinorThe SerialOpen() instruction now reflects the CommsMode setting back to Device Configuration Utility.
- MinorImproved the advanced settings section in the CR1000KD.
- MinorFixed SetSetting("EthernetPower",0); 0 = always on, 2 = one minute, 10 = disabled.
- MinorThe function parameter in the TimerInput() instruction now resolves the erroneous compiler error that states "There are too may function digits specified, maximum is 14."
- MajorSettings.PPPDial now always keeps the RS232 port awake when the setting equals "PPP." The RS232 port would go into sleep mode disabling communications between the datalogger and the cell modem. This was present with datalogger and Raven XT combinations. Datalogger and RV50 combinations were not affected.
- MajorThe ClockSet() instruction now avoids skipped records when the clock adjustments are less than one second.
- MajorThe memory error that occurred when two PakBus/TCP Client connections were pointing to each other no longer occurs.
- MinorYou can now store to a one-byte string (String * 1).
- MinorMinion Pair configuration now allows SDI12 communication and PWM() on the same minion pair.
- MinorThe SDI12Recoder() instruction now detects if an error occurred while waiting for the ttt seconds timeout before getting data with the D command.
- MajorThe Disable Lithium Battery setting is now cleared on powerup.
- MinorThe HttpGet() and HttpPost() instructions now replace a space character in the URL with a %20.
- MinorParameters defined as Double are now correctly passed to functions that are not declared as type Double.
- MinorFunction declarations now output the Return value when no parameters have been defined.
- MinorFixed data type IEEE8 in the Sample() instruction for variable types as Double.
- MinorThe CPI Sync now works with a 1kHz program scan rate.
- MinorXML output of data types now displays data type UINT4 as unsigned Int instead of Float.
- MinorSample() instruction now correctly executes when sampling from a Float into a Double.
- MajorIf the Main Scan does not contain a measurement instruction, the SlowSequence will still run.
- MinorA Pointer can now be sent into an Array when the index is not constant. For P(i)(), at run time i was used as the pointer rather than P.
- MinorFixed 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.
- MinorYou can now use pointers in ArrayLenVar parameter in the ArrayLength() instruction.
- MinorYou can now use pointers in TypeVar parameter in the TypeOf() instruction.
- MinorYou can now update datalogger data table information using web sockets.
- MajorFixed the EmailRelay() instruction stream all tables option.
- MinorThe Subject parameter in the EmailRelay() instruction now allows the subject to be Constant.
- MinorThe EmailRelay() instruction now ignores 'space' or 'tab' characters in the address string. The comma ',' character is the delineator for multiple address.
- MinorThe EmailRelay() instruction now returns the correct error code when there are connection failures.
- MinorThe timeout parameter in the EmailRelay() is the value specified (not twice the value, as in previous operating systems).
- MajorSequential Mode background calibration now performs as expected.
- MajorWhen the measpex parameter in the BrFull() instruction does not equal the reps parameter; the data is no longer shifted into the wrong destination array elements.
- MajorPPP now discards packets with a bad Checksum when a modem is attempting to establish the PPP session.
- MinorThe Delay() instruction will no longer accept delay values less than 0.
- MinorThe ClockSet() instruction will now allow "/" in the date if the parameter is of type String.
- MinorThe SNMPVariable() instruction now allows new OIDs to be inserted before the ESSVariable space.
- MinorThe public declarations for the EssVariables() instruction now require a ten-element array for indexed OIDs.
- MinorThe SPIOpen() and I2COpen() instructions now configure the hardware at runtime.
- MinorThe reset parameter in the MaxRun() and MinRun() instructions now behave like AvgRun().
- MinorString variables can now be referenced as (N,1) or (1). This avoids a variable out of bounds error at run time.
- MinorConstant declarations now allow a Const to be equal value in the settings table. Example Const A = Settings.SerialNumber.
- MinorThe Timer() instruction now uses the system time instead of the clock so the timer is independent of the clock being adjusted.
- MinorThe SDI12Recorder() instruction now accepts type Double for the destination variable.
- MinorThe SDI12Recorder() instruction timeout now ignores noise spikes while waiting for the sensor to be ready.
- MinorChannel configuration no longer allows the TimerInput() and PulseCount() instructions on same minion.
- MinorThe CDM_VW300Config() instruction now allows using the pre-defined constant CDM_VW300 or CDM_VW305 in type parameter (as well as 0 or 1, as in previous operating systems).
- MinorThe CPIStatus table now displays up to 50 CPI modules.
- MinorThe PakBus verify interval advertised in the 'Hello Exchange' is now equal to the verify interval setting rather than the setting / 2.5.
- MinorDNS will now attempt to first resolve IPv6 then IPv4.
- MinorThe default DNS server is now listed last. The specified DNS address is listed first.
- MinorTimeUntilTransmit is no longer allowed outside a Scan/NextScan.
- MajorSWVX now works outside of the main scan when setting VX1 to 5 V.
- MinorSettings.PPPInterface now disables auto baud functionality. A specific baud rate must be set.
- 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.
- Fixed background calibrations that were failing when using SequentialMode.
- 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.
- 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.
- ESSVariables(): enhanced the pre-compiler to flag an error if variables are declared as the wrong type or wrong dimensions.
- 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.
- Fixed NetworkTimeProtcol() which could have had a 500 msec offset error.
- 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 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 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.