(CRITICAL) Upgrading from versions prior to version 28 of the Operating System will reset the datalogger’s CPU drive. This is due to a change in the format of the file system from FAT16 to FAT32. In order for the datalogger to operate correctly, as part of the upgrade, the CPU drive is formatted to FAT32. Any programs stored and running from the CPU drive will be lost. It is not recommended to update the datalogger’s Operating System over a remote connection where program control regulates the communication equipment (turning it on or off, etc.). In these cases, an on-site visit and a backup using DevConfig’s backup utility is necessary to update the datalogger’s Operating System. In all cases where the datalogger is being updated with an Operating System prior to 28, the use of DevConfig’s backup utility is recommended due to the fact that the CPU drive is formatted using the new FAT32 format. Watch the Video Tutorial: Sending an OS to a Local Datalogger.
Fixed XMLParse() when it failed to open files as "r" instead of "rb".
Modified the operating system so it will check to see if there are modules present on peripheral bus before turning it off. (CR1000 and CR3000 only)
Fixed ModBus TCP so it will skip looking for more data in the same packet. Before it could get in a loop and watchdog the datalogger if the data was bad.
Fixed ModBus slave when it receives a bad address.
Fixed #ifdef by stripping off trailing whitespace prior to comparing constant names with the incoming string. (beta, private)
Introduced #ifdef to allow checking to determine if a constant has been declared. If so, the expression evaluates as true and all code to the next #else or #endif is included. This allows for code to be inserted without the constant being present.
Switch closure and PWM() cannot be active together on shared timer units. This means if C4 is used for PWM() C1..C4 cannot do switch closure, and if C5 or C7 is used for PWM() C6, or C8 respectively is not available for switch closure. (CR1000, CR3000, CR8X0 only)
Fixed FTPClient() append with optional header when the server is in active mode.
Fixed the FTP server to not send the 220 ready response until after the stack call back function is completed. The logger was progressing too quickly and not updating when the remote window size was being advertised.
The FTP server now returns error code 550 instead of 501 if it cannot find a file or if the path specified in the filename is too long.
When the FTP server is in active mode FTPClient() will no longer fail when appending a file that does not exist (error 550) on the FTP server.
Changed the variable type of “Delete_Files_on_Mismatch” (datalogger setting) to a boolean so "true" and "false" are shown on the keyboard display rather than 0 and 255.
Multiple RTU ModBusSlaves with different start register offsets are now allowed. This functionality was already allowed when using TCP/IP ModBus slaves.
Fixed SerialInBlock() when passing in a negative maximum number of bytes through the MaxNumberBytes parameter.
Internal operating system stack pointer changed to a type float instead of type double in the XMLParse() instruction.
@(variable_name) operation now allows variable_name to contain the name of a declared variable or TableName.FieldName.
Removed an error message at run time if a TableName.FieldName cannot be found when searched for inside the @(variable_name) operation.
Added sha1 and hmac_sha1 options to the CheckSum() function.
When Ethernet is very busy the start of a packet may be missed causing a buffer overflow and corrupting memory. Checks were added to limit the max bytes read into the temporary buffer to avoid overfilling it. The datalogger will now also throw away UDP packets that need reassembly and UDP packets over 1500 bytes. This was done to match specifications and to meet what is listed in our help and documentation.
After sending an operating system to a CPI module over CPI, the bus query is turned on for 30 seconds to make sure the module comes back on the bus after the operating system is loaded.
When SC-CPI module is used for CPI communications, give compile error if COM2 is being used. COM1 was already checked.
Changed CPIFileSend() so the CPIStatus table will show up.
Changed CPIFileSend() when sending an operating system to first reset the bus to make sure modules identify themselves. Increased the timeout to allow devices time to check their operating system.
Neighbor list is altered at start up by removing any neighbors that are on an inactive comport. This prevents a possible memory leak sending messages to a comport mailbox without an active task to receive the messages.
NetworkTimeProtocol() fixed so the datalogger can be both a NTP client and a NTP server at the same time.
NetworkTimeProtocol() has to be set to "" to be a NTP server. This prevents the server being activated when the logger only needs to be a client.
Fixed NetworkTimeProtocol() when two different clients are in the program.
Fixed ArrayLength() when used as a parameter passed into a subroutine.
Enabled PPP_IPV6_SUPPORT.
PPP support for "VJ" compression protocol added.
Modified the operating system TCP/IP stack when a remote connection closes. It now sends fin_ack and abandons the connection rather than calling tcp_close. This releases the pcb which was being subsequently used, and would eventually cause a crash due to loss of memory.
An OS load in the CR800 now correctly restores settings. The RS-232 baud rate was being overwritten due to too many beacon ids in the settings list. Removed 2 beacons, 2 verify intervals, and 2 baud rates from the settings list for the CR800. The arrays in the structure had room for 10, but 12 were showing up in the list. (CR800 only)
Modified changing the SDC baud rate setting to change all of the baud rates for the cs9pin port. Without this, the setting was only changing to the correct value every other time the SDC baud rate was changed.
Send one-way table definitions no longer sends the version number.
Changed the Files Manager setting. If the name coming in is the same name as the base name, then do not keep looking for another setting of the same type to create a duplicate copy of the file.
Modified the operating system to allow SNMPVariables() following ESSVariables().
Fixed an optional parameter in Resistance() to work with all integration types in the CR3000.
Flag error if ReadOnly(variable_name) is missing the variable name.
Added a message in compile results and in the CardStatus field of the Status Table when out of space for writing TableFile().
TriggerSequence() expressions now checked when editing a value via the keyboard display.
Input buffer now allocated when SerialOpen() is called and PakBus format set.
Fixed the datalogger’s web server when using web sockets to detect Connection: ... Upgrade.
Illegal numbers cannot be set via the web service or PakBus.
Fixed setting Web Service values via Post method.
Fixed displaying Web service newest record when the value is a large string.
Setting Status.FullMemReset via the web service is now ignored.
Fixed Settings.Security to display correctly via the http server.
Fixed SpaCov().
Fixed GetRecord() when TableName.FieldName is in the 3rd parameter expression.
Changed Rso ET calculation to avoid NAN values at nighttime.
Flagged an out of bounds error when an Alias name is referenced in an output instruction and the reps results in out of bounds.
Fixed double precision conversion to a string when specifying a precision greater than 15.
Modified the web server so it now decodes + into spaces after the ? sign in the URL.
If the number of TLS connections is 0 upon initialization, set it to 10.
Added support to new setting to skip ring and finish packets.
CType(x,double) now functions as Ctype(x,float) on loggers that do not support double precision (CR1000, CR800, CR3000).
Modified the operating system to not NAN CPI data when setting the datalogger clock.
Fixed FTP server when the client shuts down abnormally and concurrently when the IP task is servicing the connection.
Pointers enhanced with array indexing and pointing at structures.
Added debug tracing dumped out in CPI stream.
Fixed duplicate routes. It now searches the entire router list and doesn't stop when the first NULL entry is found. Routers can be removed at any time from any spot in the list.
Fixed processing of expressions where operands of type long precede the ^ (power). Ex: 40 * 2 ^ 8
Added a check for valid channel mask string when being set by keyboard display or CRBasic.
Fixed showing a single dimensioned string when sampled into a data table field whose type is not a string.
Modified the operating system to keep clients setting timeout going.
Fixed HTTPPost and HTTPGet() to output the header when specified as a variable.
Don’t allow “Copy Data to Card” via keypad for tables using CardOut().
Pointer to x.y fixed when assigned to an array element.
Added syntax to write to TableName.FieldName.
Added pointer functionality to be able to point to TableName.FieldName.
Fixed HTTPS web service and other SSL server applications.
Fix PPP writing when out of memory.
Fixed possible multiple tcp_abort() of a tcp_pcb that has already been aborted and removed to prevent corruption the TCP_PBUF pool.
Fixed a situation when the stack calls back with an error or that the remote is closing and aborts the tcp_pcb and free its memory. When we shutdown our side of the connection, we do not abort it to keep memp pool from corruption.
FindRecord() changed: 1) when searching for the oldest record, check to see if it could be in the internal data storage memory. 2) if a requested search fails to the card check to see if there is a better match in the internal memory.
Fixed DNS client when the IP address of the name cannot be found.
Fixed constant table ApplyandRestart when user did not set the apply inside the sequence.
Changing the constant table is no longer required to recompile using ApplyandRestart.
Fixed some non TLS authorizations (plain, login, cram-MD5).
Fixed SortSpa() when sorting on the least significant column (sort option = 1).
Fixed SortSpa() of an array of type float with the optional Dimension parameter.
TimedControl() now synchronizes its interval to midnight rather than the nearest hour. This change was only for intervals < 1 Hr. Greater intervals were sync'd correctly.
Increased packet size for AVW200() to support more than 8 individual AVW200() instructions running in pipeline mode.
Added support for wide character type in the command line for the PC CRBasic pre-compiler. This allows extended character set file paths to be used.
Fixed Include(FileName Expression) without a space before the (.
Added Modbus to PC CRBasic pre-compiler.
Fixed a possible semaphore deadlock with the TCP semaphore and the Routes semaphore when writing IP packets and a write error forced a socket close. A PakBus Main watchdog was triggered.
When receiving a multi-line response, FTPClient() will allow QUIT to pass even with an incorrect response (not 221).
Parsing a file with “#if_no_remove” no longer causes duplicate declarations to be written to the output file.
Added TDR200() instruction.
Added UART BREAK Send.
Added a screen to "Copy Data to CRD" via the keyboard display which shows the result of the copy and displays any problems (i.e. disk full).
Added CTYPE(expression, type) instruction. Where type can be FLOAT (or IEEE4), STRING, DOUBLE, or LONG.
Authorization checked before allowing websockets.
Changed EmailSend() to optionally add an authorization specification to the user name separated by a semi-colon. Options are CRAM-MD5, PLAIN, STARTTLS, and LOGIN.
Added MonitorComms(Destination,Comport,Ascii (1 or 0)) instruction.
Fixed measurements in sequential mode outside of Scan()/NextScan with SC-CPI.
Changed CONST to not release expression memory if there is an error in the expression. This was causing the PC CRBasic pre-compiler to crash.
Fixed PC compiler crash with MMx() and min() when using TableName.FieldName. The expression memory was being released twice.
Added DataTableNames(Names).
Updating a String constant in the Constant Table to a NULL string ("") no longer causes a compile error upon ApplyAndRestart().
TimeIsBetween() now evaluates correctly when called outside of Scan()/NextScan.
Websockets no longer watchdogs when a write error is generated by pulling the Ethernet cable during a write cycle.
Modified GetVariables() to flag a compile error if the local destination parameter is not a variable.
Quadrature() now fully operational.
Resistance3W() and Resistance2W() changed to allow optional parameter to return the measured excitation current.
Added CDM_Delay() instruction.
CDM devices now recover reliably when CPI cable is disconnected while logger is in low power mode.
Adjusted the FileControl response code to 23 (cannot format a drive because it is open for writing) and code 22 (cannot delete a file because the program has it open, i.e., it is the running program or the program specified to run on power up).
Calling !Ptr when Ptr = 0 no longer flags an out of bounds warning.
Constants cast as "DOUBLE" in a constants table now work correctly.
Fixed ModBus Datagram which was broken in OS 29 and OS 4.
A solitary erroneous line feed character from an SDI-12 sensor no longer locks up the slow sequence
Allow 100 msec gap between C! to multiple SDI-12 sensors.
Increased wait time from 20 msec to 100 msec when servicing multiple SDI-12 sensors.
Fixed I! command to record data correctly in an array when multiple SDI-12 sensors are specified.
Detect errors inside puts() to prevent BufCnt being zeroed and locking up the CR6 when 3+ SDI-12 sensors are polled in a single instruction.
Fixed sync problem.
Fixed problem with CPI Sync running with a 100khz crystal.
Fixed Status Table port status for pulse counters.
Yellow CPI LED turns on when RS-232 is active.
B4 thru B0 have a decode of the RTC's reset state.
Zero the power up code only after we detect a power down.
Changed where I2C is initialized.
Changed the GPS sync to debounce the GPS pulse input capture.
Fixed the CR6 RS-485 full duplex setting to set the baud rate for the second minion.
Disk parameters modified to prevent corrupted files and unreachable data.
Reverted PAKBUS_ACTIVE back to 4 for the CR6, but modified the operating system when configuring the minions with numeric_format == 4 so it does not use 2 stop bits. Changing the define for PASBUS_ACTIVE caused modem callback to fail, as well as previous issues we found and fixed.
Changed the default WiFi domain name setting to "example.com".
When loading obj.gz the contents of the decompressed image are copied from RAM to flash, then loads the OS.
Running program name and the power-up program name stored in flash rather than battery backed RAM. This allows the factory hibernate to work and still run a program out of the box.
Modified the operating system to not send a parameter to the compile task.
Rearranged CPU drive and other settings that are in serial flash.
SW12 shows –1 in the status table when active.
Added a delay in LatchAo4 to make sure long cable lengths work.
Changed PwrUp Bit indicator to B6 and RTC reset bit indicator to B7.
Cleaned up GPS input and removed math processing from the GPS input capture interrupt.
Improved the wording for invalid ports used in GPSClock for CR6.
Disabled the port SPI/UART selection when driving port high or low command are called.
Fixed RTC GPS sync.
DevConfig settings changed to no longer shut off CPI in the CR6.
Modified the OS to only allow GPS PPS sync on COMU1. The hardware has issues on any other port.
PC pre-compiler can now process and find setting HTTPSEnable and some other SSL server settings.
Added a compile error for scan interval of 0 for the CR6.
When changing RS-232 state, check to make sure CPI is not active.