(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) 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.
(CRITICAL) 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.
Modified the operating system so it no longer allows SDI-12 and pulsecount() on the same minion pair.
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.
Changed the open circuit check in the Thermistor() instruction to allow a larger margin. When the measured resistive element was small enough the open circuit check was resulting in NANs for the calculated resistance.
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 invalid error message when using WaitDigTrig() on certain ports of the CR6.
Fixed the timeout for VoiceNumber() and VoiceKey to convert an erroneous 10 millisecond timeout to use system ticks correctly 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 OSVersion size in status table. Current beta operating systems were using a long date in the name which caused issues.
Fixed the streaming Public and Status tables.
Changed FTPClient() so the response code of 230 (logged in) is accepted after issuing the user name.
Fixed ModBus when using it over control ports. Memory was being released incorrectly.
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.
Fixed PortsConfig(). Added an optional parameter to PortPairConfig() to allow setting the pull resistor.
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 an issue with clearing TLS certificate and private key settings.
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.
Fixed an issue for CD100 when using custom menus. Increased the length of the strings sent to 22 and set initialize to 0.
Modified the messages for IP networks that are powered down to be less ambiguous.
Added the ability to do VW measurements in slow sequence while using CDMVW300 instructions in the main scan.
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.
Changed the wording on the unable to calibrate error message (removed the reference to +/- 8V, CR6 specific).
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 ability for DHCP server to store fully qualified domain names from connecting clients. And function get_dhcp_cache_address_from_name(char *name) that returns the address of the client based on the name.
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.
Fixed Thermistor() with AutoRange.
Fixed Thermistor() measurement in Slow sequence.
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 SPIOpen() and I2Copen() instructions.
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).
Added I2c and SPI.
Fixed TCP Client Connections setting to handle port numbers greater than 32767.
Fixed TCP ModBus that was broken in CR6 operating system 3 and the previous beta operating systems for the CR1000, CR8X0, and CR3000.
Fixed EditTable(TableName, Record).
Modified 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).
Added error checking for conflicts between pull up and pull down on port pairs.
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.
Fixed the keyboard displays categorization of settings.
Fixed the spelling of comports in the keyboard display to display Comports instead.