Added CRBasic operators ,*=, +=,-=, /=, =,^=, and &=.
Added CSIJSON file format to TableFile option.
Added EC100 and EC100Configure.
Added CWB100Routes(port, Destination as String) instruction
Added an option to TableName.TimeStamp(2,n) when returning to a string so that date/time is formatted with a standard Internet timestamp; e.g., as Tue, 20 Apr 2010 03:25:15
Added DHCPRenew instruction that restarts DHCP on the Ethernet interface.
Added New datalogger web service, including basic authentication using cpu:.csipasswd file.
Added Optional Parameters to user functions and subroutines using the "Optional" keyword. Optional parameters must be initialized and required parameters cannot be initialized. When Function and Subroutine calls want to use the default optional parameter, they pass in a comma.
Added ArrayLength (Variable) function that returns the length of the Variable. In the case of variables of type String, the total number of characters that the array of strings can hold is returned.
Added ReadOnly declaration that will flag a comma separated list of variables (Public or Alias name) as read only.
Added an optional variable array parameter to FFTSpa that, if present, will be initialized at compile time with the frequency axis of the FFT.
Added ArrayIndex(name) function that will return the index of the name in the Wireless Sensor Network array or the New Field Names array.
Added up to 3 optional parameters to EmailRecv so that the From, Subject, and Date fields in the response header can be returned.
Added an option (2) to the SecsSince1990 function that assumes the date/time format is that in the header of a received email; e.g. "Fri, 26 Mar 2010 03:21:56", a somewhat standard Internet format.
Added optional parameter to ModBusMaster that will specify register ordering and length of integers with the same specification as the optional parameter in ModBusSlave.
Added CommsMemFree(3) to Status Table that helps keep track of TCP/IP memory usage.
Implemented Secure Socket (TLS) for DNP3 and HTTPS. Must have the TLS setting active.
Fixed -0.0 string conversion from hanging the running program.
Changed TimeIntoInterval/IfTime to allow the parameters to be variable.
Changed SerialOpen to allow it to have a variable baud rate.
Changed Subroutines and user declared Functions so that they can be called with fewer arguments than the number declared. Also, the array length of the local variables in Sub take on the array length of the variable passed into the local variable.
Changed Modem Dialing so that the response is not case sensitive.
Fixed Maximum, Minimum, SampleMaxMin, Totaltize, Average, StdDev, and Moment when the source is TableName.FieldName and is of type FP2.
GetDataRecord 1) Changed so that multiple records of an interval driven table can be collected by specifying DataInterval in both the remote and the local datalogger. 2) Changed so that the timestamp is always that of the remote. Previously, if only one record was collected, it was the timestamp of the local datalogger.
Fixed TableFile writing tob1 files for tables with BOOL4 in them.
Fixed SDI12 sensor I! return string.
Fixed Slow sequence scan in pipeline mode when running with a main scan that has a long scan interval (~10min) causing watchdog when the slow scan executes.
Changed time of max/min timestamp to not always use the main scan timestamp.
Fixed first timestamp in table that is running outside of scan..nextscan.
Fixed sampling expressions in output tables to not use inlocnames space.
Changed PWM to detect if port has been changed to input, and if so re-configure the port to function as PWM.
Changed PWM instruction to allow a variable period. Also, modified the checking of used ports to detect conflicts with PWM and TimerIO. Finally, allowed multiple PWM instructions to be used on the same port.
Fixed EssVariables memory allocation problem.
Fixed Expression with string concatenation, using tablename.fieldname and a string array with variable index causing a pre-compiler crash, due to null pointer access.
Changed DNP to allow up to 4 master sessions.
Fixed PortSet(9,X) writing "Output" into status table outside the port_config array bounds.
Forced reinitialization of comms memory after OS load.
Changed option 2 of date/time format to print the day as single digit if it is < 10.
Fixed the declaration of string variables so that the size specification can be expressed as an expression.
Changed ModBusMaster so that if the response comes back with an incorrect length, then keep looking as opposed to flagging an error. This helps prevent late responses from a previous request to abort looking for the response from the current request.
Changed ModBusMaster so that the result code will always be correct and so that it will wait correctly for either success or a timeout. Previously, it was possible for the response to another ModBus Master instruction to cause the current instruction to think prematurely that it has successfully communicated.
Improved ModBasSlave to allow to send back 64 floats instead of only 63.
Fixed SplitStr when the result variable is of type string and is the same variable as the Search string.
Changed how scan synchronization to real time works. Previously, a delay time was calculated and the running sequence was unconditionally delayed until the sync time came. This made it impossible to detect time changes that occurred during the delay. For long scan intervals, this caused problems for people trying to force execution of scans for testing purposes. Now the sequence is delayed a single tick and the delay end time and the setting of a new time are polled each time through the loop.
Fixed Slow sequence scan synchronization to real time when the scan interval is > 1 hr.
Fixed SDMCan used outside of scan crashing pre-compiler.
Fixed ArgosData crashing pre-compiler when there are not enough data values to cover all of the fields in the table.
Increased headroom for auto-range calculation for ACPower ranges.
Relaxed calibration check parameters.
Fixed FieldCal alias problem introduced with changes to speed up alias evaluation (OS 18.01). Also, add a check in SampleFieldCal to make sure the same field does not get loaded multiple times.
Changed TimedControl to advance to next index if a value <= 0 is loaded into the scan count at the newly entered index. All indices are checked and if all counts are <= 0, the current index will remain active (this avoids looping forever when all counts are zero).
Fixed TableFile not writing after table is reset.
Fixed the first value stored by Minimize and Maximize when the source variable is a different type than the value stored.
Fixed Alias when several aliases are declared on one line.
Fixed GPS when attempting to write into a NMEA sentence string beyond its dimension size. Adjacent variables would be over written.
Changed to not start HTTPS server if running no program preceded by OS download.
Changed EthernetPower to 1) rely on global (rather than local to the instruction) to determine whether or not the Ethernet chip should really be shutdown/restarted. 2) when resuming from Ethernet power off reinitialize DHCP if not configured with a static IP address. 3) Fix so that it will not possibly stop out going IP packets when it is turned back on.
Fixed possible watchdog timer due to excessive TCP traffic.
Changed EmailRecv using the "TLS" option but without the TLS setting enabled to return gracefully with an appropriate response message instead of resetting the datalogger.
Change the SDI12 aI! command so that it conforms to a standard response.
Change RTOS function call getres() to not reschedule if the resource (semaphore) is available. This will speed up tasks that get semaphores very frequently (e.g., comms), when other tasks running at the same priority are very busy (i.e., "hog loops" in slow sequences).
Added a mechanism to lock out heap memory allocations before initializing final storage memory. A small window between allocating final storage and running the program resulted in heap memory allocation attempting to take memory from final storage memory area after it was initialized for use as final storage. This resulted in a mem fail 5 error.
Changed format of Status.CommsMemFree(1). so that it displays 4 different memory areas in base 100.
Added a check of the calibration values at startup.
Fixed a possible erroneous "Out of memory." error when an expression includes a string variable and a TableName.FieldName value.
Enhanced Alias so that local variables and global variables with the same name can be aliased correctly.
Increased the maximum possible concurrent File Uploads, including uploading table definitions, from 4 to 8.
Fixed a rare erroneous result code of success returned to a PakBus instruction if a response from a previously timed out instruction came in while waiting.
Fixed decryption when the main program file and an include file are both encrypted.
Improved datalogger so it will not watchdog if TCP/IP packets are used up, since they can eventually be freed up.
Changed TCP/IP write function so that a broken socket cannot use up all the global TCP memory thus causing general IP communication to temporarily stop.
Expanded the runtime memory when TLS is active to prevent possible instances of out of memory when servicing a secure socket.
Fixed erroneous DataInterval skipped records when the table disable variable is set at the output interval and not the scan following.
Changed serial I/O buffer management so that if writing into the buffer catches up to the read pointer, then the read pointer will be set one byte in front of the write pointer, resulting in the size of the buffer minus one byte of "unread" bytes. This affects SerialInChk, SerialIn, SerialInBlock, and SerialInRecord instructions.
Changed FFT and FFTSpa so that the sample interval parameter accepts a non-integer floating point entry.
Increased the ASIC conversion time by two ticks (Fclk/2 resolution) to align the overall measurement loop to a Fclk/8 boundary so that single measurement reps on the same channel will be aligned. This allows the user to calculate the exact sample interval. The calculation is: #if logger_type = CR3000 Fclk = 14.7456 #else Fclk = 7.3728 #endif Tsample = (8.0/Fclk) * Int((settle*Fclk/8.0) + 0.5) Where settle is the sample interval (entered in the settling time parameter). This Tsample can now be fed as a float into the FFT functions, to give the exact sample interval used to generate the time series data. This will result in correct bin frequency representation of FFT data.
Changed StdDevSpa to subtract out the first value from all input values as an estimate of the mean to reduce precision errors. This is how the output instruction has always worked.
Changed to ensure no skipped scans when setting time.
Fixed a problem where a slow sequence FileOpen occasionally failed if it was the first instruction in the slow sequence. There was a flag tested to ensure that the program was running before any files were allowed to open. The flag was set by the main scan processing task after other tasks had been started.